From d1442e374710c2fd4bd5dc8f9875de012a54fc76 Mon Sep 17 00:00:00 2001 From: erik Date: Sun, 8 Feb 2026 18:27:56 +0100 Subject: [PATCH] Initial commit: Complete open-source Decal rebuild All 5 phases of the open-source Decal rebuild: Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil) Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters - Decal.Core, DecalControls, DecalRender, D3DService Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL Phase 4: DenAgent WinForms tray application Phase 5: WiX installer and build script 25 C# projects building with 0 errors. Native C++ projects require VS 2022 + Windows SDK (x86). Co-Authored-By: Claude Opus 4.6 --- .gitignore | 24 + Installer/Attic/Decal 2.sln | 11 + Installer/Attic/Decal 2.wip | Bin 0 -> 245760 bytes Installer/Decal.Installer.wixproj | 6 + Installer/DecalInstaller.sln | 13 + Installer/DecalInstaller.vdproj | 2213 ++ Installer/DecalInstaller.wip | Bin 0 -> 28160 bytes Installer/DecalInstallerVC7.sln | 13 + Installer/DecalInstallerVC7.wip | Bin 0 -> 28160 bytes Installer/Installer.nsi | 161 + Installer/Package.wxs | 198 + Installer/Res/Attic/HRESULTHookSrv.dll | Bin 0 -> 28672 bytes Installer/Res/Attic/Install.bat | 44 + Installer/Res/Attic/delegate.dll | Bin 0 -> 71222 bytes Installer/Res/Decal Homepage.url | 4 + Installer/Res/Decal.ico | Bin 0 -> 4710 bytes Installer/Res/Install.vbs | 338 + Installer/Res/decalbar.jpg | Bin 0 -> 3987 bytes Installer/Res/gdiplus.dll | Bin 0 -> 1703936 bytes Installer/Res/howto.txt | 78 + Installer/Res/readme.rtf | 132 + .../CustomCollections/HashedList.cs | 334 + .../Decal.Adapter.IDQueue/FairIDQueue.cs | 213 + .../FairRoundRobinScheduleQueue.cs | 281 + .../UserIDRequestProcessedEventArgs.cs | 15 + .../AdapterMessageEventArgs.cs | 68 + .../AdapterMessageResponseEventArgs.cs | 30 + .../Decal.Adapter.NetParser/MemberParser.cs | 56 + .../MemberParserCondition.cs | 12 + .../MemberParserType.cs | 18 + .../Decal.Adapter.NetParser/MessageFactory.cs | 24 + .../MessageMemberWrapper.cs | 62 + .../MessageRootImpl.cs | 130 + .../MessageRootWrapper.cs | 21 + .../Decal.Adapter.NetParser/MessageWrapper.cs | 77 + .../Decal.Adapter.Support/Util.cs | 176 + .../AcceptTradeEventArgs.cs | 15 + .../Decal.Adapter.Wrappers/AccountCharInfo.cs | 22 + .../AddRemoveEventType.cs | 10 + .../AddTradeItemEventArgs.cs | 20 + .../AllegianceInfoWrapper.cs | 71 + .../ApproachVendorEventArgs.cs | 20 + .../AttributeInfoWrapper.cs | 59 + .../Decal.Adapter.Wrappers/AttributeType.cs | 20 + .../Decal.Adapter.Wrappers/Augmentations.cs | 78 + .../Decal.Adapter.Wrappers/Background.cs | 29 + .../Decal.Adapter.Wrappers/BoolValueKey.cs | 16 + .../Decal.Adapter.Wrappers/ButtonWrapper.cs | 229 + .../Decal.Adapter.Wrappers/ByAllFilter.cs | 16 + .../ByCategoryFilter.cs | 39 + .../ByContainerFilter.cs | 34 + .../ByInventoryFilter.cs | 11 + .../ByLandscapeFilter.cs | 11 + .../Decal.Adapter.Wrappers/ByNameFilter.cs | 39 + .../ByNameSubStringFilter.cs | 16 + .../ByObjectClassFilter.cs | 39 + .../Decal.Adapter.Wrappers/ByOwnerFilter.cs | 34 + .../Decal.Adapter.Wrappers/CastEventType.cs | 10 + .../ChangeEnchantmentsEventArgs.cs | 20 + .../ChangeExperienceEventArgs.cs | 20 + .../ChangeFellowshipEventArgs.cs | 20 + .../ChangeObjectEventArgs.cs | 21 + .../ChangeOptionEventArgs.cs | 20 + .../ChangePlayerEventArgs.cs | 20 + .../ChangePortalModeEventArgs.cs | 15 + .../ChangeSettingsFlagsEventArgs.cs | 15 + .../ChangeShortcutEventArgs.cs | 25 + .../ChangeSpellbarEventArgs.cs | 30 + .../ChangeVitalEventArgs.cs | 20 + .../CharFilterAttributeType.cs | 14 + .../Decal.Adapter.Wrappers/CharFilterIndex.cs | 16 + .../CharFilterSkillType.cs | 57 + .../CharFilterVitalType.cs | 11 + .../Decal.Adapter.Wrappers/CharacterFilter.cs | 1173 + .../Decal.Adapter.Wrappers/CheckBoxWrapper.cs | 135 + .../ChoiceDataIndexer.cs | 33 + .../ChoiceTextIndexer.cs | 31 + .../Decal.Adapter.Wrappers/ChoiceWrapper.cs | 191 + .../Decal.Adapter.Wrappers/CombatState.cs | 12 + .../Decal.Adapter.Wrappers/ControlRegistry.cs | 51 + .../Decal.Adapter.Wrappers/ControlWrapper.cs | 7 + .../ControlWrapperBase.cs | 66 + .../Decal.Adapter.Wrappers/CoordsObject.cs | 106 + .../CreateObjectEventArgs.cs | 15 + .../Decal.Adapter.Wrappers/D3DObj.cs | 289 + .../Decal.Adapter.Wrappers/D3DService.cs | 86 + .../Decal.Adapter.Wrappers/D3DShape.cs | 12 + .../Decal.Adapter.Wrappers/D3DTextType.cs | 7 + .../Decal.Adapter.Wrappers/DeathEventArgs.cs | 15 + .../Decal.Adapter.Wrappers/DecalWrapper.cs | 84 + .../DeclineTradeEventArgs.cs | 15 + .../Decal.Adapter.Wrappers/DoubleValueKey.cs | 29 + .../Decal.Adapter.Wrappers/EchoFilter2.cs | 81 + .../EnchantmentWrapper.cs | 66 + .../EndTradeEventArgs.cs | 15 + .../EnterTradeEventArgs.cs | 20 + .../FailToAddTradeItemEventArgs.cs | 20 + .../FellowshipEventType.cs | 13 + .../Decal.Adapter.Wrappers/FontWeight.cs | 23 + .../Decal.Adapter.Wrappers/HookIndexer.cs | 19 + .../Decal.Adapter.Wrappers/HooksWrapper.cs | 540 + .../Decal.Adapter.Wrappers/HostBase.cs | 75 + .../Decal.Adapter.Wrappers/HotkeyEventArgs.cs | 31 + .../Decal.Adapter.Wrappers/HotkeySystem.cs | 133 + .../Decal.Adapter.Wrappers/HotkeyWrapper.cs | 82 + .../Decal.Adapter.Wrappers/Hud.cs | 86 + .../HudRenderScalable.cs | 52 + .../Decal.Adapter.Wrappers/HudRenderTarget.cs | 380 + .../Decal.Adapter.Wrappers/IControlWrapper.cs | 22 + .../IIndexedProvider.cs | 12 + .../IIndexedValueProvider.cs | 6 + .../Decal.Adapter.Wrappers/IViewHandler.cs | 14 + .../IndexedCollection.cs | 33 + .../Decal.Adapter.Wrappers/ListColumn.cs | 56 + .../Decal.Adapter.Wrappers/ListRow.cs | 29 + .../Decal.Adapter.Wrappers/ListWrapper.cs | 194 + .../Decal.Adapter.Wrappers/LoginEventArgs.cs | 15 + .../Decal.Adapter.Wrappers/LogoffEventArgs.cs | 15 + .../Decal.Adapter.Wrappers/LogoffEventType.cs | 10 + .../Decal.Adapter.Wrappers/LongValueKey.cs | 108 + .../MoveObjectEventArgs.cs | 15 + .../Decal.Adapter.Wrappers/NetServiceHost.cs | 43 + .../Decal.Adapter.Wrappers/NotebookWrapper.cs | 117 + .../Decal.Adapter.Wrappers/ObjectClass.cs | 49 + .../Decal.Adapter.Wrappers/PageTextIndexer.cs | 31 + .../PlayerModifyEventType.cs | 14 + .../PlayerXPEventType.cs | 10 + .../Decal.Adapter.Wrappers/PluginHost.cs | 149 + .../Decal.Adapter.Wrappers/PortalEventType.cs | 10 + .../Decal.Adapter.Wrappers/ProgressWrapper.cs | 211 + .../PushButtonWrapper.cs | 228 + .../ReleaseObjectEventArgs.cs | 15 + .../RenderServiceWrapper.cs | 132 + .../ResetTradeEventArgs.cs | 15 + .../SettingsEventArgs.cs | 15 + .../SkillInfoWrapper.cs | 91 + .../Decal.Adapter.Wrappers/SkillType.cs | 86 + .../Decal.Adapter.Wrappers/SliderWrapper.cs | 151 + .../SpellCastEventArgs.cs | 35 + .../SpellbookEventArgs.cs | 20 + .../Decal.Adapter.Wrappers/StaticWrapper.cs | 73 + .../StatusMessageEventArgs.cs | 20 + .../Decal.Adapter.Wrappers/StringValueKey.cs | 22 + .../Decal.Adapter.Wrappers/TextBoxWrapper.cs | 220 + .../Decal.Adapter.Wrappers/TrainingType.cs | 12 + .../Decal.Adapter.Wrappers/UIElementType.cs | 23 + .../Decal.Adapter.Wrappers/Vector3Object.cs | 74 + .../Decal.Adapter.Wrappers/Vector4Object.cs | 79 + .../Decal.Adapter.Wrappers/Vendor.cs | 209 + .../Decal.Adapter.Wrappers/ViewControls.cs | 72 + .../Decal.Adapter.Wrappers/ViewWrapper.cs | 266 + .../Decal.Adapter.Wrappers/VitalType.cs | 17 + .../Decal.Adapter.Wrappers/WorldChangeType.cs | 10 + .../Decal.Adapter.Wrappers/WorldFilter.cs | 473 + .../Decal.Adapter.Wrappers/WorldObject.cs | 263 + .../WorldObjectCollection.cs | 154 + .../WorldObjectCollectionFilter.cs | 14 + .../WriteTextFormats.cs | 19 + .../Decal.Adapter.Wrappers/hookIndexType.cs | 18 + Managed/Decal.Adapter/Decal.Adapter.csproj | 19 + .../Decal.Adapter/BaseEventAttribute.cs | 26 + .../Decal.Adapter/COMHResultException.cs | 11 + .../ChatClickInterceptEventArgs.cs | 19 + .../ChatParserInterceptEventArgs.cs | 14 + .../ChatTextInterceptEventArgs.cs | 24 + .../Decal.Adapter/CheckBoxChangeEventArgs.cs | 14 + .../Decal.Adapter/ContainerOpenedEventArgs.cs | 15 + .../Decal.Adapter/ControlEventArgs.cs | 15 + .../Decal.Adapter/ControlEventAttribute.cs | 21 + .../ControlReferenceArrayAttribute.cs | 17 + .../ControlReferenceAttribute.cs | 16 + .../Decal.Adapter/CoreManager.cs | 951 + .../Decal.Adapter/DecalExtensionType.cs | 14 + .../Decal.Adapter/DirectoryProxy.cs | 12 + .../DirectoryResolveEventArgs.cs | 29 + .../Decal.Adapter/DisposableByRefObject.cs | 60 + .../DisposableObjectDictionary.cs | 123 + .../Decal.Adapter/EatableEventArgs.cs | 25 + .../Decal.Adapter/Decal.Adapter/Extension.cs | 246 + .../Decal.Adapter/ExtensionEvents.cs | 9 + .../Decal.Adapter/Decal.Adapter/FilterBase.cs | 41 + .../Decal.Adapter/FilterProxy.cs | 51 + .../Decal.Adapter/FriendlyNameAttribute.cs | 16 + .../Decal.Adapter/GenericDisposableWrapper.cs | 32 + .../Decal.Adapter/Decal.Adapter/HResults.cs | 9 + .../Decal.Adapter/IAdapterSurrogate.cs | 41 + .../Decal.Adapter/IndexChangeEventArgs.cs | 14 + .../Decal.Adapter/ItemDestroyedEventArgs.cs | 15 + .../Decal.Adapter/ItemSelectedEventArgs.cs | 15 + .../Decal.Adapter/LifetimeProxy.cs | 72 + .../Decal.Adapter/ListSelectEventArgs.cs | 19 + .../Decal.Adapter/Decal.Adapter/Message.cs | 451 + .../Decal.Adapter/MessageDirection.cs | 7 + .../MessageProcessedEventArgs.cs | 31 + .../Decal.Adapter/MessageStruct.cs | 609 + .../Decal.Adapter/NetworkMessageEventArgs.cs | 15 + .../Decal.Adapter/Decal.Adapter/PluginBase.cs | 189 + .../Decal.Adapter/PluginProxy.cs | 68 + .../Decal.Adapter/RegionChange3DEventArgs.cs | 33 + .../Decal.Adapter/RenderViolationException.cs | 11 + .../Decal.Adapter/RuntimePolicyHelper.cs | 53 + .../Decal.Adapter/ServiceBase.cs | 36 + .../Decal.Adapter/ServiceProxy.cs | 38 + .../StatusTextInterceptEventArgs.cs | 12 + .../Decal.Adapter/Decal.Adapter/Surrogate.cs | 263 + .../Decal.Adapter/TextBoxChangeEventArgs.cs | 14 + .../Decal.Adapter/TextBoxEndEventArgs.cs | 14 + .../Decal.Adapter/ViewAttribute.cs | 16 + .../Decal.Adapter/ViewBaseAttribute.cs | 25 + .../Decal.Adapter/ViewHandler.cs | 76 + .../Decal.Adapter/WindowMessageEventArgs.cs | 29 + .../WireUpBaseEventsAttribute.cs | 8 + .../WireUpControlEventsAttribute.cs | 8 + .../Decal.Adapter/Properties/AssemblyInfo.cs | 24 + Managed/Decal.Core/ACHooksImpl.cs | 281 + Managed/Decal.Core/Decal.Core.csproj | 6 + Managed/Decal.Core/DecalCoreImpl.cs | 346 + Managed/Decal.Core/DecalEnumImpl.cs | 199 + Managed/Decal.Core/PluginSite2Impl.cs | 93 + Managed/Decal.D3DService/D3DObjImpl.cs | 67 + Managed/Decal.D3DService/D3DServiceImpl.cs | 160 + .../Decal.D3DService/Decal.D3DService.csproj | 6 + Managed/Decal.DHS/Decal.DHS.csproj | 10 + Managed/Decal.DHS/HotkeyImpl.cs | 19 + Managed/Decal.DHS/HotkeySystemImpl.cs | 161 + Managed/Decal.DecalControls/CheckboxImpl.cs | 45 + Managed/Decal.DecalControls/ChoiceImpl.cs | 113 + Managed/Decal.DecalControls/ControlBase.cs | 58 + .../Decal.DecalControls.csproj | 7 + Managed/Decal.DecalControls/DerethMapImpl.cs | 27 + Managed/Decal.DecalControls/EditImpl.cs | 85 + Managed/Decal.DecalControls/LayoutImpl.cs | 92 + Managed/Decal.DecalControls/ListColumnImpl.cs | 48 + Managed/Decal.DecalControls/ListImpl.cs | 129 + Managed/Decal.DecalControls/NotebookImpl.cs | 64 + Managed/Decal.DecalControls/ProgressImpl.cs | 42 + Managed/Decal.DecalControls/PushButtonImpl.cs | 44 + Managed/Decal.DecalControls/ScrollerImpl.cs | 67 + Managed/Decal.DecalControls/SliderImpl.cs | 46 + Managed/Decal.DecalControls/StaticTextImpl.cs | 26 + Managed/Decal.DecalDat/DatFile.cs | 213 + Managed/Decal.DecalDat/DatLibraryImpl.cs | 159 + Managed/Decal.DecalDat/DatServiceImpl.cs | 167 + Managed/Decal.DecalDat/DatStreamImpl.cs | 70 + Managed/Decal.DecalDat/Decal.DecalDat.csproj | 10 + .../Decal.DecalFilters/CharacterStatsImpl.cs | 142 + .../Decal.DecalFilters.csproj | 11 + Managed/Decal.DecalFilters/EchoFilterImpl.cs | 54 + Managed/Decal.DecalFilters/PrefilterImpl.cs | 31 + Managed/Decal.DecalFilters/VendorImpl.cs | 68 + Managed/Decal.DecalFilters/WorldImpl.cs | 149 + .../Decal.DecalFilters/WorldIteratorImpl.cs | 160 + Managed/Decal.DecalFilters/WorldObjectImpl.cs | 139 + .../Decal.DecalInput/Decal.DecalInput.csproj | 10 + Managed/Decal.DecalInput/HotkeyImpl.cs | 120 + Managed/Decal.DecalInput/InputBufferImpl.cs | 74 + Managed/Decal.DecalInput/InputServiceImpl.cs | 170 + Managed/Decal.DecalInput/TimerImpl.cs | 59 + Managed/Decal.DecalInput/WinMsgHookImpl.cs | 47 + Managed/Decal.DecalInput/WndMsgImpl.cs | 27 + Managed/Decal.DecalNet/Decal.DecalNet.csproj | 10 + Managed/Decal.DecalNet/MessageImpl.cs | 45 + Managed/Decal.DecalNet/NetServiceImpl.cs | 100 + Managed/Decal.DecalNet/WebRequestImpl.cs | 74 + .../Decal.DecalRender.csproj | 7 + .../Decal.DecalRender/HUDBackgroundImpl.cs | 47 + Managed/Decal.DecalRender/HUDViewImpl.cs | 74 + .../Decal.DecalRender/RenderServiceImpl.cs | 74 + Managed/Decal.DecalRender/RenderTargetImpl.cs | 46 + Managed/Decal.DenAgent/AgentForm.cs | 408 + Managed/Decal.DenAgent/Decal.DenAgent.csproj | 10 + Managed/Decal.DenAgent/OptionsForm.cs | 226 + Managed/Decal.DenAgent/Program.cs | 26 + Managed/Decal.DenAgent/TrayContext.cs | 265 + .../Decal.FileService.csproj | 9 + .../Decal.FileService/Decal.Filters/Attrib.cs | 46 + .../Decal.Filters/AttributeTable.cs | 35 + .../Decal.Filters/AttributeXPTable.cs | 19 + .../CharacterSkillCreditsTable.cs | 19 + .../Decal.Filters/CharacterXPTable.cs | 19 + .../Decal.Filters/Component.cs | 130 + .../Decal.Filters/ComponentTable.cs | 35 + .../Decal.Filters/ComponentType.cs | 60 + .../Decal.Filters/FileService.cs | 179 + .../Decal.FileService/Decal.Filters/Gender.cs | 32 + .../Decal.Filters/GenderTable.cs | 28 + .../Decal.FileService/Decal.Filters/Get.cs | 102 + .../Decal.Filters/Heritage.cs | 32 + .../Decal.Filters/HeritageTable.cs | 28 + .../Decal.Filters/IIdNameTableEntry.cs | 8 + .../Decal.Filters/IdNameTable.cs | 104 + .../Decal.Filters/LevelTables.cs | 78 + .../Decal.Filters/Material.cs | 46 + .../Decal.Filters/MaterialTable.cs | 35 + .../Decal.Filters/RawTable.cs | 59 + .../Decal.FileService/Decal.Filters/Skill.cs | 256 + .../Decal.Filters/SkillState.cs | 56 + .../Decal.Filters/SkillTable.cs | 44 + .../Decal.Filters/SkillType.cs | 56 + .../Decal.Filters/SpecializedSkillXPTable.cs | 19 + .../Decal.Filters/Species.cs | 32 + .../Decal.Filters/SpeciesTable.cs | 28 + .../Decal.FileService/Decal.Filters/Spell.cs | 427 + .../Decal.Filters/SpellComponentIDs.cs | 25 + .../Decal.Filters/SpellSchool.cs | 58 + .../Decal.Filters/SpellTable.cs | 58 + .../Decal.Filters/TrainedSkillXPTable.cs | 19 + .../Decal.Filters/UpdateEventArgs.cs | 25 + .../Decal.FileService/Decal.Filters/Vital.cs | 46 + .../Decal.Filters/VitalFormula.cs | 92 + .../Decal.Filters/VitalFormulaTable.cs | 36 + .../Decal.Filters/VitalTable.cs | 35 + .../Decal.Filters/VitalXPTable.cs | 19 + .../Decal.FileService/Decal.Filters/zlib.cs | 434 + .../Properties/AssemblyInfo.cs | 23 + .../Decal.Interop.Controls.csproj | 9 + .../Decal.Interop.Controls/BorderLayout.cs | 10 + .../BorderLayoutClass.cs | 82 + .../Decal.Interop.Controls/CheckColumn.cs | 10 + .../CheckColumnClass.cs | 56 + .../Decal.Interop.Controls/Checkbox.cs | 10 + .../Decal.Interop.Controls/CheckboxClass.cs | 134 + .../Decal.Interop.Controls/Choice.cs | 10 + .../Decal.Interop.Controls/ChoiceClass.cs | 156 + .../Decal.Interop.Controls/DerethMap.cs | 10 + .../Decal.Interop.Controls/DerethMapClass.cs | 72 + .../Decal.Interop.Controls/Edit.cs | 10 + .../Decal.Interop.Controls/EditClass.cs | 166 + .../Decal.Interop.Controls/FixedLayout.cs | 10 + .../FixedLayoutClass.cs | 82 + .../Decal.Interop.Controls/IBorderLayout.cs | 56 + .../Decal.Interop.Controls/ICheckbox.cs | 106 + .../Decal.Interop.Controls/ICheckboxEvents.cs | 21 + .../ICheckboxEvents_ChangeEventHandler.cs | 6 + .../ICheckboxEvents_DestroyEventHandler.cs | 6 + .../ICheckboxEvents_Event.cs | 12 + .../ICheckboxEvents_EventProvider.cs | 230 + .../ICheckboxEvents_SinkHelper.cs | 40 + .../Decal.Interop.Controls/IChoice.cs | 126 + .../Decal.Interop.Controls/IChoiceDropDown.cs | 12 + .../Decal.Interop.Controls/IChoiceEvents.cs | 25 + .../IChoiceEvents_ChangeEventHandler.cs | 6 + .../IChoiceEvents_DestroyEventHandler.cs | 6 + .../IChoiceEvents_DropDownEventHandler.cs | 6 + .../IChoiceEvents_Event.cs | 14 + .../IChoiceEvents_EventProvider.cs | 306 + .../IChoiceEvents_SinkHelper.cs | 52 + .../Decal.Interop.Controls/IChoicePopup.cs | 12 + .../ICommandEvents_AcceptedEventHandler.cs | 6 + .../ICommandEvents_CanceledEventHandler.cs | 6 + .../ICommandEvents_DestroyEventHandler.cs | 6 + .../ICommandEvents_Event.cs | 19 + .../ICommandEvents_EventProvider.cs | 458 + .../ICommandEvents_HitEventHandler.cs | 6 + .../ICommandEvents_SinkHelper.cs | 77 + .../ICommandEvents_UnhitEventHandler.cs | 6 + .../IControlEvents_DestroyEventHandler.cs | 6 + .../IControlEvents_Event.cs | 11 + .../IControlEvents_EventProvider.cs | 154 + .../IControlEvents_SinkHelper.cs | 29 + .../Decal.Interop.Controls/IDerethMap.cs | 38 + .../Decal.Interop.Controls/IEdit.cs | 134 + .../Decal.Interop.Controls/IEditEvents.cs | 29 + .../IEditEvents_BeginEventHandler.cs | 6 + .../IEditEvents_ChangeEventHandler.cs | 6 + .../IEditEvents_DestroyEventHandler.cs | 6 + .../IEditEvents_EndEventHandler.cs | 6 + .../IEditEvents_Event.cs | 16 + .../IEditEvents_EventProvider.cs | 382 + .../IEditEvents_SinkHelper.cs | 64 + .../Decal.Interop.Controls/IFixedLayout.cs | 57 + .../Decal.Interop.Controls/ILayout.cs | 56 + .../Decal.Interop.Controls/IList.cs | 137 + .../Decal.Interop.Controls/IListColumn.cs | 55 + .../Decal.Interop.Controls/IListDisp.cs | 148 + .../Decal.Interop.Controls/IListEvents.cs | 21 + .../IListEvents_ChangeEventHandler.cs | 6 + .../IListEvents_DestroyEventHandler.cs | 6 + .../IListEvents_Event.cs | 12 + .../IListEvents_EventProvider.cs | 230 + .../IListEvents_SinkHelper.cs | 40 + .../Decal.Interop.Controls/IListView.cs | 38 + .../Decal.Interop.Controls/INotebook.cs | 72 + .../Decal.Interop.Controls/INotebookEvents.cs | 21 + .../INotebookEvents_ChangeEventHandler.cs | 6 + .../INotebookEvents_DestroyEventHandler.cs | 6 + .../INotebookEvents_Event.cs | 12 + .../INotebookEvents_EventProvider.cs | 230 + .../INotebookEvents_SinkHelper.cs | 40 + .../Decal.Interop.Controls/IPageLayout.cs | 70 + .../Decal.Interop.Controls/IPageLayoutDisp.cs | 76 + .../Decal.Interop.Controls/IProgress.cs | 147 + .../Decal.Interop.Controls/IPushButton.cs | 108 + .../Decal.Interop.Controls/IScroller.cs | 104 + .../Decal.Interop.Controls/IScrollerEvents.cs | 21 + .../IScrollerEvents_ChangeEventHandler.cs | 6 + .../IScrollerEvents_DestroyEventHandler.cs | 6 + .../IScrollerEvents_Event.cs | 12 + .../IScrollerEvents_EventProvider.cs | 230 + .../IScrollerEvents_SinkHelper.cs | 40 + .../Decal.Interop.Controls/ISlider.cs | 104 + .../Decal.Interop.Controls/ISliderEvents.cs | 21 + .../ISliderEvents_ChangeEventHandler.cs | 6 + .../ISliderEvents_DestroyEventHandler.cs | 6 + .../ISliderEvents_Event.cs | 12 + .../ISliderEvents_EventProvider.cs | 230 + .../ISliderEvents_SinkHelper.cs | 40 + .../Decal.Interop.Controls/IStatic.cs | 82 + .../Decal.Interop.Controls/IconColumn.cs | 10 + .../Decal.Interop.Controls/IconColumnClass.cs | 56 + .../Decal.Interop.Controls/List.cs | 10 + .../Decal.Interop.Controls/ListClass.cs | 176 + .../Decal.Interop.Controls/Notebook.cs | 10 + .../Decal.Interop.Controls/NotebookClass.cs | 100 + .../Decal.Interop.Controls/PageLayout.cs | 10 + .../Decal.Interop.Controls/PageLayoutClass.cs | 102 + .../Decal.Interop.Controls/Progress.cs | 10 + .../Decal.Interop.Controls/ProgressClass.cs | 173 + .../Decal.Interop.Controls/PushButton.cs | 10 + .../Decal.Interop.Controls/PushButtonClass.cs | 142 + .../Decal.Interop.Controls/Scroller.cs | 11 + .../Decal.Interop.Controls/ScrollerClass.cs | 48 + .../Decal.Interop.Controls/Slider.cs | 10 + .../Decal.Interop.Controls/SliderClass.cs | 132 + .../Decal.Interop.Controls/StaticText.cs | 10 + .../Decal.Interop.Controls/StaticTextClass.cs | 108 + .../Decal.Interop.Controls/TextColumn.cs | 10 + .../Decal.Interop.Controls/TextColumnClass.cs | 56 + .../Decal.Interop.Controls/eBorderEdge.cs | 9 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.Core.csproj | 5 + .../Decal.Interop.Core/ACHooks.cs | 10 + .../Decal.Interop.Core/ACHooksClass.cs | 586 + .../Decal.Interop.Core/ActiveXSurrogate.cs | 10 + .../ActiveXSurrogateClass.cs | 38 + .../Decal.Interop.Core/DecalCore.cs | 10 + .../Decal.Interop.Core/DecalCoreClass.cs | 135 + .../Decal.Interop.Core/DecalEnum.cs | 10 + .../Decal.Interop.Core/DecalEnumClass.cs | 112 + .../Decal.Interop.Core/DecalRes.cs | 10 + .../Decal.Interop.Core/DecalResClass.cs | 12 + .../Decal.Interop.Core/IACHooks.cs | 565 + .../Decal.Interop.Core/IACHooksEvents.cs | 53 + ...oksEvents_AC3DRegionChangedEventHandler.cs | 6 + ...ksEvents_ChatClickInterceptEventHandler.cs | 6 + ...sEvents_ChatParserInterceptEventHandler.cs | 6 + ...oksEvents_ChatTextInterceptEventHandler.cs | 6 + ...HooksEvents_ContainerOpenedEventHandler.cs | 6 + .../IACHooksEvents_Event.cs | 28 + .../IACHooksEvents_EventProvider.cs | 838 + ...ooksEvents_MessageProcessedEventHandler.cs | 6 + ...HooksEvents_ObjectDestroyedEventHandler.cs | 6 + ...CHooksEvents_ObjectSelectedEventHandler.cs | 6 + .../IACHooksEvents_RenderPreUIEventHandler.cs | 6 + .../IACHooksEvents_SinkHelper.cs | 136 + ...sEvents_StatusTextInterceptEventHandler.cs | 6 + .../Decal.Interop.Core/IDecalCore.cs | 130 + .../Decal.Interop.Core/IDecalDirectory.cs | 16 + .../Decal.Interop.Core/IDecalEnum.cs | 112 + .../Decal.Interop.Core/IDecalEvents.cs | 21 + .../Decal.Interop.Core/IDecalEvents_Event.cs | 12 + .../IDecalEvents_EventProvider.cs | 230 + ...alEvents_InitializeCompleteEventHandler.cs | 6 + .../IDecalEvents_SinkHelper.cs | 40 + ...calEvents_TerminateCompleteEventHandler.cs | 6 + .../Decal.Interop.Core/IDecalFileSurrogate.cs | 31 + .../Decal.Interop.Core/IDecalRender.cs | 30 + .../Decal.Interop.Core/IDecalRes.cs | 12 + .../Decal.Interop.Core/IDecalService.cs | 24 + .../Decal.Interop.Core/IDecalSurrogate.cs | 43 + .../Decal.Interop.Core/IDecalUninstall.cs | 18 + .../IDecalWindowsMessageSink.cs | 15 + .../Decal.Interop.Core/IIdentifyFilter.cs | 18 + .../Decal.Interop.Core/IInjectService.cs | 23 + .../Decal.Interop.Core/IPlugin2.cs | 18 + .../Decal.Interop.Core/IPluginSite2.cs | 50 + .../Decal.Interop.Core/PluginSite2.cs | 10 + .../Decal.Interop.Core/PluginSite2Class.cs | 50 + .../Decal.Interop.Core/SurrogateRemove.cs | 10 + .../SurrogateRemoveClass.cs | 19 + .../Decal.Interop.Core/eAttribute.cs | 18 + .../Decal.Interop.Core/eAvailableHooks.cs | 33 + .../Decal.Interop.Core/eAvailableHooksEx.cs | 29 + .../Decal.Interop.Core/eChatColors.cs | 28 + .../Decal.Interop.Core/eDecalComponentType.cs | 9 + .../Decal.Interop.Core/eInt64Types.cs | 8 + .../Decal.Interop.Core/eIntTypes.cs | 6 + .../Decal.Interop.Core/eSkill.cs | 84 + .../Decal.Interop.Core/eTrainLevel.cs | 9 + .../Decal.Interop.Core/eUIElementType.cs | 21 + .../Decal.Interop.Core/eVital.cs | 15 + .../Decal.Interop.Core/tagRECT.cs | 15 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.D3DService.csproj | 5 + .../Decal.Interop.D3DService/CD3DObj.cs | 10 + .../Decal.Interop.D3DService/CD3DObjClass.cs | 252 + .../Decal.Interop.D3DService/CService.cs | 10 + .../Decal.Interop.D3DService/CServiceClass.cs | 92 + .../Decal.Interop.D3DService/ID3DObj.cs | 252 + .../Decal.Interop.D3DService/ID3DService.cs | 91 + .../Decal.Interop.D3DService/eShape.cs | 12 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.DHS.csproj | 5 + .../Decal.Interop.DHS/Hotkey.cs | 10 + .../Decal.Interop.DHS/HotkeyClass.cs | 89 + .../Decal.Interop.DHS/HotkeySystem.cs | 10 + .../Decal.Interop.DHS/HotkeySystemClass.cs | 37 + .../Decal.Interop.DHS/IDHSHotkeyEvents.cs | 15 + .../Decal.Interop.DHS/IHotkey.cs | 88 + .../Decal.Interop.DHS/IHotkeySystem.cs | 33 + .../Decal.Interop.DHS/_IHotkeySystemEvents.cs | 17 + .../_IHotkeySystemEvents_Event.cs | 10 + .../_IHotkeySystemEvents_EventProvider.cs | 154 + ...keySystemEvents_HotkeyEventEventHandler.cs | 6 + .../_IHotkeySystemEvents_SinkHelper.cs | 28 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.Dat.csproj | 5 + .../Decal.Interop.Dat/DatLibrary.cs | 10 + .../Decal.Interop.Dat/DatLibraryClass.cs | 26 + .../Decal.Interop.Dat/DatService.cs | 10 + .../Decal.Interop.Dat/DatServiceClass.cs | 13 + .../Decal.Interop.Dat/DatStream.cs | 10 + .../Decal.Interop.Dat/DatStreamClass.cs | 39 + .../Decal.Interop.Dat/IDatLibrary.cs | 26 + .../Decal.Interop.Dat/IDatService.cs | 12 + .../Decal.Interop.Dat/IDatStream.cs | 39 + .../Decal.Interop.Dat/IFileFilter.cs | 15 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.Filters.csproj | 8 + .../Decal.Interop.Filters/AllegianceInfo.cs | 10 + .../AllegianceInfoClass.cs | 109 + .../Decal.Interop.Filters/AttributeInfo.cs | 10 + .../AttributeInfoClass.cs | 53 + .../Decal.Interop.Filters/BoolValueKey.cs | 16 + .../Decal.Interop.Filters/CharacterStats.cs | 10 + .../CharacterStatsClass.cs | 531 + .../Decal.Interop.Filters/DoubleValueKey.cs | 29 + .../Decal.Interop.Filters/EchoFilter.cs | 10 + .../Decal.Interop.Filters/EchoFilter2.cs | 10 + .../Decal.Interop.Filters/EchoFilter2Class.cs | 17 + .../Decal.Interop.Filters/EchoFilterClass.cs | 15 + .../Decal.Interop.Filters/Enchantment.cs | 10 + .../Decal.Interop.Filters/EnchantmentClass.cs | 76 + .../Decal.Interop.Filters/IAllegianceInfo.cs | 109 + .../Decal.Interop.Filters/IAttributeInfo.cs | 53 + .../Decal.Interop.Filters/ICharacterStats.cs | 489 + .../ICharacterStatsEvents.cs | 93 + ...rStatsEvents_ActionCompleteEventHandler.cs | 6 + ...racterStatsEvents_CastSpellEventHandler.cs | 6 + ...tsEvents_ChangeEnchantmentsEventHandler.cs | 6 + ...tatsEvents_ChangeFellowshipEventHandler.cs | 6 + ...terStatsEvents_ChangeOptionEventHandler.cs | 6 + ...terStatsEvents_ChangePlayerEventHandler.cs | 6 + ...tatsEvents_ChangePortalModeEventHandler.cs | 6 + ...tsEvents_ChangeSettingFlagsEventHandler.cs | 6 + ...rStatsEvents_ChangeSettingsEventHandler.cs | 6 + ...rStatsEvents_ChangeShortcutEventHandler.cs | 6 + ...rStatsEvents_ChangeSpellbarEventHandler.cs | 6 + ...cterStatsEvents_ChangeVitalEventHandler.cs | 6 + ...racterStatsEvents_ChangeXPSEventHandler.cs | 6 + ...ICharacterStatsEvents_DeathEventHandler.cs | 6 + .../ICharacterStatsEvents_Event.cs | 48 + .../ICharacterStatsEvents_EventProvider.cs | 1598 ++ ...erStatsEvents_LoginCompleteEventHandler.cs | 6 + ...ICharacterStatsEvents_LoginEventHandler.cs | 6 + ...CharacterStatsEvents_LogoffEventHandler.cs | 6 + .../ICharacterStatsEvents_SinkHelper.cs | 256 + ...erStatsEvents_Spellbook_AddEventHandler.cs | 6 + ...tatsEvents_Spellbook_DeleteEventHandler.cs | 6 + ...erStatsEvents_StatusMessageEventHandler.cs | 6 + .../Decal.Interop.Filters/IEcho.cs | 12 + .../Decal.Interop.Filters/IEcho2.cs | 12 + .../Decal.Interop.Filters/IEchoSink.cs | 18 + .../Decal.Interop.Filters/IEchoSink2.cs | 22 + .../IEchoSink2_EchoClientEventHandler.cs | 7 + .../IEchoSink2_EchoServerEventHandler.cs | 7 + .../Decal.Interop.Filters/IEchoSink2_Event.cs | 12 + .../IEchoSink2_EventProvider.cs | 230 + .../IEchoSink2_SinkHelper.cs | 41 + .../IEchoSink_EchoMessageEventHandler.cs | 7 + .../Decal.Interop.Filters/IEchoSink_Event.cs | 10 + .../IEchoSink_EventProvider.cs | 154 + .../IEchoSink_SinkHelper.cs | 29 + .../Decal.Interop.Filters/IEnchantment.cs | 76 + .../Decal.Interop.Filters/IEnumVARIANT.cs | 23 + .../Decal.Interop.Filters/IIdentifyQueue.cs | 12 + .../Decal.Interop.Filters/IPrefilter.cs | 12 + .../Decal.Interop.Filters/IPrefilterEvents.cs | 18 + .../IPrefilterEvents_Event.cs | 10 + .../IPrefilterEvents_EventEventHandler.cs | 7 + .../IPrefilterEvents_EventProvider.cs | 154 + .../IPrefilterEvents_SinkHelper.cs | 29 + .../Decal.Interop.Filters/ISkillInfo.cs | 103 + .../Decal.Interop.Filters/IVendor.cs | 112 + .../Decal.Interop.Filters/IWorld.cs | 128 + .../Decal.Interop.Filters/IWorldEvents.cs | 69 + .../IWorldEvents_AcceptTradeEventHandler.cs | 6 + .../IWorldEvents_AddTradeItemEventHandler.cs | 6 + ...IWorldEvents_ApproachVendorEventHandler.cs | 6 + .../IWorldEvents_ChangeObjectEventHandler.cs | 6 + .../IWorldEvents_CreateObjectEventHandler.cs | 6 + .../IWorldEvents_DeclineTradeEventHandler.cs | 6 + .../IWorldEvents_EndTradeEventHandler.cs | 6 + .../IWorldEvents_EnterTradeEventHandler.cs | 6 + .../IWorldEvents_Event.cs | 36 + .../IWorldEvents_EventProvider.cs | 1142 + ...ldEvents_FailToAddTradeItemEventHandler.cs | 6 + ...dEvents_FailToCompleteTradeEventHandler.cs | 6 + .../IWorldEvents_MoveObjectEventHandler.cs | 6 + .../IWorldEvents_ReleaseDoneEventHandler.cs | 6 + .../IWorldEvents_ReleaseObjectEventHandler.cs | 6 + .../IWorldEvents_ResetTradeEventHandler.cs | 6 + .../IWorldEvents_SinkHelper.cs | 184 + .../Decal.Interop.Filters/IWorldIterator.cs | 93 + .../Decal.Interop.Filters/IWorldObject.cs | 184 + .../Decal.Interop.Filters/IdentifyQueue.cs | 10 + .../IdentifyQueueClass.cs | 13 + .../Decal.Interop.Filters/LongValueKey.cs | 108 + .../PlayerAddRemoveType.cs | 7 + .../Decal.Interop.Filters/PlayerCastType.cs | 7 + .../PlayerFellowshipType.cs | 10 + .../Decal.Interop.Filters/PlayerLogoffType.cs | 7 + .../Decal.Interop.Filters/PlayerModifyType.cs | 11 + .../Decal.Interop.Filters/PlayerPortalType.cs | 7 + .../Decal.Interop.Filters/PlayerVitalType.cs | 8 + .../Decal.Interop.Filters/PlayerXPType.cs | 7 + .../Decal.Interop.Filters/Prefilter.cs | 10 + .../Decal.Interop.Filters/PrefilterClass.cs | 15 + .../Decal.Interop.Filters/SkillInfo.cs | 10 + .../Decal.Interop.Filters/SkillInfoClass.cs | 103 + .../Decal.Interop.Filters/StringValueKey.cs | 22 + .../Decal.Interop.Filters/Vendor.cs | 10 + .../Decal.Interop.Filters/VendorClass.cs | 113 + .../Decal.Interop.Filters/VendorEnum.cs | 10 + .../Decal.Interop.Filters/VendorEnumClass.cs | 24 + .../Decal.Interop.Filters/World.cs | 10 + .../Decal.Interop.Filters/WorldChangeType.cs | 10 + .../Decal.Interop.Filters/WorldClass.cs | 158 + .../Decal.Interop.Filters/WorldEnum.cs | 10 + .../Decal.Interop.Filters/WorldEnumClass.cs | 24 + .../Decal.Interop.Filters/WorldIterator.cs | 10 + .../WorldIteratorClass.cs | 94 + .../Decal.Interop.Filters/WorldObject.cs | 10 + .../Decal.Interop.Filters/WorldObjectClass.cs | 185 + .../Decal.Interop.Filters/eAttributeID.cs | 12 + .../Decal.Interop.Filters/eAugmentations.cs | 66 + .../Decal.Interop.Filters/eObjectClass.cs | 49 + .../Decal.Interop.Filters/eSkillID.cs | 54 + .../Decal.Interop.Filters/eStatisticType.cs | 12 + .../Decal.Interop.Filters/eStringType.cs | 9 + .../Decal.Interop.Filters/eTrainingType.cs | 9 + .../Decal.Interop.Filters/eVitalID.cs | 8 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.Inject.csproj | 8 + .../Decal.Interop.Inject/BrushImage.cs | 10 + .../Decal.Interop.Inject/BrushImageClass.cs | 41 + .../Decal.Interop.Inject/Button.cs | 10 + .../Decal.Interop.Inject/ButtonClass.cs | 95 + .../Decal.Interop.Inject/Canvas.cs | 10 + .../Decal.Interop.Inject/CanvasClass.cs | 109 + .../Decal.Interop.Inject/ClipParams.cs | 14 + .../Decal.Interop.Inject/IBarManager.cs | 42 + .../Decal.Interop.Inject/IBrushImage.cs | 22 + .../Decal.Interop.Inject/IButton.cs | 61 + .../Decal.Interop.Inject/ICanvas.cs | 109 + .../Decal.Interop.Inject/ICommandEvents.cs | 33 + .../ICommandEvents_AcceptedEventHandler.cs | 6 + .../ICommandEvents_CanceledEventHandler.cs | 6 + .../ICommandEvents_DestroyEventHandler.cs | 6 + .../ICommandEvents_Event.cs | 18 + .../ICommandEvents_EventProvider.cs | 458 + .../ICommandEvents_HitEventHandler.cs | 6 + .../ICommandEvents_SinkHelper.cs | 76 + .../ICommandEvents_UnhitEventHandler.cs | 6 + .../Decal.Interop.Inject/IControl.cs | 41 + .../Decal.Interop.Inject/IControlEvents.cs | 17 + .../Decal.Interop.Inject/IFontCache.cs | 24 + .../Decal.Interop.Inject/IIconCache.cs | 18 + .../Decal.Interop.Inject/IImageCache.cs | 32 + .../Decal.Interop.Inject/IInputNotify.cs | 28 + .../Decal.Interop.Inject/ILayer.cs | 33 + .../Decal.Interop.Inject/ILayerKeyboard.cs | 21 + .../Decal.Interop.Inject/ILayerMouse.cs | 33 + .../Decal.Interop.Inject/ILayerPopup.cs | 15 + .../Decal.Interop.Inject/ILayerRender.cs | 27 + .../Decal.Interop.Inject/ILayerSchema.cs | 15 + .../Decal.Interop.Inject/ILayerSite.cs | 119 + .../Decal.Interop.Inject/ILayerTimer.cs | 15 + .../Decal.Interop.Inject/IPager.cs | 66 + .../Decal.Interop.Inject/IPagerEvents.cs | 25 + .../IPagerEvents_ChangeEventHandler.cs | 6 + .../IPagerEvents_DestroyEventHandler.cs | 6 + .../IPagerEvents_Event.cs | 14 + .../IPagerEvents_EventProvider.cs | 306 + ...PagerEvents_GetNextPositionEventHandler.cs | 6 + .../IPagerEvents_SinkHelper.cs | 53 + .../Decal.Interop.Inject/IPanel.cs | 66 + .../Decal.Interop.Inject/IPanelSink.cs | 15 + .../Decal.Interop.Inject/IPlugin.cs | 26 + .../Decal.Interop.Inject/IPluginAdapterV1.cs | 12 + .../Decal.Interop.Inject/IPluginSite.cs | 151 + .../Decal.Interop.Inject/IRender3DSink.cs | 24 + .../Decal.Interop.Inject/IRootLayer.cs | 27 + .../Decal.Interop.Inject/ISimpleBar.cs | 41 + .../Decal.Interop.Inject/IView.cs | 103 + .../Decal.Interop.Inject/IViewDisp.cs | 79 + .../Decal.Interop.Inject/IViewEvents.cs | 29 + .../Decal.Interop.Inject/IViewEvents_Event.cs | 16 + .../IViewEvents_EventProvider.cs | 382 + .../IViewEvents_OnActivateEventHandler.cs | 6 + .../IViewEvents_OnDeactivateEventHandler.cs | 6 + .../IViewEvents_SinkHelper.cs | 65 + .../IViewEvents_SizeEventHandler.cs | 6 + .../IViewEvents_SizingEventHandler.cs | 6 + .../IWindowsMessageSink.cs | 18 + .../Decal.Interop.Inject/InjectService.cs | 11 + .../InjectServiceClass.cs | 25 + .../Decal.Interop.Inject/KeyState.cs | 13 + .../Decal.Interop.Inject/Layer.cs | 10 + .../Decal.Interop.Inject/LayerClass.cs | 119 + .../Decal.Interop.Inject/LayerParams.cs | 14 + .../Decal.Interop.Inject/MouseState.cs | 18 + .../Decal.Interop.Inject/Pager.cs | 10 + .../Decal.Interop.Inject/PagerClass.cs | 96 + .../Decal.Interop.Inject/PluginAdapterV1.cs | 10 + .../PluginAdapterV1Class.cs | 13 + .../Decal.Interop.Inject/PluginSite.cs | 10 + .../Decal.Interop.Inject/PluginSiteClass.cs | 151 + .../Decal.Interop.Inject/View.cs | 10 + .../Decal.Interop.Inject/ViewClass.cs | 112 + .../Decal.Interop.Inject/ViewParams.cs | 23 + .../Decal.Interop.Inject/_RemotableHandle.cs | 11 + .../__MIDL_IWinTypes_0009.cs | 13 + .../eAlphaBlendOptions.cs | 7 + .../Decal.Interop.Inject/eCombatState.cs | 9 + .../eDefaultControlType.cs | 7 + .../Decal.Interop.Inject/eDrawTextExFlags.cs | 7 + .../Decal.Interop.Inject/eFontJustify.cs | 8 + .../Decal.Interop.Inject/eFontOptions.cs | 8 + .../Decal.Interop.Inject/eInputStatus.cs | 9 + .../Decal.Interop.Inject/eManagerSinkCaps.cs | 9 + .../Decal.Interop.Inject/eMinMaxState.cs | 7 + .../Decal.Interop.Inject/eMouseInput.cs | 9 + .../Decal.Interop.Inject/ePositionType.cs | 7 + .../Decal.Interop.Inject/eRenderOptions.cs | 9 + .../Decal.Interop.Inject/eViewFlags.cs | 6 + .../Decal.Interop.Inject/tagPOINT.cs | 11 + .../Decal.Interop.Inject/tagSIZE.cs | 11 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.Input.csproj | 8 + .../Decal.Interop.Input/DelayAction.cs | 10 + .../Decal.Interop.Input/DelayActionClass.cs | 38 + .../Decal.Interop.Input/EventAction.cs | 10 + .../Decal.Interop.Input/EventActionClass.cs | 38 + .../Decal.Interop.Input/Hotkey.cs | 10 + .../Decal.Interop.Input/HotkeyClass.cs | 56 + .../Decal.Interop.Input/IDecalTimer.cs | 42 + .../Decal.Interop.Input/IHotkey.cs | 52 + .../Decal.Interop.Input/IHotkeyEvents.cs | 17 + .../IHotkeyEvents_Event.cs | 10 + .../IHotkeyEvents_EventProvider.cs | 154 + .../IHotkeyEvents_HotkeyEventHandler.cs | 6 + .../IHotkeyEvents_SinkHelper.cs | 28 + .../Decal.Interop.Input/IInputAction.cs | 37 + .../Decal.Interop.Input/IInputActionSite.cs | 29 + .../Decal.Interop.Input/IInputBuffer.cs | 54 + .../Decal.Interop.Input/IInputBufferEvents.cs | 25 + .../IInputBufferEvents_BeginEventHandler.cs | 6 + .../IInputBufferEvents_EndEventHandler.cs | 6 + .../IInputBufferEvents_Event.cs | 14 + .../IInputBufferEvents_EventEventHandler.cs | 6 + .../IInputBufferEvents_EventProvider.cs | 306 + .../IInputBufferEvents_SinkHelper.cs | 52 + .../Decal.Interop.Input/IInputService.cs | 30 + .../Decal.Interop.Input/ITimerEvents.cs | 17 + .../Decal.Interop.Input/ITimerEvents_Event.cs | 10 + .../ITimerEvents_EventProvider.cs | 154 + .../ITimerEvents_SinkHelper.cs | 28 + .../ITimerEvents_TimeoutEventHandler.cs | 6 + .../Decal.Interop.Input/IWinMsgHook.cs | 38 + .../Decal.Interop.Input/IWinMsgHookEvents.cs | 17 + .../IWinMsgHookEvents_Event.cs | 10 + .../IWinMsgHookEvents_EventProvider.cs | 154 + .../IWinMsgHookEvents_MessageEventHandler.cs | 6 + .../IWinMsgHookEvents_SinkHelper.cs | 28 + .../Decal.Interop.Input/IWndMsg.cs | 56 + .../Decal.Interop.Input/InputBuffer.cs | 10 + .../Decal.Interop.Input/InputBufferClass.cs | 62 + .../Decal.Interop.Input/InputService.cs | 10 + .../Decal.Interop.Input/InputServiceClass.cs | 31 + .../Decal.Interop.Input/MouseMoveAction.cs | 10 + .../MouseMoveActionClass.cs | 38 + .../Decal.Interop.Input/PolledDelayAction.cs | 10 + .../PolledDelayActionClass.cs | 38 + .../Decal.Interop.Input/RestoreAction.cs | 10 + .../Decal.Interop.Input/RestoreActionClass.cs | 38 + .../Decal.Interop.Input/Timer.cs | 10 + .../Decal.Interop.Input/TimerClass.cs | 46 + .../Decal.Interop.Input/TypeAction.cs | 10 + .../Decal.Interop.Input/TypeActionClass.cs | 38 + .../Decal.Interop.Input/WinMsgHook.cs | 10 + .../Decal.Interop.Input/WinMsgHookClass.cs | 42 + .../Decal.Interop.Input/WndMsg.cs | 10 + .../Decal.Interop.Input/WndMsgClass.cs | 56 + .../Decal.Interop.Input/eActionUse.cs | 7 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.Net.csproj | 8 + .../Decal.Interop.Net/IMessage.cs | 75 + .../Decal.Interop.Net/IMessage2.cs | 84 + .../Decal.Interop.Net/IMessageFactory.cs | 17 + .../Decal.Interop.Net/IMessageIterator.cs | 111 + .../Decal.Interop.Net/IMessageMember.cs | 74 + .../Decal.Interop.Net/INetService.cs | 45 + .../Decal.Interop.Net/INetworkFilter.cs | 16 + .../Decal.Interop.Net/INetworkFilter2.cs | 24 + .../Decal.Interop.Net/IWebRequest.cs | 20 + .../Decal.Interop.Net/IWebRequestEvents.cs | 21 + .../IWebRequestEvents_BeginEventHandler.cs | 6 + .../IWebRequestEvents_EndEventHandler.cs | 6 + .../IWebRequestEvents_Event.cs | 12 + .../IWebRequestEvents_EventProvider.cs | 230 + .../IWebRequestEvents_SinkHelper.cs | 40 + .../Decal.Interop.Net/MessageRoot.cs | 10 + .../Decal.Interop.Net/MessageRootClass.cs | 111 + .../Decal.Interop.Net/NetService.cs | 10 + .../Decal.Interop.Net/NetServiceClass.cs | 46 + .../Decal.Interop.Net/WebRequest.cs | 10 + .../Decal.Interop.Net/WebRequestClass.cs | 26 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.Render.csproj | 9 + .../Decal.Interop.Render/HUDBackground.cs | 10 + .../HUDBackgroundClass.cs | 111 + .../Decal.Interop.Render/HUDView.cs | 10 + .../Decal.Interop.Render/HUDViewClass.cs | 215 + .../Decal.Interop.Render/IHUDBackground.cs | 110 + .../Decal.Interop.Render/IHUDView.cs | 214 + .../Decal.Interop.Render/IRenderScalable.cs | 141 + .../Decal.Interop.Render/IRenderService.cs | 47 + .../IRenderServiceEvents.cs | 17 + ...derServiceEvents_DeviceLostEventHandler.cs | 6 + .../IRenderServiceEvents_Event.cs | 10 + .../IRenderServiceEvents_EventProvider.cs | 154 + .../IRenderServiceEvents_SinkHelper.cs | 28 + .../Decal.Interop.Render/IRenderTarget.cs | 105 + .../Decal.Interop.Render/RenderService.cs | 10 + .../RenderServiceClass.cs | 51 + .../RenderTargetWrapper.cs | 10 + .../RenderTargetWrapperClass.cs | 106 + .../Properties/AssemblyInfo.cs | 10 + .../Decal.Interop.SpellFilter.csproj | 5 + .../Decal.Interop.SpellFilter/Component.cs | 10 + .../ComponentClass.cs | 125 + .../Decal.Interop.SpellFilter/IComponent.cs | 124 + .../Decal.Interop.SpellFilter/ISpell.cs | 463 + .../Decal.Interop.SpellFilter/ISpells.cs | 73 + .../Decal.Interop.SpellFilter/Spell.cs | 10 + .../Decal.Interop.SpellFilter/SpellClass.cs | 464 + .../Decal.Interop.SpellFilter/Spells.cs | 10 + .../Decal.Interop.SpellFilter/SpellsClass.cs | 81 + .../_ISpellsEvents.cs | 25 + .../_ISpellsEvents_Event.cs | 14 + .../_ISpellsEvents_EventProvider.cs | 306 + .../_ISpellsEvents_LoginEventHandler.cs | 6 + .../_ISpellsEvents_SinkHelper.cs | 52 + ...ISpellsEvents_Spellbook_AddEventHandler.cs | 6 + ...ellsEvents_Spellbook_DeleteEventHandler.cs | 6 + .../Decal.Interop.SpellFilter/eComponent.cs | 158 + .../eComponentType.cs | 12 + .../Decal.Interop.SpellFilter/eSpellType.cs | 19 + .../Properties/AssemblyInfo.cs | 10 + Managed/Decal.SpellFilter/ComponentImpl.cs | 22 + .../Decal.SpellFilter.csproj | 10 + Managed/Decal.SpellFilter/SpellImpl.cs | 49 + Managed/Decal.SpellFilter/SpellsImpl.cs | 131 + Managed/Decal.sln | 166 + .../DecalUtil/DecalUtil.DecalUtilMain.resx | 1787 ++ .../DecalUtil.Properties/Resources.cs | 48 + .../DecalUtil.Properties/Settings.cs | 14 + Managed/DecalUtil/DecalUtil.csproj | 14 + Managed/DecalUtil/DecalUtil/DecalUtilMain.cs | 441 + Managed/DecalUtil/DecalUtil/IFormStatus.cs | 12 + Managed/DecalUtil/DecalUtil/Program.cs | 15 + Managed/DecalUtil/DecalUtil/Update.cs | 125 + Managed/DecalUtil/DecalUtil/UpdateFile.cs | 20 + Managed/DecalUtil/Properties/AssemblyInfo.cs | 17 + Managed/DecalUtil/app.ico | Bin 0 -> 99934 bytes Managed/DecalUtil/app.manifest | 9 + Managed/Directory.Build.props | 13 + Native/CMakeLists.txt | 8 + Native/Decal.dsw | 173 + Native/Decal.sln | 210 + Native/Decal/ACHooks.cpp | 2618 ++ Native/Decal/ACHooks.h | 355 + Native/Decal/ACHooks.rgs | 23 + Native/Decal/ActiveXSurrogate.cpp | 194 + Native/Decal/ActiveXSurrogate.h | 84 + Native/Decal/ActiveXSurrogate.rgs | 44 + Native/Decal/Decal.cpp | 79 + Native/Decal/Decal.def | 9 + Native/Decal/Decal.dsp | 263 + Native/Decal/Decal.rc | 157 + Native/Decal/Decal.rgs | 25 + Native/Decal/Decal.vcproj | 987 + Native/Decal/DecalCP.h | 202 + Native/Decal/DecalEnum.cpp | 519 + Native/Decal/DecalEnum.h | 76 + Native/Decal/DecalManager.cpp | 636 + Native/Decal/DecalManager.h | 99 + Native/Decal/DecalRes.cpp | 152 + Native/Decal/DecalRes.h | 337 + Native/Decal/DecalRes.rgs | 26 + Native/Decal/Decalps.def | 11 + Native/Decal/Decalps.mk | 16 + Native/Decal/PluginSite.cpp | 49 + Native/Decal/PluginSite.h | 42 + Native/Decal/StdAfx.cpp | 5 + Native/Decal/StdAfx.h | 51 + Native/Decal/SurrogateRemove.cpp | 8 + Native/Decal/SurrogateRemove.h | 87 + Native/Decal/SurrogateRemove.rgs | 25 + Native/Decal/resource.h | 36 + Native/DecalControls/Attic/DecalControls.aps | Bin 0 -> 5038 bytes Native/DecalControls/Attic/Image.cpp | 0 Native/DecalControls/Attic/Image.h | 0 Native/DecalControls/Attic/Image.rgs | 0 Native/DecalControls/Attic/ImageControl.cpp | 0 Native/DecalControls/Attic/ImageControl.h | 0 Native/DecalControls/BorderLayout.cpp | 197 + Native/DecalControls/BorderLayout.h | 73 + Native/DecalControls/BorderLayout.rgs | 25 + Native/DecalControls/CheckColumn.cpp | 114 + Native/DecalControls/CheckColumn.h | 46 + Native/DecalControls/CheckColumn.rgs | 25 + Native/DecalControls/Checkbox.cpp | 349 + Native/DecalControls/Checkbox.h | 91 + Native/DecalControls/Checkbox.rgs | 25 + Native/DecalControls/Choice.cpp | 426 + Native/DecalControls/Choice.h | 128 + Native/DecalControls/Choice.rgs | 25 + Native/DecalControls/ChoiceDropDown.cpp | 46 + Native/DecalControls/ChoiceDropDown.h | 49 + Native/DecalControls/ChoiceDropDown.rgs | 25 + Native/DecalControls/ChoicePopup.cpp | 97 + Native/DecalControls/ChoicePopup.h | 87 + Native/DecalControls/Client.cpp | 37 + Native/DecalControls/Client.h | 50 + Native/DecalControls/Client.rgs | 25 + Native/DecalControls/ControlImpl.h | 155 + Native/DecalControls/DecalControls.clw | 14 + Native/DecalControls/DecalControls.cpp | 105 + Native/DecalControls/DecalControls.def | 9 + Native/DecalControls/DecalControls.dsp | 402 + Native/DecalControls/DecalControls.idl | 663 + Native/DecalControls/DecalControls.rc | 142 + Native/DecalControls/DecalControls.vcproj | 788 + Native/DecalControls/DecalControlsCP.h | 821 + Native/DecalControls/DecalControlsps.def | 11 + Native/DecalControls/DecalControlsps.mk | 16 + Native/DecalControls/DerethMap.cpp | 120 + Native/DecalControls/DerethMap.h | 92 + Native/DecalControls/DerethMap.rgs | 23 + Native/DecalControls/Edit.cpp | 990 + Native/DecalControls/Edit.h | 122 + Native/DecalControls/Edit.rgs | 25 + Native/DecalControls/FixedLayout.cpp | 36 + Native/DecalControls/FixedLayout.h | 57 + Native/DecalControls/FixedLayout.rgs | 25 + Native/DecalControls/IconColumn.cpp | 95 + Native/DecalControls/IconColumn.h | 46 + Native/DecalControls/IconColumn.rgs | 25 + Native/DecalControls/List.cpp | 656 + Native/DecalControls/List.h | 122 + Native/DecalControls/List.rgs | 25 + Native/DecalControls/ListView.cpp | 220 + Native/DecalControls/ListView.h | 65 + Native/DecalControls/Notebook.cpp | 281 + Native/DecalControls/Notebook.h | 97 + Native/DecalControls/Notebook.rgs | 25 + Native/DecalControls/PageLayout.cpp | 110 + Native/DecalControls/PageLayout.h | 70 + Native/DecalControls/PageLayout.rgs | 25 + Native/DecalControls/Progress.cpp | 323 + Native/DecalControls/Progress.h | 88 + Native/DecalControls/PushButton.cpp | 382 + Native/DecalControls/PushButton.h | 91 + Native/DecalControls/PushButton.rgs | 25 + Native/DecalControls/Scroller.cpp | 863 + Native/DecalControls/Scroller.h | 139 + Native/DecalControls/Scroller.rgs | 25 + Native/DecalControls/Slider.cpp | 515 + Native/DecalControls/Slider.h | 96 + Native/DecalControls/Slider.rgs | 25 + Native/DecalControls/Static.cpp | 372 + Native/DecalControls/Static.h | 78 + Native/DecalControls/Static.rgs | 25 + Native/DecalControls/StdAfx.cpp | 14 + Native/DecalControls/StdAfx.h | 53 + Native/DecalControls/TextColumn.cpp | 222 + Native/DecalControls/TextColumn.h | 52 + Native/DecalControls/TextColumn.rgs | 25 + Native/DecalControls/progress.rgs | 26 + Native/DecalControls/resource.h | 35 + Native/DecalDat/DatFile.cpp | 164 + Native/DecalDat/DatFile.h | 76 + Native/DecalDat/DatLibrary.cpp | 158 + Native/DecalDat/DatLibrary.h | 52 + Native/DecalDat/DatService.cpp | 152 + Native/DecalDat/DatService.h | 87 + Native/DecalDat/DatService.rgs | 43 + Native/DecalDat/DatStream.cpp | 95 + Native/DecalDat/DatStream.h | 42 + Native/DecalDat/DecalDat.cpp | 71 + Native/DecalDat/DecalDat.def | 9 + Native/DecalDat/DecalDat.dsp | 284 + Native/DecalDat/DecalDat.rc | 133 + Native/DecalDat/DecalDat.vcproj | 784 + Native/DecalDat/DecalDatps.def | 11 + Native/DecalDat/DecalDatps.mk | 16 + Native/DecalDat/StdAfx.cpp | 5 + Native/DecalDat/StdAfx.h | 44 + Native/DecalDat/resource.h | 19 + Native/DecalFilters/AllegianceInfo.cpp | 83 + Native/DecalFilters/AllegianceInfo.h | 55 + Native/DecalFilters/AllegianceInfo.rgs | 23 + Native/DecalFilters/Attic/Location.cpp | 36 + Native/DecalFilters/Attic/Location.h | 56 + Native/DecalFilters/Attic/Location.rgs | 26 + Native/DecalFilters/Attic/Stackable.cpp | 8 + Native/DecalFilters/Attic/Stackable.h | 33 + Native/DecalFilters/Attic/Stackable.rgs | 26 + Native/DecalFilters/AttributeInfo.cpp | 61 + Native/DecalFilters/AttributeInfo.h | 40 + Native/DecalFilters/CharacterStats.cpp | 1849 ++ Native/DecalFilters/CharacterStats.h | 629 + Native/DecalFilters/CharacterStats.rgs | 43 + Native/DecalFilters/DecalFilters.cpp | 88 + Native/DecalFilters/DecalFilters.def | 9 + Native/DecalFilters/DecalFilters.dsp | 298 + Native/DecalFilters/DecalFilters.idl | 686 + Native/DecalFilters/DecalFilters.rc | 146 + Native/DecalFilters/DecalFilters.vcproj | 597 + Native/DecalFilters/DecalFiltersCP.h | 347 + Native/DecalFilters/DecalFiltersps.def | 11 + Native/DecalFilters/DecalFiltersps.mk | 16 + Native/DecalFilters/EchoFilter.cpp | 15 + Native/DecalFilters/EchoFilter.h | 47 + Native/DecalFilters/EchoFilter.rgs | 39 + Native/DecalFilters/EchoFilter2.cpp | 22 + Native/DecalFilters/EchoFilter2.h | 49 + Native/DecalFilters/EchoFilter2.rgs | 42 + Native/DecalFilters/Enchantment.cpp | 106 + Native/DecalFilters/Enchantment.h | 56 + Native/DecalFilters/Enchantment.rgs | 23 + Native/DecalFilters/FilterImpl.h | 80 + Native/DecalFilters/IdentifyQueue.cpp | 212 + Native/DecalFilters/IdentifyQueue.h | 80 + Native/DecalFilters/IdentifyQueue.rgs | 44 + Native/DecalFilters/Prefilter.cpp | 438 + Native/DecalFilters/Prefilter.h | 123 + Native/DecalFilters/Prefilter.rgs | 45 + Native/DecalFilters/SkillInfo.cpp | 205 + Native/DecalFilters/SkillInfo.h | 48 + Native/DecalFilters/StdAfx.cpp | 15 + Native/DecalFilters/StdAfx.h | 55 + Native/DecalFilters/World.cpp | 1929 ++ Native/DecalFilters/World.h | 387 + Native/DecalFilters/World.rgs | 44 + Native/DecalFilters/WorldIterator.cpp | 190 + Native/DecalFilters/WorldIterator.h | 201 + Native/DecalFilters/WorldIterator.rgs | 26 + Native/DecalFilters/WorldObject.cpp | 674 + Native/DecalFilters/WorldObject.h | 138 + Native/DecalFilters/WorldObject.rgs | 26 + Native/DecalFilters/resource.h | 28 + Native/DecalInput/DecalInput.cpp | 91 + Native/DecalInput/DecalInput.def | 9 + Native/DecalInput/DecalInput.dsp | 393 + Native/DecalInput/DecalInput.rc | 143 + Native/DecalInput/DecalInput.vcproj | 1196 + Native/DecalInput/DecalInputCP.h | 191 + Native/DecalInput/DecalInputps.def | 11 + Native/DecalInput/DecalInputps.mk | 16 + Native/DecalInput/DelayAction.cpp | 8 + Native/DecalInput/DelayAction.h | 46 + Native/DecalInput/DelayAction.rgs | 43 + Native/DecalInput/EventAction.cpp | 8 + Native/DecalInput/EventAction.h | 48 + Native/DecalInput/EventAction.rgs | 43 + Native/DecalInput/Hotkey.cpp | 159 + Native/DecalInput/Hotkey.h | 61 + Native/DecalInput/Hotkey.rgs | 26 + Native/DecalInput/InputBuffer.cpp | 351 + Native/DecalInput/InputBuffer.h | 93 + Native/DecalInput/InputBuffer.rgs | 26 + Native/DecalInput/InputService.cpp | 408 + Native/DecalInput/InputService.h | 121 + Native/DecalInput/InputService.rgs | 43 + Native/DecalInput/MouseMoveAction.cpp | 81 + Native/DecalInput/MouseMoveAction.h | 71 + Native/DecalInput/MouseMoveAction.rgs | 43 + Native/DecalInput/PolledDelayAction.cpp | 8 + Native/DecalInput/PolledDelayAction.h | 84 + Native/DecalInput/PolledDelayAction.rgs | 43 + Native/DecalInput/RestoreAction.cpp | 8 + Native/DecalInput/RestoreAction.h | 54 + Native/DecalInput/RestoreAction.rgs | 43 + Native/DecalInput/StdAfx.cpp | 5 + Native/DecalInput/StdAfx.h | 40 + Native/DecalInput/Timer.cpp | 96 + Native/DecalInput/Timer.h | 60 + Native/DecalInput/Timer.rgs | 26 + Native/DecalInput/TypeAction.cpp | 231 + Native/DecalInput/TypeAction.h | 140 + Native/DecalInput/TypeAction.rgs | 43 + Native/DecalInput/WinMsgHook.cpp | 81 + Native/DecalInput/WinMsgHook.h | 57 + Native/DecalInput/WinMsgHook.rgs | 26 + Native/DecalInput/WndMsg.cpp | 50 + Native/DecalInput/WndMsg.h | 55 + Native/DecalInput/WndMsg.rgs | 26 + Native/DecalInput/resource.h | 28 + Native/DecalNet/ACMessage.h | 16 + Native/DecalNet/DecalNet.cpp | 74 + Native/DecalNet/DecalNet.def | 9 + Native/DecalNet/DecalNet.dsp | 341 + Native/DecalNet/DecalNet.rc | 134 + Native/DecalNet/DecalNet.vcproj | 1073 + Native/DecalNet/DecalNetCP.h | 60 + Native/DecalNet/DecalNetps.def | 11 + Native/DecalNet/DecalNetps.mk | 16 + Native/DecalNet/FilterAdapterV1.cpp | 21 + Native/DecalNet/FilterAdapterV1.h | 28 + Native/DecalNet/Message.cpp | 393 + Native/DecalNet/Message.h | 161 + Native/DecalNet/MessageImpl.h | 363 + Native/DecalNet/MessageLoaders.cpp | 207 + Native/DecalNet/MessageLoaders.h | 28 + Native/DecalNet/MessageParsers.cpp | 727 + Native/DecalNet/MessageParsers.h | 48 + Native/DecalNet/MessageRoot.cpp | 8 + Native/DecalNet/MessageRoot.h | 90 + Native/DecalNet/MessageStruct.cpp | 96 + Native/DecalNet/MessageStruct.h | 34 + Native/DecalNet/MessageVector.cpp | 103 + Native/DecalNet/MessageVector.h | 37 + Native/DecalNet/NetService.cpp | 460 + Native/DecalNet/NetService.h | 86 + Native/DecalNet/NetService.rgs | 43 + Native/DecalNet/ProtocolHook.h | 44 + Native/DecalNet/ProtocolStack.cpp | 313 + Native/DecalNet/ProtocolStack.h | 106 + Native/DecalNet/StdAfx.cpp | 12 + Native/DecalNet/StdAfx.h | 45 + Native/DecalNet/WebRequest.cpp | 108 + Native/DecalNet/WebRequest.h | 92 + Native/DecalNet/WebRequest.rgs | 26 + Native/DecalNet/resource.h | 19 + .../Attic/DecalSupportLibraries.cpp | 105 + .../Attic/DecalSupportLibraries.h | 31 + .../Attic/DecalSupportLibraries.idl | 29 + .../Attic/DecalSupportLibraries.rc | 210 + .../Attic/DecalSupportLibraries.reg | 14 + .../Attic/DecalSupportLibraries.sln | 26 + .../Attic/DecalSupportLibraries.vcproj | 195 + .../Attic/DecalSupportLibrariesDlg.cpp | 202 + .../Attic/DecalSupportLibrariesDlg.h | 43 + .../DecalSupportLibraries/Attic/DlgProxy.cpp | 80 + Native/DecalSupportLibraries/Attic/DlgProxy.h | 42 + Native/DecalSupportLibraries/Attic/ReadMe.txt | 105 + Native/DecalSupportLibraries/Attic/Resource.h | 23 + Native/DecalSupportLibraries/Attic/stdafx.cpp | 7 + Native/DecalSupportLibraries/Attic/stdafx.h | 53 + .../DSLSetup/Attic/DSLSetup.vdproj | 799 + .../res/Attic/DecalSupportLibraries.ico | Bin 0 -> 21630 bytes .../res/Attic/DecalSupportLibraries.manifest | 22 + .../res/Attic/DecalSupportLibraries.rc2 | 13 + Native/DenAgent/AddRemoveDlg.cpp | 687 + Native/DenAgent/AddRemoveDlg.h | 114 + Native/DenAgent/AutoUpdate.cpp | 527 + Native/DenAgent/AutoUpdate.h | 70 + Native/DenAgent/BindStatusCallback.cpp | 125 + Native/DenAgent/BindStatusCallback.h | 36 + Native/DenAgent/ChangePluginDirectory.cpp | 81 + Native/DenAgent/DenAgent.cpp | 691 + Native/DenAgent/DenAgent.dsp | 260 + Native/DenAgent/DenAgent.h | 87 + Native/DenAgent/DenAgent.idl | 29 + Native/DenAgent/DenAgent.rc | 576 + Native/DenAgent/DenAgent.rgs | 11 + Native/DenAgent/DenAgent.vcproj | 536 + Native/DenAgent/DenAgentDlg.cpp | 844 + Native/DenAgent/DenAgentDlg.h | 100 + Native/DenAgent/DownloadDlg.cpp | 77 + Native/DenAgent/DownloadDlg.h | 62 + Native/DenAgent/DownloaderDlg.cpp | 246 + Native/DenAgent/DownloaderDlg.h | 79 + Native/DenAgent/ExportDlg.cpp | 750 + Native/DenAgent/ExportDlg.h | 56 + Native/DenAgent/Images.bmp | Bin 0 -> 3896 bytes Native/DenAgent/OptionsDlg.cpp | 553 + Native/DenAgent/OptionsDlg.h | 74 + Native/DenAgent/ReadMe.txt | 88 + Native/DenAgent/SinkImpl.cpp | 0 Native/DenAgent/StdAfx.cpp | 5 + Native/DenAgent/StdAfx.h | 64 + Native/DenAgent/TrayWnd.cpp | 507 + Native/DenAgent/TrayWnd.h | 67 + Native/DenAgent/URLCallback.cpp | 123 + Native/DenAgent/URLCallback.h | 203 + Native/DenAgent/URLCallback.rgs | 23 + Native/DenAgent/changeplugindirectory.h | 47 + Native/DenAgent/res/Attic/asheron.ico | Bin 0 -> 4710 bytes Native/DenAgent/res/DenAgent.ico | Bin 0 -> 4710 bytes Native/DenAgent/res/DenAgent.rc2 | 13 + Native/DenAgent/res/bitmap1.bmp | Bin 0 -> 630 bytes Native/DenAgent/res/groups.bmp | Bin 0 -> 1014 bytes Native/DenAgent/res/idr_tray.ico | Bin 0 -> 4710 bytes Native/DenAgent/res/version_.bmp | Bin 0 -> 998 bytes Native/DenAgent/resource.h | 110 + Native/Include/ApiHook.h | 226 + Native/Include/DX6InjectApi.h | 21 + Native/Include/Decal.idl | 566 + Native/Include/DecalDat.idl | 101 + Native/Include/DecalFilters.idl | 273 + Native/Include/DecalImpl.h | 386 + Native/Include/DecalInput.idl | 319 + Native/Include/DecalInputImpl.h | 68 + Native/Include/DecalKey.h | 9 + Native/Include/DecalNet.idl | 187 + Native/Include/DecalNetImpl.h | 87 + Native/Include/DecalVersion.h | 14 + Native/Include/EventsImpl.h | 91 + Native/Include/FilterImpl.h | 80 + Native/Include/ForceLib.h | 27 + Native/Include/ForceLibrary.lib | Bin 0 -> 3102 bytes Native/Include/Helpers.h | 67 + Native/Include/Inject.tlb | Bin 0 -> 50336 bytes Native/Include/VSBridge.h | 43 + .../Inject/Attic/Copy of DirectDrawHook.cpp | 282 + Native/Inject/Attic/Copy of DirectDrawHook.h | 277 + Native/Inject/Attic/Copy of Panel.cpp | 313 + Native/Inject/Attic/Copy of Panel.h | 88 + Native/Inject/Attic/Copy of RootLayer.cpp | 191 + Native/Inject/Attic/Copy of RootLayer.h | 61 + Native/Inject/Attic/Copy of View.cpp | 410 + Native/Inject/Attic/Copy of View.h | 81 + Native/Inject/Attic/EventsImpl.h | 91 + Native/Inject/Attic/Inject.aps | Bin 0 -> 5828 bytes Native/Inject/Attic/Inject.h | 8563 +++++++ Native/Inject/Attic/Inject.lib | Bin 0 -> 3826 bytes Native/Inject/Attic/Inject.plg | 71 + Native/Inject/Attic/Inject.tlb | Bin 0 -> 405 bytes Native/Inject/Attic/Inject_i.c | 448 + Native/Inject/Attic/Inject_p.c | 21230 ++++++++++++++++ Native/Inject/Attic/Message.cpp | 345 + Native/Inject/Attic/Message.h | 148 + Native/Inject/Attic/MessageLoaders.cpp | 196 + Native/Inject/Attic/MessageLoaders.h | 30 + Native/Inject/Attic/MessageParsers-Cibo.cpp | 701 + Native/Inject/Attic/MessageParsers.cpp | 704 + Native/Inject/Attic/MessageParsers.h | 48 + Native/Inject/Attic/MessageStruct.cpp | 93 + Native/Inject/Attic/MessageStruct.h | 36 + Native/Inject/Attic/MessageStruct.rgs | 26 + Native/Inject/Attic/MessageVector.cpp | 75 + Native/Inject/Attic/MessageVector.h | 37 + Native/Inject/Attic/MessageVector.rgs | 26 + Native/Inject/Attic/ProtocolStack.cpp | 210 + Native/Inject/Attic/ProtocolStack.h | 159 + Native/Inject/Attic/dlldata.c | 38 + Native/Inject/BarLayer.cpp | 1128 + Native/Inject/BarLayer.h | 121 + Native/Inject/Button.cpp | 244 + Native/Inject/Button.h | 79 + Native/Inject/Button.rgs | 25 + Native/Inject/Canvas.cpp | 748 + Native/Inject/Canvas.h | 79 + Native/Inject/DatFile.cpp | 164 + Native/Inject/DatFile.h | 76 + Native/Inject/Direct3DHook.cpp | 43 + Native/Inject/Direct3DHook.h | 371 + Native/Inject/DirectDrawHook.cpp | 284 + Native/Inject/DirectDrawHook.h | 278 + Native/Inject/DirectDrawSurfaceHook.cpp | 85 + Native/Inject/DirectDrawSurfaceHook.h | 879 + Native/Inject/FileStuffs.cpp | 26 + Native/Inject/FontCache.cpp | 284 + Native/Inject/FontCache.h | 50 + Native/Inject/Guids.cpp | 7 + Native/Inject/HookedFunctions.cpp | 104 + Native/Inject/IconCache.cpp | 291 + Native/Inject/IconCache.h | 59 + Native/Inject/Image.cpp | 344 + Native/Inject/Image.h | 56 + Native/Inject/Inject.cpp | 1029 + Native/Inject/Inject.def | 24 + Native/Inject/Inject.dsp | 401 + Native/Inject/Inject.idl | 960 + Native/Inject/Inject.rc | 163 + Native/Inject/Inject.vcproj | 835 + Native/Inject/InjectApi.h | 47 + Native/Inject/InjectCP.h | 390 + Native/Inject/InjectService.cpp | 42 + Native/Inject/InjectService.h | 52 + Native/Inject/InjectService.rgs | 43 + Native/Inject/Injectps.def | 11 + Native/Inject/Injectps.mk | 16 + Native/Inject/InputBuffer.cpp | 530 + Native/Inject/InputBuffer.h | 123 + Native/Inject/InputBuffer.rgs | 26 + Native/Inject/LayerSite.cpp | 992 + Native/Inject/LayerSite.h | 126 + Native/Inject/Manager.cpp | 1632 ++ Native/Inject/Manager.h | 237 + Native/Inject/MaterialHook.cpp | 8 + Native/Inject/MaterialHook.h | 115 + Native/Inject/Pager.cpp | 215 + Native/Inject/Pager.h | 79 + Native/Inject/Pager.rgs | 25 + Native/Inject/Panel.cpp | 647 + Native/Inject/Panel.h | 100 + Native/Inject/Plugin2Impl.h | 58 + Native/Inject/PluginAdapterV1.cpp | 74 + Native/Inject/PluginAdapterV1.h | 48 + Native/Inject/PluginAdapterV1.rgs | 42 + Native/Inject/PluginImpl.h | 60 + Native/Inject/RootLayer.cpp | 251 + Native/Inject/RootLayer.h | 67 + Native/Inject/SimpleBar.cpp | 146 + Native/Inject/SimpleBar.h | 63 + Native/Inject/SinkImpl.cpp | 69 + Native/Inject/SinkImpl.h | 176 + Native/Inject/SolidImage.cpp | 27 + Native/Inject/SolidImage.h | 79 + Native/Inject/SolidImage.rgs | 25 + Native/Inject/StdAfx.cpp | 5 + Native/Inject/StdAfx.h | 54 + Native/Inject/View.cpp | 567 + Native/Inject/View.h | 92 + Native/Inject/res/DenAgent.ico | Bin 0 -> 4710 bytes Native/Inject/resource.h | 37 + Native/InjectModern/CMakeLists.txt | 45 + Native/InjectModern/Inject.cpp | 495 + Native/InjectModern/Inject.def | 37 + Native/InjectModern/Inject.h | 37 + Native/LauncherHookModern/CMakeLists.txt | 40 + Native/LauncherHookModern/LauncherHook.cpp | 327 + Native/LauncherHookModern/LauncherHook.def | 11 + Native/LobbyHook/DecalNet.dsp | 112 + Native/LobbyHook/LobbyHook.cpp | 96 + Native/LobbyHook/LobbyHook.dsp | 113 + Native/LobbyHook/LobbyHook.vcproj | 161 + Native/LobbyHook/ReadMe.txt | 40 + Native/LobbyHook/stdafx.cpp | 8 + Native/LobbyHook/stdafx.h | 15 + Native/PlainText/Attic/PlainText.h | 351 + Native/PlainText/NamedObjects.h | 11 + Native/PlainText/PlainText.cpp | 72 + Native/PlainText/PlainText.def | 9 + Native/PlainText/PlainText.dsp | 189 + Native/PlainText/PlainText.idl | 93 + Native/PlainText/PlainText.rc | 140 + Native/PlainText/PlainText.vcproj | 339 + Native/PlainText/PlainTextCP.h | 145 + Native/PlainText/PlainTextps.def | 11 + Native/PlainText/PlainTextps.mk | 16 + Native/PlainText/ScriptPlugin.cpp | 305 + Native/PlainText/ScriptPlugin.h | 115 + Native/PlainText/ScriptPlugin.rgs | 45 + Native/PlainText/ScriptSiteImpl.cpp | 92 + Native/PlainText/ScriptSiteImpl.h | 82 + Native/PlainText/ScriptView.cpp | 93 + Native/PlainText/ScriptView.h | 83 + Native/PlainText/ScriptView.rgs | 26 + Native/PlainText/StdAfx.cpp | 11 + Native/PlainText/StdAfx.h | 36 + Native/PlainText/resource.h | 20 + NewNativeStubs/D3DService/NOTES.md | 34 + NewNativeStubs/DHS/NOTES.md | 31 + NewNativeStubs/DecalRender/NOTES.md | 32 + NewNativeStubs/SpellFilter/NOTES.md | 31 + build.cmd | 51 + 1382 files changed, 170725 insertions(+) create mode 100644 .gitignore create mode 100644 Installer/Attic/Decal 2.sln create mode 100644 Installer/Attic/Decal 2.wip create mode 100644 Installer/Decal.Installer.wixproj create mode 100644 Installer/DecalInstaller.sln create mode 100644 Installer/DecalInstaller.vdproj create mode 100644 Installer/DecalInstaller.wip create mode 100644 Installer/DecalInstallerVC7.sln create mode 100644 Installer/DecalInstallerVC7.wip create mode 100644 Installer/Installer.nsi create mode 100644 Installer/Package.wxs create mode 100644 Installer/Res/Attic/HRESULTHookSrv.dll create mode 100644 Installer/Res/Attic/Install.bat create mode 100644 Installer/Res/Attic/delegate.dll create mode 100644 Installer/Res/Decal Homepage.url create mode 100644 Installer/Res/Decal.ico create mode 100644 Installer/Res/Install.vbs create mode 100644 Installer/Res/decalbar.jpg create mode 100644 Installer/Res/gdiplus.dll create mode 100644 Installer/Res/howto.txt create mode 100644 Installer/Res/readme.rtf create mode 100644 Managed/Decal.Adapter/CustomCollections/HashedList.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairIDQueue.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairRoundRobinScheduleQueue.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.IDQueue/UserIDRequestProcessedEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageResponseEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParser.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserCondition.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageFactory.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageMemberWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootImpl.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Support/Util.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/AcceptTradeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/AccountCharInfo.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddRemoveEventType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddTradeItemEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/AllegianceInfoWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ApproachVendorEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeInfoWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/Augmentations.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/Background.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/BoolValueKey.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ButtonWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByAllFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByCategoryFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByContainerFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByInventoryFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByLandscapeFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameSubStringFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByObjectClassFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByOwnerFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CastEventType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeEnchantmentsEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeExperienceEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeFellowshipEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeObjectEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeOptionEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePlayerEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePortalModeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSettingsFlagsEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeShortcutEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSpellbarEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeVitalEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterAttributeType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterIndex.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterSkillType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterVitalType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharacterFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CheckBoxWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceDataIndexer.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceTextIndexer.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CombatState.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlRegistry.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapperBase.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CoordsObject.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/CreateObjectEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DObj.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DService.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DShape.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DTextType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeathEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/DecalWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeclineTradeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/DoubleValueKey.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/EchoFilter2.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnchantmentWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/EndTradeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnterTradeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/FailToAddTradeItemEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/FellowshipEventType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/FontWeight.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HookIndexer.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HooksWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HostBase.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeySystem.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/Hud.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderScalable.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderTarget.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/IControlWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedProvider.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedValueProvider.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/IViewHandler.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/IndexedCollection.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListColumn.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListRow.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/LoginEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/LongValueKey.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/MoveObjectEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/NetServiceHost.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/NotebookWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ObjectClass.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/PageTextIndexer.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerModifyEventType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerXPEventType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/PluginHost.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/PortalEventType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ProgressWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/PushButtonWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ReleaseObjectEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/RenderServiceWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ResetTradeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/SettingsEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillInfoWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/SliderWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellCastEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellbookEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/StaticWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/StatusMessageEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/StringValueKey.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/TextBoxWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/TrainingType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/UIElementType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector3Object.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector4Object.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vendor.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewControls.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/VitalType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldChangeType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObject.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollection.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollectionFilter.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/WriteTextFormats.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.Wrappers/hookIndexType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter.csproj create mode 100644 Managed/Decal.Adapter/Decal.Adapter/BaseEventAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/COMHResultException.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ChatClickInterceptEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ChatParserInterceptEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ChatTextInterceptEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/CheckBoxChangeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ContainerOpenedEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ControlEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ControlEventAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ControlReferenceArrayAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ControlReferenceAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/CoreManager.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/DecalExtensionType.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/DirectoryProxy.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/DirectoryResolveEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/DisposableByRefObject.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/DisposableObjectDictionary.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/EatableEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/Extension.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ExtensionEvents.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/FilterBase.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/FilterProxy.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/FriendlyNameAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/GenericDisposableWrapper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/HResults.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/IAdapterSurrogate.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/IndexChangeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ItemDestroyedEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ItemSelectedEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/LifetimeProxy.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ListSelectEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/Message.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/MessageDirection.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/MessageProcessedEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/MessageStruct.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/NetworkMessageEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/PluginBase.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/PluginProxy.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/RegionChange3DEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/RenderViolationException.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/RuntimePolicyHelper.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ServiceBase.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ServiceProxy.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/StatusTextInterceptEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/Surrogate.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/TextBoxChangeEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/TextBoxEndEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ViewAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ViewBaseAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/ViewHandler.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/WindowMessageEventArgs.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/WireUpBaseEventsAttribute.cs create mode 100644 Managed/Decal.Adapter/Decal.Adapter/WireUpControlEventsAttribute.cs create mode 100644 Managed/Decal.Adapter/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Core/ACHooksImpl.cs create mode 100644 Managed/Decal.Core/Decal.Core.csproj create mode 100644 Managed/Decal.Core/DecalCoreImpl.cs create mode 100644 Managed/Decal.Core/DecalEnumImpl.cs create mode 100644 Managed/Decal.Core/PluginSite2Impl.cs create mode 100644 Managed/Decal.D3DService/D3DObjImpl.cs create mode 100644 Managed/Decal.D3DService/D3DServiceImpl.cs create mode 100644 Managed/Decal.D3DService/Decal.D3DService.csproj create mode 100644 Managed/Decal.DHS/Decal.DHS.csproj create mode 100644 Managed/Decal.DHS/HotkeyImpl.cs create mode 100644 Managed/Decal.DHS/HotkeySystemImpl.cs create mode 100644 Managed/Decal.DecalControls/CheckboxImpl.cs create mode 100644 Managed/Decal.DecalControls/ChoiceImpl.cs create mode 100644 Managed/Decal.DecalControls/ControlBase.cs create mode 100644 Managed/Decal.DecalControls/Decal.DecalControls.csproj create mode 100644 Managed/Decal.DecalControls/DerethMapImpl.cs create mode 100644 Managed/Decal.DecalControls/EditImpl.cs create mode 100644 Managed/Decal.DecalControls/LayoutImpl.cs create mode 100644 Managed/Decal.DecalControls/ListColumnImpl.cs create mode 100644 Managed/Decal.DecalControls/ListImpl.cs create mode 100644 Managed/Decal.DecalControls/NotebookImpl.cs create mode 100644 Managed/Decal.DecalControls/ProgressImpl.cs create mode 100644 Managed/Decal.DecalControls/PushButtonImpl.cs create mode 100644 Managed/Decal.DecalControls/ScrollerImpl.cs create mode 100644 Managed/Decal.DecalControls/SliderImpl.cs create mode 100644 Managed/Decal.DecalControls/StaticTextImpl.cs create mode 100644 Managed/Decal.DecalDat/DatFile.cs create mode 100644 Managed/Decal.DecalDat/DatLibraryImpl.cs create mode 100644 Managed/Decal.DecalDat/DatServiceImpl.cs create mode 100644 Managed/Decal.DecalDat/DatStreamImpl.cs create mode 100644 Managed/Decal.DecalDat/Decal.DecalDat.csproj create mode 100644 Managed/Decal.DecalFilters/CharacterStatsImpl.cs create mode 100644 Managed/Decal.DecalFilters/Decal.DecalFilters.csproj create mode 100644 Managed/Decal.DecalFilters/EchoFilterImpl.cs create mode 100644 Managed/Decal.DecalFilters/PrefilterImpl.cs create mode 100644 Managed/Decal.DecalFilters/VendorImpl.cs create mode 100644 Managed/Decal.DecalFilters/WorldImpl.cs create mode 100644 Managed/Decal.DecalFilters/WorldIteratorImpl.cs create mode 100644 Managed/Decal.DecalFilters/WorldObjectImpl.cs create mode 100644 Managed/Decal.DecalInput/Decal.DecalInput.csproj create mode 100644 Managed/Decal.DecalInput/HotkeyImpl.cs create mode 100644 Managed/Decal.DecalInput/InputBufferImpl.cs create mode 100644 Managed/Decal.DecalInput/InputServiceImpl.cs create mode 100644 Managed/Decal.DecalInput/TimerImpl.cs create mode 100644 Managed/Decal.DecalInput/WinMsgHookImpl.cs create mode 100644 Managed/Decal.DecalInput/WndMsgImpl.cs create mode 100644 Managed/Decal.DecalNet/Decal.DecalNet.csproj create mode 100644 Managed/Decal.DecalNet/MessageImpl.cs create mode 100644 Managed/Decal.DecalNet/NetServiceImpl.cs create mode 100644 Managed/Decal.DecalNet/WebRequestImpl.cs create mode 100644 Managed/Decal.DecalRender/Decal.DecalRender.csproj create mode 100644 Managed/Decal.DecalRender/HUDBackgroundImpl.cs create mode 100644 Managed/Decal.DecalRender/HUDViewImpl.cs create mode 100644 Managed/Decal.DecalRender/RenderServiceImpl.cs create mode 100644 Managed/Decal.DecalRender/RenderTargetImpl.cs create mode 100644 Managed/Decal.DenAgent/AgentForm.cs create mode 100644 Managed/Decal.DenAgent/Decal.DenAgent.csproj create mode 100644 Managed/Decal.DenAgent/OptionsForm.cs create mode 100644 Managed/Decal.DenAgent/Program.cs create mode 100644 Managed/Decal.DenAgent/TrayContext.cs create mode 100644 Managed/Decal.FileService/Decal.FileService.csproj create mode 100644 Managed/Decal.FileService/Decal.Filters/Attrib.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/AttributeTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/AttributeXPTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/CharacterSkillCreditsTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/CharacterXPTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Component.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/ComponentTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/ComponentType.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/FileService.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Gender.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/GenderTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Get.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Heritage.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/HeritageTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/IIdNameTableEntry.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/IdNameTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/LevelTables.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Material.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/MaterialTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/RawTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Skill.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SkillState.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SkillTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SkillType.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SpecializedSkillXPTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Species.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SpeciesTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Spell.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SpellComponentIDs.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SpellSchool.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/SpellTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/TrainedSkillXPTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/UpdateEventArgs.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/Vital.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/VitalFormula.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/VitalFormulaTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/VitalTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/VitalXPTable.cs create mode 100644 Managed/Decal.FileService/Decal.Filters/zlib.cs create mode 100644 Managed/Decal.FileService/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls.csproj create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayout.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayoutClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumn.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumnClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/Checkbox.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckboxClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/Choice.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ChoiceClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMap.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMapClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/Edit.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/EditClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayout.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayoutClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IBorderLayout.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckbox.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoice.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceDropDown.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DropDownEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoicePopup.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_AcceptedEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_CanceledEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_HitEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_UnhitEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IDerethMap.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEdit.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_BeginEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EndEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IFixedLayout.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ILayout.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IList.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListColumn.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListDisp.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListView.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebook.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayout.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayoutDisp.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IProgress.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPushButton.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScroller.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISlider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_Event.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IStatic.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumn.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumnClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/List.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ListClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/Notebook.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/NotebookClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayout.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayoutClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/Progress.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ProgressClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButton.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButtonClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/Scroller.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/ScrollerClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/Slider.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/SliderClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticText.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticTextClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumn.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumnClass.cs create mode 100644 Managed/Decal.Interop.Controls/Decal.Interop.Controls/eBorderEdge.cs create mode 100644 Managed/Decal.Interop.Controls/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core.csproj create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooks.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooksClass.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogate.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogateClass.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCore.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCoreClass.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnum.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnumClass.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/DecalRes.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/DecalResClass.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooks.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_AC3DRegionChangedEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatClickInterceptEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatParserInterceptEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatTextInterceptEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ContainerOpenedEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_Event.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_MessageProcessedEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectDestroyedEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectSelectedEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_RenderPreUIEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_StatusTextInterceptEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalCore.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalDirectory.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEnum.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_Event.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_InitializeCompleteEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_TerminateCompleteEventHandler.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalFileSurrogate.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRender.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRes.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalService.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalSurrogate.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalUninstall.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalWindowsMessageSink.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IIdentifyFilter.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IInjectService.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IPlugin2.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/IPluginSite2.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2Class.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemove.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemoveClass.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eAttribute.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooks.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooksEx.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eChatColors.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eDecalComponentType.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eInt64Types.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eIntTypes.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eSkill.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eTrainLevel.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eUIElementType.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/eVital.cs create mode 100644 Managed/Decal.Interop.Core/Decal.Interop.Core/tagRECT.cs create mode 100644 Managed/Decal.Interop.Core/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService.csproj create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObj.cs create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObjClass.cs create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CService.cs create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CServiceClass.cs create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DObj.cs create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DService.cs create mode 100644 Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/eShape.cs create mode 100644 Managed/Decal.Interop.D3DService/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS.csproj create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/Hotkey.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeyClass.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystem.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystemClass.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/IDHSHotkeyEvents.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkey.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkeySystem.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_Event.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_HotkeyEventEventHandler.cs create mode 100644 Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.DHS/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat.csproj create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibrary.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibraryClass.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatService.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatServiceClass.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStream.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStreamClass.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatLibrary.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatService.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatStream.cs create mode 100644 Managed/Decal.Interop.Dat/Decal.Interop.Dat/IFileFilter.cs create mode 100644 Managed/Decal.Interop.Dat/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters.csproj create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfo.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfoClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfo.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfoClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/BoolValueKey.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStats.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStatsClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/DoubleValueKey.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2Class.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilterClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/Enchantment.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/EnchantmentClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAllegianceInfo.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAttributeInfo.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStats.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ActionCompleteEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_CastSpellEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeEnchantmentsEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeFellowshipEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeOptionEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePlayerEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePortalModeEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingFlagsEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingsEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeShortcutEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSpellbarEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeVitalEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeXPSEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_DeathEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Event.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginCompleteEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LogoffEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_AddEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_DeleteEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_StatusMessageEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho2.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoClientEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoServerEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_Event.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EventProvider.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EchoMessageEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_Event.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EventProvider.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnchantment.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnumVARIANT.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IIdentifyQueue.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilter.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_Event.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/ISkillInfo.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IVendor.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorld.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AcceptTradeEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AddTradeItemEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ApproachVendorEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ChangeObjectEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_CreateObjectEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_DeclineTradeEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EndTradeEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EnterTradeEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_Event.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToAddTradeItemEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToCompleteTradeEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_MoveObjectEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseDoneEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseObjectEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ResetTradeEventHandler.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldIterator.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldObject.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueue.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueueClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/LongValueKey.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerAddRemoveType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerCastType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerFellowshipType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerLogoffType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerModifyType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerPortalType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerVitalType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerXPType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/Prefilter.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/PrefilterClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfo.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfoClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/StringValueKey.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/Vendor.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnum.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnumClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/World.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldChangeType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnum.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnumClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIterator.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIteratorClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObject.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObjectClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAttributeID.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAugmentations.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eObjectClass.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eSkillID.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStatisticType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStringType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eTrainingType.cs create mode 100644 Managed/Decal.Interop.Filters/Decal.Interop.Filters/eVitalID.cs create mode 100644 Managed/Decal.Interop.Filters/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject.csproj create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImage.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImageClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/Button.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ButtonClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/Canvas.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/CanvasClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ClipParams.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBarManager.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBrushImage.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IButton.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICanvas.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_AcceptedEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_CanceledEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_Event.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_HitEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_UnhitEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControl.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControlEvents.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IFontCache.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IIconCache.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IImageCache.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IInputNotify.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayer.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerKeyboard.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerMouse.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerPopup.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerRender.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSchema.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSite.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerTimer.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPager.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_ChangeEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_DestroyEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_Event.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_GetNextPositionEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanel.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanelSink.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPlugin.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginAdapterV1.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginSite.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRender3DSink.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRootLayer.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ISimpleBar.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IView.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewDisp.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_Event.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnActivateEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnDeactivateEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizeEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizingEventHandler.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/IWindowsMessageSink.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectService.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectServiceClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/KeyState.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/Layer.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerParams.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/MouseState.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/Pager.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/PagerClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1Class.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSite.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSiteClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/View.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewClass.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewParams.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/_RemotableHandle.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/__MIDL_IWinTypes_0009.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eAlphaBlendOptions.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eCombatState.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDefaultControlType.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDrawTextExFlags.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontJustify.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontOptions.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eInputStatus.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eManagerSinkCaps.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMinMaxState.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMouseInput.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/ePositionType.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eRenderOptions.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/eViewFlags.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagPOINT.cs create mode 100644 Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagSIZE.cs create mode 100644 Managed/Decal.Interop.Inject/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input.csproj create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/DelayAction.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/DelayActionClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/EventAction.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/EventActionClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/Hotkey.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/HotkeyClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IDecalTimer.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkey.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_Event.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_HotkeyEventHandler.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputAction.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputActionSite.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBuffer.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_BeginEventHandler.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EndEventHandler.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_Event.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventEventHandler.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IInputService.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_Event.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_TimeoutEventHandler.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHook.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_Event.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_MessageEventHandler.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/IWndMsg.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/InputBuffer.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/InputBufferClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/InputService.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/InputServiceClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveAction.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveActionClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayAction.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayActionClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreAction.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreActionClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/Timer.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/TimerClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/TypeAction.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/TypeActionClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHook.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHookClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsg.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsgClass.cs create mode 100644 Managed/Decal.Interop.Input/Decal.Interop.Input/eActionUse.cs create mode 100644 Managed/Decal.Interop.Input/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net.csproj create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage2.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageFactory.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageIterator.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageMember.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/INetService.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter2.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequest.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_BeginEventHandler.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EndEventHandler.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_Event.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRoot.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRootClass.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/NetService.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/NetServiceClass.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequest.cs create mode 100644 Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequestClass.cs create mode 100644 Managed/Decal.Interop.Net/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render.csproj create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackground.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackgroundClass.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/HUDView.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/HUDViewClass.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDBackground.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDView.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderScalable.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderService.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_DeviceLostEventHandler.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_Event.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderTarget.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/RenderService.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/RenderServiceClass.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapper.cs create mode 100644 Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapperClass.cs create mode 100644 Managed/Decal.Interop.Render/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter.csproj create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Component.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ComponentClass.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/IComponent.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpell.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpells.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spell.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellClass.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spells.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellsClass.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Event.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_EventProvider.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_LoginEventHandler.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_SinkHelper.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_AddEventHandler.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_DeleteEventHandler.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponent.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponentType.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eSpellType.cs create mode 100644 Managed/Decal.Interop.SpellFilter/Properties/AssemblyInfo.cs create mode 100644 Managed/Decal.SpellFilter/ComponentImpl.cs create mode 100644 Managed/Decal.SpellFilter/Decal.SpellFilter.csproj create mode 100644 Managed/Decal.SpellFilter/SpellImpl.cs create mode 100644 Managed/Decal.SpellFilter/SpellsImpl.cs create mode 100644 Managed/Decal.sln create mode 100644 Managed/DecalUtil/DecalUtil.DecalUtilMain.resx create mode 100644 Managed/DecalUtil/DecalUtil.Properties/Resources.cs create mode 100644 Managed/DecalUtil/DecalUtil.Properties/Settings.cs create mode 100644 Managed/DecalUtil/DecalUtil.csproj create mode 100644 Managed/DecalUtil/DecalUtil/DecalUtilMain.cs create mode 100644 Managed/DecalUtil/DecalUtil/IFormStatus.cs create mode 100644 Managed/DecalUtil/DecalUtil/Program.cs create mode 100644 Managed/DecalUtil/DecalUtil/Update.cs create mode 100644 Managed/DecalUtil/DecalUtil/UpdateFile.cs create mode 100644 Managed/DecalUtil/Properties/AssemblyInfo.cs create mode 100644 Managed/DecalUtil/app.ico create mode 100644 Managed/DecalUtil/app.manifest create mode 100644 Managed/Directory.Build.props create mode 100644 Native/CMakeLists.txt create mode 100644 Native/Decal.dsw create mode 100644 Native/Decal.sln create mode 100644 Native/Decal/ACHooks.cpp create mode 100644 Native/Decal/ACHooks.h create mode 100644 Native/Decal/ACHooks.rgs create mode 100644 Native/Decal/ActiveXSurrogate.cpp create mode 100644 Native/Decal/ActiveXSurrogate.h create mode 100644 Native/Decal/ActiveXSurrogate.rgs create mode 100644 Native/Decal/Decal.cpp create mode 100644 Native/Decal/Decal.def create mode 100644 Native/Decal/Decal.dsp create mode 100644 Native/Decal/Decal.rc create mode 100644 Native/Decal/Decal.rgs create mode 100644 Native/Decal/Decal.vcproj create mode 100644 Native/Decal/DecalCP.h create mode 100644 Native/Decal/DecalEnum.cpp create mode 100644 Native/Decal/DecalEnum.h create mode 100644 Native/Decal/DecalManager.cpp create mode 100644 Native/Decal/DecalManager.h create mode 100644 Native/Decal/DecalRes.cpp create mode 100644 Native/Decal/DecalRes.h create mode 100644 Native/Decal/DecalRes.rgs create mode 100644 Native/Decal/Decalps.def create mode 100644 Native/Decal/Decalps.mk create mode 100644 Native/Decal/PluginSite.cpp create mode 100644 Native/Decal/PluginSite.h create mode 100644 Native/Decal/StdAfx.cpp create mode 100644 Native/Decal/StdAfx.h create mode 100644 Native/Decal/SurrogateRemove.cpp create mode 100644 Native/Decal/SurrogateRemove.h create mode 100644 Native/Decal/SurrogateRemove.rgs create mode 100644 Native/Decal/resource.h create mode 100644 Native/DecalControls/Attic/DecalControls.aps create mode 100644 Native/DecalControls/Attic/Image.cpp create mode 100644 Native/DecalControls/Attic/Image.h create mode 100644 Native/DecalControls/Attic/Image.rgs create mode 100644 Native/DecalControls/Attic/ImageControl.cpp create mode 100644 Native/DecalControls/Attic/ImageControl.h create mode 100644 Native/DecalControls/BorderLayout.cpp create mode 100644 Native/DecalControls/BorderLayout.h create mode 100644 Native/DecalControls/BorderLayout.rgs create mode 100644 Native/DecalControls/CheckColumn.cpp create mode 100644 Native/DecalControls/CheckColumn.h create mode 100644 Native/DecalControls/CheckColumn.rgs create mode 100644 Native/DecalControls/Checkbox.cpp create mode 100644 Native/DecalControls/Checkbox.h create mode 100644 Native/DecalControls/Checkbox.rgs create mode 100644 Native/DecalControls/Choice.cpp create mode 100644 Native/DecalControls/Choice.h create mode 100644 Native/DecalControls/Choice.rgs create mode 100644 Native/DecalControls/ChoiceDropDown.cpp create mode 100644 Native/DecalControls/ChoiceDropDown.h create mode 100644 Native/DecalControls/ChoiceDropDown.rgs create mode 100644 Native/DecalControls/ChoicePopup.cpp create mode 100644 Native/DecalControls/ChoicePopup.h create mode 100644 Native/DecalControls/Client.cpp create mode 100644 Native/DecalControls/Client.h create mode 100644 Native/DecalControls/Client.rgs create mode 100644 Native/DecalControls/ControlImpl.h create mode 100644 Native/DecalControls/DecalControls.clw create mode 100644 Native/DecalControls/DecalControls.cpp create mode 100644 Native/DecalControls/DecalControls.def create mode 100644 Native/DecalControls/DecalControls.dsp create mode 100644 Native/DecalControls/DecalControls.idl create mode 100644 Native/DecalControls/DecalControls.rc create mode 100644 Native/DecalControls/DecalControls.vcproj create mode 100644 Native/DecalControls/DecalControlsCP.h create mode 100644 Native/DecalControls/DecalControlsps.def create mode 100644 Native/DecalControls/DecalControlsps.mk create mode 100644 Native/DecalControls/DerethMap.cpp create mode 100644 Native/DecalControls/DerethMap.h create mode 100644 Native/DecalControls/DerethMap.rgs create mode 100644 Native/DecalControls/Edit.cpp create mode 100644 Native/DecalControls/Edit.h create mode 100644 Native/DecalControls/Edit.rgs create mode 100644 Native/DecalControls/FixedLayout.cpp create mode 100644 Native/DecalControls/FixedLayout.h create mode 100644 Native/DecalControls/FixedLayout.rgs create mode 100644 Native/DecalControls/IconColumn.cpp create mode 100644 Native/DecalControls/IconColumn.h create mode 100644 Native/DecalControls/IconColumn.rgs create mode 100644 Native/DecalControls/List.cpp create mode 100644 Native/DecalControls/List.h create mode 100644 Native/DecalControls/List.rgs create mode 100644 Native/DecalControls/ListView.cpp create mode 100644 Native/DecalControls/ListView.h create mode 100644 Native/DecalControls/Notebook.cpp create mode 100644 Native/DecalControls/Notebook.h create mode 100644 Native/DecalControls/Notebook.rgs create mode 100644 Native/DecalControls/PageLayout.cpp create mode 100644 Native/DecalControls/PageLayout.h create mode 100644 Native/DecalControls/PageLayout.rgs create mode 100644 Native/DecalControls/Progress.cpp create mode 100644 Native/DecalControls/Progress.h create mode 100644 Native/DecalControls/PushButton.cpp create mode 100644 Native/DecalControls/PushButton.h create mode 100644 Native/DecalControls/PushButton.rgs create mode 100644 Native/DecalControls/Scroller.cpp create mode 100644 Native/DecalControls/Scroller.h create mode 100644 Native/DecalControls/Scroller.rgs create mode 100644 Native/DecalControls/Slider.cpp create mode 100644 Native/DecalControls/Slider.h create mode 100644 Native/DecalControls/Slider.rgs create mode 100644 Native/DecalControls/Static.cpp create mode 100644 Native/DecalControls/Static.h create mode 100644 Native/DecalControls/Static.rgs create mode 100644 Native/DecalControls/StdAfx.cpp create mode 100644 Native/DecalControls/StdAfx.h create mode 100644 Native/DecalControls/TextColumn.cpp create mode 100644 Native/DecalControls/TextColumn.h create mode 100644 Native/DecalControls/TextColumn.rgs create mode 100644 Native/DecalControls/progress.rgs create mode 100644 Native/DecalControls/resource.h create mode 100644 Native/DecalDat/DatFile.cpp create mode 100644 Native/DecalDat/DatFile.h create mode 100644 Native/DecalDat/DatLibrary.cpp create mode 100644 Native/DecalDat/DatLibrary.h create mode 100644 Native/DecalDat/DatService.cpp create mode 100644 Native/DecalDat/DatService.h create mode 100644 Native/DecalDat/DatService.rgs create mode 100644 Native/DecalDat/DatStream.cpp create mode 100644 Native/DecalDat/DatStream.h create mode 100644 Native/DecalDat/DecalDat.cpp create mode 100644 Native/DecalDat/DecalDat.def create mode 100644 Native/DecalDat/DecalDat.dsp create mode 100644 Native/DecalDat/DecalDat.rc create mode 100644 Native/DecalDat/DecalDat.vcproj create mode 100644 Native/DecalDat/DecalDatps.def create mode 100644 Native/DecalDat/DecalDatps.mk create mode 100644 Native/DecalDat/StdAfx.cpp create mode 100644 Native/DecalDat/StdAfx.h create mode 100644 Native/DecalDat/resource.h create mode 100644 Native/DecalFilters/AllegianceInfo.cpp create mode 100644 Native/DecalFilters/AllegianceInfo.h create mode 100644 Native/DecalFilters/AllegianceInfo.rgs create mode 100644 Native/DecalFilters/Attic/Location.cpp create mode 100644 Native/DecalFilters/Attic/Location.h create mode 100644 Native/DecalFilters/Attic/Location.rgs create mode 100644 Native/DecalFilters/Attic/Stackable.cpp create mode 100644 Native/DecalFilters/Attic/Stackable.h create mode 100644 Native/DecalFilters/Attic/Stackable.rgs create mode 100644 Native/DecalFilters/AttributeInfo.cpp create mode 100644 Native/DecalFilters/AttributeInfo.h create mode 100644 Native/DecalFilters/CharacterStats.cpp create mode 100644 Native/DecalFilters/CharacterStats.h create mode 100644 Native/DecalFilters/CharacterStats.rgs create mode 100644 Native/DecalFilters/DecalFilters.cpp create mode 100644 Native/DecalFilters/DecalFilters.def create mode 100644 Native/DecalFilters/DecalFilters.dsp create mode 100644 Native/DecalFilters/DecalFilters.idl create mode 100644 Native/DecalFilters/DecalFilters.rc create mode 100644 Native/DecalFilters/DecalFilters.vcproj create mode 100644 Native/DecalFilters/DecalFiltersCP.h create mode 100644 Native/DecalFilters/DecalFiltersps.def create mode 100644 Native/DecalFilters/DecalFiltersps.mk create mode 100644 Native/DecalFilters/EchoFilter.cpp create mode 100644 Native/DecalFilters/EchoFilter.h create mode 100644 Native/DecalFilters/EchoFilter.rgs create mode 100644 Native/DecalFilters/EchoFilter2.cpp create mode 100644 Native/DecalFilters/EchoFilter2.h create mode 100644 Native/DecalFilters/EchoFilter2.rgs create mode 100644 Native/DecalFilters/Enchantment.cpp create mode 100644 Native/DecalFilters/Enchantment.h create mode 100644 Native/DecalFilters/Enchantment.rgs create mode 100644 Native/DecalFilters/FilterImpl.h create mode 100644 Native/DecalFilters/IdentifyQueue.cpp create mode 100644 Native/DecalFilters/IdentifyQueue.h create mode 100644 Native/DecalFilters/IdentifyQueue.rgs create mode 100644 Native/DecalFilters/Prefilter.cpp create mode 100644 Native/DecalFilters/Prefilter.h create mode 100644 Native/DecalFilters/Prefilter.rgs create mode 100644 Native/DecalFilters/SkillInfo.cpp create mode 100644 Native/DecalFilters/SkillInfo.h create mode 100644 Native/DecalFilters/StdAfx.cpp create mode 100644 Native/DecalFilters/StdAfx.h create mode 100644 Native/DecalFilters/World.cpp create mode 100644 Native/DecalFilters/World.h create mode 100644 Native/DecalFilters/World.rgs create mode 100644 Native/DecalFilters/WorldIterator.cpp create mode 100644 Native/DecalFilters/WorldIterator.h create mode 100644 Native/DecalFilters/WorldIterator.rgs create mode 100644 Native/DecalFilters/WorldObject.cpp create mode 100644 Native/DecalFilters/WorldObject.h create mode 100644 Native/DecalFilters/WorldObject.rgs create mode 100644 Native/DecalFilters/resource.h create mode 100644 Native/DecalInput/DecalInput.cpp create mode 100644 Native/DecalInput/DecalInput.def create mode 100644 Native/DecalInput/DecalInput.dsp create mode 100644 Native/DecalInput/DecalInput.rc create mode 100644 Native/DecalInput/DecalInput.vcproj create mode 100644 Native/DecalInput/DecalInputCP.h create mode 100644 Native/DecalInput/DecalInputps.def create mode 100644 Native/DecalInput/DecalInputps.mk create mode 100644 Native/DecalInput/DelayAction.cpp create mode 100644 Native/DecalInput/DelayAction.h create mode 100644 Native/DecalInput/DelayAction.rgs create mode 100644 Native/DecalInput/EventAction.cpp create mode 100644 Native/DecalInput/EventAction.h create mode 100644 Native/DecalInput/EventAction.rgs create mode 100644 Native/DecalInput/Hotkey.cpp create mode 100644 Native/DecalInput/Hotkey.h create mode 100644 Native/DecalInput/Hotkey.rgs create mode 100644 Native/DecalInput/InputBuffer.cpp create mode 100644 Native/DecalInput/InputBuffer.h create mode 100644 Native/DecalInput/InputBuffer.rgs create mode 100644 Native/DecalInput/InputService.cpp create mode 100644 Native/DecalInput/InputService.h create mode 100644 Native/DecalInput/InputService.rgs create mode 100644 Native/DecalInput/MouseMoveAction.cpp create mode 100644 Native/DecalInput/MouseMoveAction.h create mode 100644 Native/DecalInput/MouseMoveAction.rgs create mode 100644 Native/DecalInput/PolledDelayAction.cpp create mode 100644 Native/DecalInput/PolledDelayAction.h create mode 100644 Native/DecalInput/PolledDelayAction.rgs create mode 100644 Native/DecalInput/RestoreAction.cpp create mode 100644 Native/DecalInput/RestoreAction.h create mode 100644 Native/DecalInput/RestoreAction.rgs create mode 100644 Native/DecalInput/StdAfx.cpp create mode 100644 Native/DecalInput/StdAfx.h create mode 100644 Native/DecalInput/Timer.cpp create mode 100644 Native/DecalInput/Timer.h create mode 100644 Native/DecalInput/Timer.rgs create mode 100644 Native/DecalInput/TypeAction.cpp create mode 100644 Native/DecalInput/TypeAction.h create mode 100644 Native/DecalInput/TypeAction.rgs create mode 100644 Native/DecalInput/WinMsgHook.cpp create mode 100644 Native/DecalInput/WinMsgHook.h create mode 100644 Native/DecalInput/WinMsgHook.rgs create mode 100644 Native/DecalInput/WndMsg.cpp create mode 100644 Native/DecalInput/WndMsg.h create mode 100644 Native/DecalInput/WndMsg.rgs create mode 100644 Native/DecalInput/resource.h create mode 100644 Native/DecalNet/ACMessage.h create mode 100644 Native/DecalNet/DecalNet.cpp create mode 100644 Native/DecalNet/DecalNet.def create mode 100644 Native/DecalNet/DecalNet.dsp create mode 100644 Native/DecalNet/DecalNet.rc create mode 100644 Native/DecalNet/DecalNet.vcproj create mode 100644 Native/DecalNet/DecalNetCP.h create mode 100644 Native/DecalNet/DecalNetps.def create mode 100644 Native/DecalNet/DecalNetps.mk create mode 100644 Native/DecalNet/FilterAdapterV1.cpp create mode 100644 Native/DecalNet/FilterAdapterV1.h create mode 100644 Native/DecalNet/Message.cpp create mode 100644 Native/DecalNet/Message.h create mode 100644 Native/DecalNet/MessageImpl.h create mode 100644 Native/DecalNet/MessageLoaders.cpp create mode 100644 Native/DecalNet/MessageLoaders.h create mode 100644 Native/DecalNet/MessageParsers.cpp create mode 100644 Native/DecalNet/MessageParsers.h create mode 100644 Native/DecalNet/MessageRoot.cpp create mode 100644 Native/DecalNet/MessageRoot.h create mode 100644 Native/DecalNet/MessageStruct.cpp create mode 100644 Native/DecalNet/MessageStruct.h create mode 100644 Native/DecalNet/MessageVector.cpp create mode 100644 Native/DecalNet/MessageVector.h create mode 100644 Native/DecalNet/NetService.cpp create mode 100644 Native/DecalNet/NetService.h create mode 100644 Native/DecalNet/NetService.rgs create mode 100644 Native/DecalNet/ProtocolHook.h create mode 100644 Native/DecalNet/ProtocolStack.cpp create mode 100644 Native/DecalNet/ProtocolStack.h create mode 100644 Native/DecalNet/StdAfx.cpp create mode 100644 Native/DecalNet/StdAfx.h create mode 100644 Native/DecalNet/WebRequest.cpp create mode 100644 Native/DecalNet/WebRequest.h create mode 100644 Native/DecalNet/WebRequest.rgs create mode 100644 Native/DecalNet/resource.h create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibraries.cpp create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibraries.h create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibraries.idl create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibraries.rc create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibraries.reg create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibraries.sln create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibraries.vcproj create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.cpp create mode 100644 Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.h create mode 100644 Native/DecalSupportLibraries/Attic/DlgProxy.cpp create mode 100644 Native/DecalSupportLibraries/Attic/DlgProxy.h create mode 100644 Native/DecalSupportLibraries/Attic/ReadMe.txt create mode 100644 Native/DecalSupportLibraries/Attic/Resource.h create mode 100644 Native/DecalSupportLibraries/Attic/stdafx.cpp create mode 100644 Native/DecalSupportLibraries/Attic/stdafx.h create mode 100644 Native/DecalSupportLibraries/DSLSetup/Attic/DSLSetup.vdproj create mode 100644 Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.ico create mode 100644 Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.manifest create mode 100644 Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.rc2 create mode 100644 Native/DenAgent/AddRemoveDlg.cpp create mode 100644 Native/DenAgent/AddRemoveDlg.h create mode 100644 Native/DenAgent/AutoUpdate.cpp create mode 100644 Native/DenAgent/AutoUpdate.h create mode 100644 Native/DenAgent/BindStatusCallback.cpp create mode 100644 Native/DenAgent/BindStatusCallback.h create mode 100644 Native/DenAgent/ChangePluginDirectory.cpp create mode 100644 Native/DenAgent/DenAgent.cpp create mode 100644 Native/DenAgent/DenAgent.dsp create mode 100644 Native/DenAgent/DenAgent.h create mode 100644 Native/DenAgent/DenAgent.idl create mode 100644 Native/DenAgent/DenAgent.rc create mode 100644 Native/DenAgent/DenAgent.rgs create mode 100644 Native/DenAgent/DenAgent.vcproj create mode 100644 Native/DenAgent/DenAgentDlg.cpp create mode 100644 Native/DenAgent/DenAgentDlg.h create mode 100644 Native/DenAgent/DownloadDlg.cpp create mode 100644 Native/DenAgent/DownloadDlg.h create mode 100644 Native/DenAgent/DownloaderDlg.cpp create mode 100644 Native/DenAgent/DownloaderDlg.h create mode 100644 Native/DenAgent/ExportDlg.cpp create mode 100644 Native/DenAgent/ExportDlg.h create mode 100644 Native/DenAgent/Images.bmp create mode 100644 Native/DenAgent/OptionsDlg.cpp create mode 100644 Native/DenAgent/OptionsDlg.h create mode 100644 Native/DenAgent/ReadMe.txt create mode 100644 Native/DenAgent/SinkImpl.cpp create mode 100644 Native/DenAgent/StdAfx.cpp create mode 100644 Native/DenAgent/StdAfx.h create mode 100644 Native/DenAgent/TrayWnd.cpp create mode 100644 Native/DenAgent/TrayWnd.h create mode 100644 Native/DenAgent/URLCallback.cpp create mode 100644 Native/DenAgent/URLCallback.h create mode 100644 Native/DenAgent/URLCallback.rgs create mode 100644 Native/DenAgent/changeplugindirectory.h create mode 100644 Native/DenAgent/res/Attic/asheron.ico create mode 100644 Native/DenAgent/res/DenAgent.ico create mode 100644 Native/DenAgent/res/DenAgent.rc2 create mode 100644 Native/DenAgent/res/bitmap1.bmp create mode 100644 Native/DenAgent/res/groups.bmp create mode 100644 Native/DenAgent/res/idr_tray.ico create mode 100644 Native/DenAgent/res/version_.bmp create mode 100644 Native/DenAgent/resource.h create mode 100644 Native/Include/ApiHook.h create mode 100644 Native/Include/DX6InjectApi.h create mode 100644 Native/Include/Decal.idl create mode 100644 Native/Include/DecalDat.idl create mode 100644 Native/Include/DecalFilters.idl create mode 100644 Native/Include/DecalImpl.h create mode 100644 Native/Include/DecalInput.idl create mode 100644 Native/Include/DecalInputImpl.h create mode 100644 Native/Include/DecalKey.h create mode 100644 Native/Include/DecalNet.idl create mode 100644 Native/Include/DecalNetImpl.h create mode 100644 Native/Include/DecalVersion.h create mode 100644 Native/Include/EventsImpl.h create mode 100644 Native/Include/FilterImpl.h create mode 100644 Native/Include/ForceLib.h create mode 100644 Native/Include/ForceLibrary.lib create mode 100644 Native/Include/Helpers.h create mode 100644 Native/Include/Inject.tlb create mode 100644 Native/Include/VSBridge.h create mode 100644 Native/Inject/Attic/Copy of DirectDrawHook.cpp create mode 100644 Native/Inject/Attic/Copy of DirectDrawHook.h create mode 100644 Native/Inject/Attic/Copy of Panel.cpp create mode 100644 Native/Inject/Attic/Copy of Panel.h create mode 100644 Native/Inject/Attic/Copy of RootLayer.cpp create mode 100644 Native/Inject/Attic/Copy of RootLayer.h create mode 100644 Native/Inject/Attic/Copy of View.cpp create mode 100644 Native/Inject/Attic/Copy of View.h create mode 100644 Native/Inject/Attic/EventsImpl.h create mode 100644 Native/Inject/Attic/Inject.aps create mode 100644 Native/Inject/Attic/Inject.h create mode 100644 Native/Inject/Attic/Inject.lib create mode 100644 Native/Inject/Attic/Inject.plg create mode 100644 Native/Inject/Attic/Inject.tlb create mode 100644 Native/Inject/Attic/Inject_i.c create mode 100644 Native/Inject/Attic/Inject_p.c create mode 100644 Native/Inject/Attic/Message.cpp create mode 100644 Native/Inject/Attic/Message.h create mode 100644 Native/Inject/Attic/MessageLoaders.cpp create mode 100644 Native/Inject/Attic/MessageLoaders.h create mode 100644 Native/Inject/Attic/MessageParsers-Cibo.cpp create mode 100644 Native/Inject/Attic/MessageParsers.cpp create mode 100644 Native/Inject/Attic/MessageParsers.h create mode 100644 Native/Inject/Attic/MessageStruct.cpp create mode 100644 Native/Inject/Attic/MessageStruct.h create mode 100644 Native/Inject/Attic/MessageStruct.rgs create mode 100644 Native/Inject/Attic/MessageVector.cpp create mode 100644 Native/Inject/Attic/MessageVector.h create mode 100644 Native/Inject/Attic/MessageVector.rgs create mode 100644 Native/Inject/Attic/ProtocolStack.cpp create mode 100644 Native/Inject/Attic/ProtocolStack.h create mode 100644 Native/Inject/Attic/dlldata.c create mode 100644 Native/Inject/BarLayer.cpp create mode 100644 Native/Inject/BarLayer.h create mode 100644 Native/Inject/Button.cpp create mode 100644 Native/Inject/Button.h create mode 100644 Native/Inject/Button.rgs create mode 100644 Native/Inject/Canvas.cpp create mode 100644 Native/Inject/Canvas.h create mode 100644 Native/Inject/DatFile.cpp create mode 100644 Native/Inject/DatFile.h create mode 100644 Native/Inject/Direct3DHook.cpp create mode 100644 Native/Inject/Direct3DHook.h create mode 100644 Native/Inject/DirectDrawHook.cpp create mode 100644 Native/Inject/DirectDrawHook.h create mode 100644 Native/Inject/DirectDrawSurfaceHook.cpp create mode 100644 Native/Inject/DirectDrawSurfaceHook.h create mode 100644 Native/Inject/FileStuffs.cpp create mode 100644 Native/Inject/FontCache.cpp create mode 100644 Native/Inject/FontCache.h create mode 100644 Native/Inject/Guids.cpp create mode 100644 Native/Inject/HookedFunctions.cpp create mode 100644 Native/Inject/IconCache.cpp create mode 100644 Native/Inject/IconCache.h create mode 100644 Native/Inject/Image.cpp create mode 100644 Native/Inject/Image.h create mode 100644 Native/Inject/Inject.cpp create mode 100644 Native/Inject/Inject.def create mode 100644 Native/Inject/Inject.dsp create mode 100644 Native/Inject/Inject.idl create mode 100644 Native/Inject/Inject.rc create mode 100644 Native/Inject/Inject.vcproj create mode 100644 Native/Inject/InjectApi.h create mode 100644 Native/Inject/InjectCP.h create mode 100644 Native/Inject/InjectService.cpp create mode 100644 Native/Inject/InjectService.h create mode 100644 Native/Inject/InjectService.rgs create mode 100644 Native/Inject/Injectps.def create mode 100644 Native/Inject/Injectps.mk create mode 100644 Native/Inject/InputBuffer.cpp create mode 100644 Native/Inject/InputBuffer.h create mode 100644 Native/Inject/InputBuffer.rgs create mode 100644 Native/Inject/LayerSite.cpp create mode 100644 Native/Inject/LayerSite.h create mode 100644 Native/Inject/Manager.cpp create mode 100644 Native/Inject/Manager.h create mode 100644 Native/Inject/MaterialHook.cpp create mode 100644 Native/Inject/MaterialHook.h create mode 100644 Native/Inject/Pager.cpp create mode 100644 Native/Inject/Pager.h create mode 100644 Native/Inject/Pager.rgs create mode 100644 Native/Inject/Panel.cpp create mode 100644 Native/Inject/Panel.h create mode 100644 Native/Inject/Plugin2Impl.h create mode 100644 Native/Inject/PluginAdapterV1.cpp create mode 100644 Native/Inject/PluginAdapterV1.h create mode 100644 Native/Inject/PluginAdapterV1.rgs create mode 100644 Native/Inject/PluginImpl.h create mode 100644 Native/Inject/RootLayer.cpp create mode 100644 Native/Inject/RootLayer.h create mode 100644 Native/Inject/SimpleBar.cpp create mode 100644 Native/Inject/SimpleBar.h create mode 100644 Native/Inject/SinkImpl.cpp create mode 100644 Native/Inject/SinkImpl.h create mode 100644 Native/Inject/SolidImage.cpp create mode 100644 Native/Inject/SolidImage.h create mode 100644 Native/Inject/SolidImage.rgs create mode 100644 Native/Inject/StdAfx.cpp create mode 100644 Native/Inject/StdAfx.h create mode 100644 Native/Inject/View.cpp create mode 100644 Native/Inject/View.h create mode 100644 Native/Inject/res/DenAgent.ico create mode 100644 Native/Inject/resource.h create mode 100644 Native/InjectModern/CMakeLists.txt create mode 100644 Native/InjectModern/Inject.cpp create mode 100644 Native/InjectModern/Inject.def create mode 100644 Native/InjectModern/Inject.h create mode 100644 Native/LauncherHookModern/CMakeLists.txt create mode 100644 Native/LauncherHookModern/LauncherHook.cpp create mode 100644 Native/LauncherHookModern/LauncherHook.def create mode 100644 Native/LobbyHook/DecalNet.dsp create mode 100644 Native/LobbyHook/LobbyHook.cpp create mode 100644 Native/LobbyHook/LobbyHook.dsp create mode 100644 Native/LobbyHook/LobbyHook.vcproj create mode 100644 Native/LobbyHook/ReadMe.txt create mode 100644 Native/LobbyHook/stdafx.cpp create mode 100644 Native/LobbyHook/stdafx.h create mode 100644 Native/PlainText/Attic/PlainText.h create mode 100644 Native/PlainText/NamedObjects.h create mode 100644 Native/PlainText/PlainText.cpp create mode 100644 Native/PlainText/PlainText.def create mode 100644 Native/PlainText/PlainText.dsp create mode 100644 Native/PlainText/PlainText.idl create mode 100644 Native/PlainText/PlainText.rc create mode 100644 Native/PlainText/PlainText.vcproj create mode 100644 Native/PlainText/PlainTextCP.h create mode 100644 Native/PlainText/PlainTextps.def create mode 100644 Native/PlainText/PlainTextps.mk create mode 100644 Native/PlainText/ScriptPlugin.cpp create mode 100644 Native/PlainText/ScriptPlugin.h create mode 100644 Native/PlainText/ScriptPlugin.rgs create mode 100644 Native/PlainText/ScriptSiteImpl.cpp create mode 100644 Native/PlainText/ScriptSiteImpl.h create mode 100644 Native/PlainText/ScriptView.cpp create mode 100644 Native/PlainText/ScriptView.h create mode 100644 Native/PlainText/ScriptView.rgs create mode 100644 Native/PlainText/StdAfx.cpp create mode 100644 Native/PlainText/StdAfx.h create mode 100644 Native/PlainText/resource.h create mode 100644 NewNativeStubs/D3DService/NOTES.md create mode 100644 NewNativeStubs/DHS/NOTES.md create mode 100644 NewNativeStubs/DecalRender/NOTES.md create mode 100644 NewNativeStubs/SpellFilter/NOTES.md create mode 100644 build.cmd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ff6c63 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Build outputs +bin/ +obj/ +Debug/ +Release/ +x86/ +x64/ +build/ + +# IDE +.vs/ +*.user +*.suo +*.sln.docstates + +# NuGet +packages/ + +# OS +Thumbs.db +.DS_Store + +# Native old source (reference only, not part of the build) +# Keep Native/InjectModern/ and Native/LauncherHookModern/ diff --git a/Installer/Attic/Decal 2.sln b/Installer/Attic/Decal 2.sln new file mode 100644 index 0000000..d183e0d --- /dev/null +++ b/Installer/Attic/Decal 2.sln @@ -0,0 +1,11 @@ +Microsoft Visual Studio Solution File, Format Version 1.00 +Project("{73393D18-DAC4-11D1-88FC-0000F8064EBB}") = "Decal 2", "Decal 2.wip", "{3606BE98-3576-4296-9CF6-23746B25EA4E}" +EndProject +Global + GlobalSection(LocalDeployment) = postSolution + StartupProject = {00000000-0000-0000-0000-000000000000} + EndGlobalSection + GlobalSection(BuildOrder) = postSolution + 0 = {3606BE98-3576-4296-9CF6-23746B25EA4E} + EndGlobalSection +EndGlobal diff --git a/Installer/Attic/Decal 2.wip b/Installer/Attic/Decal 2.wip new file mode 100644 index 0000000000000000000000000000000000000000..0ab5749ef00fa970461a85c9af1be84340a8a712 GIT binary patch literal 245760 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 zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ Y1W14cNPq-LfCNZ@1W14ce%=WD4@fQGwEzGB literal 0 HcmV?d00001 diff --git a/Installer/Decal.Installer.wixproj b/Installer/Decal.Installer.wixproj new file mode 100644 index 0000000..6c119db --- /dev/null +++ b/Installer/Decal.Installer.wixproj @@ -0,0 +1,6 @@ + + + Package + x86 + + diff --git a/Installer/DecalInstaller.sln b/Installer/DecalInstaller.sln new file mode 100644 index 0000000..1921c4f --- /dev/null +++ b/Installer/DecalInstaller.sln @@ -0,0 +1,13 @@ +Microsoft Visual Studio Solution File, Format Version 1.00 +Project("{73393D18-DAC4-11D1-88FC-0000F8064EBB}") = "Decal", "DecalInstaller.wip", "{3606BE98-3576-4296-9CF6-23746B25EA4E}" +EndProject +Global + GlobalSection(LocalDeployment) = postSolution + StartupProject = {00000000-0000-0000-0000-000000000000} + EndGlobalSection + GlobalSection(BuildOrder) = postSolution + 0 = {3606BE98-3576-4296-9CF6-23746B25EA4E} + EndGlobalSection + GlobalSection(DeploymentRoot) = postSolution + EndGlobalSection +EndGlobal diff --git a/Installer/DecalInstaller.vdproj b/Installer/DecalInstaller.vdproj new file mode 100644 index 0000000..79a1e80 --- /dev/null +++ b/Installer/DecalInstaller.vdproj @@ -0,0 +1,2213 @@ +"DeployProject" +{ +"VSVersion" = "3:701" +"ProjectType" = "8:{2C2AF0D9-9B47-4FE5-BEF2-169778172667}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:DecalInstaller" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_0593B7A6B4D74017A43CC5F9741D078B" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0982C22EAB78456EB86F4249B8414B18" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_10B736524B444A95B8CC8D36B521F980" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_10F10A15256A062610D2C3BB791B1DD8" + "OwnerKey" = "8:_A03B9AE58553491581FA0975DF6E6E88" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_10F10A15256A062610D2C3BB791B1DD8" + "OwnerKey" = "8:_BD4EC7DFE26A40BA84001249533EC862" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_11AE7CD5CB2A43E395B33FDD50522940" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B24BE0AA98366C96E901D38481AFA2A" + "OwnerKey" = "8:_0982C22EAB78456EB86F4249B8414B18" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B24BE0AA98366C96E901D38481AFA2A" + "OwnerKey" = "8:_E256A97055264EB5B195F1414117D027" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B24BE0AA98366C96E901D38481AFA2A" + "OwnerKey" = "8:_673044C5656142EBAA86D07A36EFFF5A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B24BE0AA98366C96E901D38481AFA2A" + "OwnerKey" = "8:_612F21D2E46F4ABD9F724071C6272BE4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B24BE0AA98366C96E901D38481AFA2A" + "OwnerKey" = "8:_2D7C1CBBF7B8490C8F2C991C5EB345FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1B24BE0AA98366C96E901D38481AFA2A" + "OwnerKey" = "8:_287894F290604710B0E99CD646021261" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_22BD29E70B04C9A3652B3863709BE01E" + "OwnerKey" = "8:_A03B9AE58553491581FA0975DF6E6E88" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_22BD29E70B04C9A3652B3863709BE01E" + "OwnerKey" = "8:_BD4EC7DFE26A40BA84001249533EC862" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_287894F290604710B0E99CD646021261" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2946BCB3B3574315816189D84E505D59" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2D7C1CBBF7B8490C8F2C991C5EB345FB" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2F5508FF7469BA7A04B3B151A497F0FE" + "OwnerKey" = "8:_A03B9AE58553491581FA0975DF6E6E88" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3848A0AD84FF4D7AA048E21F6BD3EB88" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_422DA789643D4CFC8308DBB6EB58ED8B" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4785F00ADF0F4D128D62CF6F0E79ACF1" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_54CAA3887D5BB7386CBDA21B86BE8405" + "OwnerKey" = "8:_0982C22EAB78456EB86F4249B8414B18" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_54CAA3887D5BB7386CBDA21B86BE8405" + "OwnerKey" = "8:_612F21D2E46F4ABD9F724071C6272BE4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_54CAA3887D5BB7386CBDA21B86BE8405" + "OwnerKey" = "8:_2D7C1CBBF7B8490C8F2C991C5EB345FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_54CAA3887D5BB7386CBDA21B86BE8405" + "OwnerKey" = "8:_287894F290604710B0E99CD646021261" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_563EF804A0CB4DED80A2A6473BC3F407" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_5781C0D101DE4F4C98C59D8A3A2052BB" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_612F21D2E46F4ABD9F724071C6272BE4" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_673044C5656142EBAA86D07A36EFFF5A" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7871BAAF26D34E148CE9063C20620A7E" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8E9B4D574D014738B94369502A191459" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A03B9AE58553491581FA0975DF6E6E88" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AC7940677AFA439D9D75C9827A0003A2" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BD4EC7DFE26A40BA84001249533EC862" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_0593B7A6B4D74017A43CC5F9741D078B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_F7B461AAFB7641F699DAEAF49904A662" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_BD4EC7DFE26A40BA84001249533EC862" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_AC7940677AFA439D9D75C9827A0003A2" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_A03B9AE58553491581FA0975DF6E6E88" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_8E9B4D574D014738B94369502A191459" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_612F21D2E46F4ABD9F724071C6272BE4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_2D7C1CBBF7B8490C8F2C991C5EB345FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_287894F290604710B0E99CD646021261" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_11AE7CD5CB2A43E395B33FDD50522940" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_10B736524B444A95B8CC8D36B521F980" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C31D1BCF707D2E3D0615B921ECB6AF76" + "OwnerKey" = "8:_0982C22EAB78456EB86F4249B8414B18" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D53309D55D054D94AC5C2F4718911F8A" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E256A97055264EB5B195F1414117D027" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E394AD31431645D595FA0C5AA33F3F3C" + "OwnerKey" = "8:_BD4EC7DFE26A40BA84001249533EC862" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F033647B20DD4A8C88658A817EFEED68" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F048FB0C88BCB32714E2C913DB57CA08" + "OwnerKey" = "8:_0593B7A6B4D74017A43CC5F9741D078B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F048FB0C88BCB32714E2C913DB57CA08" + "OwnerKey" = "8:_612F21D2E46F4ABD9F724071C6272BE4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F048FB0C88BCB32714E2C913DB57CA08" + "OwnerKey" = "8:_2D7C1CBBF7B8490C8F2C991C5EB345FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F048FB0C88BCB32714E2C913DB57CA08" + "OwnerKey" = "8:_287894F290604710B0E99CD646021261" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F048FB0C88BCB32714E2C913DB57CA08" + "OwnerKey" = "8:_0982C22EAB78456EB86F4249B8414B18" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F2738E715D99DE056559AC0FCD99222A" + "OwnerKey" = "8:_0982C22EAB78456EB86F4249B8414B18" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F2738E715D99DE056559AC0FCD99222A" + "OwnerKey" = "8:_BD4EC7DFE26A40BA84001249533EC862" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F2738E715D99DE056559AC0FCD99222A" + "OwnerKey" = "8:_A03B9AE58553491581FA0975DF6E6E88" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F2738E715D99DE056559AC0FCD99222A" + "OwnerKey" = "8:_612F21D2E46F4ABD9F724071C6272BE4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F2738E715D99DE056559AC0FCD99222A" + "OwnerKey" = "8:_2D7C1CBBF7B8490C8F2C991C5EB345FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F2738E715D99DE056559AC0FCD99222A" + "OwnerKey" = "8:_287894F290604710B0E99CD646021261" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F2738E715D99DE056559AC0FCD99222A" + "OwnerKey" = "8:_10B736524B444A95B8CC8D36B521F980" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F7B461AAFB7641F699DAEAF49904A662" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F9CC1A2472E24A2BB88C84B8A01C2922" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\DecalInstaller.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:..\\Installer\\Res\\Decal.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:3" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:1" + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + } + } + "Feature" + { + } + "File" + { + "{A582A373-4685-4296-BEFE-614B80A702C3}:_10F10A15256A062610D2C3BB791B1DD8" + { + "SourcePath" = "8:inject.tlb" + "TargetName" = "8:inject.tlb" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:2" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_1B24BE0AA98366C96E901D38481AFA2A" + { + "SourcePath" = "8:ForceLibrary.dll" + "TargetName" = "8:ForceLibrary.dll" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_22BD29E70B04C9A3652B3863709BE01E" + { + "SourcePath" = "8:decalnet.tlb" + "TargetName" = "8:decalnet.tlb" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:2" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_2946BCB3B3574315816189D84E505D59" + { + "SourcePath" = "8:..\\Release\\Tab-Active.bmp" + "TargetName" = "8:Tab-Active.bmp" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_2F5508FF7469BA7A04B3B151A497F0FE" + { + "SourcePath" = "8:PSAPI.DLL" + "TargetName" = "8:PSAPI.DLL" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_3848A0AD84FF4D7AA048E21F6BD3EB88" + { + "SourcePath" = "8:..\\Release\\Switchbar Disabled.bmp" + "TargetName" = "8:Switchbar Disabled.bmp" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_422DA789643D4CFC8308DBB6EB58ED8B" + { + "SourcePath" = "8:..\\Release\\Switch-Active.bmp" + "TargetName" = "8:Switch-Active.bmp" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_4785F00ADF0F4D128D62CF6F0E79ACF1" + { + "SourcePath" = "8:..\\Release\\MapObject.bmp" + "TargetName" = "8:MapObject.bmp" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_54CAA3887D5BB7386CBDA21B86BE8405" + { + "SourcePath" = "8:comdlg32.dll" + "TargetName" = "8:comdlg32.dll" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_563EF804A0CB4DED80A2A6473BC3F407" + { + "SourcePath" = "8:..\\Release\\Switch-Inactive.bmp" + "TargetName" = "8:Switch-Inactive.bmp" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_5781C0D101DE4F4C98C59D8A3A2052BB" + { + "SourcePath" = "8:..\\Release\\Tab-Inactive.bmp" + "TargetName" = "8:Tab-Inactive.bmp" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_7871BAAF26D34E148CE9063C20620A7E" + { + "SourcePath" = "8:..\\Release\\Switchbar Template.bmp" + "TargetName" = "8:Switchbar Template.bmp" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + { + "SourcePath" = "8:..\\Installer\\Res\\decalbar.jpg" + "TargetName" = "8:decalbar.jpg" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_C31D1BCF707D2E3D0615B921ECB6AF76" + { + "SourcePath" = "8:msxml.dll" + "TargetName" = "8:msxml.dll" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:4" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_D53309D55D054D94AC5C2F4718911F8A" + { + "SourcePath" = "8:..\\Installer\\Res\\Decal.ico" + "TargetName" = "8:Decal.ico" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_E394AD31431645D595FA0C5AA33F3F3C" + { + "SourcePath" = "8:DDRAW.dll" + "TargetName" = "8:DDRAW.dll" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_F033647B20DD4A8C88658A817EFEED68" + { + "SourcePath" = "8:..\\Release\\ForceLibrary.dll" + "TargetName" = "8:ForceLibrary.dll" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_F048FB0C88BCB32714E2C913DB57CA08" + { + "SourcePath" = "8:urlmon.dll" + "TargetName" = "8:urlmon.dll" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:4" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_F2738E715D99DE056559AC0FCD99222A" + { + "SourcePath" = "8:VERSION.dll" + "TargetName" = "8:VERSION.dll" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{A582A373-4685-4296-BEFE-614B80A702C3}:_F9CC1A2472E24A2BB88C84B8A01C2922" + { + "SourcePath" = "8:..\\Installer\\Res\\readme.rtf" + "TargetName" = "8:readme.rtf" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{58C0ADA3-3CEA-43BD-A3B3-2EA121BC8217}:_8166ECC1DA234550B1E7EF74BD46A69F" + { + "DefaultLocation" = "8:[ProgramFilesFolder][ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_B4A52EA52B0946A1AF1F0D1FA55A352F" + { + "Name" = "8:#1914" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:SystemFolder" + "Folders" + { + } + } + "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_B6240BE9F7AB40C49501A0F1916C9F19" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:DESKTOPCHECK" + "Transitive" = "11:TRUE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_CE0C30F5282E4E9B90BDA28CC464B7BC" + { + "Name" = "8:#1915" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:AppDataFolder" + "Folders" + { + "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_389C0E90FE9648818AD1DEFAA9DC54F9" + { + "Name" = "8:Microsoft" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_827B6E073E1C488CA0FE06DBD2696AEB" + "Folders" + { + "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_D9A98D5B210F4BDDB7354238829F005C" + { + "Name" = "8:Internet Explorer" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_CC6FAE35428446F7A5DBA5FDCC735059" + "Folders" + { + "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_D14FAEE30DB04C2987B017392B2676D3" + { + "Name" = "8:Quick Launch" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:QUICKCHECK" + "Transitive" = "11:TRUE" + "Property" = "8:_4DAC10BC6D0F48B7A761EF8473DB1160" + "Folders" + { + } + } + } + } + } + } + } + } + "{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_EDC3C70C7BD444269C2D8468B127C156" + { + "Name" = "8:#1921" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:StartMenuFolder" + "Folders" + { + "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_2810CF6E38894B19BA72268D6ADED7D4" + { + "Name" = "8:Programs" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_C368CC94BA0541D885FEBE0D61FCCCD4" + "Folders" + { + "{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_D70E24E1CE22406FBAB1FC9F062AFF43" + { + "Name" = "8:Decal" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:TRUE" + "Property" = "8:_3F0EC8ECE14547C5B5CA1788B5786205" + "Folders" + { + } + } + } + } + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:Decal" + "ProductCode" = "8:{F9D7A0FA-6A35-49BB-8F39-1F22D21EFEC8}" + "PackageCode" = "8:{4D35CB7A-603A-409C-A1C3-75400700ECB7}" + "UpgradeCode" = "8:{3025AB1B-80B9-46B7-9CE9-9887ADA2914F}" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" + "DetectNewerInstalledVersion" = "11:TRUE" + "ProductVersion" = "8:2.6.11" + "Manufacturer" = "8:Decal Developers" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:http://forums.acdev.org/" + "Title" = "8:Decal" + "Subject" = "8:" + "ARPCONTACT" = "8:Decal Developers" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:Decal" + "ARPURLINFOABOUT" = "8:http://decaldev.sourceforge.net/" + "ARPPRODUCTICON" = "8:_287894F290604710B0E99CD646021261" + "ARPIconIndex" = "3:101" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{6A471EEF-D31B-40F8-BCF6-C9E8EC783F36}:_C23E3CEF54174B3A8A2D37756992EBAD" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{6A471EEF-D31B-40F8-BCF6-C9E8EC783F36}:_546D40DB839B455D82F5E91893603090" + { + "Name" = "8:Decal" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{6A471EEF-D31B-40F8-BCF6-C9E8EC783F36}:_3E930ABCF062405E896F03708044C57E" + { + "Name" = "8:Agent" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + "{35AE352C-BC79-4EF9-ABD8-61F467188583}:_C9E01259D8454893881D2ABF6BD9C3A0" + { + "Name" = "8:DecalDirectory" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:http://decal.acdev.org" + } + } + } + } + "Values" + { + "{35AE352C-BC79-4EF9-ABD8-61F467188583}:_978949FE5B314AFAA7ABF89FB19FC901" + { + "Name" = "8:Version" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:[ProductVersion]" + } + "{35AE352C-BC79-4EF9-ABD8-61F467188583}:_AA655DB6EE5D4BB9B9204C385E9CBE31" + { + "Name" = "8:OldInjection" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:3" + "Value" = "3:0" + } + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{478F747B-8505-45D1-9AAE-8C3B645C26E3}:_5F3519BCE1454E789BCD4078C98A865D" + { + "Name" = "8:Decal Agent" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_0982C22EAB78456EB86F4249B8414B18" + "Folder" = "8:_D70E24E1CE22406FBAB1FC9F062AFF43" + "WorkingFolder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Icon" = "8:_D53309D55D054D94AC5C2F4718911F8A" + "Feature" = "8:" + } + "{478F747B-8505-45D1-9AAE-8C3B645C26E3}:_A8DA19519D9B482F8AF23CFA046F65F5" + { + "Name" = "8:Decal Agent" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_612F21D2E46F4ABD9F724071C6272BE4" + "Folder" = "8:_D14FAEE30DB04C2987B017392B2676D3" + "WorkingFolder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Icon" = "8:_D53309D55D054D94AC5C2F4718911F8A" + "Feature" = "8:" + } + "{478F747B-8505-45D1-9AAE-8C3B645C26E3}:_BB8392103EA1441A93CE0FA8FEAC28C1" + { + "Name" = "8:Decal Agent" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_287894F290604710B0E99CD646021261" + "Folder" = "8:_B6240BE9F7AB40C49501A0F1916C9F19" + "WorkingFolder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Icon" = "8:_D53309D55D054D94AC5C2F4718911F8A" + "Feature" = "8:" + } + } + "UserInterface" + { + "{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_4A0E739DE67B491CA19B878FFDABEE0C" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_7E3067C9F9DC4FFB991A025639BE0852" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_5078A72A61924D85880B7C268118FFCD" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_7B8C961A3D064281A17521E9CF493ECB" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_56C6374723C04B58BC9016AF2D9CFE38" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_D3EAB879B4C2418EBCBFDF914D608C74" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_5EB9A2C293F64454BD1C7E8A821D870C" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_3ED0508302CB416D838CE173A80922A5" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_9A9816672E904721A09E36EA59BD5DD7" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_29602C4C90C04E908105F62D596803AC" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_3DE309CECA554C89BA0547AC86203763" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_543224620FA64E5CA8F6ED03B62391EA" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_66121796F59945708C479055DE42ADA8" + { + "Sequence" = "3:110" + "DisplayName" = "8:Checkboxes (A)" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdCustomCheck1Dlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + "BannerText" + { + "Name" = "8:BannerText" + "DisplayName" = "8:#1014" + "Description" = "8:#1114" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:Create Icons" + "DefaultValue" = "8:#1214" + "UsePlugInResources" = "11:TRUE" + } + "BodyText" + { + "Name" = "8:BodyText" + "DisplayName" = "8:#1015" + "Description" = "8:#1115" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:Select where you would like icons created" + "DefaultValue" = "8:#1215" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox1Label" + { + "Name" = "8:Checkbox1Label" + "DisplayName" = "8:#1034" + "Description" = "8:#1134" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:Desktop" + "DefaultValue" = "8:#1234" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox1Property" + { + "Name" = "8:Checkbox1Property" + "DisplayName" = "8:#1030" + "Description" = "8:#1130" + "Type" = "3:14" + "ContextData" = "8:Public" + "Attributes" = "3:2" + "Setting" = "3:2" + "Value" = "8:DESKTOPCHECK" + "DefaultValue" = "8:CHECKBOXA1" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox1Value" + { + "Name" = "8:Checkbox1Value" + "DisplayName" = "8:#1038" + "Description" = "8:#1138" + "Type" = "3:2" + "ContextData" = "8:Unchecked=;Checked=1" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:1" + "DefaultValue" = "8:" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox1Visible" + { + "Name" = "8:Checkbox1Visible" + "DisplayName" = "8:#1026" + "Description" = "8:#1126" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox2Label" + { + "Name" = "8:Checkbox2Label" + "DisplayName" = "8:#1035" + "Description" = "8:#1135" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:Start Menu" + "DefaultValue" = "8:#1235" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox2Property" + { + "Name" = "8:Checkbox2Property" + "DisplayName" = "8:#1031" + "Description" = "8:#1131" + "Type" = "3:14" + "ContextData" = "8:Public" + "Attributes" = "3:2" + "Setting" = "3:2" + "Value" = "8:STARTCHECK" + "DefaultValue" = "8:CHECKBOXA2" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox2Value" + { + "Name" = "8:Checkbox2Value" + "DisplayName" = "8:#1039" + "Description" = "8:#1139" + "Type" = "3:2" + "ContextData" = "8:Unchecked=;Checked=1" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:" + "DefaultValue" = "8:" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox2Visible" + { + "Name" = "8:Checkbox2Visible" + "DisplayName" = "8:#1027" + "Description" = "8:#1127" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox3Label" + { + "Name" = "8:Checkbox3Label" + "DisplayName" = "8:#1036" + "Description" = "8:#1136" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:Quick launch toolbar" + "DefaultValue" = "8:#1236" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox3Property" + { + "Name" = "8:Checkbox3Property" + "DisplayName" = "8:#1032" + "Description" = "8:#1132" + "Type" = "3:14" + "ContextData" = "8:Public" + "Attributes" = "3:2" + "Setting" = "3:2" + "Value" = "8:QUICKCHECK" + "DefaultValue" = "8:CHECKBOXA3" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox3Value" + { + "Name" = "8:Checkbox3Value" + "DisplayName" = "8:#1040" + "Description" = "8:#1140" + "Type" = "3:2" + "ContextData" = "8:Unchecked=;Checked=1" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:" + "DefaultValue" = "8:" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox3Visible" + { + "Name" = "8:Checkbox3Visible" + "DisplayName" = "8:#1028" + "Description" = "8:#1128" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox4Label" + { + "Name" = "8:Checkbox4Label" + "DisplayName" = "8:#1037" + "Description" = "8:#1137" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1237" + "DefaultValue" = "8:#1237" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox4Property" + { + "Name" = "8:Checkbox4Property" + "DisplayName" = "8:#1033" + "Description" = "8:#1133" + "Type" = "3:14" + "ContextData" = "8:Public" + "Attributes" = "3:2" + "Setting" = "3:2" + "Value" = "8:CHECKBOXA4" + "DefaultValue" = "8:CHECKBOXA4" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox4Value" + { + "Name" = "8:Checkbox4Value" + "DisplayName" = "8:#1041" + "Description" = "8:#1141" + "Type" = "3:2" + "ContextData" = "8:Unchecked=;Checked=1" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:" + "DefaultValue" = "8:" + "UsePlugInResources" = "11:TRUE" + } + "Checkbox4Visible" + { + "Name" = "8:Checkbox4Visible" + "DisplayName" = "8:#1029" + "Description" = "8:#1129" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:0" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{B654A020-6903-4E6A-A86C-75DC463DB54B}:_D20048DADB324074BB172BC60E962F0D" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{B654A020-6903-4E6A-A86C-75DC463DB54B}:_DDB8CED19F9F49EAA4A9FD86F907ADFA" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_F66A3964900C4D8296E0DFCCB3D89AF4" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_3670151345C6434ABE9B84BB3E1F3E2E" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_B0B22F1A8B914D16ACB6B397786640B9" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_B4311BE3A66F418288CFB3D114EFA5F6" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:2" + "Value" = "8:_B65B1E8E7A2B4AB4B7D61E7F4FB061D0" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_0593B7A6B4D74017A43CC5F9741D078B" + { + "SourcePath" = "8:..\\Release\\DecalNet.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{C1CC01C2-D2C7-4862-A143-14BCF1BE9790}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_0982C22EAB78456EB86F4249B8414B18" + { + "SourcePath" = "8:..\\Release\\DenAgent.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:STARTCHECK" + "Transitive" = "11:FALSE" + "Vital" = "11:FALSE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:2" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{1358ED95-22A0-41E2-A23C-6C46B0BC97DF}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_10B736524B444A95B8CC8D36B521F980" + { + "SourcePath" = "8:..\\Release\\DecalInput.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{85C9D7B0-AC89-4E79-B701-FDE85EE569CD}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_11AE7CD5CB2A43E395B33FDD50522940" + { + "SourcePath" = "8:..\\Release\\DecalDat.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_287894F290604710B0E99CD646021261" + { + "SourcePath" = "8:..\\Release\\DenAgent.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:DESKTOPCHECK" + "Transitive" = "11:FALSE" + "Vital" = "11:FALSE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:2" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{1358ED95-22A0-41E2-A23C-6C46B0BC97DF}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_2D7C1CBBF7B8490C8F2C991C5EB345FB" + { + "SourcePath" = "8:..\\Release\\DenAgent.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:Not (DESKTOPCHECK OR STARTCHECK OR QUICKCHECK)" + "Transitive" = "11:FALSE" + "Vital" = "11:FALSE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:2" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{1358ED95-22A0-41E2-A23C-6C46B0BC97DF}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_612F21D2E46F4ABD9F724071C6272BE4" + { + "SourcePath" = "8:..\\Release\\DenAgent.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:QUICKCHECK" + "Transitive" = "11:FALSE" + "Vital" = "11:FALSE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:2" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{1358ED95-22A0-41E2-A23C-6C46B0BC97DF}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_673044C5656142EBAA86D07A36EFFF5A" + { + "SourcePath" = "8:..\\Release\\LobbyHook.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_B4A52EA52B0946A1AF1F0D1FA55A352F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{47B0C7F7-102E-4EBD-83CD-B317D991FDE7}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_8E9B4D574D014738B94369502A191459" + { + "SourcePath" = "8:..\\Release\\DecalFilters.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{06884D36-8C17-46BF-8BA5-2466E97FB605}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_A03B9AE58553491581FA0975DF6E6E88" + { + "SourcePath" = "8:..\\Release\\Decal.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{FF9AA982-5BE3-460A-9AAE-913C02E9C184}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_AC7940677AFA439D9D75C9827A0003A2" + { + "SourcePath" = "8:..\\Release\\DecalControls.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{6B9C5380-3B50-4E72-B604-5089CB64B644}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_BD4EC7DFE26A40BA84001249533EC862" + { + "SourcePath" = "8:..\\Release\\Inject.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_E256A97055264EB5B195F1414117D027" + { + "SourcePath" = "8:..\\Release\\LobbyHook.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{47B0C7F7-102E-4EBD-83CD-B317D991FDE7}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_F7B461AAFB7641F699DAEAF49904A662" + { + "SourcePath" = "8:..\\Release\\PlainText.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_8166ECC1DA234550B1E7EF74BD46A69F" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:4" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{726381FF-93C0-4846-A72C-1B1BA6D08643}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + "VJSharpPlugin" + { + } + } +} diff --git a/Installer/DecalInstaller.wip b/Installer/DecalInstaller.wip new file mode 100644 index 0000000000000000000000000000000000000000..cfb2f276002cab95f332e5475a9ad81ee2d8eec2 GIT binary patch literal 28160 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 NFNx$SRQ^2E{~ryOjsgGx literal 0 HcmV?d00001 diff --git a/Installer/DecalInstallerVC7.sln b/Installer/DecalInstallerVC7.sln new file mode 100644 index 0000000..339972e --- /dev/null +++ b/Installer/DecalInstallerVC7.sln @@ -0,0 +1,13 @@ +Microsoft Visual Studio Solution File, Format Version 1.00 +Project("{73393D18-DAC4-11D1-88FC-0000F8064EBB}") = "Decal", "DecalInstallerVC7.wip", "{3606BE98-3576-4296-9CF6-23746B25EA4E}" +EndProject +Global + GlobalSection(LocalDeployment) = postSolution + StartupProject = {00000000-0000-0000-0000-000000000000} + EndGlobalSection + GlobalSection(BuildOrder) = postSolution + 0 = {3606BE98-3576-4296-9CF6-23746B25EA4E} + EndGlobalSection + GlobalSection(DeploymentRoot) = postSolution + EndGlobalSection +EndGlobal diff --git a/Installer/DecalInstallerVC7.wip b/Installer/DecalInstallerVC7.wip new file mode 100644 index 0000000000000000000000000000000000000000..2adb6f78029d2cf8f4e0fdc7cc55b7c8c90d7b4b GIT binary patch literal 28160 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Installer/Res/Attic/HRESULTHookSrv.dll b/Installer/Res/Attic/HRESULTHookSrv.dll new file mode 100644 index 0000000000000000000000000000000000000000..046ed86434302c26469d29d1e3c015f020d0a6dc GIT binary patch literal 28672 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 nul 2>&1 + +echo. +echo. +echo. +echo. +echo. +echo. + + +echo Removing Decal 1.0.1.0 +msiexec /x {4AFA7857-D10F-4A74-A504-9C10320A6DB9} /q /lem+! %systemdrive%\DecalInstaller.log + +echo Removing Decal 1.0.2.0 +msiexec /x {840FA8EC-CA4D-46BE-94E6-2C85F4E29EDD} /q /lem+! %systemdrive%\DecalInstaller.log + +echo Removing Decal 1.0.2.2 +msiexec /x {DBBE8C7F-F27D-48D7-BBC1-5BFA30485980} /q /lem+! %systemdrive%\DecalInstaller.log + +echo Removing Decal 1.1.0.0 +msiexec /x {DFB254B2-F9B4-42F1-8B16-C045B18C8DBE} /q /lem+! %systemdrive%\DecalInstaller.log + +echo Removing Decal 2.0.0.0 RC1 +msiexec /x {3CFF0D79-376D-4557-8376-A9B48E50F775} /q /lem+! %systemdrive%\DecalInstaller.log + +echo Removing Decal 2.0.0.0 RC2 +msiexec /x {701F72C7-421E-4DBE-B8C7-0A8B5258D539} /q /lem+! %systemdrive%\DecalInstaller.log + +echo Removing Decal 2.0.0.0 RC3 +msiexec /x {D6E309A7-290D-48E0-9992-0DAB18EA4CE4} /q /lem+! %systemdrive%\DecalInstaller.log + +echo. +echo. +echo -------Previous Decal Versions Removed------- +echo. +echo. + + +echo Installing Decal 2.0.0.0 RC3 +start msiexec /i Decal.msi /lem+! %systemdrive%\DecalInstaller.log \ No newline at end of file diff --git a/Installer/Res/Attic/delegate.dll b/Installer/Res/Attic/delegate.dll new file mode 100644 index 0000000000000000000000000000000000000000..e72fda228a58b13560eddd4c2febba230d9b1458 GIT binary patch literal 71222 zcmeFae|Q{seeb)n*Y+k+qDhc90t75{Lq!oe0;zKyWLgD`;?ugxNU}$U7~6me!pDSd zSPh0MsZzTX&8FX^?*qImN(|hQVn9nBLr;Rc+ekCTt9t z?s>mIyV}p_n*g`ZbMJHiIewnEw6A&1&S$>!d%iPDe&wCT#L7e>kwohCMB+Gp^WTvC z{K-GgLtpc%&t8)_cEy)oeY|bcmtMVj;sYPf=`|o=92Q%+|_nmisD4%)H`!aV; z-kJHpotX`{jb%Rgptliw=8M?di12~NYDW9RLO#HO}2iQoUyVSCA)Ph9irtJ+p45|3iY zrpD0RTkzXLs=}6hUeQ=C9Kz)z|8i|DfW|+3iQjAeZeU+mTjEbJw5zi%;ZP5?C9GBa zVEl915>Ip{5+&5_Hq=iJiW_?Jl}cHa1*yK?Wv z=lkx(kDbVGARCd`zYNE_YuCH;?@lDX)&qgsiJwFM9*O-MLMv}EP(RP0OkMV7P*xGV* zD8I_TGkYQF@5yG5X7X3exdVmG+3pJ|ACoL>%61>M@>lq71_LuPum=M(M^pIP_HKL) z(>CWYnp<7R9^v z&F9-^F4gmEoch}R)dUB&JASG@lG?GofByEF(>*7XiDD7oY9DjQ_dPy&)sF4QR}Lkn zZ$H_d;1nL>-sE3;K_`B(XuWY{AU95Vmxr}9_tD6H6ie1*;*r~bDy^C@#$ zSUi@0qHyK%n#HAmn6IQemuvTju#26js5qe_U?dT)18quw)a71=-2@ozcpT{7zT=I~bnof80MY zmYtsYr;aV|RVT;u?K`%=>-czL4OV4u0`2MSuh&i_3%9lxrm|i6EJ|bt7bcgD!zMX^EqNGU=|k(jwC}0>WBb07|AJHL#OPy%;q{fP@L@|~ zc%ZTZ9}2@87KS(SQ0EU1`0fV(*7Yk-&YW&vd17vA&C0ptFFJ+cp8DE6me;=d!f>`R z6W26nwKm+I%wOMZefH+Ua4)v!%6*s`CIOkr4{%Q?46nmGBwt}xu^-#T#f$e2^v zAvlD>Zynv@R2=zc7T;{kuR#;K3&R#*1pxb9;nq$-3a}abwA%%+WVGJGa5rE`Mq6LF zHG{>8JqF9NvHsfeh2+ZlG5-uV7R!Hf-2cIe#TC!~iT_13_S-9;ePGA-+fOyuD$1s? zp`~Qk!s_;~?!#tONcn3A_}fYPSFhuTjTo|ChP3z3$2N=OT>G-8HYPZ8G2`-J)`!jV z>K(F{x6ho;aLRccmWDG}O&E?#o$00FYj*SC*1kJ4GG2G&h;@bwW-6O%b>Ydwg z%L)`*U-={9A#4o`!y9BPJ9YbxX1(U}{&C9($22UT-HF|q1vHQg)yIKyIOSunz%kl) zyRqeW`oo<#BzO6@c41)8+~%x>p&5TTi=kP+V{{xiP#?j@J7xK3pqufrbVo+9V6DcC zw8wYO#`dy&{bN7&N3t^~GX-m5NG@2Gt?!vV*<^C@jvv(PXXRgmhkv-7-DR9ww3m&a zT1*@MwJlz}3Qcb=EB;zoReDXEHSk>=)K(qCr>uNBj!zaoohr^;?BeE@!4{Onl9L(s z*NimIpgem{O>yILd3NmKk8W;2{LqC3gI|r)D87p0AP#05vg`SK>HO(e_tmD}fK7|% zr_=~O^zcVFe{}iQ?lykt<&Ob5;aYx`Bg(-&$MGZoKZJdW@TxMO=^1wZZB zzQFA`p=UNM3dk!PBNmGl|CO{DrP0g=>p_7_14{?zlhJ?wkDpIo$?q&bpS<9BHPk#_ zZCE;9ZCpBDZF-U873Rg-_t?_$&f=9ss&NLxQb--Q+LF^JWoVKs)tZ^VG{Tj69R|u8 z;rJNy%F6G*B7xg?r=_>RN^EorQb43iosu?#V0+uiu0H1P79Z)f@2v=hc-3FEuxu#r4BB zxh!a0btQ3yIJl5s?OV8POx8~EjP&KoH*pu?KZ?`EQuB*rA)^L*f zH@bd5E%|6Zow{{Pn$^Yz4>+)CNB5&}_lPgDsTB-%JtJ24=3N-vFY=YhI;`&%ZxUEOq|31 z-dNPTuiV}F&^)m6TbN*TpKc5YF`zjn+Z@~9-R5Anv@!0VEsg6}8?)0tkEQ?S`yFiU zSgGr{NN~}`jihi5H;;mwTo_JqFXkoIu;s7isP1Te?EuGpbbG8^Q6}RqO-IJWA?;Rc z6EYXLJHTMMQaDvP zSg+TyikH|QN)=Z3&u>4~xOp1R`1f?Ze&NKW6<<9+x#~FYedoIOaY|#AcXnVqyTr|` zK6wT1A>?ZA6gLpJd+?E4X|5eR2ezd9>62VgGkzUmBgSJ!ks+kHY09sei=AWslem)5v*+8| zM<ECF_Hc455d_{e2AGS!qC%J`ACb5uC?M`6p z;)Z(PDK2o#uaxS?_3gH7W(zJhfA|Pz<=Ib7c4Ha#p;nJmXlvfl@xmA-aVBe=41f3t zTgKVLVWVgAm9<+s*W|nSz45|L{`GPfsNcaQS>N0(+5Yc1g&TRH)i~hHp#m=)oRKmA zD}_DT0c2g}S={=}&gWl#6K;5?cum?{SS`o0B&O1{_!1l({9D?w7&|d~=cu0=bL!U) zegTv1={WE#PMH2}7K}CcCH(9~x;kdRfra<{EnI{{$Isw47n}Au{F>vH^tG;o8R>FR zDdUWd)JLtx#HQYfde+Q89b$kZX<;>SUKi?c@r7?JO75YJcrCeizah z4fj!2VK|A~g~C1U{!8X=?R2oKk0lEuNq;O=z?o_cSL<@|SGcpMFoG?-4%IxD$=MKR zu0o%Gn_M~K2=QsupDx_ioo{F3R$!6zf9Ha1LvG=XJSQZLopir1Css_PLt>l=tlqA3;P4)#FxV6ca>ZD*w4yA>cW+C zwTnDVa zRIj_0%#||b%28~QOI-#dJRxIy+*cdN4Hiy*1I*p~ zX6h>^2cCbM92D}ezn_PS9fj5Y)!Xo)aBI?EyOST>)cw2od$?V0Y-M6sPsq5}_-psb zD9QVCGD^z7I?oTc#>U-~?QZPtKawLu|KnH}U07)e93xiwA8x-eI`?Z?43oZ3TxRgx z%6$pTrP~?Vg86+d?pLq{cS3U2uw6V4HQI&Sv2p*dWOJ?Idsuim|83m2Elia=MgseH z;~2^#D3(MomP8LW>aM$akjkQ(<&2MwxVWO&ivs9ufSdX`I3B<(UVHZVmW+Xmk#<@R zZ*4j}FUZ`?Tuk9m$Zob?cd#-(+0j}D*qa+`AtMW;xhS6f6s9#Wc?H&4x4*sp!Zv=u zAZzX(UU4-S#Q+wC#hu3)8O7?q{`;~x(&pl5mcX~i{jIt{2H5NPaURlejP<`fUb&_5 z{ntqIHp?EH!A^F3|liiJ# zMTK5c{NzgB_gMalg||yL{Ds&3xaEVd4ES$P%*=Nc-p)G~esf^oV^goim2dv%3o`ZYMUa zoet)>wbAipyAzFaV4T=4E*stJn)3v~nZwo6=Ikz9D2;8ws_B$Nz02zX-&-*)p2D_bFHQ_TpT83GytRD=mfluuh~wDt zw(U-iY(ckD|6`4Xx_?u4Grrh~WIGP<+S}ifz)~D=&`C1Br9Rr(7;ox>xJ=l(qGR^2 zF$$*BIWln$^SZljeBum#*VpFcc-V1ZKPQ3HCC15e$IbZG828_$+VbI@_%eYl-L zA?K#OR>$nt2CzSGeWPmo(s-g83w&s|B@28>y#?R82`j#1_VxTe7B-IL{g1iF*$0MY zj(SVWyyJk?DA6^(MOxLhG?7cVRBNoKUZ;P4cbgMiQymBXk+yNT$zZIRO7i7j86RIh z<*+eMFZaZ8?(nZafhO-xj&4CqcgC7L#}Ro@&;hHrKbeg)g%(gi7pbjc98q-~DVvwR%g&zG*KFdq6RWU|tWeY_1DNvn6G zSX|cGi7#>d=G_gRHKq9c=yBZ1y=JK=O^%6t03>sWp0PIRD#Hy2+S9nCDy)!8${n~} z#o(nGY5tCNoyichKOOa@zlYlz9txe6?c-XVj`*P`aBawY{dSb+uFmqH#)+>Td(CxA z-;nXo+%dB*!ETWi{4n|a>rZ_3QuD41Wu(8(^-tX4ziH;=iaQE#oH?=L4qOOcYYdqD zH}o8EdRU%$tR|U4llL3^V}1YpvfDwKp1-l(znOD^E7V3Sv;mwxP8Hd?To&DUd`yO} z0NJLK@yp`YQkMROMt2tfd`AOsS=wk91dX;}$dm&Y5j*jQ4X+D6#IYO5a z>bV&6XSkjQ%ib0KuclU32cx^LN9Z(eOtJe;lIW;!2MO}?4InXd;!DQm)>#U2tRGhX19!0$~dy( zq>LMbwesE8wSnBUTc_kId91#+$YTII;@>YC+CjueocS9vB7hm^6y<(y`T4* z_uxqx3(XCuTs}U#h|lu)tjZ63eD<6SX`dVJx?>@c!qwag{I;6EyApRS46Vo}DuY}; zjqa+u*Z8abFW0dN;Q4HGp<}%#`{(cQH;h~-J&m}-Ywc^Yz4<>c3mvy(eG?aPSyOo@ zZl`gy`XQ!^i_f>vKKq%*Slk?Hld0x&u~Xdg`{(-~zr(-znmc^l34b)zf6^bZ`cL*h z-oNm9PT~3I=aPZn8DJ|~i96^*ibu8h_TXR50(@fs7#=rl!?n9i@NKK_z&*GBVNUQR z{f}~rkI3|De&_FEV%Im;+{aS>vs`QWtNl@IsgsL4wzCfiGuF9dd#SB(?eflGG#Jl+ zunT9gSmY7Vmj3UIOkBc(-m<%Gw7^b_?)ut;*nZfVu(NR{PmSR;h2C3q%Z%bv2HhmQ z8_X2B8qouTOE+|Yj#&P=!EbaNcm=+M4Y8BgJiWYd8sI^x3xjZl;Ev!6?El$_Y(V-d z|3$V%+!J=pewnKhXS=x#*S)NHjPx%J{-|U2FCZ4y$Y%4QByJLJOBKf1V_vv9>7$>5 zz31(pWp8rf=5`e8#jJMC-O@Gqy}9;{`Ja`oXXQ!Rc;r`CLVjg=rQC-{ypN{Pq(1Dy zufq!H>#yD6_v1tN9UWo*m8qG3P2Pdt42YE{SN`MR3A`=RH~IDP$|>|;`RA}j41QyZ zoyP-(H(yxmukpWv?e9YS=h%mHVb$kW@RACrV>#lc&|qsv11)x$pW1%=yJk*zE!!Tj zy<&_M`f2YT*ovAbu%C9moVnPJRg=PY z;4Ezi6FgR6R=W_~UNp9byRTxg!s{@iKxI*U_@4l|NqxaV?tm&_Po(mhJqH~WAAO^pe|0PhSaA(p#Gl$3CFD<;xe@C+L z&ZPg2RN#K47rI$r7&iWe4 zi+g?Mg7)M3;8(LeMkd|uxJXVUCjZmS$sf)9VC6@Cwx0d?(VtIP$JytO!{>4K)$lia zhxj|&`0fAaO#kEeZEj2YCvnXS;nyeewY!mh$Q;6D#eaMRH{6Xga`U;DTloQQQL!5} zkBZGx2_Ln|ZqYm?=KI|7x#K)Ox$D>cUrORy;UOHoaE4humrD&kntwTp+;NBB z#Z%9{=#tB?z}?%UlZzO9+Z?Vse!YDzXJNdTV8AbMwB+Cqo8x>3gI)u8F*Es(+T zMFJ~$oTmd^dEB;psB-snvaw&em$+_cb&QX zCSQUjZ7#DNu@?|tC06)tS!%TrjFC#IM|7xljR@y5GcT&K66%r4{EF+)Meji_ekR*94=mZ*pfPy=)QW# zfm_l1W+!A1?l;&8*@LqoPF?7Pyzo-Y!^`pQ9$YA4(C)U~3EXG1*9BV##>64v`*&Y~ zuDG7X?_i?1jJT2W@j7)3-^a?Yk$bR$o}xc@w+fqrM1_*&|C2BxPo0+)rn7+TVv|} z#jEQd|32&?e3utklk9!4%-2ts4r3LpdKv3K_9pBLc3D0te3AEAU+~^gWA5?3(Cv7% z65n5im+h}9Ecfd;?~VPl^-c~S`Qhxq&BSV4J2l?a;rLfpR${u1_i?UR`ox;}2JU_X zY)d#N^X?uzbE&Ok-$RYl>X^ea-CWEIvzLT@z0f&?HJq`wBaA?^~w%B z0IU4mrF#7#o-}awyK-UG(&^)~JQ^P7;Sl?C$HJ=SVRGn`9R3hD4UCWBOPk9lIq0+8 z7%)Djv$Roj_>8YBMTk)^|SKJEV?cA&#oJNB)| zwdO*C?YW;nCinyAou&7wmufk$Zq(}7_j_FSa^zfI57z@rBQI^m`L`|&X>GBultuLX zxtGu1z&)gOj%~iY_QFkcVFj0@zjQ8cj`xC1bg9tZ|2LLN57xv&g6sZ%{+Qs87g;8J zswvC=WtF@5j2jCDn>K&(-he0Rr8gHYJ;E2=n&bZS*Kut8N#ph{jqCoD_1ap_uQJyw zUun1WmG&JA32vh1LguoXHIUk6w!kQ#hezVwc{gEF_Hm2WS~M%B$S8xkv; zt#C$I3awZwh1YB_`Q2AeSlFN8CaRb+mQKUd4W7!cbn0JYOPe3D)MkGJ3;EX@r;Bfn z)W7zw9qcZ+_cT`@J9w;n|C#q{_oCBe&Gd->O=Ao!yUa-C7ch%+`3>2*%^O}TEgHRJ zVfD5|Wtg*$3nJXiqwRPmgZ@W06ekfZlgy}dN8y#tL8xR_zo$K3n>~I@^M(7n{`p4^ zp@F!PNbhcQD+ka`f)19M)2Vy^or`qxpOJS)ydYn=r|-xALCQmG8vErv11|a_SGR6dx?gys zV&V15#(R6QCpC>L3OVIBKFZI=`?nG9n&a=^{w7Y9FV5IRQukiOk$~saYjAyyP4G1F zWR~x_@c@yUAdl>>I~-77+k+h*BX`u-4&hU4Z2w?3i}Czf*`53Y*>2D%hVr+A!Tddf z;awcg0sJtr727Gc(JuaJ)Y|U&1f@OA`NK{!=Jr1|?!To`J^zNWG0a+LYu3ib>R-o9 zUDuc?*@6@J5?-F3+lIU4W7%#Hif8z1Hp>^~_tm_&&iwldZ`I7dubEsYjXjv{_(PLd_0QjXnvOT!2j$NoFw5;2Fgk)|lyXLSw^Co*D~qW)Vr$az<%JnD*JtWK zv_5gAIGaskGN_BSRbQLbRinL8jq53FKU|#i`JdA*hD*fQV)9qXv>Jbo)m$>VBQ~3H z@5O`I1i5T*JCopN)LxI;_wahR-@mp2-#AB&*3y1OR z^Z3-91lo`Nqp|<+8Z+PLIGFdw9^>q;H#VRb-(xzZl~}*r zg;g*7cBw7?{rfq(Q(60e$_+(xYOzi^Tw6B>Zp3WkmLCs<_<)ohQ2x1nPj&2@MJ+sn z^nadHLSMi~{1g6HPgJaX|B2_n&;JOz|Kum0ulvbh-~8M_kaq_+Ch;=mI;ZkS7zKyk z!Y?#SY{o?8GyuI-dr)%)8BwjJS4mYRYyKt5NR@|6%?E4M2r;cZ} z*@@@SgH`z=d#4)Dw+e6J#Pi!9k~Ysj`_hb8+tc(QhAH8@s1adPS{|jF9jWNQ@_f7%>Ktl zDT8yW*%&H-c6C&RuJyveq&cK7N=uOC&TU*f_m8lxDc zS|hH+Rv^z&@L+<^9e4|Y{zG2V;CHb&!rKNsj6rWLcT~*420X~Zz;4$WMQbu>WTH|- zr&{x!#E+ua=KAwkCHNyNt`y#z<4R+E#NC}hFU_7W)$12l;7Kz2)9{Uz`I{SmL4tnD zU-Vbc@!cKijBzpTK2BTyCM)Y-#kw;m);DL9)aXHyH)p$=Pe3^PsJQeuCAe^Z$MQc1 zlK#e@+#hnZxdQX=S-QcKry9H$ahC2CG5@jNkQdxSV#&NnXGrT{g%6e6aj6=+ zC~GjzaLxYT#`BHtRuAk?W4!+HH3$Q*yZp{ErqTYypJJo@8AK~)UcoKe{9QfzSGIQ0R4HL{w2J0 zg};1#y}z1so@vf^FXo%i#HQF8+$~?zZ^WkFT&Nhy;@{BsKQ(xYZy-yjJ>Ko>Vc!t` zrk+WAWv3YU*{E1HL)j$)3xNjW=$3x$AZM6{^NoJ$T{nH?YhjTt*l8BJ2jP z2nT=iy7n+n4Y=pK`zipJ7)O-5Gi&MtXzi9cx4>Vru^z(wekD2Pj$?4^W?iD zbNJ0S_T=qCoLc>g%nVL1^Gm0fJx`gZm(9yhFTczYnx~hW{6}$e`LXAf!Us|^{nlCK z!qqsbEq38?L8G_$`S@uC^NNijynmKlJyDmw(LPFaEFS&jLAF|bN zn2?{mzNz29$DH*WcsW$RffpzB8@OfFZy1oD>*Qyj{N$}u{e~X-$;!?AoR**5 z%j!4qJYB!xfcz}V&x7*wko-K1pV;31KmI3Y;>KSvqjL(U)LX346aR`g2KfpKU#{k# z65$oIyRWa^g1=6`*1xUC#baW5kyYNk*&%oItxgDxZOQXf{Ba5QvL0s~ldJsg=Xm9a z=}i8dOb35%gXvsbzYZ1nM+@yd;Vw;Thn%0bpTd}J`J3=}Nq7y8m-T)AwRqzNN0``b zy-X(88J}EhGJG}29j|;EwXqxE#f8<4zWX7(|KQ^9Y)<^k3hW|y(dH7~ec^`f7TPMG zlR1@Fp7@U4?)JqiunHO*BYtl2FXEKvzn!oBeVV7ud~fAAu2$spWXAO;FQa>A<@fxz z;|~P!u8aTnOZWqmN4NVQO!()wo{}#n3;23s<=c}!-x_;YA(_<+K(pRfRC5|dD@T^< zmwP60m~rBIaBwr>42PCbeI%B}VDTX8{EFV9>|ZgwjFfQg?v zdv>?A_)_d!t@eUHx{Ny)zmGB1cP_qTneSSBa+&X1ylI*5UVLbo?>6dX7C*7fXN-E; z#g8uYS)*Rh;yaf49;06G;!VqZuTigW@ukarpHXjM@%!jf)AkP-_0}yuxy-LK>aAaV zXqjJc)Eip-#4P;-ZW0{{Y>g`#)X_?<+ z)XOctbeYc?_413~$H_PZLp`zuA9YL>-;<+?5aORAE_6%)gPu0)eFb!9ib1@3&-m5 zT5Qo%FB~Z!rFRVul^>+H4Gxq`^l5`VO&_hTb(eR6a{@8yqN?>C*;#%1_YO@C>@K3rq;R>d(V<9fPt%9$ zg=6*3(+BE>WA&b)_tXnV%Dfv`bPW!bFVfov2g+6Yw85V8bM&=VfBuB9tNs#wq+Zxo zf0;g1FC44K$9;=|df`|-_BtV+fa6uoP3sLbB%Mcd#&ng8vd#k9emGX8spXn*VZ z#)Pn|zKdR;e@qD5>bvPf{l0LlUWPtUFC43vrT5eeN6LKgz33VoD)-Xc1_#Q0^l5`V zH$)$(7mn52K<}v+j+8gjy9S5Ko9JzW17(Lk zZLp`jnZAbC{+j#0u&aJ6eWYI4R=x060lFC444i{4W&94SxGy9S5Kd+2S0 z1LYij+F(yPPhWes)qY`D{a*S=y|Ar*iat~?9IH1?AE+0O)tjaF)C)(-`{`YSL*)bX zw!wjNkv?s(r+kpU_J6n9FYKy6L?5Xaw$&e|57i6D>K&mE)CO&_ zhTb(eR6a{@8yqN?>C*;#%1_YOs;%}5yXw!;N9u)b^-t4>>V;$V&eI3#g=6)eq4(4a zN6Hm?*Wgh3BE4;Jpj@R-8|*1RM_>E5R{Mor^_S=)^}@FL%k-go;aELB`(6yx3&-m5 zned{gUN}-t(YpqR%6zQ3Xd4_T^YQ0m+F(zaPfHhT|JrK5u&bUg6)Z;Tg>ChG3t=%- zFC43vp%2sx$LeM2J@vwoau2<0aH!l%ZyOva_tB>f_LK+cYxwKU=Ke42s$WMRsTa1@ zucr^y3&-jW(Ff{+H4Gxq`^l5`VV;$Vo}u^D3rETode`7k`69h-aG+eJ zPaEthKSy8tpRM)_yXr5|N9u)b^_S^G^}?}w3B07T7^oMH)l1TQ>V+fa6uoP3sN7C( z8yqNG^l5`VaB7k#8&*jC?7AF3CQ)yvQa>V;$Vvh<#M;YhiM-ZeN> z?xnX44wU=o(*}FW1N623tJQvCSN%HrNWHMFem#AtUN}~7h(1s+9ILm1-cv6eDQ~2A z4Gxtz(c1ej@8>m@2MA# zlqcw2gG1##^tQo)a*jT2u&11-ui^E(X8VO*^?T_f^}@FLDf&>oaID@meV|@AR&SQx zQ!gAT@27VS4wVnk+Xe^9Mf$YCp7KHZ8eZXRwqMv)e~3O(FKnwnOdqNjj@3ItAE+0O z)q8;6Q!gATAEkE<4wWCIw+#-IOY~`jJ>_HcHM}F(Y`?Ip{y2T4Uf5RuFny?AI96|- zK2R?lt9P2-Q!gATpP_dR4wcW++Xe^9W%{(ip7Im)HN245Y`?Ip{v3UzUf5RuG<~RE zI9BgGeV|@AR__^lPrY!YT%mUj4wWy`+Xe^9Rr<8Sp7L|_wQsfBFYKznL?5Xaw$)#z z57i6D>hV?X#X!AqtX`7dQ!gATr|4aSL*;gQ+u%UiqE8#_DRzS(NOu&bVbPqP@Q z7q->&?*JA<^}?}w8TvrIaI7Bxa$wO@FB~cJFQ*n=gF|Kh)zqSGaG=~rpElT29-yy% zqt$+4SN%HrNWHMFem#AtUN}~7h(1s+9ILm1-cv6eDQ~2A4Gxtz(c1_HcwI^Hc7k1Sjr;pSN+v*>t57i6D>dn&!>V;$VPSbnpg(KxN^sd37@>zP@ z;6S-dpElT2euBPsuGM~FSN%EqNWHMF{%QJ9y>P7FdHO)TaID@l^qzX*NV!7q8XPKL zq_+(Yl&kbV+fa z9(vc{P`Q`hHaJl3qfZ;`DG$)szSe5Lu&aI@eWYI4R==J;R4*K>H$)$(7mn52K<}v+ zj+8gjy9S5Ko9JzW17(LkZLp`jnZEW!tNp^R`mOYldSP4rHu_M#aID@=`ar#Ktllnq zPrY!YJVEao94hajw+#-IbM$G0J>@)o?H^k07k1U}rH|AL+v=z2L-oS3deiiQdf`~T zS$a>saHPDS-ZeN>K0t3994Hs*(*}FW2kC2%x7si4sy{>@sTa1@AEpo03&-jmp%2sx z$Lc*m@2MA#l#kN828YTI(%S|H$|d@=!JhIl`r21p?H6{{AE%Gh3)|`+rVrH%$Lh_~ z2kM1m^-j}!>V+faGxV;(q4HUJ+u%UCOrJK`Q+|TJR&KRl*j0ayK2k4itACn4R4*K> zcb+~_FC44)485mbI8v_Ay9S5K7wK(-1LZ1x+F(!lIr`dHTJ0Bh)nB5I)C=3{FVlzW zg=6*jKe$~C)CZl|{m4wNnWw85ToCw=Y9t@aDM>bvM8^}@FL zZu(HYaI9X2K2R?ltCyws)C)(-J@l@@p>i+1ZE&F6N1ry>Qy!qNeW}%cVORY+`bfR7 zt$says9rc$Z-_onFC444f!zq`v3j%go_gU(c|W~taHxEM-ZnT;F4CtB_LL9O*Z#iM zeqmSrA^J$Yu&w?ueW+eIR__RXpk6pu?*V#Gy>O&_l-@NsRDO`&HaJi&(Wedel#kKZ z9&5E<*j0a=K2k4itACh2R4*K>H%}j^7mn3CP4B4}j+D>Py9S5KXX$N&1LZP(+F(!l z3HsWZR{Mor_2=j#^}@FLr|CoW!m)bi=>zq`v3k$Yd+LQFLu`>C0Y#B3&-ju={@zrk#dUOH8@mmr?(9b zlr8$S!Jcv_eeKa!`-NTgUG$N9VOxDSeW+eIRxd*zs27ga%hG%5g(Kx2de`7kxtHEH zI8g4RPaEth575`X&}zT1t9~7Qq+Zxozn(r+FC42kL?5UZj@8>h@2MA#lsD4528YU< z=xu`oWrsd(u&2D4zIM9ReqmSrR{BW2u&sU@eW+eIR&OVLpk6puZx_9%UN};opmz-p zmG{uw1_#PH`n18Ga-P0+s?~mBSN&f4NWHMFeu_R+FC42kO&_Qij@6r`_tXnV%KPbE zgG1#5^tQo)a*;l5u%~>GzIL+JeqmSrA^J$Yu&w?ueW+eIR__RXpk6pu?*V#Gy>O&_ zl-@NsRDO`&HaJi&(Wedel#kKZPPE!D?5aObAE_6%)jv!hsuzyco2L)d3&-l6ruWnf zN6KgDU4ujAv-GyXfpVEXZLp{O1buD3)qY`D{W}=Fad&-^kwMSa*7k1Tm(MRfqZS~#sp?cw1y$pSz zUN}}SOYf-{j+A@oU4ujAUV7W$K)H`TZLp_2Kwta2R{Mor_3P*(^}@FL_4J{7;aI&P z`ar#KtlkECPrY!Yypi5DI8@$5ZyOvaJM?LTJ>|{xwTD~n7k1TerH|AL+v>N`hw6o6 z^>)$+>V;$VcF}w4g(Kw&de`7kc@Mp9aG;!{PaEth=jm&oYqek4Rlk=$QZH<)pP~=d z3&-kB(+BE>WA$d~J@vwo@_u^P;86Jhy=`!yT%=DM>?t3luYI=FeqmSrA^J$Yu&w?u zeW+eIR__RXpk6pu?*V#Gy>O&_l-@NsRDO`&HaJi&(Wedel#kKZ9%{8;*j0a=K2k4i ztACh2R4*K>H%}j^7mn3CP4B4}j+D>Py9S5KXX$N&1LZP(+F(!l3HsXcR{Mor_2=j# z^}@FLr|CoW!m)bi=>zq`v3k$Yd+LQFP7F5PhItI96{1y{BF{Qr<}K8XPKbqPGnWlpXrC!JhJF z`r5Hp`-NTgTj?Y9!nXQt^r3p;SiPO}fqLOsyV;$Vrs)Iq!m)a@^qzX*NO?cKYjCK1fZjGZP%hG^ z4fd1|(%1gF)qY`D{UQ2Dy|AtRFny?AI9BfneV|@AR__6NPrY!Ye3afbI8=U+-ZnT; zF43nA_LPs&*Z!*2eqmSrar#KTu&w@K`cS=atlm6*pk6pu?=-!qUN}-dL+=_KDxamd z4Gxsc^l5`VgKd&&d!wLfpQU)WW@jy_T^Y^z^SAF3CQ)f=J@)C0N_EWA#qcd+LQFPwu&w@S`cS=a ztloM0K)rCR-ZS)`df`a9Lhl+JDqp0x4Gxs6^l5`V<>%;YpK7&V*j0atK2k4itG`Si zsuzycOW=RQwiu`vj@3)jd+LQF^dN+Ml-CFYK!CqL0)I z+v>aNL-oS3dKvmay>P5vmflk@94YtEy9S5Kz4W%hfpQ;x+F(z4fWG!8t@aDM>etan z>V<9f>*+)F!m)Zo^nrTeSiKGOo_gU(c_Y1RaHzbA-ZnT;cIeXvd&-;XYY(*AFYKz{ zN*}2gw$*Q=57i6D>g}Wt)CYE!J+a+dfVVYxk{fl z*i(LvzV=70_6xh}FVRQpg>Chh=|lCxv3iMi_&~jItX`7dQ!gATr|4aSL*;gQ+u%Ui zqE8#_DR{;<`4VOM<@eWYI4R^Lq@suzyc%g_hvg=6)y^qzX*NV$jJH8@o6rMC?Z zl>6w@27Af_^tJ!qYQM0nejRH%}j^7mn3CP4B4} zj+D>Py9S5KXX$N&1LZP(+F(!l3HsWhR{Mor_2=j#^}@FLr|CoW!m)bi=>zq`v3k$Y zd+LQFBlW_z`fmDAy>P5vhCWa) z9IKb5_tXnV%02Y1!J%?5y=`!y+((}_*i#;$uYJ7LeqmSrI{HYxu&sVQeW+eIR&R(t zP%j*-w}IYMFB~avq<0Mtl{eAb1_#OxecE78c{6?OV5|MYuKKO?k$PcU{Wkhgy>P7F zPWnK-aID@gdQZJ@q&z|I8XPL`p|=eVlymfHgFWRueeL&K?H6{{@1>8_3)||a=tK3w zv3k?=fqLOsy;*usy>O(wpWZb%R6am&8yqMX>C*;#$_MFdzt?KNu&e$MeWYI4R)3g2 zR4*K>cZ5DrFC44)0KKPPI8r`J?;0E`KS*yI94MFQ(*}FW$LMRn+iJhCtNu8Bq+Zxo z|1f>1UN}~7o<2}79IJPl-cv6eDW9Qt4Gxvh(%S|H%4Pbr!JhIH^tEEE{lc#LbM%pV zVO#yv^r3p;SiSS~fqLOsy=Uk>^}>;Ih2AwdRK7@W8yqNC>C*;#%Fof)ey7!bVORYn z`bfR7t^P87s9rc$FL4cgpk6puFG=sI7mk!u^sd37GX77CXurXMvPGXZ*i-JLul;tb z{lcz#{I8SIe)Yn(`fmDAy>P5vhCWa)9IKb5_tXnV%02Y1!J%?5y=`!y+((}_*i#;$ zug$gEFYKycM<1ydw$-nv57i6D>J8Bc>V;$VHqd+Og(KyS^sd37@+NxQ;6T}-PaEth zZ>FyuXtiJ1Rlk)!QZH<)-$oy*7mn52Ngt>ej@8>m@2MA#lqcw2gG1##^tQo)a*jT2 zu&11-ulcR^3%ly~(nsorZS_<1p?cw1y=nSDy>P7FEWM{*I8xqE?;0E`AE37l4wQ@Z zX@foGgY>ogTJ0Bh)gPjd)C=3{57US0g=6)O&1~4p z>V;$V&eI3#g=6)eq4(4aN6Hm?*Wgh3 zBE4;Jpj@R-8|*1RM_>D`R{Mor^_S=)^}@FL%k-go;aI&y2YjGjI94x7@2MA#lvDJs z!J%?Hy=`!yY|*C;_LMv6YrolQzp$&mi#}2>Y^(3457i6D>SgEy^}?}wS$a>saHQNr z?;0E`_tM)22g-f)X@foG0s7j$R{Mor_3P*(^}@FL_4J{7;aI&P`ar#KtlkECPrY!Y zypi5DI8@$5ZyOvaJM?LTJ>|{xwb@qtgRw)$=Kp?cw1y`A)ddf`~TUG$!M z;YfLc-ZeN>-a~I294P1L(*}FWdHUK+tNp^R`n~j#dSP4r6n&^(I96|(K2R?lt2ayU zsTYov_tU!uhsp=&ZG!{lB7NFmPx&By?KfKO7k1SjqL0)I+v*R~hw6o6^^VX7>V;$V z9-#Ns3rEUF>0N_EN5BlW_z`iJR5^}?}w^Ynpw z;aI)X^qzX*NcjxCYjCK1mfkivP%hJ_4fd3ups!80+Ar*?KSv*_7q-yB z5|Vfsh9Maw_fiZ)%E)=7iu5sEm=01#&Las9dlkO(nuIlk%=32^HD8Oo9@9aJ$Ppyb zi|Hd7WQd>NfbSwZk<7cn?*StYl0%9}2`M90#Ck70;vhMsh?I~rQbnv?@Q8!tkRnn- z%19Nl-Up93NDe6?C8Ug05$g_k#6faM5h)>Mq>5PYhesSFhZK<#QbwwXH35$}NDe6? zC8Ug05$gl+h=b&iB2q%iNENYm!y^uoLyAZVDI-7 zibx45BUQxuAUxtAIi!e`kTOz5tUKWm2gxBtq=b}_Dq?*I9&wNyQbbBf8L1*x4jyrk z98yF|NExXj)~~`N4w6HPNC_z;Rm8dr9&wNyQbbBf8L1-Hhv5+i$st9ggp`pgV&&lx z2gxBtq=b}_Dq>B-BMy>7ibx45BUQxm;1LJOAw{Hwl#wc8eFPqHkQ`D(N=O;0BGz7b z#6faM5h)>Mq>5M{g-0ADhZK<#QbwwX^)YzFL2^hDDIsN~ideq}k2pvUDIz7Lj8qY8 z3LbHg98yF|NExXj*4^-kgXEARQbNi|6|wGtM;s)F6p<2AMyiPQ>+pz!2gxBtq=b}_Dq`IWk2pvUDIz7Lj8qZpH{cNm$st9ggp`pgV$HxK4w6HPNC_z; zRm7TwM;s)F6p<2AMyiOl4<2!l98yF|NExXj)^EZi4w6HPNC_z;RmA!&c*H?+ND(O^ zWu%H&`{5A>$st9ggp`pgVin*K2gxBtq=b}_Dq`ISk2pvUDIz7Lj8qZJhesSFhZK<# zQbwwXbpRf5kQ`D(N=O;0BGw!{;vhMsh?I~rQbnxahDRJEhZK<#QbwwX^*iv0gXEAR zQbNi|6|su&h=b&iB2q%iNENYu7annt98yF|NExXj*6+b14w6HPNC_z;RmA#zc*H?+ zND(O^Wu%H&2jLM1$st9ggp`pgVtpJQagZERL`p~*sUlVYk2pvUDIz7Lj8qZpzrrI9 zl0%9}2`M90#5x3zI7kjDA|<4ZR1xbF@Q8!tkRnn-%19Nl{s10vkQ`D(N=O;0BG!L{ zM;s)F6p<2AMyiN)7#?wu98yF|NExXj)_;db93+PnkrGlys)+T6@Q8!tkRnn-%19Nl z{sMq>5Pg!y^uoLyAZVDI-kQ`D(N=O;0B320=agZERL`p~*sUp^2!6OcmLyAZVDI-7ibx45BUQxuAMl8SNM%YaSkPkQ`D(N=O;0BGw6b#6faM5h)>M zq>5N4;SmSPAw{Hwl#wc8oq|UkB!?7{5>iI0h;Mq>5Nyghw1ChZK<#QbwwXbrv3RkQ`D(N=O;0BG#AS5eLa3 zMWlq3kt$++86I(v98yF|NExXj)>q&W2gxBtq=b}_Dq@x45eLa3MWlq3kt$++6&`Vr z98yF|NExXj*5mMqgXEARQbNi|6|w#S9&wNyQbbBf8L1-H6Yz+GiI0i1kf)#6faM5h)>Mq>5PIf=3)AhZK<#QbwwXbsipZkQ`D(N=O;0 zBG$Lz5eLa3@%#VcyU_>m9`p+!JCSMR2r`eHM-uOaM~0A{$TV^UnMckeiCyr>5V8}Q zMvfr!$ay63K6qpZ*@;XeN052sJd(Hr9vMP*BGbqbWF9$>B;F5?3?Vy_Y2*kpkDNym z6Y$6ovJ;s`jv({Mc_i@xcw`9KiA*C$ka^@hlGqK83?Vy_Y2*kpkDUKs?cIHJ9#>)K z@v9)HQUoaAlj!X6_9#@%3hHL({r%-SmW@mlTi8l0y6R>W>mhRdL{cOVg-%u-|zkIgXOH{Lw#l zyMA&$nrH5BUhdqP=iV#jISIr;a!4ddks(I`Q6+~&f)p8Y6cG24Ln1+n3^@vjL2^hW zNRc5&0Wm}li3BM!AcsVP6d7_95aZ;KNRT2!jsoIA za!4ddks(I`@pf`ZBuJ4VM*;B;a!4ddks(I`ahMzu2~uRpQ9!(t91;mqWXMrK{2Ove zBuJ4VM*;EcA|;1Jf)p8Y6cFzsheU!D8FCa550OJ6L5d7H3W(nzheU!D z8FCa5N5~;$!5HNRT2!jsoI1IV2LK$dIFe_-%4XBuJ4V zM*;D1a!4ddks(I`@dv#;NRc5&0rAJ=kVuds zLyiLCadJo`NRc5&0da~P5(!dd$WcK22{|MZq{xt?fcR5#NF+#+Ax8o68FEM@NRc5& z0WnJsi3BM!TNNNF+#+Ax8nRNDhevDKg|JAihcti3BM!J<|H@b${?Vku*Hp`(@>? z-h1aW3G08gx<2#rhd;ml1J7PJea-6n|Jty9^3lIJIC>x3|7bPu+pzvO8@9i=Vg1qD z-~G%xKC*D#oN7!wu_GHthr9&^}mzbZJ8* z5bZ26j1+P^84?Va%aHaAI0gjon;VykjqMUIu}RYs~q`wv$7cMk3!soYx`924T_ui1TQZ1~Vvd*!Y}ckdk=IWTzl zRw16aa_jcW<*h$Q`GK(mebobRuWTFP-TuDn-pc;514DyipJ=aCD`PJzU##n_^xglW zVsVeyUe;*iVZ_tdbXQ0BR>tn=s~)O|r^>ZAt*<>n^|V9$Mc(DCNGl4fP+YR(2eyR(AE>Tj8o- z`Qo6s}0CDTg8DFtnU-=f8id~;B95ew&#z!Pdr$b>>jQR z*3Pm|jK5%gtJvCp$JVZ$>vilF+lIRPMi1Urxp&7%r6Tq|zrNPOZ=i&$+&k7c*xxtO ze_P+k=s+J=*GT#5iOU_k2dG1TWj(Hph+kUWZ*BX%JS(^Ljf)OS_wa=Djj~!hQhVQ6 zpAfIUe6*c|qnv7gMF^j=wT)_z?c4gw(zey(cJ19(9X-%5#4oI_Z>#o=j_$te9-c!X zHr1^@#5+cY?tRnkJKHt!uh{DL!FyLvdBxF&s+IMoxZ*?o!L{$-rF`D&D6e1B!}Uly&>NuD692RK?9gxm=HzI_CYf@6Wc4x^|pS?$1uHfb;&t z&*1(mpTXJzuKxH(X@RC2nA0+E&X_OH`23y$!5mobWO?=V|5*#v)oyyT5a|mqe07|s z2Y6BWwG93pY@EnCF~j?fubFy-qC5Dk-^tJIVo&W;znfp3?&Qet4AaS4)O#{qzBGSM6vm;sK6ZjtVWz;L9`hv)=>so-JHK zH$RP9-`7H2x`fVpUu~NfMvc|6X0`X<@)G;I{K8t6ukW$(_%6Tjw=k=Fz6R~oaW|vZ zYEsr_l)9~sM&+3D2I|sM8yU)xuS!jaS@vIXjtSK0Er#0{6*t!$-o zG}^_oY{T+(E6eq^x`nGR+o?Q$*{)?x4^g9X#4AVM^5uzZIo|qxD@T@5M(*-{4%fCT z_bOlgB;}o59fw!XWrR;ZoevZ|KE6>->naVj!Wo_g>$oA#y7V#>!+r3tgvR%t-S#QsBZS~G9;e^A-?_zo zv%A;rb?@>HdWXFyynpUT{*3=E|GWN*Ul+VGxGs2o&=&kkUX6+KMZz- z2gCX3>(Mu(hWOQSYwW~5aX)o=ApWiRcsv`Qj=vOtJ^pt5y|^4`7OC4dWv_Cd@}Tmp z(yjKZ?^VC2{#bpP-mCZPBl_>_kLe$$Huss+=1FtLJY{~%{I2<&`8w;3mSVld-e>pO zciRuy@3B8^pSJ(lnR9aIIcoP6H}>xF-sw$vf9mb?pZ4ed1^@g05B%2#*9V(}mS9gX z9(*QvDEv(LRQQGPi{Y2UuZQ0bzZ*Um{wVxucy08m=(W-2s3p27dSi4~^y|?yZTrRO z%h6)=y{I{UV{FDz{HyWX;t$1h@iXx^V)`ZWuKBNA5=~%Pb%k> zA1ODeo7EfDH>tO&d(|oRr24eFpf0OFQD39Q+J5bTHmrS0`<(V?+7~rnf2&^APjD|5 z_4E3ThG9HmeB1b+#)|O+<8kxzW}WqFOSSe`pR&GY{hV#uzhS@6{-pgK`-1&Tj^;Q{ z=xlR#I=h|QonLkCbSln4XV`hC^DgH%o%cE)a6asO%=v`#d(J1F$DGHV?>K+${Gz+Z zy@O{laqn{9eSs}NAJ=9HP6XC`mlb#epr7BkF`Y$=y7v9#fBV4JXuT?(B?uN}W~b)LcESo>Awy z&x`7kdR8sC-{;ix>WX?ny{KMNg;uXMXpLHvwn=N&Hft?ftJbD%(G<PEs%xCzBHla;wQ`%AOn08#tv=iF2c2b+sPHD5+oR({+ zY0Y_Uf%aU|&eEdG+Bw>EMY}+&UebhKuQ%w8wCpCmnYL}wTWQ@bxm9Ul zm)=b)_v#7lJiwDVtdHsAv~^04F`-ZDQ?&On{kWd-%ueek^%?z?KFiaa>!N2>X&q3)Ef;(qtRq+GMbIeMvKvEv>96rg(u!I0z(?@Mu*X9 zbQ#@7kI`!+M!zv&RE=R{%osNg8>w-`m@p=dDdVVd%s6gj#tCDZ9(cw$Wy~6LMsA!o z&KUE?g0W~U8E1{cST@cX=lL96FfJOG3}M!r4Q8X+WNtE>&COhs`l_+&pZi<`HwkoHVD*qvkR5xS5$JF85Kh=A4ax169;??%tbS|2s#?R=m^E%4wo>beHDOI!Q`S-In04IBtP|EWJ@t%r z%9^$2tlTPua8foSoAjpRwod1$)t6vd`Luy=2$iBZl}lTbrMF-0jElDHs*{o0;SFoXTq6urktbBG3U6G zIVYTH=cF^^oN{Jsj5F^nIE&7bbJi)GW#^o8-dS-jI2WBuj&SSU21c;(^ zcQf~dJMEryXWUcntUKrC?rBEHd3S*xbjdyI7Va|r=y`X=z2IJSFS)|2_ZqxLugTlw zHG7-A7O&N7^R{@3XLybmc+zY4I=oJ=%j@=fyk0Ny`n>_K>J58i-Z-;{)H}lHHt9`y zN4;a-aWC^uc+=iVZ^k?2&3bcQ?w$6|c=O(Zx9BZ-XT8E(_Re|dy%q0*chS4#3BTTN z@EiRmf0N(rZ}waKR=>^P;w!%4JAU9xzuoWfJN+)d+wbvv{lxF5r?2|M{+K`RANEuK zh(F;^`cwW<|CoQ=&-@eqw11L$%qf4?pJPUF+CNhpcNhI7|Eyp5%lcT%2quH6;An6xI38rdiC~)f(M)hEm<{HFJUGovX+Bs87K5eWEc2!1;9PJ%SP3o! z7lTWI2EIbiThbP0C@KiV(&V_k+Iy@83hYR6ixD=iZi*PwS z7oHDS!VBTW@KPwE`lumljGCfNQFCps(HgZyTOuVgA}0zW8MQ|pQD@W@bw@o>ZO=$oyJw-)D-B8`vw}@Zv$9!fQCgKYWeYP_LvfTqkxIML zp>!%;O1ILZ^eTzcuM8+vWmp+g#+Ad&B#tN(%A_)-9951f$CXSup-eOLno&+Ev&x*3 zE2ot+%KX)tz}1<+)tSK6nZVVVz}1<+)tSKmO*4U}I$`iPlYjd2fHVI{zmL;aE&Mm5 zSp0qS9loL@_;*zs+O;gW`ubU0VAm}wf2E`eUsbVQ!Lr@!?XTRA)vx8~y=z}bx?FPe JaQ|K6{{UlJ*k=F$ literal 0 HcmV?d00001 diff --git a/Installer/Res/Decal Homepage.url b/Installer/Res/Decal Homepage.url new file mode 100644 index 0000000..d2b9ae5 --- /dev/null +++ b/Installer/Res/Decal Homepage.url @@ -0,0 +1,4 @@ +[DEFAULT] +BASEURL=http://decaldev.sourceforge.net/ +[InternetShortcut] +URL=http://decaldev.sourceforge.net/ diff --git a/Installer/Res/Decal.ico b/Installer/Res/Decal.ico new file mode 100644 index 0000000000000000000000000000000000000000..3ba5a8ac2897f310db08508a59bb79a21defc493 GIT binary patch literal 4710 zcmeH~L1-IC7l2=?wChqD<(g1vE($#+&Y^`ri3^3|_~c9CyH5o}Q1C&;JxJw;q$dk} z$T97qlpq)l@qX`hnz$YAqRPlgbADMRtR>%s^9;;*Y#eUEADwTMmCY~2b zwXh+TB7@&-Ohm=96dpgOm8`|h2fuo8F&3}zi_}HS<`|&j+|tfV=(UjdR$hoKJrbF}FEXjr zHTcW$CHQmj_+49rUxr_RpN22N$^il|@B%OJGAq0A+wiOKb@)a2Iry9G;SKm}@R#9B z@aNzocptt6zXiVm-+*txufQ+C&%@8aPr@s_!YjPOE4;!V@Oi=K5uf{f7WvFNK7#k* zTku=(8}R160lfmf1U(Nu13iiVUHEPIRd^1?^dkHm{7v{9@Ymok!jm5Oi0!)1b}h19v$LE{cptt6zXiVm-+&);d}J4X z8-5kO4!;OL2S4Wc;I}1f@XPQE@YC=m_;CSh=`Q>>{3?7Mo=EE)4|Z~ZS{lLo@GbZ) z_zif1GbTVS-XUwqGO~b7BPC>9fO@^2bh}-7{`|Q-d-hD8Jb5AyA3l^uqahC-Jdl-@ z6}fx&t}HDr$?e;>Wqy8MZr!>iGcz-C{rYv8oSc-47ca{B^XKKvnKKgYtNi%G5AI#Z zBHbSwWIcqB4Ox|z!`_K{|G1q2P4dZo36mt&BpV1NjC;1@sUGvgK&2#w0=4!teP530 zg;ei}29B4)zVWtDa}bKDw(_286orv#6t}ic(oZ$hnUcO!vmy06o!pwXuU}{S!4zA9 z*gMm`XFcAfyce6BBAe}0tlzY;>^<8yHk)Vf*$c?$NPZs)ch||K#yb`ZFIU%4({+3F zf80k*6e;FU?X)-RRl7_^3Xd=>cK?jnJ=60`h_2m3)oMI+fbLbQYLqL4xDrgIQ4gj(9b7Hw;ImUYV8KZ{sYaWFJAXYrK=kvSd)nNoBllE>@^s+sY!1A3 z^XsXoE!Bv~Bv+aLVL=ZHo*obgi>5Y_J>>7A9zEw-K5=@u@-&y=Hf7^iH4W!mGC2JHm+ITneUii+hzKYiQZ-byZ16RAXcoY1J98R?JzHQvU;2Hv@yHgl zVa_!k{JkIy;$bS9da&f!Z5EMf<&E$)nW>jrwc}nzIL6eV)Iyi$* OaxyikA#Efn>i+=gSQ_2{ literal 0 HcmV?d00001 diff --git a/Installer/Res/Install.vbs b/Installer/Res/Install.vbs new file mode 100644 index 0000000..e7028e2 --- /dev/null +++ b/Installer/Res/Install.vbs @@ -0,0 +1,338 @@ +'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Decal Installer Library <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +Option Explicit + + +'FSO Constants +Private Const WindowsFolder = 0 +Private Const SystemFolder = 1 +Private Const TemporaryFolder = 2 + +'WindowsInstaller Constants +Private Const msiInstallStateUnknown = -1 +Private Const msiInstallStateAbsent = 2 +Private Const msiUILevelFull = 5 + +'Minimum versions +Private Const MIN_WSH_VERSION = "5.1" +Private Const MIN_WI_VERSION = "1.11.2405.0" + +'Global Objects +Private WshShell, WI, FSO, AllProducts +'prevent premature errors if objects don't exist +On Error Resume Next +Set WshShell = WScript.CreateObject("WScript.Shell") 'needed for reg access and file execution +Set WI = CreateObject("WindowsInstaller.Installer") 'the MSI related functions need this object +Set FSO = CreateObject("Scripting.FileSystemObject") 'can never have too many of these around +Set AllProducts = CreateObject("Scripting.Dictionary") 'All of the product IDs that this should remove before installing +On Error GoTo 0 +'Now make sure we got them all +'There is some error checking deeper in, but I've seen a lot of errors so I'm not removing any of it :) +If Not IsObject(WshShell) Then + MsgBox "Internal error creating Windows Scripting Host object (WshShell). Please make sure you have IE6+ installed", _ + vbOKOnly, _ + "Decal Installer Library" + WScript.Quit +End If +If Not IsObject(FSO) Then + MsgBox "Internal error creating Windows Scripting Host object (FSO). Please make sure you have IE6+ installed", _ + vbOKOnly, _ + "Decal Installer Library" + WScript.Quit +End If +If Not IsObject(AllProducts) Then + MsgBox "Internal error creating Windows Scripting Host object (Dictionary). Please make sure you have IE6+ installed", _ + vbOKOnly, _ + "Decal Installer Library" + WScript.Quit +End If +If Not IsObject(WI) Then + MsgBox "Internal error creating Windows Installer object. Please make sure you have Windows Installer installed", _ + vbOKOnly, _ + "Decal Installer Library" + WScript.Quit +End If + +'YOU MUST EDIT THESE FOR YOUR PARTICULAR INSTALLER!!!!!! + +'All of these -must- be specified +Private Const ThisProduct = "Decal" ' The name of your product, used it dialogs and such +Private Const ThisVersion = "2.6.0.1" ' The version of your product, used in dialogs and such +Private Const MSIFileName = "Decal.msi" ' The name of the MSI file that will be excuted +'Add all of your previous product IDs to the dictionary for removal by the installer +AllProducts.Add "1.0.1.0", "{4AFA7857-D10F-4A74-A504-9C10320A6DB9}" +AllProducts.Add "1.0.2.0", "{840FA8EC-CA4D-46BE-94E6-2C85F4E29EDD}" +AllProducts.Add "1.0.2.2", "{DBBE8C7F-F27D-48D7-BBC1-5BFA30485980}" +AllProducts.Add "1.1.0.0", "{DFB254B2-F9B4-42F1-8B16-C045B18C8DBE}" +AllProducts.Add "2.0.0.0 RC1", "{3CFF0D79-376D-4557-8376-A9B48E50F775}" +AllProducts.Add "2.0.0.0 RC2", "{701F72C7-421E-4DBE-B8C7-0A8B5258D539}" +AllProducts.Add "2.0.0.0 RC3 ", "{D6E309A7-290D-48E0-9992-0DAB18EA4CE4}" +AllProducts.Add "2.0.0.0 RC4", "{3C2F8BE2-2B35-402F-9BAE-F9FDCA9C22A9}" +AllProducts.Add "2.0.0.0", "{F7DC5688-E3A0-432B-A5DF-F7CB4B02DE03}" +AllProducts.Add "2.1.0.2", "{6C6B886C-66E0-41C9-AF1A-1B02372D5E77}" +AllProducts.Add "2.1.0.4", "{83CE1E0E-E441-4764-A3CC-DBF1A53C40F0}" +AllProducts.Add "2.1.0.5", "{B388C87C-F59D-457F-A839-B6F3A2642CE7}" +AllProducts.Add "2.2.0.0", "{9FB34BE5-A2A3-4509-8A21-133FC27387F7}" +AllProducts.Add "2.2.0.1", "{BE7BB776-FE47-41B7-AACE-1F958A7CE214}" +AllProducts.Add "2.2.2.0", "{92A0F954-9A9D-4FCC-B874-F0A8DBD8BF1B}" +AllProducts.Add "2.2.3.0", "{775AB855-075F-462B-A482-D555569E2C03}" +AllProducts.Add "2.2.4.0", "{0C844C18-2021-4660-AD25-7922653E1A16}" +AllProducts.Add "2.3.0.0", "{DE512CE7-2417-41E5-9C7F-5C091F171785}" +AllProducts.Add "2.3.1.0", "{660E1D69-140D-437E-9D23-9137DA6F0162}" +AllProducts.Add "2.3.1.1", "{A0ACDD8E-3730-4007-926A-55D7B1A5A7B7}" +AllProducts.Add "2.3.1.2", "{E6E77F45-0B35-4F92-9CD3-4B70A821158D}" +AllProducts.Add "2.3.1.3", "{92872CC7-2722-4534-81BE-E99B4D472A95}" +AllProducts.Add "2.3.1.4", "{8186889F-BF27-4F79-9D94-4DD7CB9956F2}" +AllProducts.Add "2.3.1.5", "{09A9F4AE-C043-43CF-85D1-6F14BCAAEB11}" +AllProducts.Add "2.3.1.6", "{A6749A61-B1E5-4FFB-BA4D-AE93E5443EC8}" +AllProducts.Add "2.3.1.7", "{C667B179-E270-4BE5-9C73-0533C1D2B758}" +AllProducts.Add "2.3.1.8", "{88947320-85FC-4327-908D-7801365AD4D9}" +AllProducts.Add "2.3.1.9", "{1CF52690-D209-47C7-97EF-F38D64463AD5}" +AllProducts.Add "2.4.0.0", "{4D7BE8B5-6B0A-4135-8C75-BE8E4BB2E351}" +AllProducts.Add "2.4.1.0", "{E6E9AB9D-812C-40D7-A57C-ED298B48557F}" +AllProducts.Add "2.4.1.2", "{09C6E670-D686-11D6-BFDA-009027B6A4F1}" +AllProducts.Add "2.4.1.3", "{E62F700A-E214-11D6-B2DA-009027B6A4F1}" +AllProducts.Add "2.5.0.0 RC1", "{940240A5-39C7-496A-B2FB-21D87220FCFE}" +AllProducts.Add "2.5.0.0 RC2", "{F685D7CA-12EB-11D7-B2DA-009027B6A4F1}" +AllProducts.Add "2.5.0.0 RC3", "{F15D5960-13C9-11D7-B2DA-009027B6A4F1}" +AllProducts.Add "2.5.0.1 RC1", "{B5B0E8D6-FE22-467C-B09E-1AB5CC837942}" +AllProducts.Add "2.5.0.1", "{CE4276BF-04AE-41C9-B7C2-3DD65B4DAEDD}" +AllProducts.Add "2.5.0.2", "{F794642A-63D5-11D7-B2DA-009027B6A4F1}" +AllProducts.Add "2.5.0.4", "{29E8FB17-4C4E-4F5D-8C5D-F3826ECE2CF6}" +AllProducts.Add "2.5.0.5", "{35012CC1-DC9F-49C3-9593-2B246AE68D3A}" +AllProducts.Add "2.5.2.0 RC1", "{ED4744B7-3F12-453B-9908-D192E0F5477A}" +AllProducts.Add "2.5.2.0 RC2", "{3EA7A26F-9112-45D4-BDE0-9BE451D42A9F}" +AllProducts.Add "2.5.2.0 RC3", "{B04617E3-2AFF-4650-84AF-10BE73B22A15}" +AllProducts.Add "2.6.0.0 RC1", "{6E766A51-09A9-4571-B55A-EE2E4E74B8BC}" +AllProducts.Add "2.6.0.0 RC2", "{4C22590F-22B8-4413-B91D-0403B2F84979}" +AllProducts.Add "2.6.0.0 RC3", "{E86FBB39-9061-475A-B575-F8F9AC12DB74}" +AllProducts.Add "2.6.0.0 RC4", "{16673809-CA94-4E31-9E0B-B2FCA0CBDFAB}" +AllProducts.Add "2.6.0.0 RC5", "{67E0D07C-8A6A-4357-B44F-CCA1A513DFE7}" +AllProducts.Add "2.6.0.0", "{B0DC3DCD-44BD-47C7-AB9D-CC68FB63F4C3}" +AllProducts.Add "2.6.0.1", "{32767F66-7F62-4C0B-81F7-C42B4C7C0148}" + + +' These are optional +' The features they provide will be ignored if they are left as empty strings +Private Const PathRegValue = "HKLM\SOFTWARE\Decal\Agent\AgentPath" ' Path to a registry key containing the install location of your product +Private Const FavoriteName = "Decal Homepage" ' Name of the Favorite to add at the end of the install +Private Const FavoriteURL = "http://decaldev.sourceforge.net/" ' URL for the Favorite to point to +Private Const FavoriteIconFile = "Denagent.exe" ' File to get the icon for the favorite from (default IE icon if blank) +Private Const FavoriteIconID = "0" ' Icon ID to use from the above file (default IE icon if blank) + +' END OF EDITABLE OPTIONS + +Private Function IsVersionAgreeable(pActualVersion, pMinumumVersion) + Dim actual, expected, i + IsVersionAgreeable = True + 'msgbox "pActualVersion: " & pActualVersion & vbCRLF & "pMinumumVersion: " & pMinumumVersion + actual = split (pActualVersion, ".") + expected = split (pMinumumVersion, ".") + + For i = 0 To UBound(expected) + 'msgbox cstr(i & " : " & actual(i) & " : " & expected(i)) + If CInt(actual(i)) > CInt(expected(i)) Then + 'msgbox("greater") + Exit For + ElseIf CInt(actual(i)) < CInt(expected(i)) Then + 'msgbox("less") + IsVersionAgreeable = False + Exit For + End If + Next +End Function + +Private Sub WSHVersionCheck() + 'Function: Check the Windows Scripting Host version, give URL for updating if not good enough, + ' then kill the script. + 'Args: N/A + 'Returns: N/A + ' + 'Requirements: WshShell = WScript.Shell + ' + Dim actualVersion, rc + + On Error Resume Next + actualVersion = WScript.Version + On Error GoTo 0 + + 'Bail here if things are ok + If IsVersionAgreeable(actualVersion, MIN_WSH_VERSION) Then Exit Sub + + 'Didn't bail, so need to prompt for an upgrade + rc = MsgBox ("The " & ThisProduct & " Installer has determined that you do not have a new enough version of Windows Scripting Host to use this installer." & _ + String(2, vbCRLF) & _ + "The newest version is available with Windows Scripting Host 5.6 which you can download at: " & _ + String(2, vbCRLF) & _ + "http://download.microsoft.com/download/winscript56/Install/5.6/W9XNT4Me/EN-US/scr56en.exe" & _ + String(2, vbCRLF) & _ + "Would you like to go there now?", _ + vbYesNo + vbQuestion, _ + ThisProduct & " Installer") + If rc = vbYes Then WshShell.Run "http://download.microsoft.com/download/winscript56/Install/5.6/W9XNT4Me/EN-US/scr56en.exe" + WScript.Quit +End Sub + +Private Sub WIVersionCheck() + 'Function: Check the windows installer version, give URL for updating if not good enough, + ' then kill the script. + 'Args: N/A + 'Returns: N/A + ' + 'Requirements: WI = WindowsInstaller.Installer + ' WshShell = WScript.Shell + + Dim actualVersion, rc, fileInSysFolder, fileInWinFolder, windowsVersion, strURL, strFailMsg + + On Error Resume Next + actualVersion = WI.Version + On Error GoTo 0 + + 'Bail here if things are ok + If IsVersionAgreeable(actualVersion, MIN_WI_VERSION) Then Exit Sub + + 'Didn't bail, so need to prompt for an upgrade + With FSO + fileInSysFolder = .BuildPath(.GetSpecialFolder(SystemFolder), "winver.exe") + fileInWinFolder = .BuildPath(.GetSpecialFolder(WindowsFolder), "winver.exe") + If .FileExists(fileInSysFolder) Then + windowsVersion = split(.GetFileVersion(fileInSysFolder),".") + ElseIf .FileExists(fileInWinFolder) Then + windowsVersion = split(.GetFileVersion(fileInWinFolder),".") + Else + rc = MsgBox("The Decal Installer was unable to determine your Windows version. Are you using Windows 2000 or Windows XP?", _ + vbYesNo + vbQuestion, _ + ThisProduct & " Installer") + If rc = vbYes Then + windowsVersion = split("5.0.0.0", ".") + ElseIf rc = vbNo Then + windowsVersion = split("4.0.0.0", ".") + Else + MsgBox "An unknown error occured in Windows Version detection. Please make sure you have Windows Installer properly installed and try again.", _ + vbOKOnly, _ + ThisProduct & " Installer" + WScript.Quit + End If + End If + End With 'With FSO + + If CInt(windowsVersion(1)) < 5 Then + strURL = "http://www.microsoft.com/downloads/release.asp?releaseid=32831" + strFailMsg = "Windows 98/ME users can upgrade at: " & strURL + Else 'If work(0) < 5 Then + strURL = "http://www.microsoft.com/downloads/release.asp?releaseid=32832" + strFailMsg = "Windows 2000 users can upgrade at: " & strURL + End If 'If work(0) < 5 Then + + rc = MsgBox ("The " & ThisProduct & " Installer has determined that you do not have a new enough version of Windows Installer to use this installer. " & _ + String(2,vbCRLF) & _ + strFailMsg & _ + String(2,vbCRLF) & _ + "Would you like to go there now?", _ + vbYesNo + vbQuestion, _ + ThisProduct & " Installer") + If rc = vbYes Then + 'open the browser and exit + WshShell.Run strURL + End If + WScript.Quit +End Sub + +Private Sub WipeProduct(pProdID) + 'Function: Check for the product ID. If it exists, silently and forcefully uninstall. + ' + 'Args: pProdID = a string of the MSI Product ID to be wiped + 'Returns: N/A + ' + 'Requirements: WI = WindowsInstaller.Installer + + Dim rc + + rc = WI.ProductState(pProdID) + 'FIXME + 'something about this check is not as precise as it should be. Need to find info + 'about different install states and find ways to handle them all + 'TEMP FIX ONLY + On Error Resume Next + 'END OF TEMP FIX + If rc <> msiInstallStateUnknown Then + 'remove it + WI.ConfigureProduct pProdID, 0, msiInstallStateAbsent 'second param is ignored + End If +End Sub + +' VERSION CHECKING +WSHVersionCheck +WIVersionCheck + +'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End of Decal Installer Library <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +'>>>>>>>>>>>>>>>>>>>>>>>>>>>START SCRIPT<<<<<<<<<<<<<<<<<<<<<<<< + + + + +'variables +Dim retval, strProductFolder, strProp, strUninstaller, strPathToFavIcon, TXT, i, ProductsToRemove + +'make sure they really want to do this +retval = MsgBox("You are about to remove all old " & ThisProduct & " versions and install " & ThisProduct & " v" & ThisVersion & " ", _ + vbOkCancel + vbQuestion, _ + ThisProduct &" Installer") + +If retval = vbCancel Then WScript.Quit + +'Before starting, lookup and store the Decal path if it exists +On Error Resume Next 'will fail if not found, leaving an empty string +strDecalFolder = WshShell.RegRead(PathRegValue) +On Error GoTo 0 + +'>>>>>>>>>>>>>>>UNINSTALLING OLD VERSIONS<<<<<<<<<<<<<<<<< + +'Remove MSIs by product code +ProductsToRemove = AllProducts.Items +For i = 0 To UBound(ProductsToRemove) + WipeProduct ProductsToRemove(i) +Next + + +'>>>>>>>>>>>>>>>>>>>>INSTALLING PDODUCT<<<<<<<<<<<<<<<<<<<<<<<<<< +'install .msi with remembered install path if it exists + +strProp = "DISABLEADVTSHORTCUTS=True" +If Len(strProductFolder) > 0 Then strProp = strProp & " TARGETDIR=""" & strProductFolder & """" +WI.UILevel = msiUILevelFull +On Error Resume Next +WI.InstallProduct MSIFileName, strProp +On Error GoTo 0 +If Err.Number <> 0 Then WScript.Quit +'The old command line: +'WshShell.Run "msiexec /i Decal.msi " & strProp + +'Favorites icon? +If Len(FavoriteName) > 0 And Len(FavoriteURL) > 0 Then + strPathToFavIcon = FSO.BuildPath(WshShell.SpecialFolders("Favorites"), FavoriteName & ".url") + 'is is there already? + If Not FSO.FileExists(strPathToFavIcon) Then + retval = MsgBox("Would you like a shortcut to the " & ThisProduct & " Homepage placed in your Favorites menu?", _ + vbYesNo + vbQuestion, _ + ThisProduct & " Installer") + If retval = vbYes Then + + Set TXT = FSO.CreateTextFile(strPathToFavIcon) + TXT.WriteLine "[InternetShortcut]" + TXT.WriteLine "URL=" & FavoriteURL + On Error Resume Next + strProductFolder = WshShell.RegRead(PathRegValue) + On Error GoTo 0 + If Len(FavoriteIconFile) > 0 And Len(FavoriteIconID) > 0 And Len(strProductFolder) > 0 Then + TXT.WriteLine "IconFile=" & FSO.BuildPath(strProductFolder, FavoriteIconFile) + TXT.WriteLine "IconIndex=" & FavoriteIconID + End If + TXT.Close + End If + End If +End If + +MsgBox ThisProduct & " Installation Completed", _ + vbOkOnly + vbInformation, _ + ThisProduct & " Installer" diff --git a/Installer/Res/decalbar.jpg b/Installer/Res/decalbar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1c163a326ab940d6e1349937a2d43f028bc797b GIT binary patch literal 3987 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

g9WiGX<6?{*>$?)I_&i0rjaq$GfUh25m^Qb zE_Irti}1_~o(Z<(AK@pAlX1 zSFM-$krtR}?&7A6v~E^!yv&@NM^{%dOT=rRRB8=;ixQ?};UJlXmysrVKP^A0!X5CZ zHXI%9|6tld?g2~rD?`u~PU|jT+pWuLK7Bnz&VZ<8aTi?b4xfvh4?Tx_E z`r14JwyeaN6zf3&a73??henTBX2&OeiF^0x6~x%e0N*0?MZo1)E~>qmDx;TUag@Hk zm_tA#0;WpI2W8z$`(q{WR0#CNN{*_4CBFK)KhfLfly)!uz=|?(a@7m>ADXb0*(Uoy zie|pfo`2}-2!wN)gjD(0K%P+Mv~-E`P0ddXSoS^JfWL%9ak)1 z7g))vCE~GYPHCbg?<2pZ6}-JxZ2BS5ReRWLs^U4KOj75hRTx#v)i8QKt?H?OzEJaI zd2?e1{?e+g-ljU0O~TL+@ltxKfZTml!Xd#$I8Io(w(yN~q@1i1N> zbby#^zta4-q=D|U_P6|PDs!);eJg)qBENE=CwG7(Uzlw<`rj^)ynWLH>gx4>cxqnx z4F9(A?^*smPrpCd8qC-j+};{=Zwx+XG(NGhJ_vqxjW2f6#+Ob4Tnr_0z<*HiMltQxv+7&b=l zTP}>L%8ceKlOT|^$aii=ohw;gZ&i2Ysjd=e!jQK4vNP=?Y+-j`PE~gxfJ@(}WH-Zb zeNT5f=*HcPT(N=%QL>EJ=UES5$bJ$26Bf_Wx20Et`)r45O)xD73UXLr4^Y_DW!c9{ z2FtjZmr-SXh?+25L`zH@AMTk5pG7%vVaU7Yt^g7}*x$YM=t2Glk9Lh&v?J(vM=@ns zT$6+!3I(k4cg?L;nI&iYKV>{lt%>d2Ng1_^D{g(sAf&EXYTnG&6yR2ZK$}L;#O{Kx z5eU%*(y&j^Ut$X=h2#2i_fpF`b0ptV?};^b2^j*P>C~|UO)*`H1V8v%Tpn?DZ`_Lh zb9b<-YpG?E43VXY2)I=RYZGKq(6T?4jboNdKGe0eFOmOSiHP6_vhV0}uAR(0j5acg z#u5twJ9t)oR(1=#9Nn3c2QHjtGqAFB_H&IfD>{e^*csI0394-{s)!kW3EjbhpC z+{TSWqTn4<-*yhM%Mx8Qo^Yb0`9k3@5355Ix)2Hp86TaL0%v?I>IyEzRSXhbabbr= z*M1e>DJ-yrj2p`u4!x^UqO!NeIDvModB?k>HJuBrFVZUw#^Jv^Y0X2v4UPGIYoPj}3Y7{8J72Pr`OX*q_t> zwITI1M6psg?Ix#ux3*;mp?~eA%TD!DqGx2K{I7au@ySNyghuGsyJ5`d40nj$m&VpB zgJZ1`Zmf{qk)|}^#iqk>Bf!}xcZ4MbTh_WREn0oO7G1!D@Q)x#taCUeeb`S#H=RM| zaHb$n2s;iY#Vcx5waD*zY}uQ^=3EKwV)dc(<7?~#6PXfX(^TTI?#s02WeZVX`}n14 z{&zzwxzW6APmybFL^kbYcW9ASsv7QK3g%RJw@e-7tLpi6H~cX_tA(=H7Qz zx@D)FqnX$SIl3x6iKlP##5Ghzx&whRYN`@%kfrPCTux74;xOE^`xTwA#cKC6D3E%?czD{bS|%i`-bN5A}WWt zs=f{&)pV9@@8@rK^#CLxBKp{7xldR>WK)lAmSfUtm0)4Rvm)t!PDJhi!+=9He}++s z@*YK$qKsL%5KXQmEs}Px@F(rv2#H2F7jir%ifY=rsc@jSBFK2PGCbZl)2mc7ZgX0w&t1B1Yj5;xAGFK}c45eyo=f zO^&LVi8k9)HuDAa1LCwomYVVrI4o9Uyb!E?3xN%~5{>Q}b4HPXZE2C2FS@uG$IThf zAxtx8{KA-Fi_!kN3@O^MuoR3x(N7owUq$IL!hgx;OlCJ8VQ#!nCWxHeY31-gq2rq_ z;{qfi&WmeISG{;!2#rIi=?@MyYVb<+87-*gD52)NN~k%Cx)eIG+Pl#x0DSl=D(%i+ z)s?@ZE4BNa?iRVfpGLgcJrzFZV4$Jv50X}wRH?Vm0JEkWaOvsL$%I!ItS}><@0As;0! zLWZD&kCGF!!1(3maeQ%%5F&|-notUBrhwPMPDw%z9|xNQ^B;2r#^G`Nb&SQ*kPk#Q z?Ut|OxT7_(?IJbg7LSsMEl*@2P$iG-B^A%92~5_1)}NccihItm{v0TmqQZMO!!O7Z~CG;!U74bqAFg^O5(%8dfR| zp>gPs+q2^5&`x z+h6Jo4#L87^u9SvARU{)R@)A5j~Nunf7^+7lQip6rnjQj6g|*IGgRxe$Zcoxj<21{ zDEKlJyr;kTB))*)U^68d9>5Y&xj${xL?J&Y^{Vk6=5WK(al^JxD(Ua>0%mO%-V9Uq zi!MyJH-E-+&t$ZUP&X~*AbGp1_j8$~Xl$?z<(X$f*QT)=&;_MEGUEZ7!7FI|8btW+ zo@;Hk4N^ZQ(dLW|?A?P34>r@!uibH0yQb1=dBPB7xplTC3v z@T>!jb{O&djFQ9J@9|XIsjyi5`w$=sU)|riepL3WxPgi7tCwSOh%5UbSMO9#0~DIo z#*Wld+r0f4pMa>VIs0voc1 zZifCnP1!Ut$1AnXuYbr~uxV{uZv7S!wGk?}Dk#LtxtPhf*g#v=NVQ^Wsw!d%rt%A9 z9R`_D+X9+1RKJpDAu)R)%poqDxN%V{K!&4ii zYiyzt1%A?P(vm|}jybjQE1h;Je(}{Z)!e|}JAbZvv_z;lmXd=np@V1Hu(%)A+1<^1 z%zd0SY{P8Gb!Z57BTry;&M#J%+r)s?<<8LreL!-Dtg?9|Qj_ zH(pd#E3y#sH?!rkNF#<0Ue`>?^N{?J^%@b*jTi*C@vGFKI|+a+2Y`Vvz9RLMse~+o z81=A3!s78f=6aFOcCet+;}aHAx!GkbRp(%<)FSg|##v^kjXGhKag{YzS|;{Je>Ptg z%dykFfPMBG!KIV2%i&F&0qRZSQy@_{qb6KFu_R=6%cmgS(;E+Qh@C?T6H(vFeb(l& z?5|v3{AehAgXo^I{9(A>X8@_esb@OkPLBGHhaxyCB_=ukT4mLJPt^1`X>6sK@n^i2{vh)H(z_SLy--Pbd7GFYfGVhL@_4Ek3Fq%%b{E@hOhTyk_Y zZ%pc_a%8q{O6h}VvTbN)1}{`34z_ zjggc-I4=SJ-qlB2gP%s)_D1D76Xg}sS@hEnF)3rwK2#;_dT{5ZvcQJ1#3f!lw~S3ec^x?6;q(Fg8$?Bj-Ta_@okJS> z4!&ybPxs2F^VS}R9pfaC(CSYL&^3O9Pk zI=S$m(K?btSug?&Uvu91TI9!f!YE6na7wFtqgK=k_D6SMK$m`oui8p#WIxqtkyqTj zyfLnpTC;exn@G!A-DKcWLvCqW>02-$^AnwF^A@}v> zyd_$sROO>V8R|V+w29j}C^;;?3XGwjCI_JJHPJYg5Qe^W&+3 z-p93V`?n6XsHD&*J%1-n@0(LAlfXh{o@KXKi~Qh@6vxA2&eEBZ`65$_o{4RgEdKWT zjOOJKckcM!K*}g{jATMZp`~3?dk+gQ1>IhbpU0S8H7MfFVs6c)y4-^gN#5ABE`3%! zyfS)lZ=tItG~etfRvfyv&nfc+Wz0ctYN0dP5r4}Qn}A1QqOcDdv%*=;^Id@g{kXH? z$@p|>8OI#CmQ{13()Y~is2f<+yImi2h7a~U%sa{5-20l`ac52;Gs8*bLtER?{fDD- z9}l=8rV~ToY(6$KlvHHyi`|~oIxau*diYrOE8qtv^`fKjM|uTsb!ALQxkxNF&VGU# za4$)DbGp>lJH6E#P=z|FD7H2!bbgg}9{K4^gFEaMlJgbwwbrEkjmfjIj~zft@BE^5 zEUzA6?xjHQ&bX?{DrFG$$x^99pG5a((QbN{rMVcsKu6uQ+8u0f)~J!3C4APOazVA(8_9p|2Vb`5H3;baxs|&3X zU_<)&hE8Z)nMtn86Q|BWp5)ZolR!T8E&Vg%acbrq`LkWO95RX8S>E-X#Jg@g^{&@s^Ykr!O^ejYSH#1w{d0v(yYtG+ zeM`}~t0jv~Buhq^YqX|Rz0HseeDzU9|0Cu`<;nk#LH`8c&0n$`6YbsusD1 zC{eN2XWqx$NXEo$=7R)MRs&)X=%{lp>L@FFsEq*xJ-y1Dc|R=_*cX3CT{4G?9QpCL zYyg-0si`wXvdUn{*!+r^8s9nQ-q2X*i#5LV@G<-6Q*)+#X?b~h_TKUXgMre@@^WKN z)--Ce{Jo(m6&9j<{1GiC(i{3ld3lBSdCwwO{4E)*CDaQ@kKB@eCOy_6$mxq0cc>{P zAJp3tpT3WVP|Eg(BZ(N=AHL%ZA!04Wtg?jgN=#){9^V z@rh?v6(z`jx8x5F6)%4HG3s1w%=|4swvJne`A+Y{y4tE7;qi4}sqbIhnIe0aj1}Ha z6(yaH##R^{JpIIpD&y=uG#x>+bis+Q;P#WTGesh$hz-#NvCP=3V>xt-|Fck&;63`D zcuvmvoloOYO?{(CI zd|_W9RSXjWCWd=*JpKh5ou^F?b#VW*8{PP&Lkc&?>_Y1O#cPxJaZd_*Mt9l15QCoX zTRiyb+OG&VZzw5nid-8e--L$W=T&5#zAy8O4k6hTC1<|;oRDghUcw?#QEPMQBlBe} z7l;m}W4u7;{y(I>3w#vS*}%QYZeWF#S#Z&)vBnx(>Y_!#zN8D902?9_*btL|62KPH zG_@^i7EzOsu-TYl*r2tw+EOo#ZK?Gwv|7N+OA@ezix)0x6QMOKtut=apb>(`?Dv1p zY`FCDe((4Devq9rXU?2+=3Jih+@Emj$er>IMnu>lP+-T%?Mc53uA;QkMRJ>Yq)?9sCY>|F?mvyxJK%2*(D}?ThgQqj;b(YD=K1vI3BBLqi6_ESVt&~ z8<+K}k^v2(tF*$2vb6a!#mYOP`(TcXBgA~y#AD@wz2$oB068nJi=kht89PzG7f){9 zrXQz?#8lF5(yx~WOgKe0%%>e$IVR?Ai5(Q5FU28 z=tz@a;rF5kAt1Af+ljjckN9yrXbIZ*XWI%H+a`iHUN*mjmu;{VnJNz)Eg`aC&+@n; zV}dM_rPNcgmOe4kOGvkjr<{I`v};Q?-h#2!F-(k-;iR#{#b#^9vK5@CJ4CeMERMON zHrDnSB@HwBfz~kV*RcFXiVHY`q2A%bg;lBX#Yrz#2-s$4`SjUQ^ub&Sr}-%FE!Ocv ziC7@%{jHD~LTrRbg9*-$nczq3e*F`6)`7{ziN#t&J8208p6>w=>G?=FChMW`dT4?k znk4){M!8o;Ig}W*Cnb|nMJb2RvuU}Ep;7)0C6wtIeiLz0l#>%bCSg&^jS;wYtima= zJ11w_w28apACzC>wz(_yJ@ZE*CJ~HKEM}947H&(K7Tf(?QHeU;(0pW=W6{GbY6kZ) zwh<@8@fG7^d1!%Dk13D55R_+-9J_fp|E>>tsF53f)6N~i>*e|jVJU>L8~iF1TQuCv zUVzm|i?Y_el4OgR>Bd|ahRjUvidvMB?pTt>*-}QF2DFHoZq*O6r%KVP^6aTnrfL!T zcQ+-wS7^3?3=j478db;r3{lH=zN%dM2 z0cKbi#CzJ!^ho!0@!7Jo3|xGnE481f2YtpK)&zP}6JOyvahJGO0#La3TO+rZ8okf) zy2EhARf#W@+Z>b2SSTJCaG&d zQF1z*j-uy<{|G2^%L=f0?1Udw;R~oYnn@Y67P_}3orQrxHKiYyBuX>G6KQg5*Se5e zCmy3B<>_`OTyJsQn_iJAtL>eEL1B;KZ>wb~9iMmzI9dk^Z6lm5Vxvr8(gscl$Io?6 z)Yn0|%omtj<>=t&vNFvB%$xbL{9FOi*&+tf^3D|AF+ZZH4WAQZ8vt`HmtK_`*T}9;ywOrc=?a%*akE@*`mVHZa^%hK9QmFLEj^*az49a z61f<_9YVk7qAWU9c~e4J#1B2`K7^*w*i4>urOER%L?0hVemhxvy`7G0$EZ=dmd;rMR zB7P1k4Yv?$G8Rka z1u@5}kRP)-`9ih4u*6)Ie4$icpmcR9;7dFvRLGC{DYsJn94S2qZvny1%DIWZWS4bn z4U@i((46@k&lNsvXF@rKFwRylzRj>1XUmY`XIr^oAaXD~vT5{2D*S>2Sifiq#9c?) zQho)zbfi^~YHMpFbt|d5x;j$JNin#js#HqyR!R!!-jP-+IUFHsW#S2IsTbz>EO_AS#Tw5_&&CeeKxa?8{A*Zd^TG%7aSr++dzBsS)CkNRt$9l{_YZ z351mnDCbN?=1ZupOi6@`v0fGZ;(eT%$HnSAb>dEK^Io~Oi^}mU{OmVJ!u5td8}mh_ z&FIxy^k?4#LAsHEo_liI-;r2uEWwfcb-Mt965@oVy8uHQ6uDS_r4dBXrhC^?Z&Xk%X?I$y!<9C_YsR!bFCtLNk%EL?U z>_rF_;Qt;!bm5`;cjKuUm)Gx5NsD`*veRJa` zmGg}H-Ku_HQ@_%4+ux7gyi0PL_wg$dZny2LCo(miPX^(YB6*uCFA;rds=Va7{i4&T4baX}6-z0dq&NgACOqk4 zcpuKh8_F8~i1`W?DaEQSvQ7uj&tWrGdSi{9d`PHcm^foGf6g>8$a%i(G&x$UuE}_QLhwCjGe(u0I;K}Ix4ZzO=P;Y=vZ!S3}#+|4U^;2sK{l_iPV58 z+mHsU*67^;wocTDaF#wuaJ?*^8tR9v78rr z#kzoDW2@@BbKqI4h!#$9m_sZU1 ztmiEh{Jdg`ETMg}Jg+m+3wevdRAYPw-7&n1iT1({`AnwS z1{6b(_kV|~4+(??s($=a(RO@HSK!4cctUTM6=4)_@bA+flm%e~pYpfsjj|Au5cS}! z(;@0Gj_o0c`mFuLhNvGvHR+B2-yrJ8ADsbFVYzLU$@wMO>KqbRo4C102n$2!B+;Ii z&X_vPKT%2nhDT)N=Ae7kB(NY;MhB2AN>-6MlM<2g$#T>r_r1O2+226#BHL*aF4Xl! zct*#Ql1Cj&Zh_&K#Z#{MJWT=rVfNHx>MN%wHQdbk4)B*1E3HgKcT7BdCYy-WX5hD! zqkvWy+wIXd5iP0O&=tE!Ij4;STI}@8WsgEfo*RsnrDl(T z(%?UR45Y7cQ@Uk-Qa@DmZOanYvP_Qo6C9-~97fOqcCdLqCFmS4OqLh+e*pVs>Wx4W zNBA7Y9Ggt~)RZRD&8*^O3(%LU93kjCE2cPVf?oXaHe?ut{iF0Z9 z9CN5l;98)8NCQQP~*kuEbJ8(wIcj#l}bHTS0*;g z$$(oYe$DrTk|{Cw{`dz0Ettlm4a1-b7?gCK!MQ3IXU6|4ePAValVcZpF zmBg0!2d-YEt)AE>B9Q_7_ZaT%{DE4hoHH@L- zA4_+%*4%MMVI~2ItELSah3@h^ZOcx>x0-6OIj)l)Y+&k7>_N6QEi=;HR_R9I=HHGb zymd8N;nc>(?1i6>@8D6fJF;T;ECi|hYI94NcrPi7=eqJbXTfQJah2~^dGoLIHy26u6+O=7+{QiKZt-kI# zRj=WWm@dPM>-$XcA~g(O5e2xXz$Eet3Iu+-gb&kVSCa;+ti7Bo5Dvd94OdDMP5Vdf z5?(2B2#+c%+j|32JT3ZFxxvxJd^~v*q8gQQBjX$lsExZ^##wkILFd(9RiBftG>O^!|GHJ5|HIH|84i8g z@}YsUfyB9ZL0 z;$7D7xdy^ukaxmVv)1q<4!HWQhe-K%iRZ2^oKw7N{egR<_(dygG@tRT>}LnA{A7TM zh7#-!JB^vXoxyWb*A$#%9i+}kL1w~wee4kQar@gNW=4CzQ=Q^STLUYwb-C}iXgD2cLto>W3K%6Zl?f6dnD=}Q{SE( z3HeyJHS?TAq9d3oeYIxM6*Mb=@EK+g_=oj^^sU1m?6tnf_CYz?%9CyMioc-Gnw{KG z#x%7Q@$R2Lo~3vtyH?`m-L977JoC4p>?}u7@SYM-oSkd9;Db1}={#EK6}Z@IUCwA6 zQy>iu(Tpnrm>U4v$KSN{Oxly)=cgMXj)vQ8*gSR<6W)%?GPI7b*Yl?&KS{B02+-*% zkCcybl$3*^IS6i%H^cPYAWrJbD`Y4<9eMe$e>x2anLJ2_>UIbIxR8NZq}_Wn&c?OY zkVhXK$w>zihepu>`zG0xs1+2m)vOcG@&#&1$~csFH)Tsw&OrwaYHS8mM z>et@MW$hkTC3=kzAuJGd^%RQawV#F3f<=H+RNFLy&67%O72=kMB$CunYqEnqT1Bi5Y` z_ZY?Ldebwq%3)_TZBlu9(^jr!I3KL|#jxp)iUVg)M4w6BB zs><*8t9-T1kpb7YOYKHV#D=r`^wHp2ryfc(|NKxu7zB_b2#hL8c=GW+FEIEs&i^Tc+`e zA637@?ft`Iw`H~u4#O_azti|U2MraMyjF~trPur?tS#x(yB)BOXS!f7I!MJw^x{rb z2O|aDiO5cQH75sdTP!zOvA>f#nL%nhn&S`qtWDIQwg#{^>$)ibEjL5QF~o49_IpC&bVVxIc;?lgZd2k~I07TYkLKDvI=y{*)7 zsq0VOt>_$_g%dIcOxAnVj|A_q{&Fsb!ml}ZI}>`r5iD8oUyx~hrfvKjH+Ifr&Os+O zF5JlzC%%!wS$4|nd=-~cu}O=yjUPMlL|EW;VwqduJNOTRYsEZsjT$PG7sc^XrgJaV z@bEq7?t|~>#aVd3I{1z?70`q|uT|({F{6vQ?gwPx+U~GZLJk6W@i^C$QsYet4mfL$ z5E<4gr+^XeF=_{#?Z>7iQjGio+$|W_8WZ$_zVKMUVr<6nl>L}9k{G2DeRa#ub40%H zbw%Q?1dhWNBDS&}()J?GMdQ~JcXi-;vIoTyL!204j2{YBrdGO8&MYzSgjQshm_SVO z-K-Kxl_ZKitRLn9k82y>GInYkgNOY)jIv%Q8eBcc-)jHIFlT%Fd+6@#_<(I5$61XJ zBkM&lo0F|!cuk8#t);5gBuW~sMcOV-Hh4yBw#9;A$f9Ott>tHbcYG>f+NHdHu3g@o z=6H^!nnScz5y?8*j6HJiEs0GUO=#eY_IK}pKm19cebI`Y{`S}mM@=k&P*pXm&*&?b*{MTEAEN;9>mRwQT$Sa$16Tyd&62F+@q}%2a$OV zo^z{?s#~0nIrMOw@dnnbJbjf87-hWkB`sR6>~$D`$bNMe5VN$~a1lWCuwZ@^f;R>5IVTAkmXrpEmXmpj^2)<@@%d2H>t##(OL~vhra33L(Bx`z>sN21O z3z+uY^0S(Rx`3FltymQR0$%y2aenPGrrjv~n@MhC+I$cOcWLY{mp)lI%CX!5)*YeQ zv&)UuPcY7l%k|t;K{SfWvnSV%GSc<)p`{`gp~vp{;O6)nM*c!Q|5hV^X*|U8lM^Yw z3aU>ZVdSqgipO!q#o!6h-1SrzIROvk0hzr}z8<>K2!-S<&_naXH9V?%8XNDb-y8W$ zRE-sKLg@L+t8S54T1}7fTKV;Kdt`yHTyK)TVTBjnT{{iZvZ#bWTi7p_8s{6Eq@=M` z&J;aki*dnFh8!h~Yh=5N>_nZEN)&j)FDpJx7G0X5x-{FW;HXNDm)k!rU5(eRL*upl zjPdgQ@8h+~d2{^88AJAd`~$IHBDm61N=hBR3TIUSvqZ3)IK|!NfnnO}qs+RPN45@6 zgz@MSJ}grHJIBdOi1!^y3sbe(GnBtdpMXOGS+dM+565}~!u@b{@?!UO->%JaI#r z!u&@*asj0S``8ogwL3}#KTR#iiwW>tYi;~B#rJnR_lXAVU4Ig|5^ zeMa7F$aeL`pE=)jZpW;-pr7M5BE2!EDC-s-WWVS4X>O;v?zS*2i%{CiIMSlGl6~Z0FPp4F^=YeaC*Bb?j;5a-t z_h2`soHtQYRIw)na=^2HO0Vz@oHrw~%)^0%h4O6K19|y+Fw4jbF|sW93FQI4sKBko z#J^&Bc1rEFAUi-TyjZ&;!7P`4K0_1^jza0UA z@Kbk=;PeRZwvLGcf5B_$6#|Ilh{3pV3cvl%UGcwGCKL~2934pVHsa^Oa#;6Um*~l< zXC9sj|AqIgACWDdGrWR_$~BfJCfp&jeHa6u=XMLY2LK^w1mr9P_l2U0MiG1^Gy6aU z<78`VZC@)*fonpk=EKN>QC#IQ%-AbCwRD%vm3|aK8}=c zlL;ysS=KGC#(hqstP?P$HEc#E$CnY)3dagpyucW+iuz+sk}AaYG7??+j@~Z`AnG>{ zCGX>0V{?aTtto*{ZS64n$gUWHi(_rwiOcBlvX@{{r5ii2f^Y90Mj)h!nThU-@@(%V z2dooc_v|i!cQ;5N+)|eOj4MJd+Uor|4<+CUbVa6E} z?2|?s{>B+_s+&fDUdHQ(2nBP9P{64_%#$PW7N#3t$I;(0p#s3P*2Tl1-rh|G$lQcH zTY$_$Gn7m%QGPijZ>c$jJn@&S=T%^?D{9n19J3~&O%lAMQ$~Pv!31`+0xEbVFIlP= z`;3w$_+&LoDxi1X1r2-xHaVT`)1xvLzexcZh6wAhenBe9jNwRv8I#)|aB8cU z1LK7m1GACr6t0|#!i?b#%h4q~4n%BL%QDi!YAKUEI4Z)5QP0=e&x7(D;&m!lB2%vB zyN%9ry}5xzEYAaZhD^(aLzP)B1`Bo!)8==bZ;Vh+9Ev}4KHlTxJ&MBSyWSHk@y!!9 zpzl1t?|cL90zzbjVjc~i+Pp&ZN0dcu3V(Lgi>%LMvmQ zJ%%T?RXAPwRj09yLc89W#ylt4MoOXx0L1g!RuOjM7*ad~WxmAL>ephI$@PTRe34u` zwb)p>c4^ILb2W||JG70*aVcG?;Q(?g?PmshYldO?l^Z{H@V$fYmY7enP(w;d^IYO^OeN*0e#JIHTsw{R-rnyy z`Hlyg^>}Ce)ku40A9!M_9KkQDCUg3*Xtf9|*1c>Ji>J z+w0t^Y&T2Rh&tv7s^CVVTWZ{u6(e%NdD`l)KS2$n;b#^h)77>-I*Fp{+7q?59#w@Hg^ zs!Q@drnmZn33~3Ns`Khvg%OY%hNt_i`d}@3fHLJqZiS3tLm8i3J{8AXGu_bGLP)}x zcHL*Q*M%%NeQMmNPYs;>wLky6$WH5}Vl^XUf0dk(D>-SI6njekD`RL%t{}w|`I0cN za#S)ev?9}@MV}J=WdJ!@LkXrW2c|P9EPSBhGzJ+*xi{)hNf^t@i%Z3zNK(A zUptelIoH33UJG+XqVjBoGE~uez*k<31^2<>O6RYQzpcVj!wmX0T!Saz85Y05n3?CZ zr9r*p;M(zVQvr_WMfUQzkmOGrFzXv=AS_p z1vw9zf&@2jz&~lo+@vzI=oH@Eox2QQY(5OX%3<^U+aW~2f!4KNDV1~R_r`qR@Z%f* zi1UDdkFj6d$bWd3ZO6Oxf=uI8ZR6m5a6OOU85eZ9z?UaX&dlR)5%^-b7?X!ht$FMF z0AF~d#>e~V+b7PWPW+Gb?=jbLr}(FtB=;Wd25*?i$7C{qP6iKTKGWG&o?Q%* zcSMVRA6{T~@k<8g-_4(}R_u|K*yo_fF`X_O1rXzfAd|AV(H3@=b?0F`poj2aZzY%FKL5$Zn8{+iUX~(kFI*IR zF{t-Re9guBW^IDA^JlSQwLoQ)a)Au%Al41-_n{xkh$9^<(G zV}A$nIUt@{9qaxK;h?SEBjm#&ZQTV{B2m4WMdS~{!^!mTiMG|G9`A$*Cx*~1M*FjM z9{6kp>DszCX$Z1m-2tvFN=5s_0dSjJU=&0BU%_W;8^vW0obMfhopu2vM2sE?=xHho z^TEV91$S@HbR6%B|J*2{*FF~Blr@p}dIL3XZS4Wbsr~(t?m>(SSG{A+_+l_|L)>>P zn1L@4Hvm;6FJWKcXtfoaE==agvOWiAXncX%{^&uZbLe{~9w?a>*juWto%SBUZdote z|1}3MB*959FUrB2`xXg5@{3Q56FEeuU=wpZ_&+D=POz_P%}`s~+DWP!AjlaIi9wC! z*;VxWyQrYse>9uL7X+bhrmyzaK9bztzR)}@)x$@Wg8{c0>=CqHKI`eVvX{MqV0zWn zK-d8LF1m-)fyGYb8R6psS(PZ1-4{0J0y)F)Csz~kqH2051z|V<6g~xlDb*i-Ki(M# zXRTsX1Ofwq|II3nLz$>W+HjSS7cBdly;9kK7BR@m-fKB2ErmKMY*!24Yrq-o0T3~^ zVbdBZCGK`bx-~Hob!+R}BkjZe?Q06sA=ZR{;63b#QyyofZM6~E z3rQpYUV9E#D4xKaB~{)ecBs^ZT;vy(Ccc4`fmJ_XWrH|LC0m;0#0Rg7-I=W6hg{qpTR*j7;>yde6<^?SDPqT_Se6Nq2H<=hE=75|Pv6@~KU zvy;&NnNeQX6cxa}olc+?!pxj1oEq;8zY%{% z0kRq5im$*UN~@7fgrI0eiZ6ya?yAwD(!vt+dqd{AXAiG(JTdlQl3Ces+{o6@> z3&zcYMgD_=X#N#x8n|x5>s*am-|-HcW9SkdP}}f!LSAm%ZagSDJEG~+JwSLN(D{4+ z$DrmiFVR_R;Dv1FPW*uv;qjJG)VLh>EMUZOKeMXWJMzav`NJ1u`%=^~Kyl)zcypJrIf=;Lm zKvFYQw5Jv*?a%yFX@oDJthqh56o?>R?gN8tGFD#2FRN`mkBt^E=DL;>4L8@eVjhrm_A-7XsYU;QTGhl?fqH~!ls$-p-iC@?M&R{qmLDUO=Vt}Ve4L7 zp8;vqiOs187khi8d-$5V*`QpoTZACY@iB%eV8a)-74fVjhpCax7Q1P9?DpY$sn;lU z>7_n?+v7~zK@otOY3(06BOSohRK2X9v%&cn_y#rZJI3LK2o7Ku+QOKD?L`^qlP5%B zEhSL*B3!EOu6*3`(0PlM3gsMp_@WiC8hLfM9>RsYC&PH#DFD*%g2omKDmEzu~ z1f1R86r$4}kMq9uefF=~2O#rGdN3Xpo<%M;E?XAX2(;cn;5<+zZS^piNYc4EnM!j7 z5J7;GA9G|ByN5IkOQ=n#y*XU@2(95P-WekBvgILU(N$ani!#q3+=e##`%+&?Cb~%t zb@J+)D1~!{II4S2Dd0iD$$gQ}aIH43hp+ASyY8=R9Z#K(5GJ?s@CH<(1`N;r9Jj>u zk|Lh_*i9v&Q0!hN9c!eYK1Fd+*3zQ+@&+Qjx19{BD^Z2^l=w~58djh&cTy#)FASLO z$MJ;#6WpZupe)>|+8QI#cbbRH)fnUVtd>S*e=P_fu+JWEA?7Hk=S|RSCuvbbh)*>I zqTo_aSa-T%)8{Yq;gOnNNA(E2p4U8J?d4uhmcH71tya<B|Yb@Bu4l{Su`4HLA6+b9!%bf`1;a7VUrZG0?i2<~=@T12Jc_eBZ? z%dFI8%=LifvSpxl{k{}qu6v$wo}Hej7Ay2AYc1#n_(m?}jL(}mVb+`EKNBP$0K=-JVV)5BYeHOOZl$a;x zmd}O)V6c#9t=>)TtmPtBa;Y)-R6FB&{b61=I&BPuw!{C8N`$ye5f`9YC1yHYUBqro z;KW1muIxpe%(q;EC;DqSIag^7FVYgHDf4f_b8y5nWVa{v?S=ERtM2XV@Ky(~@m6g= z7WCN)HbdD&?MzEn%!=j-Bs1~<5neSMy2 zCLw)88eToh*$yTy8gtce)8izQDE^`Ng8iQTeu??nUlWNqm?fOTk0f~=&9k0ra^#Sg zRP8t7ex@jp=cySVzod3td>0>OuRb?E!HrSX8@1-IQeB|EdTT96Ej6Xlr6J$nQdBfq zPS-Di^hTTIx130{0p|fM5xyuP)=txAIoXN_*#xYqRbSR(we`}Bw(ff(wTNZ&tD4(& zn1!lF38~BIp9weJjD!QE1r(p|e(PP#Ggav@E<}0}xgZ}=~ zk|NXihOoW`f$xOLVpenO4EjKM`b+#fLguaNv2#ZW)V;Zw8)!BTc%#=D_LlJeDczZ0 z!rY|tXn|A?N>9)ncoz_*H6E*3IP_sp;FIvwqFC{Z^9mEor-V#I!U?07*p*dh8^e#~ z49lsy*y{X_*nL=EeS$~#y})<-?`z}NSbl5Z<2zn3UM(@V`FW&#mF}f1Znt9vFBXcM zaJ$k>Dvk6fs-82nW4XiFfvr+Xv%QWhfI3=VFwVFxC^bxdP9 zw5;D@&1B+4nr#)4U?J7l_(VGgZ)aL;IGyGmK|?}o{)}9Xnu%>|zU7*jSTik6+tM37 zwqi~#%50&M%|Zao3CfQ+D5iJVG;SF2iEMVaUJW59#}QvoB64?ul#1d^Ugaa?p`x) z;vt^pr)XPFXzQMSz{QxZxEXRDZ0-2pB5e?4YnBhL2_?$)(Ih9V38j?lg{hL8x+df# zjb+E^z#CPbRhLbtc;KzuUycJ?a*{xHCVD1xZnb#Hv`Y8^>>LrL!2hF>OUgq-MlP7R zB#m6;EE3(q zrNH)WHzL1w5Ik)kcShq8Zg3)$-P}h4yQ*)~K91^@Tl?i1v2E*_%EWRacrEvs>qrxf zO<;!>P2=@g<5S##sY)%X$c3mV**pgmpeB5WPX1owubaQaAza}%Hc(B-{KZ>hCM}Un z8fJ4c7}L}B#`~zP+?Yr73%=aztZT&z+z2bjO+y7Ex|K z?y!s9AZMQpV=TkzfRJIv^|Lwbf*Fe-yvTL#(cNX+(;XG9qV)TU2c=&XEkHTILqH>( z0a4m@p#kO5Z>+E8>eYW--^2iL$YMDPA*0-i5j~?}H$J(w1$xjv^Z`IX#e;;^E16M5Wj+w@0n zD%7*Zi*SKTiurR`@129!b-}J4Kg9>#SvQHdI#Huo;e)^`F~2Kp zj&~1ok_0`@Ugu|!Eyj-cQYJ|F7)(-;alWk~AR-{+dUpU8K0Gd187txWp!J;N*1`FB zjsIn+3Evi*eSS(TV`XgNIVniy+CNVXz(pdZ zovf`znF<;2ByAn&HMCVm3fx^S`Vw9m1GQPT=f-9xgrkQese=re)cHO2LT1f564jmj z=aczG_WSTyLZoPi@Sds0gF-f!8@tNI7gp2?|ojk5mc6(#oB zWhIWSS6=1iDaL@MUx7ktC+<~ zyf=wM1=W+xK;h)-3;o;kwT-#soM3MB#-E!WQtnd~mQ^?fc4`&g#(&LEayz*Vkj;w` zhb}?AyZuDkrLHw6S#Fd3cr&%DWB-L%>2`$zrCH~)^4W+;YR{+vTS28Iu1} zEPMibX=|tBsEJgXwl1608IdGZ2(bSj!L8oh;#7Ug&dt%HSHOT!mbR4y`W~2X%@w_- zf(*<7_vj_#^pf#<$ppP*QdOEhnuAj>$<#}-tRLnB2NN@`{{e$IX{0viC8VzyspWA6 zQMBr~qP6hqyIl5KSHFYpR_?7A3Z3_RondWf&^(ss<&&BW@B~hpm3-+gO8jTDl2JS! zGAlWUv}h`flvhrgm3X8?Quullht(|WwH8;D09G?AoK6i~Vzr+CgOSOJw*>0jiV40m z6%%Zwgc37LBs~9%5<)XgpQ(iKq{{ghB?Q#olpcbp%n_1>6%1v=rY4Gw&BGW4$0u(* zDlL4gO?jdy#Bf9Qij1)&J?60~-yv#n54wEOw$kb!p2n)&o8(mf56^};m0w$BGhi;^ z`X4xzk5XKC1g@=qlnr20N}^AhL<$P4xG;%1QzErf95wf!;!_GgK-=ujwakAECQSEU zfNbO=l-peMttVxT6!@&mlr|A@;l262#wEDAK*x}=Oq7R232lq{% z>D6cYETbnO0fxa3V*QIT2}7eFV(fhuF6tO3^&z}g{BMF9dtc`a5k1(pe7Mcqtxu?s zne(8_nB(%}XNU7erqaW~0fpL@DGDrd^+kCr=6ODK%9AK z%89u=HhZ)jmDsrev}2yT97tc@#p* zd`iF=PH%@baMl;{53ci#$>yl%$|A#r<+<- zC}Icd%ayxLGxnXpUO=Dvg9Qh2M+Upln zf4)b&LMI&Iuhg&fa&?3+s$Z!H@USoPSvt%GN<}`)3=i9SR%WVW2c@fpuGmJl^{70n z=|xvG{!77Z*Bily3W?L9+(H&WP#~l;&A#6aCLR~Ba}1HyLqYsHS>NNDUG`Mf9_vw3 zI4b%fl*Pnj*86hTW|g*3-yEOrwicZ&0teUwF|t%5mmIt@@T@?k#*?ZbRf@whrB>Vn z91-Vb*Yu6a!D|&;FY$)8gHgh)PeI=)q(vDUQz-PNK#(jyKgoDQ`wL`6c9s?;V?-Ox zO%$(mSob|KXfM?a4#A^FvrK91k@fr*DOc$nLNPg!8h4T9Z+wy8kXa8dC6h^bc!o-% zU5FnKL-{W=np~8L?j|0cs?5;ES6gXfvv^zrvneetVl=}8IHoaw0S)oLy=A|2@{Q(v zS}`l+C1@l>oT3!xg_ac+tu5yni(O9TXvq1JI^@3u)j zM#F?0F4*E-*3SZENlX075a1i1Fet>V{ualMtX0lwpjp2JP5)MmjJp zzrnYMb36pGBCo8kt#;bnyWk$wpN7fG8^w&VKp(#DsHYG)CoJr-9H`Nd|FDTPBV+Oa^eU`G~Y*~sq zO4Y!ueh;-Z7P4QY&ApH?YAM6*VBA^7@!y~hj&_@Wx`>{7{L_VQ@M&A*NVSKVUdCpp zi<*k5vnTMvR(2#jpECvtCZ{MG62${`-y~d%G&()dS^W{MF~RN0HY!u3Vd_RtNG6ep ztNnpaV{gsZ?HBRag5FDDSIxynSNv(-rDftKumU7?a{DFTP*Z7>*WZNrcDrl)KtNo? zFgQk6@N2g_8@qwp3)XnmC}@rMUntmVZXV$#0z9eyhj1orZWV5#p{W$=DIer5l>?&T zmzOiu(G8$0p;jTZ1@#*{i8WW@rnI>zfqVI0i4*Yx1@$ix)Oh0VSRRpZejIy}m$c36 zW54BEzsJGKYk$W*@}Oi%ed@HlxYnzMVb)vP~ zu6$g!`S(eRZ*BAUYMa}Qy?zwjc8k^OPUkLTJF-~kt^k&-Yj3Ce1c*B#Zd}C&d#j)3 zgVqFXwcSB?^%aKePjxUkl*8#lz(^we0Y`598r5G6qC`LO1ftr=;KrZ?fEJbI{Bi)?pikEqJc!9*#rqZ(5$cVL<;JQ7`O zi?U5Ku65_t56b*jua77We0|NpYYdsTzD>VZ)Tq=9z)T(-CxxrGVL%dpwn7kh^QJEb zl;`60ARm<}iWkWk?J_sWro|Oi)#dfq$vlS7%YIa)v}9J{jxAyFao8a6qJ z#wb4RS*PMXyF{P*448oJ0lQ)oNt`{e+ndV;=lc}Ewf>6~hwqlpyEsWpdxApr(~-0I z=2H*27fdD~DoVUd9kzLMtU`2>eU5@1*tEsc_$qQk^uTVpWb; zJr^!?gZ9ro2k{nF9PuohH~ojRQ60Z#sN>^LsSVnna7Iw{p|GE{vl}iAvnDv3b;FsTFhV{- zYdHKSJQL|Z{6gQ*p9!$DJ+sKy06FoyTWVwz9^;B4{1m|ks=3s-IC=<|YI{x0l;rD1 z8pGfy`EWRep6@DFPWbhk7mMQo0od8O9xZxgqb#@_9IoY9Py8_KDp7?>vL1U{}!oiJtAcXi0{1F>A6#NVy*V0Ls@7K8eujf074KzhPA z-~M;&Y`&Xw3Z^Gu+BRFga;*?)KDZSqYj?YxoTbas9i$#UUNaC`W)eyvyBM?rO;zFw zJj7RN&2z#G%@kD>x86a7k-MQeC z-(8X>H&*Same$e>$moJ`!Plk?zQuEL=y! z*^x5^F$*4`M)N8Aw2k|wmFqu!L2|mXSW~L%qog>P?^FB}W7e>8|EyGT)$}$>c{eQ7 zTCdhx=OOjl?f+QYc+_YT+*scvn45k>rqzYK(ynGQ3Q3|5CSQ7tHJP*Dv_9mD)NeV* zcAplV^roFVo-3idt43#UT}xL8fz`l3eI9c;W?HjIijObno0ke#-MQmttKm5@PiR(h zq`;ooHeowx(T`^d)2DeGH*oWwlZ(+Tk|iwew5an2#S+@Co;JR~1wzi|l~}HSFcv$Z z>C%jT+(x{Y<~+XG@F~9?XN^YcH}ODz_#^A;7sT=f9h{`KjL%AeNhvcmiPcb>)a}c?1udPZCdW8Jv#N)yZgZE zplN&ICs{w@C%e{z0;Jr1$Pd1|zJ}udTq~Vlqzl#?KpmhW(u`Pc%ELt^=+pO#Dty@I zln_rSbx#oaqOn6Qw>7Q_YxWNAu6sMB?d{Y9<{B+a`{pj~-n!{7N7L|`(*tGR>eo5O zh3~E8UNfjY6l<(t;JC<$hfGwxML{E4fX#!n5pp3>w6~ObOSIP8QZZ{l za0`NeSZl=?s23YdcuhwPyx8H^WKgu`bH_cE*Nof0Y(NxGtH+2?p}430gtH-Ibd?M5q2fDYf7~|VuI^-l zjA9Qu#cO;Qi1oMgRmbR=0_|%0hgJU)flX{yf1thQDzTQ?MJ-NH)xwlDR~em=cZXMw zSm57#@O_3j^3HW@eAudc9X?H7kN-I~Yk>E@LzeS|>MEeH|DU=l2u982`M7pDi%CNKPjRZY8^);UK+c1?Y zGqtr_23eWKNAQGlpcZza*9qP|dCjAB-^z332KF?iSI2>}&YFEG#ok20Vdh1PF5{J? zzB%x{pg+aB69kyplE!QUmO^|ot4dLsUVjZ#E$(dY@c8d=qj%v9dpOBa-tw4@pe?Z} zTM5>xNi4*0TO`v#XY=A8Bvpx!n+1LGbIT1^X?dV=6Q5f3A*Ta2Q5+j7q7IvmKB{rE ztG->vq5TAiyI&}8Q+GWuEl}*Ke$g8FLxIq-Jl{=nUWG@}z$}cSU)#VJ8bt|eCO~M~D3YSL@pjL+)EXlh*!?~w^ znHxzcSqS=~ZOvR(Z4O2u769716q<_c%t#dUh9Bl!%;toT9g(pu@IcXPF+pbhh(sZe%=dc1 zoOg-)2d~!fb}mDXffT`&=rzWs0yjwa2y8gR_w6V6sqo=qNj^kF+P)YCbGQ`{iAQ2S zXVvu}Z9%%YDhE`f21nrYVy;nq5>93L9<%!b^);7*yv_7fq5Up|q(AKT??o31I{pX? zt|VmM@EIpxhx(46iCR^GFjxrl0c#l8<$jCY(*P8B>>0`U zH9uPOZzcH$ew32g({dN%2eT6vR zEM1F!Uhi~>=`sYexgPdhq^6I(^Afqt0vty{(4jviI-5%<$J2?lohn*5EHHE#A_)lFYkNUzw#?D2jZ6!LIuC+=nOoHJwIJ_Ujv`^~-g# zUnlC6{MS)EUZlXQzGC8J*ICXIJjVA@&T)cYW9* zndSBQ9@i4}yleg>`}$$m{K~>`G3Rt`Cj&uK8JA zX;s`z+}#zL#HOZ-4#(lmK|r3T9GBvNKiq8U`5D|~>iOgJ{PB7|;nb#d{!A+MW5W#7}Etrp*-cqCdO+_M_Jn^I#nE6 z(=)KS;YlV>G6kUx;^}Lgfh9q3yfJ-(9-LrIpQH!TmY=K#CmYkJ=)oz*^c+2yV@%K2 zgZX-RwjOq8-!V>$n&(5s+%W^!5ElR;|11GkcTD`ix`%GCiIREV}7}) zz`RPc|Av%5$xE@lD-MzJf3=%+XXi3@IPue>Eeo7zhZSaO(T7RV1zY(-I&dK!u-OW= zy!P)Fz?4&+xeAck6~uzYTWGx6m67#t`t%>z3)fJ&AUfi$4**wET3g)}be{_Um8Kc* z&8KSzz~echytjnX{08fu?=mEw@|D9pYAM>URmI#->?Au!?N5mt|VDtQ$vN>IrV>;|uRx5vf?zn_tJhKtzP7d=90+vi-r1Xe?N`D z;2<)%rrQ5uq$b@Kjkpot-H3D0xn9s(eXfsRZR0C2gz<6bx#RAb2f_msbwH4)k^3!q zVD#SsrA73lv)1T!-_CQiy$!zLZPHH9b7;m$GWT0EdE>EQj)$$TkXDwu&ul zjlNr`Vrv8!7D9c`I6)RF5_O3>qj&4b%u&eyL^g%p2&nsQ3u6U6<}&XWiTawJtBR)0 zf%d1F#EPsK20XD~Pbe1a1O+q$tfN>|l1M|+J5*}MvqAbm>nPRd;5Ew5UAQ&qFnXoh z5(Hu}fp?=ks{|dD$=E6~c`?M5d4!3OI!pweDmsNysbN2;u+A7W9n~8h^uB6Vpo6LO zR^{gh-dZt*NRGf`OvagRxK}qMjzg7t{JSQ$c@me`|8yy#e;B631Qo2JKIj$QY2CGL zX5jPNU&cgDb`{lpYL!B3ixyc@KtV7`gaCxX`n0sQj#qFyyN}pbqzEbN+^21xku{2x zws8-|#Odd&&JO2sT&)mz((T-(ZT|C`cMJkfx}EX^{Ul*0+i@a9j{Mj;i$}IAXQtPW zACepI@DcSj&5KISgZB<5FvUcg98RylYeF|zS6GYOHR0-=ass8j<8UR{*biw z2(N}PTJ$gpjwI_fu7+w6c{VP2rA2o-EoRXoYvm#?TO}5) zb&jMYIIVS-q$FCcmB10AjbcR;#>Z7(inOP~EZx_XJIHV#TxlvyG$|L0?asO3zbgrq zg#LC`pDmZPRUn=@oGIuyoRExEJAe4;`D&qxd;;M~_B9eqR%=+G5r~A9&GM3!I`+PE zK>m8wdV-j2mzj$^<{e~yB9EoZMQ`$PiRF92A_S}Ga7^AN@l8Czf;_+8SBq@mH4JuSt?_LXmLo-LILJ3iQ}y@Q?JhE&m+~mdJD-;}o>M*8 z?vF?=ru~pr(T%(#J?Z3%Sq4%pW%9?lAqHfhJdvUbXFp&!+(apCcVwA+SynlYy7;*~HuSul$0gLBDA|DpKV&kC#+)1JW(Y?-^?lryLJ&N{YK}EOChfdv($zUP z*0+m<+T1*J*GGNk2D#grJVt>QRt~5X`V=eW(iZ;*O$1g>(4yfSmjj%kbN-~ax{tj$ zLoZCxwH39>B)d5(F-vm{#RuwALKd=%7li;m9 z#KoL4rm_BO=uQL<)=S(0KV21H&fy#H$EPkc2*G;aeX3$XII_P_|9_W8{~Z-qNvZEq zYKMWH9Q!C%d}LlC^B|t5B>;k_ zE%w97`vV)*?1U<{*3mraomDdU$mJtWkW?n zr5+k8RX0>>AiR=#LqH92P;hpM_LKIK5?q=>M~cP}(X8T|gZ4dsI)WlDby(#ruO!Z6RjYKrVzaBPuj|9EvL5;Am7jk38Ay!HQt&6tOADsh}8< zkqLzNpv72~pT*ion?dQ{6mwWi{2==WoWhCU(CiNumR9-}6FG+)QG5S$(er{SXwhDk zkrnu}7X9)DDLC%tDh#+?U3ud>FIu`J&tU_ZHF-QV<}3-ktVO4*a!c_zK%y(})>CxF z3~kMIHgJsus2E6lCL3JLQJ^HmV5D@XT>2Jr~LgUM>0$`(dUQ z{m@S3AO^Ejby`$DYNy!xId+Qr3P~9d2qJCuE|O&-F@wXO z#=H6bD1L-p0!zurg-0&j*<1pT#!$o(o+-*5^9X_2r#`6AJF!jP1(qtCpe{$}C0#kL z&RbkvZJoQjws-FRTYJ}Me|__>oi-KBY=RZ#3EB3nn2h1c8`mFl?yxHedbo)^bHU|b zBw(Q7N8CIbfhEaay-4qV` z-(x;WHS(nCF`fio(V{P(j|Tu%E;F%7*{*H+F^{OQY8s(}0X>Q--NW=rwY`f~kPli@ zUUAeFZZ9U@-HA=A&#%#Eg1YxBmPBIgtpGs$xG08Q!#iJ*BQSB_OME7(kO#SCdC~%5Wl|*a(Sr!H51uz`A zy*7`?Rx{wNOwC~+uk&(N)~_6w3DSt;-76$GoNK@KIG)|M!HMBm)kfQ3s7R)~M0Of^BTjk_L1_m=J})gg_F+Bxot7`BO!h0hA;V zCxaXh6K$(jd+|~)rPV4{MZ7^mlz>n~P@FNS*it=XqJ}~tXk^~++Gi4?PoMwO=l#5| zEt#|T*=L`9_GRt0*ZQrs(g4`(M4z9;S@6Z3X~M^vW5)nt7JLmc|6cXk1ZDGTOjsP@ z;b7v2kEX4OVZo`yT{V{F=v6qkZZJx*JY5FY#$1^xsI;m?a3PbR&K!M~P1tE)mA)(| z{`uL*6ZL8FCvReht%9O{KsuhMGHc?y`K9xj#(ZIT*KXFk88g}WW9_jFcC%PpEaScC zd(otkBn)z_5DlC=ni8Anj1G%cyP~sPLiSRZr@j}3CyEuiqJ@swL|1g8B&7Mty4-Fz6E?UHuL|4i52Ujf26 ztIaDcI6gP~QUXpOj6~vX69h*`%$IS3&KB}n4w>$FX7-A9qIeR>27OgO^Eaba|zD?Rj-vcH^ zU@1&PmI;v~ji<++#*%9*=+(l0%rTQ^1P&9N-Q3PaIl=-mBJJkL(Eb#$pl~J`+!SN= z%cmk*M(UQ)*Pq}CDSCnIFshh!+njanSO4w3w+8PylBKU905>%;?}x9%1T*7JXfUsg zJl${#gm9H`rnr_dn%y*7w)g`ySyn{ScuVOU*b224iAe{i2V~>-XdITfV#NcpLqVN~e&+Iows?*dIoTy;USj3(v8xyjXu*S1a-Bt*(aijy2X5yV1+m z6}!>v))g=M!n&fqnSjRFjj%Y`9uS3=(*s^&P72MYIEt6$97J3T;l)94SFqR<;tOtQ=4s*ikT6C@!sjVWn5g@~H3z19EL#&6mx~8hgnf?esK?*NTWwi zj(LgrSNoG>LMP~e$7YHr;dfr#$saJTcud7h+PeK3Po^pn1y_G;ama zyxT;Z%{Mn)R}onXG|wfEn8#JgKmkil4rr1`6_L_s%?puxA|y3Vw$33-+7zSa_i_&w z$?QJ;n-D!0I(tXKWKYAxHSj~iS|;5MjOSR*fVhZel@H)8oB`UhQps{>;4D2aQCTVP z#FqwQ+ zk~51PS)@x=#Cv^}*l8GPdTUgEck1`-;#XdZJmWFBXA3sH!3gJKQ;=3$Gbx(unrU{9}O0)fIV19lixp*aj%eS~S_rIN@ij*J}N@K&Z z#ZzvRQFl5T#@_DN&hwvioQmZ3 zaj%}8vbt;-03^GL7)cl@04IG~_*&!}ilC_NHq-+*h{cS+_)$_|D4&hEr3Zs5B%fVvO~?NdMUOSDT8tOM`JEXbgVze}czcH;%PVB@tLFV5k|?(09=DJlZ( z#$4^jWzN8P=2cRguNMGNXurl%X8D9Vhh2%s*rhTb@vj|sGopeVy8h&GPcDx3opO(&V*^ z_RzN7w5vnw-h8LFqFr13W|nqsyVjJB!~qyk{9haekG9MF19`)>3D;zczrz(Gs>A*& zTl{9OwHwk@Cul7b=z`;0wU%q7E1pl+ZlDkTf9Zzn+q8XK{_h{8HMN065so0#gJw@$ zH4FNWi3Ng*Iit1wKxRP+-W^1N%FK#5w&GtbIk(VQKxKm9ih8XX<+WziIQ63@l1!2t zwHwp^=cWwpTJ1*gI{(vX3>}Qg%uVoNZeEA^b-N?*!z+X1>GS_pCDIoIlly<$#H#OP zyjxRaIres;ZfCeFG96Ol)>;E(a%wkPJ#g~nI9gJAMK(8uZ%M2lLpJxzg`vwx+>=9c zPPi>DxGZJ}TsfOg=&^fg0uk>e0tK=Lc96TIO>&@{CkMLXxwuXyc!iOM$c%kFr8o;9 z+^K9aeEUiIG{0W#p|P1%;pd;n)_suEzkAUc&C8S$DR?rU(|wX~zoBu(fxj!Pgp$T* zdto|7jRDI+OHj%cdjdIvB|_U0yg*`tit-cX3CC`jKu_~Br2)d%&0#rY$%&;ty{h}D z6+`Brl*QUpe#|nEy<(e?C>{&y(IF-YoyEDbsADP7nk;p)z9rR2(TlSJEhNpwjm##?p;YIuH9hjm+(3kElsBi|~)HbC}NbxG3 zso~NI-=2hH!0+Lr@%d@P0#iV%I=KbnEAY$2^D?Y{Jd7dO{gsTVuo&}s6KmIgh@uXP zYAtz^Q%V4h!v*b2Rx4~ol1YDsCJDb$8EKUhp?NbLd8BnKO*g;V)}H{Kgz@^SemR#` zx$51q&wwaZIU^evP&oEk#YGY@O!Pd zE>jnodaE2bnTfiZuS{0G^+8_34Aom7Q5Q~D5oNGImO5p$k}~Zq=|6=$)e1Bg)hZvmMNpFAhDeXL^5E|3%8EvLcdieh<@u6>hC)B_gVS-mvK_8aAv42;E&v{hGO17 z`r#8~VOeWcO^%9&ya|^vyeq~)OhOx_Eol0M29ye<07}yJRDOfGNQ^V zQWG2@BqbG+BBa7&Q4V>WbLFZ2?$>3h?%;i)o`s-##3~O1;!e9*qv_9x*@mU;_ zN41v2Y077+Gho+gAJDNz=LKmDsUDKop#9t=XH|^w?$qvT^Xj2Tq(%wz-D`R~;X#*9 zl0)qa)DoH?I&rFeo`i~)87bXheu@Y*nb=|OCoxz|o-rnmRZ?|yGl-yf7@OYWWk{UF zvmAyI_TxuV(zUQBo!S$G9{r3*B4FD>(lv(q8*%mNhV+qyKxkxp$og8sNP%2dIrFt?@AEA|OD$=o7IZCA40T z%_9;X@tx2M$@X?}gU#zcbfl;Rq;QVL-hEO=!njXL z5YkdFbVVlp5asHZHF}|2PK(6d>+62FKD|2wRdrxV{BGJjcqEB;R@iM--E&oES&-LG zES8feoDJL@guFgZVgQPJ3hHy~IDP}Ud^K(<9}o4VuXrppp#&bv7W^dwmhZ_LyhsGA z&B8XE#4;UxG2a1zK}jBvB`LPN-X0h8+F6kW*$+1NJWDfWI|*QWREhce9j6}?W#~e~ zS0}`S3AHRz`h?lfLA$x}37HsZ<>-S*a9yO)|0w^7#AJikx`~SNgD-2X>$$-5-C{4W z;ywq83?DSeCj##VO#Ob7!RkcqyG(02n>U3T7b3(Dsb|T$K)rl{QCes2$3=nV*Y82@ z8g^Xkl{R4RxPX7_*sSVU0u=_h{RU3O&5a9zjo6l!!LuynEq~%I^vpzFD$TDjU%|x^ z7LGK*o(L|Gh2jTGR##70?BTo!rfNdo5&6)kfMKakBJ|o^Ig{3%YwM*ytXlSQGt?Mh zqyx{!@8{!q$LsNN^d`!o?lxeBFg1>D?MN|p8N<6jXEg9SfsvwhUJ+U)xZnkxlWa=ExwmQ zFE5~GQHvpY>!XI|o*v#Vv%_5(Y3zOUQ4A-aQQKHZHowF(vbR0@C;^QVrG1HofJ73{ z$i7EsG`}>kcSRx|91VdiVJti%lNUY%mQue+O_Nu$xEq)f2}>zGB%G%dLRtf;P6{SQ z*=QA75_Qj5DaLU}-#_a}asEqc!wkuWslOx-YT+|pWbvpMnlK^OZZDz{$Wvmy*qwBy zEfg`n*4B>+h{K_U@7Vy)YiZ3#Ipsw=Yk(s&KqEWT9515nPpa&sxVVI( z0lPo(c6q%s(v&;L8nOg~1b;sz*jt}o+q~rodT)*xfN0@Q<<1tz^kA>(i0fKtidnu1 zfXXto?$5i5aseuqMSqfQ?CkVi!+UMf((%#Yn5b{8fNG*Y z$%>Yaiw1L|zFeW~4}O5uH-UDldTz`N4DTu$%RLg}46`cWd@tHnMCmb=md3)^8S~AR z$MW`nm5BMqR+h!~E3A&($c^onThpj9{xmNZlC`e6=KxKJrLLaq;{*dzxGGxatPmC& z*wE$d?9no%=pvO%$_QQ)t#Br9pCh+x25z55Dzw~#Ck;=V9Xi$M6>?@Aj5Ox*8!0{T zs5yb2v|bhSl|*Aw4f=tN95Q0Qaf9h6N$2gJ81qdX%=*15GJY`q3n{X#5IomAppiG( zZA9W~`IKLjaYZ>1-!+iPDt}UoQ+oZEQKd(lW_0kqLP`iiJ}8zRA6A*2#^X~ClqaQ+4O2fa=N=RIn! z$P$94`x>;cI65_q4ZQhWUsZFv@UNYrM@Y&vH*U%feblc=fF7KywS?(KIZB-^GeSlP zn0T?u8=_q#?+4@=jq{AjR(DuUoAxeC#dnuDeR-rxhB#;T|KIS#!M zt1c0=&?NceHD{kIG|#K*e4IMfwep%xsFUxraYd$h)CMMmq?F37Nn0dWydE?RFGk7C z4$07(OZUl2%88!sdez4^of}IP)RLOrYW_a@XwWJ5Ka|OnDurUcG0BN4cgCR0tsZk? zeoNjs$tz)kzi+Jp$(t%QOrN7O4Bl-6J4Quxe@VY zF}Lf7G2Oj>bKXDL;~A3RTp9Rl0zX7IPVZK5H`kwdX043&8|*3kn!m|{EC#PJ-e889 z4-!$vnjq$nfI|bqrmLSOv$;d2NvI&THkj6FXMw{tHPp-rz2@JxIS210NZSNtmA5-S zjX9aOEnY7_ZSiSTLQA@zdk+Wj-8Nqg$r*I1JYHe1lJX_vU|@P|^4IMy4nhWElfS;m-XjlwJzZ<5_=j|eNASCm#2MjH>uszHZ(q9f~I31T&nRQJGjPJXHdfZlrmJ)i`omKI-)(#Y5J2up)($QuYu9_xx^+-7&=E7Am$`wj zVQLnS>})t?a>(lkBq_nr2pLdej-o56LLBIuFVJs{Uo}Tqxm{`QR2evCrUtF$F`C-E zEUDBBl3)=gO&3&OTD_`>LCn`Di+4xNcUXRRsmSnhChfilC}t0QVf<&R0;Np~^#sI- zn$1?UpUBccQHOi!S`4s48)Pn_Dc>*YDIP?5i_Meay+X@#(Tl{2vV^rUPkMuWv?yDy zjXv|Mos!Ct6m!G;OeM#to4w|KQUynwzAe_SXO1Rv*ik?4F;>e*avJHcG?#WUf3}-D zjp9KS{k9n>L`E`RinT1&TX;eefEH5i;;*q)V@b zuFbIxTz3{aMEGJjLl4O<8v!Xx`}EZ^h#av}*ou{l_)JK!BTVC+B^3 zU7Nq|VlTo55&T^yf>(jY(6fMS%+a)wv}+*!O(F2X_bef>%Mt>MfZ4#Q4Uoo}+3p#B zFpWy5{X5ZVCv|NewMTsQ%zp=ycoJGZ0F%HdzGVYxv49die+v7_pbq{pHwJX@nbCnm z|9#{t5kcTOtCLU<1VF4=eR=qufxcW#x%wQ_PCF>@gG$gP%2o)wfWcnXQ>0(}lKtvd z5&>`_qN!6sf%XiF4C1q?PM!WlDx_F!XQzDubS^Z-i4h7s>>C@!hDl$Xr7zCbmwWW( zE`2$mi375lEHI1K@{S}*ot5yL_xi!XRGMGd)S?T&B6ocER_aAA!}nVXl@3QbO3c!f(ew?_QO^o%}77B)(5x%Vbc05eq*1Nfxj<< zpPuD{%JNylWABH$%1*bx%h&&I@NjZN7yi@N_inH^nTFO@Nfka0n_S&?ZP93-QS7OZMig}&U3xsWtmiD77iFsWE z$v$)_@)};j(gfKv#oKAGyB3+oHN_kqjJx;s12u3zGd2gC*I4R)GIUI)i^j#ubM&Iz*qkwH!Z1n3Cx>1y z&(x=67`ggluo4bYOcc2}GglStdQ@u})dl;T$x1VCdeT~=CrpsGZWA7c>M-fH<^o_? zw@f$q3MRqTq+ory!v2CQ@HL6O$Tx#{J_Evy0cem|vtqJTsolM~OjpiC5Ce9uln>A3 zpT1634EC`4vMk;2F*8W97Q(IX+AZ0&1c`v-UjoNZCx&_e_n<2bHDx*iDPBk>$O$@( zRY;iFQkTCj#Y?57{q=~WJAJ(ZA2+-3+g|Th!YnqHMxkdoLp_5x4b>`cct>q0LST8t zfSFs7p{&$GeXd30BGX)D;3se=Emm`hQFp*Fd+`4)g zxlLVuU6HNci=fIQ(qh%sp$j<}I1&<+Ph>lIm!#B@poQuph;#=TZ{-}{QLJ;U zH+I&I@baX&i32P5WygI1KjhRTmru&&5=;xC=4I4KZ>QFR^`h4V5^2JKmgqTIOTA;;$dNSR>|9G zX8V4-zDnBAxk|OwJ1ECgt6suwXq))IAJ7gf0!)UB!v$$a^dfDOH!X%T#Mj>?U=3IF zr_eqAI)QjY5TieZQbLG0+s%Vyh&Z4yc#}%cO{P-Zx!sKzOH{A}B3W0H9b_Et812WRR9$D6W@*-rbr8*NTr z@;;uPX1nYka522zEf7p5&PD;u7VOnp=Y513*pK+5D1sk2w=qm{I+!?}`hlp2-1<0e z{ls*%EZUkKlB4`CdGxdyk()dw23j^5-k>ySr}+qgP|Ku2Tq_vELMHsj=?j=m6R~vO zal2``Llw`ff{!E?l1y7<)clQ18*8Rhol!h4389vV!5qzxp}b%w(tul!#~ro_qVUje z`-02J!sAH9;6-p7ih>4vWx`|x$`eZ+mK~kQEcQ{(LaSi`%e5+!mPnn78VO2UVdhXB z+nq&zQZD||B0o!=db((h!S4s1-47Hjbq0F7AETF=dw%O+{qQ0&Sk1b+-dUpy1orU* zwCAc^6%;eCE%M4d#4{+*RdCEd;o4_qe5EFfT+r?CK0lan+LN>bTM) z3-~)<4@)#%eiljID*^d?_cH!=;>TMyD_?J?FG_RhX05fELXq%YQbQw$j|1}B-lnU?wJjEk5?v&GGBv=NiTcmihcm^)5r;+?T;pBp zBNN8S-l45`;EstnHv7KScD(KOS&3bL8?m_%PgS_iZP)-(bG0LXazSHn!()aoic5wR zv9n?q!*SE$1_Q23eJF+}El~Uu=)LA1H+#t-U4E3t4$@^|eFTvciQonivg$VfL=J?* z;L|LlU=d7;++Zgp*?j3Wyec(ja58#+w{U?RiFl~aL*i+8Zi`6Q;NFQz&YTg_ zCE#C0hh5wU<{`x@jgH7h2N$95;K0%z`qHbfl1da29wpWUFyRDS$9&hOsH%xr8!VP& zcr7x#mmKwtmEwKr1ex_Y1#pGFSH^b5D~is_D~%408P;2@Xc{*9Md|&L%oTMjD(fAf zvOb}*(Tkw2ilREcK}9e51{FPbC>8Y#rJ_Ows|Tr|T1s2x+m-cW49_&O1S^PE!DwR- z;0$d&1y|#fjx_ebiHTPBxk)6o);H7%2`hQ5<|+Ay#Nz(o#`1Drv1q9#D@V z)`}PYlYJFJDh_lNGxQCDDV+Zx!4yVTB9IKBn6hW!$`NuRJ`|*PcEZ`2KcnPHjacqv zV9|$9z%1223~Aj+FLjtb?+lX2k3JnrBHh%dNaP%gmmP&$^r5^gG;-!&p^*QwlGvN-a#*-$gLCLpRg)t$VV;lSbm!X=cshZ z7{$13k!Cq@gv6u5>D%l!l*CqrLTiOki%?+ThKFjg+pg^xhdKQ@llX2jdIok4i)xB?R7+|cbd09D6&kVPdk+bQghFK zDrL9GFp9+XHXp~W#|Q;U=E`O1Uuml*amBfh*uzw8z5`ZEh{^7E#Dmvd?T$7s=wLO* z1BD`=i2n?iF5U!QXBGJ& za$mm$wK-$5TG-9w6sL&*D#>HAPL;=?WlrJ;?V;~49Y+l~f(hkg4fRKIA|)Pm{j}T_ zf3a3%8Xm0ev?;p0%>tT_g`;F0aI`&Mg<&ChV79-!-4^lID+sg(;3Xr!axOOP0I5Z~ z$Ea#|l>d#fuPo8RS8>6_>GEX(sxH_Zo$kOiOY%zH`DNLG?;>`uPZ41e8lXNDvIA}$ zOxq^WzDmH99>2N2oqbGXJ-4h!&hs7^= zxp`7G(^MpYVl4=`bBd2)F8=0e0CW*9A+~`b6)#%0vd_O&tlf7 z9hF0j(oX{amR-#nGtL1`uE!sLTy59iIAEwMg%ITJ#=z8-0@1?D3C1dK!YP!QFH3A> zIH6Hq_9`5|wITHh?+%PmSQa8?H@Rz#%}GL{puWmFTkNvO{1z4kD^!IAhbR-ZB2DCE zfi%O3fB-_{EhwI(h40u3(l+f*M0JYpD7N7dx(aJ5)LdJChhTo=21#FG3wrA&0W&gx z{Tm@Rfl2h5Xmv9cR%t-dy8dMf3uXRjH*uo%^rUlptz{`yb*_@C<)k8_cLC#~*L`=0 zZ=lc%f>dUZ&HIG74)qNr;I-{D6qSyzy;RxuHTTSfHi(G6Xy(zCvirdWC-6%8w>F40 zp}G`m3n)u(S)?TJs9B2ZLZOILW+J=VIFD!j_MIj;Lim>2V6jMNrbxHR{ixi!7sr2C z7T`y5W@Pmm%Cmz+Rv+d8v*7pY)+umu&rmI;(yVQnjLEnPh>ronEYhYsn|owC!y86p zgAv2+3YNg1;n%Ywg77eH0x}#obp2L@>4}u!=^{$nuIvpE{?wwlUnpC>xMcY}zKy3s ziPYdfx?>{pK`M&$4s3ylOZkz*fFKQG%KrI|v4HK82YM0l;d4L)c1fGNH9ORKL2}p& z5slhVgd|JPl+u7^Hb{rE2ll=~XQJX2seSCsE?zR*(Zw5QJG;Ct?A;ZrQW42O2;a3r zy^aAJG1m3aVaD_<;t@}_o#ERA7 zNcX*L-ma3)Xd0e9+JvaxtTJ3>QNqppUX>hCQ3wm9`!GIw<6cxsIKA018}evj^Vuw~ z3?38+H687YA`>-n;4H>vrKV^(y=)OXqDX_uLAii_yqb$1Je8}8^wM4ah@qh9Z=$)0 z`F5yw9z?Ma^X)QvC8Y=VoBLJ9TPg`=@=cYDT1nH~OtL^6EB7>>N3^5Hvm?Hj>(Z|( zvO%-=D~=8@QNMWw%niyDI?5cu9?6Uv%TUsf=8LcyMsOcC+l)X3y)E8`q_3T9SNYYw zTKGB{7A!zzHYaTob3}Al8QCbneOqaN2JPxGE?L4W|~M*CQ4ox^PRoR zp`WbRI3=iVjpxX1eY7Gac%5G{aUzw@1{jvthIgj?2l^OGyq=IDvoh(q-~a{``PF?* zJ@`Xiit8zI0F^9I51qX^@kzjNkT1FDk4&_b$QYzif5`UaV`WQ%OPg{09^yA$@BQJsc~80$p9+Ije=U$?-#JDe!oCe z^>g(51r)j<|tvph%=|v8Gxl>>4 z*B5&%HbyVXVe8b3vQdcWMKi?|si=y^RqBgH@1-wxizf3KAySwlsK39JzeRP{3RHT^ zta_&&5*BSX!}W|{4)kXpQGeIU-^F9}XGB`7KeLr&WO?qP$LrH)M_v*L=%L4t6gg4? zo_Y(;DjG0Cduc8I{1lG`MGn9d?{K9rUZ5{th$B_ zcD!;@zJ3_HqE%N)a0Ev~=^{uN0z&+;&!GfeC1%H=FU2lv(NvB?V*QY~45(D@M)nCy z)3U@7>gX$%`9%H%K0ywp0>clS%G@&U5Tq{)%VSQ54Wfw1CYkZ#+O8t8D40qr8Ej@n!qRb|is|W*djv zKXMcVGw>$eDsw3lmOC;t%^8`h5qIOJ!=X4H)?J}b+*86`NMvGH_mO*?ES2cjHeHgu z{+5Ja7|3_5=unN%9p616kZ#*eV$~;< zOF~?&{;zsUFxYg|ktUz?ld&^Uiq%qnscX@tsIm9k3w-p`4;TTfpQa)4-Q;;%X$D-e zOoC0!e0o?ibxp5h#RrP@80dkW-MvJTkjl*Xu{CV5oE{yEP8I&Gj6WV2GWU={gT|>H zuJ?rm-`#%Pd47B7qZI}1kzWanSZf(UGeUjd#k0yInYS7ziCX+Lvgid^j|#JpheUJ~ z_<_vFG<87Zz#_zOxO~8E0xFl3NmB-44|rc7splnqhcZY^2abh#ZC9%J05+gdiR{RD z*f?td9Wv*y85lsLvwqkG(p*1-P{QxPI9?WN>t`4pl3y>}Y+K+0HH;ZwAI8hnD9#3N zLqP`!!sI9_GsHgeS4M35+tr7QQrum!_}j*_w@HWarKcqi_xPy7nxtkj2FDNBriQ~nUI>XeH>5oZUz{tuw z6$|YX{|Pp7&YMYWa(Wj*+U zP-EM$*^$NrhaO)tirxQ!zwRq<5gm+dG-)M)=SEQb*;sLRXt11YND{nV)Td50I2<**A0k^>Mg^p!vw{~+qzj<7W z7r`o*ScT@7z=OV}iny9TRGw&#i6h#Km%7d2_H1bSGXPp)zS z(_{Wl}xLOEh9asQ>ZD2O0N4cLd&GPxKDpc zV~dj~RfsLJv?<(S%3-rIH}}aS)t7?T(itf_`TNd!amby`YAO>arzR~@ z(*PAkKH8Zk$T#zSvO!u~>H{?ZmK9&h8j4$fO5RG7uFV3dcG#>EPEEzo*eSUpEdP)E zln7D(;a%7!iH|vvV$2_GPW0@VIQ6#d8*X2L{gRot(`MV&fdR>9@oNFvD0uc=kZh&a z*TNa?Xvmj=Kad$6@BcFmC4}B4KatBy#*TiSt6ah=ZSsE)(7+h`X51U!;d&p(dzD7h z!u;=RE#v+V>$=ked$ppsHvY;V`@iN*$SDo8Cf@J9H)P`7Nn!xWIOC~-UO0nXH66c! zWR%|OF~6(I$&^c@oNOS+(e(>mI^9YeZ&auQ+4ewEXf{DYnQB=sazfgrwzGGA2L(P{b|e64!H_EAfs9^x%lkPVRTeoh81R;kjj( zL5q|WXk-a7H_|R9A5qK4dWy)^okxqZ5i=wZay8yaFNhqV7wJ2a27)uoe3i(|C`yo! zY&TEi8vzw6C&P!8V~0L*Da>A6EGW`B12T{@%WUG4)rczCls25gQWIwH0>nQG=wE+f zMdF>8LD(EAKX5 zkz9ET&a)_-3T0DEV!(d(%_jyXU@p0G2(+N|bkeu!41q@CiC93#imOOE)MEJ$s+Z={ z(4=2lITBbv$4HaAD;?=ZSFuN6-o+VWQBa(zuzjgD9AG1n2O)3fr8H3nB;#>43zjoM zltF&!tLBS$(E8$;#xj>tkPR_Pulhsn0ds|r&*GU(W}TWrVOGf**!n&-?U0bqa%!Oqabp<&r1E&8 zVYoO~4t<+6f`IrKeuq%E^KbjN$Y!mzopGxi2yP-iNwk)2WF^PLXWE8x?w66YK+A{C zE9eS~F#d`1bvd%KrmT|g!51^-gkWR#u)=v<$xfHkE8#ZANo$d*GGwg2fncULeg|4O zUWWM6`T*ru?K-MX;;m}B>u{he37k(ZVOMg?xzmqf0)b{;}@Qb ztnQ`BkiC{O$Ve60Ezz_it#V;5NtU%+Wv$s6H8bHVBKM0Bg!fG60~F66{xO?1HO9>7 z!tr7gYHU~HR+8g{FX~1>pk!H=(gqz377Rio%gZ~9vqk9LS)3z`usNKPF*Ed74+$)9 z#)2bDdQ%yyQERcu`*xaBZl^WVrkY#mKVEOFRJJDw)mEts$(cm|>Z|0h(J|7tk_4K> z$usqZ4r4mdWPRyO_|)rE7n{3L#sXxv@L4z&ZDd_RUOwhWITf9m$=diUg@??eZ?z20 zqr+#Om`9_&HDn$+Nes-Rsc4DD+7}K4ci|;t? zDdaNkahLoQdI}1?722AQpQNt~OGX!F8aKHKO-}W9^sBt7Mp@Qq0>=~>B*;BLB{tC73Gk?y$OQ&8fCz5F%Yk#T9g7L}_ zMx<|aRC}t%?H_#%+eznS^GW7EsF!n%X=A1*iao>>)?s#YQ>KkKri}+aOf;nZ@lxFJyIO=CIeZK{sWMZpzf2;%3HZ6lMs! z`Wr6C<;0JS8g+OQR5a1U{bnXDqBS%FA4tW-*Bf8NA-cw+-Elqrgg=0Aq9K*mbZ@Q| z=hCVrw8v^my}e5JE!2a{y8jQ9B)G2o)R=GGiFH5emU!&5%2@TYk}Z+Ys^ z;#zx+xsP8-Kftds>$gZf^Q+fjfXSRJ05U!s^@?6SPA{FLmyQkIqX!pu`j!dBF}7fg zWmGTJtE-IaWwGi8eU`h+_nm|> zNK9}?B@#SA_xW)T6PZNM1?TBLq{+N)sxc{CqT}C%C}Zksm*HDzUA<-amRVO(YzO%U zJnFcfLD9bNiLZd3(i!y#C#&?}INj$ZO4;n-Sevy z4oHZ-9rwVeOtB^m$OOV&`?;7dwQyrlL&`VuJq ze-hB|!l7UC_lChQxh4BQ`4Z26_L4#>OA<82<}K$v*6vln9S%1xkQXhBxgPY_JDNtGIW1IzJ1K2TB2G+mpY#w>w!|rcco}FjU%n4+NBOcvzu-eSEy_S&o8RpI^f;Q* z{^-bE?3(*7-O67x&Z+(d_sI~r*yw0MEI2H$E3qU4EzO;u98W~2xyz!ZhlMqJUL-G# zuF&;FM33s}daYBhb+PrVOF3`rk=R+=nm-%^rEPA%lfM#xZJOuJ_<37b6NGJ=2ghh~ zIZ9pHNEhy0Edfn;A6L%*MbLGd3}a$<@IOs?_2yk%eH#*8GBF?`+6_9W#W_tU`mNrc%_Gez8@vLsUln1%`msb?U~3Khi2 zU=)FwA`x8toZ-yj&~~w&!d#qq+n7ozjATEDJjhoB|EOPxelAwHELvDsTN5pu7rWXS zQ}KpkGh9asFYyKoVueF|PZS0+5z-U_0v_;CQK+?)LBk{lh07M5onaYb?2FI9B?%4y zKepyJ8crbx_umX#-6c-VTg)?%q*iAT8-NR=F{|K9t>rDb^f{r;EiZ97XaW8t3A~9b zan!coi53|&Vmg^Jqlr^@)A^P)rkkv13q5S$X88})qN{n$*jVnW_&=SBS%)dD35Iz&d=I=q zTYkZ1esv~;&xJL$pMz7!L41B~4$9503MO%i(t{O zEb6TyaIuwU{bA;xM0@~ol0A^0g#y6*D{2;_FIn3zI|$DNF3VT)2AN~D9?>nX)DOdl zv@XWSHVRkmj^DsF8%>`0b>fJ-DN}5rE4l3MmZ3bDmzfxJh@35bsT|qVSK-o? z5ZDH9RkIIKv>?41o^OW0-heE21I1Rt9*UUg8zHcpp5iP2UxvSa3c}37w8CHij1{87 zU%$YxvSP&{fSq>^gufO*`C$0#V86&QBDp+6!^J`i z^F1bAG6wdq5K{klF|Z?`FU3PZT*wEVAOBL)JI$5n98VBACOnQsjr0zQ?sp@TY>E1L z_o->d!fid9TY1~&8?MUvsDaY#Tj%Sp%83Pg8a{~+lc%svOIA{Iu1cbYwF$57ZNSt( zfuiG+%v2Z+%L_#fjn4v3xNM>LIK-IrcXNnx@YZt(9S$Z#d_VZWYZ~=qDznUGtB^1YodH zh<0pE4splX_ad3UhIom*{O43q(ARil@>$2S`30-wVO){;Ole4@g6Sy!Lk#xMu8Ygn957!{UUA~Cl_pQD6+&*l@E$(N*^4-FECglR%CI;fEI3=c+N6EpkHw-9GXAQ zrZ;887f=ejE3Nek9;B=PK>EaNx?+(qgQCd3;;a*sX%^Rmlc|J6qz0q)R=!Ts41 zVGeHI@o7A(HiR5`k%ermx21}NQbf=@H`7Grz(Wo^V?;SJoDLPK9}7f;?5ICRspL-c z^p9oj1=B?ICL`hP{?|Zv^ia}Px#?B@2ES`*UF6z)645tIAX=6i5vlR;`7nQ-E2X$} zpm2hiHxMepY@wuVWyzY47?*Bk<-^wX`z!0OO6<*V?B~1}0fU?BAylh8txs@s75{NR zbFC;xVr6~|k1a&9B#U?sndS<&B7x!eKvBfEb5BTThLNtU12Wf{*H1W}NU|{t+`&kSCJtjL)o<=BDNU3;YI#bn`IojvCZwApjzXjdKVKI<#ANDP7;|s~X zn_PAS`_|LG2xI4iTxt6ofXEZt8t>HOi4{)P;;PHIf<5lIuYw2W@j$^B+8yVTsjczw zH(!82r*aWbCwfu_P)~i$n4@*ITUm(y0f~FxYc;M?TxN}GgOyERT3$9g#PBZ}RN)S=xtH|BIc5WYd{gxqbx3t8itg}iz z*o%vvT!c`G$(82K%(>7{4zmg5h6<30p^kdv`=WR4b7O!ah)Atv9~m&r8+&FJ<7_X= z_tvL83TDH}UGtC38g7Dw#bS8_2{}m$NZM)G@x|2RHu@t$dB*=}qHNrR6t8V1jy@|O zR=)l;D&X6&$h*2yaV&~mM@`rse+VEo-iFKJ;>^gz;p>TJm~{?mR^KlKM*cw9lR;d?$?1@?>2Gr7bj#Tl3#x;e|iT4|VR zJS{+5%Qa6hb>oPv3pvla3i>#_5Yw0s2aTLz?)~tq1ZKV*(+Gl0rW`>3#4im&C_@pa z;xT!Zc(OBYs_XtU@3IisbarR4m`B*m7x_K`Z3n(B<~ia8&4;rXh-qWX%`PBi@Qex#yVe`n*!>5! zkV>Qpk>W85-7r-)CJwg9lN<6_vG_zXtAuTzmU*;Ywz0sK<-GFZ-memVbH^D>ls-Av zUrkwQ3ahRTF9aL{m1lxK}j!ccA2LJuMrBVG>H-+jRk)VRtRo=u6+M$vx489kyZ z^=jcibD?Ie+7XCsp46J+>h89>9Jwc`z5LnkKzgTds&pFGDq47ID*y@=PC`yfH$Kj? z@dX6IRyxzM!(C zss4g|ckqn0!^+v$w)0(9zGVP2r&gIUl!-l2NQz?uB>~gly+Baq4ro3XN9<6h@fV8k z40=Hes?Q=Dzf12T)@1=RWIXbgRSSzki!8WaM1-F;0RRXpctD z;~Io%{B{b!nZNO8C6j7-jo)(^*)rf$~{i)|a7tm!)bt<+23 z60J{gUt(0h7!e=`JM|t|Y2L2TUOi-rZ1zN|`=DB+R^&DB{K36u-Yem|Q|p!l&MeVd*0Qzpb0jlXT}P>@h{#| zY7B--zg%x}=uKF*xiD_in>-Ko!z36b&itF5f$!(v>!JzzFuLK8J)yW+fX@kSl8#VcXR>>LVZj&&Nj+7IG7%yJ(7*C z#~%qFfD}-xGOrBp!*Cj^f|Wm(H@z}!R9?!X_{u=OQ&P~`aO(Wf%RYH%3@kO@QgZWW z16`4<%slgPad;fKO9C)gxPH1#8l$(I;^K$>rt$ES3+EeaeDbdOp<`oU+$-Ehjq9ho zoixq9%ZmV{oO9u#cL$zV`N&1aUp0`EtWhRgqSzh(4h@{ITg{5!Kte4sOH6z8$4n%} z118n%?+mKh7mO4h`)o_izDG_8P+XxQgw5ubb^2`Ns%{MD5qz9xnm?pA=tQxQEv0t1 zEHe1p7}PsC0fEfxHvFZt*m#a<8aHom^3QUW8x4uPc$gvm0`bg`Fqrfpd71C!yn zr1*wF;8Mtp+j0TVi@yVsOnDB#6Z<=CPljnZ()u)T(kycPmSdUPYQ=^^GqLkqgG(5` zNm${7=6%RwVN2QfY7yveCO^NH*&$w335XpWnP2M(;tS*r^Py23T9ow?7OiJ-=z?zgTt9S(2yuUt6Wml1n&ULhJQgh=>rLOQbbom-$%D_sy;}=vhu6ltMzFS>@ zc(pEWur4^F^?3o;sTcLh5%ul0%%Kj>^Ll!41hccxZ=S~+@$I%fkOB1mUQI|+V5D9n z2GgO}0&;ZK&*}dBp@ky6Y73rKpJnRTs?o}Zb-E0yA8vbCZU#;fl26`9sSwGSp28l& zSbQMUhJIo@qN|2oFZ_XQyMniCnkd4e(te`(td?mPIC*k&hfKqQCU?VuZp^aa1nMDL zy!sy${b@pO8ZGHE>(ve>C+qHisZ~FgRbO6#H_U_PM|0&Z?Ayf<@&{;8rJjK%wBDyz zIr5;rv*+t;Qr}{^O^!IOkR$NwDoDiqg6+YN@JzvpA>6iPRNn6T5wnjT3~kPxug|RB zR}}g(wc+C_%iQygN!9!2>n)9{g6>Z-_{9}S{c!(49v{X|9SO^QJgPyqB@#ES7$iO| zhcJ8#VM|@BgHxHPx3(iR*(|DgpG zX4|Z@F^TZRlNj|Dv%reQ^RV0tjFM3CJId-jNJ$_FQEoHN`Qm+d-f0eE*ZFqb88R=? z!cUOuOqG|*kn8FV-S-PKkK8g5zx8#8O%w`Q7yw2dAQ5lo4`RZIV_k|fe$f@|Id(kL zN|0PFyn;wv@!$5dRa>JQf0FCawcrp6J@FrZgwR7>XTt#YV4VraHX zDv6FXIrP1MEPBJjSk1!tA7aox<>n$g{%cM!(zh>U@#!hS0z=Q{f(biXwgKEahnLmNdnXnNAgFMBU)vuR1k`8P!Eo>J>tH|TU#jT?JP=Czg zT_=3pvPcX#&*sbD`RkTn13Ko+BXfn3;W3dQ%Y-|Lzr&K2r1L||h7HH|u$hu<0^<1N zU_p~ZyRBYfuDk;QcgvE1T8XOa30=re6c{7cG)8*pCq#NJ^(b8(u}fWw&-bLH;bQ@w zc%|0zr!!$J+2ceF=jOrS_U_)~=Zkwk1eBcB?gPdbHPU93SAZD7`OqeLR#=uMd0HOj z@cd?FUR(V+v-OEieWFXB=#Jcy+c|7*MKMvgHZb93qT;q}bFHvXRP3s(cg)_@&oE=G z^9LMSd`LftLrO$5%AWwNxSSEFnchhq2lvI25ZwbErus3|gm5stpXZX^RQNzg=&>hw z8DZ|S`Im#V+9})d#Gg%4l1vwyGwh;pGkAQ2h%f!4G6ou@Hj|P`;#t;O1hT2i&{!h| zvXv@=7loQ!w&3|+d)>3@b&su+A6U%fYc`~MZ7W3>%Xo*jaLO}h{z1JdgQ<~$kseln zIOOD-xH+C0&e|IiiElh{p7q4Zlmcrm@pXi*3@s=8w6tp)XHmA)5q@*^)iBfZ2~u91 zElb-gomwnv`q2i`c56nu#qPsp`D_rc50H&Dqov@aZ1)`X3ajy<1=$W~e1n)0G-Wxo zHBpY{`Ng?NYPc|p#}3pmmXNd}dpOaz@jp|-Z+A4T zLaXF3wqo$!KB}?~WUBi_&c2SVm<4<~-#H-M!9~=7bcba?|A~l)UyiI&0ms$b$__&3 ztOKkBeKk7UO{ccLi?eKpcI#NVdA}6p7P;izmPH0DYq}MT5pWKg_OA8l~)a~*2 zchZ5|6Q_r^xS%+{!}ic`?&OKk{JHpxd4QYBp+@}OC)lM=Tw2{Bwv|a4g=pJHVhb=l z8L`)&Edt<4bjo_r!#EulYarhLl10BY95n^?vpt9t`RiU5s$^k|M$8v~VyDW#!7Y{}v6HhVGG~4pk-T&ZxYrZ*ZgsuCJ!U6Pn9ujpo zY(F#w8PV7y?ZX1g&M$Qrl)8z5Q-V`ISHZDG^Nod*41Wn7W0Z^sxn9~EC@1RfMR=(w z?UjvFG@nZZe`Cx#Jo?SZ_|uKOqu&IrdV8jJ-kCqj9D!FyWMQ-V3kzoTEjo?n7D$xn zw@*E>_08((-feiN#s#5C$XSBKn$CcmKU#Qc7p#~wW0HMeBtFKFDe=1r+6X=wrv>ZfNj6o%hIdn*$zd8Wu}JOa!zc3$>X8$O6;W#$&CQJ z@b~D#G-k+HG&%lUL`aGe**P5{H-V#m2E7-7KXUm>9oceTj>zu;>t%sb1K;6psO93mrs z`4}yHmmq&A=Kjq@rD7}Gjit;T9N*8^L$hS5P&rgQ^0zJ z8X~hc%s?RI>zRyEquYxx#lT~}GcwDR9ubTAHCyFfNI!giV&vT-sm86^`oC&VP4gJR z{!n{*d)#ic1K}fH1+s7Zp+}@?Ry7->noOytnFkZ9rGxE-9SgeRC@t}(NE6NXW{rSG2zlqK zSIJqxm3f-1^_?{*=)Ev$TKJL}-zt2B7QU3rLEB6<0ToMFu9O{G%kK%jRv~hI^G0b9 zY7MRBUh}Puow{od3^> zjWO?1tPC?m)nIvVt=zZ^r@O|NFf@;vpCDbs`MXhwzj%*PXe~`_rBwzo1?1dAz<_b? zEW(HumI$eLHvK4c^Hf{Y*!NO5fUm(sdf&)41~t0vy*W8ug;S+;ZmR7>X6}1Y1r8Mv zJoMeNDireH;==3ifFJqF#9r#Aw)e_&_MN@d=70W#xtyl8mMol)=Bp|LkE?9}Fue#a{oaB%m!?9DyL*k-yN^ORod(n8 zpM)ls6MdWW&0~S{K?WYv)}M?^$ z#?C$aYdYpnkVDF^8M1BdzD$y|Y|f?}xL>XntLB zR)2Gzv`1TCm1vg>qsDEI=^i`gEz^VVV4s2`R+woB7SJ0HKJe}qeQtZ3)IAiwZXyH?&VdD8?GTbS*QOC<|A78c$8jo+_ z2{tNRT7c5f=yP_ilDEnP*M7?fkCB$4c1Y49>rnNnEF?G{PUnC> zXE|q}wFER>#wn*^EbpjG`nFoC$I`3~H-ZtEIM8Yin<{)e7|k6HpSY1yrna1Z-5Q=QL4+MhFs_ z_qX<$Og^;tzV~@wo`=ld`|PvN{@!b^^W!Iza01puIgx`vP6N~nAGwLCBbCR3`ehU zxNTb7zX%yFY({$GTb3Nw53cMTq;$DbFJYf-YCLmFyO_+H``P1KIF}aZ)GpJ)7ZMP+ zg;kw?(M(IyYiC(M{zNWKTKN6TDKVZ3SQEP z-?t~B?Uq>AssaMXN!)6NHkU2_tzzK}*Qg9zC_ujO(-Jf^PmK7}RcdzPwe)h#6RS$J zEho#$mUM@KaW*vyEox@3Y`))!x@!4ix$(s}TIS39dTqJhGRL|$UiKwYHjYuJsPO z!sbZl$XfS^_YCBCRmO#4im`n5Rq$-$EEt$HEN5orcbFk-cD&IIM=U4bt=+c$CO|>k z0w)_sMk@Ku9?Xe?-(j@y*&!a(QghTIUZ8D zATbH?GO5Eta_`sbOApz75PfOKM7{OqeOw1c;d`>&-^BwRf91a;ciqY|h{jnK*K(^9 zHB2@2^Lh@b%3`St>24o{HrI=O8ZO-e!38HsKx7Rf*A{bfD5dYWDt{ugBX|M^=)ec- z$&M{cR>o65|1w6M;9w~YW3qmDxpTt}9~2p1mnG9xcq(!*R~d(_eB`uk2RbLTV+JR1 zK?3IzI9t9SyKy>3FrE?4o#lO%8{$?rM-XWu+jVZRoyCqvoW3drrr?7&#y@z`#W2H0 zd@!-TXPGmbYLJC+ss1QRCso&MiVOZ zmo_O>4;$fWg#eJMv~}0*8Uigr#|g>v2ND#z{x<}a5gz??YiEf9eYD73r^{;PEEn)W z;KT%)%h;i{>+V-W{rI&hJDoi~e}H}mOEJw={lOGdJb7bqOcwj01!G!iOe zcRs9^1ag3cJL>p`gJUm)&F{q#o8N!#oHuVrgutjN!^d2G$Mj5tFp{l9#fq>x&8ghU zQn|Pfy$hvp{T|_`Dt~wX=A+hcDHG=|DH|C8YokQyefD$bTFsLpKou0bN_TdnJ1%7T z7G*<k9QuwN5Tob8ww_=P>{cPl?P* z!n*u`qR%5Q?Bu$epwg}0Sx#p0duvRIEp`bYDDo zlz|;C`mT8HDwP|fYDwdaSK>Ll4mvq;DaSo1l`DS4J;UYigDQ3T`?)=o4nzW;ABH~Y zgSpyk-C5);tBDk)H_b7Y_8U7L^%!F*-g5>bw}@MyM?&rM^%)t$&5bwqFQXcZJ#GN+ zF6Wtk%OremMgB6Xg(^p1BFAKvV^phDj^0F$Y?WiEHO|GSWzaQ%e)^0|W2SHAHpLdX zVyZFIt6wqA0ONf{4c-LxE2bMW)ATFy*i*pIvGv~@B#RV;)NCJIEi9VyS=Upb2JG8JIQH&xYOJ+F%c5|1WU;Z0O z90hu>s&2^RT5C;$9l=R(9*gwbl<(LK$a5(SjTljbRazCp%8g>Y!a7v<2cTC`C5+W< zh^|d?$70tyi}yPx$R%q*{Kl2IYjvv2978D+S=~UoLzUiya?d0`8)?KF<{N+>Y|X^ZO3`!UN!A37?4R5i_-PtX-f1jx5k89 zv7r({PKnymfOUN0_1{d8``UJ^3iInCDUh#l!-gWPX8mOwQL|_i%^z;&1>jLgt>hDq zp<&Fx5;TD@R?_7S2ga>5HDsxN-y6CvZs z0})DF1mPRlGtivFDWd$dUX|!}%n@D2*(Kw&#ma7Tc9pF>0wfnqF$x+eN_3l-7HZ)n zWrayuZiJp&I<>0N1%phPC|jCs{jO8Jy!K*pnFX^(UTnhWk;dT#GYgxjUan$H069&c z6ZW^mn=I#>Lhs=b>TX7r4GRmsv7F_FdM!80Q?fq$B%x<$fUZY$?Tl}3 zii1|$ZXGYPpfAz&%p|4LM_1h6BV<(b#jzVR89L^y!_|lV*Zi%-Sf(YUHTREa%0ToV zTV4g5f*GyGPYgZH$ZKmCAEcKcCQPtXpsvM+ocFUwu2Ph-NMmLR1tb;LHWb0vDH6U8 z+E?&(VA_Vd2ScrsS*6i!e5iDCR;llD?TIc|+3B<8$oE*&Xo(P-TX{ZIKqHs333E}d zfG`x_5Y}n^v6!;CcKF5Et>Z-$p}xyP7sLAyb{8Owll6(p$7tG4A>4p|s+0V$`Ao+a zbndaAxN{hWltp;N)J!MpOwB&)^F`A4eboOWnXvFpWu(D0daX<;2cw_ruwh!4XRoCvpbww3MoZThI)lO!(NX=p^26zL>id?*__vk zG%Ft>)u7L|TYurOg+4n8EfMiEI+8*=?yfk6<|sdWbP2??3`Y26(1p$+J~dD6dFQ}L zXWN^DZztt6xa~LOu=nx;iv^FP8;IRWY|8GQcc<*OXYf?c^l#7y2`gF|6y==FJTi)4 zojL4tt?hL7Q05+ctENtSpPGp5DVR23Vh$S%R|2ZTsVZGL8cfnjzy{Dk}JH9951};DR%fAl~bUWb@1N|qWLwk@HaFw$M z-A1aSM@PAKwtgLf7#On?#SJ8?)t4H-2MEPDTYX)$U9K7N_0Z_A2S$8-9Y7@K>wfih z<`*M-F7smSCx=i+&VtuAs7teJz!kMOE<#=iLU%K2i#zkm0P_xo%ZI|o%z$1p$4N)5t(Vl;^U4t2mteP8z{0!hj>N_%tw2IH z;9Gpzg@El-=5r6aq{EHAQ_A8zqjKtEeca-Mr{|PT2W+-QlKmNrMSrPnJe$jb(8+9p zZ15NI$na+$jCORV*vo1i%SfkO3qE8yz`JAl=8BmMSJ+1p$i?MV_~HpnO=unOpOTYv zgS{=s74>`wzj2@S=Y!16kHv;Wa97W+oTv6dMJ_g;dKI<>P9P)l$(@9g7aO7N{4Uo0 zOTfBaMx|?c==$ekz0PZ2?2~4}WzduD`j z6Ml`dJiA|hp*8@cE|xP~FY(c_g-Lmxc_nXtK0{qUS=B~urv2kfkHj{*QW1rT=^H+C z!5q;siTJx@5ns#f>bYLc-)X{Z!JD!`u+|Gt5$Vi2fkr@SLdR<2Icv`7`9CSc1!l(6SOlQP&VM^5z?>!;HD(&uzdiC9%r-vycGF=+p1dcJ#7f z{-ept)i|y!qv!%TmRGOreTioPazoEOL;#XPYkQtwBnXkEHIWv;8%PjNc%BhKrnOb~ z2ej}%cy5%Yi&c`+jH-iXm0pVBbr~+P%~mqIywhJYiP+*!Kk#_|R%L+i!2-#AJ-ATE zs7bIv4=#zF&@RJ_=qqqb#Q$`8;~exwo+OD)@xO9{uLkO&La@&*-i1i20{5(k9+FS{ z)Ai7kDv+UvWOf+-cKx}B3FsjiQ^Sx%?FmCNwQVz=ld1(KY?S!`z zW4!>o5?m5LFjlC3XK-##OZ5A*T|@o;Bq92plgtzEd)5vHb4iv{;oKF@?UBRII+q~x z`)LlTIBhY+E17)h=xcQx$jPnR-a2%vc0ik-5RY?JCU%b6!3TLVw1Zz!H?)WTUEUu$ zroWDY9Jz_Yz7PsBc&n|HsMX^Euh{e@>$2oWS;fW zd=cH`X>GlyK;Yiwm&^ zr1aY6#Day+r68xaJb-GJ)6|^W8i~}XcB{t8#LlU$H!c!#L2Ij^W;wO<1LJXmil6S% z5+JA(fS?{PtUJaTR-$r-(Kx~OlC{yjpywVY^$^4OKl4m}bt82b{3)~ka~$xF(b|5j3mLR(JN;cgrJaxvCxi~HQj`hUO_gDSdRRPeaTWp-$ye+ph&bk^NzO&` ze5@@vGy)jX#mZe^geHnnhOls@v<;=+it0vBB!9yFbPfmF`xD5PR=q&?@6lew6ay~R z*DfGuR+r=UcDmlu zE4zSrKr;&vd6!|ahtDEoVb{@4>~_QU|H-WH-5R3Q>b0Vt0(6IT0?wdLU+ zo_kR9+)(L0h%_^$pv)|nnrh>u^j-9zPcP9=lyT|d2y-2pq zO(K?t)c+IWfX4aOwhPo%Q_fdWx8QG;)p5ljbb%7f4PaL~=ChA}09yMHz@Zbc?rL}b zg)1u#@xtd4E4N;t2>Wy~`zp-oCy3D`C0}qZl1Ce5B}fowfzvXI3TfD=gy~}w^2R32 zADggnY(o9mgoe=xLgdKaS02ko*r&PzixfR&j6Bj4wKoYQqA@9J3&Itn42Lb&6eyvr z)|$|V6LM>PE#EQT>Ua+%c2?OOmL|rdpP6+*>dHf~^pXNkgEv13qdPhb5_bW)o8OAd z?73u=`FcLAGOkA@bI2yh_F!L~UGY<;^<<<_QOt#my0ZT$n?p~r)46moAl0HGA#x1v zHAySKJFBALQmt+KVNT5TP$$ePv0M{bwVE*7`QO+i4Zp)-k1Ey-%)51!UZ zuokJzG9Ak;Ig?_~>>`XMxLB3fST&2SF?Y+2XH`Zvl@l~9V*)kQ%45|YJk-j?po9;H zIv17(|5aPXTgKtel&AS8Z_7a~C*A@3+hh{(tp^YqSm&GEsOoyFV>fwX)xJ8>?8C$# zekD}A=l#S2{NwrmiTXS$p@^<54XizfIH9T99j6fjOf3k*FZL1?OUGVDwIP#cVM^Zm z@H=XTUnJ=2NU0YC1|sk|hi<6SQ>;`q|G7}XcZA;1Uf!QY4ok!`dBe4*3a%C%UrQ%w8fbrBA?d6 z1|`DbL2mDbb0{M^+l}rHmNv&ErE_N+lav9&L{K z;_<-5;ch!4vMKO&$wsReA)%uI4vWG_iELWSV8kww?ndqh`uj$=eg;9c1;|V<_5#Ps zMc{f#;G|02SUo1HTk+w^?J-^s_SE7Zkqg8E@5tU*;KRq`=-yb6Y7{fP+|yBt!Su$M zr#$*ojk0xn+$q&ybK2JJJKCO(K`!zbWobV1itF z^w#N0DiHeXLo_#8TX)UV@Y{m?(M#*?r&|%!A8~2xwi2*&%Y=Mi2;?KSK@kNv&53Q0 z*OYNM#WA-}fjPj49N8eosWAy?_Y=z9u0?(^%bk=TO*MKd)EHpLRKPs>x%;(syC}k_ zOvP?h7>Ob@Ol_KAjfF>pQS0als~5`fhu_uOuA`9X33n#^GpwnVgbKH^{TH||cRS8X zA{UVcz`EPm&z&(H(`Dd$V>b<2XJEiXKo2CwF0qc2nD=xuc|r8*!J%&)cqyMN27uR@ z_;TgbR}a3kU(7`=>WyxT`g_e9ugQE`WJ%02YdogEKe}k2#P*4UKYw3zQMbgp&9uGI zd31XkEG3yy@BJBSN_FwGv?`W+P>bv!Ngmz!En1&H$8bM+=4KQP+7=UMZWqDykJ`T{ zlN@Toc7A)3I8jMM+9B>5cl%StT_avq#D2J_QKgGsqr=${yZ>?SwOmzHk2~}09tw%i zuls&JYJTZNBdZdV{%r)@4$r!p2WH~C;NqPxGt-sja`ol^RgxF4giqm4zCY3*;uYc# zF^*RecrG9mWe^WZw*ykKe)!g4OhhelA={nwAWXP=YuhME3J- zBAESEaCHeL)ZW4^L?fYe*)=1j^R0vM1VSzIp?k(lzF;$pc-=P$niH^M+#Ws6aRjnA z%CykJxA9pTZ{ag6TAwrcl^lV3Mk#8Q-Y!G}BmVF>4&T;OjLLw~m9^72Vx%9ZpA3KY z%HZczlnPc=iv{`|ise0EreE+T%WFs!S`Q;qQ4j$j!}GvgEAe3>gZ*nhAX8(u&@oEr zsD+URK+K3_LbOxqN{r@c>wZcYG+udZ=^Q%MS}W$JKz;^pLckb#O0DFJ_2qM{r92R> z?m(bcPl-GwY=_vz)}*t^Ug{Gavu&LPHFRE5D`06)R;Q6VO+N`kikH(OcwPuKS{(R+ zi1_8>g2D~`fK5j6BOPQP#7U#euCTc?jI(F)Gh%WMoRyfIFaCbi-LfaxA zT9-p8zU(syit>PJ(>I6=waEgFjws8BOLO_M~%#Y{7f#!!a2 zN=_C=i1@m8f}|PiUQz*%v93!6gyu#Fjob`wsn14?&KnlI2YUvPQ5D={&nH;Ik<<1v z?}(gOh8+68*LGO;5_Lj( zm?~$2uCPDcg$YN$m6UXAf!#_;!gbwazfQ<_yJrHLap;eJj`}Ey|6IXlaBmEK;cEWS z*fIqt*z>e-C$@0-`f{#kd!uHhe65x})`N%a@D}IUr92bgvpngIR_=2;bWH)pP1!c3 zJ>PtAmFiZGxCfmMhQNAot8+T{n-6YxLKbQ5svA;GPRa+jOT=_urJrR)=x2Jh=RCF6 zG7{4uaLR}&u>2SmafUyLzczJwlCyYt1_W%*o)M$J+*I#O=C7*!@~fkZv&~9xblqco zHCmJ@uPYfFw(>DgKOor`Phy8(Cwp8}yw2>4u9J<>tQ^FXS*_{>rq1;zLXJ$?UC`+l zGXnU|MjBz?PS42e@_~or@5=|Cl=taGiYGQ)GSQx2sWuB7oT*=qP+SYY!Lnk@5T1b` z;x|b*vOVjy{m2p+l3Ow8+j^O?s-1MhyAl3TCWpOD4@4}^(Jwz7{T@+2_${@9WVod` zSC!Pfm4eupa{Pn0x+qqd2`LzcA~maa&^XLNxeg){SPjey*ikUm2QB?v_TQ+nV@kVX z9<>bQw)ARuKrtYO9Ii&HGCu++THd-bt-`9KhQ&Q^#1$s2M=n8_fY$?UDB*4rr~<^2 z5Q^51kuBs#TaUxErWV-;s*Z-*ewl>v3}qsGh@!05g($`T8KpbBGgcVJVG_!}=PUk{ zYpK&7gblsrEbHCiS&*-*E^;|Nn|i5rvg;#@Sx~{#H4gkTeqJADBr*+lonY)h4I22d4kdy7yJ?^LxkPXitq}|_OH+f zL8c+}VedPKO#i;agE zwZ3?HrM~Eo;qPtLA(@k1V9Vg;j>S4pEhg;OcWzf*-;gV4g zA601!ql@#RrKx67xeBDc(-AGolO3pNesuA4^<$y44TXIcMoTJ3XrPl-!m#xrh0MDaHjjo zB)aEF556at5lcl^{6EA;*9Kj@-%Ar!!>|xBPgrc#`-f zxf4|yUEA=;M@Csalxj)?j5V$83|za#ZfvlwAxG@SCD!-l_Ziuott(Yfc73Z*J)L7s z=hs*#3^f5IxOq3SY8o-Pp(SpuZEvb12s<#I@D>Rhiv-D3l&YM+7Nvn{;(CgOn7S>< zZ;v+JZ5B3Qv}d;B>K@bvUyCQ1bKR!<9(ic*f7H3<#S!WIPZ`a;9Dzvx!=q4Uj>$;} zkv>3zLZp8}UB}Yi z2uOO{l_UtDoipq71Z)$l?n*v}x^=8)ElkgLXYW>&b=sJQ4PydM+&0v%P)i1sYX)&) zq;pKQWfE3oRff6_WvEYV+bk|?Lw}V6I9Vu9xT$Wd`ChqG2abnD>Ir$=`f4FNlwibB zBs!pSRXMrHk*sL{_%l^e=a&5Alj$*s3$ynzzCO%_*-kW4l&Sba8!j6nm{*f3@|^4L zcJB0dsrXnwxNLqx`;S7qj>IY`pSVJ~3z<;n4RD`V5LL&*;)T2|9GkZGI&JMQu)8f5 zO;Rb)V+n22^S)|ZDU=~S;98NQm_^U_psKrpDR1pzP+X15kJoOyZ@?Q^TR5zX+S>}P8Yv2DI z`ue|#!;+9qFL7u2-+J07{<%f8v_EjRiHvME-7W7UBe70{)KBztIjyH3G4wBB7#wh@ zuI^S{{T>1l>FQ9%!9-Wb6@|_}Dbc2PW!VhRpVx^FwdtnZp*F3Rr9_*)1E5(*lzWK( z|JkO0vgsw-6gc%ix9QkKn+}g{)4UTCZIbGZXw#|@ZTiinLv6~7x9R(!RHaRqtGLKL zXz2eoK;HNOscu(`;Uo+E>2M=n#0)q!^dvbW@}U|L5i~g?azxc0PGz|@naQpD8?

  • +U;WQUlgY7TkTH)K_R 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

    dGpl|WP`%E;Jvip3b!n^Iw(ACT9kcdZ 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%0A;-Rg{J4PhcR7oj9V7g+y}}}U z8XjJMMX$hFtNV<;BRk31$#J5$TJbMonq04`T`RH^^%g6#+b%^0`IKFX3VkOk^mai2 z9W-Ift=WlATA%S0_n>|r*6i-%HdNDtf2Ifri6tb29(0cx}&9sqpd$cgLEN zF$V;=f9ur!RMjP#+qQ!H(o5)#C1)ZgcL)>=XwuxY;~P%#+tRCH?hf)|_Eebv?_QTO29<3zQBSDTBNyd%l7Y`<*0X>qG*ivzq?A@0o#>Yi?h-L z0X=QZv871fv`2rdX;giID+@cgwM~=30pG6Yw-E`peK(594577=fT{ajXr| zG)oJ!hOLc3Ya`e3WAF(7k*#&e*f&9{vGw0Xs?i65^YSTK#qB!rFo}Jqq#9q;i321a zK9w^fiCU^rIWE+|UHVNXQnZhfYwQ%^P?CYo+plREuniCnP1SLE&a%sMt%@Vo;@prH zhajxeRh!U($CxSMP60yI4xXR4zf5b{!chSwz)+}Ce|(Ace4ITA16c2?(L8PLXLM-G&iIZ$?%5yBLag}t$XWg+SZ@jrD|#h+QER_}3` zX|sK;O4jDa92``N@Iv$KD;^*<)EOP?=BUT!vL}6ks;!?f@R6ZXMK9qxgQs=+`>UDx6ei2#letcJR$+ey)D%0 zWcgnqnT<3{7u1wO`PDqT*(xr|%mNq?5(0_fLJVbgLfgcM+ z3lXll^G-OFIa+Ud2R>9OA;xaSK`zuIw%BZq+QiL6b<>|{>Z`IFyrRQ-683zpqr>TV zL;W;IA=u{}!J?BKnZhYX)4ie$xfEi1-ob*rXRXRcbZgAZZZrufwT!EL#^5qCgen`j zj^G3B5>jI4Sj7#=sTi7(P)LGR*{uA%p&9HQFVSp!bltK|m`W_t-nM6enZq!7R|AC%Miun8#s+}N!Q*7IRt7DpNm)%pPETqwl#+%w7WL!$D?CYUXv#993na}OD_tO%=k z4x+>gG@Ge}3tUS-j^Ye%U-RK_K#2F(plp=WUxB{S61C@ESroMiqeU(X)o&tMl&0A6 zEo$pdp$+HuRiugYG_gCMyLn$t={P-IAoMh`4Nnp55WC~_d`*TByYt70-SLtrXA41H zN^m^LQ%#UN&e123?L~bxOU9c)WvkykFXJ)NMJ5b}f3iEtuHmh;xHNH3roAH-L`U&ew=( z8OodF#^et+gPejh=}?e=A|$R8ZXYTxUB7{Hghz~wszEq*rcOQFBgA3{`xe`et@7jB zrd_*60*Q8MP-M0%piswgl+*DOL_mg~bh0Gw7R0OkoDfit68jPdNs6{t)3#c`7}KS} zCR)8756QczAYJa&pHsak?X}%cHRaBTqv?<5KPA|c&S(m-T=hcF3sY2vu%6aL!#%dT zN@cB)FvBzuyTU#%I#!3%Kc^$YJ08d7%Qz6)wQ#omK^nE&@8NG|yPPelb^(X2|AyNI zCcdq2ajXgO{PE`b87AJqYB^)3?UH_DG|5?lBokJYzRGC}8FCwfnk^F@_-70U1w zn#aHZ2<((-&Q93yWkd$V?rp>>2HTGcQWp13T6l+`VA(3Ts@41V=HfUAe<|piO~v7g zr~VEVn-5=NPI+a0_MWYo)fu;75Y&C*Gko;BFNvxuzS`aM4xac7%)iC$Bp|xRTi&f$NL)m&aD!f&pd?hIeTXDC!`y zj1jfhY7eqjAvW7{__f+aMsKy}^0#}^4qOLy7fVWpm~Y~ci33jOXzO&o3L84K6?BPN z_H?cuiOo_nK0hPo6DKr|MUr~*+Kddm!}MdbU8y;kN7VzLb?VfPdT^{1Z!XHbvn0Mp zIw7$|0BBXc8$$zi+ZWyy2Q2}T0%{?e%%W9D*bZl^Y6ZID59Ep83O`2|$HUZ^6F9rV z51lGxDgxzl`+gaVO9Gc|@U|VVvhU!^$$2th#fa~NtG8pmZQ{z>zQdc>G-}6&MU;4x z@6p}jhSjxOR5zb!@uE&})QWjAUWibMZ`&UQJTd$PVhCf!jx6o^z_nbIdrp>B*R{Y8 zgRIHh>l#)wK7%vW<)~X@`N}TNW(~*J1T@A_&5O_h^6knA+EY7NIrh_C1ghEN_CTma z)kPHiSDhU3#Q)$U9Vy3IB&I~)D1h;>U308)PhF$anCk=e<7=c#BW=f*FDFW6%v)Kv zj&Dg6mXB1{t#GobHpvtj-u#RVDbX%}A{!$*BvFA=&)z&IdYh9jfl z$YI~s*XX=v}--5RVTTvr-VM@Gb2mk$n8KeF@%rOTXbdFYO)8GAz!uLyRk2ZdpeWp)Gs z=WHI6M4db)#?X;~>ty(St7)Jq%YMUtI}@0%4SrXK4{PaDfYwRZql@mDfFeSU7a*90U?z}T8)8K^H(!}8@sKI%4xQS#&t zf#FZfniQ8NyD#DPUAH_Jr`D4bt-c?^Vu`}61+aEOh>TK zD7zdPM@BTYOO)#pZBjvMmxt%N*%wz~+kY-yjqgLVNAHvxT-7_vt_4jEcc_A8`qAnNH17kFK zg=%LylgH9oV>445z3Co5rF;CNxzb~=ttp1mkR~7Ss+T^!%&AeenQp{?s5_7@`Is*G zRZ4=V2_2=EfU4kq6>EjfqP<`2o+GQ}$fYe)YQa`ho5QeXQc7nJxox#N3qFuhp8=@ zUH7uCG^8s{eKy_oyLsKy%NM8R%BTuD8E$u{b9|Nebhq~D8cyK4$d0$rg5E?zJ9l~AA)8c!w6(g|NVm5`$o zK2Jh?-`w=v74ddz@m~A&)6bI4Ln5aYPb(+kG@;d_{xJ?p0Nc6d9hW$K<(T}Gnzg0A zHt~R$SbR)noPAUa@X-=H!bjV0_oQxy8Q^REt-MD3IJH1lT6cEtH26uC>WbcBE*HMG zpUYRre@mj!!v$+6M+Pi8Cx)Bh?Jp>(bX3sAPs`4J{F%zad4epdjSZ?$wnl_YnqTdn zgOqz?qnfLeK*wJ7FiC>%aNkqm$9cSO*ZwZW-%iXsTwQF9u0aoJ3Gasj9} zGM>!p8p)a}W>%zm25UH5sZwY+5^l z&tk`Xt@lF6VD-li#v7wBxFLg7-2=B)LZNw7OCG0_P^pzF#-nWh#~NQSSylQ$TkHflT?aChd3@u8pCR&L@>3VcR@OGm_)CS<$QXS`@?R?>hz z;^Tjo^L?_UEh5dgtLdY%U-1#y&vmlLG9wDK9`3rQaGk~`hjGP>a6qR zF`yr3^Jw4I0<<(bEBJf(43|f;B!3Tg*Y2s$g}zmvqNs1zU4qJVF>$DR${VSmL7_>d z)K4aqI(eloCHU;WDHWqsotIv6{!@riFgE9JU8#o5S4i$RI)zlxy?dMY`rK8*$h}v8 z+E?a$c!f7fZPckf>D112>RO%pd^+{V>C~uB?MQs z#r$a1a+n-q><7|#POMIQ)QlH~Q-lA`sM8?p&lU)M2;O{6gQjmk8y;2>^wt1gho|AiC%`j%x7**f1gQ)_`;H!TaM0(wJSOdPhS4cU=8XLgjg3vx~AD0799)$(_ zL-2KI6NAsTkRW&%v43wHvN@Ew+E#oEWsf)@_CMp}cpn8Z(AmoYzIA1@j z)T}Humz2ixov+9+q>cXKpr#e1fb6L3E0`yTaB=FW)pZa#e9R@JC=;B^d(vN5D$Tu8 zS0Fzxq9|1C>8}U^z8o=kz~a)|zfjv9IpGZ}vrne@E^@x@+W~_4nRv4&%bbh44+7c< zVGRj4e~b`^YWQEoEFGZ|W-el}g?dHJVF1v90Iho+RqxD_87m1lFKgV>UyQTK--#8t&XBL0I6wxFF`khw zC|8|d6E;&yqoytO%Glj{lbkXT9y=Ph0{#>A^3g7T%NkUNLV(h+w&#n z;H+=FovIV6J9$3p{$uSE=aH-Rt-zozhaNiZM%D4lWbBS9^ANNQj=mmYcLS%?2$V>ASr+FB)fwUb2C2*;3)dXUNg0Ak( zfZEjU?i{By&Huv??M%Xg-b~yFt456>sv!`S8beff#)WzkRCul+zwA&okt;xozP5Tu zhxD+%OGi;id4N?dE9S{d1e3{|kUNL*c;LLHZ*duy%B<_vDS7CBrRrwII-yNPY|mvP z{l$JEs{Z8|P$}`VDtEBpbbJbs>!|w2pUJ{}L>4A7I0eV17w78R94H6OubsX)@7g98 zL#bLXQLLKj>GI{tncNzk?jvtzkszK``{4WF&B@9XJ2rVeRDqTo)%N3(!ogI%Z?KEY5zS z`Di|LS-ASY-i`~?dZMfU^WjLN6<{rGz+1nyO>@SVHV*F30t|(?{(s=Pci>>O&=!oa z3RE@XcLXx6r3K>spt!-FEXJ;1B(of_t;^+M(*ifrc%Gcv%D5VShsgD|3twc2;^&@K z+z`LP6}#NN6E6YgMI3rJyHF^_wWD|k^3F&T!%uu z(IA=|07knP!il{4PZa*0LcPd*)COAwfQ@)dP_G~-(?0lSql+XmMzJUImWew}ysbqV z>NCo_wai3Ds;-sX1QZ0iu*yfmU^N&!7i}aJ4hqIBy!rLpnD%~_e#;FTv*g>c4dlds zW0NVSXtARB4Oy`pn3q4kujl2HiHIpNAig;uud$2bO=easSdg4~+5&RKAIV=jfg#-S zwT%)Sqqq_OOvMdMOtFa}d~u_681Ana2doo+o!Yptg+zGDa&K?I8{j^>f8KFuFA)a7 z;C}on5rmpkL$T+v3W)VuF(o$jN~*HSycoOXllDf0`#Wu;=l&BPV7Fu&&y(nw-jc#~ zbfbwOlUWziYB6SM=%*bNj}=tHdY&IB0K)`u0ani*_xx&xpXJ^Zz?DO%d9lnf%9#lx zhwtEik0jrz)yT8xf!xE;i-Gat=bOp{#}595n$z{q2*q+lCYU1zKaQ;tPA)<*3>>fng4 zO^z-btwpZb1%yQ(%InHAcGu-*JdY^h>km?|%TSexiWZ59CKex0S&WwBK#li2OE&tt?8Q_}-KVvLHQ< zhGRB<3I{r-!)jUBF`dVSDAaXKUr24qiMi~NYeWVQ7y+rWyJ$iuH zeMs|g{m6fo(TYNv1oa!e*{%rcV1B~=9EZGlA*wHScyz(%BD<7MC0AM!fr z;!jvCfqR%b-`y=hBW(2g5=qWI?uvQ>SeN&o*rc0g(CPUCT6!(!!KWG`&f@0uBD9yX z==@Q8601(subvW#IBO3&>h!heYi*G>48Kd96Zg`5<3A6YBKMJkMS@VdEwbu6P_U#wE(2lic$b`xPTUi))iF0Z ztzWH!he^^nY?)rk7+{XFeGoAEv`#EaUlO@9K%ZoS5|02?_4W)g*9gE(OecK#>m-PI zl^3y)I%tK8i4x2m})51vfW}CeuN&)ZWkI1XTwF!h5xa z@Kp;idQ~%zI(`eh7bq~Nkb327Vut5y9bjE@rMH{dsDW~QCHm`ESoy<4-6OXujBfHLqeMQRx1VC0?L$$gUYd=UvVJDpjDtX>1o3z`>`)6feMsa^<-j zaS5x0emJfjd&|{3e-i`YP8O!9et(o5o@8Y=io%PE;y#Z9Lk#gGnS;HP{SPlr4DmE{ zC0YG-6U2d9&R9?gIrDZQF1%OC(H)YpY9HS6md9HfKCgZs0?!y7yDF7Ak(uo8J^*x8N<*^+?`QYG4CyieIvd{ zK#Ho=pZN=+-#80CnvTtv+Vv1$>Jw}REG%KhsMpP*ecKZ&Jc4TrB zXn&9=sP@>$+TJq1klH2nrgjMks8GVyB@6k0kad^zcl=9%e7SOm-;`pXIHTAOfrXb3 z(}h*~E(?ok$)5L?fl2*aRj9V)IDJxk=nvV>r>RZ{SUz%9@YF`L^xB&}qSNwB zN7K}fnrY3KChprT-r@3|sj`0|#+}wL#F@K&t#yYx{ug&?Y;cuGCRRM|b_!apkGsj9 zez|Y6+cWlpY;mRa4XIo^>z8nH5~jfqiP<NfZ~OH#L$;te}>n_GjX=4;}gE&M)FlUL%ApJes5e~|qygy}6=DVN>iCQG2D%8NTrD*oexKD#Q?G!qP-dd5-!uS*ErCCie ztz3|LTo$1E{?EV@kr81LTM>c(lKiSx zi>35236^(^?ze82MNEz6QZ+aYhAgy1hpguCa|p*D(+l}AS;$h{S<2^?r5@AE_*A+q zWE=W#yyoN=)xS`iE+oM&VUrx+EG;3c6E*`&d0y&qUHjwXwabd<157WPN-t#xcP$%R z$cHAhL8sMcbR)xhZ1BqD7bv7bAl*?iP3Y&(X1Rm0lOoI%w3&$FmSUH8Vv5sKlA9psgb`mVg z1vR%UX9OtZc|d4ZyPHkJ)s5HgN&d^Q0BM(PL~JFPlWfL128SdRbTV7Erq<0vwZ)xD zVW)tEU3hRc3tQ{BkX&W&kt$f&BPf9D2AaKe0&d0;(WEGe_oR}G^!_YQ+>|O4Zq?_c z@@>)=+`nW?hTL#>lP|QQ-5op2Zf%!+pPU*#X&xcK;S1^k>VY#jhLo034l=ad?ziIi z35GCo=IyVv3hN->s=8gm*RdA6t;HT|vDaGcw-yJi#nsm071rWfYw_yDCZf?oiaiXK ziQ$O7-W@)gD8~_04w`8~E#+8?OG(9G%=Ll<@oV;kPonYlVxD}7+Vk5|O<6=i-Bg6~ z44xFYX?5Gp?(hhCy7N$;de16c0?S_RYB^6#VH&N%Qc>5Mhebz8ch+p?b**)W*ZQ2_ z`dq*+#(|l6b*R*1&apOC^J*0?voowk{qxP@VNqdxmZhgb5vuXTqmA(xkzqv~SPK|!oYV@Sdr zK$I2&f%SG_)GEZ$Xf>~Pc@ft;?pZJadgO!QPb~O`t2tU~4@)h?Pabd?L$28K@h0w) zO~>R$)w)csilQhzoG2k68W+w{216+KV0?`iv?n{?<|4k!LyUmLJ$&N|&9&x0e8jCo zvRUPgcIBLeEqpONgjCK&KrX-ecnV1_w<~AI*W_fx?{H__c5PyjC-J1t$K{CsJuUy> z%7A)yB-b521lK7er=ui`mD+JrX1v=SUgX~JTe@d|&TZLSX+b~Sqk-$WJv8rNy{GyF zn0s-NIDtdS(M6!H0KiBTc~WWDZ#{XDfOZfEK&Ti#M)JZg<+6M2!Xn?JT(>2^-6L~B zPbE`Vz59L~wpx*(eX{MKnVt6@T>+vPiblBysBhH5O%vv&ftpb;n_gj#Rv69e%`4|t zRaxySciXWXS4DugZWkcjScC-|+r`?r-rg9+y+dd*)5BFf(EKTGN78q6743K4eOT^i zUQt(k$R!~Kj^v5fX8@JTurASfK+txfySvaYvo!cGZ0m3&*gS>4<~@rYJscYd3gLM5 zG);{g$~|}kOIs*U6!&EL3^xZtFc7rY66)f5Ie0EPblMK8Y*{no1J;M@&MUZ*s@GS^ z)o4h)!mrrFd1%`z^mi8qbn`hhzxlmUilIPY1QSL6OeYW$9><=^ig#zpDwY1=S*DkL z2JGWaeHmLyKIka^U`t7=qd2u?a>pc}c9iAY<%9J82T6B4-aFe`((@ydzf{W){)L|m zds7rNhJJBVZ~XT@i5wM?_`oh8%zUz&_Q8XQ5BL@`82D-M+_Y{6`@*g`><|E518&V= zQy9&%-q=-WXh-1X3?Ep-a7VWkXI@ZbUHa&+(`eb(Y4wu*y7ZDS|fOtatC zb{F2^$!PXF7{u;L{OmD~yLTUskHDGvH)fOg54h_59@@t94pz%V-5CG<-#|w8(G$nl zS{v_(Z;I;OErLXFABe!)+#tTUmNb8AO9ehBbGD$Xg2u%`)MZOLNWomH$=`M`b~a$! zV$1}z9hu=xOW1_zFXja$&Lf4^%p~V9*~r|Ho(2gcZX9zNFQ*I^gEY!62^U5iJ7jZh zULkbv(BK?S`4ApMHm+OST|6y_e-7DlU(#QnXTu=~Ic@~ldXRiSW}tOL;B3&AI*Tk? z_%N+11^M1nsh+AA>KXyYE#q1M=9P(!5bbLA`jgyyC>9ICuV0)~W>2fj_GdxGU>Wh_ zVUgfDWw`vI1A0C+3dsE#s{a=HSvW@`=g^zvC+x*u0@huoy~0r?GfHW z%>iHA4pR-_tok=zf7i#^_d7zpxKt=#Ac{(_iMMPoH*V*%!`*Qunp~iTMx<-PidQGWu;i?AD84tJF(Kkmbgcn(+wK zuBNsJgoGYAWT@A~7v{(*j{wzCj|r0*zM0yw~vpix)c9rGD9-J zm^+r-LEb9n7)goVd?vH;-7%%^KpDE`v z!i+_7ZG8n&i?)}o7qU|L>q*$fYj@sW*=-xF2lsM;h5NuF%Fu=<6`oFAhhjpJ|Vn_kNL!`Mj90Ns1tfH8D$ZISr5xl?7$XQholnibU<680}D9K*Z6J| zySK_ii(yNCRUYaDa9$3du&N+zz4Z^Yug%Y%tgBfz5S0lUyj3iam-q1L)x z15a=BR+%9f8)ap&TUDb+<%BBSv3al~^H*3Kf5^0AAXMSQxNamTc13d8Y3up_r4!34 z0(PkIKPNujh*f<-4~|}u@=5p{sJ5YmCK#G1Mp|R|T6qtB_)S z>Lp#d@MW$`J3oGYk|rvhWCYhNlW4#z#rk7@--fcA?+UNudAk^))!U$tTaTF1I%87= zs?B~3bt11F^yG5xhYv!@0uiudGiyA_ntZbcgEpy$bU8$l9rJwIe#B>_HedXohRhJ8E;R=y&BD2i3htuqE6C1VPDa}p)tVt1+Jh`OE7Z#=f zY>3Pi1=D33+{qeekFOkM;IqM$vkJn}9o&(yyq|LTFuMU>v<`~zvexaY!rcRR4Q#2x z&3!O6o@tV`f*jId>c+6;5kK67Cd(votTwD9>^U_jd$sZd_mIZ7@$C7i$ zl4UVlEn~@l01t)Yq@EHk$ z3~!p{=zUgm%iGk(qa-(|Z~c-BtgN@VXtgE!FUtBafx~8vS~763g^P>}gxE9@>&o~x zSfV2&y8M;CP=EW|iC0cjgJb1=C@j4t3VOC7i;U)Rl zA8Sx=Pd$i}&dV2XIG00)wK*6W>vyri`=$<+MF)yjw#IVRl7V7kN9@!)U%*SV+L5ht zcsMID|UhYyAh~{gQi;a2%5zMg3L2$$X%{s!$X*PW@md zO&bF9@r`yK=NVq-$6!x-A0t)c_Ue#Hs~^Czcgt%w=wFJ8e9y6LBWVE1OXmB-h_R$C6(+Z{3Cg#vY}(DcnjJ;M8ZpKZ{*)k%%gsGnyW zw~y3Bhu^WX!;qu4%H7ix*yQ(Qs=SHof$!ed?NB4wHaDYfV;ec&S)Pf$;^t6>mz*hm zg+Sxg)ggG$aTKbfzZPML=r9Q1R{pHttUQsCquJ=KgveTz(<%lwPtXdvzC!mBmODCS zi*qK-8i!`Jd5o>$R%2_;gK!YHhVO^%Wb`)rg0Dv(=5Ia%p4hCjj@A=9vu}`iJo!vBJ?K^`%Adj85z;1*v<3Fm&TP9RH!l2l>f6v`m?ukvFn0xnl?!HTM zUu^QvCe$s;hkv5U_tE4M-Q+K@KBN(CkBv28;t2o!#VXUwb+)RpY!ll#G23-I+w6I$5QzV;W~`WR{ga39y2cWIuFkYVc|`lzKmB>R#7wHT16(>6>#hHnn?K z+}J{qr_x2ClQBZhJ_Q>$9niosJ?$m3b~^no3Tf5O^C{h;=8oI#T+mIFrG4DoG$$QB{KIS0d`?J+O$Z4c2TsFXC0n zdm5b~bE1U0zVo0oZ&-64$Fm!ol?7lDIun=F}?-;%&O2JjerhFU+%-B{tkEM*0A-j zbbRUvHfwjr(m1FGj)7ZKE85gGzSt~Ke@E={#CoqIcG-rrG7>hmz|2WTf!|M%;}eM| z$T3$ryZh8W8u6xD>dUrfAU54@;io=Sn$N)5;~Xig@!^=e#v7YlR^yI|a=Oq?*_Je^ z5}4{II_Bb3JT!o|WR15&N<5Vx8i-GqQkU`6;fbI+BToK8Ct?QGbV!A9o$+!?UnxnK zOHw|$W0NCWoQ^>e8HY~9i!au!3$#S4dMOZ+xt_JQPqOTRaXq^ap?S`4bt25l9r- z&|c(mIM?}%UN8)q=LmSWC+)IdO9F!Q2wDSPUc6!SZcDl=B8df#rs$Ln?}~w?Iz?3O zlW4P)^n{(st|@ZLVNOuoQ{xPt;O3E>o*GvqbYk62@{nuvzMi~0oZC~A7g6465$NF= zlwIxa2~UFi{|+Dd)zp-0n+6%8cpz&uTisli{&QR$5>t^w#7`sMQp;yN?k9otHukWK1Q1cOUqfi-{CJ)FbP+CJ* z)mX|7N46*~Lnhz*isw2Q`R5SR)E3Q$seChjuJrFb{ad1c7nnCogH=mGd3jGwMxBjp z_>IFE+3*K`bo?$eq+0xTa*ibDj3>u^J%>8qb$6!SXNV1Q$C+Pv%-OKYqq+UEf*ogm z;fv;&x2ag+{KGv9R^_ZTYfG<*m-gJ_boEEfs{u+(Rar}^@wM$|Qcm;gXo=*rU+Wk% zQ&p@;XDr4bC`O|xGnR*kbV)>K^MenRs1~x$=WexAwG^kPGc%-7hP2I+MsMf4`p=|x z8eJP?9mE#QKisveKUZ4%#O*x`jIF1P&G$H`p5p8ATh(Mv>i%y{ODoEmI^2pEBZpc1AEUrpzlx1}K&^pP0QJJi@*ldHEeUKZHN zsbik01El5Yn|s@?rNvQCAW{a(9J@>&oU`P?7tLRmNa2n8@weG?VAkw*zbSg<=@S}P zfT$1;4>9Pmj7gaLA=%8+R%M!-tlE!bMbvL}PiOoTddIas*G`(SrWhf3PyO6TsL^XY z^LyCTl6YfJeNd-7{T3<4<~7K~de(S)>L*JJUngPe*i8;n243FWQ|~l3FLmi;`Pp5D z#2jZuGC$8!iNXb6%nvbQbU!6uIoz|z*>k_gsZK>gXb;7F#xr-@>Fu5zUH}7IyvEbz zV`*+&(tIGbI8?lTx8&DZ<&`dUUVj8;6qhUiL#{K}1M2 z#D-j56ujRlusZ7Wx!dEEA&)LZ_MN_F-6Znk zKL}wx{~Jft+rc*z=W~pw7ttTPS`CuKttkoL*mj9lv4OlLxzJV6BlU6OH}VV zH}Hq~`;(c^KNe*r4xxa+T@abnJuOyEF3%2-N1l_qEnSZ1| z7ZgHlABJ&qx$A#}R0Omq7AHi#+9|BnRX}{CuNJp}5kS4qU=!!aX z^rw-D^7a2cUVmo%4jVn`n!S)^S-SKq`8h-{jjpfJO!}(uC|PEIF9*Os58PFbk|Nb& z=`-a$V{_XljNZfDhdUaWQM6Xz!rST{yXb5Q~5_oO+} z5*M7DTz4e;bJHAT<4=<$n|Za#I`Z46O9rWY$|Jr)Wj8((gD-?(hbI&Eq){@|2e^h! z#X=y#ZCoVm#RZ8Q9Emw_Ljb+LoMfX9=sSPc3L@K(;B~>^hdycwBQ$m;Qj=g?VbJKY zep4(MgVFs{IK9Sp3YI0%~s5Pvf_nt521`9 zLIg3a){8wD={}6zSmVBxZI8-KdDdNvbsrMxo`+#Hj<)$A?ihB*WW-kl607wK=Q9#I z-i17+tTaz`P(uy3% z#ob2CS+xOb4Xl+$%mG;G^?5H$4cT~=F zrf-zQ9G%cdf-5~s65Kjrhy)|;>8v#}owYMFJ&mZlbT#gaT~!_l!FCmj9fghkzeU>M z=4Ex)%;U<|Jm3Hm_ZSww)?ZakxTJ^$4BbJN$!ky_!Qup_QtUF#}G*_X=pNfW2G?g;e{=TB(BBwYAC|Wa>dGx-koP2Thwgy z#uwq+ZB^cVbGD0rcX(#0vo39;*}$qnWCa6kWK#5|#0WY;NOI$mG2Ovm5s{1RwC{g2WMc`c|an2K8$TYl^=ZFM%M^b~X3Zs{7 zfuw&ogtx5C$4Ur>%i63J;4pb|ZAqpQ#Th?VA+cWrg-cnAu0w1qZ)guFEyT7qt_$4mm@&{L?T}7h^*%wS9wq$@|E8eJ86GoS?qB7UMbhsAOmRhVq56d^_3?5x3}F$A4(a9 z>>x}{MO5t)Do_U_2hvQL<+*ZkhS#asujLIJ6a+^%9&MpmFKiimU*SM*ejob8<+Ai_ z8V<9>aahx2HO$de+$SlFXaP^1D4uN~I$lq47@{)^QaP+`u)Mhj5Gg=;oU$v>YnqQq z5#St*+vIAG6iuAqjMM7_`oy5SqPB3u3L~1l~ zcB=7=IGfEBC0Cox4ytG4xb|kTQSt-iPW=Bqwa>L zA7?d+tnl_6eflyuB~u4vEbm3Xcu#P*B*2M)B8Ff!8zD!W+?`9k@0ofbf}&C$6Ytud z{fx&VAs0Le_yfXF7j&c7%#*7}ttpYKSFI_Pt52<2AXmRyQ!dv6wPuN23)PxM zat)|8HF7OdOT(_+W=*NMe${9A0#4dw<<7A6>lJd!vix_7M=1c$FXf78@;$kt-)G4c zNO4rI(8Q>U;$uH};B`0~kXwt57IqwuG+3+k zJx9Z8{NaPZ<2W8xXKbEHgNiZFZnC~WjwWk<9YR7Y2Td8_M}M2OFYymGV>%NnZLqfd zK{SO*V@258C1VQ`$BW>qsL_T~-?Q$zo1!pjts~3m8nI^a1!?u8u)<}1Eh1uT_oKq@ zE#UcGssSQC&=zd6-XD_G)c}JBXsxUAAsUQnSwlEO;1M`H)@d??`eQfCcWVblN3BwYurB`z;r@_pGFXyv)q%P?C zEDw_yD&4yfc-~#)F~LR+wbWgPe#VGSsCR27Qu0Tlx`UcJlCR{y%02v~&Yy8zX+A9% z+tIJc43iy8nyn_xsR2J;ET_K2TkCW6M;r>N57K8e@}*-ovfd?8zrHB6diPc+6aGrpQf|8-`d`dXMc9 zI0b7dh{|zg0qaHVn2?~wJ;9T~Bi(1@V8y-SYz6{N(qhOF(=&L8Ccx1Mo>N1^Zx1GT z>OLI1nr?xyk)^;~fO5y+W}Pb#Bp|?v^c!lAu(`X>s2#%i4()8eo|WCu6vTt&g$95w z)y2IH%<)KY#5yi1LzqCP$yLzQ5Zo5F4oVt|sh(hEpoz6L>Kd_rE@_k);t(CH8Wqxx zYnz(ut$*aDi`~;wES5r}rpx-8PAL$*M|ctJvw-;B-$|nf&a$Iw{jPz5b7mNA5>Bil zdy|rD9>Y?^uoMUPFffI~hj4?-Zp7$P@Q&c{Fs7NBQ3SPJ1Zo`3A8sieZYdgW85w?? z=Q1$aVca%FuPT$VF6nS3OY5C+tEn8$2lJ1NJ2!rlKL3LQr-H8Q9tjuSn;3%A_!ignE zt@nAs0&vzAJ1gh8&bkhUhGTQeT22$Z9gTt7C2AUeWsl~Vi+rlyZ5HG}ehms5C4n!2 z7{H4L#`ZMRR=_s3zK?`fO2K8FMzJKtZiBiBzHY{rs5Nd?kPCeoJcXAL(527;$o7t@ zf~(RFyw?K=hvHg<=ajAieyq1I!5= z)HQC?PsMzbxRtJb&V{s9#ml+7k~`PFvW4*+b0K`3=&bZKGA*J%Kao88rivFGgL=v} zl7fbXM{O$Mjic>*)pNz!ip=Nr-4^+Ebljw?`i8Dbem}CR#?g>2-o8Jgo|6zS5%YO{ zQO~XB3F@zVKS^@m_OayiYq#`nUo0Sfy-T+0VLrRQTlTqhR zyet6F5xYg*;Z1DO_tERMZl)C<6gW=|oUKbVzaGF?i9$m{GSO^Da-)FKuvIJO0#B9_ zu>5rF^B1d$UB%gAgWj=IhuS!I-k^aACs-A!McIwi@u`uEsnuR;&a8odTm^%&woEyx(|J*8{i^}r;xa(JA?TV zPrN8}0Iv%nH~bPQeyDv0^q5b*9^ALgc=3Si4ID$9at){b>VWa$K9mp8I(W{0qfUaI z76_3JJLOqfT%p}&Eey;GT4rqR6M7w7TieuB9>>LZH&pR)wY?*+v(Qm4>w%=WID%*63?92W1Y7lV zDSQ{;aA?c}_@1l>a9%)Vpn*h}*44v7f)*a>!4lkV@-1j@-GTopdKWsf&YJ^oV)H@x zwt;n*XIoo&JVe#CqaAOJH5gsg%8|18$R^j?7qd-vou|dL#n|}gOr||EUlwG@NPdA4 zl>=!HZr&M_>xJ$^Hh;Oa_QY6g_v+TpWl-@|SLs{#CWI|yb>b$O4hle{bnl{s@vL~5 zhKNVmzOoR@yq-J)g>zy+ff!$UM-LB1`rg~eXhAP30W&c%I;RH4zLoWj&agE4TnEGz zv9Ikv#J|4J*eLodEE6x_x6y;mU-y3SvW_~|ihQo|cuy`-V9HvC+CNS%Kj$2NMz9JF zon2dylgH5QgNqwjH`NvQqMA0;@tf?BZOX06R2F7xkH=mSkxFl+e{Q93Ze;<7-s9gS z1`f*71v5f>*3HqY#UB6Z7+<*d!hZ*_hH48t-W;nduQ~&1->q%fA>F9VS?Oc=ji(QB zAnLuN={+3eXZOzY>=qDv(URC`Z=3=L1T8@cY|G~M+0^1Qw#Ez8zTg`GC)p%8j5l69 z?;3EOO<%<>E6|(hxgfMiqfc+50T@{79Q!DsnO!VJ3>m)50ESMQ1Xh1W!+663zw0)+>12eKL_THx2%VC?hFG{W^vnBY=2szeX34Y%* zxog*^+L_U*o$<>Zu>d*KuAW-f=?Lgerq&9@-s{+#&iV0;n>;n4%E044gpI9YN1ZJJ z*Qqklkl4|-rw7G0%1C~dUv`XadRn?s&w9+>R;)W022BY0J7$T|&cz+2T1K;*YKTsU zcC4!gG&y@jZ=OZzXum1B-pSb;_lGX5^Y+Z{IvmaI+7-LJXAdo`#bI@nMNy086q5(OEgNIoW4==Oo=%Cl_6bfGKf+&-Vmq|CFv>ghG}l z`XJH+7rtWXNXux)YlHtRjkGuO71_ohDE@)6_cGmLbG^~_>kvYuIE)vqsuLdyo*!>g z$K7&Ez+h=juHMH8n|vrULesVQhg%e>{^Ti8;^IqllJsX zUbwR@rzfR1*n8rfc=OyA6m0^*^8_Gx{Hy6XJ&uJb+DoRLoARs3VecGS_M~^O9;SBY!n@>279$(k~wre}j z-MH>!o$E6w(sZszod#Dy-p+-N=;Y2tE=Sb0!*OFdJ2}+9cAsmH>%8j}HLiVG@6xP! zkm%L~P(Ctx_o{6Nj;_kV1IzJyg#9`T01q3W(tBYiR=I@HowIG=D3nI}wn*ZFn?m+G z)*q^o4y1T2WdMiw|_vKjywjXv32Y|9s4C&BM(gkiSBRVmQI z1OI1-&PY@T;a;LedSCGE;Gv${)5*s($t4Ri2XM5-`e)MKbDh+O%MfQ?&z}7^QC{q4 z3l(mb3ffkgaSJw74{K;s?bO)h9?!M4Bb%nAZ^Go3Wpi9%%tTx06HctBVpPHb{UQdf z@uNMp$8Ut*DBJ}7UI4GFXZQZ%OszEUv?DeZCiZDzRq~Cwjj+S5*bCB&xtLJ_#0bZU zMR4~+oI+Y7GYbi8M5MX|?4c%ESru*u6<-9^uPFnFh7ub~*MaW}Z7kj9@;6vRgF=cL z-5c3F468F*06VZMHiKB~QcF1%L3B{YDq$sQ)?k&fv5DLagf4Iu&00i<8RVTGJcMiq zH#@<^#BeI0KU&yeoxww*d~_PsWc?qKMLcvKj*c=%6}u%7XGI5H-*1j_`8X}8~MAQzft~1sN|?^poDkR|Fr9QK^OmE_MemeHU9ee z`z3#NaR%YE_S$&7!FuL>DIaTLa2RQAQMFGs?$iV2+R0G4Y8TYQxZzM~EX763&-u7` z!NG!OWV{+W)qt^vt_j#)$N^Ir2~}1ZPye$XVZC)~99x_LNc@wU#7{g?;EHjERa|ZK z)?W)#9z1>ED2qB-I^DI6@JDA_({91kAygi~Zd5p3&T`>r!NH0o)>E32HE_+#3yoel z8B%zgE9Kfn*%NqW@I<7v6cBYG`*XU!?!NZP;d-l$<(8g4e308Oa0?hgG3QT~c=}?A z$Ny-F+=!~U79}R7J9ahAK5D^2p35OVfs}=1?;#FcF!ILQFv%a zHwfa#dQ#e!PjB?oW4d`C&h_<6a%~#R1=4QYI|yB{9oDVj?C4>f2X3wFfE@{3<;cO$ zdmAzZ;SeJj7)j@X!_1A3!r~fTcN&~46!S!9fb4_13E~F7NTY3kPhHMRkF#YoQ#%ra z33}d0Y+$v5_j`j!jNStjaf%xMgkzgCd)cXfiv4H$zP5YiyfS)EC7Zx)ScCw>ek|5g zs74_vYg=f>JkI!N`nu3QoW9DzuTH8FzKvMkCr7`0UaAPD=C;t*meFh% zPh{XR1_`MfuTI0{6if@|{TXohTlylPtRh+*YWo7zL^>DkmASPeXyJ@7a+uDcms&JG z6G7c-_(&x62UoSxn@M_!xH?L-qMoaeA>OsAWlrp5Ps^MOyY{E|9qoMAIc0m592&5% zYL92|x^N~_IfT_UhTBqezpG9x_{wBBpOCxUh$(J@&v66>8%&YK6rM1Ir&77>tN4qjzue{#hBLcekeA;_tx` z7SU|y!!wb}o?(H=NYuV1#1npZYpu4mR5$8)N~pD-$s%d593`B<92e?HAuRagBWtS} z*Pg~XOZOk^Jl5G$J9FRQl--$1i*gn@XU49QVXHl!c-X?88uA!+;6d!7#cuszFdoQO zv+fs6l?>wAXJrvR7ff;S1rO)d+A-b^*&p7+$)gddJv{4wJJQ|-s z{2`a4x5twX zl2huf;hb14MOIIVxN5u+7jh5mw%ug!@lHeNvdLSLH9<)nhpkH7vKEiJ6K=8)!p-yh z#_{L*XHNZ7q-@>wMt31I9!We|fV}()`?eJazrz1fcS2G4KS&1Xu|!>oSDG`^+FWn* zX0nW&TkWTsrY8FalXT(#EU_}_~98`GNScxzwA8S zux{Z{=xhte%IT*C;b!Z1ICGfzYLT5I`+-*b>2~`f`Co<^WOsZIl`=NApO9hJ3vd`; z6#(J+XLR%hwcCvO2mS0D840Lyo0~8`hKyk1$yTSrZOw1N90&_7o<{wHM|p^-h6jM7 zC>@urdocQE@Or_ z%`3D`(jUu;4>hvgaeahw>yj;OH;h$ZYe8v3L(dsZrPS zHxui5cf6h*>58#R7Dxk>G^TPy8Z@B_yD9g4bQL?bEK2N)1)s2SO>Y?SpA7M)*Jvg) zuo*ct=w=WU6vv>RCd-8reXz-hSyhU8?6M|q>a0og?(6tlUY~4T*6=6W`d5c+LSZixfl{qRl%=(Qr;&D}dkd*XZ`JkKu|_{zGrml} zOY&Gp&|^Xd0v#y*fR~4oEqYP(a2_v=UL;ul)NgW!kC+SeK$Y-j`oto^ewSb;rW0$W z?AV;dcZ_fdb(JRGM(qj@lWg=JlnUR?H6fW9cd2f>WH+({3AGsr?h!RyJx)5l0cbo&S}lXISnHIVNP!yYxjEHzzK6YeQC6CX>`icXn{Sa_y8Q6 z)A4z{IJN1tW|JdlhOLhGffVL$bA$zgw76mZMB@)AAL`j%DEG z-ak6a&DKxfu;=)wp5xJ&fd+Dl-719XFG&*tnoj&oHnEq)i2C+hT%>Q$ye-c`__U{O z^3zr!c}6xbfd0+5Wvdz88+g>KXA%Z2W6W8ST zFjN@jjzNaR@p&?mERt4Q6{(2~A8fj+52NgI`e8kvUE#kHE-LG&p_!HR1X7v^o@Zrc z-30c2G-9?cBK_MseMF}(2Mc;FVsyW*UZZT zUb1|3=2BKLN!2<@HV&l2cr8dbkz!}R#@-?02AyPQJgzg=kyu%>Q z8oaPv1z&qB5eYc#nqD)(2qMFXS&u5zh&&^{Z1ix+WdkLyaSR^@78+X-`D}d?yIIbu8EQrVcOfH?LGj$n+U9wcv+4fJz@@9z2g9QiR}QqM_mzYPrZ<^V@OdkxHzImXqcomT8YoOrF}DT%Um zNAY5H)J3A-tP8L?%h6I0Ezv5}6-wj^)l@1+kKXrMI%2V4%n-=+25K znprqnmEQV!B{L$L;Q_NuMxGT{3sqz3rT3mW3sQ%(SnP6&^flXyv0;AhBfCK#3S9KX z=pqIJ>}h&rbkE_|Z1oS$=c++|A(Lrrt?&^1JNJdwVN|{L$8#WN&|2TRjyK4Yk*>ixV>BN$Pp9m6HIK+HaC_Qea-L{jIH}u<=+$BMoePrFdHp6;8L&C*cw82bky}^ zu{cvilVnXXj9GD^f7IBVd%)`H^yJ***aX`g(iFMfd)2Vb+n!3+Ics3(z#|sk^QxSC zgJ_6iFqtQEhtu;>K||iKxwD3{*XHiG;433G>pO51<&;qEQSAF0M|!6Jc*>2nzWu-D z&2Co;b?02BckFxBP?|o^TF5CJx9dR4$ks*>;^FQurlgm~);rxO90XJ1;_qo0!YuYP z*pD@wP=%0pO^B9GI#F2D7x+xU-A<44*pJ@kS29n*UYw#vg6Eu1xKV0~l-=BZ0xt_6 zN?U1``?PKntU>Db1}jj5*{3S*P94ipr9M@0k87LqB-cOK)g*`=>)S^WqDG zyHyy!q4%WT$x;4kgp~9&CD&vdR+4R4NhCBZ4ZB%4Y}Ru^x$A!fd zO6>54_O<`&zQkus(5TbOYry4YPhe(Ro_-4A35?I9?kXj=RMNd6qTtz}L3eFLmFGl0 z1)0NGrX+5Re;K@apAh409mpZETK=@uu@HU*z-3oxPg8U*Sb~JK@YJ@E z+1U+IJo7bMas3z-d*{~sR<_u*9LSZA2=-q(%A84jBxJ7D#p*8UM1^!bG-M>V$$Yl> zyAK;*5}Y!0&`1gsDs;-|`bVy-9)h)M&8Bwx(%qMI-xp<=bCSzFxt)`p>7{b-N3(e$ z?ofTPg-L&#vDN#$bal3B_NjuOgbI3M)6|J%!BQ&V-3z>n{e~}sC5S!iU8Rx4a!(G* zU;!s4J5QA+y=_VFm*KPH2ddcBZ*0X}`}OG6#@1hsUlL^{ z8~qHP%9{xPwPMvnO^k7|#z14Y@zl_4U1>kf)sxyr$6Y%kiLy-WI@+3(iCxXPMUSRQ zkIeg>Iq=YA_S;Y%&+YU$fr{A{GOqz9qabu7Mr3ys6434{N3{(c$gjMc*xS#A_M&li z9ur?RfGp*8bt3dS{o*Bo=Xc=I7~x&N@!}p=DtMB}J84hS9ny|bTUYWCE$I|5NPc{* z#Dqfm9;gv(!K>C*lzzk7ej_@rb<}S!^XV*eC~hA_ zz6Y0S$U1IeEsv*&^Qy4170+bZEERS_b&jMqfGdkjg)`N;Il{K@7Fl^j-Gx+$1@FqgFL9W`-*xixDr!&#KNa87GW!}W5s$5Ww4TI9)M;sWE*DLQgT;AvE zt$Z3S($yKsg1>gUjIH39wl>ZyDOZ}Uo z*G&A@2ZrT`a~T%I-Dp@z<5YgK;033v^De5d#!qqXc~$Mv2d8GjOjx2~mFUYo<3R9Ik?8XRT2BF+_Zr{qn|~PPSe%Yd2O^-&%XpuL`n@CccKh%9t3^M= zq1T`-h{Hn+CM~F4T%pPfn~bd`VmsTBx467KG|)cOiYoxO7`x*K2Vs=PfCwGM5)!Be zKzK<2!olvtVlnuoa_ZJV=2?PNC+K_m8!c6l5X@_{7wyY3Y;M{eZ0_GYIoEH z?h-nwwsTXJVdsPfq5#w=QfU96U`-*Y1uri@I7`HgdpVY%_oLc5#rEOkQd1{R1Or29vqovlwz4sCl%A2;GfLmM}{ z`^z77P6MEqueQ%RQRL$2YoDB4;`Aks9!*b?15)l_YV4ao5YNR!f)wXulp~U_YCwWt z7m9eCiK9T5Uyt-hMX(egy!(d-Zi{{yM5 z+Btx4?)E9zZSbM;a+S^vq6I;b{^V*%37TR45(?Bk)S2|0d& z^;;5vW7#>{e^U{+9;K?QNXtZ>w^ouL;w+3EGSc_=9xOdJ)s<)VB|3_Uv>EjqoAbieC}jA%5B@8TJqSy(c0gM1wOg;M0;;JfSu+xv zvd&OdtNW`S^|5&eUy^muH)>WvM|-$|os+L05M}7K0#^F$(`3pBi`;9?I>t0q;e)N_ zKmKbmKG>Gecw;fgp-Rwi zke{YU^kUL;BfYCDN`^;5(@@GD?_Ij&16`YLcTKwDv+CZ#@+J{^L_?!&hqCxPkstyn zSU^L0LO;2mHnp~S0e91Ea3^Y$VV^lIQ62!l4^Jnv{XoM!47fhRG`CST1yp{s>L^Ms zJ|4=uq-i%LwvDPBJb0DW72{tyZ0OpK1Mwk@QNYjPWJ6 zly#~_ThLhL=v3}4L2-ILBE8_eNzy4R?hyDhos4VpT=B$d5g4TT2+dOMRiUMslej?sTDotE%&uEP$rM(C%nq=N1|8 zoY>4Wopw9(aR?0N^jdwB^<&uIg58xDx%xXjuI|IC&7)?hHn-MQek~Rx$Z~83`io!? zrW^O}M{$;9_av!e;&q-;8a^`k6>9=W1)L#CxXuwn5?GtJv`%>bLlf z*sBJ_?G<0!u8orRwc}XjIP0apA#6P|8@@3H0lIb>n&6OiH)-%q(4!&ad%?=14IB!e zmPFJBEvATkLqwXz@#S1ejbqFNe-Y?^6C!?578?OyvM%Et!8<@;C27=jPqohB1di|x ziinWzsp$ojgwaP!neBm*fsAX|g&Ly;AwMu;xty!|yaQQD`>{_oc{|x$_5dWe-v6>~v!!&B9G1!Y(a?-b zO5QM5QV5OYMh6ob284+nQ|9YGJabYr56!G!(V_7Mxb8Fc5k-4*#=Zuxm+50}CayUkWVlC?2s@GstM&q*V zXxyP{!20VS0OMX$u9n_|>%RI6DjZ0D#$6Hmw!pqiK;QJF_gPGif;XGD2>7G7es}=m zqgTYJGPE`v6#j>*huO8J2%IFhIr&9*Y9uH0id4E1h^i`9_g843nx10jBr0@u;{eom z23-{`(qz*KiV`(Kxrk<>zR(7}iTxq*VqD51HEkfm4on$I7qttdIWMz z9wD@;69LW}`~XfK{*>A^A8j2N|Kg9i;L`AA2R4Q&_YM6W>G8OTux{2&Zn z)uRQ>Li#>oi2R7J0t19r3LP?%-{ld+jB^eR990J^;wp7dAy21OO#!TpX;3I6Jo5L-3R@bcD0xaC{b(%fZ1BqLF>h4h@&n?|^Ay7FCPEClp0=KE$TS5uL6| z03pfJXPvjR@?9r7^Wn3gl^eZW!Xm|oCceq3SQgvLR!jc_-?&mb@Ynjp^Z#E?*!SqF zOxXY6swYhJPbD_Eh{;xRNUOR4V+cn|xQ==2WZYygr`u#Z@{X|SIYu%l^A0y=4%hMV zzKZdNa4u8>U)aCEwJ)^o;;1heOHO)yoJbRSZX609bsT?qNGBY}70ikwws^us^m82d zweQ9hBsNn{v01=kRWKVeRv}|pG@HW>2>_J-HEJ^ILU2lw-WSro>>0le`yJu2kEVIq&2i62XcqX397Gq#{Wcq`!hNMi9EAW5$eIRq zz;<$u+Aw~m?_(|Q|ERV2yxzg@lywvu-Qq7}LYaf{ePA)aWcx*L8{2tvBZ*f!Sssq) z?6G5h26o*mnyp{qw?53d!&zdrpKU=RegTRN!vz$((c^MIukP}2 z%IG}#I>VohWq>PYXYi5%CW&&pl%a2-#$DVJWN2gcOb!#y z1XRwhWx4pw*jeAe>Dg2xdrn|kRf*YJN;rYmc{0IY1N#WQAY(lEFWfS}5-?Pz7l_uX z$$+VsV57HZrxX`*LJKH74+H+deyWIa2BU&mRpUSwevQoPMeKA8!u+K@t13TqmL>o4 z7)UCMd*b^A%*3aqcf->Oy)60STe~yuFRKM=7MykDFv43|G}Gj4r{9bIQVw~y2vlV( z>y~dgdtk|8N7UGGcJ8qXNCZ*!9{`LW88|PqpSe{ABX~qG6_jw~LB`?F1d-GyYe3b5 z&abwS0sG+5FvKq%u7LPK*!Z;Aq>r6lB4qJ!4l-=37d5LV0!i=xa?ATSgNIa2QD_$X z!Nw`lwQzNB20DWoh6143_Y?th{>JV-$o!skZb<1Ke+*W~EZ3`@H#_T|cs23BB0&P= z1hwfjs?!h~6y^8Km@si5L7Ew%yRfwOKxHJ?jD&8v_}%Nu))yw%jH>)tQG@#Hi{HDC z`Pmf@T&&Ob)Eny2({n8Gdp8Bu?XjTxid|@hFLaJwmudecu@Cg{;64XYmkRT>|VVgNIr5KLg2wC!8tZ95=s+y4=5`+Bx*;{_+j zZd9A?a&10%)W2fvb}=UKp$FDaNiK7C7G5Z)fzrB{L(l5sZ^}X+Tjn1{43?SKkyr*;PEEOisy)a4QcHGntfwo#Ds-wkC_Be^jC%&JkoVq>K8H9qx`C1+(zPO?kFr}}Ww zEJ^$!gc?!kXrfOzab|^l?P4?kSP4(!v!i`uIX|>NCxaF0&3U76$LtNN9GRu-lS|;T z%iBCT{=K1!=(;I9P34I#ElB9Zy4WkNtjTO$w`S{+sqfy;mXFTWb;>6`qF&#{dTk4n z|7Pt_$(!k>T%7pil|XTop49PZqNB*Nnk9~^hiqP5N@a8;Tw zVH&**9BfG5GitU5)bm*o;#aQFHX|wS5d@h_3aETutTB`BZD?KR;(97)t)OmK$lR?* zFI#<59dki-U`%Oe3bEo+o~nscM&0A=%-YRYhaO8T6*7P}DC)t5#=uDU6G32esiF z(o|DC6QsR8;k<<`h$yShv-AlZgTmY61b`2xTB8#F6-;z>lhw!YBR`ey2n#$tucs!r z^X!EFT?Mnv*t|=9X}5II<)H%?Ti>6)27@HGD;2H>YTTV|u-UQNY>ldZ1a;#_fnK#8j#ohjY;HKO7F6vo9q;=g@dJ!?Djb67mLPCi}OUkc+|}441F9+pT}3<5qf)_flTxFf@U2gHTJtZ zLMvCtF6(?U^YLgNRl22h6dFMTnUJU3FPWi$5@`_R_`Rc{t5Fgtx_Hi9FXv2HpEHvI z-e1oyMPF$5hfhG^gl3P4V_1fPcDp-^$}VsVW}TaK8=Zy!TLwP;8hh5Q77OJr{O_81 z#@2EyAXA0J|5#fiT;&y3YyXgN;IpT6P0^VO*q1XmtPcw}GzMqKhgd9Z-Sj$wICv$f zC3(k09eE-v7)|FP8~LD6LEPz&Ljhsdj>4>+$j)5A)UATa5Xh7?S)u2M2wyeEV90|9 zpn0jOcP1(GHO(%C!I0%{3PU2>*hX)I+L^L^C}eunw&v7teXnFtwVJbc&JGb&ox^+z z?I4drX;18T4&e(l?#FfWZgnt~_N4}Wu076t7l^CRITO4kEB#L#M=piJ63Y)O&Ky=5 ziEOVYf_H1J7 z=lhsAEo9sf_kQt{i)C{|JH(c3=JXw;?hNO3Y7OrWh~c z^sdzn>*@Rf-1y>~UmWATKlo*GQf1BDdPnSjFbnj?QW*qZ9Z!h*9wIyZ`2`?hF`q#t zS&1;K6}RTN5LDY~KIXCKX@0&A?yB|-oOMYGYIO+w5|sfy;)n4S`#BK{Z>4qP}=l6Jv&``|8ZxD~ zTf6_BlG?vMHg97k*$Ce5{T)|ws*2+jt^QK#Nxh$I-i+VXWwDd8tTb>GAqC10cNMGV z!iZYF?1IXRRCKBna$rP%Z438 z{H8yd*(?f+$&G#dhOImPRI%@nWy6kr{5EL?3eH2IxA=Rv1x{Iw6bv{kE=0&?^GE+w7yfw9 zKl!JMeTSxv_1sIw@t%veV6nQBNukfuU|+NJd_=imM!;;gr)ZUj37UK91pPvW;10K| zUtV4^B{y6;CEvU>O zT*!w;RIcs_jTA@txYMeZ=2Y43MiEq!N_8`+L(oIb=c$(gS$sj&dt@~FlK!Vz-|*Qq zYySI0KEI_o>is?vsbrNF0_P^-`-9%1fmmOxo}l#I%@<%OL=xL_z+{NlCW1RX>atOU ziHBvb-U)hDiwc@pyAl@yJ}j~pjL{T0$jG|^*uQ5B;T=$vg=qGg1 z_419oE@1yw0b>D{(DTllC%#y$s|yXReV3_6`6ya4@vSa)HL8z)yxcLqYzwrAvyHP5 zn@Q9hj$WVL$eFLpzQHKm%;Pnz){U}F2t^<(IbD?9x0$bNt>X!~WS5fbJ6yywhH6=E zx}ta3hWb|WZ^d07?oY84m}fo36OdEOZpD8*d`n*xlX@?qO-}EYoIV}g#Nys`i4W80 z=T+?zVeo7ecJ24E?T15%1bu(vD3r1B)omz$OjdbXt`83_FVUxGSDTjn@gjt&ca0Ts zWsC5+fFm|&&tLfB=SC=fbyO&+iXsS3UeOWNudE26li8P@UH>>)g6B zAMX?jFLy(i+#=PvJu5-r#*YP5vx^bzHyd3dA`v#^?I;tB@Bf{2!OOllmg72SE`ZC( zh59=@a`mVVuUx&V!zWjt>hR0ek4)7yAdHiyBDoeBTbqhqL~ZvjHN*2z(?UB7HW{`3zGh|5$6;(xqTzAjoy2Tt8k5Sa_y1(FiX9wIO41+mOx*0 z(}P;DvfUP%^~DKCj`ErHw5z^&;FuFzQnOx!FvU&sq+twjA`52Bn`I{UtCO5m&Jwl2 ze8SD8#9R|_3dLt5M2Mk_VOQbhVC#}F3gejk3t-DQIjC!5BR~&ZM@*Cse6$CbW*SNn z7_gi^E~&W?nKao!369u9rvyd%AgmO3+hmE})Qn`-{Uc&+zpyG7KfJ(D)BTf)P&Hdq zRcNUFH4V5v1iFcUpz8|i*5qbNw^%_iYL#!gU%CXu+ij{2jkN#Ags#@0QJb9^4Z^OW z=YYkFP%Qg$4EnVn$*yZctbm$0l7vHGK>g3*>lA0TIiMY;f73-ASvI4uKNr08sqqaV z1u;R;nU%Lk6t`gX6*e1N*B3`r`;!+`AR_koLGR0icfd-5699RQT7Kt+NJW38kM-XP z$HAk#FClyBzzW6}%EvKZ{=}TsHn=|9{)Wm43e^B-Q1AAvqMo3txNa#){l*7BT#zfY z`;M6LlC*e)10q@t|3lzmfjTJu2&;H7D@&Ri#;~V2oG1Xi8?iSUv#Ekw;Y*G>SnV9Ojjd)r|@XZksvX4Byxzt<8K}IC1AWWf+NO@XPebo zbkz7 zj$GrJH+dSaayy`UItXWn#n+&iy)k@*+HFFnk2KJ_GY^8dpWz)E{1z{pZKrr*F^IM8 zlODA8%(y4KwYs5kakCY~OAj9Bh-XsJAQ`bqL)<6^X(GsKwoXqG!W=TdhX>N@_^u=J zDW{O?k1r;Gu6DO)XWd#Iz6(nEaK6+RoAr^E{UeoOKk-ZaLX4`RwJz4Gga~e;!36M~ zv?a%_)s}==$w1ZDvvJGtxiKGS{L!0qCvnMw3$zh@O;``*(#;*QXv|a!us6r!s2XSXt(iYu`P^z$`Lo7+0ESt zX7ArfvOCrUzXSbED+y&uJGzA`gU~4;$mIe?AFhihQdXV2Rup#Ko~Tddt7#44Ri5U| z3J<2650WQhuEf(sxhLG9UbSX`IX+Uoq_RrJ=LN<}%zKFo8%dVcDy+5-7ntf;vG zOH2aq%IqVB@E}|QO(FJz?-5xiR@W?M#vbAC)4=iB5~ql^BDF1~0lzc4YGepoe29j- zSS#{jFqf`dLZUJb8uSkK~5 z6Tnr-@B-aFG{Oy!$iA_P0%Hq!DSLq7^=@%;GjUH8+IvC>VpL*Ncyj4_o^dL}c}&+P zZct=L`rakcB|*Lzi!SY}EmjaZVRU^?Ms&lI$gzxP?&E&A{1PBiOA=id8>w1E*sK`h zfe16SyHERVs^sltfgq7L# znsZ5+oaStq?YayDCS_i={){qq)tEgvvDgU1{k5kmqMB$zgC{!W6&aU7MM+p(-TT{0 zuMw{v)oyq`el!29VuzzPrmX9J>e77z)X z6F_uKCP}oq@J(8_T2JVDw>ygSLl3h0X;}KX!x{z|-C`L-wkFtg5%V68^_3AU14ifX;8qy8WppPfLxEQXcv+vN0C@xr;3ptK+0iJBJs1g{YMVKKKW=pFsov(w zTfEc^nD@A2zaO8=pV44p;}rti3I%{!e=$=-w>dIB0zIJ7m^yKIJQgrT&*7(-L$Yvs z2=usg4((khOzG~!O>7RMOCSf>3|zr3QCia=fu(W}P%3wUfafROPLxveWq+(%03oFp zd+g7fd2pybRvh0C$_4(ey*S0hcX*H$dL8Nz5=Cz86++oqMwH#5>N?K>6;DXs&Xtoxat;GoN&DrKk zH`X;0iCupVTd1h0bWF3oN|aD2z+g?e25%UNx)R*55I-2E^@ekD%!rbtqbW8ixwbW0c$QS5f&7CX!#6%_-sJgnmxvr<9(U}Dft zyyC#20sRxq?_8pP0V*!&$*Qtd&cwC_D}W%GX278?EgA?4k;MWV5v-tCxhG*Q*gp6$ zd@kh#Ed?2pP$lI~f_Aw?+(n-KE*y6I_L+Kt63eI-w#&_P6-OWw&5 zC^V_t^iWbGPl%3`z%VwhM@p1ZLOxdG1g(2qb7siN2gUqAOi>O zLRxMNn7f#XBZ930{%3_CGRT!atiL8a*$tV8B9BG|G>Vy)wJ4k6Hr*2GhmIBDn)rD@ zclPt{va;xO{cTYnpuw#x1rMC~arecK>!7iG{7pSbH8POIyOU93B(Q5O^Q{{nD$j(G zA#8ZT~l z<(2tjej0NeIOws29t4=|sGQ@J(~!dk=Y^-&{#?q&Rzy@Yw#?N`^6v6b3Z6LzJd+is ztaRJG%DH$&xH;3nqK<_WqR@vWpww}xd93#DGa7Qw34Tn}2x|!mC4pA3CMG=1(-P2_ zO?e;FnLQ9$4~d7pBEKl1k5!YJ`R#D0e&ZoT63(^oZ0u9Crcz>^-s?=>T_r;yYiEVi z9yDX~G+Drer`xuU1&m=yIRl1laYQ*nc&4izjpE&%n2K@l+FpA#=>yp(%SjG{r$p11 z|!a&wiKyJ%zaB=`gZE6kiOK*K4>0W1Z~&qh^$!k8=DvMM^71!a}i>m`=XbzEr!;< zeM_HaB>c#k9@b%EfkhCoP@j;ab?($Vu28DE<9b{qr!ubUEsjFYzLAa`6pgU^Xtr+W zkOMHyHo=NISSJF->Iii0LePXwLGF*TJYX_gVL@s}BB2g-eB}9nWTAh_AhCKOG6xc-NIlELy+9 z>&HnKTH-kDbDhJV+E1MOk9lSy67>+n3s||AvrxZ0Iree}?eVF}x*fV1ci8O+y=grC z1WQ=X04;snBJcz4`ljaCr`alDYZ30m)DT96kg7`ogY@60DdSp?)gmM5FmXsAXG(;M z>tr!E<xxbZ_G4ER<9r8Zq(Ae4`YyYqK8az}B=yxvh))gs@XpQB z>Yl-diM-HO_&LUVI{||3(10Gd%Eq>2e!jO!d zK_f_rS7Xx1ui%w}}XNgqGC8__=`XJut7?vGxY_*%V;kokZhrihQ&6^xLV_wy)8b;t?6 zmBj&U6Nw1NP_pF|BV1?<#9Ln=)jU~5_3l*Hv~7E_L;S6vyBK?qARS7y_7DLHi31@U zyhT6uiI*jO1E4e)QI7V=+wNk;13)SXr_*v~V}LVa;j@r{c#)7)HU?mS5=3JbFd$wt zW*qMcJ-{hOz*t8BOBKRy5Q%IDM}(_cWq_q#oyEUTUS1L{Sg1 zj;pd%D~tNMWl3{E^6Ks*^n3pdK=g&zj0t^1?hPLA1$$4tyma#O@4viZhXs!a)}v)0 zww!R5(7eB*=Lx}E$>JF95*3#cGCN_dLgq@K$3FOsfKKJ|6UG-rKi%7SnG5Zq9DNZU z2Qh$b<012)%2=i{a(0r=k}aHr^b-O}<*N>vS4l3{qfQ!xK$d=%Iag=HXS-TPbyJ2* zvN-D-jW6PLjwo8VmYWU121)B`4D_$&OelzMGKV6SHzEFTa8os3&yAq@vDYfHHvGki^uc0Ha`6$AhnM-qWPI5z zd@Pc4N(R@6^-pv;nxZYw*W4W#-CX(;(WL4CZ1wpmo`3$Bt;z(dHG*1KPn(R^kTxSJfA>J&E&J9PMwxH4)@< z86HgWi0x|k`e)3G97~i)HX&|4m&$bhXJyKlOk#7X#I^{Nb0xHH=SIQMQh)*aa`)GA z)Q;1A&$4f1nOVZM<4)6925wQqA&|uKwZJcA-UC_-Arkl)JSnt|c(uLS8fwM1=eoy9 z-1{(mS&jg$kXk@s$b1e?NizO{jL7%pv_q zcjD(PcsjvB1CFf~1e}r2TY%nz6VX9ho-b4Fj!6ZP3qoe5)%NjH2l2>>ZzR3upO&ut zw^Ou|CMZiO6{`uT*S3UMB!DvRwxAseNl(xKMnDC6l30QWYT4htt4^1c2CMXGk~SL9 z@3Oawkk9Jv5}U}Rqdt+J${c$m;{|vJ{vZP((xUCP*s_Sh4;~4WQz=sCIJAx5CxK`+ z?M;G8eeQ85`n=)n4Ix+iYg+q6!GiGrWLCoaO0$eemv|Qf7WZ%hDMCV7++wZJQ7f#ik-L!VNkJS9m?0{X24NJaOY6EH zD2K|G5Fv_zs>sm37t9v%XGxN6brv8B=Ij>HA*Sg}g;+nC59gx}YRg6hG8oP$YnAN7 z^W18$7KpC$gv`G8FdQ7j8#H+Dc(vB~8sp043F{(q*6Q%LtHW1UYh8X-dT9(_#Y8QQ z@LT)|$M=FREu2tm{-%)i`5%;kpZr*jsWS2V*_kF?04cRvwHCLq}(=jDA zSEZjiS7#o#<_e0Lxrz>XS9c@}y6z|NB?l6w#cHH0dW7Gp3Yiv2x8@?P9w?(lRuUNx zJ;HA~$#8nc%$Yf)MM!0*m2oBL$*I$BhtwK)mC3crm08jw{HDvb!NAY+y2}PA+l_=n)fGl0&sFt3I>L}4@B^*=<`AsLxSI{t$+>+b>juB3L(aN)5 z<>B{#$@9)d0u&gjel|c%10V+e%APf%7MmuLosMIo!Gec|j#`0VD`GBKW{LYlU~xRL zp&@G{n%91Un3!`po+|*j3|OKAR-se z_~Lv%v;NUlAcQmL9s?UOj`;Wv9t9qA`LBRp=hTuHUy)1pnA34a+az0Qtm}95B7`dC zcjkZNE0uxDmHVqXq1zbvGbn5qn@K<6f39uox>{f2L&Ie{nEW4T}pU}%`=oL zAY=p&$-0*~SQRe8wEdjCo+NDN5M51t)e5U2=ME(n$6gwHBvrUw=w7N+hayX$%1Coe z)p{fu*(>XL4HTMGhFHf;RVHY?LiUivUAux)oHBe8+2FQ62%cK92RI`vKpDZEZ@Z2+ zgbJ2JCR3H@(Uv@h*GZ#=tsD`}A&RqTS7bD+ma^B1yYbxU>rRML;z(?l9UD(YXq;^d z%jdq55S2*1*=H`&P+<@@JOfrBGO4}MH7Ha_Cd?tWbAV{$_$n7-pCrc!@z!xe$@Zr$ zUsnr^i8Mkwbe%*%NU@ddNJ8|p3BAaLuPY_V47Vu%h*JxlgN(mh4h+yvZ2Wh*vDQVM zqGUbSNx#bYzg|gdJ_3fkt8m<>1he0fg09C-(d+&QkMiDCz6yv9yzCFJd_3_DzS)96 zX~_;ArFpZJaA{xB4o==CYIyNot2HGD(}J-QZObzRhe$OetlEH&_suOzWc4hL^}SeJ z4J9&G`C^NS();I?|J`_+5?wrvR9J=CK7Z-}{;SV0b=s{TI#!IVGmJf1B1;$i@jDH(~jZA;STH-qhavF`CtOTV}$SaLy zIoaXy6|m|n-)c1CX?9F#b=<(?e;djYiGaY~H(vpsI4E59ZEwqk!ona3lRzg<@r)16 zSLa`u;eN4E_ag-Rws+;>5$1$~%HVqEuwW@n$~p(c#4)hOvX$PJY3yeJQB4j$hp%>8 z{Nl58&@JveM7;P?;Loj@MKw9_0TjK`yYisoD=hEcqh#*_F}7fNc6jaV$juD+3YnYg zG^D%@q_oV14FgJ^b?@GXGI}2l*kX%90wp5P`|=nld0Rn=n&2;wf|8u+tO^TCEJ=f! zwasw4o3G1IlEZ4LH%&&#lhXHait`i7+Mc ze=R|dh*(176q%T0#<41+Wb6k_}a^0_|#d z7{;q&z{>(e_(wswG}AWEcXKW#wbI-Y=+9oOh|h&XQiAUxI5)EH0f#~%Tf56!f02_N z1Q;o3PU1ZoBNXPh)+}T{Psy4+kPlGUXo>loheDsM7^y?3NUcdHME^~ zmat8=Sq9poCaj$MpgoL!^9q`2L<(dZgad%c5~l=5ITI{YT%NtZym%>zf>Wy+b>wKQ z_osIhI*f_dazUt9BDi~oZ{GsCd)JtP z1n@j<%PTUcH@aQzuWRiexx-mlw;{;g6-+v3le?{7<;xT_nwUi2*`XWEUvgR-MiS;4 z3Pw=l)0Vu1=!RgOe6SqtX#iT#Q;%?t3f6xFti%3+hA*dE_WXu)h$kDzNO;9znYc>! zcLl7&)++fIa*8JiMjXWHHQh3SqCPTPkHBFI;MWt#UR(}K$sYGO>Isc5c1Tno$3)0{ z04k{U|H|SLVX4WoI3*-KGXkuy0|n^SZ5o42k4dI}bFPpB7?zEhQkZw|DvA7#B!i}m zEQwt_R*NXvArRMZfh!zt+Ycn2B(758WyBeL3=X@W#Vw@5dGZ5GE2;s-G~j76H3Gwtd;wlyd(Z;jV*cQ?SFjNWo5qTl5J6J}I3-4N`Tl`6yJR1v|fzsXE2vj!ekN(h}CD#O>Oi; z+Qt$g>IIka18yS(fQ=+M&uMR>XDHUxrX7BL7$>NNp4Ec|TGtW4tvMO1OfrK7;Dnq8 z^L6mHS`x(NeNinW3vFUD2I!AzTB;^N$HxVeJPs$V@*dYV-b-F-lC*1{YL~5j6DK}$ zC{Qteg=+tO6$}J(r`RsA`Z(}qw5<@Cy2N8tV#iK7YbNX$+iRf(aXI1_1d>*^*9P;u z7s$%>*}iqzW-AFWF(CGm&CXb*GlY}0bQc|T5kj;O*&z{EgU7YlTZ}_$jbkrvbyOs$ z(s;qBBa6H+R#Rv`gAQMHv{2jlYir4#Y67&_TDqb-3PVZHE>j&Xv^1Z?<^V*VI?(cM zk;H~?VO3e+q<|pP$Z@JJ8b8k?jHv}b?g?0$ zHki|?O_DVzu|8vhuol5Idu&3SJKH1(%#M(qRVcDPM#6`o4s&L-pljQXYi5^_6OH-` z^mlqlQM&c$wY=sFB;|%Ze9(+@FR5o{;tgC5&RGR!!Y5fKO^7>pF%H60A-Jw5L`5Gp zcw%!)rFb8wLU1K6RiF^eQfD4uMp&SXJ`{K?jE0asF;i?H)>sxS@&%V7c(dS6>;+)& z;3PT9@xG#fe9MITf#65WIJ!-A@@(m3Ju9u>Jwf{UDII(ViDs&UZ*Wfs-MgeHF^2#n z&B#PRK1|Kn3h`Uq5c~3k=njGQtAq@Do15!Yn?AtU1A1Ad9fkV&?pk0a5+oQhyBHy! zv-z*Jh)`gZ@f9JyXs_629>E{%aBPtmQ*(xDjaNo3YpL#s2N~HOZzgepFd&7o87|27 zy5V(-s``y!0U@X?a<+CfkAENQM8*3NntKBYNoEVJ6-TocI*pJ5fi&H|%Vt)_iJ?=( z44F^hsD~AyZJaIDq!^XpOKC>MS-~1aWoq*(t#6V(5G)il6g|_fQHEzUCB&i?(4-QC z>bl6o_A|Or;oBj`m1 z)H6P}KLEoRudv^UEP{k{(B|&oTI+Ua(s;ZwStQ6axJwj*1nHiVPBKv9t5B(RQ!^sb zfs|CTpgA=orXYU8+rU(&XC!JNHO^E}U79x4wmpZY<<39SY(`1Mh{w$Z;4n+}R!Z6m z7A~G8mlryeL`IFlBj`wym_-@WoGqMC0Q>DB=OJ^y&=J8sa61YA1xDni|2e&d2`cxB2w>_*7-I1{1trA&*Ohy~av zTNA-9&G1iPBJ3%N1%GHw#Ga5jB>LHY^FmV7luDV1Ipb2qiPrT^1qp&av0v~Gd|e)u zs!C>KdIo+(GX)okaiUi*W;KdogVN8-24ai%lq3N^eFD7|g2e<)yn~q1yd716!i{R@ z=>sh)E4vZ2XrrCzu{>4nM5$Ft>8NxEnUK=`j0vmeXgWc(34#t?s>EmYtb&hl@b0#V ziIZpvXcqyNTyxmk^R%2r!B+onSN(?C73zvr~XhA9>L| zX#w#EAW()CJ!mFnnEK6U&k}IXm;E@wX?dCk^+l{qk^X_M74gNx0&%!5qi8AokS|!R z^O{So*0m`+i87c0ORDj#8zY_^=2Ju*Jiu@>pQ?Iusa18YRrRb!2}h>3J7ryGGnN(} z96^KO?^H+Xl%ADSiXz8(MjcwBZKL&fY9BzmZ6hW&l-|E8)YsZVN}CEuQATRy))C_k zyqahsYiy=k<)iljT}#ydqqQn;${-vR|J7El)~HODMhY;_v&1@$PSN1h1%)aHRBZ?7Yb_2IwvjKBJRrNh|*-*Qq-y}v_7fR<%W5KM;XgW zD@ygJgyCjeuv*zHi4}%Uo1t2uWe*U6_T;b>bkZ%17Xk~?TO-9`BN@_t=&un5>rTa$ zKnPy~<_{?v2^0p6q?rCP(5VR8ElWy<7D8JD=POuzn7%QqSTa%csbz3#VnHQL>|e}L zjgOE+QNj&l8=sopIvUR@FB<AbdDM5dL#&dlJcl07HdS!UZX< z7V;7T^J?9_U3zx4XRUl?i(6b`r2<8R)*C}xngMb6+ z#=zUyiMD)|4JmKc5|IXkm&k@CQZ+TzKJ%(StNki(mB8gtZ0>w1eSwS!=6VNgaABlo z1E$1*_8F5!2M{Gwf$y$Z-3 z5EhrP!svN(i0^sGMKAr_yy6tjgPS9A<29cE>m;^~7!69hWQT(vw>JroC7u~E8k8g< zw_2AXxK@O&6Ki(fy43RIu2{wltJV{-uv)8%#AUI1#w^w}!#qO(OGe`#;Ic>BDmd|f zX{!KEC_}YXz(=*!ZM9WV)xBaSt#$s2bwK>m zLj=fUU6`oY%>xipqDhnR*1>5l`9OQ=s^u1(9|6vhye&EeJlcA(BkFrFRx^o>uC&ou zErQNsNJaFp6%bZDp#(m}C0Eo&GHTAlED}o(yIMl7VCd6WM3nDR0e^%40AqC9pA~&W zsM?xR#U84yveaR1Tkoh@3R(LH15&)HmJ$~`MN!38EH+;6xUZD;hT`q%*;?oCz<*rc zpue-Vt`9BReg$kbLEDrR6qV^4NRQ8Ox|xz)?j0D^vn0=8vE^9PI^n-Z#$^dg^dl`x z+uP1S9*`}C1(r-(HC>T$A}mp6svgdiM23~-9tL(Xl{e) zKFG%d2~}ZgV1H_r{-1z~7^npM;hKxVb!q)J1FHlLNJHhk15yXJhrdDj4m8M4b$|h> zlr=oZP2i6-leAM09+ELiT;wzioA-|_)Se{?+Dh=R&==Z_&xhfGARQpc1nyMMV!Zfl>%N7YvVm$ z>)yuvsD5_|NvDJqB19ZCXDGT{#MQ<8R}frex=a>x28D*kH}JL*EY`Zk-ciEP9F;=C zUmJm12KhetK0u54KDvtN$1uQk$76G^lOd8rIkTN?IkJ*ovZ(RY913stQ<=5EPGgBF zc=`;ifh=|3-BL{iJPq1jf-R6l_Yw9$1jExH7LJZ-z_~O4XkH+QyGB^fV)Xx?J)JAz z0S43|QJKy;($-2fos4~-P<>3$0ed>(-TIH%)47_4NCuhC+Of1jYC~-x36pk&;q{w$ z3a^oZ^n%@~nHpxMFcy)?vi8-~o~m_AqzP-Lvbj@$E;Dt+yypXoQcG%uV0un_s+nTv z6d1H;s%4d$pc}055oV7G`XAW9)C7HA_Roe< z>Wz2YZ^t}UWVYz7rLv-wpgE;hLo_VuVP^i(^blcUSqn)ydxBduIo2NFer{QM%jV@M zt(-06vbVtyf+_33oY99KS=*c?d+JK3(xg8dn>$`iQ!ON~paRhyv!NsE`XDxU z-N$?-5qk})L6HUV)tWxlgncpWpD?Y*tp%3}s=D-127zy>)uu`~HAM(O1m~!pnMAg1 zk1Z{?TX&s0d9u=-Zl1{2KC5}Yb^mnh)J_wI8Z3rIgPOE^{)D!1O;xL=_Q zQnXIBWW1tCGO$ce?Opw<@tfHC*t?q9_Jwa6L4j?@TIa)TdyHJE;u}s`_q14WyQ=#EtL}T)cj?hdbw|e3Jq?m%8fa;7 z<@c>>f>cv0I2YT5jTRPv{FI0TLebikzea5Xnz(ZKbS$nmWw>ZIWtY_|ZR0_UOi@_8 zGR+n#oDZnX5d+}L%+WjhQF$XUGa??7)cd8ilzlX09+1)IyR6Du+k`~6@DHep-9VJD ze)9s^Y}<|@r|VqI`}D?;{ZwjWIL^i}L=n=2`Du-r9^9*SUrY`)P+fW4DV}R1r5-cS zlrdLJKoG`sr&<9Zjn7^Imev^u_R`OOYY`mzlto~}JwV@bt55-^g2#Uu1M~O5IWpy< zeMkQb&0VvRGgN|jtQ}4uR_$_pG)LeT(Wv=DnHQk~22&djQ~*ohZeX8XzcFwC8op(v zs`S<|(0n14%BnDitaVY&!@sK9>o&@EhMol1aOpPK^^aOMB0W9Vs(z$yY|Is0-hno0 zmXq1D*UoSD%0RPJAmXEKM_4MDJE)~%wuDvd!ed(3CFx}rOl##_P3!I++d9t-8aD<( zjcMF|v;Ac?HYYdk$jUouiPRaHEZnRR1_7YtwwED?M<}HQ0-z8@_HugYvzJq@?7-Uv zFl9NNn#SE@gFJFnkuJ+3-$dfiB8cP&Rhl4LhcrG7_h&Pf6}K!Ip?(*Rf&2U6N)_B66a|Tsr~rM z2Sx$<@s_VBP`YspC|yM@qXGSL8_ZIj#sXV&<-H1$Iifra zB+KI4uiYkgS_78@&L`~&Km2SUuEiuHWZsE}YT$hkqb>dwTJyTz zB~p!bN+$3k2dI~=UM+7kiiCEMW5m`u(%IoJ%nqM5JM!g5V{hZWzv5Fp=KF)V0&C7q zTqN)M{)&4^cg)wNUgjlGe#%QC6po9{b@-bxt>Pe>k_cO**bPEC?&a+ZM>ah3!jSUR zpxi3R3P2)@1j6P8IVzn#yswUyj`}F%prUP+qXQ(LC~S>g`%L`n`W>wvqdy@r+T<7| zf*EnA>lb&lAB%@HQA2QGvyX7kM>ziJ2~NGJ!4Z9xTVIXby8A3!N5=4_6O~@4QGyh} z8=gwbqyh7+{Yk>I3R0MrX+<8z=*=TD(<5k6Q*R*4&P$O0>@HfH`U>IW~fE_z5nw)7F#dksOOsQqg&ZE>mt^ z#oeV4F{2d~0x3#VLeum`!r#r+>f;dK}LFS2(RT&K>Fb=1^ z!t2N`I;@N3)htiqn*~g+aJ6-wE`xp(E`$G}w zqu+PqC#VkR(LSYCJ6()xant=Lw^D)`kwQ6(mQG2q5NNywoH-1crN0HW$x9EzIztZNdIKu!FT7V zy=U_FlIPz)5WU8woU}&rB?^qIh?sLjMIX4^22TX1I>VV*Lc0+5?{6d;j0R5;(RHP4gdCJz>oKmi$}XE^6@6a1=;KoKG07TvKo2N+QK6%V0EMZ7 zkJ$ykRuoTkDHc@RawCMcgpnOv1s0f@`Dg|6FiBvOW6t{AxH0+&Y7h0UQNdAmT*+{l z6A_u#{bQCxY!16K5v7kQ>e!Np36UAi0u_^`EnjBrg?SxvpF=%zXqts~e4*L)oTzJr{L2+tnQYsX z!11}2Ptp8j%`vS@?9tH3Vt%U*1+M^VcfsXyc2`h#(LQ%w9@a64!XwAlUBpn}>Ev=b zX~3xOB(fh4d=@q&>y<~d?}>ChLZB((hCRUHWuY!a=~jh5 zXmpN6oEWV^PA_JUX2|?%uZ)!mM!7g$3`;S`E~hV6jVzN~J2+W9iRjCmy_K`Eyy;`3 zY85*xb_+_+Y^hZze>tIlokA3xuZJhHmbFYI2Q<9yvtx@~s=&Zrna|+`=6^z1DTu(? zfWQ~?DQAYOGFLu9tSSH{vylT;c#~mjjTf{ov0+IoyG4vsE*g*ZQ&0jBXm#-=4Mb53 zPc-(5nIm)OyGx=r8?vo$&8Tp+bM3gbz_VQ($h}bfPEsD8l80UPgZiS6{?a=7%k5>O z@_d&E^|TP3EJTGw$P`fz1w!=ckwR5m!8v#yV| z?Z-V!WdYJ(qp~m_+|TJ+$DxeUok6&hLzdc)6PRZ5_irT+S5^RmR#q#CY4RGRVN~Xq zJ8?$Z?EZ3OGMQd;!s`=qUF&+B;?&3ttfA_1m&YxLfD|4_;!wHUn|ky*68~ME;dgOp zUB3Dq1K%fSd8WLXYQ53xj2~iR9EM(bD{l%p4v(-h zvd6%(^$l07&bu(S?n^kLpP&bKp}ULKJ++WJo|;jkw>_&s!4F5djQxLt*7btyP`HgG zm3LutVXSUHF3J{2f@?@nsCE6C1af{qd_g){eeB<)X{m%~;w}|uP^8n>-W;zCG3daV z+84ZH@h7%75|t=qz6c3o8T<*9;G3m^&@~}*JFjuD@*S}NF1sdj3;y@Z=6NGu1(5|R z^CCBJQZigGD2d2?zM^>^#H7ZYCd9PHoID&{i$Hem&5qdG&;$H|H0LyFk5qdWn1AVc z3-3dE<;^&@ncx`Lo|q)$%5*>Gnm%jkWNdBVJ-*|F=8(t-UVJf1lSJdi7+eB{pQDzN zzrikl*-}cAT!}3D<~Q89+RM8^>_I>c(d{cj$usjNRybJpm~EQXEaek)pIsP{CG9aV zc_c6gNWe32D^fLem)OZJDH2*QLAGuzIheQ(|9D05YVDD#CU@0MIEW-hn|W{5JK{{~ zOMtl%FREG;Lnr#kbgz55pV-6rL`=3c5prdr-#EZIi!(uqfvTp6cYa{qqP9m98BYo_ zl0%Y&4z9X6k`*%l=k~Xf(Z-uG?I428k`&5lh*e1+JpKxTVs|AYr{M*Ee6tge7*l1J z<6K>;{fXx+Jd!7IM%Zk9iXGaTic) zhsr?hTeHc?G}tMp2?FyqG<&Y!w)d8LVr9Sk3x@tYk*Ifk$8-6NZ_G^LKh1KWF}h5d zi;gv8QeCFXqci7?l)0TUBNHm{y5pa`9cGM4wIM=~BQ=$5x9igWO#;a)v}w(B##V6M z*twoNZPZ-f-<_Ikrnci)J8MEsu+WwG{EXGL%kn7}CyCm|KeA-liQAKB9?D_Z+j@%D zo!4MqOc4Pjpk7Wy3-}Hwb!y9bOtja$W2OK@c!pJwxKcJ-N)@=gf-6Bi zxW}j}MZ#%RRinNnDtK)?*e_@oys%$9lm`El@6eZUjv9;1qi8d+J4v3o6*!g#42Qoj zo_Y&IU?KFr{SXer$uqapRK8Xf;5?#gCSDpnfq08sUpKR_PzN*@qQ)A%@Pi8K?}i8K?9x>0p?qmEYnhxl(~YXd`m92u>PCImRHN!9eO57U7{$9v0V9kF0Da7-)eWFub6=-4+iO0puBql@ zDIhUnC#8FctVP^X<_>&gglL#)ZN&|-ZX0Ayv9x{&{uxV-?N* z>y6%y>D4`BURikd4H_N0 zV=-UinKwy$ozvvE`$pb0(Qsw|CS81y`4dV_k|s9Dog_)LGdt>>ilC+8MO7fOcYhJS zihWC7RNM-l;zdOHD(-*(rPwCPKl$kkcMCI`l{ni@_`}t9!qdUh@B_M24ZnE*B+{Wj znvbOj*xCw1dCDp${=Y3L)mA81tMUI-n`CSIFNP?+wf$E|3f;-4?*pajPj`>`v}^RI zwdqf(u^zbB9(Wnd*9Rbu}4k7A-2iETYZxLC?uUD?hwe0x69N6%nrRrU|R1v zs(uBC^`3{-ufVR}b4>jXs^8=MHtIbRZAk1hM{YxIM-Ce^@$dZLO)qHbkEy@ee+k zSSmmDrrk4=*jfU6(nGx*+?#^zfyF$?)Wt|2yIa84*lmiPguPJGOC+wkAw4yA#a*&| zmJ0O(AV-%A*RcZJj3ea+p(mRh$Z2Ei@*CLd*!}hHe4g6`%%_O-DKep5OYW*V|D||P z#>_#u6p75s_X+`h4@bKpEV`2GE)+yiYb?&KkFD|~vW4y{y2k9Lb%ATvzwHcMdJRV? zAt4k6S8uG!g&-neSZ3t3+GM?u9py$QuQ-ubJiDUn=?3G&^p^|N7c}=3u|;QnJex?D znM7+LIzwgdLMS_EMcSey#$X;p)^un{7IY}yQEkt-I%uNkJ*F8UryTOAc1*_sQ5A-9vm*Y+HC*xv*>D%bpNs4X&-gV%N^K7)5{C zvZ)M;@YXjmeu+%|4#{ebQrUe^QCI|vGgrcmJJ^u9sukX}TW}BE9v2TD6}k;0A9Mft z#L@GxJ5=m6mYa%LQ)7_$OMR11$fYuJ8iOUz2i{3BE7$3h*iHqf#Hzft+UDKHOC8Th z2ud`p*)ORdJ$D8qPRECmsP!<5#AmcylU~n+a|GoaO2tcxknA>IN$>9Q?nh}R8QHBv z=G$x4K5vbmwB6#5%AyJu9pSSTuOl=9tYMo+hhnzDIR$2X@pd2Ol*IN!am$63CPqh7^t8 z;4wt&=%SgAJY!IgY{fb=R?0dUKp;bYC4Bjp==!OyNO5%e!$^T14yeLb^=+8v>hW%v z=j^F=ZkW(h?TYSlQ$3-Ws6H8dII%yv{2|gmWT(H2L^Z$Y@sgaxRilzVlz7QlKQ)?k zg-fGJPq-wy{C@J?Z{^dXb+ktE{y3Glz1p3$@^iwJs_swhi!Q&1Ecc|cTp(FaYM$gu zHPOme zh~QRh-uIS)Q7!I|NX)=jy*DPzOs|1nD}aKkGglL%=agrO--?tYl^h)-$z3P?zK{> z?@9b=^hgM7TfL77!KScPesq_&-mEKQ<|o)Q9}hmBp8MeA=K9HM@|$FMn<~`&^G49v z&e$C9`v)d(zpyX5hIMg9^hxP}8$p8PA6N?#Q(Lt0ZmiP#{wtGDT*$&YYIKjr3YU>6 z_N0Xs8tTnoPqXKG6jm7Mq~@`RVY8a+$dP%t?;E{(Pl*^>XBk%tK4{w`vyFJ4Ow|xLE7@gS3s_YhBVLYXm%zISNGt9}Xx~w(6InV-+Bc>yx`FCr z6J=~lm2m{9`9xPX9t>`@yYkqB(iJ0BL;L(RriptP`($ua;=iKHJ1Md=RitnNqq-CQ z^t_#kezs_>>vuG;ObtNf*60JRbjx9M$t6|fRdy?%_#b8pa|z5v$TkKkpi)vEBsz0n86{E52clB(-j5vinSqw8CrS&n2(Y>Ph7WR)YA zR5{(0!|Zf@?W6*%Nm7H?CFv9W#!hgxT6H@^=8vv$Iqn^`aMM(X5!`C-I!i5FA=qF} z@|9$AL@H@XIU6Fz5~{I5a%K$7LG{kRLZJMUY0z)p>TdhR}wAw z$k$hyN;so+VuSB>qD-&JsUXxz&^urG@rRb%jtR6gR^%OhT?6{8YlxSD>pid7Rv!-p0=9EPz%!yDMWekNk!&l$ytu}<3aRRX7QVCZOz_KAmW(cf3* zLg2`FRVd4aLKL@&UrTAKh~1wkgfNje5X>%FR%n1Cc^{pF>xBK33;~YKy{t1+h2;cjN zWB|!xG47`q->OWPIVyCf$FG-f1uxQDs=?iQY1-H8jZv3q7A}zB0!pvilrY~9?y(e6c$g@h!)g+AsaIFQ6}#CTgOy_*Fh09C>eV!Jd9kSX^F7w}9J zs>(*fe81|5NN8JDeYDgOsRT5LM86<5-?Jd3-zR*ud3POz@8=}#-yD$(M$(>jinN0T z0H-QV>Q!MK;Bp@o8UpS_>-sSrF=|knYn|Vd+p0oIr^{{KQwM`jbv>WrCcCgF@Er{L zQqRV`f>%E1dir2hLF$cI+m250$_Iz*hFi%_g{}*-tqPl-W-9Mx5-&FV8 z)V-i!q%{;%r(UUi>P_jjuMW9mMt?*FdtSF3vgqjUy%jU7*V|7D1(#Gz%7RDUgIV62#1CQDwduEwKY69c68>2F>z>Vo|{bTtpNYk4n=>=LmJ|bZ}d1HUPa+n#eXvPFRt5IzE2Q5xM-IDCFzc z)7K}coE7lTGBRwo<<6Tb@{z6GgmNv>5wuu`o5k`{ZDe zA+bsZT(Q--?@Wi-4jH@K3pjVHdfe>d7~6EGA>D53Ch}OS!_PJjGki>L*k}HRQd#%J zsmnJ1BXwWZVE#z%ciDPiTa=g5onEZ=GE1%Ch@7T`S3*ppbImfkm8cbtb;OY2lqo~T z-IB75@T(1xa%6=$L_xWt>v>}4ZBKmB=r&ntB~N!fzitrtI2OBG<|?ow{2I|0^qe~l z$MnD*lE3v;G?}9OQxZ8PumgwLO5XXO-p~@O28ps0oe)e zsAVdEB!X_M9{H3ghT!5*<5H_~m9K^;x=ke2G91VYH`&9n+PGc%A%(`)`9Hg&Ifk4~ z@&_>3Kme)qnWaRZ(I@a8sV1gXxYwNLjjq8r(%JetAFquSIb(OugeThQLr}$F5HJdr zxWu4qK!Vy@kSoKBESq4usfLQs(QasdOwF6&)ir~YKpuCuK#h*Uj;&M`IjS-g5&f2- z;LA{u#hI_6zBfJY=OnCT*UuON;!J2=;yVM67;+d>tRkaNrYaSgh+XMA5jq=D86o$_ z(I;g(5pnp|Es4z|u%usRdckocgm4p%0)m0{=(BBvEW@{H^~nx=Z2;LT1l<%Gq03Z){Q1Ckn7h#yl@`BS11J8Zm%` zNOCriT#~#~sxYd2m)Tt5&Y-oBb8NWTBH-d5OHDObB65U3P3L@6jpooz8 z0U5a(U%l~|)LnK>Si_zooN0Us>x%dI$7u{IDnE3PQ(-h~v4@ue5pH`E>x>CiH!egeRWCnK{eaR z97*p0xI_(M;d|f1X~6VWipld z{&rcnG&Z88@tv~O__CEufie~#z0xmP54{2hqDK+^$uyOene!T%$<1o05K1pnZ#hNn zO;y!keI!Szalkh1;8bLvkkQfmMFQ`L5%tk4<_+-*?+wKvN4z4}y7(Ubw*@@;y-*nO zikyf3UW+AI9wOCde^W^03;VN1t0|5Ekzre;AUmJAfOh)|JFr?-jDg z+SK*lr__DF`W1dz?-hZi-YfE6z4wUv6+vsPdm6uJ7xXoQdMRR>*^&1|fZ1J0lGsuV ztnaQRhdZubobFlZXgWZ}&DYeLH(um&G+~|ZF#mkB*oz$@I5qZvJ`U{-!iCB~09|P% zaEhNT@)ipWD)h?SCZWI-@kI>o=@g@$g#fEH*Ym6^G4?3l?&ye6=BWAC@$hyic6?1Y z$%y@w#}dwmi()6Gb;ni$BM@fDt51pbK1^SXaq=!?HcMN1CsLQxyL$Vb450Ncm6yoP zkc=Vo))kQPbRltOT23_5BoVs{&^d{A^{japM%JQ_m?^D9DWJH{V<@s?pmn9pK3g=| z+p)Mwzp-@zj2L@@GR?-6x7l-p@ys@rGlF0erFU_(Ee|`eUkKROOmV07sE#N?>?)o_4xU*P{h zbvVB|d{NZQ2p2}paj6~hA}c!;5l%z@z7&W^_g)> z&?>84fL!ZrCl&LdFF7J}-7WBMcx(A%nsbnS26nc#pz>%iyT9o|r;*EiS0Eb=nXA9@ zR?-60FL7t|>oxlW&tR9oS&A@cGG7W-XXRSpTDB}Vg|aTTlpnfkfy_TDkXvaN^J>FE zTIi5?gNC0J2#zlHxI0-+^m0l{7P!6bpceY*` z4~i6=QM=+oYwbglT=0om7wxs^8x?*NBxTOcNWlkCB3ppMa|>eAhu(h)wRXRG`XDBn z_9sDkqdvX=_mNMpj{S5O?mJVtUK{(VWz?sW3cO*|Ct)Q=)m1U-(@AyR1DvGlI;p@m z>ywb|Ud2o|{mX9_I7ac(+tH(_cTLjDdh^lr^XuyQ{`B)v^}H$lY_Zkt>1T_zUXgx& zQ>DKt{cN$=q4cxGW>=)2EmpfY{cN$@`RQki<@TqarKk0#BmHc#;e%JD`eU);M|c){ zY{39(6e?_rL)3q8b&fIxT=DL?EW<2{jO6G_4{WV$*09pP)YdgL{fLoMz@f0#?NZTJ zc_jnaV6K+u7vxzQ)?j{3p5Nm6_tKEM2D6?Qs?a7W^g&+6Zhweh$jW6BA^6F59>NzT z70=+jPbi&Gv%9uwQ%JUbiwynxVj)8#&BpByTRA_O{H{^Sud~$sqdmqOxBpWO-rPuY~mn0n1`a zw9&y4^qCCZ9QZ@)*BhF?HfH2%sG#Y#k&!Cr*%}y9U-f%wYn|QJ3;0xL59lQBEh!ib zRdzHVLRLh}7k#uXxjsW`$3jM|j)mrx6NAdc#k$4H+bA{Gd-d-O%GIZr zi7i63&l6B7TVE4uu*TbabzPOi_z1$8t^I+ryMzLO`uX;>=*OPO_;{sX^p1&1CEKGP zyD+k?z9_?=OlF7@NU!u8<Gv%}+ONAlX|lsOZV zqH{{~6aMx&r5L_*??+BBr?kSD$He68bMnN>gkZ~-g(fFMV%3=I$16Ny0R}o!B5gS_ zf`ORlxAHRZ&Z<14I!Blu0>+nN%wAjcr-jk&x!ABb_*GPtR5q2yvMkH7Ez7n^5e>1W zxk6td^ljA$g%inws6P({MTL+|O4x7Py{H8zL1cWAeXuSnQF13X%B5G;!Q-9O_LiSDmpTEobTa*_; zUtl-KcyOdX5!sK<+FFsTe;YZFzvE+N36*16LcJZ%?)X@pTyg8wemLsblRjWWjFCAL zbT7wZ48y?-=ALQfI17`jR~E!83&9VLc;!^SaVEplU`8rHASbHI9^0sJXY^^&>+BDc8aOLNv9NtcPrg)1l<=T<$g!2z$HZJqmx zZ4Hr4pX0GA!1`UELuGmDrBAQTk+m3mbS}?jlOpF6XNS{K@W+Q2DdALRig7xFt%Y$M za|TFZ3(f#3aj${46lpTE9J@oR6y_)2IAF~3ckGhV1DO$Q=6+AH%9tHB4r2j_wOt1P z(GM7WI2m7Asn#WAA>)e>HgJawiq`cz2=b7Ez<{s85Ogwy8VH> zrS?_lZ&={!@o!k*#7btv#Ga6g{hHLuBI-agxIeLPaTCkIowIh&hta^vSl5NQIt%Kd_Ch5roh4!*cq)=hJo~UR@pY% zm>xCrcQ94J4oX;*fE=-d+C;&B4q8~BdGSI4+Z51d>zR}`ay*G0Rn7=EM8<7X``5RS zs{2vTcv(^(N$vG5_Lo|P1*G+|QSga~hGNM@bRoW%Le#Ad>NE_U?f)Cgk3rC7zXG`l5D9X^J-euVD zRA-dnF(pup^@c{JJ3L?VcI=WNH!_iwP~Fq=?mUqox}-NA#{wa$y0+KW)i-FJ|IX-% zqDt$Oh(Xbtk-thX-&T2jV?i#&T`Y7=wl*Q0jCV@@#^zQOE%j(!OC;BBjt$DC-$Tl zh*RYVNJ=@0#nPDKkwVUmmO3L#r4NzCs_Wqe_*~Wvf!IV*v&VSn`fd3nSH!?%Nqo6V zTx2CKP>BVwlMt$`z&s9g`=i_Q0u!~{3@D^D-VmPgdeDs=_%>XIAS7L)ckk=_tN$Xh zJF<5e`#N6ZhBH|H?0tQv7ymigJ1hb|dTfPk?nLCO+q4jMvVs~2W6lPmR|jq04)xBXTtv zyN=yy1~Tpr9+?$r z+rRR~Wt1$ZA1vEa5t?B>U_rY5WoThj2$nCDoQOV75{pPa@NS#O*oDrP#JHltY)BlU zDprKR@2J-OzFO_J*#cig!)<8JxPDtsRRb2;%ueGkBA(`~#H42J`fZ-n%Llctvq{~o zEsISf3=z7d;PJ$`_G=vB%vn`|p_T8+uNHkzfMvdqa1c?E4H*-*4ud5E&`<)Iuq};7 zW);?0d#beF^EQ~3Cw4lqT?soY(N4MFMZ@nmFJi8hsRZ`TL$TH=Sz#YeA93|DXc=k_ z`6GWPb;umXWCz|96=0*08x8vL5yRUz#9}T&^YE4-{%Q7XF!_ydc%90laiU`OMJlkB zIdob+U9)N88`iy*gwcjQfLs;<)0nU2eC53`$h)GlPMs%$L(Z_XDmKd(;6(dvlR%`) zmcl#QvB(xIU{Gsm8fHegTB76K#ZHsf%r z&A&9}%LMew0KKZ|f%jYAQ@=}WUYR4$6D^?gM~*=l;?-_C0I+|$)_eAbK?QJiDS&$> zgd*I09Ge~iIG-mLJ})bLuH29JgwKA6Ij(@+bPp0dvdYKV{s$62Xm%uA_#u&Tqn8@6 zn&_#E-CFR&j$?9M34c1#wpO1WT%-qY(t|f@w>=3dW7Mq?Wm9UAy@RHSMV8T=wOCf! zVx!+$XYZ68e3y0BNe{X%H%nW-fxN#qd1s8|(C5z3i7!VmX6~dpG z;^wwyCKYVW^gt2x>vh%Ioo8^Xb^Z{f0SkSEJ(Q6+uXBl+=Qfox{xt{Lg}y#sM>wGY*fm5C7BM%%4TKC(8Xa(r(j z$M(@V4j}$*b}g-M%9hmTH%5|u-%93;+$6yYn%(tHr>P{@jU;JFCy_8`;fsiA7Hal1 zdzvPwl=&km=ceoQw70Eygz@FHo`4t4&L&MIeQ$cYL+4vblfj$X+t#X-Ye%PiW+dhN zup@Mxl*!=CXxmJWwoxM7M1!H~fhYJD{cv1(eDp(bIZOxy?&8{J*TSX@DwH|CZKR-I zk(kM)ENAehf%61dKEx8{d~VeARt}{nP#p05al_jTnVXPQhZ+qpSLR*Y{D%#%g5Xs8 zGbFuCX@w2d8%!GIcfX?7;HO8yxj@HMYl_bSCTWn~Hg%g!uA~~&+ltLs70y#Yc$#Wp zg+0%DaB4d9tD%t~Gp}A!w&Fix4Q&Z_?N2+!PLj%9Gkb##1v`%q#j~II@BPVE}^FnSe z^IV94{PPM%#w}z+xYhj1NTGL(E|l`z2L`U^RrJHG@M&am)`i?J56n`DzyM=G1*!)z+D-$*5!Llfy51liH_g|sNq2k#MGJ67SQ7Kql9+ETiE)zL z+&Yr-C?HEpmP9OwW=GbdSEc#hNSf_d8Za6Jh^eX_uhOg-N%KQ14K)I|Sp&E52>t?~ z6?~V_2R(>qWKiEF>Yi|h+)q~b1YhM|Q}@_^a_?66)W-e$#C$YrDC%l9I%CPLtepKD z2Af^W+|ME0@<$ z-OzNQB!O@Mk2uU9j->3jQ?}ida8sB#<)grSRbXT!*-u6lm?J69S1D>oQmh}9!Y3)t zQYkJUNg;eys!<+Ek*iW@BPjx-Qd})5&Q>Y@c6GXALcONS7*-uSQzh9wlH>$Elq7A; z_HmVDl1lQ6ktD*}TS=f2WB3L(rsA6Jl}2e8e#iF`uy;r}rmjS&PB2P6cqv>Gub~ z$C&x`$GYS$B#U+;RkFSmspo##{3u}exV0#~ZcngkA+e=a@u(9L!XbD}+qmm}s25Lk z`68MTHfnC!dr;dP%+4OfqVrY%g*&qGQn2A0ALEM=``@M6oN%g1W@BJ7-1YQJZ-u>w4;&17 zUyclm)<&dB$6yG2z&eK|3u!5wAI|qAYDKksLldVxYEE#Qk-ZzAsS+hm-H7wl?A_51 zSSCY}^Pz!Gh}vj&WRheXzoAKr7*1Tep~Bk}98R21&*i-^l~PO=-txtdclK`ik(NQ@ z600V1+!#WXD>0|+ruiG1bImiaMclNPGr2DkQzk{gbAEk^U)$o=XW%vlf6Dp{KZ4(q zrvveN)`o{v{K5>IyLo~jzX44bGdsv}5Ja)CURtL}w(HGRd=C(Jepu@iH7o|!tGsTk zu$ME1VrV+b&N{l*Bd%&_fn(iGy)u)A*C0;XKD{RA!e{$lgZ*Z{&XS?pC(}4dZyU_s zr~9?db?+L_$^3qt&4sbUtwH3S=yvXsL7!fYS8!ioj;Hm}#CYQduX~A4$(M#z!26OD zVrlED!p~TnKa#?&?&3gqVCuHx%2~VGAR$#5C^~C{kSsRbpO;&MsMv7}V}~hY@Tv#Q8AfP@_Jns!CONY~Uq6i0iPNMgy1e z#6mUZ0FKqJf$e;t0%iNY$~$UK1|H-KN7+_q#8!C|nO5)HTZ;+ej@Qu`GIMW5=hKl7 zigv&Y_!DiM`0uzn-H%Qw7UjfA6U{3zs5koU{>8qH=zV(U^Az*!^u#o)x=N|8((6WR zK#TJ>NL4*`+J=xDaXnHFp6fIbcT~G6Pb`}U8Gtr_xCDO691ch$h?S&IhZpS?QSQLC zFvGB5C!62mt9ZP;t~;)O7r&&4U%dKtX#YI=B>7p1K!_->I9qe#%5uO(Aqq82B~L9r zBBLK<);F*{YPZc(JF&05G^lmW=DvN6bB)%;S$^(ZU)Q>>PTtFZ5mdzvZb$&fSWZRXYp&_ji(YW=3;ap1JEqJdahijt)r)gc+ z@TM`k#s%jlhn}KqJjg9Cm1J8gyfAg=RWqt#U;F(c@^B1j{O)R(d)I)QUp`uo&Vl26 zmy$BHE-?_YO8PT*MupeCQ{3)>6e?uCSzg%S?_;5DQ&|5wg&xjGqleS8_Zj^c#zkz$ ziAvU>AXK#m^*UauV^02;QC0lMt)Q?P7D9)JWfBopedL=`b)@P4yK29fu2!T((cqAe zNM2gkcZ5yaS!}lB@a^DVk?JE0)4C7w9Ypfmh!?Lhhz1X<(F{LqB19!{opp4 zp4~EfLPPh-yDqpCt#dQC)zH@xCrs_8<&I7A{yv_|UEH<|lzZe&_eOc+0EM@_SniU` zx^f5gwme;)#U)W*?*A#(UR6GU%c`%G%R!j%4dr)Ak_XHGRW3E<$scpMr`&Ttmut(j zNZGQX+$WdI6CLF_+-SE60xUmM-kn>17MJj(@}zv|ULqe{KjZfHh1??JADGKkMj+$x zBckKZU44eOxqXk`;7As9J;jAILTErFNUHKuh?&)usyR^Usd_YTt)l&#&Kr5?3e&84$x;-z&Ud;MvtTh3kJSg7>1`;oxkoa}$#t z9XLCD`Rwq;9RqL7qbrkUhqH;S*3K8bIMK?GG3}NDQ zN|0-o?oVXK9iOKdvE2jXF2G?}qv2Ag*HDPzrPi3?(TQ+oK<4O`gfQA(9UU5v(&hI5 zq}71N2Nr1jg$qg9RY+~D^cmNAS_tu)gN;_|Fg?g!(Y(n22Qo#2ew_!p)qA4P8Fo)c zh39aKQ?eZ0nYdBq!C#0_&MHr0HihGUR0_xQ_DWykXS~1@{*aSbk%Tb=r+xU(Vn3Ur zQo8If`}o3f3f>Fi&p=&;094JF?d;nR9hZX_<5gm+_!NB-cg-B!%N1pO8=cM@7tM6V z@^0vR-BoL5U11X|Dc^{j$bn65&bZjjTn{q4x*J2g z*JktT48%(u7+{F%AdI?p5%GYzfKnWYLE(mG}B5)ee|6!$R(G;Z7R zq60;P@u2DW`VEle#~hEGn~Vns+p}wuzjef>I*L#P4dQ_+yYB_)mTQ_mUK@z-+}1Kr#4+jPz|`;%=y#VIY? z&O81~niJ%heJ}^93!cB_WlUZk&}%rZ1?L2J>0=?|nHyHxE2<7r-iW;SD2{&(PcdQd z!LjBqRREZwo=V7@QK~k)@Dw;kxdkxyfJ_O`!jThhYWDw@ z(Nb$B=Nm^~+dE(^Pv$%}x#-j>jlr@^@`oYjU>Pj&3|!H1w;|#=U(yIAz$_;LJ)&~( zB%XrXh1|-LY({eL4Wj*71FPJF)u#safmIoUP~_GJ6whEa&Dg<@83q^dmIgLjrj`zt z7l8eW!D=U%1Mh&b)NdasJ9V^opu{MkY%RpJiz~4iM z9N*pV#RkewFq;S8;Vlc&_5k2J{0W`X_3(<>k*0r&P>25*GYU?l{qkXxVOZ@R3$S9s^yTp__p3K>aX*<}IrNS4LF~d*c3uw@=AOgZj1*jRUvP?|NwgnvDe}&anTxE$8 zcZb#gb;%wT$zc5K>yu>_&+84JCUpk$vSMs#savgpoJpEtglIdB{ahIaXnH{gwqNWQ?`97 zoKXWO!zs^@pAWMe;LM1gU|kI}-=F3)9~`|f-&r+X zoV6-Xt2%D2atr*b8=t^lH|54iP|Fq4A1!AI(br$!a#n!!SGJs8i+6eI61^RoH;_7; zxI};EqzKuPc!nSZz%WX6hGqkyg67I`@50bOE-ZSAaD?jtsd*B!_4&vNxKDvg#1ny_ ze&!SM?%{*?3lMQ5O_^2&GM*=hnA|7f)uMa@uPJz~zfMaBp#fsDQF}`z6?f^E1#p>D z*Fmi(SeDV~N~A}2j{;=w#z!FNkwL)UyhH>biNB`@(mOAZTt#Ge_Ol==^+prD}_oxX}d{oYVxVHLa(c;P8mF z0q7}iUI;NSjN01)aavPq`wLS*#VoX=5f<&z$R}xP0NV1NB3RKEsVb2y<-%l0Vb)PZ zQyidnvYMwrXyWvaG!{Z-yeVr8vXW&WD`mr&Qg~D?%Y?P$5|8GyLFr|WAhrSiHUu`T zHei-PJ&XM<84+aKOk>PsWFh34Zz3Nuv5XkV1fZc|c)=@^O>UXCZ}79q!RnU_2S1ax z4h~jBP2&B*&w_*1uVN?%Kf`GR*mbaakJ_|t@G}@>W7pND6NA;TVW#u@DM-r>Rv#Gr zY_R$W9|L?G1t^CFj^V>(+29j>ix7btik3QkWm}|&e~phM=S>AEYEwY}dmTF(q^M_r z@kUFYnFa4Qj^C0&oZI$wKf?)hs94DA#Rg6)rTM`L}^mnR)n-Q0P0*e z1&T$>KTaet7K2RF*OISu#p{9O>&@czNb>bc@j8%vb&1!bu_{)pm8O8!Xop$L zLL4%~u|m<7GoZN5Mu>E_xc*xbEI1%L&>i#v&z9I#h?CbXTqv(xD9sz0@xO`1a~S%s**|Qdxb${u2oBp#a=ug|I_pF+hVj> zaZ%Hqu{M$Tj7?cDnhn=Jpd2dqnT7o(zPcqws!gmOJI(kO#89Uw0hGiwSqR#7*$LFE z$LEUafO*0OyA6Ko&ridVKXMvgP7dYo#cOZ!wOhQtnt+}~$&k}qeO%hmg8e3tpktVS zVzg50n<4}Nr1dp~AdIsO2x%XJt0}vuZ@QKkw>$;nuc11K?d~z<=VL!X5?EP*C8Z&Q z>rrRvq1c|`L3UXGU=8H}v9+ZQtB_QK=pUr=HY^F&rPM+8uEK48EH!F9mZFvYNG;o@ z)L>sqF92`{ks9Db-aOlG+&H!`eY@}fmf(r)l)65`+|p);GTe4LJgw8!QIP`Dc}Inn zG;^5$w?+DF<;ur*DDTF$At^RLk&D>#ToUjuiuL@@M({W2>mw{oL7mEQQ2%+>X9?g` zL2X#yj9^e3(4W9B%%s6INvju02}5&70jp>w@wYBzS*^F^gaR*CO}bT{jGq%$WijG( zsf|*hgC$2JCp?2tEJS+;O9l`Ecy$Cn0FMvg$1zy)8h-49C3|r5WA^Be;1rI>pzgtK z5@%T_ltnC2DfxdXtwpfGM*w6g!z3~{t{wbrp!#J40AI*(uMwWh@T*4nmcf!&qxO0l zP=ZMKHn0ngCifamemU7>{T4tFnC|$DF{wpo^s~Th;>R%y#64l(BQ2yiT!TShP^O1SSfuOKg2&t|*ldSvAC+Du@B#W{1QCl$=tg7(5^Q2gU@D=L3dM zt>&t2Ih*hoTIZc99eA(4vg1yS{E3bVTLnA>;?}E3tO0$^5}!y`Omgsd zipuYrZVo;`NDw7Y;Uve%({C>zV9=<<&|?bdP69mYQGhrPz@ZC90DbR)lJYiq;gDFB zS`Q)se~%MY<(Qm?fJBbmF$^zGXvc0_$?jrn!|vjgzujGIt8M9`TPe&ZoIX@PS)RXGBxKEO;>IjSlLU;4uD34mDyQ&_=B?*FP^+$+q$)%DqcZ?onlcD_5}NKrfgof?%K;ouqmg`y zX?QSNLIUBK)J0`d_!7f`Tjn91-40rhEPv^E(=d6078e2`LEQsqF!^z8{?QF7*STIIkT`2rWLOB6lwPY13#-)mW zdX*8_$iwo=1vyp)B(CeTG6cdiisfVPi@T2E^o~eAyiow#5vqj%ammvr?oC9V{1rM} zzK%zlUAaQ^yh`JOp8i`qe19;qs!xgd-LcIR!$rQp`N%4BOAzp9jUzn(GE_OIf z1)RYu!m>M&R4yq;IhDa#hkzJ6Yg@iuR;I1A3$LY+RFJRLc4>#lD7YLp6A?`wy1-ij8b_zp;qq;P3rS3oLK+%cn41$l)y3yQTji*w$x9i~6eA?Xovp?SkU zgkQCK7$cJ(z z#XXd1%?-9%*cqpo$KHxaZ(3l9emk2@){ijy7deq_8U`h}g6q;{9=Iz&11C%&Z5YA` zLd@&tX#&%50@GM`^DqH!irT^LTA7Pf|30Kb0s74ohs}JH+JOy$vJpD?s2=E{u9V3} zri(%0J&`mA1P21qA}Cv|4qUkmg}7+)hI0lMboB`kDfOR!{uK&^YD6VAmnQsOBm+1~ zust1^Q)fU>0UY{=PBsCluSH+5pB$A!juCK!{;NxQS>qEFi85fDx+K%;0l^+8mC!OG ztYieJ-jM{41aAy?Gi|7V8X$H3mk5AEMqCwaGpY3>1TaS9J(T!?eh;v*n>a=Q=BW%^ zHsX6DD7C(XROp^Q-fW<>;R(dh8ZV6?l{w8J8o-JK*mDY_1gMotKp3JU0dsU<%<2?} z1>WGAT>2wJ=E#&MJHbQO>_izfacS?>9GPK#&jfR1GL4ZLPL7O2f9w)-WKwy4c`zpC zP{dP(0Dc_~ondL%-i zs|mhk)5LM|S|{!Y3Mn}Yp~LR?YiDx4vYqpt1tP zOI^gz0b}8og{^`U3Vb1zyd2Pr-!u-FJ>qaV9#!^8Thp{X#t|>IW*`#?JEw5aw8Xv# zQiRmHUxZ)AdXQRQK^T`YupJVKwv!kH#h6E?;>F;Y-bBHP$ndwNhl%P!%%C4kYe=Ac z4?ng2X_E9!n@gkzSl)r=WrT zKD3BphmZuRvjVX_M(El=jC3r-T^ES`#t2;>i2cF{Wd~wU8KD~jF|KW-yD<>kV1#l4 zv4@P%%mBdk{wfM;m#8=|ymOy+Ner^rKEATTb5WgKid4YH_ ze!dxq7vN`hApTAKd@B&Y`6lwm<*Q3&PpLfVrq*VFotNX2FA%>JKXU?c@Wj)+f+wDq zAE=Fl4HS(;)l)&}NILYH|3P43IG#tB)Wi1rbXWzo?S}&)7+I@J4`BK>A~BphONKo1 zu(aW3j4@KfEwLcgY?y&};1{u_e}~87qb78O1ChtXBnT4Vup7Sbhv2n^V3y^TnN;4SvKjn?uIQZS zoV8c#87lI9u6!f^u8HAmpvCEl?3}cuBBDjhs8Fk4lMh_&9^8Q&7uoni2`$3thKJc(tt&_OpYIg#X_7IB)rCYEMzw=YL20vk1Nci!$#x0Xx&%Rh zU4Vf;8IbQDG=5yP$Pqa<4Dn~9IgZ4d5q&zo0{Vy_Kzb*1GGSK1uKyaNh)5wi2bLB< zV8hGos5{4RA%+^-Nf(IQ+wiPa+g}zh zy?93bcZ=qHU7OV|_D}8F!_-~Ri#)4Qu+d?(VbmR>ISyar;czaRZhBQPdia{ruiqQy zSzvXuCIDB_HOu<_0d9Jz`KA(9ohi(=7~b~O@G`Y#sk%9Xt=XI@o-ne3um?|}@`{xr zjO0ba0hqutikJ$ou#wsTAo}xzzYNK_A4TG*-vC$a*nm#Ffcz+Ye(V;i;waLX8$${a z2aI=FAZa7_XJ{&*X>d+ucvRn8!zHFj8Dc+joF@85$S7+#KUV+Mk7+7@O~x8x#W%Y!ajPm`todBUEK+QDAO)6`A; z)o#x>9KD-<-fyR$_Xda7d^e`(PVI}6&#qLLL9#Pxs=K0sY+k}%;Q*)|sTk!L%{O^_ z+$c?I71j>A*g)+Gwl}AXEy;O;E%Ww>@dncrSXdgwvGMEeVjG+8s01klQsmw3Yf-P( z!^oUBq!-TGjB;Pt*E!Jnl_5zF=>UjA?t;sB!Q}ge2HILXGZ@Jz$6F@3p#KtQU-E6iR4yZj`1^QVh5of0=Y8_QK5hjgr--b#9 z`adoDa{^-iKg16>cN_=Yp3Zs?JRfQqw`dP>+|&#ZlVJERY`-tA)j)XO=^I!(9lAyZ zKSm{%oc-EAGg&0-N)Rky!+0p#$#>05hsRcJ5@f{S^l~qJid=&``n2DckjEEcUHSIh z_eI>Lc5?CdKg5O1#V+*aN8NQtdKgb{1zmOov~~xcIbC8d+Bq-qQWELm3bV*I5J&_1 z8xx3LsqM^{RHETMgr$q)5O`FRW7b~pBb+;&d=Imw-coyV^8Wz^@yPT}k~TCWjF$WQ z8XxdI%o$OBIM#@h@Z_}8TjrMUf)7dBak9atc8;HtsYdyT7L9^fs0IVK#m?x0;YxLp zK)fE^g3@8w?HbfTGfuXLIdv`l>?Q0saoLYb)R+$3dAicMHm&DGH!>k_%S;qPEY#>8 zkTmp8WA8%f9<5@J?cSvr;biwHC@8uoZ6GDt7hxA+@@;%5!+j9F5JW)++jX;rO~N%@0gNalG~U*pfAcC5;>y3 z%`CK73Zck_Sv&d5mAitNPk6Z2FB=C5E4WCZ8O(U<6}D7=(Za>FiUgOju+I)N^u`T` z`;Gq3XCQf`)&Wn?Oo!S4Ff9y1^r+5J^X0ihFF*+4iuMLZ*+-*%M#5NieL zq#ySc6={7*C@P{`DREWWYCRG@pP?r)r~sH!J4ylwyeWuk)_iukK)w|@UP`@ z1ccdrv^0`QlA?>=B5;I2mk$?7eO`2pBN|Fkp`zD)`#Gumt^_U~^nvOr`=##7#jiRE zhh1bR#2sC58do-A)+gTtlcBATvNHKCcG}^KwpoCK1QPWt^wK|lg%h#y zn?_XJbGrRObhKH%5`O=XA=A zGgxqJaOAwM4cfj$y0K-k0g=0%mK#c8bhG(8QwZyr;)xtVW6Yu@6KJ{vW0mol7^|Y@ zrU{l%{WZpCYMo+?10kk3`>9C5#j7^h*;_Z32HwEdoX`y9KrO|*(804|B&C9cv&2iB z8W54{QUi&#EA)RyA@Cq}wzh3=eR{2`5%$E{vSTAtDZ|e`)A<2SY+apB)eAO?E&LpkPusx0MpxMo#fD$liQ>LJZ0G8DkR% zcytFLq(I_Z`twf-YUiCC9mq|q>DmsS@V1LQp)#vgWYtSh-NkKdGiq>hTBJ65_7)H> zyJ|Q#_`OPaBo};)BEg1{aeW{Cg95$WB9c3 zac6T=!m3W5-K41fmpmuAW1(GloOGKU;0jwA$6A*>% zM50ebBEp@QfG9Gv&MQa?UBece;p#R(GeVYXo z1N8JQv)|WeE(}A>sG@mQLW~LW3YYD5wrJHbpyuJLc9)zvv%BOhASwV+G_m^tr1Ndc z+R<9zy9-&I$=dFs1>UOBukadBTnh zakNTW0zsct5U3wN~6NK{CG)AF6#X2RN9 zj~&mP%>p><5jfkw5wzBJ!5CRU{~OB~XxkLN+>K^($}2;mfYwi-yh?8^vRSJ1I;4iz zzjvYn!729k5cF5`m4!x~st58{-*>Dgz^P|FGn9apPRve~JJC%b5d&E6LhCm^g9?D| z{0#_72I`yG_>>VIr!FlI;4(-EB35xg8Ebl*-jn4tzURex6a>Zm_E1V8C5 zeHK8Tvl6PKbJBvtAJ2oTjkNU*-@(R@R>A|y?T~#knnvOergH%nnf5tsN~J6V>bfR^^iD-}-gcv8D8PPic?3P1fO}N)m!;|{` zG(u?6F6ppOhS72`e*76)Ip}W9P6zz0>ElrQN>p!NemHzlV`Lkleco?PLp}3xe9Eak z1^A&f6pF6ZDzMxadY-L)c4e(vb(*WVMoz=t{4yTUnz^|vJFCw&f0W+5f2gDSEEI;x zzaHzg@aVN$U6iccQ^AyXC@@qvA1~roi&5?_v^ujH2mkO0mfSGt z(l-r$TKR4XiQ=S%U)0}Ue&aKs^V%DFg3THL0rs6bi+&P$;gir+smBm9^yhbBMw-7n z5&K*0@^-Pyd&Dkp=PsvU7ci=}M136`)^RVD4NKj2M?l-Jw_J}`cqRo~Y`&v#E_)F! zFb}^W$Z0{QNF1sZL~pDD5!_cbqLg_Tc|aoO0vzddyEQYXy+W~Ei7&L6Fa#s3y|A&AS|!Tw&0wEKGN2MY9*cr)XHqYW%XEm zu<$3~S_rpfMRpLb1z>x1RLP7s!C}@jnv$tp7uj(H#U+$0Y_B6%E7C-r@W!UKBLoYZ zcyilBc62beQUGIhsN-~0+kki5m(o_R?_3j9{4*gMZu_!Uy+ztOEN%TF3ZlpP?`hFI zh`rxZtHF#05cRFSNMRe2w)Xjk!k5+h4%Sb=U6F$3mYs{IRu+%ElQ<8~1?1>Gg z0}lFjhCQ|3vP_Yjy@LUh^qjIx1T39p*{Ayo;kN)h4>UA>n^w~Ba|;%QjGq4nJ+uI+ z+ObUpmiWi`(^F#XV%Z-f7MmTId?dgO!j zBB0XI=+9uTtzwDV_B_qD(XrOu5WRwXx2iNy8k+KPY1%;S7=>~8X%0St-8oC7D1djI z2#LC69gpsitovJKTgOV0M@(@zY?X>m|1hv@f7JH-3U3Phu=eJb#@`P*`sGZ zCF5CwfDw4lUK9!|KIA>;hxF(1jqP%U^q(MTY|)<~D~H$^>aweWm7KF3P)jg7CD&2R z`ZZ~5go6*(CqkS$xJ$yv5w+}9ASV{6jhAe}J5+>@(Ztyawd7?jLI5B3L#iN$e?V=5 z*qIKu&=4Dzr+Ie}?3X8ZYQzwFV=2uaq<54#;`U}xS-fJF6o*$#l8nKSU8f@gpX~>~ z2(zT1FRs;_*o>w;{a=UKT?4B3HVr9LygOL4JkHF7&2|V{@Q3DsjRcGs&lD8iR3O`M zv0(4Pa*OsjGDMXv*sLyNP7_K&;w3hc_Pqkyo)E7AY?Wu96@jR7U^JX~iSrj#dKsf% zaw+Cg(Ps&**BQD=QuJT&j_bgU#-GBW$k~Fz5(N-oS7S0JO4|>`oq+B~Td4Y32A^iW zvSZSZdYi*jkTgU27DU7}8v#&QBEV!J^o)knw*UuSLdkzNq2xVVQTYtK!0_;-!i3Sj zNSGq^^MH{xhuu~siw+4-RYap(K;o$YM>w#W={F%g80JXX#hkC}8=*?p+N;=w0fll1 zzMyOJ0+?mODFH8bRj!->d}G7t!7MZo+1xCEU2pppLMj}4!tZA}I^t5xU8aUkbL|vM zjE;r~Od+vV`5sCI@eiw_6yDn)xtoWPXyzUSkx7s!coOHF5yU&8u~J}b8UnF_DmPkH zzCn#BbLD`5c)JUJBH~kE;>i|pX=V9ph0#oxTH(TY+m&yy3T2fT>{+Mv7tup_eQ!&I zGsJ@7*~Fn}M+5!7FB?A*$!E7T1xRK^yRh8HdoVbltbmz}r3k#q)`wMwNxc)3iuoM| z4h7(+u>=~Q=J2CtsqH=7_B?OQCGa_mN`5=-pTR&f!*EQXf8umTCA zizizvPytb!r%{=emBpVFyEI+{F1VE@v>xN|d#g?~P0_xE64#@|+XDa^PK4mOJwDYu zBcTb19dZ@ z0=y6yzz^^I+Wz)eMQLy~iC=Z|aq%QEr@ws&&wEghe*6oZ-n-QH6NpH%I_832y!n(! zO*%`oXAO$`PR<)hfD0TCIcpeo`QUZbSz&n(HeDxKVjlp+bL`9=W z1<4EN9SG+ThmZ6eK=uU4Ou%uS6|09Jp$4c88tHU*EP4PD%^FzJ7o@4b$l|yl%Ob6d zS>P>K@qw0zb2JY-cqX~+mI{ldDAL28fqPt+f}KxmHFrjOdJzR5kp1=!E7F`N?URZO zsGKy?S-t0*z3MO8;JTm<^I__jmBE*(;3Y?$Q9!vcX@Ypx2q(sZ6&UH8tV;3A5X)*6 zM}PVyOqMDr9+4Y3TMAqZen54bOQ-fksV^_LdxYlIo(DhaBO1igcz`n;y@W_QTR%E%@wq3y@6hB`%Q*jd{enSTg&9 zl9ff8#z94Qpb@G(&yx6Fh;mp8yh)%GkwklmtLtLZAV%`$EI6U@ZsSm}&}?9Mmq=~P zxl7Z)`o|@OmF)+1kJ6$qafNGVYo8U$E#ocgIv_G4e47he2nNS+&0K`3!|e@QI{)1| z%Z!S3HpV@(*fOx-la#irfm*tl4Gy~&;S$sK^nGBrX-pXu&Y9^sMmT4th@$D7`6Pno zEGbhtN#<%bCP~^bz@%bQj6&(Rr5rY`oU{qF8wT(E&i*vcpfMeog%Io&8dEaHIGb%} zL{LV-P=QDfJTv!OIXT*6oCg?Eq-8}oNrJt2F#%B1HRt2J=&^BKiCGdR*+d8^nl-XR zY>$=7bySIE(VU|GB6CKHI3qBWh%VkM9g1@0Cf(xP)rZhqi z;W*NccnHEXE}lw`w}&``0v6|rO3f1rC25D1fJ>J*UZM8z+*Ad3+#uqqM)n5K5#fu~ z@FebtgqMwqFWjUFDUL|(G64ORV4Ojeyut;8=ptIsy&RF}*cK3|aF&VV2B3_w(^#D$ zEKYbNNn_;!SvOJO2s7R!ZYcI0U3;34I|vu+Ts;|ZS41dPEe1+u!12Y|osmZ5Ztd+a z&Lq)Fc1zv8kzNU~7m)p<6PJBh1*_nLpnCzyH@vtB9KJyNCOyB^Eej>yG}69XnLox` z+q&s>ca8Z}IOfxNM{fD=E-wrv-MGD5oPSg~Wj0tXo(VeVW9-UR_D~v(v=|``h6qzk+ePF&ZP=K31NG~h`;`Wl@7e#nu zkkces0LPC&d=}J##<_`?_yO?dORJF|Zls~N;suVbwZ%N>!th~w89xUE&W5iz`tqZcRR-5eE@pUf)|*Lwj{Z51fCx(KU7 zz(wk!?8eb%_7@959;j@aS778sp*V(YSX^bj6=-X&f&8w(FnD)x|MUpBu!v`Tfl&)l z+X8$~V!a?U_Y&uY1$t=%RmZfF1HR%+*#_mL{s_z9m_l<$Rt)sr3NzgTGqft-HSkDf z`RZKs2^pYwgG(MF-N35%!zwaht=9p49f(G_jsp4tAodjK16CT@greoC-fc7SMVVG- z1(vf1CSz5Bg&BD9rsN zY#2qsuW>9@p0W`9=+p6=AauQq!=shBo;I~JK`KnKYI zPnNKSC5TKEiR)9l2y=oOAQnaP5al{{ddM)Q-$3P?mQ>;2OJw)+Gqx^@zl zEX7Uf+@~h#uSE8VEwuiIi|z!DnRzEbLzFw*SksLQHIbnZu-W>LSv^Ks5C+XYO0RTF{ z$7+_!;|x$lty!UUZNkvOoV0H*$DUB7W3LKwF9$pp!bF_B3xgR@DVTxAB)w;c-MDUE$euU%eJ#>MaN?*OR8Fm z>*@_v6PL$hk0VO{hWCL?k_byd1q$eIjpuQqIQxt3luwFPa5F}j9A*-Y)4oD8Ln_h&Z){WH9}BAk)WK0B|aLVMFPweDaF&fLv-~qCWN4!TIqtE zox0AWuFF6RNG^my3DH{L8_ERfg`ENYxsN_2U{d7ajkbmrz+bOuY4#s+S zu+j3u<{j*~O)1ohVMC!9e414#fO%Ul$a|epO~9aazQo>ff^_a6OWI05Hn{?BReDKYS$QQN7cH zUvCd<3BLgN#+BTBPjH5`%}l7dC#&vAp-;4>@sII`XZ4P09lq@JxI8M3E$VmZ&XYf3?Yb$JKXqgZTup32_TNq z&SIS1`fcE+0QRvewHO@HfbexN)b5J9|52PBJ!6_*FjXzkihQE(#y@IZtk5SaYFhn2 z<>A1f%Y|TD6hxn3>rvkvOh!hBCPq=sc%;ZTzVS~+vC$`(0XM~8einHXK2bY7Ap!2v zHgin0gE^vHuh=b``!V^lFLz=YB$P?UjH4_yqZ49XVoX%GRutb(Z|M$L81TL%qll1< z3oyt(T!40xA^#Bt!2K`2f#k7cBYr8u10i_LIEfw6O2?AuW84{B6`8)>jjI6tfLy+! zGs07)z^3FSUTQ_iI6Ta=gPjm(hlGIfUBCYQPZN=+nH1(s3sOKf5~te5IerCNivV^F z6d2nB#$BOh2;#r=2$jqLND@MZ=mQ9B(uOA))m4CEbGq{I9JAyw)1Wr@aP@Yd>3#fZd$Yhi>!_mLlU4R07AOHu*Kx=6b?jW)G3IU%AnUm2{#uX!_JN%BgM4cip2qpp447c~Q zdKY@Ndl8nRAhB3lcJK_~ebW!gC0tY_YZf%FLEDf1O!_F7|7!n$3 z5jk2|b!7YFcv^!Yr6hj6_G>X2?zB0Nb|6+si)6Kf{iQM6@Dt+KTDWMD~2vWK+Amn@jA$41YM|xo>q&;8syO)r}wvC1jio3Q4gyf0vLq2Nbm-TzcIoT^AK>;WkSio>*BQU$j2sbtj$ zZO~D90me`~IbW$w=d0Gv+Nw^CsTy+9W2=To%~Cf#`eD5nNiURg2}v(tL)zAOv_29B zO$l7XrZy;f&=x8hvpR~H;XA=I!@TbTpjO!i>@=4|jZ zJN=#z3`uvCB;waF+H|V$b}AYKVIbIV^};^*A*nlP z1)E>nclhHwu7SGv{GMzO%wulaLepWhZGEjNu_kTZ<2$2V4rBI6i-fQ1ufC3+VK}w- zQFZ)Rg%o9jX8Rw-5#vuO#7kR@d%0u?@)Iu0wHC`zLfa2DF@ah~YbZAuWp%%Ct|{0ehmcKfGU(f5J4bGQF; z>#e=<=|avAjr7Aj&MBO#P~259TQyl*tlZdKjF2RO8Y;Hf;SWIrTVn;g+4eeYf;5(C zpZ9$R+MeUf_bQ{#&qLap3~e@$1Z|necCN#HWunl7;47rCU;upYH%_sAsWoJ%-$I&Z z=WU7pLLt?YD03*Uu3Qe4R5joNOe!$U3bCbTK`1>uDWubp1G?}|v9{~*v0C4-l8!mO z=?{!#jP`nA078tD^m3#FgjVhjU(Us6v4QIp^x&lKEO&J{QxfQ9*@(Bs6P}J$$o+T; zj@fg2I_y)C3^}YW>_m}M3)+zZ!GvX{TJAB2f|PqK>`uS4b5gAqoD{R%G{dtG1i8Vrg_-G^g@`8&%J zQui(m@;GM?AM5+bX?uTGfAnR4W+9j#T6!FUmwU9uU70v3TVU}@viJt&g|sxTyKAv? zKVY#-Q7mnV`BQ4=Vj0{lZIv+52l_s6+xDxApUA9L(>u!{Jn0AF0WIZOv+AivEBEaet*knSEANIf7g%wP6ArI(be8-%HWfn+@yOt$nk`mA z$l%>w=ct3Gj0eP7Cv2UJscKOKnCME{ZyJL6ndR2u0h?ycg>3 zMj_}*i+e6pcXu?gQN;f)v02~6iQ)fjOvyqkIJSb<0~DU^@tqJawp%e*{b`&wIW4GP zc{s_EN3?Fk{2L<3<1obm-HNXWn8K?1Wn(`N2lNjQ@$<0xIa&^rG12x`bOYnQC(`G@ zD$vFH`4MXCx7b%;MYMDN_i$~rlcv^;FM1E9NM5grwc@u0EoG9J6P1m=+&A`Rv-!gO zu|Jx5#LJ?wU+(9Nuyw(%k$XJ0YuAaki>_&X;Qw<#C>kIZe4(8yzQ4H{HDLN7DCB^w zkXo9lmS*9=+r=D?WDc?33+-aP7dp7$`dnP&-Ic#3nhYZ$vYqFN!_zy8iEY z=}!~Gk|G9bo?VR8L+p$gqlcK0W7Pi;*Ak1=b_yjuT)R;1ssMw)0eQ^siWI4PAv9O< z!bcxA48U%ClKDvjM%a;L%Ylswq{cunqLBG7pRd-yhqs!qhO^c1Of{UVhV#_0OAQ0Q z$yCFIYPeJlFNQ*Jtr}iRmGSbs)$l!Pcs1VdRl{r4u&jm~)Nmt=XbX<30K=E!&=p$I zv))l1w&4>h3Fwo}w2zx!h~w_56Nf&pWAm+&`4{4xN% zVVblS{(r5>+=urWEejgCo438e`IFiXa|*?J@BvPTHKie~`EkSn-U2`$zQMOEe63Ng zD+*)aDAcu@Ha10*!e*hY1>My;HX$eBsF&5IUQIAn)GAnD-lJ`Lie=K;@&RqrGa`IM zZ5q%v{Y-?9!aB3o{5-=Y$6=8XzNY3C6`uo(3afQ zbc7<>^2J`Gg9^rY);pp#NAL|KYPR26j`=!Zq^(P-Se=O$2lO5@PZ6hx?WZvkbl|h7%WM&_^@S zJbpmWGBf-%nStVxXxV5DL!%jN*pmVMlRVwBIZM;aE+ zG?$1pNBcP}%6G9M%3aZxEHu&U5u>QNxQBn8i5P6)T=aA`y<-IQpBq_nMIZBwK3;Fz zo19v@aX{iaTgB>2QAI$1K%^HM#pC<^g(w5?zu_dw4tk1U111@TSMYLmM#6>A$PVhY zFrfrGPrBxBP=z2FFiLUzCKHqx3Fd3T2Jg}=XGqCIac=PSWjzP8tLPyEg_%CS90ECj!8uWX<1{*c< zWhlqDG|L4mihYbw{sfzZ$V!nW5LXMKpA7w65TaJ%RL9XOXL)A5<2#v@1k*4MqCW4+ zLS=kNe*ne%b~V;(3sAgoe>CipR~a?9jT(IWl|Nx_0^VhAc@e~0A<*MnoaIR}*XB|* zb`s)2$brdKs3DX)yvv;OG@!hQ)z-k^?^ui)((N@62R3Eah*X-SHmW+yxfls}<&d+9 zk0yuvO-M0g1g44kz=M)bep$Uh*b05cWg>(eiW{^=GEjE-=Cs@15Q0`bIfbAVdv6L_ zH6s{V#~H8GWupd#rUSI%`L=VBbq$bMcZTnZmcvDXi&Ix|N((?NY8Vb@(aDODNCUX@ zGgPnHNydjKHY_$nJ{?GBLk^JCecq&IR>9Fg^G zP)Pp>uEx=2tc3gLYw%!;Sub~B*g5M%jKHklHahDw5_dGf_Q4Gck@P=Pks7$KVn^6TNIfT)XG7ys1&iCFXOWtyaoTkn8-lqH){;!4g zJ#be+FtrxTiQ)#BN+`yicLgdzqbjx$=#E!HWKQeP@jIEO-mQPJ=Tl&ICGHTG0B{nQ z{tHAv(8&*XnpgRqh6?QrIwON)$_rOVfAMIWL4 zaJ^f*S$`NM2lW;_i+w8_wEt>6ULE;fgC+7k*!5Yy(jc}J3iyJuw$3DE^F2!Y7_wx5 zGDw`MDNt+jSAr}Lc%#>ZH{d;?+@=5eU96p&Oz6bHbg}+^zYv1;XJW@uemwo&{aP@ zsD07tDx`gPKCLkIKDkgBcaPNw3zHx}Xnohhjvtu(4p;`W_4OT_n3`B`u{^mwf#@&K zkeG|6!P^dYDr^EYxaz&&8A>o3CCg&1eh zKo^4kn59)@bS`zdg4z!=r0)5-lVMy#$biW=!0GDpQu&rrc}i)ivb_1ML%yu}tV^lb zHnA|z5_d8pl@W#7?#T96u}Cc86v%7ulDc=6(v*je0-O;Y7I3!-;^N!eQtY5H9^PgJ zKpKCI`CZ7*s~N_(oVhMbeCswkIf!q;8BWX`1{O+OvkrM5W$BgLof*=5G8b~G)N=0|6MZw zRM|1-AhNy_Pu(H1!W6u4G2G!|)^cSqMp(G>N#<+*NSc*^an|;kh@x07oLzU%j(iL^ zMt5p&!KhQtzB=iy!yjJr=HauQ`+7gHkKZSRz#Mb_dg~(4;D?cC*8)=7{!N&EG%Dl5 zZT`r{>VAj1DHVy@zFlX#>#8b;whwHIgCC%(w~VS%#-qOE&xrX@4O1;SIQhOS`U4A^;EEJ&g}(#3k?y4PndHU&H1ZC4$atf#l8SDEh>0X zFc;0;3w0f?kwU1&K+<*@%r4)DWibcKWh0jhmI|EoYJsdyEDo$SskN0OkM(9++}elN zHj?Kyaw*_<6Jzk({2G7Bvuu9`A+-q#y6~WIH9lEM;hTm)QA(|EK#>@-!*zsHfP1Oi z#LW9`oz|kF4u6XAW5rKL8ck1eW_}Z|Y)f=*+>e4gH*qa=Hva+7j;aaub3`>$=1fy2 zcUDc9Qvr`obBa>Nj!n=8C)XXp6!E0t`^#AD9m?*p<3jF%v3JDguIyalfB~rS3_-GUt7hn@eqp=DSlY&39WZ&6$=s93>1xY?J)6B`#klr)KTA&d0}d z(Brn|eF?@b@aEuxhw42Pnk3$$D z#&w{M57k`7J$xnX(*jIq8%66khR-~hM@ zYPVpfVeDsYm9xiGS%xwffI86Wvh@q_hd+RS@H3eXZ)|XF+lSiUk6(q9S6m1r6`E-P zDj~^7Y=Z%{L{5|vwx-O++B~>D5y(EQusNdZvO}va_Xa@*o(yol5f0fL(X|<{!BXL* z9K?QZBF3$oN!j|@h!^q^FCjj%&IR4=$Xw5_Lr@paM~s}I-~BtG>6r=Y?d<3xd*WLa z5QZ*-@?2cf=NsSbb(Z*tP|GTInZoz*JkQOiu|YKBw~bOExs)VX%<4-Zbi7S1&M*wb zd)IoDX^FKN`stSe= zD2`90px{{Y6=x_F-nA~J!23=1$mq}v{Si@(d=)yhHiJD{>tUC^4}GxsB>jiRS6eXt zf#{L8$mM%o9;e&hq#8t0m#z&}^cUyhiCyXJUyyIfOttjPG&Cr*{m<$XAT16K0BxET zyR_0QtuO<6Dv*492hJa~VKwX?6K{n)*e=AYkP!=KK=xIXTkLAyMv{nC32M!xcf6ar z?RO=RUBh(&pQfXh7AE$>?&!eYcWbg)WHYHAU!SJmpKr-c6-jg79f;pU)rxJC3yswB zZQ5KzWh0Py%T(D2W{=U!Sa(I;T@+*){g^xE(#hy!r6FBi(hTN+3}Wwe^=afQB0wE z5C~Kgia%NrFJTNdDoY`BDVL!xU#Wa!sXPrK^AMO1!FM#VLcaw7YJ7I`?FEon;@Qc! z8NkoumnYwbF`aP;@fi8`0$4X816aiuI4+po9)j>qLRb)X>xO0IklxmwPWo32cZ zmJL+E{&oWFg!np2d08!RV1AaMuU0moq!t~F#V56#B@7G^n!fbD7yvRI*!%_L5wtlz zx8*FM;n5=JLXJ0{-Ex+Y@@QluBQI?^OPE~AGb{fsBF!EQ2#G)(I-W#v0Xphi;E^6O zY^}k-qcCM9koPYH4Ze^V(RtjL9k0b|kA(AKS4XK2>bp@gW9b}1AUAMIXsUxS`df?+ zyRh{po{9&!et-7b-IEU>%0%=E35je~pV&N}FNrnOet8ZqU z528GdCfGEfZO8f?h+QBJ`Ym<8ED@-%?bJMdAA4Fp0`_T{@Kq5dFv=Wi{(S=&Gg2&w z%YzQkI6hj^3tyh4;7SP{M7u$$a~f0%6HrxABB?@dwWhJZy%}#DoQ}<{2qn$(I?+vP z{jzmxjjYzV)Xk)JshdgjS2t7CT;2SXcs?VZKNC+u)8EX4Ox?^wO5IGpg}RxGTHV|$ zp2zV#`Ac>45PnIhqgP~N`yj!AqPUCrX8Km(pEV>t@!iB)Yn+feXCsnQ=O1)a>O9)R zCMDzkV8*e5$++!i+*4!Xo;Bmx_++|A%{X=?8P{aSv17@&zcu67&177a87FpcI$Diu zph(2E?B+m>O2yA)lVCq7Ol&2l>Y~Q@WeiOQ%}vMyIrwH%*EX8XgZ6n_FEroQ zxrHfX`BEW`mkF!KZZJBv+dbfQuHJ-WPT%(%0hL@9T?E$d^u5ta`!)M`i_f_Pw>U%+ za03=QK`;{s&Qxu=L%S3ZL`4PckXI&_a6eFC0xQfUSUVwQGwU7Dx{LLbZ;6{ebqDhz zT7L_tFRp$w!oM0sHAs)IM+@*3Sxh2{pqIU)?P|0GE_8{-%e4!_j12JuW?9TEq^8k= zWt(xTSVc!vznrA*-HIaxS+qOsFgJ$)4u?{E_;MH}t<-|DmXWV!q#!_$)pxtSF}_>? zg@(CmEdX`^?WERc5+)87g6IY;4p+8xX{9l)Yl1D_D zHkO%!GC>sBZZ(fR%Zj7S+1wwYm$4+s!PJBMr48J$I`H|~6CJd9KorQNub#D^ls zjXU`|j<2@Pq6x;Uldty9qDjW9#Mji$qRGbVC45a23b9F?ra;im1*LoewxbVnxpeLW zFE%6cr9Zb=GA+=zDH#^_1qyIqC%RiP75eYC2nsp80`jY{F(W)|7+?Rz{5m3k2;1;J z|J}GyrRblL5%OOkQI$AypyeHMXm>#EWv6X{%U7NyFO3LU$pLVoPtdB)QMKe%&EKe& z9MFUu2?Y0m#>4m#c4z<|U!rA4E8xE4)qq-k436T|>OK0F8x6my@c*$9l|jBrD{pK$ zBj7BUUmAh!KM1nGKVc$XY$yXM=cB*F=$S2N1ORqEx{c9OTFwaA1;D6TNH?OvX-sr? zu%dEj05;L;{=h{6T@DavfDHNXhAJRn1ll4P7AMzl0oH;X&Of24TOoaGfH=NfRb>^4AFIaAyQ=pji5)U&DvC}ZT$Wd513$;>#H z5m(4K4=Oo$EE$!HD6}#KKSn#2L5;kNYY>K@aD_lwzdjdKb^RwGw_)(R$YcrWeQyJP zRQ+po_rD2+D*wGn4EG0^kwpC(=G1=-UQ8>1{2-#VcEUz9T=g`5MZw(!9}?XJ81y&A zhL>7%nB9mP`W0241T57f(!7rdwMW1l&|o@alP5;bq~J#0FSY%cptHY$#j6Y!!nD=| zq3TY_ZTO117kRY-2vk>}g8ON<2ORn}c6}-1hi4svtD~k7wX2N4mwMKrh<4TBl0 zYa=}b;;gab(Jb{faurN&whed4uMZAVnT`bu2r_Uq^?dV_8D09_fpDn$ILUoR_biP6{WM zI{If(Cc(|gc+)-@$e$=+9;~V2CiGR<@7n^;snp&VT}0KD`ab{x!0g=tvT=%Xqac+o zrTyNhv)I;$V-Q|G`NZ+r4WmJvyNw6YOjPN#F+GToS);{;^iK`=VREIu==o0*A-x38 z*c!m$mHHeJk%uR2f{mkB>(&rHyz7TWgpDBL2+zF_y59Adj(J~~i}yO~(TU9vThpI> z?^BUpyg?`hucAp)M6FV5I?9Xm3~^4Nip-JK#mN5S8^-8=jI(2P14>GCKaLMUSco&Y zw1@d&jrc$)I;c08AAZXZtHp;Oi4QBy4?p3D72?BF;)CD((7_J@@!=Wq;U@FL5BQ-_ zd>~{U)ZONXAV1`Z56_DaUzxn)x%@CweApsBd}w~i!iRpp%=wOa5Ee+LFpZ2Wa8~aE z@47WWwkgb1GQ@jggoj{^4t^XtfHu*cZOKo#ecI38Psf}VJaN1-~ zmD+AV5NtD8bkX)8DbOlNg}Y!<@3GhLYJ@O}W(eB|;Ebvb@E6)EO+#wrD8jK1(T>P% zE~#x00ki1W5j2bLO{PDkM!2V9FXCGu8sVJA7lEZOwLfK~CWYZ25sYfw!MM(faXt%lN)g2InlEj>0%cM*5Sm6^qod#YT#!nBtF-+Z)=1=&8B#0p>y}R%)-&?QBK(dWB*~dApKNsC*VFPz1S2T5 zeSmLh!$$nX?#Jgxto@PQzys<*BL=hMbQK;1VYvvTC#227aZiW~=Fe1#Y z6#E2WEy87LG+?o40N*XzZ4@~P=_zJ`jFj(zbV9x3VgUs*juQ)no77?4!Elp`)hRu+ z0{a?1>68gHYY3g&V<-VG*U9p~v}M-@y!mVj@a4CDie6tM1d(v@@k}%T(8Jgu1Wy5N z!Ffj(luIu8a+d(HOoJpTn3F)_{_N-iEQ2&59U^V`6y*}6=DKOawPw-o$cFre)b={U zktR3BlZ))P0t$Fr>svotUf%K*VIKI&{EC>QJhkO3B9ij>maoLspBFF1Js&SN?)SJ4 zH!eH^eI+auqF zp?c7t!HVi%sxE@h5<{&VHkQKoSd>=)mD4LpKyQA|AnV+dM8KS&V~6RwxP5 zI3)IIi?VzNWd{jvnKyJc%dQHGDjY zXRmm2B0Ac66m+yx##3#l*rVEhL_7z?^Qd?p6HkgRs_mqn!{VBFQnXNQKP8^LN!9id z@uWbY+HMz5%KEA8go)I4O0}x(6mwPEG39ttR90=LXr0=gC7#*hIa53-L8rF!NbG3e zkCHpu_lf6T@!W%Fe_995dYWc~>38TvL6)e8?Kk3OXo0g&`WMf@a%m4c!zgx5e_uqg zPmE#@_18ocyT&MXRNpS5*h5CKzxs0`iXCMXyRAPaqS#+XvG;njh+?-H#X->jUPQ6? zjN(}6cZnzt0;4!2`T`Nfv0xNOM$Z#b91=!xfb^?G6i0?p94CDeqE=EEeP9Q4Jc;9$ z5W|DDRxKYiNFbjc<-z7Ak41q9qcxzyiRm*>6OMyp*j5tupm_%cZqk0WuYhhE>SnP& z@yl+4!|;h5cUJ1pA=ANC9y&q2$ILI60eyz;&FKGS?QP(rsLsXzB)cI?SeOL^L`_SS zsL^0WgGyYe39umu!9d6+R0-JPmZoSa>>yr~kT^-qWL)(Awf<^v%k|!?_Ql?6izQV0 zg9I!AZ4sokSZIruUMFsBqi`XCl>L97GqVA--j~nk_ffKE&fA=G=A7p|?@v{>y>VPB z4oHTgZ$T6j_#~TVy)V#*5We#EJ#&JITwP*=#;aAo6$F5_FO!~#^M>h+e$`FFd6B4j zLR#FaUI#4`u>bR4)lm!$MSpMYl{eyn-qzgr9pZg8%oaL_SH`@znxU*>xZhK5SMe8K zklAGub>Z+Zcbg%g8Ye`|iDzlzP%?XY2cvGv6CSy*Sfbtg&Fq&_dqvwP8L8&BowCCo zcXyuX&|sJ#kM+NP|$m<2ib805vE@#cHDaWr@ zu%)`Rr8@=bOV*sArX)wuttqE6zD7lO9InQEoO*ID-Fk9V<7Eh?cM4|f4lz1emh9WZ z8F&L5D^;Ex&Uqf5k1V1bXSXLg;T6_vHtv#erqL0?Kr+dYS%mADx8c%kTe6^HU2t!> zT6?6Q+FHvPO#Ye&%NLh@No(0mPV-<%dC8ZxmQ^afq;lRWt>ryt(mYr(d-hkf7D2_D z2WQ{8?!M?f&4cTfmaU0SZXR4RZ`L}k^`GgBjcN>fwMU*H9osHovG*ihu_s1qt&LJa z51^8WNusH+jaaF-!d|N$A?1oB!7g~lEMouOETq*e@sUc6vaq*w1@vcdS<~HhSn+$ z&0=3q?HJKQWZdlPI)~kyJ z65z+U)^B!@JAvHMb%`xfWbGBzy0>g|v;+076eL+3GAFhu0RJFujDM44ig9&H?}uQp zZpm^=4qlzOCH`Gj9Jyb>G!!_$Eau1ar%xZ}>8h|j?klI#fiB1UCv+f^%ulX?cxR9f zv`vpn9YdPLylWI8+L4dqp)aV)>yP(-l?uGntF_)ks%g7ICbZTiJP4Sr!Bo&eVS7uQ znz>r*tryn3j)ywm9z$7%;0}-3Eti&`rKJ%Hc+C+?7pSjSsH5h=S#uY!(^@(hQ1jq| zk~O5|)JXnX(!b-&HV;N?LQ$>d6_pN^&x^td8mwHnI0~{#*^+rksjcn|&o?`E9jN{DHR7{+&n0~$@9!RD6p5hFtc=lrz zap0*sr^k`WikZ1o9Qs(rQRgfAlNCoxkAM4E#WCkAYRQTLsd$bUVrkvZ6x&P3p075} zNj9yxB&AnEN+Z-~`Ej)Ev#*9u?-h^2>@$wjpnMv@$@rx^zjpyRd6(>t;_>kY$^?oC ziUSmx?m&^^gdrI&6p^G0MI_n#JZ*s>f(_yCiN69tXB>3nCJX@Bk zHqiT9VR=Ykn0t9|M@qXP2cSn0ZI3~-^(a#D>VJ@w&}l7Ak`f@Caz;`@$Jr|H8B$Yq z$$OU6iuWZYH19WWlavs>YbK_oIF`-u6hRY|ttn=yHKiAsr8=G{(qE;;dGky${@VxE zF^n`!VLA>zVRb9X*9xNFrAS{rP12NEh^-znB`i4IzAm=2#8csZ`&prT@iVFL5-P)O z7>=+yNf}}|qFm#7p%zk%=ey*`Y)m>ObqGTr6cQ)r8e_YvrL}fY$x*kdTOF&c5Me(W zMfDq4>D5Wqimx6~>quCZeMd*{Whayn`ipk>7yaFqXGrY0+x0SP&0bM3yT+;JsIf~zl8iSalnQu`12@n zYV#X1mtiyBHGGeHJ{@6Z?L=Lh$%&xGN+jctms-VD;hJ65M6le-Nh%|&_d(h3^YhH|!`A$Kv;1hR`~dO02zjj&R^mWn z{IPKiWpJ(1>I%% zOIXf01s^hr4M@I`PaDo?VQqL%rRETmG)TqfBK+YX~YD$0vc4BC>^nx1w4tPUsJD7maL+rx;hqGQNf=9pu@^x5cS(+otZL>`T2mTyxl5Q`sRj&SlnW$-f+h0%+w(wd2B2tuzEa{bLxfP7 z&d>p2#b$Y#S~6dIAAv@@p_+|fM8)wn zEGw|2fT(j-_l%gnOk8q!{p!be0F2?hPFEnNM2U_Xm80Bs^gpDKjg<3 z|D(X!+b@K(4Rq|FYpP=J*EVtwb&IP8HLGH0R>f*ogjNxMG-YToEiv1V%hzg`ft&3z z)Sf1JG5@FZ6su7VgJ*X@e+N9@$531>&l%@0opJs`!4hM~F?t)uioSLsyna4k-ef$V z=lmR%ighDuaG^`WY^xxd$g>7%P{gPawb?_I;h?J0FKK|9EI_hiTYWrt5(BG^6 z;pIFJ(@@Kk{)vlc=#Jcpm%$lq^?-$I9?AV6f9Zhb&Su@qFm=@bG zV@JTviIvru6%|Na%nb_&fnzSpj(t7L{Jgo;7h9CylL|HVfCy5@%Pj0sQ z$;*|WG!)VB^s{Dqtyz|1RxANubzMF~C`i~)>yGKN<(l6SWj%r_bDf0EJEj}kWDKPmak<;{ai z{xS($K+;O~a)~2*3H3BdQ+X3EU)AU=%-0y>9f8=kV=~A&Sg51U_vyNPu04aSL*k{w zG_gCb6MCHt|58`e5k)P9e=AWgfx3#G$mb=vFvGQ5%Nn_kj3s2$rPtPZmj`>4wqkT7 z_+h#+kfx6-vSdGV1u3N=g_IkTGgB?mJQNmZ%v9p2sVWS7^lHcDU+dqbPv7#o+{6}{ zi+%iaGO(pfqd7|8Dn)6v@kejE*$M1~*e~+e5-;GShj?BQ96yJTZ^;F|Ed<~;3jXp(D z<#Oz{MSRuDJYb!m3HT6B@2y5uAd_kH%0yrajE1?7Lh zk75A}(_d+KVm_m^JMX8~$F(~rJEJQNBuD3HccQiKXm^V0_j&EkKvKIi@Cofsbp&Qe z%t|Ca1of7?!~TVtl$TuQ=4^3uU@wYn(0#zb9 zaGT`>yJ~RD{n5K|Z)V(k7~xJo6l0$?7e@lWwg~@WbA_Y#_NpScP<=C(9k4dbphO3* zC$yK8IC<#_9aE{QEb+9WS?HR5JMU5nA6vEw97Q>;UcdaNw9;BZGt zYCG1A?cPxxC5iS~X@r@_Y~1yr+9q}DkH+tC_2)tt^w4-SJ;o|M!@bP<+xc!19VKb) zX`+R{%X?8@Z;4jrRsltcTRBH|?bUK3_{8`H!d$~yJVjOSg<*(+h^lMdnBa|zQR++&Rkljs<7tQlR`%= z(W$^}kZB1t(^|#I5VcZap0^2var9sCMThpwuE%HQkhO8~%**)EVrZSE%oJOe`o@{U z`_ne)e!Qr6DH%^{v#yUUD$kq=a8TbnMo z&|=DK&EUrx5g%ubK&=2Ly4`kKJY9Y~iS<4S)9tLm)9TZ5)=6*R`yNE^w7%g8%Jf2iX*NYRlq_V!gN(!*`*(x|tkHVxz zsMII1Dcf+i&{DlHrWE+9D=RDOM%kyXaY3?vIXOUSkNv0NET6equmuo{ba+~TCFimf zP2|=tFd(hvI*P@;fz~2hK`AHib3b$y&^DXl#@6)h6f~*u$cgXPdG)U@FPg5kek31e z!w_zvY*Kj9w?=Z`73_}|&x_tPFPb|qI&PlUDp%PR-;$N-6|E=pCn~v_WY5ErOefX* zn3TMtN?L|XWEtWcmhKchi~-2I^{*Jyy^s;7N{iME=~4C0dC@sWuP0h)U=4hw(Hn@4 zHF|w|P0z!Eo(f_V|D2OnXvmdLT3IJdaME(M$1|O@U_s_jWaB9px_+@=?aB$>s68x7 zI~SZH1bnVZ8QvL@yWEI@rJ^V#td@YBq7p<+5|X1x&(c~H-B=ZH^g(oA@CgBH`pvE; ztZB^QapNqlMUITC2780620O`BgB|Cn!A48ehwSa=9ikI6#np+)6P+09DqIY8R++ih zvV~f%HP&8HT~#kC+9DrX9~+yE8@%19qzL!%8EVFiVhZruKLz9?w&f+V6rQnlvTU%a z90S9$WO7Ky#c~lJ#G*$N+b#sKx~TuHl-9KZZJ^n z(q2@Z(orN6EIKEq#%pH&avQ-6P`{>mpb z9cAC?Y91W=yNK~n>c4SGWOf`E9RZiC;q0w z&(#H{NYziern=~@xTdNXu=c-mO(k>8YCQ!nOA!Mi&``@@Y*d|R5YAJk9ku4F&c!j+ zf9d+_yl<*3_K#BWn*MiuQz^GipX!{-D|SPQ5W3JS)vc_gc%`~QZjg_CmfV>7EEhxq zRQuu6oKq>40Lzj(7rUtX7CFjA)jyJOT~u)aV+O94L&+{!j)xo2+Ad#9d8u0V z|JqB{6Kbb9j;g+YAuPVYQPo9X=}tT|)&KX7s;)^qCOu;=c9Oi_=RH;_nP5V#IDV^?bg{zz zA}@rZSmMylONU)oIhFBVHI1=cjZZh`&gzFLkggc$w0h)P5lRnj`HK+9i@lyc;X*7gf5CI4rZXop97RJJ(voWkC@XUrW78^lL5aRH9F7 zsUsmx2}Qh0kOUdz^&cPP9TY%XS6k(%!Vbi;9z=9ifVIeB3r+MYJC^nJg1tPKTK z+c6BQ%8y1Yzt3totRfI*MofPO;;@J{(rWm%5wg=Hqqun1tVH=S{Y^w(qFI16Y#?lZ z9ek|y6v8-dlOU5=T3HR~KKB<47IgQ7Y#({@me4U%KT3>)hF@EuV@AW_fPRbC=`H$7 zSAq&p?^JHX5_r_sI#b=e(>$J|GS$v!#m97H6?J%hxKHmG+g^p`b`|ck8_u1#-u^9S z^NbkJwq0VxeSnWuQj%b*Ss8jW4@RzhKZXu_!;bue(0nKDTJ_s+ht+SNy^vo8*hC&G zECkmvzv73xAOAY)2$3&d`eok?R5-h4{Q~>jm%6(~zf4L_R;&`bD?!P_$&%!LLRSeF z-~*M_;^6%3q4$PO*q?mRfh)rvHr`>OniB#7^&9Jag>Np!p_X;H`E_Ns{wLq4!`<>n zVi)D4LM_jNSod;YzuhZ$hmlCrm%u+dSFuV^TN%pf?2m2jChE}~r^F;MBg!_){E0}> zvXjxfBFzow(wm}{5_CR2x`51c(NdyK$4dw)K2u1QI$vygVyQTyMeF7C*=8)<=!K79 z9XS7O4me+gA;LcDhJDnpACUL(Nyt-?R_`LFfjW@bdOE8rip0tFQ#MaSxF)iTlB3tB zNwuN#i$7_&B)RxPH_MFElO<8Gq~0zWUuS3l9^0dG?GXH+aV>mE;=v7gqLn008g(sYs%{$V{(1D4J+uq%5NN^@(#s ziFA39HGtu?5-F(FlIx&{bLd)qZ=4-nu587lH#)4-D`qO@^0=AOR=*9v46$My8;F;X z6utZ+eq(crJ@M;RBE=KWb6Bhs9S;nn6sJ{rOC4jCE+Hb3bm1|M4Jn`f@W?Tc1t}F2 z4TebLgpRa4ZB|ES(>q$%F>mJHS?yy=@6_K{IHU1kg|M5w4k<1zvh{FlLfiBV^WTE` z>y?KNyj$GiyYltS*ABc>EYFz-KbfOy9C$bLHEJAqN9vrdIi>BM@K({T+HS9{uoOUwtmF&wyu~|lj81Z=a#e@vs9#z zmvwc%Lj%$A)%JJYhauqw4%lz-=l$3-5PEzxhaM^8|b`ysIok>mgjvTH7JPrTOpAw`gF3-Ns7TmN}6sS6Dl zJ!u8X>Pif4PonMCV)IKY7(X4O%v>SdBIlZ3-~fa#=|<;U#X|N0jvMDJpv0?l7y zHM|Oif3db8grz&Dmt{^lDx&Y?#Oz!qA1uw*9zD&DXL^MR`_x#)B6F>!Wd&nV0qjF| zE5BBcijd<|cjb#&tRAbgR6iU)sL(Gk_SEQ24xU~SYZJtiA0dCR5M5xuhH%Ki09-aR zMB4_LhNB~~h_fd>U}0HRxGz>)U-&_hB9yAFVB z9|#rh3;sv|PyO4=o%by>J+5Ppg&WLGO%$1g-&6#H>XJ~L60+b%dS#bmP_AL=Pv8@ zoqbD6(apv+FU+57jD{STDz7sbt31~l%T_QeRukRFEL+o4yh;{FL06iouAOFDtB}wl z6{^b7S|#ASNFqYH=Asqa4xsNBAGk5Pz!+HYz~#}UhCM43C3yGmBI!p>g{ z1`x@{=J#&MTcQfvD^H@$7`a=HEV!+^VJ5>6cD#u4HSp1jz)bwYxH@cE0u23bba0_) znjg9ddB67)xOH-<^I|9@#6mseyD5d>r{4N*wD=zSJZaJuGArKUpEd z9V*`G8eQ73DulD!`$cvt-_c*4SSL%cj3uxJs?CPucK6qWClavl@w z0h$B$W|F{V+)0Qhe}s3V=`Gle_fmd~%ApO0*waPjkOU`4V1$ULVsS3b!F<7SFZ}~; z>-@1mPUGGKNQa1^A-<%HdtX8*bQsXvdk^gZ6*z@O(G5V2q@lPDExMz2#^~Yup-DQI zO&Y6uMy{E40asa$s|C0p)1DTepf)>FcR*63A>YF_pt}qyAiV_ zZSGtr>+NJ#YBHzC$uUAhBj)0#v5(r2H+{j`S@l0tuYx4Re?fc#Tfy3|$Sc47uWUoB ziXd9-j-hz)!lIWcivNjafdeu>tMQT!CX?14z%wnF+1%hmS@j>#Eq#ivRuwKt?BMJ` z^j53<8ROnxvKd|l^E5+UKr@7c+hXP0#3{xz+|zqqZA<%G@41)s?L_e`KV~(&3#hDl1(SEykwcODI_B-mg-+o*Dp0p40 zYxTr0SN9oP(z&j;E3MY}%L*@2Ua{c&J9>7)Xcav>7jhy?X}v^tC!v|Asc80s;)^zj z!~@nIJ}vvNVF9TRND2Rl`$)_f|A-&Q^+xHnqiNMaq2%vUrI3SJ+*w0Tg-h3MGkL7^c~tk@q-H}yI3 zEBUhJ1o4<6`eY3U?8kpBW_UPr(&vzGzs_T9_L8KyVO^e*HQX_ZRT5c)*1Ct8a#uV> zEC2#6GqzXcJUkQ?rG3`8e$ftzixRG6Arcj30N43N4fWAdmcia%$F~ICiq=}5YBFR! z7Et3eh^JjE?oY}LF$j(lDPkXOi3jjd)OZMBkykgxZX$=Pccgf=WC%&;QFkZBtXK8S z79l8OTag+IO{=KXGwf!r7Vq>%lr&Xnz|!FU>M@Tuy^1gp<-?}^g)AjKQ%WDl~f}z zP6y-?^D{J1cl*zr1?;{djPdaDD{>X*rPAwQB4=BQRV7qv12R&8!!*DJEpMQBoO z?kY2mHK)s@Oz$WlEw!`1azrg1em9}PvSr!!O8>9A{dWyI{pYFv^DgTDqQ&l#RzFX+ zYIIuVH{Un(N6uAqXh6Pf^L;19g+OztU%sJnUteu=$i6gJa*m%AuyNn9?B>wX1D}zq zhXq(Phko6}x-{Q+KxlyG&@b0ak!pK0nnSPt6v=b*eO)i8f}bD#BD0c}%fD!haEln` z3f^G`h`h?J(lg@5**7hYkLVd8s-nwbe#50x{5dZ&0nCq({y!1{&uYXooAP&$|9kaJ z=RjB~|FU`p8xJ_o)#^FG$9A6Qs%M<;<5FMh->RMw))7lvp082QIda*l=ZWf>%P-G) z&QQ?NUir`AshWDqrQSuvvw@ z#qnx9H{mu;Jfq+RPNs(X6XnOX*1tjXLzLlDN^H`Fja0bL35;g8D?+(lkO8w@ zqM?X%iMuSMxGM?Z ztmNua?aZ8v#8&CRzJ)w*baFq8nd6FAhucFohY;eJfJ8mo;*sIKw{Jv z8UxEs}&Vz1{MlnL!duH z7y}`P_Y2m7E+~r-k&3jf{Oq7MTJimUGGSi=A)1A!hEW2X@2 zP|#qxnOZyif`NUzA+5dkmrJml`v!&Y~N3AHkp6gB4QV+eec4~AkNxruc~XmK0> z61E3tNZutu`TPDo@;CfNK|KjZEhPH||8ne+i=B5|ocsP&SAaBH~90jibNNK%~kl7H&}p^g@)Mn2Yr@;eSb#Tw(G= zispL5F>!(n!O#cc3h)uVx;7C;R|>r|0R8i^>ZO%05)dR7$ob$Vn{(d|J(NwJlk9|Meo}i{3yi zlIRtNtwk@vjfJzFWj0e7+%mQ?r>1zd+=`M|8P9MM_tSI4OfBqMCf^^a@4_UeZ&VeZx-{^OLho{p4Ew;1`4lUU+A& zEdvwoDV+oMiAP~jWMBK{d9-R*+Nk!|)WKQ_vMu2emKvM-sE4r$-}FCGg|h~NXSLQC zd8<+ytrgo5Mle*h4N@5d=h7;kg~8{L|?(P*zzd#Idik9IK?L~4%@fRahsN0 z_?8#R4cq^GD`nieyQ2&0JZPFnZv*&7uQvuVqWO(ipo7@xHwH%GW36;56!+w?eFz)r zuw7j%$3H%W>^O3csUjK~!LJa}r879Y3#Z0PGU|L!FF&0y7tSzCiyhvX^Ig!i%4T_) zx(&zh>-o{eWzpHVGQUCq(S_S%Q8dH;9Xjgqpgjm!iBHpZ@|8;GXq|1D%nr}b1Nb+O zm~B3pYZj+t2B44K76*07Q(zP3v)WWXffn{4)!938+rdB#-_#|3@alZE+NKaaAO`kp zonr}9Vc-uD{|YVg0j{me(%MB=H27Bi*RB0;9_#S`^m~Xf3f{`x+dgWxab~Ky%-5J} zz1BVG5w-6RVKM>OaYuvu7JRjM{$RYD5x>SbA0L?-67jG{5cTGxH;>8MX^)A@uyM|}9FM`gw%sF) zV5N7Uf>RF)PvxV+ecPKDuC{gJ+~zZ2<0<+i<1Yv{eXXZ9z8^7Gq@{R1jF?jqsw_V^ zP+JUs+IlFOS+X$tr-Ns?3U(o)e;avwak1!K;it=O+xTjHZ0jNY5-PqT6^CCEf14KH zbz8(ARniN*PQx(DwZDCr@DTItC;1KAoA@ghoPr=hFn`7>%OxnS4Ch}nG zsp@E2$8_sV#M&P@^jEEOL0(p!&-3A^KQ0fRZlB(mRa|hIM0Vq-g8gs4>pTQ>4}tF4 z_<`kSNw)cQgc2;SqY|Xpz!E~Jvf4Tv9kX*qL5+9;U2#oKO5DHmnJLcGwKXX}OMxF1 ze7o`H!Z%|^0@cIQABL^|Qftpwx>8`Qc@9Uc|1*PylFRCm=_J$*cRP3SLj8EHarXAc z(bn#|V)0lad*OGWJJ#MZ!~o-C-X2+NiA(0g)u_+Tq>*qhz4Uou{zq&v;0OD{8N1P! zC%OcJueP3o442OYBYkh8_jYb}2?$4EayqJn93>JUew08I(e#dmIqjn8NxaAF z>iprzD*@ae(S0)gi0o!M&|3QFl~Cxt$K`jSk61;T$c0x4U3H#B6M}3yGH{i$y)zDW)V{%-y8;T2)Ncbf+j+ii(}0F+HKalqN1Z$O_uR zX@$oSw!g%*<(>?|Y7S_fDXHMfp#Y3^;ya|GeUvB%`?1{#iZ)Gu{0oa@YPoj4YD%N& zbdb=|KMACH1`0w0VP;scOLaZmPX#j%`P`Cu$(AXEmZ2324x*zYet_{Fc&y=CaInXo z=Ig2V;?r~x0fzbs;{G)>)c79b=-uFcUOtLhDy*s~7e#hQN_#1^X?8)#ulS{ofJa0V zvc({wL;#G)p5V+NcD1sN!a41i5a?Z>oZL7I@zs$`&mt|GC|b(~iW3blOV`{ob77V} zS=@TCLCcBuXdmL%Ch+fN)?x5EHdEMMF0J(;*x~c_IAcim+Q;3cdcAPS%WDgECtWwu zp+m!ky)sr}!uHIz*U>-Mg!1FwWiHHaoXDE-p31O&iVo+_HBO|8byA<|+QWd|g%CKd z7Q*PuakO`AF$!3lU9D~XyqwuP2xMPVFbl7va#WB@vh{H&aJ)eS3VycxJ>RIaWEfq( z2-j8H|B)*9_H$+RS^n6uU=7l3@lYEp8#we=bfKEx6DS(9k){ocsbhLiE18Hw8)M;Sfc-S3S^WwU+TD)0Bap>;M4 z;0t|OpZ4VL)N(rkCcdnXs}=>Vha#e~6@*NFSRADBqQ=o!^cCz~7|#TX#5KH@7VH(3 z7xNCkxi%Y$PKuZ1+eX%2F4SiL9{o43%a+%f%Z_SWFPAs&ww4`r20r}8>n?obOUB^sjhRMw zclSFZJO|@X7It|K7V$pT`^m1Jqip0RQx((W|jS~#x(B2CHUBA zzRhHZ=f71(Gs+oFYWdOl)0};)>bM7+=Av>NgdU~|Ls7oZ8HRUJuUul>5BCE}&`H{u z#nwSA1~j?D(@jR>U-_&8a;5@$jAN<6kgboFIxw0#y|Yre-<;~(z|`fjK(&W*w^7KNWWj-#9(8T2u3okr*y z`9-vzF1xqiXgHeEFi{9LHSlZEL=)*@KYebDpC4;-oswhrFy^Y`>g(Z2UR=hjWfR64 z$}pjmyp1iXJvtSL&1U7}3aAa|$r-CD=$Y@Fu`vQXdQ9Sbvi7yvgwj!1xtv(s0M>sQ z^;6HrdypXp&o+LcF5mvqA|c)gXHc$4H09W*I97jq8bStNyGR}&43I(yP`8_@Oq~1D zT(lhUI2auvz3JCi+pFAyJY5Uhe+HQu7U{#96w51cMoF19MB;UjRy2bAmGP&4;@m%}+fZ+Ilk}2?+f*1t?h^>LBfMS4Aa3G5NK8b;f6gptfLiC=xEFg%R{+NQ) zS?KH}G44|-D2r9=ORP2cQt0>`c96u4?#MJNW>|v}t1Ro#dqh@<-F@SLaW(@|rSUQ& z?u)HWHP_6DY8?}lFGl*mI52;HF zUf&^lsE5w+mK!=U;SgE}rT@sG_d#bSe`Hl;c@7z8GJpa&*Go4y%t(x^3oH-*w*GpR zktil3_}j)wR?Q56O2LLeUGCC?*AD&3dgIX9QGakdpL_zs$*joII`_B`Sg>?4*1?R* zSdj-9D&_9sI@88l6%t0nC#kYPqBzH@$Wc1Xo;CTw zw`z5732(=A-<#qrz4f+!x3vZ@CrbA$d5HGMc6d!tD7Hrf(3Sv>d z!nq7|+}`)eb@O5S#DcP{L~$|A4p9}7t=HGCkzth)b_ApQtXgOS=~4GuhcE%GDAu-) zvrZiPk5O;&O3#PV+aXmM`p9WV-{iKBZR~QhHWbUy*a-3VN%0q8pLp%6g&eE{kSv!8 zg^XN4LU%wTo^i?76F(qo$1Y}ww!1e)YrUKLJSAzWJFLq4U#@(rsd5Q3p*^aM=0NPFgJZ)T5U~6h7Bq+6 z^;8{2@BkDh@_L~}-+)KeCmI*tX1PQNqtegSgYuS>ZOmv+puq#u6u--8=u3%?-X^=W zKsbxXg|{c92{Z015Htim|Gt!lQ9PzgtxxToRgib8&UZ`aMniu}G)qlrieP8ncBa*v z#|J^#U6$nv771Kk>B#%+-wXB{Laln1nv-gmADfeQj-@Fo$|phD8P+bya&6{ybEILR55mliv%*$De~WebuB zXFdl}xyj42<@z`^LKI+RPs5%foI95qIC%8xussFv-+P#^$fc*XNg}ZjAsB(sr;F-- z1~F58MYVYwkM(Y$4DMDzC{Ps2);9e+kD|+M?XkUbmn`(h7NrJvX)RAmz3_~JD#V*; zm3)gwiG?;NdIe4)E|XY{rMYgy*Wu)KEX-}! z8$@^;%Bmj+7_b)Rb%b-#OG+?lgoma6`di3r9!v>9tHzGdPz^zQ?0{_b@Kls+t=j4B zS(i$Kg;V6@l=>TfDFQ3)QK5_#AQv+ESsscO=4i2hl9mgnYFoWne@ z^%MX8vL8o&DK7~lqGm-P5vL{_lFws)aIZdr@Ds+MzhMj~f+K#Q#0=-NI0C#%v*o)! zGKY;_fc9A^$DHnbLv@{HrwFZq#*%#1U?{t>m;It}4j60jtx?YDW$0Y>;Ddi81;-m{ z1Yz^gWD+zF_ho30?UeE|`#RYS{e@k@6OOBux^WI~yWB6Itagf7JJqb6X4Xy@ zL`iTj-}WgB5lz6dhOObJ6LW<9XZe7rq7Xkly7Cp-0fk+sLcUb%wG%JsrHk!f43|%h z&MEBr*}Je4PP`C#VU>KeAK1?i7f%mIucBNS5hq@N70zZ%v8SWv7oSpTZ=@RDm`bM! zD)u8DhEXwX#|TluHI8{Pa%W$GiT#;l6~mSH$HfPmINf4kt96!6g&X`&e@2V4bbHDYcO7P7T)0a@FG%Ykc_l&P55oE{_xp0b}}eN?1J zB~nx36Qu_oogs0L*)Y;AfF;EJ7AaD-)@Qiw&NHZe41!GMPGFd8J&R1OQw@MJVO|UG ze2y={%gL8FlP|(o`gZfl2$11uG+S*VcEU%8=toDdCUgcD>ZA&LXDQ5074pP>nWXW& zRKqLM8!SAP{Z0J9hfD^g(ZQB zD=f`)geUO{XjGp0xI(3TLWf1i&VtBh7h5k$Ltze<;@04Bb#VlxpqTfr*qk=RLQ;vJ zvNWx;JS(=rhd8$avut~H8KWNXS_^%#X>W^2MfY!3>c9LTVNM)<-z_)7I=pX za-9O<1;GB+y>)5vYXR*s!qNGPiO4fpuqzq|Q!lQlLsI7#w&n+%e<8YL*}$w^w#uSK zDAtO6uzYBp^m3`|C%CGc#LwG`echIAq~&DJ{i$NadASkNAb1d)+NM_|VH z(OQ@rA35{)fIJIclh`-RIlo<)bb8J1>I*iDGO)8pQRm|uW&`{hwPBX;uB#xz=7|@U3!S%Uk=ALP zp?7qxSD|;6QfdFAny>a~6R(r)GJ9&psua?dcCA|yNtR5jScUczB?4JRWpP2WWQk+7 zRcT-6mWX1l@z9cV{W8^OO~op~(JJjsw;VtG&f8X3tP<;|O1mFyNBSI4OI@kt)8i0M zAMA~-yB|sWiRUiacOvp!#Mmx86*gqVQcef}8c}Ga*COVe@>B9H7vrx;3qVUw*NYNJQR==!idzo~vk8Rqn)EjhP(RLAC>tpNERxMWD zma4|}iz7u3tzJJtb-bctRgNmV&MCumPP;M#Z<|ekOhQ1e}$x`@1RYl?!v#p<+30Q2e z28w>9V9)(!db%xvrK~^LyZ8zI!tq-HkY5t9Hp_ev@^2OZ%YllRKl(O3Xf0y%t!+}4 z->8&?MXH%KGrfrg)V0pt2ah=sM&hejwxS=&{ZQxEzJWL=HYX(&{Uuk_u2Rtz75VTd3q`cA~yAtfp6KS%#s z=ie&Ozpi-XH=GQ+Cx%afm zVMj_2GvO{dp+;YTi&IvW)oqhCMGW4!A~j;EYYV8Qj~2Q=EGiZU@mofLyhT{Wis38B z7%?YsTY=^$2`R z(FIsGb_}HhmP+nUkv}wY#HXMupQc|;cWKcQtuwqjHa`)34RtV3&F+F- zo}P|Cepb=EvS4{XoY2sKJK~5~3p~6OpeXU2y(t~U`pCxxu5mWC;Y9qm3Rq-1V< zl=WfL)hQ*Cp389PSbO*(1}$1RE_YgDHylQM!eUfgB5l)ef>B?j&>!s^-N4*(AF3k` zGV)?~MP+qjtL$*Qt)HC>A5z5K*j$QeXZ<=MZWbde(d}Y9!C#9eu1dfsH)t|p^5*4&wK}{;Td>Q=+$NJC(-<$47=atvO~0s1+;+&AUWpuC~(>;A}l1uo-Y`dOISH zlLxmZx+sV_5|ud=2KVUW=SG6gkRHB|Z5Q|BT{Auomc=MpRO8=d1z|??%f+G2jFLqa z9x-;vwUq|d8!(sg{}9nnA)4BzldFK-uY-zN8wy0%PglAz(L9bjYCoX#cBfl7q-#aX z0#WQUQ5z>Oe#i99axY$3*K+F)NZq068)DY@BdPm~>6-<*L9c49@>-~7AyT=LTdw7i z+pc#RzrwwB2CG*UZI+6#c-PMYyF-8*yECn0(K$Tsbu3EYZx5ULfE6yYHVaW>ko$E)Fi7TK{{d5ntlYcD~c}c3Aewra4-~dTIe};oBaG1b=63uHa$qNUihD zjwO}n;u+dj906oi4tLli0~&}E#d19NaH6yMZpzAP)of%{=t9eUm-GXt?_o$?N!|=<{O$ z_=h4#(e0#jy*5*+DHlCnpVg5^i`IP*z-C82$tZ#$pY^yTt+cuf74*mIUy66F=k-O~ zf@CMwdX>__m$6`w9v)V8g(fmpQr`h{h60Jv;ICLE=W4Ni8Dm^V)&fTzL8GiZ45`kHYT$(w`pYeu4Y;5M(p&}URV;45(zs> zS3~IcoNpsIYVUL@8NIXbqLLX>@>wbItFT0F8?AMVI%_9$mksU-4P;6zWS98ZW9_wO zc`po(4Ec!V+}EaqCa9oUkI|UX=d&KB&sv*XUx zxzrgLrn>kX3i?@1&N_RC>lf^q-!VUR_HgYBLvnpdU{v|ZrhEUEvL`f@DN$}NEonId z!L;8Ryl4jfGJ^}~DbJqRoavql`-NMRb9mjE{wL?KlPa*GK79`Cj*E#$XRq)z{>v#d zU%EZiqY zTRz~TY{V9(o@qRYYL{|p3Aw)7S`;wOjM5%C z$g=aE5bueY_pfFwQ|QkuT^awP^^`#Q-~p}Whg5GH5%JN+89%11 zX9CfY#+lrx*ZM_#st^ICtJhx=LD669JOGcPK74;9Sh{-c2QDw^@k7E{ngI=?G-E-M z9X>~MpSVj#hl+TUhpo9Qh0GIOK}Zp8lVZ;ec(hg@IURT2Z_SD)os7*-+bNt>ZEMLnJim~9+WO<^vx0S)Emcy9 zl7w3#`6rFgN&L|eHcH&WNPWo#;~Fw>p6e;^$LTG_^*>_pu~zAzLcGsHwiYwqYWwED zAd`VnP%ey%JA{!ZUvO(ycErm1#)`=`Y=S34(yW-v;yt&AMKqtRnxBFd1-^&k(yA*} z##8hcf03&|VRTm663nFEEKC^qLJZD}=FQV9B1MnO4%O$@r7m8)7@kW`;w6Qk{uzcD zr0NZl7l^$i_+jD}`@^^CaNNatvyK8TZ?OjK>kdPJy7v3vBWM$+$(!=$MaRz5r-^r? z=;x4396VM*jAD7pB^b2uUdHFnL!ej)IQ6%6eFfGRs#k{xYy9}gE&WN z+=wT#s^h_34fl&!CFU=wR)_4!D! z(ZBYZSi|Axo+AJOx=lmZhE85vJ|vF~1J@$3LBbT%rMTf&3555dK0n@j{CDWzm6va9 zl?xW;V1L-Y;bz%?-Um>fFHJLSPc*ws&qsR49On@sp%fELXO5RRnc^2lWy&O-tSjnL z@p~`N(jZN|$E!3}C*;cl4GZfWog-t1VA?6D%6}785Mzg2{7~T*4`30q#oE7dNow>y zoRxxo3BC%ygzX)@(q#caD&j@Lm$)Sn&Vf!D5TvtPYdy}FhVGSJk)q#VwF$CnZ4xGd z>5H}1knLc!G|RP=2M8J#C@un;>}pV0d^F<0^D{hgDjIL6Oh4k?8Qi_aGxmU zt25W{$D{=1inXmVr9WO-m-?~SUP9K#UuZPqB|%8ClTq*{@sZ?wfJ*TAttXjHa^#%U zj5>d>a2YD=ysDx*7B+*{`Yn}@5}#UQnJS0#4WSnAhNU={T|D5tfIt%JYbzgLJPdb| zrZ45&odF{hc;#BpsI~O55{%JqU@?ZL>+{Q8|13oPTyNy7UH(d=hjoV$&_ygA>2>%! z!}=Ii6aSLSabyv2)R3H(^FjXJ$`o-y{+)#Zxd{{BmFe17BZ4;7CNR~GbkWdZ;~Zt0 zqk^IYQXnQtHERCesOpBao)2G#buQ%HaVtOwfWV}?<6)R60f8dvvJ^E)Ol*O z$9}~%NytV18iS*>$8Kd)X)P}@ka_d8mZ#lc%!*UyMgL)5^uBq~YXrn;tv{dz@{(18 zUdF-6vsZ}=txCJ37olT}!c(C@s&LcaijKENtdd)+a9?GKy@GP0p@hAZr$r~gza3|# zt-3r}EX|orPwyRW|AK+XzbE}GoOrXO1jUX&i9D;){w=Ju-p^9E(*7mlPGuL}Iz~M| zvQNUruaLiCJApE>*nf++25o03P|y?2DT|IN!%C<}v5LI_WjBd521(0yVIU8awbhEM z<-=JgOyybC4l+`DY-y**UeSp&dPi$5pH~TNhp!-kmS2lFs$(TZRLaji&W|A26t><= zC2NaNBz1oKy6Y9qV#uS`@-Tl*0DxE9|pVz*jA)3@B2KjOnx! zvQ-4C7ht$l-haMwiPx>Y0ey=WS$J!LmC}(pt6d@ar<_u2y%#l@juEABgj%}vQ@#H} z#Uxi+Yxy@OU>QO{C?fl7bT3Qq_|w%|enBx#fVWG9^*30?bbh%C?YU|gb9genKeim_ zyE9%QggW(0gIlEf+Jk5etA<+J^*mcu+19j&Elawvo{*;2jE4`tqj)7Qr=vOwFo$0 zX@3A)Oz^@*U?w1tEQ z_GJl(z4ASw!SeQHXZD27fTK9 z&+93ILF;zQ&FTb|@N{tvi0c-oEG=0k z1eI_uoEyD&7mox|rIPnxJXz=8hwBIm*1MU}vS<~>q( zSk4;1TDX#`p4-cK)eGKbvV6sG2Y1Mr)}no&_Oc3!#D$2zMx$|MS{e3pL)a#;CAtznB%2l3DsY&H0uvsm zhPBB7TR*c@MU0iB*Uk;@P$26!ksd{>raGJ`?sTWpor!7N><;Pv>;oSpwn_)~Lp(z9 zxWnaV8o8#!4^%HEONM1C-e3GB_?%3$@JOUc%`aM3qzaI#l>}34pCwVDZJj)ILUePj# zYs$+I8*Y#YA9jpd+Z)1pa#l_ab9jRaU3=0gNldj3UYyt}W3xAqbVEtSf2TAZaX+bg z5Kq{fWUe$=EF(=0!=7`#d66nmE24@GwQwo=&mB*Ad{F32z=^FfY|P$u^s$TMVo{6M z5NFE1ihRL8PahV|Uahm)Iog+EBRRS(icjp_R&y6?h7{2K-Rk@*;E6%3{Zm-G0M1du zQnI%LMdMzSXZ=Zw4umMBQ{h@PPODa;UtII_!_LW+$#0{!bvXD(SoQ1E#T&vOTaV}& zbt8J~DRm{D=hamZ!}KVYR4ULfhUo0{368C7Jy&4`If_W+pkELeaz8E<0pDJ+H|j*7 z^2hE!rB&JoCp#NTb{Vfq?;T6~O8XTzTZq1BuMm)W4GKHjixR(OASG6vfV+d>+uAG* z5xJOtL##G}yHHsR5&iqLK7_uCCVAFVQpfZ^9Dm3X4IyNHFYay8)WH%0NNlW_kDFJ0_{3d#cpGJe_WK4nKNRdxp3b865%Zs9lB1bJyRjo6t z1P!vX2TwWkO>C7Jt&&NG?Y}@X$*U$Z0+lVgNMT!r`yEJ)`ic}-U6)>$Q4?Q1-1|gp zlT;?!H<$>np@(0fvaOM^Hk)FU*}EN)I#=*XKF9!>Bw_m~eI?8Ql-)6pA`9Y2q&WNt zF(4}WU{yxr{i$q}1yOHZMx5neVhnopk##An#?nfW-;#QWMdFL0AmnVp)u&wuK-12t9(3 zI$$;Bun1rk+yhe%3PuQw2f+6mn^euhBTDTBqz)5u`vakhc5AIK& z!hM3)Q#L+g+#b*#d73VzxY%=+Gag^0ycdSeg)423n$k+#hy-^#d|{R$*wYwb?hUvq zENWbddIzlPqS}?wiL0J@p9R}vKc;Lmh;HQYqOH=E!QIvyP$iyt1`Tx&p4zpY-4#_~ z`(GKb;)UM2h9zpO>$R2b}OSAlF*IPiAa~d@zjnKvrL( z3%-COK9-EXI2pofF8mjR%{{UCao z*15y4I#%5^J%5}}hDXGKIFNIPykSq9WTnnkryo7w1eVFg1MDKO`2nFr>x5M@d zzI^ZFK=}?ewNr=d{B=I@LUGQsyTab^YX>^XNsWSL%D9z6Pg3=#_ZBWm`wz~yX}MPJ z*HLVm5q0TtM3gnlmtm{HH7``0c-qY5`{d<1r#>>8$`gb(aM*2`F1rn|oT+?73kj&a z6X39j{o=)4ezDA)$Q{*{_U|V-M2Z}%D*)t0_zY|Cudm1ck7%;SLv(u+ZYYJ1t=PGe z0XNs^IYao;;T$-LI58$iSh?W))VBvdE6eVEfS1laBW&Xv%XCe3II=F)tt#VDyiC8} z=n?)N@2u}o2$c|!s`imO=~!MBKOl2y?UI;HO^lb-2(~R@O&fF;q>uLjR_em`o5Bu; z>Z-4e%uGq$SflM6h)vsw$E8?lPKEvQj-xZiXo)aUiT!QY zIRm{BexvirhFlgb7b$UX2kZ%ae^@X9O)Jj-uB;A6%;jEtK!F(jk}Kw7X)<8W6>QO*E?6Q8q<1ZsNjPLj zb=ZEAx{;al=3y#=L*4l3$jtI`eP&PT-7GZFU021|rRdkiHa{*O;cT^imIdbq%C>H= zw*RWqn09*{Wnd-ZVhgLdTh2?2=jE_T42?ijH8eIVf_y6X>E>LofJv4}{`!Ht_ltx0b?I=J5!3l<>e9YY=QZczmTXDcvO3RQ(O_A$ zuq;|o7M)ZU^;K!vztp!8+CG8ez`Oj!*2Fo1M;#<73RPWg~-Jo*nlZ zU&ep21E2)L74E~pp)pF}pU*+lT?MF$;v{zjLd5}}*4j>up1FZc>0={_3`u;^tPaGN z6)jw$U%@$AjVES*8Ad;I1L{>Cb2-u^NAD$mn_MChuCjFVYk~N+k>D@%JSr*)>E+yr z_v_<~FXN@UbSmzUaI=DQ1>%+7i9@!j_*$VG(S|>|Rc@IX)?C~_l;#hMEX60aezRyV zH{Kxh1|Cn#eR8t0s}W+2vIaUXZNF?*$({P?*o>*yHUvETrS8T*DXQKvaB*F3iR%b! zP`{^XN15yoy{2Q~{mM9mi%EEGdScnO%`-NjKR6rjLunXMUIw-q z{6phS)*jEUjCG0t?e07mDRA5ct8o# zs=Zt2rqf3*KLX@o9W8Y;8h>g6=sf?Y1L#VppXxkgwD)$v{l=!+ithrw%cy^+11uv z#M;tKup~f*gjfVYjcD}_g9<_+KxF>E_uNScYPWs%`TzgxBbj^8J)iG+&wJkUp7&$0 zBB8Qr-)8fis1$uoaZ+{M_}ygIe)Dnt71sCTLhDDhc%5FpN;vbeoD{rv#DFXU43W7G z*=Kwc(iOWFsw!7T?BBv-^9xbtdyOFm#x=(8C!^uzR(&Zi_9YW^n9fKhI<&ZQRF}G> zl#xeYq-UZhgz*%;Q9DPvoO4`0wvkm@cQF=DEUdA`rw((XlGV8=FpXBBcy4@-Te9q9pkT?_)-`4t$ z$N(pq9hh$JMlV20|9q~r-5O%`>RlKb?J`9Gi$i{4>9CirnVZArMR$lW^jlrJ&pj!T z2Hd+%rc8VEu*|ivcyi2;1JtTv_AWv~PW-km-(+DpkYf^K2lfU69{m^jbVkDJKKflA z`Hl!*aGh+(fdmUWI-3sIWNsOC;v*m~ar=fg_QvjG3SCULDkBGOWTl^X30BNto`03*%@wUxDqy zocY?*dr@uXazG)3uGB#5^cN(jx;=%xRx9jP5=Rm_-<;=Y zvLYNf>EE!%Dz-5wp0-TV_i9^Rp~oHh%aQ`Fg89Caq_X%-#Z$|((n_$%sTN?c(G{Pw z$#|9($o%;Sc_zrqb~X((A5{Z+`2H-)in(hxd;;Y z;6^F{boEB3zQL3|Uz(sIb$f3jW|32SOwI%5Xxx!zu8jl`v6OJN)6m?ayuO(vZgml@Sh_@<#4Y+LBko;!euY?6K+9iUK~npq1w`$@Jki)z6_ z%mH2cM=e1;F~xOp1#a10R7(|cCdMy3AX3lYige(141&kVj1rTCMta?SErrrS_VQ@f{ps&`btA)sM+ftxzLyj1^oF{!#UggcOj=J|Kn-KtQ- zURuqG+g9YGG>ft@>dd%)&>jOAg6MZEHw={+ddMQf)#)u7cdmzn)5F^Z9Z9&3ggoUG zH8|bt7U9nSTt>Z_@Tq!~WYec=!dvPsV6y2gb>^_Q zR4U-ev=Vi%OWsmRgXEt5CEVcjYNHG_{FUl-$`Oc@6!YNk{Aiwk0B;T9{NMJyTL6lk z(XlZ-GX|{VwqXeVk3csF)a?&!9HTwm9kW6AZtsPu-H7+DSiXO7Tx-hnk~x-L-+EVl z!E(1fEDB;9?OD5HR@?5r^S<}=bd{v{W~GK#@h$71yT92|=x&bXO^jY_Kt5x6?BDFI;rJL3DI#!GxUr^P!~snF@K<7{&03sM3CkK)zk)-4@p zPW`-PuF8o9oJ7+W)hp%Hg=p>9()Lr~mN=BWm(qTZ!#1CQVWEM#fBU)b{Y@UHj7wO> zUbfK0e(pb>=10W~;QjXacyG zt1!!OPee28e+vqYn?(zLw&VknqT173Kn^KAylUh3%5VZdIo>HMRfJd7#@69f-&$n5 zA`fS9Fv`o|kI^3UM{tpKI-I`}KOeC5pHqPyhQiLf!gCgoL)-&YoenLr1QuTm)$lhS zs~>mb-iIu)OW~`r>+TuEv3jan!a?&I0028{AWV({#&x~;s9hr-98Fe z>HOv=$;J?&9boW?1f?!G8~(9!gen>1=}$=u_OEA`DVZ(OHu6TPfhnt6{q$-Jr^XWrgIcGKh<_MO*Fk@IWd>hKk7 zDU`>YNUg(53xJ;`hY0>%GDqcB7Uq^~Y4?R-Z7P;5P}!{_0Kzw_Y0RCCH>G*X`j!^H zs9L~Ay1?->obUe3jy^2v9M`Q8^2hf=^ZR)JdI$HFaZf52C5UWNiu79vKK#7)+iv&? zk*iE7)jDFVc<#jKBq29^$b#&E9q!&%UMvSXY_7y^-F2PPB4n>_C8MjooN=y4!ff%yxz9G%~bA z4h#M2sKq;Gyew5UVAt=6{eb#68Mll0X{V_(Xw;z@BOF^jtz!-4Fg74Gh)$&Q{?!PB zOen(Bd2fh6fE(Ux5cf!SH`zsYn1&4IbBVOikY*N8Sx<~Lv${rQoo!}q{|~O*qY|=> zW3p%#MgN`zfAlJp{dhw~EzkVLt}fG6AnIHEtK zL_)}8Dmx~`LZTr^c$buVt3oE6YvB^ttJ)R`QV8cSRcTnajFKY#F}iegWsftBKv-l< z(J$~JK@)K#g9$>CGbwr_iE<^s(^zxZ#DkR-fvTC?5K2f4TF7@wL>B@# zcmw^sILZ02|DAH~8nws%z@Vj>IT8gjZPPJbH0cR24|Ud*lbPRjS@= z0MD6?%jzA=v-&~@@hJROAU(Ihy|d-RSP^Hx0~>D_&%P)1?$E3F@O^7RAg!QdfAfd2 z8&zpoc}ia$u&W}2F&9O45=MPrz*1U>9_%0sc37w`QpAokHNKgwH4g1KYmg(ixNIM^ zaZnZ+1t&YxcrrSdorH@H+}PgbKBPT%HG78EeunwzIIKN-Js=UY5o_m9sxIW&hEf z!!uq9RylL_m&n_US4u+D_P;d)T?a?bVf7p;bGE%XBq@XXtC3jpxI@sfKw8_;q0XaL zBr`Glxc-s?jQ^?z$=CU&J#x%iFm5-hnZhIfeJojqthD3GTrbG6&5s|kGN%Q#Iy{k0 z3YDdr9ieIJ#BBp!G7=xtM|~9cU&#(fNrBlg`GoEDUh}amc85b{um>ve+wM}@$Vmch z<+fJv0e%;6`$Dezvid{2^}%g|9(VQ+QlTrUX$hM+1NsXtJo;V8&^qLP z8`mCYfm1(;o|5%2@?Q6o=ut^%cA6N%@cr-D)ri3oI7Urf>AeuwATx|YPJ$_Q{l<(P z^XB23Yt)E{HBCiGkC?VP{i?eDqci#e&faI!i`n4;}S>adhUKU1ZmH z*F~asYCh^r6dGMb=LTVPks1BtyXMVPb&t-bZLWm4AP4q1;bSm>3fved!Cqf+h^fjQ zn=@Q8ro!k*5+N;mKX|ZmDAfvVS-yxnoz5{N1Ph(P2N|!h&x+3`Zram-UJjCH_RpKq+kP0^>W7kp z&8hykTABCfMIei;MnVnQvm!bB*^K5eSK8Bi#GU^+oBI{5{T=30h~rve9J!HzSw0yW zcczbZHMiXNr|44BAyV$wwZ~#)&717tevy0iYtxo2BcNAMy)XGy+G4IV_XJg{@sMm# zuWRkC6d)AeA??wL)S`%r+@mX^B7Q{t7a%I9c#t6Wtln-Y3rD6E_??lJygziSf2S=} zeG%s#BAT`P-@GHjLiw&V7Dx*P<+mUpE2umkI#z(?IfU+5vj6BEp~qDo7bQlrK_^_k zpUXr#{O{V(w(P@AxEZ$`=iyM3;X<5Z)t9^I8O{KX+B%Qg11{)R=P|p(r9^dR?F9g? zJxAq&MkTT&kIFK?V^@IK6{72h*6zfS-ULc5(F?Lpc0wnDWvQijG}a!CDunOU53o*P zv5~_LX7zWJrK#BQLM9*yb;yW^S2y<&Lo)_LyZb)~J*GM|krh=^2sxn2jXR@aqL6pH znlFOm4X^RYXcs={WBb@vS{{TH34NG!Wi6pKd*4*SPwPIW=nXv^IKjT6v*N2X?@-vcFs2CdlPOfMtr%x)7$Uu}fegy&G_Sa$YCUYxGUV=yo zeDI;$og|fF?f`NL^9IuvEX_#7-3^yWMRr$#dG$L1SaC(q5#^^;I2>CS?O8d&=e5|0 z*E*&ksV#PErG8Ils%|3$p50$w5SLJMEvdnlv|vkm5GUL%v(-U)X0Rnc*itN~_LfD8 z5;9m$$S31Xsm6a@IF1kk$N9vjGk(SkA>hPy_ve+cV1=vcYMi@?_U|KnlW=0`+qhqI zA#ZDVC*G89_(&$89r&?BG}ZO4`#NVL_^8sO>~%GG4~CIlj|55t6AxF`>C2F1U$7u; zhpc#~@YmsG&%Ti69mn4cFC;g%L_Li|F)6gC|6QE7uuin+Q1wTNwE(5U*Zn)Dqd4y0 zIsG>N9EP#_H_am#1JPk+HgBvMVbp7W%edF+^N0~K8*IXts5;jXI| z#&7T&So+DI3Gzo~@&-K;yKb8bK7aMLF)nLT?8Nw@`@ODM69c#~UykoX8q zbMh*RedF@h<3}m)fkoacgB8WZC<|7U>hm4`QdU>#qV57Yda>`voaPD~v#lm6r40+U zbRjcv2+WzJ#KtgZXe^@YBle`e@%+G+nw^ylCS4-J)o=j^1-6Y#+7RFir$j3AIr;1K zCG*$iGaEv}tC$ggiz8{62uxMJ?evryAp&)|KoAYN7QFG(E1_w?ok=%dIxEXJQ;656 zfn2y7x}wO+XLLuUP)b5@xwwZaAvPC}Oqc^SB;52pSn1KHyN8K&7M*>_e)eGBK!PkI zZf{ho+8HQ$D5q^`3A#|tWob=7b15lFG|0qBy(~(m5~JgZoc+XMoBn{K37r&Nps~;@ zjDH8CE9gv`@gsRM9^o&q-2N^x+RSHH*jZX_H1cALtN=oI_d);VBw^FPmS5xLzPcdp zt3e&wPkfI!tpwL*rkYK}=k>o^m-jVS)6KZ0$8&Tkve!!EE7SytX1N(-ql4huE-4{I z&$DTVtaZ21u%BMzx3WMlDZm@e?_#LZl(@V-bHQb z@#LT!-gK>Ao=TXRyh6Ly@sDJ-VdS;KHP0V$xi2(CB`dx$Drs08h~nDR+rd#FkKKU? zMr;Y2wCBoQXrMH3VOHWYcYq3GhIEwN#1<8vT=H{T)V3_30sm@))sGUt5%*f0=tcpB z_0O76Nas7$t=^7`p`_RU)J(UV>9!sI+?iU39DwUHVH;GQl0=>XQYp)IYgpTBtPqld0lvUkv_|E&cCYasDGcoPB<7T$1lrfX$0uffY6Uffi)}Mi&By=6Y<-Ja zbJ&SNQ{hD6d^oN@Mf?ITMCRkV*dRzUNR7_Eg!Wuyg+Y5c3{|c$2lw4yn$_H4R%63O zHCtJ!eX%igij|3TSNq|V=$-|ZrPrd--#9&c+cTon@l@y=64IWQv z+vV$Dn8Q|8zpN&H0Q;iD9>;5yGml*Rv*$fYZw#Dyv2epR^~*;MuXGnR_GxB7_gxn|r14|MZ zNPJwqYBsKnP3%}81{*c0;o`tdL^6>#?Y81cc$m@}2$B31wJw!-e0*TgM2rfpKluA|Ym*j<*S5_!YVtTQ~IY!`tZ#(Eh>C-C|qFSYX2PmFoc63kz6(6`YSrkQI1BVW7jo1MjJwb_YMMY;C$Nn7JgWzaaH zRFYs4)wFXi)Jx~+6>0bFQVj2+aRi5|uJO(yD8o71x@(5pM6gSJzMY-XsmzSUz z-XyLs3gq@1UvrLd)p0@UG$AYh3J#47r7;&^`G)ZNc}M|SdqnJUA^kWD4SIepK-<&p z=@cpw^t@<1CJsJU_wwAM7iADc{ntcN_q<#Y^!?swUh{sO_94VCi$d7TP1op^>3{wAH{`Sg7X8wO-q*_we@yi1W$9Hqb9+_1D3`*V;N6AzGrt+QN2l^(udPcSmBy$XT^VRj=luC7%`MJ|L{pVDFq9}>CzJ5wSTZK#=z z?$;UmoC6?sNsranJCoXY$xn50LlaVbuv0~SBl1;yDG|C^TnK|Udkj3m@{)73nP z=l4uOo^ZOQK7|Q;*Z2i!RuNw4G$u0t;f10@Va94BXhNUfW8{$xi!~c2mCgD0=}gpK zW22yGd8Vw;l62~#oUs?$Ks{)57&~}`GAA5}5=1^l=9d7X7LGlP@nHh^^qs?`MDE%L z`_9=sM*m>WF8!ePbnR&~{0wWCxj%&J$8D@9@(YJ!1gW@m{Y>1~v)HjWJ#E{ECzVg5b0sN#{E^Mu9cs1AX!pey%Wg0L&` zO_$;y7=(dY5w;hZN=bx`#M5cZdhsQ63SjtKX2Uj$P*Rw+^33oei_>_7YV%5RHNRNU zUjmob9vR8kw$YJl(O1l73em~I9J3_%XNYTTZ^XvfBrsV=XAFn2xk((l_o``Zhl$>- zisy<6<48tItw2LUB4-WJR%StvxCPARB8NkHJQhMRsH`w_Y)YF4{oN@!ogh679;p6L zowh;DcD7$lKld76128zh!EfhYDC;#`<`-FFS5#E;=_&T`I5qD`*gNdnfyB*j0T|uM z4boVsPz~k=H!eWS{Sk#i}ATdQhnDqwXjTl9V zBX*@!wj;bK*I_J{;w7Y`Aie3lD%bvPrhU`-;&KlJSFUF_onKO1I^SEr>AYv@q6+UF zo6dWedA#0fXS?{A;oB$}m&a~e5wCGz__KCr$p%XdQ>;`oAWbJ2Edf>h@{krQ%OkQz zDT*l#MKG??6Cz_c>+ukgv;VHMCxa!f*iDQkuOz+UdjEw94QQm9Mbl$fT)M<$_|9NswH4iFO{+`OIj7PIdx*=R}V5P?WWBZ(t&+$Y`{ zMkXP%Ety=W>@0cM0wLWYhl_szRnHvM_ligZ^}$MtlKQWtDzap*#e7Sptn!c0ns`Ap zmfSlURGUH<3=-Wt?lu#&t@B)RM(gppLw8Q%PNk1{P{dS@9JOVgcXzkma3*5$j&H-X z_!v-<4V^_&=)M{TN^HYy0alFED3lbrA*auzV68r7aiH77A z(P=lb-jLtuy^&*SfhQ+^lZlHH0q8*@J4cSWK9S-Wm9p3sXdjm-@QfuP6jjk|4`Bd} zhWQCwh)>Mob0K1cZ1S4;WJ@4NNgmW8goB3HxJ`W|D}4QdO! zl2hI+4{HC!0CXm;`)77EtBgk}8mgtgQI^eG?kR_tjR<>LF(>OMvO*9YPJLBqQW;1(X*wu!vh;7-PfAeyI2PkFq1WhId4{ zpNoj(64Rjs-8O7cz7R?yE$M;pw^4Us%Om{#p%9*+3UU6!Vjj)8nE+YbBFehmB`ya) zJGTV*Yccj^s)5fH6chd(WV#imnm5@#d7DWG+g6`XYFm9FDc~8Ty?|$^evGJy>3ajU z=ZyPRKA)ZaX`;TDuqBE^`ziG*xXE4U$u@KFjQwVG1=q;Rt{3{d*lazW$0qY}lD~y( zaM=UCJwtjX^{&{__Ak;~`tC^O2P9BbQ!0K`wupG!qki+J!~FTW{1DheQ5zOFYg(ew zN&K61V9sF*Fv7uLyUk_?7_rMj%tk2dz?LnP4JhaYw#bwPwup(83ERMyuzHqD=)ji8 z)L)Uhhf7K;x|0Prc5Z3o-L_LrsblAscHXp|%A&_&^vXW0_6xeMeD;s5{%;)}Uj0ZU zWoOVrK^e?#J>D^ABJcV*gNf)tQ0WkCdm}Of$0WY{#>I;=pRq(cfx5mhw9Qf5+(a9?{2 zalIE6*I9XuncmqXm^PYR)fLTg@5E6k=c}|lpTl=$+mB?}No_w8NGIVvl*4M7%e`=> zZ)~D}-X(1>sE;(EpYS@)6lGexR@+&Tx^1P5UYTv{4cq?)@28u^>;<~))c4?rG12A6 zNlVn=wFMjJpf87_vonU{PkrG`Go=0Ecw?@4*e zW_jHNj&VUX(NzGkZFQVg)tCzd?|)}_vTK6Ax4o-r1c&hr+4{n4h+?qRC@~octn#fHhMq)P zkvc|Z#>LF$n_H3+%!9Q7zswcdtk-d32cC<`lB2R{?K0DHbnU?!0SqvasNofIteU{w ze+7urFE;7E)lQM*2AcRmpEw1(b3k`k5^G`%Yfu)WCu7Qhqw1_1dGG_2O)p0 ze28&YC1DJPv!YK9y20{#j$_v~UgWNCb6Bx>2K!bYKSNXKgwc~h?D`s0=p>HAxD(|r z1PjVyYrNmko-Ue6FDXEeki1~Oi{wh;$X?`xY={)Ad4SscK7h%7TV$=V!np6q@N$7t z4C;FTbA?f;2)Wk&_h7m18MH|JXW&A=V9&~otg^Q)WrN6T=`(<8_?385Z9b8rJ#tbN zP#C5Sul-wPwtdqkWugV`>)@iay%;Af87q z-q|9D=_)x2T>4a#)uj)v5zaSU{5KY%s#mCkx7vDVmPkmUR1)7fqo5HJ&uwYEi&GMy zb2yQoO}PtQqctAq%mM8F} zCBc$yLU0D()hIn4V+?SJA{YA`mxq%!O5)-*jdztkP(PME{flN>pQR*a)p&LB^>J2<$p9o63%R#8%2hv1#R4QpU~tXGJN$!_nr~~{-bMzS?;sKB~H<-~s=gC}Qj+ORR@2IWbf%{5&<8eIT^OPk0GEx{1GPRiRPFDM$;;2Fo+Y zBrUwzd`54!`C-*^eKM{6t=Tk@6$D_9g1dC2L`1fGjW+WwS4{Kw8V%;#O(wgx%6v@tF}BOpLHs&rFATiWPYzRi1OzSXPcCws?}MOa3r zvXFZYfV)PHVd3;v1szV(iCMZ%u5(jq?;gaD^!m7JONs_toW{4vh*1_`7IhLw$6;ck z_{O}@2GitkbvP8N{Oy{uC8b}g&%oIDR#mTeHeQC}bDkyPUr(t@GfMmy9r%;lXB3+` zwC;J1F{*njR^AQj!H1rKA?G5zBd(wHjrr|kzYwW~!_hovO<`H#m+S5H@F4CF=;2i| z*%fBR<9R%(k`@LZQCduj?8MJfsHsmx3ydoQe0!crAY&3hXCwP3w?9LzC2p^Z^y;||cxeEQged=YGIiD}m zDXwT0!UD*g&a)Ait++S2-W7?umYw+>kHo3v#`{dHB-v@C-v`%J1E>u7jI7Z`{&#D>KWLBC5y2-Q{OIDL4!(YQ*gQ$XthrZ8X zL>=xZrKc5);)kDCKpk(U2up`ik>h6vt7MbEM8~qa{DXHQ<~nr}Mu^)`BDg^85X-;pl#WUHc@dfjJ; zQaK>r74~f7V#}yNYz(Im^lb}21Igk960ChOSc^>K*TyrnAo}4w{YTvg8Z8A77F-H5 z1plDcVyoAdwXN2Y>T}op0DP^iAG>@>1@kpA%q!W76xWo#~&F?z=K`Di8U2PMfY(tY?X>X zi^aQC+{I_UDKmJI2Z<3R$^S+&D6-G^lG?a%oJ)cT4t-NA&6cH--Dd8NO?-@PkbYlV zt@_O@8Ftlm?~0tmpVHa4J#tx1wv9LHJF`4J;e6p-TCd||U6H7tJ1GU`3Hlpi>4tr~ zcWW#~;Ki%E_O#b7&!i*olP78Z-cn)QG&b>B0G=K;CE#~8uL+!c#*~#PsuWgdu{I)x zT-BCA^sbgt%3MPwvXa)*zUk!w`?HfK0SkEIu*nu~bhfI+DHbi5`%D%e#@-a%7(X)@ zy9rux<1_Zy^=;b)Fb?f;ZkUO48JjdZ;Rdld4?Wt!-?nq{%9>{}kPK{**H~@aIeSyN zwslu{alE6?SL}~Eyt(q{CV$k0Wpgxx&<4>0U*=AgpO(xATWqTNV2!!V2MYlE7pXHT zS7r5DZ#mqyT_uFKY$iG6(7x40`#zLTW68JemJFkY<}CGISL*#jsrPfG-p?m`->50} zCgaSOHY%`sull7eyhRSmA%|4tq@szxbi`u6Oo_c~Rv6wQCug9Hleoh^+s-6Q+jeyV zKwgVO_wsa@gr=Fs8yMo?{-21e>3R#ysFJbnLdI&!zPa*f$=IY+Q<$V0j53B7)+;OT zZnhMJA62K~t&`kcE1C(s;Aj@^GGH+S6^Xn#=Wwoaj#J}vccUi(f7tlE;{zTjPphNAb&x!;%Z`=;d9I=yVHfm)}Wmy8+; z1~{>l=Wwa@kGK|AxCSsaf_QyVBmh)<)sAE+GcfqtGZCGuQP?h7het8IdTTVyA zB4$WBET27CC|4`!hG!#_6}@nj{+4F#{H!osNHUC#S12Nv$p8wjRF6})4Pr)+RpMGB z0#qS{XH_2A$&i(lxSkglEvqNoo^4jLG+4e%{o#jEmRE4`vL=JLla-dR-9Zf-y* z$mn~P8%GL(9TM~!;}4UhP2WKdO?R(AW{RtxrhAFHE1iray6Kw|E<`$t)Fmxgof`PI zh*01k_9oKxkI(<4e%HPr&ivr z?_CkSgK;v5gn&t;Yy0@dh>^>={B?_lNw#n%3JCRMdCUY9Eu};^1q=z8)N>NTE1&V; zVxfzBjSnE-?VY9wh&zdW#(xx<#AZDA?;%Bv5}I!`E*(YzQ?v+-CfZMQN9*_j>22GU zI7(}Of|oTF6<_^Qy~x+9)Nr)+w@9sbtSLoQN9uJkldQi)DrYIR9`(JL5h#{QYyYoA zx=;p5|7s%r9~0?9DkQxskuLe99$EI1e!IzM+Iebf9f141NAx`JP6NPeXw0>_o+&Mo4>#e&r!84AKFJR*-tx=COg@RAf{T)#wXEx9+GJu^;zLZh$%IslJF17c zqv|+JyKOBGGaG$8!FbRLXED6@L4?BP1;&(0l5swL!RwN}BSkgG>6F}Hz7Ki%L)h*( zvna639cg_yue^9&E1LM+{k7!lD>B1QxA8s9p!M>ZXx)c5rZ`2+?-^=bCSNx5g)0v( ztsO=a&u-$VId2z%r#F|*#5i5M=~97kL|lI$Z+7>fH{ImO!eG-uDb?fRsF=kD%NOCT zFg7t~m-!^u0ZLUuyrU=<*Ci}&(|j2(k`Dmjo31E;oc)9m9{~86PK>jlDwu^!uXTSw z5A|w{9N>-<;hvOYI*%&yomf0sih z_6~X~821HaM{q_@Mgk@41LY5yXAX5x^SS&Nt=i@pR)rYo1udxLR`UR>c7fI|T6z4u z!#Eab9Ut+AE*GY6?OSyMgH@?b({M^L3%iv;L~f0fu+%`7IWOeQOVaYHoDIhi%KD$69HuR^YJrt2 z>qCsw^a}_*#l;kQi>`Uv);U*cTL~NI%*#5F)k7U&`^2XREct5It5}NQ)9S;l4>2vv z>B{PIpJ;WuPqlK{Z<>3r=6{VOeK6}>A+hp$k0qsA+%sQv6*kmTv=W{cL~$blf_m#uV8LyT#}>QcQ%$k zJZn>B)>0F>oy;1Ue>9WKS0_g0-rJ}RkH#F!pA!B7U-)GCPRfi;l$U2pj{QV= zn!nX-e$43R>-7BQqZvHT;16EbTN0IkGQA38*F!oXn z@?Kas_G2}4bYeZ*GTZEhy(9!ScFI<64?SK$0UT8fXrVTFoF@@c%YCn{SjnN;96j!e z&9WCG?_XZFf&vb+tUS&ubX;Ec65ucEH-NvF?8AVU=f4E_kC*=eWrhJS&wl~%_KyR8 zfHI>2FYo^?;6G7A68rsVz{~qz0KDxoz-Le(0eE@*3xL18Y&HcFfS1Ql0lduFb(iKl z)Z2FS1g%BvodfoO1&wV`+_*H!hP|+`Lm|muU&zcq-E2hqmuO^OVWDb7koee06QyF@ zEWP?`3z)gDHLJG{S3fT>DN%d5@A#$4&CKbeGmBZ@qVlIM=_^QR@4Xl8u_gVzT;%kFs0l)&*~d91#8CL-oB&Zj12%l~EmTfSfRB7yT)? z^tZqtnNseHj;buxtW3Wpcr*4j{zyit@6=^=&04^AGq*+skH{+|O6g@!1z;(a&R*bq zU9HIB9$c+TRqNToo3VEaK8TX!I+VJ z^UcwQ3mqewS|+O;i7{u-C8o%HbIjpF=cQbX`$2Quz( zW%SuH`p%5`=IFzPX_qq1Qkj6jZFRw1qG!y#?1?$ZrTW?PO$dYwGcJ|9`cn0JgFW~F zCQJy=@U^C(VAB5K*|rYPw*8Z{Z7moz+hD_|&Nevs$=M$F$=Rl|k=X`wJ~`Xgzckya zpEldpxgVeHjFH*43P|Q-mpVMz*5S#vk4(102+5=7+FCejuE7X3;&5T|a7BXRGSv)v zWRlGZXD)^ZoxmVfsmwH$j?6UpqefnBA`p(sR%Gp^ahYsuVPdjv2bgNxPG)%YlfN@n zCfh`0g-ogine0Rhqb3`S`q*SoEak+mR(45Asqf5XYmqObW*SVme5RpI4e`GBKW(C+ zm!p^UmD0$ic?M@LpXZqi`i}jjX?A>knx{&kkI%AeWR@*za?DAdIKMAy&T#?gt_B${ zG|>Pcr^?q+6ATt4CfJs!L&)%hYN(%_-r=DpsEDAn$@v0mz0l$oyg8c)mPQmg@ALSL>`UeL^4l$n-L2Hr2)mtD5qh>p+$wP6Z32ldPF zQY2A}GBcn;GvlcpKSu6s8h)8-dYu1oJJroaw0;tUNqi{U@phh3k7=s72gg$2YWh}h zMPef_;s#W1KGciYZ`LQvBgdsvoDoGc-jqF|RV{aRQ_mj6doptGywB=igMQy zl)KEkkc7y?dxKt{hWxd#f-xPknJhj3&iHuvc?vw}!EqA3R7XG$;UlOly zB0sXO*x|3k5d^`Wlq5>ss9@}GV1shf_!jQMIAC5c2`)L+wVMf(B*7sGjVeLi)nFU4 z*Z30eYR$_=+Uc*uiP7GjN}I=mT*_F+cRBAu;LTCA{fm<0d~z_E zmk&lx*4Iek9SbPCUPCU9U?b#o&2&y#@X%Qy7|I^9e7(j|Evv6YJ~>J`l8pK^gR8Xj z^7&jA$6ms?!c(W;Z0qkkKhsrS+Ht1&xOs3@O-veTqBp7Pt6|m}i@vY2)ZERkre$Xc5$|0>|I1uWlim9o-84LPxISq(M&ga58od#&Hg#&RaZ|6h zy=yq5YWPiQll!sbHbxWj99J;Ji$JY|MlyU8Ijkc)T35nbo43Hf8WUes60y77lck39 z*^uQXyLM?fra!wvx5wEqAXQ`Bk8e+NINpDjj%)3Y3*h2;%`S1P_ZhTfvQD|1osC}% z+ub2&aww@cdQ)V$Mp0g1%nh$gjyq6p(a&PUgNVy^DhpdB1E^zj)W|t~3K|!j)-kmR zP3jxGG*YPnzZ1>QhW9D!C02P` zUYFM@Qh-T*PLm2^bVA<4VVlQBztCfm^Da z*cM3qD&synCHE9%gA%J2z2P!~a6)`VVwXlaZL7zD^Q&egV*FfT{v4puQmx~wys=QV z_LU+pLy@2gH9DnF75>fO=qacShvnT!5y^YmprzJ@2c=oHsoXzGdWCV&P?T5~=Wf~- z%=iI!ngVw%uAqQJ8bZ*rAue#lK@=Lh;8_CXOn0I!K<)(Om8X7O5q{)a)!+rLJh6(R z&FXNwN~$o{s|Em(BEjBr|_`H?sPfdejUPJ*ieb0dW|QbY_e>@HcS1DVMaO#-Td% z&ooJAf{c4dEC4tKuW~vQwVPttORz!POahQWg8_{6ilGX0RH?*>^}&P(F95Sdrl`mG zhjX6LFWm+@2b#y0$4nwuKwh|q=0=cXvp zpAQw;NcD~znU_b<2f75%FW>t8Dv~T$(2NX6ZNU z2O`ICePi2GAWts5@yKr)ztW*Mq6esgR`f}>Jvt87TsWJPUwo|LRZZo2Gx|&NB&zgY z8(NG{qtIdtpF@)*k8O|CWJDj4&P1%C#qq=!Gtnl+t_zOCpU9-AJpU0%URm7{CgN^S+>_nCu4ueJ6c zkSY`c=SUw12R?hH5AQ}d4ww8-O6qg-)#j(Qua=?vD zXC14Yjc@BT-Ts{ter)!q2q18<|1E!4S_wM^4rCf&>>T*N_Iq6R;Q0D9|FMj_vIzgm z4U)9}8+=%8xghNd@plC+QRzM?O3VWNbzC5Vp4k9j+X_(auKu@X?6e)^YGKm_aYxrQ zo?P{3Wt*@NNyuWMVALv~l_AOMgh)b^Gw^F-%cR_nn~ zq|>nSleAT3GlC#(lcLK8-ggfGK29<{m;m^HehFOn|NKZHm4mGr)$7)Mbn2-hp_l*^ng?(n<|BK=IvRJXRZ z5OdC{AW}AGn4C~s1v2H(cja%U*7=s*x+7pE8lXV!Wt1?#tgLhG*=9Zw^;%<HRCo5oU8d7zS zCZkLEuDH~Zb6(sxXO{XNR4R#0_0rNFV;U{h>CP2J?pgwuJLfeRu?jQ8d^5wVFhU>8 z@cH4++{hJl-?1PS^E12UV;Ofx?p-u!_iBeQWA043%nqy-iw zi!K7e5&YdYfY9)J70BgMrQ$68Q!Bjym-Say8e0l2kxDsJ&&LdeKRY~8nSXYo^z<#vQ!xGS8{WP&O`~Q>6p%{2 z3z#J#cd9vU3kpI>;fJket4H7q>-0M>GE@+#q)yku#U)leXOn2f!%?!rtWs-3uTls$ zd;IW7@rVEF;xP}0e%vD+Zpts}i-i|hMXINuy+ePc@0hKtPG4;HB9&fDGJAoe+Qn9` z;gVTtb-@a2!|qQG^F#fdx4zVy#~?*JBQZ!(sWL}+p7UDRc}?Fy*!d{++P@xjA?#DL zP-<^D99wOUX@!~lU;jexzd;kM%FzT0J8-V92GBQ9I3pseB^TM@oL5LQQ>B?Snwjga z!ZV@0LBcpB)-@ldUL8%uE+CJO zMkTyNy@*>8Msi!og`?H|;ff|FFAmf#>oBXGXzNiseKET#%}q znYb6-V?0UD+aGBB(id@iMGpD0ri};naUCDSiwds81&aHmsBdrH&nHoJ7OEk6@#$Zq zvMwSko7ZJ&qRvi+Jl|=}|CH2;0`zHjMEknnBYM*8!fwxrhUZjw9IBcz6uCjZqMMdv z_0_3QF7@dcaBmYuuidwn07I@# z@r>nnE%Q3~{ktzN@{LoKp^aq9lXE(AJ#oya6bUl}RDvvG>*dt@6-bOV)TTTTpjNeA z;HhnqVMz{h>ix=^R#r0_g@1*sCI2YV_6s%a8=6jify|IWc63Z#S= z@HoLNF>%|~rQ!wpk2{Io(piHdEVG0}PKsD}n_eX}@k#$Rz>Tx-+xMhE7*!wqj z@2x~KOfJdKXql4V(lTD#j$_InQtieR6h_dP)d)&I-d*NsO5SP7D7@Hpr?0Plzt=Lq z?YgAAGD5+gJvd^DoroAJ&=>SW>g6;?FjTQdW)%s7y5`j8c89c21Pczv6&>i697i+z~QVEGr3sVU)HRlsRo&aQ(UBk zo8v~Ef|mCV`S4{vgc~J7ntYK3K~HXwFMp@LV1}f=++uziufR2IGbuBbSksx6OBRP~ zj~E>)-`(B`bUs{l#Q1fp9IS5XOvF$1AI}vqjLfQ-*vX6vT-G!-_`ZZ}MdplFjn6S- zGO6PFPny*_Ch&wqHM_RiCdW}+tt%i&fl8wldZnKT7vG977Au7}Ia*=y+J2N@(WYxZ z!~>n8NKTv*Dn8TMib~)0#x<0z6RX^RCkt)`gC6H$kMqccwlCErMSn~hZu*QfP-XYo zpeMEIrf`w6m>g*vt2*NqKG%Wo>oBM!0FL`2IUA19Shy@+zF2@^Z>%tWA(dRz4>oe9 z9Sqwa@OP5$^rcZqO<`5jj)w96ub#G+yU*$e*S*edLim}hXp7WADs>^U(U>*V0MEc~oj5j79V_-W}BkgIpSR@-}6 zLIIslI(Y82+Md@A9(w<^+5!1v7_;aNhwIyg`e+?^E=Y2p(zdkI#OPiR8n1{fZ?MkY zOb6P?B@vBAH+`h6_t1NXb{#tTTGhcL6V?M+BQ50=;i|-!Z8y4-9?5;Atmnw&2lyz? z`ttgxb)+Ex;@TR@U-KBF zeBf>P+t)k;M|{SS$-^G=iZ{$UGPziE6u? zqg+XcxaZ&->;HYW*v0rpSyQxR=~rY~aRxe9U1PLDArPqNOZt~3owTo*X)`6QA(2*N zrlm^S-zCzDRGN44Yhwa30lq;a`wzGQ;6~3PCW#|!dp7JjCk18Bi>`J`C8zJ|tR9>* z4&iH2$0GTxt$7G>Y4d4TiI#I1oEx0geA?>_*>jTY(_!gOH-MM;Mat^;A5F>H%`q53 zJC;XUyNLNA;HJk)iH6ml4;JE_oxlFU6zx$t&|svYbqvWY(^xHcLA1w_Q@elT^g;id zo!b5O>Do}YcK@R34y{$5d$jwPPIqaok}%Y#-G9&YG_6%qhF;a~Uo|~LYn7Ctx3v4$ zPM@i@O3Ki2?SAj{Y^_yNhW;dV=W4B__;(a&LlZ#nq(|NPh>l{<62t{ztUd zh<2*%h^jMksm@5l;ph$2DFaWyS{1n8IqmYS4My}MV3gB|-#>o2z&R)(C%QdH(s;#W zy4&+MYNtF&FSPrcUsizBS}#(ycFK3;&vZyTyiXe%?wxjc@8zx1>xMm1VL=iN3-fi5 zMiJL18qGEvRV~sI?a@5#>1VapKQWcssjvREZIABAOP}n>cD?olmAh+?H(sfq&FQ4_ z5ga_;a9Udzn`VOX&*e}HFCnuL`Kl09j}v!^aEPvIL3tPveIGcUFuXx(leG_j@OHP= zKCQ@oC{R2--hkt_Arsl}$l9$jQRal*GYxEs2x=zKv>*JN2AWC&Xz2p!rh%4!6iftR zC1vO=voZ~Ym6ZF7LDc*2nFfNYYCv5{8B+Ctx=TS_>dBURaufA{#H1)BJ}XG<1?M)e zfqeSUCwXtP?N$rYeW)>gxSt8Ak`pecx$bC`32Zz!wkIF=&zoT6UC3JjSb1X0Q7|&#%Q=5FvpDvn}quRGs^CwIy zk+W+womi{rNys@x_)tS$uHuppZ!gBbGLdaw>sc1waj{`nFNcC}z8RPYY3{P) zO=GAeb_FCSHUTHk=Bq8_ysBt!(jp;MryHKs%LeqwXsYwJVrJy-674vx{XWQ#_Nbgz z6jxKGs196Bx1tUQIm{m!-r-sIA9R{~F|>YAyBBUIb((f>uh#mqcJD#0^(F1xTiOS4 zt@R!4TufX2qW00Bw8JlIt3T4t4QPke-*X>G9jkY0hj(f`pMybpSN@Wxbx=F}fp)l8 zdt*p@Bcgruk@iuSw)&#>!7lCa8`>L#+D8|p?3d5UPD9>i$PLX8#6lswVVXYSWd0yWGY$Z|J#d6G~J?h2$JmAoE>DpJ_1kI?Rk;o1m}rfbLVE` zOZXW7{U;%;7L|~z;kDJP{ckL)KL_dlDg|n&r_j@v1m@6C=xOWw+DE6g)xXnL4{3*g zryU;B&KcS{h^G2`iJ1NslvI$*B&EZ&OQ>mUznXid`cyMb!=o|xr)qgj;J`snf4xH2 z!B6QBol^v!wjuD4d5AY;euTh7>@OqpAM07Kka-9^WF7(!nTN(-BJjJQr9x2;mvxS; zXBy(f3|0Lb5CIN=)!g{d|Jq7U957r-l~wv@?UM?`=J>pxqOWu4hp^l~XN_F6+D__s z+Ih5{tX}i8FJgcj|AYAuv=Im({s+HXl*@xf_PZsnF%A~c4#63&_@LoZ9A6I~hH(+V z2_=arZ}_3nCrV{R&vfcGQqaG{V4QVcM#5DmB#6PF z;b8$Gni13U*|JkN&jOiQ>VB+7&^MLUqFa?_Ge2hrRw zMx)=ZCkL0}m4Was^|`+iH!xud>W7QoZZz~^VUqZrEx*PO5Y8fvpIh@Q2(ikhlEmtq zkW^C4Sc>C@j`%htq<9UM&|Cf&bLFN7gMr{gmE#t2j3k%3h**=ZSEsuB&`a$@o1{!{ za-l-L-ic-qQSc;==N_fArk@>}g)aVa2k~rb^k~O>C~ITpptU~@A<}*6BJCAvEh-w?W8dWg&6h`> zkZ&HRNO#-hTQk~bXboX2t93|_YC<;L{tx{6#!9h{dnBn0PyVKXwSVv?y*wlMIe1WUC-Fi!EcZvN$-mc{{AT=ehD8&-K(;6&K_0HCwtGdNhZcDcWmRh)g z&n9d)M+r0W9*dP!?yv3S7UT79k8(GUSAYEUOxJ&>yk^4;Gq<@byGt^dJg)MHsNsLn zu|o~sm*K`gR_oOa+B^A&ZN#oyN!-G;S~byTwgh1GGQ00;LXcjqPe^1d8=b9V7neEZ zYx%hnaJLJ56g7=m8-Kk?Is1*^WxqLfQ7xb21Buzp15Za~rN)Z?+t5y7SeXh(f zI_%nWfybHP;DYr$eM6o??bOf9le}opwSAkPmBG2*V8g0l!_r{G+HFjKQn2CPU_-%* zU??Cja~}xKU3NEXoVoDo)vF-rUwfcN->yDF(Dd?bmVBz-k{SM|^T5xx+uh$ZG3%90 zUCB%)WG^k|fVv6ukrY}wD;`*yIWd$viyzJXAJU!h^Hwr8jEStxbXoQ4wL~gTrC55C zoxk`F$`0L=so8pS({Iu`{z)piCv#%%JvYU*4zUOdU47eBtwX$|gqB<8-gcM8*McJH z+|XT?!nwCy?JF97xNZ31=HZ8#!w=JkAEpdHOc;K!yZ1HxC&EBRBb{{rA^g}y#@KST zTRK^?MnBe^6}o3!Jd`>qK(}O2diCrXy?ChCp0igFpDV3tTpTEA9kPG0E2O)Pbyod% zD{DcsRH2-BF0HC&D{$6?$Lb4L>6LTz#ujzrG<`@6n^60ls;m<}aDle8U>Oah1MssaWqIPUCe$ad6>MePMpE zaaDNELxjY-=zrgeTUUEl4~~R(-B}l$=!@!jKOGFuDf}~^ZM}LH6iDc?c$ASQHmubb zX5+dP10XxD-#-juGu0$po>Tvj0oZZjit1E)7LFV2`hql}Ogf(3%Cf7C8*#!D^kf4W zmrk7Lk2~64L=_}fIcz6weL-K6C{|Ujwe{)ep*z9KwG9~xX4&C6lf;^2VMVaAp#Lc0 zTP-<#Gb$JHwka-n*f>GIQePmQ?hs$1taYKgvT?zW6gjI1ntQuYbEL$~Ecoh@w?;b? z-^Ad(ceqYx)9gu}dK^`fp@xi(m| zYGaDH7w!Yl`?DhT_#4?{-0>NzvB?nB4lR>Y>KfUni`l2mU0SC0(!73Rm%h(sJEnH& z`x3kKti`fDFLne8k7uJwnXK>0WYItoIF^|e*>p_c;zm4{4n}qC8r3_qZ$G+`{6(vR zMN6qdb?^UK-#VT$=VW+0R8Ba(@9T|A30JP5c0iy;Zx9l}6FiBpsKo+5(eV)I*?^pJ zg#@0uQlBei9*4A&Q5dq?yP>C6nQk*pR5NPt4i_g`hEYIxmt#3`iJ_+-68?orzFlF> zbYnU9Y$LCZj`y^75&8%U?BbVgv*Av?r~t%c`tbvc6WoPpvM!or&56t?S|m%Y2&;N~ z;S6yNTo<%A=y;x%Wu7~O7+LuXRN?$ON=w6a!PG)DB|amQv@kQPds9?RQe@p^{|jx* zpVf=qrhdx!8dt!{b)E%(4NER z7Pf|)3Ld}#MZDeLHkKBjc#=x>XQdDNLd13p+zfR+yDouxiL zF5s){wlAg{T@C381vC4k!k~J`dx?x(wWD7edDu*vpR?b65-4a-cFkwh`iJqNRl)=R zn=mFtOVJEg*xakIdEu(8p8BN4pmFXDnzKp2S!boLVCB-$?E0er0U5yjI2DFn7%rH0 zlN=~+T_2AZUg5OU=n@NIc*%WysV!W^YWawz)|s`pLi+gR_5X*w_koYHx)Q&W%#aK) z@C-W2C{vx*X&X(dX-RA1L`@(h!@n^3Hvxgb?vJLCQbd@M*oHtD67u9`BDR)wcU#u| zZFkpgebu(gA8RQIg+ZvwpS7a47Hw-Mrc~5b{;1^rp8L!s0d05N{@%~~em*ZBGSBne zKj)r%@44rmd+xdCS}hCLtxNv<+tf!Gi%3|}OC;fiL(R%MdZ5Xbm#hKx@Z#pnLAw?P zD^dgP-w+8jiZEO7M-PhuVuO zEJN)!F7Q!R%lMF?mOo2phHk>k^e{WAD(0)I<{wc8$BkE+Rg28V`H>oRI1p}GLrKfH zo+EGH@CYm}-nN01+zq=g`37!|O>$Q-{Kl-kI<{M4G9#CY6g>&}dEw^vb8_TK{0fq6 z6%oe9)r`;LiuuOo+hw3ut&k$NY8u-nR2Oe`e9&FBN-nUkVC+^bV(bQ~Mr}HgHF&So zgIDJ>E*!jDM+UEc{nLZDQxD#)nuI$Ai&FC{9LQY05O%-20aANL!Zp4Sq6 zot~b;7fhbdB(r=pW5qH&@2TwMWp6?}6H~PP&%?CMRi_n8gN{4SG~I3 zx28t>EaFlj>Cw(OH+2xBy;G0&UTLa$>O;5KOlYXIoawU=3mTWvv=~e>$5=xVbRpP^6=gwMLwbP5HY-*P{HM%9QV}fD zgrcd$r2oDW)S)beaJnuu?^3|hZWm&mo>!{@pLam6mio?BqmbXhSxk+#9`Cq$96jC_ z?A3Gf@U*&si8gQ`9BEW{dIP5-4aH@?NKJ8>AH74^VTN7BXl=^erm!PVqAcGUf9`c$ zN#apq&*>MZ9F4tN8SB3;QD!ZnpE1L%?|jKeSVN$Q8N?GW7ccKkt&hYrphxqTvurJ& z#Bdw$jmDA3_Br6eAZPsB2|oeR=AZY19+4|uO;fpk=NtyP~0B09WZ-kcq!IHrXG4U zso$(>Mdh}21CaJte9V#DV~yQ~3otnS=T`cU*h)|G%M2gJ$W8{rkdBiNq{fjCL?Y{h zIrv~CUzK?S{gF?i`*NOsdCI$Hwc8YV*b{p#r^YPcU}n&r{MV0(x;#Zn;?R`CN(I)E z|5~^|Dwa=>j7JW1w-H4hH{e=}`_xi>IJ0%D46Ac49~Mm~hdB;WqYXu$H9GovfhOFL zo}B2y=uLB@;zl30*h6|17U?zS7B>p%RcO+qnB^X;`@=rD!_yn74ZLU0cboH_>&Bk` zRiadEAJD!yS~&n^tglkfrh3b4aiPbnp%o6{_E$YKtNqo-zg?S={1lZ9z+b!!K2$lb zq+CFiHYS9Wx`ibYjb^Ck3A|rsB#|74a9UwqXpPDQ z+fW8HrO1-Q$!qME3}cf`!nkxUb`Hj|_a~ydoE`i1d$BVUjLl*jxn;=TaX?{NFW0Xd zn|?(Qq-!5S8<%Zt&sEQHZmV>|IS1|yZ?~J-5hog+x*kkH?;$0(536cdUsC)~1^Vxj zxKfE*LtG-0pETI63&FZdF=#Kd>&qR5X-qx(V;FYE>37t75U+sA6)-X|xogLTs&Sr% zm_wogJxXV~F&1Kh5i?7IF2x>M4buX^-qgCQ^7h-M`A~ z?T!nRvN|j^Z%-v2mrfjM{ZK;3=!D~k6V_go&`PBnPd$gs@Sd?roI=uIE*fmO0mcXb z227T8bLW-T5-&Ao_ln+{tH_z2y@?E{!>T|eNmE>i{HS_rRjyD-q)%~RZ&ErTinnG* z->X!!%xsowPE2G-^J{8~eDmV8@2UBucGzAlGv_-btwz+Mye~qTI=yPtjVMaJ7KiQJ z^fI%BwCdR*;~4z{(I!>oOBJzClU45s_1(IC7+LR9tVITb$jsqS&=ILE7Fe{f7a(EbW5whU#D zJC<=*;9eqUWlkFocIsff-Ap~e{_Qkk`tJtt(WIbZ6&(N%5vBB zNDp4~u`QC+!i+5;?~zvm2iv+3F}$W#q-HZRX-VoQb?S7GX4RnJC2W$L@7H{T3Hlj_q3D$9r~ zIwfw!3fx^1&C;q*paahv$GsOqta2DT%1OVYJeEZ>xVdVkEvG^y1X6&an@nQYhlt8$ zQ8G;sz{SwBt>e|3d8Y}@SA{!JjwsuHE@{i$C_UM6GU73I%!y~Ijncg~?(5~cU{in4 zfi5YAw(@8}w$C0E^uUOz?#n`z$egkf6o2TeQdqols44cOE|==)XLJI%#|E;3O|jyP z$h%ELR&Y~n)3h&;Bdcj>ZU!3Wj(6Ah<8Jy{W77t}p=a|MJE9zjpk|)PQVRFRAJUBn zK3cQAwq%Y1;=$=9~H*6}B{H zkZO2DY>s}9IN!|J$t)IJyhS%jf5(36+p9Ga#*UV(*waH(-vz%HcFEMPH(sOTc6H0U zOgSAdv9Wc3HkaP^{3D;SJ=sD8)3>0BL%m|`xV0ki<~n;I5m|}miw0abt|{}eb{S%W z*E6s$3+#(H=rA49G}Qi>L|hg-KW_b4zIMu24lhsgqOnLuog-xrUddfU&RsIqXj}%z zjo?T%vFNwY7Ho`;mBLD8N`)J;S;LA*z0hFn_*%MlBl$+x4Y@Qo!|3@kLp-)O+hnjY z;Bu$);?Wu!w~Rky#}ukahxiD0(`mWu904Z%DdY;gWyFQC8auwV^De5Owmb%*?Gn?< zyhDK_>R?-qvE#9w(i%+C>in_aHI3c*s4y1QB@gzSyPP*PL3rNoIsT7z&AB1-`>t3b z>$-zY$Npexuzc~lD^E3z4{3-^$9~&1_CX1^9jh{R$%38L7z3qro@kL; z7=D2dtliH)f+qFyfof<3RX46KejVGFWj4E;#@;VQbX)k&cXZ9kJDyK_cCE-8 z0#|w-M92Mki0-(5`yXqwM}& z+MiPzHI|CU`rk^Gq@9=_d#!1#?x$FP)_|->AoEcaVche)CYAf20Fx2&cvJ?#pHq0M z$*HOU`lzZ3#1B<9N@Pm>WNl>G*vz(*z%Jy(iYGU|h z3{A$nHTAp`___JuL!=VA`MxMFtZ_?Aq(miTq;9M3-s0g_FfNpnmc-{=mzF&+n(PuO zOiWBz`7|jDs?hS1)co9Ndv39XWh#-e+|3V5*&SEf-p1|vyy!dedwUo-KiNRIgzmLMaqk^CwdBe@=l3*r zm3bGUe0@|Ua#O^KMmzTQFW}?Uu-HCQTZzcMzfVU8D zO=i0^gxN0blV}%8k!7bkGLVB#oJDIm9`R>SeM;*>@_rsKoM!BZ6xy3?ZytF~Jp=KU z+e_sl!q=EVUTVFm-q=yMBMSxRb+Xe~UdN*IKq*VhItRWa$EtzYZ!^d5J2G(O#H@~^ z>rWj?vIDuJBJg(GfyLOF`n1Io#!9vI4XTKBvRI6IrXH0Q)E-m-qS;^JcbZ#8QIP1A zWw9)F+iq+sc5jYcqk1L0%+wEaQ?IO-S-m*B?kkYxze)~{X)^0Ji!X5(E_hm>itUyR zS?j{F53<&cnW6TvalYrHprj%6%Bpu};6=9ZH)m#;`ZF@#kR|oCow5W@L2P|k@Kl`w zp3*#jk9U~kN8ZC-8VcrC1C`tUq?1jr*@UcnlNF>(7U@><`#J@0wN3OI!R48z4kd%R zRYH=_{ehvrRciz~C193meH=8ur7Ns@C2ppvAE`#bo7CneoAaN#@4HGG0;fTbboW@A zkt3_e7~2mH;=J&w^Ei)Mu{o=&=Xy!BJd>|~$}%68LMVPlav>$B>Sx5~$*in! zrv5Nf*vsnp=gG0MueZqWjBk|%e)197dy&Pl1JNvu{YI~w;JDuZ3@3jkJD9yb9U?>= zPCh|Myi-Uyl>9Y$cVf)N6xk(`2&#f!ksmUm*+I6y*CmzijCft?B&>_|J1V7G)mP8F z?iiM1un{=ecB|F{FnPj})3bpdgu{HzJ43JJS0I2|6y=r+dli>frD)ctYOg}SSg7<`E|B&EL>HW)HLs4 ztZ#hm>{uiIFTz&R*bkTX|0(33(~_jsMWU=(C?o^{vwq;F!&ZG4i)`2umC-h5Lz_1% zIwt8OQ@m4na41>A@+00WT(>$|z&qpoQkk2#3gb|{nnm<;Q~5Z2*Ku(PJPl}Ta|Uhk z*<;j^_;h=qf2{`-EjK*DTVE@7)X6UZU|^hR84gNl^bWOE&t>N(sDtqtS#7tdGuSs( zF`e%gPL9QS_clGZ$#ibLwaRoZqF+*0Gi@S*H<_K1h}F!Arm^}JdT2hd5;I;6zB$M! zvkacL>Ehm-pbo|B?Tnr_x9UH3!h)2_+uf^+u0VTHgeaxIDDhC!vDdp+S;CbI$dP)X7=La+L9y`@0F>pn)bYsdjjDtx8p7v z{bLRx_h8wR9w?lOFdo6nemMDWOK@0mn3;%Ov}d#lvpR<|^%*f<{q7RgFM92o&?`sn{(_qAQ(yMVxsnRI(50GQ$dv2Eb}i7?pl(5= zF4S5&nERSBc?V_=j#0Do^A4y>MM;3Ld{@cx^UQW`6FBfe>?+jdDv{Tp$v!L5=9j(Z z>_YK?W!{qf)nvU@#bi(p0un8>Fy#N{D)zWyAK2D>ULeUX?+Myf9hn6i=PrWD>gi*z z#`cNHx3;qz-(N{$K~^wZeMr1C=BOh$WIHl|NuXKlF*a`oz>q(FzW_dI6YJ$1yp$YE z=5Zd7Q6(aRYv6B56pnMOCd3h!^6GewT({GQ*_V_3 zsiX^=j*hD+W$H=Q7uaXcwj*$0m+~1ZWLeqU2JWFe8kG|w#-{I*RIHOl`o`W7BY02r z8a2H@&CU%Rh+IMMdDi6Q^##>|K|6kl526g9OQJ0xIv*IGYTa$q3zMG~4l}y|tS}EP z#2ki5lIC7O5ViSOWlE1@fPo3q^jz937jub^N$NG@^A68aBFuRQw&U_{mvW@T zYX$G=cJjCb{ppV8Y*9Z)uCtg3MGJ!72a|MhQODXN{opCuwh@^v~*N zKRI+ODIvbAV`o1mRI&LrVD%-(#7bhr*0*b2>ik#jK9< zxF&rf2)kk@Cnl!L_|Hh#h>@9pwq4aa`UaRb?13X|R>jB4_!!3VS;_w=any9U`dKyG zq1^EY83t-LUNdt{`@O)GVTY+KcJFo)^u0a~x|Iv9PNpWO)n6xgr)=hN`^d*HfRV7v z5eewYF-;xBPkyaq^{+T@5Dvv>yW_R4YKlo@$uycgJV}ohc4CZ<7Z?oYbX{)3M*D(| zT@FQ!iM@I??HBJECyi7*+hN4M!;7X1mzwPg46G^KlJ1xn0dirbNpT@x2n^`1d0IK+ z_g7)(Q|rFwK-_)M*gh*$)!6aWC{zb6tdNti)y4#1QI|jy5ciDKCOwT%aK0K341tc(T?~;LvuT5Z-vG*fP*B2c$AsmXrI$M)7 zePj`GaV;J(8&Rp!>2xCfUgxi?fr&1Xw~`uF>*S+6R5Pl3r?vNq%}ioCOAH?6{y8vG zc?N}XCMyuF$i@(%nqE2P!~+J_@m0Z_)U-he^zy@44bSnHBzMuc!r(fHXWUu*mxOK- zxv=r!Xk@K58-3ZUR^kYl`3l};8!&4NLz=0rbTA$L05F)^sh=Ai%~H~AJ1FTHCRxHN zL*{&#Ld>&;L>Na`ZTDo;S{6PuEVzKh^;RJ+Ddam+LEU%s8#L$rAewEV_Q%1|L9|nl~4M5rzMR@O!O@Efu+F%F^O5g1|%*+rKJbWPJ71qiK0pg>w-{ zMJT;kI$a{RjbdEu;(93RWLLr5uFE3^y{q?Fg^BDSu~&wE{IliJOn zWD3GOuo((&|3Db1u~8I~(&OW-BUXYW7+IFg^2uA3|wkHFjb zW*5B+}~Ai<|TBtbBhxxnx41$Sk9qGi?f)s}AZ}ScaruRJ`S4 zqmEZTIcA@q*C%M^l{szw$bS9SXY6i!24v?qHuY1>_*hQL>D!XHm5_^(C?|TgHcPF_P!3;gpTS#FzJa$I0j-8KB4wHCmu)r)`0YrgO6?g#7{(qnXKc##jgzg|Un3hI;uElFLg=i+( z`4UP!*7ia&v^8wdoM#t&M8>(nVub1dV#^CK!)MgPu}aG)Lr7D^JkX^IF9Px+H4{h@MDACL{Z=hQ+!*BnoVAJo*P&u@QOP|OpUeObZ zevaR|sF&aQ(JS~}6!q}CG&(ufHzs!0xa-A1SJ~hMHp{RT?z5psW?3r6hVC`l{K7nU zi|KyxipN4x8#hY^_Os~D<-B%;xcz#DKlWZkZ2%oFpjyvVNH|Nxx zA;1(U1Hlw6%-xrOu4TqNj4{%gG4-h`THro%L@t{;q=syBO6u_9US;-_NMQ60^)|s1 zWBcuarzzUU^z&GcY%Hp8`Nifw-lMr9Qcr55;KB45XO-Cr2jCVtPcu|d%h(sHR3OdSBs57X`D*) z^h05ObqNPspfqDs*y6ihLftbd!OJ~!9Omi$xK&^Ymn$9^9G9Z=a(2>IXbCZQ2BmxW zD6t*49k3k|H&_SWT;py(FVd6o^}h2@#a>w|=nVSu-XwvS;J(+gx}Bfh z&==BZ_V_)7slv}Ps2DHU^W_~%5wqHd(2)!z)`(bM5O?6IVQ*fo6&^|A-)6S~g9{4^!Vj}{kF$DC|eu(uL7Z60X-xZxx zBz6!I68AL3NfxTE5l=76FI|2qP54am7qWG9ic2S>R{&2vpP24>Ali^IRO{D@YD?rl z|6U|p`}A=V-AeRssxhR~Uzkw521#>^%LNyFcCKJ3ED#J`Aeu2$Z(%rbNvdkHG3gZ) zg`oUl3r89=S5ytTHO5B{DwG9 zE!n-IH_iuXny`f@C_Bt?)XkpAxPLAt23hwL%0UxZow1LPnXp<@*nkTW zyx_l%Una=Z4PW%!Wy7BVZhG=g2TsYL{h)r#moOGPa!ELR#K zkL@tZX<5A^TcF>CMDWFg7j;xjjC|Q4cj{dkpX~G$(1vSdb>=|faD2b5-Fr&v1p>!ITE|*dI6zv+1i4spwPl`s5bm8{fqnddICY zkvYGub(go8e=i)d@So|hqq@0`d7cMyjFG=@sP(gFSFD?sLirH*mf|5 zzmSA$FbFLBJFNj7#zc%+P~f|?T|Umi(s$j zIn=(q{g5axLS7;;nzIVEF9#o250KfXyMu{Loyj}K>9N4MM41-e0scJbm6&S*t!F<# ze>U%Rv(k&~NygT|n%R zOKsH=(};-vPKC=k`hFBI7h|M5a5tv0#%ztPY+R1DpOs*)gUBYoOs`>7V8GCu;wl_L zR=Z4PFCP-{UlZ^lycssid|M#}kL5b6uo-fYg9cZf4}p?QN-os&&YJ2ljMhUg$(8~M zSEv6qcmbpFptc7|6!nLbhij-)MJb?N)KkpUHNLW?&i5g{HPZ5e|Fuqu#3=zMoom<@ z(J0wyEY&L!;h{;unabhxNFhpC68#c`9??E#MvrlTwp1NPPb8Y3!>xPO)^f7g4nsSG z+og)^9e0YnZ+3o*-{f+LT>{(B>W;a%!IHC5@l@UcUyb;kQ%}aua$MaWxm-7{6DWyN z&n-M?W3O&8n*TVZrc!X?Pf|!oD#hiss?pgnbP=9YyFYOZ~ePf6lSgm|Ex)kJI33fU7Cxw1KDw&f4(($8FZeVEtchebNJyrNlP zBREPKfp}>!a))k9fd-u}9~xW;H0A|}L;GVGT(0yTpUT0WlnT|Uozf~edO4RB^@_*8 z$!1%w8O|S^7CT!L9Tz)S866WFniko`Zcfl+hP-Br4{Yxs)AGzPR10`f&ZWVR7rJ5; zVLOqpUzcF`V6H4RSC*SAgXYRQbLArQ;VwzDa+$fZ*<6VSk^+?3iHeepj8nJb*1)U? zB`UP5kVM5&StKkT9*hm~_9A$|R4$hqxAt#vU-TVx$Ec9E@JN$1j4td657jsr4o^{z zH3o#{#nWc=resjKa)Lv>dQ1t)j+{141DT}FMJ^umoNOlbMV!IWe)buPiGEg(%II}U z^PxaRWR25eI@5`j5ohtKYFf;Fl%T=f_Omj4kr-0}liSZq#D{s!R%uB!4ReC1my-c{ zP*WksE{2ynu8g?IYgWZQ;pD>LD7IjY)e)?Pf+LhAjq{|`8)V(d@}jb9p$KTBNs__NI-eA*gHAjr97=<@S%Zjop5dwO z*MBgkYyK&2BI^pdN@qsjR=twR+~$$r#$0n-f&LV#@7neW{Vs#4Ynu$B{hhL=$lTv4 zEA`B#M5nBXGdbAW`6>O9D0A|(Fcd$BvMRyJ#$tQNOATsW21`4a*?EE#X76wKjb0KS zs;9cvjwT66IrV7wjk7B;Fo#=@#D7r)Egf%c&tXb-+75p>QR%2ehK}w%enBZ$4<{Hd zCF~n1M9$8S6cYBO${3yGmsBr>=TqG`=rXFjBM^2EM~n4Nh1b@vlT?gK@{gmElitm!VDrlUfv9Imbp{r z3>^6XfL{(!1IxsN>SahsuJBN;?n~jIDxenHX#-vT`iu(`$d*$oL5?^uw$F~eVz5^t zy*`&4Qk*z`8ip77N*b1$3&nFax3mzKR?G0M6A3TA=Rk{ptGrSr*oKuW%)>=gOZ4K&DAVqoGNK-9}h{pY)3wv z@&QT7Cg0UE9MtQQGJAO@#PB6bo-3!QebZ?VtH!d6>Wa_F$POG~9yycQidbQ9b6Gqw z)zt_;tl~Q70GH160)@_eo!|J@5MdPKj!zj~AvpzqA+8!r0s^QMcdqqa*$2n!gIt8~XC=$O`%I6?wv>Lb%HQk%$mvbZBqJq=|*80I`T7b#}P zeruR_Fdcdn-*{7Q@JO%wg#9&>*J=T+QKT4A5;~F0eWh6UXabO}NVn1R35bB&U21h# zr2K-K*>uf1@1w@UDLyf(GmY)36!%LCuLUDIHbpX?y`!3dq-v`G!c6Lfk*bKSTsw7- zW=lP`3K$vSz2B0AbfwhDYX<#NsoPVP(gL5_Dona``rO1ct#2}~Ht(=6S#0V^Js%*X zd-k^fURbqgslMh>YwaEHvU27udvtPbiaPHV4yPB?LU^a}XYs|1su>;ciZ&uTC7tTa zk_sBWL5~oj<2PkdYU{5;d}5s}Yj94@`AEi@@L}ME7Xml7GhS`WGpndfh|1JLtVJ^{ zVnsda8CITYbt{0xG(5j{D6Gekc(M^g6!A?>`Q7y#S}9@6QI|p! zYg?bfrhkr~yU*+VSIUx=VkBS+?I~e2Dw~R&iH1+e_f=*vSH7<{L;3RUi@h-k&rN7c z%wT~TD*OqOCkVH=g{(B_k4v&oq`+R20_#tK{bUO4r&3@)odPS~pftQRC`cQJkQo{4 zvpJ6MYI7=EEv@5_uGVzV^}~DGide|g99NHS4w=Vf*Z+FWF;2-C>7Gm1b8ZNk=I(na!}2L39{p7wQRfmfkEjXUP)QZ_aXdqao~?<%+jV5(|Cl$JYwfr{q75<@xBpbg70)eL`ljAva@wB3>*Eq)k80F% zgV^G_qLb=Vl%f3}-9jAH`)NJDptOu$mX7|75ROEH8hvco`esA5l`uW|?)~3Hcf2$L z?eTPSWBZM2Mh3>yXYF(eJ}Z&7W3L(JD$nftN{EoY_CgJ@^Y&I32}yG`Y3hlm>oz_9 zARo-26Y7%>GAWo=fVxkI@7{7Zrbn z*@OREFLlwAZ+&X={VjM5PnhDp!8e;-q0092TfVAs;8c}6D0mn>t7SsOr^MaOS*=UC z)>szCLW;(YFgKNDz@o%!G1WG9Tn?w@18VjYYd1q2zNj}4U36?{a-s=ipVRC+~v3JHVeFz#83EKKuE00DuOqMBQ9 z6=YBQ`iXH8j}=79-=@54l5vhE89G9fOJtd*g;At3+@_J4X)-|pX3VzrRf-Y(g$2{P zX+TpfKqJzrJ9@cQ1~Y)h1w?cjkxc(u8Kmm+k19U^3JSf4f1=n(O|Xr9gJxRjUf2K%O? zMu$UQD|5Q%jp^zX!JQL(m5%O)>{?!yj7@Y(9{zJDqob?W$6MD{5#w!pC4M|dBt)2( zOyk6j*WL|hITWSk`h}d@$>z+IvHd8uSqq5eLsW(7T1JFKX>i7N4NrLFj$VN!Tyn=& zL0a?4UO`HWYOqO};u27d#&zsQQKd#Rz=O{%Hdz+NQgh)AhVx80R? z?xR?UI&_TCAmU>X~>eTKKn;ZE~tj%WzqOZ}B zl*p6ODK#l^tWmPCErItNhiVoNNv^3cbr;VqBhfYKM8%RwWMUUdKujcAIYCE0Y|!S~ zj+dcdm#nDLeJx+ZI}sUfK2K2`=DBOB@cO|Cs;Bce)Qw~woXWq9@q+A=ysf6$<5lkJ z<(V}ykOdRbMj!9iFuE{8Sv?B(W`%@xsyny>zy>K45r{*$jX|3TgceStHpzdo28JxhpNr5rVuNA#?D zh5DLHEp$kG<{g)oOLR&N<)8Y2w4i#%q9%)yu2AC`Ukiz41no8N^wgMTUWVG>WObmH z?t3fwF`Acs`$N1Iu~o|SE_IM@ahS~(73E?ySsNOvamf|{MOcT*ts_pNpk3opD;a#8 zK8jAT4RBvGn6BX&3`A0Ks zpj6Ifz=h7@SY zqED?`;0L~h{4z50LOtqUow9~Qsn|8i%o~vo8>0Hv7Ax2Ax+E1lIK;6$GXqP&wbA?! zX|a)cc$7$S6-$4+Z0@H-iYwJs1i;$nP1lYz+|esPEC@&vA$3;l^QO0-lPb{zZg#uR ziYyOn(lX@dB|PM*m!8r5&1|zTF|TSg;}@Z$)%Oit?e6y%@0K|9l3JNj+~N##myBF( zKR6~i-4dUIs#DU$gG23SKcEO>^QZYVwwtH4_BQ?~kK~UB$?|!*Lw4{wZk71BHj0|M zCpqKyB7zwma$ZbibD2GKoTl02r*w4Wx28s8KzwDXi3|>u$xL>#lt{(YNzBX1FX2rZ zB6vI%dJCc9q?>b%1U`@oyjBN(9-C|eRVvUe`Srp#Japg22N++XDO^ryD#6=S)@lUQ z;@UoT?nva%C2}IuaG85i8nbG9D(5aD!^ur4kdsGpJ)m=uN2ZGlYST$f@^>dKB!0_> z1uC_cv1V9H8(U9S*y(UQ%VIqPTl!$#F{~8Eg_B!#`H>}-3YOcTxC%yh+m^#*37lIJ zMehL>|1Do?rhB<9y<4GS5SXF1Yl^RMm&y^R)JB?U%+X7S(8!Da`Xx&nExYRuWlK36 z{GpW70PMSg!U$OfgV4fG`}sYDtjqa{U_E$S`*}g7b#D9l=XtK55ucGsNnNI9D7W|P@3$gP#AlozmHc~pr9U|4C$fE^Y?S^tyxn=81 zocI2>Vk!#51I6~U8tUck zXEoS~q;i_~bxBQ#RauaTK(ypG2>~8n0Z=dC|CpW3#{Xs~vxV|5+{u&>y`XTZ%h{XI zJDH7wUuq|FrPFM5CFfEq9z}3Z+vqVH%gu_QwM(`H2l?@eX1#N{n4Qb{r%aEvb7^i{ z1!S|aAW=~$yK3w(Edy-hLa-iKdp!ln)pfxjy@-p3NVa+J1}QZ-2QB{aM`-j1j{4Iv z;n<$$-FBV+lojfxFeTf^qlzZjVkJKGfDDBPDKpSx&dZSdo& z^8^3`6~2o%%|taE9>QEfD~a_^cJzz24L_3kGCo%CWS`;{Rn=2>aYiw<=ib7edr$VLohVgz@Y^c&}saz_9GmMMVB>$wJk;$SNBr=(3;4#+Usww4n$j zy3;M3aZC`sgv;P!XTBKm#?CZFCdbZvNp^MFhKFF>l%pA?SdPfT#;vvr+y;vw;&wy6 z)B;cBvU>G~q|x4DYr;dvD(6PuSf)Du@+w(=(^~L>l@eclQAFU?l0)q#u*)LJOCjcfV zY=&(fQoZJcHte!noJvyRv&?4#2e6bqAmdDRio(Adn>}ZB&4pGG8feNYLf(a&SZ?L0 zC6u+S;lpi$(Zi!y78dMpfwqwmXi2dx>eCyz10mulq?(HoJ@&%ET5bp!Uy zvHfBOr}d#*RMi>dkwdY*&+WXrW3c-4K;OABs=qIJwGA%^>vOa*>fi(ftMzclF;BuK%D<8k+G+dnfzDaQsuCa$@(ji zai)=Ju>UpKxGZe4|4MA!!`L|f3Tz-9x@lZ&zYlNFqIbmh@o~%US8gOsY}^1*$iIdC zZatN-uNQ7uKWS$dw!D9@McmV875+V;@V1+F3IE4`5xo9Es$0 zW-0l+i_gs3B`Pwb|DqLCxWv4qlRS17!32I@O}^&ZMN8AVJ4p`cMqA{4ugWZO{6ws^F|s0o0C($4VG=bxm(A!m8iSQS;e+F%r+<5 zRF~Q4X2OPlJJRVSKXxu!;3Tb1Ih-(&Et*-gZIRiw)a3q{#%8l|MWUh(V~Y%PxA1Lq z_hbAnF}LlMk8Mxt-#z>$v}w~c-bPB>DW#-Pt4N`i#z}W02YSsaXR5rmWoBEm*|x&0 zsvBLFxmy>tTNkxkio#|}lq4hNSkff5(h|W()Jn`>K3pqNMqW_TAE}hqeeSkH1?Fy1 zDN}o=d~B0Vb90-JN22q6fXz;0r7FtJ`7V8*hDVF|W|39jpo0U2X3HXkWV2iX{7Lr7wSRM%?DU+|`VNG~zNC5`6&8j<@oBKHd-<`zN3 z?9$kF3AXyejVixJBk-(QRl<~Xc3hif?{=jmMw5r^K8{xgLRAUA)(*85KuCyl*%uK= zX>7mjQvXgw0x`D{rL~pO3bBNQ3e1Wf#^&oN9U^tygJG1W@DI(A)&l#eSygIom71Bo znvAP7t#G1PQ%9I%Uv4w(5vhk2U-AHKMZep_$tP3qe*`}Lpo=gaEO=yX<7Ro2s3?`a zb#tpOt5?cRk&bqgWv+6VtDNSlIy1P)3@$Z;%gkW28C)@{7rJzBb?M&f(!JI7q(JQ2 zBfpR8wtrOGKCwZ1L#Wc+qI+tK?x`)(Q@RSsOJ`Ze$-C8 z^swkyjovaa;LU*yT2jkPX@k1E9B~dmZIclVBFIzalYO>xQ(r>C$B8V|zxk*)y+-Ft zKvtE`EhH{ibJ+<9sjS*i{SdncqJ6D&rj+pF%%RZe{X3F(yn9z0$#a#nyYICe5zPq9 zP%p&GCvHH~dH5$jKG8@usq325XPeAxo6OHOspZHfSvXBopT%=^)9GIlP5|$xU*=NO z)#sy!sjqBc<`dk$cLOj!BR?E2BYgG0G1V53LUu|EEj2%zm3K0yF#n3gSfb|nY{vsH z=xS~Jj6{fSwkY)3`3G(}Ems;#)X8zUerhA)rPvCT8$Hi54=q_JHw?s@$${jr2j_ZGicgXRMh*PY@qc z$MjadC-3Jq%B7PGUaIC%22D4ED{sbytLukC(sx1WyOVS`+vY}ZCj>%6$thec$-%%+ zs}`YfmA-;=OVEmAJ2yu^gY$r0Ce( zCUtvOli4htE3dIV|Id60yj6_!HdFAEU-1&pp2Acntr;j_xq~1JJzuwy$dD3BJ%xv7p@EI(MHH0-fN~I9 z#7QXVB1+Adg^*B|(eoWrFUGA|?5Fuqs;cy=OGC;&z9y9XMIoBG&9UDz(g74KsTFfi z5ituWAG@4;>BumzTq&|jSOW)MF8A5qk_9`U<%Vg$(K%0gyGqEZ9CBKoS*@J^(2%Am zPNuWKWxTtnIQC)Uk547~P%**+81I-EYW~8?&FD;!gykqT!z|A(_uUFf+Pj3e)ChfY z>f9lQEk^HVNh*c_!mph7_We31zUT^{9vAt_{e(?u`w$jeyB#Eik-Xnz-hP7Td7h_) z$-rS?FMPRp+IjkTX7eoI>EKz)a~#i*^k~1UD!QxE;xK_Tt$$CyNuL$aR7Kp4l;R;i zW1}2Wr$?kgwWARlrqt?nZ968$G}w-DYlU<@=9x}REp2D@*(txV@p0*I*s*TvV9E4Y zf1PGd+V_^xvsPG+z9z$uULp4TWwgKwxIHtT=JxPPvK4Db2OCctMHLD=u{E z2?;i++ocodsPfC;@8$kx+v_9>sTn?LQ>d08t@0&f)w zG#;%S<;I1N(YsA@NewxEsc^b=sPC1WcwMHCun=c*Udf>`OX88t6GBII0B}CRLk2|% ze^SSdn3&kcD}=We#VbznaK|f7@NmT|4)Z9Cmx&v)f_RynuFH>?jpLCU=LSUhXS_@f z*7@RPm=Qzko_OP)c-x}{d7Bj04CUbmnp9a9{a@ImJ(&=UgIMv*2qEz{L)3IkXBi}M zr9NR0^2yRt$L3p~p42CVC$Zd-IwOO_r>-o1-16g*pCbA3y7=+Q54KX^DnI!yG8Ir* zVQinc`2`F#efpQNK8jrt{@=pd_?*^c-XZ9M=T|bsyE-ZMLjQS$fiYp4i%~%;Bz81{ zd(-LTM1KhV)5kBa!EgwrOXebrA%b3^;61u7f&*nyP|;3d3O3<)-c0JnpP#>6{_;sx zFwG`zH^I_&Aa>3nRWo|lTO4sIV{Fl2EhUwpBG-N&sV9TH`2f5B;Ua#;YWd0YvUnO^0(Y82Y79D`JD_)EW9g8D2BeLw^|_b0mC@zm=SGRGBsO zWj8rUwmDo*N%WG%jo3~s(?h?Mv_WJHM!v`!BXXW}U`o`m8@+QFLKtHZ=vQ}^TZ}0s zU7WV0i&Ex$A#f4xN@!!)@H@hz>-^Hjbr^4oc&FuyjrBDRmW)@P=IUCCGkU)#Irdpx z-K+NIrC#B0!UUcIbdk~7Acoyncf;mwFUIlRgj7UN6k4!KaLedhvjAt!B=f{uCv8YTMZ);wWAW7ctU9J? z0l^YkLo;)zv!cnouEP2fN9Dhylw5Q@P@5d)%#H4+_CbhX&ft7{+N<1~Z9gBGPi}+M z7C>sZL23&iwJV# zLDFRisvWY*K%__$;ErKxByWkT^f4WYtA-*zON$$rj(#cg1anhup7t>Y|)Tqk$d!&;RCBCPT8jWf;OlQQ?zd*iLz z-=7;1dM~Bsio^r5ArLAdFK=5YTY9lM@T|JYz)d^(I0dh=SOdLF^7$lZ$@DF0re~P5 z)UV>LnH#7@5r1{elY7;(kZYlqkNtkFq8MRaLZE5sQnRS6S#)D4?Ij{l`F-0WGMLfX% zi^B|1(Ob3yd8cqi()UCuS(=m=R>S@w{r5gwsG$i7H;#GAn6eJK;y0iH!h?^}!q z_K9?YwIa1HQstLB)uPMc3yY9k-?BKv3I^g*co|(GE0R`lk(pz@(RmL5v@g+e^`s@m zHt3mblmC87NARqNJ){KB)DmS55eTw3kuyD+$@o~Bp3XunFPPAzC|2G^=c~fWDjZ13 zJpz)MQmgMnpWMe}uqGRIV+_p>dvR!Pl0QHOA@Vgvkn1V~iZHmm75H@o7zF zMOF%Rx%Eb*?@9@f8fe-6xR&jQt1&E|57%TkWOxxW90I4hP=x=>rT6_=9}?hY4NIL$ zH7yB^*Tfrq$nZNwUTabd5Ug%H!4tviwo^^&iYAjAmKM-gx4C#CSlvb?7r^aq1J4Br zR=1V%M6kLogkBICKB#4Qk-}TxSi!P(i?v!Zyjc1!OAjxj=i9>IQtScl!RSs2MWx&g zByqAlp2J9GF)$)q?b{%OP-Lq)bgK42X7s#@UYKO_FOaR~8ymkW;ZItt-ExFj;bg)< zS=kHsEQd8LGI~6s%Z7Eve!2?rO1lUWm&&p$;KEdoTf-B0OQ_1#8$*Eu(TT-)w;!9B zF1qoI!E9CG$0xS3#rB+M)63XAp5S_R5b|XQLEO07`(Dkek%O3%)ZyZ<$w?=1j_x&j zPmrHCk9Eq93ZN^!!D;&dQ_)Ze)*MQPKOwx$p&GpS9ZClI3gLSQQ1xPyD!MeErXncyKflWnNY7(;jxrG9T+KxxN59__ixlS-HBiB(}$?Lhq|0 zv*mpg231!TJr(N{@zV{X^N5V5@YNZ)SslPa8NpQ@?-**Ef(&=s(rqf%%DGMEBrSxY zGa96cT$=a6?}i+brS)mT+)$PWs@I?)15fndEya#=uc{QJ?ivggW{zw46Mtxx4&CDg& zcA)OY{a9rwt|g*liYrSZkf>c~_m{6>3#JpJ z6DLl7+||jlqzRm-EVghn#?bq<<_MWe1&uB-0&Hr#|@v1j*sE(o4N2EaAom6FwDnb5P1bK(F2lbRBb`IfVt^BIS@y%Sl*f2jjBFOc1*UuD zT8mo0IRkgxx%K8;pIOgGZt~l|0p{%7>iT5M3EpA_)Vf>AfgJS>*_kpsWJ|9}#pJY3 zS6ue2l#=5kh)wlHP3jwd-kZ!0*}PIQum1R^l~EcgG9LS$9Bm&gw@Tqn>_-n09FGRg z4rve=g%8=t&vHT|N@4GuR`Ln6B_8Hf$h7{?T17 zHgvEOlH+TB4UwSecKoqJ-R2D0={+-!(Kj~(`(3@&Tjr@xlv!K7lhh1GsQQs$qw32A z5rGOAH++@-o$pJ8q1L)O-c^<2f+eny76k$52aRAl`WVI1`CS# z^a(&au*Q*_6597l z!7N*R(s5kgR#~XmSxMuOKd_O9@TZQiwy7oMQ}+~CiV_9-`oG8_(=Ky5fINEBqX05@ z7l$2~_Yq_34^#$Q(OeIH2C&T0o5Y2rN3UvZ_Rn#_=S!TSe_I`kPch4T=9G=u0LZH7 z+ku9{b$R4)$0J={R!{is?V$~O=7@s0j4>ms;mX2kxD@&|tx`x*zXse;gn@&#Me3*0 z?6Niso2L4pBa2rrwc-dp+gqYkl50YJMvq*kLwF0I+)AyWIdH5rr-maW7<@*qxB9R` z`?e<)iB6bm=Sa!x`nh?TwEit3cMqJEUUjLRsAS_+iIn)oO@s*PP zuiVK`1~At-+Ad|zHOt)CNSW0xty+bmeyGXrZbuc4_kO6!?s9b(WOt{V#22Kz3)=fo zXt-f{xjG|i&CCYKn^^aCVZa&5>#^cd+J_S228UI}&{85e)poh+{0(pPK~8ejbOg*X z$@q<=W||9eZ`2iZ8;)eIC8P?&&}#e-h#f5bZXf!@pR#rpE7x0((Tk(4Tp^_X?i8Q7sR%=WLaAAXlnY^6?OGp>&R(aBnfiQ~GHpa6p zOIGY!$10k3&de+hUs-;7W{EEpuCnqEj?o4%mg6krkt3MwQxLZPjzp#pnnJl9<*Z$nt^q}&Z*6R-UcA+MFvUlUZP z-jgrYmM|AtYLE6Mq{XglMG_CO2P@u)E(7)fsaL1SG4f9chQMX1*OZBpo%IN-5ouUl zTiLl44f}koaI{gny?GO<(Sr<48kuiL#d-jpiq*tMVu_tLM=Y`LR2xN@U{d^&nl-%C zSy(*H9}UO8nx7R76;Er4&Q{$r^TzIWWJPaPcQ3NW^O@+>;`T=gkLJbhc4n>rWO3Qj zsIR#FF$wahuM6=MS92p+adk`7QGD;u2#+9NEZJ+hGt(`4Py#<>In6y~RfTc)J|Z&$ zM}91gv-abt}A{746m{P$jVu1b1btW!cwqf zPi;fnBDGt9tHZHA?bt#kP~ogAP+N-#H6D4MmA3K7@gu(uytsafx>ju~(ZNhRzdG{U zz~K5E+a6K*yuc|edX~d-buyQ_qdRr|DMWVd+p4T(V=RHh@*Cq3!+4~Mvt&{NixC!T z4yndg0gW$mRSEP8pYaH%k8McNgP6*il?+M$bXheXZ~c*~$Y-%&U$SuRRV)`aAi|p~ zTL!T^Yk{w23>v)X2EaVuZ&tA zfuZ;l0(93>e%}6`e(2ov=iA>S4xD%SB<^3AG-9{=@Pp)S2q$|)*}6X|$CA*P{oGvV zOumn*K^&u2)CCgeI=8vb6B$$7RvH~^rcFB;aMi_a@97nxb4X z-Z~5@QfQR}RYdH<&4-z`*@A-!hYGKl`c&X~E(GDM6uM4i$DtX{B`MEzh^5jqNa~t$ zM!A|CcpT(4k+B-nCV#M|TU5m&5?(a!v|6+h0NjXNXWXRYN1)i&DO_= zw=Q9`VMM_Rj)w@4^D>jH3Fl_jz`-=+579v%<%1R|vmI37Qg(cUuE@tybKY0o97%Pl zwiU>QL&i7zr*Vx^h(o-?e4Fz_EN`WiBI8t-REpEpj-d*tBuP&T%e`8!gNZTmiHtix zg@99P|Hh}~Asi|rc?L4qKr4K^e!;1VK;QZ?#Z}%mi{m0rAe`&dQI z`TwK|u3r-pR!polH5)QJh51-s$>53c7AG=(<@>NMe9hR`k5@UoYTs6=Ub=*`WK~im z+2*|uigI|ClpeP(qjVtc1>r_-m+1%>8!zfFsnRQa zOg3#qSmhV**7e=33uJL>^gaTlxJH~+wzFOqP->jI+o8(*#v=)JyVEQyrAq8womRhO zf;8_gG;bIDE#y@h)hj3V9sT_rwNSkR-F8TbHAPsI54xY$^h*XcR2Noy)OJ;9`HfV{vE67r(u5$y3=v{q3j6x)zUhhYBM4C+;B?P;y& zoc5kR&QWU>u__W!g0)qVsvz~zo>~VZ6`#C>-0yGyXF>u|?C12}&-Ejj|9}7YbM3X) zUVH8J;BQkhp?T0*H_&3wAm^D1c&xTc(}q;y7$JmXO=ycK+2DC0YDhD3*$vQ@d#$YE zflu&R0u{GHH&@bb3mT)=2YV>(wqW}WoT@Z;o*s7US?zZ(rRs!zD>tZD%-ZU^?E^$k z4<25b>DbN(q{o~Q7icw`DtX5|q18s`wA91e(W17ELE84}cx`oCCqx(sct{`rM8*bM zOzkBe?Jc3}w7Ll;ND(#b>ui#}lkb?~dB7d~rmEuM)NG0EH_gH6F-6lxwU$7qr}JD} zV{=Ld-`pSejuR^a{uSM~f`@fkzy4lH{-%;WSQG9^`p-se z8Gh~%Y+PI3*1seUUqFD3p}iBgJP=9-&#rGty#a2~+IBEJY_6?Ih9~+CfR<6;+vpHo zThm8Yf!!_)tP{)&7z`sYam#Ni>i6ktkLXT~fe;S7iD6Y8Xq}(`#5_z-%|@ACjR3Bz z{6~RGY-t8mV+TP+cL>NTYmwn#(%wdV&si<0iFDkCE*L(xG)bFLlbjmzZDEl`+!-~d zri;tqu2T7Ua>w;m+P##EQLc+Jy`1>WI?d|dckEdv#N7=BVqF6nmz|YfFOe^yx|)M< zg8ucsl2cdT>@KTIy{h$@qOn}b!@lw)YUvtS;+UtH zVYmFgtV-XeX>ISL4W4_==GOVi@f2&_JhWATKc_a3V`9@hqos*MlIu|rg z9o4f(hxII&IGC-a8k94RG>aiT#=4jZT38K+H8iK5)b(EtB01_8dekspM1x#$RFxxg z)TKgrzK3CWH0vwNqXsO33g&E#*zte7Ru+CpE7fk51e+h-iUgA=Z1~NT^5&L_?_1?r zdKLdf@=Qg;I0ck8v$4+H;d{r-MxMFDchHm-u(1AMreH-I|DeU*8ZLe_@JK#-H{rc@Lx zu-EiqQ(cE0eQnsSjJTEZa%+|p;P&Oanh0}EHBEj^O}38QBnNh{NvnHa8>&mz7IKC0 zhpk6iZH9H?c1Nw22=_!(>g(Lmw2B$k@K$ftZ5=cf(GGza=Lh7QxW&1v-_8Mn?>nwR zcY|NV3i*8{Tb7B5tR;S7)b~{W){>2^!i}75GLP_}Q=GdtSsgXDpN1wx`=d>89Vj2I zPc|3MsvBr7!nf2o6PA8z)IzNu!qbe{C*(We>t|u#$n}oyS%-FsdHnyRR}3YTafA~G zu(gmVE})aqF(o^`aY9LD@EfBvdl}=>(>#(@8G#NVqk|fj>{v3LsBmC!CQn5=5Au$< zqgm5^BGOGQ#FCE45>PGDKaRpEr1oBmtcN*7*VJ<%-VrT1xVWx_E-aov-&9AY-gMi1 zN`LSvh*@neg2Ab#630pb^y0Qtd^~|u{l99ev%z$$N)BH0X1c(bw2W0#&J?y{FF$Vn zyrh4*tc4lDD_q>jC85_+|8_EgML1Ql^!o^K3dWS|8Uh?H_!|aG(UT*v*|lVv2b*-3 zqd?P;dJTjg5j2kt0ZoIoBr|~K(BfGZH0r)UGrZ-YkhwAqnMy%sz95qV>8QX1PD5Qv zVZ5qJ4*eCt88XWL9T}u)vj`KxK;p)J%b*3nHll2WC2l17rqrBu`{Pan!dGQmI zRiZ7e#8E9aodqQa+jg0b>XL(a;mBl|2@M#Yfje7wel>0eN=r7mbJv&R{Rt`z{Vz_= zJt2f4N@~q-*}I!-^0##jxXm@Duk9renSN2G$d)OJ|Bs`~eC3!jmVV%3L#rTYFZ-Lh zu7#Pby_QQu|K*LaK?Rg*>GNX#r7pzW(Q>b7#aZTU;?5Sg)t|~I)8&mVCY5^WH)1ME z-f26vB^4z15w^*0Y<;6!#T{1qSARx7fui&E6MWqMg#M{eZ{f%7Pvrd1>Mi>FiTcUi zU!zfKJ*V$io77Vtnzd+zq+rorjhCKNF{_T06O`T z<$;0Q_U_l^9dC9cPSz9-m|pE9z4P-o>WlpC$TX3om=;E)YbUFR)KD^fQ^zL-0d%wp zNp_*xkX9oxVKzM;{~SB`aCwe^3wB1BLWRC)Ism zFC~`9zh8jY!)BS>`V{)*zei_$y2;{=b1Yb|Hbv+RE&7`2f7_9uA1f+ zQ}u_`+CAYzE3J$GZ1h=rz>5uk^yh3Fg!?factq}Uxzh!4ocp7bK`CZ0&V>g9G~0S# z_eQCiJ*KD!gb(dSqR+p4K#p+R@1WL@ciAE4WuEZX9?!)dG&Lik)?xWAwwEhbE(F}1 zxI!=oSFFT?Av~JgBg<>~1(Z#Tzq%y7(PUi6Z$rz%NBNYx1_}-zRpGgDK=+)baU=dc z@#e7ffRDekKd^rf*}sSF-vRqKTYn?I7kn?vp9AN(P}@d3y2Pea0K$PmAUtyHEaSG? zo8^(`WAHOG5*c|Kl*O9RgTS`cp78mDIY(Sia>w2AI~`WxrgnA|c%>T8AAg);Yz)6^ z?X$qsL|~fxC8ofZ_Exa4xdoK_sBv!2esLtk8yx87?5yK__kZN~26OusIyVgN!;x>W zDGPG-dCoD*M0r{_*`466x>So~6_usQxn;=5J4PsF5DC3I}V!G~;8#>qBdyx1}G|+fq0O$u82SrFML$4;C0g(I3<*@jOxW zkFqa4EgsxOj9P+|yNOq7w}D|WnVnflJuNoy*oWmPtmt#N1}fG;i+@!0xuj75#J?ma_*U<{}#Yqqsj)sHEiT|9#`tS?hKvPKjx_^dFMWU z)KfyS1bU7@dPI_t(MRA?g=h`%S61fDMvSI{tUPC zht#glO-(%J$7s|lu2?Y6vvBOO(&UdAnZ=YfW%S}BGxgXATs^l}lhFi@>{}nTz|#{c z?&IUpu2(*C%8yUGLdPjT{W#w%kMn)nalRj~{72K?o;AN?9zSvxK(#f`ew<9t9Y0fp zbN}tz$@bq{K2-98DiIoe?3z9tY0@b3(SZ60L}(p}+hbzA?l|QqALsie z$N7HMalU`$IN$&0alRjKe8=nG@yh>S{9cww`Ql+Ys~7skM}ZjqCvDCqLU|gGvOjF> zt)AYKJ&7(Kke_AbuJ)e$M6emAQ6i1H)I(@W+p3bSIm58~qfqL2jE_!jFr3yp!t3bZ znjewAAMuT-Q4Zk+&HA}eV{um_mP^B6dm08K=UMqQhoy@%o=g zcr)jA6Xzs=kEY7uqS9*7hbo3~{3BSs6I16$ ztD64ZYkM6(W!>XE5JURz_dISx9CJqb@04{Ly^l8^`PemJJ!`d%TG#7+`^J%P>H9CQ zYSbz$aCN|KGj{uL5`We4)rRElcJHSbf3m$WB|~;}6eF~wv$yAS^@qr}pPTbYJ<`vX z@T`d&=<2@Y`#x(8F&zoU2CfagA?{ogsuhv&>QtHo)T%#6mzrQUysJZtohAKKK< z@D6R~#Ov`9toZ0N{^sl*AB76KV@oTO4Xg2^56>Cw8pbl|aNQsm-SeyQ^A{i8l6v&b zfdLT1FQ=GqWTvm}v&yp2Ox*+fa{`exfrbkjsmw_&8TfpIluXgzrExmVQnZe6wit4- z&kXmNzFD2BH1PbF=cW}uG~az$b1M-OmHA(?KY7Ii5~$Tj$)UQ(T$|i zxU__pOc(70cFx-N!twZw4I;IUbdJ8Rlm#$St7et$Vozg{Wcwkhme)L-)g3;k{Q(`d zmOrZ5)di;fIqO=hh4_J$oMJHp$)j--szV=wlI963)7bW!um1s1EGz%FGtb?(?X?p- z0*ONbgnFU&D<#)4qkDH@jq`YSpv)aTQ0qq%mD*-U>bz(MbMT&dk>4Hd))E7tJa)2G zGi>{$8NC^$ijfL@%A8`R`iYW@A>C_%#O_RM%l;Sc1_{<0JQ8)lhLQtgt^7Ppd=+)O z#d)MS9}tn(?OQ2U*Vg75SQ$`qZCw zzq-L$ae!}KJL91ivnlmVI_=M-t-A$j8_tI`Lmo~(Qd*B{+32aeqz8~V=yc@W2v~B> zO&hp5ch)c8L%p+7tJ8J-t1|V6$k(~UibkUt%7A2hUzYA^bSsy;R{NAL4^&X^{=}gZ zM(A=ZxA(vNz8C5DiR!lr-d3N=w@q+=!)@*?^H@s3y&3yNsz-E>;P~@4s1+dFQ$@j3V`*&FrkWl^0Ft0MiLQ zK_V{nM~rS&$Xl344<(j@5{mj5zY=NXOb;c@=^o2!2&eC zh=QfYe~ZTxmU4+6=Ws;He1c0x_f$;*QBup?ut zkZr}hClI~!<1{u9%`Ob2ic&vDP{$kxxrzkSgwrU8+S@MC5SZpU(zdXE!`u_iA-Ca3 zr=>(Jld71Q45%fGZ=Y7Q^GKF%@b+$RXcmy;XD7#Q-B)SX^WhT-*eNJjvTGM~XuyB} z#DNF3PH`EG%+`6tKb_3Js{XGe2Aqzw&8=FQ$(eh4cljrqxAwl&`)9xJuMfQA~h zBWTbQ%!(ffxd@bFYSzp(b=Kq-j9O>P*VGWj{q}HE>K-svVBi{87-eg8`Jx)I+V$I* zK;iZ~(HpbelpGl^f1`jk++e;RE9Do(iw#!shZzsP^YfqamQC+@D?}$;k5UwW$ohAA z=jVM1Q4`F^{5rxL#&cqE;p$gq6}OZIjKO18xP z=CIkC$@QnMXYdlJVFqtDMG4csqR{u2%fr1Z$PRi+%C{ z#9<@;P$B(4D{(kC6Q=U->B>L|9v}!05Io%59jID9V2Az8da2Aka5jI;bICJ%%7f!p zY*_LSJ#&M>6+2CD+t{AD{u8TL?2PZdj!%aVmj_R}uH1i84$0Kz4<3G^JK`1k#uL+O z+a3|$LWH&;Xwg$1K5_br4e`A_HQ^xam9&zR<>BCAwr7@-Ooc<}%;eHA z423Cw2*r`)6%R$)u=ra)n{`7}n3cbg5%c=lmL8V>3RSZ8v(frWO@f&ARaiVU<=;oA zBH8}^yf&!r?F+qvGi<@z7kUN1H<#72PzAG8aE$O*K;mnuS?z5w>DaiUfu+u>iK3RoEA(JnI3QvAS{f?4OqMbhI2^h0Pk8&p#!>hlYS@@Qou`JC~N2P z2WuGhcvMmr`dKqN%#3$QH0=-8q?a?iX!*}k`zKfPkz6OcB%1c0&$a7Zl&K${_Q8U> z7V1cC<;a<=`FUx5lg>1obO04yqU%sQl! zbl_bA&K3?g%E=;~XLoUWa`sG}_(%H~EqHaG07`ib&B)|>J%DZ#zllUF>Z zTX*Rt9btVdLj$#80@4rReTOt{_rCESD~z+oTDbZ0*l8Xw{EyVLS?yYe=M(9p7VpOm-64in)O-g02v5Z*Ek zo@TDIi_BBKfAB-H;Z0Z0P5QeBvieUojVo(lI8X2x&Yt?zcf-QQKcy@vN;ZbLMaIc*_>ECpArEwK6FC zJEyCMuNijpJX<}Gg3qkv!j`zK3>5>>$}o}70DFdUJQnPh-LznbQsa@pV>vx=AE&5g zK`po`TAMrRfl^Sg?Ys;(TJn6yxyjntjqW5dqTloA1bgbH_TBP%?#DW{*zG9wo^i<` zE&!8u7|=8efLfqf(Jn0k`J#AOcPHrLVRchk&K#X+DywCWx>KXKd$-ktx2(0Z`Zttv z9(gKxYnth_?3p}9hOx3no72)Z|4q&#>_cz>-+x%7W!nL0WXx>L?{yp3qu?6Lz4k;h z=kDDuuYlH1YJ9>VhMYJU48h~BP<2EuH#N+(*9bKpu&7b9vIf09uw#<2V^*pii6E#E zq$@Zy=}TQ99Z-=4SZb3LQ!`AVo;6m*yw4G20LXt@Xzb=j2&Ke2KYXl(#Yw=zM((<@ zoDf3;wdEO(CGlv`vaX&UjY(J-YSR&?-)w#i1ZzLG7#f^R&O zIc#p$oFmvPd0wy14F$YnV&lKnYF+?X=aJIMIs;bhdKLImGPG>m-j}xxn7+MF1K+&< z(c7d2ljr5>RUWO%C1aS_F9DgvA*Z7(Id4yIzkjOPw)chJKl**Idw{Mi5)fC;9k@=+ zDJHx?I(?`#u9E6gAvo@f+Md?Y(aKC~(`l~vR*bpJPIj%r035w$ z{#`l)*IN!+hMf7it9^n01AYX;kSSq>&zp?z}n45%+U{$yT4WT~P6zG)I`8gBx(2)-ucu;-T zF~&T#ZJ)e-l;09nJS-S8s(DmYdWUdS*cFPp-bT)@mZgke4KFgbiaz1Kn zP^V~4Bm>dKA*b`^#QyA#;B|kgg&shz+)6~~7ptq%=K1?m2qr_?y)pdZ`1S4PWm!e z1E!NT$w|}G`DRme$G9{7_QHVp#$vp%^s|TxW1G5HFtJJkva)n;>9wbOsd;&xS9N|E z&g2K3)i*Fn4N2?OqzT+BXn_e}>ri-LS)f~80j$ZUo7v%hpXKkr9~FQ9{b<|gx*kuq z-#)v|&)FkV&`2v5xaM-5^?1pC@HUtAue1~5CrvWyT-zmPQMiA!Srl>G ziU4g4?ylT3U(zYSmsYw*7Y@u+FvaUnjorUcJZtEJujxXxuI;)8zz=9vkPWxEtVS95;y&_Ayq7 zlCcEJrC}-b9moE*ws>UY+tQCTzSX^ELz9)z$^^E>y)#8~?wxP&x8uv0-hM2@Ta_7R zcxw|@s*;T1t)3ZO+G_xYw`y5Uc620{#vsY^MIc86Dr)UQ-PTw7#sqjvEs^_?HLAg_ z!b^+wNZ{GR&efL|O3K()C1q^;L8?N@Gs!1oTaM}~imlOSNVd)kO5Ll1>7HEgRSbB& z8c!fk>pXYm9*UsGWn(Wbf1~^aT_9N}8l9fzFMbeED6`@1*8B(0lfEflHAqa(Z$`e@ z27_0MTL5cc-*G;U=QypyHl1se`|K4e$ez^^Hd~he0R+Rd>S)QF+GBMbTWzCuPH-v> zf9tuXCht+OEVt+;8@Ittae=vdovmW_rX-i5fgB&4pG%vb3&&K+IVo z7fD?^+jA2K%a)y4@39s%#V>%Y%uLRW z)jj-ah9PJSQ3x+3NQMMUC@{Rrrn3A|q5CFEoMm$(r^=)E!wQf!btEfZ45-xxB58?# zB^^1mEH@e6kSx8)oL;icwHsJRt|tpZN508mlT-e+o%lv~C&&gsG_ijk+5;#K;I=Yt zsb7`b>aMmNr`=uMm0~PembFl|Vc73Q_42Tv@gl0)4yHqVZJCLg?B zOtN0t-1YXd1se%x_1$#YV_k$LO<-$?!-ve}qsg#BglEZQUIzak&tBfFRNcN!tZ2qH zg1!7|eHZ<4Z&_{64>m#e^7=5;UVfM?GHowEm$ic~$ZzOZ*W;~o@YZQZ>)gd*jFsO$ zYMp*uD`-QsmeFgnUIM_OL@LW!@i2v}w^=<~k2!MXQ3V~rZrQrn zQYc)raxUM{{|)q21*s%!*AMt(R@=goU8dvaQuyR_j{c6+k2y-GuC=Xb{;2XSW1TZt zYy3-Wjg)Lm_W&)Ng*FX`CF-eHJ%Mde!(n4p?6%uw#YFcn~K8F;VAJ|KEqaYgi8)_f(Sd;f1QLIO+t7FO~RpmVskE> z*4$sSv~J!&YBSy!{Zc^qPi3)=F91(3d$zcSLTB}9qza-CK0iZ%gyj4&;rSAJIs%mH|=nPiSKhjcGO$jx^s)o3_V zT<_&(P3~lTUfa~gOU#3|MH>Ll-UXK&?kH+?7e(h!d>j`FLZEe=?c~IzNN5QF#M!`l zagEJKd#A21(@TDBZWamx{^>!$KOMXG>JO{tW*zInf}n2cwL_=tpSZzdVxd)bDK%Xd z>w!_wbg7@Z8E@(MeDYy6gn|Wj{6DbBFE5`v457vdS|$#ze0g;y*4Vv;UfHydPo2#} zh|x=y%CmKzlaz~XPUj^*5Wd5>#t1hhuz3w~y~Sh;b#k56-&gvUWS3fJ@(Spfpb;@+ z&DBL_TCv%T@i(WJIi~TJLh#;fPnP~lvuwurHg&zZb7l?J>gT*0`%4lp4ivL*O-Sbp4bV= z;7Q@gcv7enEDdlF;%q!S?CD)7RXB3%$H5U>#jU~-;>8Wc5q(I!k!yW27ntkSNpqKw z#6pS__OgCtzh|(HrJJ(#V@swPD2YGg%}THX6A-F^w0vvZNUQ~7U1oO9-eR#@dU=wt<(cm;Uq z=HRjPULjY!L1%^d*hxSC5g(luC+YdhMd%hyjUg{ehRbxa_9RA?i_As%fLLS_f5A`td6tdG14!^+l8~@LHo2chez>2mnN2mc>J;Vn9HLy)kr;= zM+xb8^z*oaN0U&eOgPW?80XG5uBMon@t!7(A5x3w_y8&O{&@N=sJB4oEu^<#`mGFg zPj_-C{RWujdb&4KmDt$0{IM)Xjphld&Z=T>*$J7&oJwEIJ}iI3PcAr;dpXt8E6?rc zYN0WsU*K_|)$WSeb)=M764cV!kao0G9qxJ@Q~5Q@U9v_<-*%3<{T9`;{tn*E8X-T} zv=i3D_Y{69C%`5OkQNR@%60swl`rAlP?OMC9&6+$i-}}6zHAgV5mhER*=}s>;Ijwv zd&x7`=2;QDkzZ3`7s)8)eaO2Ouqab(FNX9O32!pQkhZqk1yWf!Sz|M^yLZTX{u zfmR|B3>8@B1ysGr**4lMVK%7%Sy0oxJZs6PS$w|UTIa5}>cnamnbF-?n6*bQN0q6d@9IaC4{%UD*wDT@H zyOj5nT`!m-Nq%n;^WhSo2ZgSkrlwH%+DNG@xX*~vguBX%D---SIg1!dje6#+-oeHy zo+HjQD_GpB*ma~MJ@&7mCz1GQ?yjUJRI}y-*6bpQVEN6RS@JxI_>>9I=#^?zYdfp$pXiFT4;7SkY5vB)dBc{1Aj~$?xG9c*Lk-_+8&;6Z zsQHhW7Fg1MGLeJe@bWi;UND}6qyHNWUCntzm#5>))Pw(RdoZ8Wviwc?<*{;KpKTMY zxg;6Bj-Z~e4F$RERz?K5J{$vbfm;oLB8(cs9VT!VbtD z@YsImm27NvZPJ+==Cl1Gk4uwGo!NB#FD8f^E*QQ~o2hmDoRezh-i?RTP*N^vYs{M8 zmr$MhPf8o4&cEiER9QsC*~M^E7x#|F+ZiHv;YgitR~vo4AAa3xc3tr;PR3tb;e2yvMiA{NXC zked5>!)KEkwE<}&Znj#6%`LO_;4u_?YAIHQ+ke(NKiN<{uWzdVi;L75I}*jG(H=rP z_$+oIRaECsc3-DXT@*{+sNEQ~D^m1uQ2{AP2i%52QuJ_95h;*lx1rdbnoFX{^NqSy zbuTJ)8_Gsqr^l(~^WCq7)bxd3)As=mwY&U{7_Ca3ROTM&Wi_`vd;x7E*goi4loXSW zVaP%(O5~u-T9nwd6|qtkk>{d&f4ENljbl`Dl3DS?EqW1s+k=NJS(Ri8(@Z&K5Za;% zG}FKEMqXr9GM>n_zCo)J_wH3x;MtZStfyA2OD6tR)+GfWW?iD5A7x!qAnTHXLF$`xRWr%^vr!g=oWDZ6)FtHFBZeUV?a%n-@z+~d%;^1v?!=7+t#WOeo`Hxkq zjnPG%wa=LS`G;_gd&{Z<&2sz7YB#*HUuXG9pa0u1E(1is33Y5xZgc{L6Up`BU-~M` z2L>D*K2Ln+0crlT;B)PD3&=g}@(fh~1i6XjDT$v>HO<>qojlTVs{#Lq) zRDmwKwr9#j)V$n|N@F%?o+sWLwZKH?sAZi6meN!ZQmxx*Lj66UDhOGQw zZ+it!C#q*=3)z6B{!w=s-i_K&$*c&tGY0K#h$@7%K}0oDvdKy(;hLh$KG9I8a`h}>Y@V>Vv+Y&w3p37rucSzk#$z3yGXq=y z3?3~D6O0%CkxOiC@d~e&Y6`!;?U2eOUd=x7J#)ov{;4JJb^b;sTrB|vupOT?ogp*k za@`Cr;j28E^#FZ&b+`&mgs70*ijj=fw5rgPLUSSl6c z(7kMob>P&0Ub1?hIk0VD`D+%lS3RhO4sR56);@HO)_#6(|0f?9OJaQkRl+&frM@TW zJ#IanRljE6QEjRi_P)NPZ`oNbWP^{XPklMv@{fmP%I`BzS?a#+ztXr8eE4ac7hQDj zizPc?b;Dd}mOdQ%R!f%eV1JG|2-2aSkw=G4Va!o8HoJXQUb1FYo*8?oJI-8GhgQgn zQGmyueic|?$k2D7TBf1L)Pds<{ox@)KY#epn=(WHp*SNu^rvVvGjtSj_xlsCIq^$; zZw&*19O9@4|2ib|M}pw!;Ro-t>WiEu1)NLW(u?{}Ozd}@uBVw1-&>W5!)4B@QQ+dP zM@X=cJqifFgD11|uP*#;fbcy=m7aeZJq8GW@7pm92(!{Xu(v~LWXbRAAHz5hhws3? zlQC3kcesMdhFUSxk@cV++q3T_aJ_hH0k#5^FR=f+wb64x8Ro#$iDrXbRCjD>2{GGx*F-2 zpRAG&Rw#LA9ZA}6D-c}DULx6eL*6U}B22Y&Lz683VR2o9)by{E`WLI5-bXwmx-=t+ z%W74dNGs__+V92VpY_*W@f>;du~(7a~s0aS6@dz3cjAv(+{z*6?g zqbYlXD0}5F%FeBjb@^>6dk3r#Dkcd_*(>uh96|b80RrzCJEkXF1m4Q$t4)_C4pTEh zOI&J~YOqmq16X}ck%qwO=Ec;!G_jXjlqL2G!#4$j-`wJK2?tP#1}%$>ga|S8N2x5& zd^u>Qgp${UAAn(z9ab^!{_fMI67sC~$%rCZ32#YjWd`Z4%TV;-YQBo8sxxB+ce5%f zwBgWd;yneH!ZkqL3umSFf+bqqpV4RTU{nJe%rN4S1XS!mT^2cF=9rriw9}no+WO*;&fQLaI+KOSf!K@##$Yo6VDHK?lVBAga~D z`|2R&)6adrWGj@d=)N08*x!b*zb(`{_D6nm6PqQwtRsRY zZ((z*;D!X4HLWcb?V+b6>ld`Yj@p_|&Ux+(zXxh)K@!cSFB9x81k9)8wa%}e=T6D< z_IGazJtob2#wbb*Q=v&{VH+c)U?9mOJ zXaXmmP(96I1g-RU$>{03?pMOp2*ePh^nOo8Dj@bb2UgD9|VBoxryK-soGXVjuO zJ6!4(P46Fz<#pTNXCv}sUdzZ6_JsdsgyUw~`=__gli9Ebbi4DLC${|=+2vp2pDNk3 zY(j$_RbgG~`FCvho*wMpCiA@6vh6_axm;Y$&`tv8=@?Tg#4;D@G3HL-Z=MUU))7P{ z0L5J9yA=$o%=3&d(+wxyhzM<%Jt2%mu5GVmaAgSk9Kn}UEj!@hOGNl$F#@l0%rruK zjGcw%(!<5|uA;ibdv*jnX5dD9zk~^e#{UyAq+r?E+!JaBa_dv?;&g-=Xkv)kICIHX zFpX7o;Qfu+@xY}T*QH}QB&lX@SK99*Lm2yB&e=M%H24`D1NFv-9`fK2)xiv$^}PIz zQmRlm(T8H%fw-8`-y19my(>*ZBWW;*8q(8J4jJ2C;i1f2@2w@sYK2EuUrvp-j6oX# za5&bfa)G2mWYy_v5YNVTt-BtNssf%>u|{$Mo;)+2Ad;qn%L_9vNGJ&aSZ!|5Dxxua z+X)Zt35VH4ovwPmu)dX|O_4qsB@Sn6sx$o@o9<`skh*H|qd~uz`N&VQk*{A7 zE8A7X5P2xym9MeFEv`^d)bzoh!v(Pb15SMKZeVx-HWJfkkqkxch!Kpm8p z1el`?dAy(k;CJT*U62I1Tt(h|?)5A3(xxCs@J{=YXh7Ovh}0;Zi(J< zT;K>_tWY;Sr$hSwnWOrCHhpg&WBc8I^578q$5@_fDHeN{%S#*Tgq+n^i`&?ZH-kaj zC8%P-WJ;FW7@5pMDOh%-z^8Q{J2EZ14rprx{ZV#2#Wb#{retn)*M>{`{Ph^2?4EBu zatw~##-P@L7j0uLAakeIvbkNW8+V3i-EW*|qmxFw?JSPrME|KJPjn&|EJJCHY`C-$ zMaYhOZ)S~nBJ@H-$!`u!S}y{T`C?xZ11Dj9u>ra$&0Vo|C}Oy?qu7R`eH=qC-0EJX zRcg>%&|PVArBF_*TZ;CYSJdnmqL1~XH1?SnQH}MzP}18rVbY1qPPKI}=G)~1DB|MK zHYzF0dX2EeGVq;cT(|ol)K#_f{oZNk_7aChJw2x6Qd@G3rE@C<6*p{EWH$oiT-%Z1 z;c;?BznxVr-ianM@$pHkRWZ3kZKsv=TI+W{KPp-Gi4vNMl+Ze)T*^0SBJyB82;Kb1*RC1Pv^FO9|&7HiHrk6h?m?M2${lKH*9{v zA^d*JON{WrS)+icPBI)W^_ z;qTJrsl*;c%YX{of6A5x95_kD%yM33x=0f)i;wY#DPJAXkjJCb1dY~z%Cxcyr zoY`ug$p1B1CHwK}w)bh)10bZ->O}eW_?`yW&?g{fBOkRc7_(40=5z&FAM@u(hb0Ca z!=_tsY%)I)AY05j0n(HqY@_XnvsyQI4dzRwXelKg3+6x340z?sMAIxGc7)pqp6t;Y z*i~fRwwL3_1T&Ei*CtzX7-=%PCLIgYyl$S$f3`|UP`W<5dkae+;yT{(Sxjn4&G;`=Au{dHn%7_ z<}Lhnk4skKyj~}uaG5*VUS~rO{Xa>DzsMXDmgsH*eOTgVw3!yKj|ic>oL`L_S4 z6^GP`M?;&^rfB!uURveE3Fi8{=~J>cP>&v~1mWdIlrjED>TbLDgT<2C`1{q+VmHx%6x?3$F`PdYT@ly7kiDO+MpJl63^He#<}x(s))cEt8ie1Rf(E4X z?H?;Yy`7ZDMG4PYPU3$l=?05u%{9jAVofV~y05ZGpIyRvjlm|mh`p2&76u=?xoa+D z0BKtnTZ@9n5Es`xqShup=2n&^tFj4>o(7cbb35?JR1RO40T+Fhe|}k_YJRMh4r;dc zUP&Sp+-}>T#LKtvb<)y6Jh!jX-}s%ztkgmd8H8JQF?;PGCTF3GKBTgyAIbLTHC&sL zGUTq*Qs$72`yz#)+tp^DFY(>Rqobs+R(tjeBYs}OlGB`JX@8sN+is;M!_^xbPd2e3 z2lNj0qcd(%U5w6PY{K10ZpvCPlS*s~2;m)T0|ml+G`bn}GNlmpsA>k9_fO>ey!Iie@dQ=@uYSAIJ+r|nF@-M(Y zBx+%;G3PV9_x=8) zMK(P}`uoGum)i6=C=0cV%*=P1+g zZxQGI%MR<)ACLJoJIA^IJbn7pv7h`D%h9(#ANy@I-~9TPI`$j7V3&>NTj=#;zn#Fh zfWEzP?6+WIbBHJriQdri!p0Lpmc?K~t=ybe1DpdCsbpNbj|P6OV@BCkIU$E^kcplQA!nG%OxwNLti= zS$EymnAK6yl<2LK8@OHl-^2~>g|0wpJd5gMtV4S<$Carz zznD#|!yE<65bZsUKjmTp$zlYIMcf?E)>td=D)0J`4w_M~zgDRkQ&+*r!sOj+EmpX*LuplQwoeEgyPK6P%% z^~%!TV5(x~21~S&dTDYyCM6f6p42>BljPi`(|pAEf7&daCD^2T_=V;?5{VtjmeAV> zn~Jp{@9j_YO`QuyVvu87ZU*)gwV`<(XCbTK%PrD=ss zQ+Ln}!13s%PaToE0!JA>M3Gz3Md4f+&xW)KKKf0)-?tI5@!ECXjrVohTUac)CZQ2X z4#=`WGVmkPDIa5)dCj)1qMy)xoFy(YCnUp#C2xy^Ts%2BwkI23C(71Q*t5Oopn1w{ zC8iJ#+m5(e&1HQ^o*q#IqMxx=rInrM+gtMXHBulWzHxTP8Pr@itv*?iZCSlKLX5q> z1|q;`aH+uSACUL$0`??0t1e}+Az-klL=OaHCSq2x=eGiG{6ahWCUe=M=KPoKD94y^ zNwO%fWb@*adQO;vi&FkC*?f&?NN(DQAh&G?q@pzqRaM!5v88o|VciXO%x5HFNlv3J zDn^blo;>`&q?u%CUP<3#dAB}Nd*3zhG@&QjoIR_dxgm9$#v~3Oj>B{d=9XmTl)R1* zn6m2szWHne_~^AKziDezg_%SkZY6=5Vg(-ni=~{+XrS@(0TKH=c+F_o%@{5{Z8ir zXTfHtbCdJzsHeHbaTdQ7a5@h;J3k$1=k0^vI*XqPI18S17Ch%1+Tt8KDWK#-PdkTB z4e9CXtvSxs&*V6Z-wrq*Y;`(MKT>VyL1*FSq1CFUt2%7;i{C4DK6uty_@uM&| zNc4pgn*)hm0bB<-s~=*?9BGOX4DJ4l&f;gO|Nqmz-+)5bz~8*@vN4`@q}F30zw`6C zc1EB7tDx?DLr7*ZOqR$c&pE4p%Atp|rg>G)Ds{rwju$c4S(-+i6xK*U=L2W;dEg~0 zHfkp4H4pdE+BWfUl9^XWfv}BUUkDACIA&_H&VO+q1Y9%aN8)e z=mYGx7HRoKOpw@A%TOa4?W~=jJtbM%>D%Y5t;nvdNcziso08ForTfDzSNDX9hn1EnwOiP9CYb z@YEPd@#3t?CON||$x|t7yAY60$ums>%zxa94<>!jF7SCzyYqhM&fD(J`@K73pR@WV z?w?IXu$gITaVsPftFUXl?gO{!6;rp*WVsc4jO1On`Q4^JnWhh>x)mwOz-GM5(;Ei5 zK*qK|nPn+c@rH9%j&s#%PUoXe=d;d&QCUKk&R*z2h_&^KNW-%ySqib>RPWn1XYo6H zJ2j4BlCu7$M*-Pv)|E>uKEfPc+FY77uxgG zVErD@G^DGp1m+({S$ z{Ud1g;a%PN$y`g=elr5dcYfOY_Tt9}_r`!0M%x~<>|HGnEeuu#OJXFnzp8Kqga_L} z^)x0OgUVO^6?lBA#baAv=T_%KkyE`m20pe_rpSk3Um7KBpFSD`U(bvvjaQvd9fej` zEed^DFFpbm9~YCHtNup@nffg<4IADu%k^VH;yZWDEOR&^jB zYn|_WV~)2miW?4DN7{*Hc{n;{(^)dhJ8F2GZS;NrFUPcvAw)p?dx(3|y0b8E(lINs zXPo(MXtW`B8Wl%@dNjJuI@h+C-=+>ICW?)OZj;Qj=Bd=@2Gjm8HvMdB4sPFuG~Lva z+K*uwAC-4BX6=&7sl*#4``SV! zzqaX^g|H89GhUESnb>XvQY{~O& z`RPJu*h1E#mdvkFu&*pYt6BZCc>g|y`={x4K)13?cN^}Ugwxp}WEw*C5m_7ra;@!@;fb;Cpc3Vc0ejyk&a8fsS*{_t;h4Fpng{In;L?H^^lJr|&g3Q6 zRO3ogx+t>YviG-6_w#@oU>BOn9AGDyXZu=1_g{WI_71N|6KZo-KF#*C%wxluz9(+t4rUY`qxk5U z=Lla$o`J+``*f9-%g|-0Cas@5r(0`Ggt4sm)tqFov#dD{#&T9j8HfAer=&7Ps8N5O z34e-3AgzdMQz%s2fO{~q3;H#{Lb^!ROHSi^X>;AI`j%AAP0WLAR>|XwvyMRpCvm-I z=ZaWO{;!k%)A?MQ|E!>#|K^aYO6|Nz%cKUd<~VDE**r&0_-6v^R=^6}V%?{am}|nn z@`ZoSdtUE>kp0%(tlS0qu(c<6Mt5zFCONU$S0-(cQot(Dh;$gxmOEXNxXz#Fd_!S; z^8ju=BM3B^g&3cjlk(z6Ox)qH6!YDpQ073#Wh(r$Ysc)0xf0|HW`WSni`Lb|)I zgI;RQNzIHers#AN9M4k?m#zh$B2$@hkQq@5Z|xZUZ4~}B#)_Sl|16w(jxLquKTYL( zNY(0;QF9U5%RJjIL4~oiNWrKAsV(K^M}<-OFZJAPbD~2*sjsLf93mjB##=U>PL#D>&vP-Lt#i6^b+$w% zo_MstF5%pdN3SDC(d+0CdabQp+qnev8TuYODu3RP`~@TAFFY!L(UAPb>HIAbZY}ZM zq|3#YT#HmyF#*}MAqB9K7BekH=Bh%|SxiEn8Cbr517KR_n5~yR z^DVjtL*PfX_q(>8SRoB0q z92vQ;b?LeyBh)pS7;O-HPGWEkasEbq${wvAV49tGdCe z-0~zI!uk*gveXOg%Svc=Pk& z{r>$|Y`TCy=sOcGu2pR?!Wk8rc=YK83~!aUa7vId2R?cQ`v-EM%dr|_UY*n9#z@8^h6KA z<|CC2qBHeabnf5%dIp_`*E142AE^g?UNQ`ysn6nb|M)Lt@cF3vM!@GG^$GSv5n4bK zLib->kU{9-^^JtkN7XkJqp8ngbpO?VpTX$i^&N}RL>ROfZEGDFqmMLbXK4_nY0aW^ z{~MDtC_TKjqft6t(G8%_W$zDSbpGakOL#n-9<_1WN8mJFEf`#C$*XhHcs+=bLy0uq z^AP*u+>eRa{(C+Gum7;-uf=Ps`w+Cg>Y2Y5t*Pr+tlt09UyIcm;fEsizbQUno%1)v=Zh=;rucl*lm8F#`P-lSo8j|}52{DTKJZzBfguc&8!pBi!e`Il8d;+J26>ViQ?Z)TVy$NTzl%sj7uu+#!Q{q^rb8~CGv|>|M%2Odcd@*OPpwr!|lUyT)lGAnD*Vtgb%<=eggfJK8@6X?n zzpFCoU(P8@=f4G=dKs1RsMVmd;8H)kM{6b$-q%CD z{gLi@nut>8uJAAUEhCY~MDOd7?k33?%1!tlo11}DdmmTQ%^L5qo5zJVZ%*PdUzJn` z7CK%3z%h^ybsP%kI$h66h&OKz2GQmAP&k{@@7#=BCqh>XjGahkP!n11O=OKXkwxA_ zGJ~4PIwq1ICRs&Dq^`k)?nGKF;@;n8zv{48OW_jF8 z_+2aT?HjYq-<0)@bEIR7LSdpKmK~4vpT@5*9_=5;uRl(l45hPUTk-S>tQrXs3QR8w zs&DXC9dAKJAbw^^ZJyKhCJ9KN-P)ynRsP%VL7*NMdQ|3d7t&XW!$i#UPcfVM_=8`f z8ohWITAXi_NSBe19OIC5*>9>tdx6$8Dt3(@7vFcum-TD{IbiPU($o!QU-bCWl zDZslqb*;W#M31bO4#euUOXH`|yZAT{E@x6X9+=LXR2!q@1lsGsjkYd30LLhCR?`T+ z%MX3n&^WE_T{Qi;i3s9*x*Z6i{*Cry^U_wgxm}MVNa(ka?N|wY=qQOyc!)$Ml9AAd zar?|-4dMQT2sZz3CG;$EKQWtx1=HevWidg(tuD}T(X_MUWc3j{=N_9!fn8hT=L2XK zMWJBi-qkzf*x4o$-YWkUH^R4ULVl~9BO4bC{e1UkA{m-Dcp}r zAtC#+c`Yyn%eCh$AT{>`o^c`(zge#UvHX^;ypc!YzOfGZB zw7TQwQ}BqUe3u_$Uj9VbvIG8 z##h93#Q7vfJsOwid$A{aVt1tXFq(3o(c|oF-|Icm^PII;Wp~fcA!lBd&4X~*_a2|Z z=MiW%I*$5^y6Z%(3MoRif+})|XcanL^49Y{n@M*3i_Y3poVA}}V+K|sQ~DiUZ|Ei{ zY)bFymi>3cS9&wIM5Ko&Nx9Aw?)#qW364iD?M*`1YINc?V23dRq_kSERRp7$xi-vC zAzq2hv?!NdHq4!wvxr&GGvkuMt$Z!ecI6iyARXnMZro&Q1E%068Y?v?2*legOmP?B zto$MkFbr;S&H;d>&f2D|stSrpzd9zcn*vRIo+4!1(VyIF3pfj>8bBPPk0Q^(e7qVex!STHrFYdcPz3VXM3W~qW3pt#}_$k zPj}YBG-;Lq75g$kEcGDw9bY?Jv=*{u#~66N?Ux54pq7lD?}13jn8#I^xCv+NSet8y z`mx{l>z;6+`|O@*F@2yn9;ztrtX0;kNncdpr;OW%ee15vx(>ywd)Q-#= z=$1S0H)eJSM*jv@EFJ!ZzcX4xC2 zX`geYPpY2_HlP%AuXFJR>3X3#xvS5)a;$Upo*ZYvXf|eHD}kG&Z{RC>gDQpbDXQ+-EYnIIn)PSWlgY zodpBV?oTh!%Wm|4_B*eBy3Bsr=v;i*+1d0E%2OfKOhe9sWsf?$Uv)bF%h@^aA!qkK ztH6X#SwHGDZI3!vMx5PmJ6}EQbiU*)*y(hB(dm5AxtQm9kD~Aya&~WbI{)HyZgIZC zAj!XYt5@J9DWENWI@jqu!?}11StEkP;%9P6q|q6VIv2n0?Ea0j;Omd3;j{aVGUYR-mW9y5!_KQ`S@7%v;JY_DSMSYn zcKy$Loh#@2EyQ+z-hzekbZ)eepalUU4MoP5hT^NAw;!IeKXCI17N%erLg3&h7(( zt2ER)cTf=37CYjLpTGwmAVL=p5OqE#!~sgc3}>Ov#VO~jZ{3*K7!laG>T`fu=Qn8L z5a&jx^PBqyW~7`h7hO?QNGs4jd{?MQB%ihq(sri4t-c+};A6sd7TH^@u?PKWp1}0qo8V2t z{TbU$aJi3=_AR-XQ1uLm`^Y>81sqUXZP-d^5y7paM9??@R$+KjwMbE4a@_m1`}U1~un(o6+5jF} z+WsDL2M5>ESLuJ2RJ_Da-`a>nK)*}$mA=%;(tfhsZy!1C*kW_+;K!}aO}%Gj7ZB`p z+xOS0#mYd*^?N`*C-H6mdNRK=|d#XkclegX_#pXbs_Tfc2!ve}CLsZJjn%r&>CEobpCbi%+4<))@V z`%nS)rn^bNHSKcs6D1a;gsibqbE&B<$A3O{$At|o$!nuYwyc&t zILxi}%S%41)!J`jA%y*A=@I+Q7h31cQw=CGd+K0iW_5s(7#pb0+$qSJrtmaLCkjnP zsAQu&^UE!g)DlANlSC$L5H2rFQPnyD2z}{gDE^-UgN}3dXXd$+!??S5{||fb0^eqJ z<%>%C^s-+2)B9mPEyu$v64=jkolCbh?Sf^aois#SY|7YYaU-uIaT1h%X zNuJ$9+7mx#QU!41g^t+7G`l#R_RcaZ^OXkZiUo%r<{a3o+~< zuu9J(;VjuTH#+#FlNfrC3meiupp@@Re?#heFniHOo~F=W3dkLUV>&F^9PGQ-%EgJh zI!r`sY0iXq*UbTdj=Vwdt-+YmT0BWBb%^6GJiz_Gp{@)kVb{z&EpfM};OmX#@8!l$ zB%SLZiJ2-cB%D~}O_z!vAtT%hkyLWcOcKWAx-XW0NrD1thm{LhQ(8=mFgSBr4rQI| zHnmgUuDS3O1H}V)a^Z#4Jh?naBHh8C3$Zfo2T3Y_NgV)PaL+OB$puB7 z@63hk4;9Cqxok&+$T3k25)kIK0-^JrxqOojiT-Mwg|fG#-e##tjgy%eV}D6XCxjT> z%yr{I!XyjHPtXY2xxEPgU<(1A{%6DsNg`I%I{h(p`gL|Jxi9GMKdUkP`kABB&xlpu za!L1?ZY%wn1Bs_{TDk|8fi8$8bt4*nV8cVYpNfJdhgq;sL3LltjVUEDXwbt@C>ihp z0}op0?LTPKUS81N4WiQlcNltOwDqGSUpQ1*fz39=2j)z>=XOCzq^D=VtRi?h z)&C0FgCoBZCuIXX@V~MK6`FlCha(R9D?YVPQ#Y6I{lt>meUk(2G`w1a?$$t z_->a5Xk370$+Ck~R24K&_%u%_@L}>jt&^pW|mH3BaXKs5^7#2R3u4#jBs+*7_ zkE1nGJcK-B_;EzQtI;6rao>f%?cNWbG6IJk=$hgY_hQu(FL01!j@?`t|kF z07=Hx(rGvV9^f*jfi@Wi70g}NbB{^sXG);Le6e?4@rbIoa5Y}kPI>GrKl7d6-e)=| z7Aq9fkZh}A#zld@od7}~dTM#dx#ESIl?T3v7Pk!;E#u^00g=8W^aV-4VB&I(xj3rE=rZdUu$Be0^g0+>Xa$}N zN-JUR9==i##v)d_y`$ZnY>u0}Mse&O07-m<|=c}-Buu=t+6i6c* zo50^!&0W9iCLPIFFMIR}XrOX)7U%q}sD~F-shC=kr(ZR|JO#>-v~7ag6FFYMAjPTi6a*f)0DOkPa!b()-fZ(0q(Td28ygc1?mzti z<>t*EUc`B=p`uuQi3|DuW5B%PyY#d4>X7BNUhIm^AVWcqz6VQ7`EjtG z`B!u^1#G-rb80Cr)l$M9V)K-L{UaNY0Db5L;ER-3Oobsl0e<(7gWrT zFB#B$M1AHoBZ_YqC(!)&P;wIO&UdA2h%o0+?$~)P{VXUs1%=V;*{03dfxv1=hJ0(% zx`_PwgkgpOE4OLegqIs5B|DeC^s%KgKUiaCgFD&a z2R}MFdU9yQH*FjKI)t4|;atkd2Dix&*h1X4v~e}7@pyiwp% zQc^jynCd@Jke$l8f)GSO>VJPhC1~k`Tu{cq-V)ZLil^F%d~EX|h9^Kg{qIq)DL$pA z*ASxgF`zj6r*#`0!S_E&BM~mY`i~}QCfOLv&`)hh@?#Ln~~0;d0OCb9l$uThsJ=X|6OX1u!Bakb`0#|Ft(rUvAi5VH5PY47m01ZXzZ+u z#&%vb7B5?-lv_igi#^t^%o1v#FD8N?s)Zdj&`sy0AIEv&MPqNdXzY@U#(wRb*ji=F z*kdb|GA-Jt5(Byu7b3m#e5CagNcWzTejMr57mZzWk=U&PR8RZx*4P8*1ICM@`TCq3q_v7g@-aiT3hKR?%aJv7l@6aiWvTokbFQh+Bf1$g>WfalH!)Y`I_$Di9D95vXB z95&vMNkoMmCx)k8eO985v0vtUbP(%0_k3Y9Do(aZ$bbhXJluum> zaOP3~TDf18W9mx*^iu)6yVr0wO$88*Yw>hOe!h_TC)z^VLAVW(msvDgkGI9c0b>8# z8-P1a%;Nz6rE-KXm4i<5E?Ni8KDb-DunwA!&dE`03(ZUHu`cCg4lHP=cLC}^kDU%E z78lcT;*pv5PPu+~*2B|>u0J)TS%yo~>X#Rfj3K6N==w8qOjglO%iP&#stJH_v=SRu zTZSy>0!OO`0%G|*tZo^)UVRQ!SAFM}k+Jb|RG4}F!|MFd_4-AN%%U@KqZj%9Y~etqC3#h-tH^wO{m+BI8! zexRrvPf`?qfp+@F|*@0zAs9wkCeV0QSnNf#$a$r|3cixa%u zB!?kb0h**=(2Ws}Z1~Pf&2vgWpzbNn4(~gBTj{EN%?# zjYE!^Pt#jU&jRV!R2VD1g1@k$M@QArBAH=l#hr*j;tbD{m;RYou%HzWrC|+im5Q#? zTBW~Uf>iUn%Cq&Pg49|z4a|klYFcqoz6Gtq^Ci7>Ltgl8`uP%`&22B;0DYP=aGJS^ zk0<4RLc0UT#&Nn5BV^b0pfFk^Y>{{p>Cand9)o*V$c6|%ShT0c(r0a~JfEIO(m5}k zka_5iXx`j;)zUS5Rp%#z2X6pK2hAd^{bRo=o2RDjow(+|^OpWK;XruJZk6%ri$Q&g z)RM|yL%VJy9WJztT!~9U`>xrogdonTX2aPp^d5}x3DCC6#~X_S(HSE9%U@zqIlhgB zK{slc)IDpWZ7X2C8TDtNr6bVk1WX1z}XtTQ9ZR5uSao- z!%sTt3^F+nCl_;XoLl|xSC5U&o;kYa4~V1#X6S*Dg3k1bT{X2bv*vz)aIQ9q5NU9c zK!>I8a(4b7#C%+dlUz-g7*Utn#ERsCq+6mchjU({$jrU0xE-yRu5Fd>Y=iaa?XcN~ zL$Os_;uV=)AW47~T`XnG-_b9C`9jz=#6{7S`I%RR`@VszJI>=Ik#OBYxqd9T9b7kV z=B_nO#XVy%*hhSJNJ<0C_s!w!+pB&lQb7r1e_ZozjPL7j67#_acuE0{5d-f(X z*p4;-6R76#xEn}9IY)S@1c%glVGk^;UE5l^GJk|54>7nY+eGu6bY<(zE8Et7`&{I{ zUcQ!23mnpwZPIse%{7ixswR9Qgm1yP@bP18x-ssa+g&vgvY;U@DY)=)2LjUdlfp+z z>W(#kN61O@;8n9##-I;ccgQzg`aTysY2I|QBB;mh6$DQw-AQNJVd&w>gb=FIOEdSC z?wq~`zUO!cpK)y~g}Hd5?QpelEopGI&v3K9oH21A?cgeWetrd=lzzemprcKigNp>X zr{d!P+~ndRI1wM3nsev?w0jm>O@5O-#5neSA{(qI{^Q`CL$b0a6^N~ z;CJU47#7@g;KK)Dth^UIeYSE~Ej(X#4B-tlwCw0^;)|uWyfmHLWALDN^Bo>HHty-8 zo===14QmpWd`T&67f#~~`edX`Nk>uscAy$YGv%WwN>v+O*yax0F3E-n{iOUUkG?=; z!g5G$*oC9mc6nOhtb-K{vNuY-YM0`sqc|70!ljq`$L~Tnx1WXvI?JBC@doIABwBYl zU3}}y3%M!d*`UyOxpe*wv4}3fe{}LoxDBTvjtpgy#FsGNow@qw};dw`3TGgF;diPfF@M8Q~;r z3gTR0?~M!Qjp05RbxPOLwF(TQtBW;Hx1KdSi3emlpm>zu3Dd)JuoDBeU%oXLrG6sS zk4~=FOF!Zg&GjaCAi^ZUBFj!75c^Sj`@U0zi6pz=#*HePG;1EluMGES3EbewVLuS& zm(}e1KS7yv#{|6Epyz_T(+S^caNKdvQhYf;QJ9u}XI%jz)rxZR7%Nr6F4)$$O3#yx zH)x`^U)^^S3?W~fdB`UX<@vs0lFG8$OU75|+I9LB!YJyUK5)etw^Q){j6V;d1 z|3EaBZ^H3S2(r!JfNaXzfqq&0h1)EE<~&?*5DADvp02se6${|>upu}9|B$yEX<`-=1(ysPm`8#pE3ulxZXi@$`F^QkY(jvKGUUB$Yu z069O5;J=39jO=4mfA@DwCZD7tr>yrRXx&LK6W$fx77p(Fgv{ZcP~xQS2DkyB`IrW8 z^kPsZ%qfF76cO(Gm3(zZE+T5?C$I41Ds0|-a2wX=P6^w(pkhU)Ca>{J|Anvwc2y;s zF%9a5mu(=0zZIWb&3`m2@dG6za`Dqzq?`4&B3r@Oirb)p_6$r);^$TNXV6DG@G?8_ z2X^)ucJ@_neR2puB_PV;+j{7~Vd2QuTgVjCY5m$?x6kZ2v*vGMR6|x$BK;E&>7RT+ zSE}Q*TOfUmX}oNzCo+RT`RZbvZ%f}KF?)xL*(LLp5s`5MvIk1PL9VUV}e{-RnaQU0i(Yr?}?8N-y zVUK+tpbS(E@q?6h;RE3qjXg-|r{SGFb~ij*A}O+8t;AXYvLjS^3PKs@mEy1_=L}cYe0uKj?JdKh~tkf!~aG2-=(C2 za>Cm(sxDzf#`m5v;U(#9_SjtDUdN#z(*k^~9}`9}Jdu-Ff4OaiaFSkJ;T2pj^c^r3 z31r5&P1uVT0o7UMjV?|pdQ*2w93Z2cG<+wayh>_H_#&}jn@{s0mHJkakE`55c#@7>`_$=F<_umg(h z$`0X$*;k;zRzL)@AJPg!#Dx9n-x3K#VJ|g%dilN<-fYM>F@)?AwO$28NZx5ILH>Jg z1v+>Z$17P3!V;xtE3Xh4py* zl@Zu0e-c5wsOt5TvMH^|J*WwfYkq?_Rm1#XfF@k@8`|bL7D&IX&L=x{+(8K~4*%VS zKR#Z}IfdWBZT)dEk}Z9~l_1Qow_+W*3%G&(bf=1~7oBC+EZ%ua|42);T^$N~Ew`&f z{hJRiYVocOZc)(1p{(&cWS&=EXe#5?+_h&UzVw{=bYB6kPxt~9IAN8=c6 zx8O2h(wtl)#)+FJ>LIq0z6JT)Rgk~kuL3*pA97OUcCX3kHJy}ns%ct(l(w}nJ{Kmf zfvzzt)XlEaPdhMeY#KS^;kR&TqJM1t2E`L3j~a5~fZpyeJ)|)4kcbdSKw~#TSTy$| zJtghGD<gpEec3j=}`q13Z=(M0i$$3mDOL#1@QNseUx*%bR8sgo4SAJRWQTX z|K7AT{*LUq34cG{_rrh!gQH_zzbx`(!yEg3k|?R4T0u{W+PREo$if^fS;3kNSH+a| zXY<%&;1%<&dh!i58yk3(7DgW=LsNMy;t@h&8L1$(HA#LuZKUWEemK-HcATU+!Y|Jj z)IaG3H3=AXVnC*|$G(Yif%Mlem$p8{+Xwnd_idp@3NHw7m4yWl4KfZd@;juhTZmW! z(h~KM&QD*D6IG!Aj|Z@Ld;}o&rP9NXQ&L*?qM(;}84P7izk(D@r}u3{nC8wfR@gXx zng)5m>IW9*9DHX%>aZ{#4O@IQDp5Di-+&=R4L7}LW0(z`mMN8yDb;!rO2yF7>1Z(N zr6Ghe^XF13KTata6{OkpyFaRxS)&xaGN-dGOxQ#z7kg|Se?^5T&p4Sr6z=1sld0vH zpqA&4QS0KQ@}EPhHcqOxz9LA)*Nh-lE8EmEK`IYO#qGyQ1Dr}&>0$`#oG<+uy~0+n zUX2Djq&jl&iH%Krx$OziPo}I=mJ~nEmuSM=MGGlfUWD(#OZR1HY8QlJx^&;)@UFA< zA4xW(%)g?XWDQ3=#T#%CM@7uFtDXUbSn26|fF793+e5j}ZsE9f;??0QXh;%@uyF@n zcc7?Wy#^>k%T-1(Swqpk1+ihNhGUrHn3=>ecF$!pj#!GV=Ip59DeRD@VwyRJn&fbH z)h;3g(De8HM1BXapWMfu-yvJ6L&6}zRn$!(IkK2dhw3%&kkB}Vp|)4jAIvVB?&S+0 zbQR2$^jL5@o|0opM4bo9-fc$AL#^0dV^b#iy;3HHEj3cMN(G2lJEF-vA0}`t@`xMk zyE{n=p=_GolRln4i#XC*l2sa!0m6)wc&))6`!+cB71g~r3g;LjI626T5%5*ifFn(* zrLB(=3o$HEEz*6DkN5Baf}k^#*kWl10Cn&eg!=~gP>J0N7w9xW(AlM54e)M_Ow`G* z!|LP(;bopAMHqL`cBh?f`U->;-$~GVIv#b?F$?eA{&A6oEkTTYr1eh+)BeuYUmu>RELEPSDItXhW6+;)hO=O~Nj{t659xmi zo+$7};a{nb)E?6ZNe7WMz34H0bi~OY)7OufXWSa=J?|}j9dcu}0pDYtV>6#+-y^5t zW3lp!Ja?ON+@fyn$vr)WSN2{`FWBw7bc1K&mv7*T=@ommlJzoku3x35lRSN9J2i z(v4mHM`Iu~Ux{=gus~L!#!X)9FEMXIHEk)L4lms_*0*TsjK2u?&BNb(-yHmH@0*Rk zU42*J?~=Zm_`9<2b8K)1hKvmE05d~|VR5)CJlxej+_hwQ%LWuSyyXG@cN_h^{}BEj z`8n!jgDH$T88+Axri`_4I~yDuGE9kBGIUKl3eQhQ{Y8H0-VG>)S9k9=grJKO8{Rgw z1Ha+nXNG=AHihtQAk8|L4XyMh?fX`xt=myj9$ zG9i|y%GuywbiKBF%Gb)FYnF_E4&D2Jj1BNQBxB&%?ux;oYdsgV-eE z9H=jkum|DfP-V#c0IRcw!M(OHKGX5YA6&0fu3o&wRh!CK07MC^up~XtM|D zJuNYptmkA^j|ACXaZS>lGo(Ea5C7+5oza|9&lYU9Ay^IkGa#{56)vILk!N zvM_Q}W7?6o6ThAKCM2ihy9;@#`O^_cVVRsn?*A1rslC6Og25jnB8XP~FPGDOHJ2YU zyHhzO#K)kceXlw{psV)Dz%T$ql?jkZJ8*-px@Zyx$k1Uqn?s9-h}FvgJ2-?~oHLH` zoI@2VcDA+}030nN)v|Hey;Q2ID#)dB)=Y&`xti+lFXPB^R!xOcsp{%38F~}w_ccJ# zs+$P2uf@K`al`j5s0Glw25u1OOZtu)(7S}QQ|KkuI@urN*bAI4#%ie zRdudh>IEDlerl@I0G-MyhZgjT4J;tSi&dwbw|8h`Y$JN1%(Px&+Jih|oNsF&H%PM? zX$EE!>()r$(IX8-d`j+ZjBP+B6gGgLVfhCoQ6$P;4Zs!(%H3}@AhplWj-TSpi}Mo% zWYrJ9$ms{v!s8r6FCw1ksxJdZ0FZ5HlApvCW%ZYUU7Vl97j5;&fDfI=PbyVa?Uzfv zfS**ZrutPGdO;7QQq|QCf^Ll62MU6a58{VdDo4m%r8t?Z8)I7$MpKaTVT1-22uMkB z@B;w4Q{1QK?E}b!@*ctu3ZoyCM3MNS!&tx`r7vP{E#|@Tn9q*G%`+~}VUSc;waUQr zdMwdXS3N%cVjLzuDXYVPU7W+jDQ)!$z|ZF}m8z=#6cF%bT%NczX&^|P<<)+<&I>q9 zrK+o6CFn-}Gyt@G610>#{Bwk44pZDXhku1I4Y?a*&mlyk?neH)K>Ch2^dOJ>)EwT1 zf>7Sm_(5UxgOVr`Uysw*#@Jr^k~z#{9vqMP>^OYg7sg2nI{JC@NwTp*!I+!_5Ygvx znCPji+NZ!K`!MlISv~prOL15plV1iLRa|6D{xu+|@q#`~F48$4N@->~q#hAStWPk%8xNnCPji7N)=^IZWJFR-J%d zyblwnwAJIS<6<=~QW&9$<<$d#T#Un1uBQ5H8F~SSsZ@3Krv%*?`$(px8v7KP!xSNN znBvAcd1r)sI^) z&S5H7Q#~LT;pc`WjqU^>PZG&YFQ-sW6iW}!JsoKh;G%3W&qcp`qr2%}Q zxKGXDFfyU$Bz}Mg{h%a@#24MZ07go-H4gKb2ghSRI}ZO{;o=+yN!`_w3_Op+L{DAy z?kTWI4ilf0)wzIOgu{GR)ecpv1;EeeFqNvRy5&+YF-m`&=g3~bVdB5KdH~R=GD9T_ zbbHbNB(WC9S^Yyw%32sbymqV8zmM#MBiuu#fo0Hxxw}#Lzkqw>% zDtz#a%TccI3GmDlApJ>YRGfjZI*&tkyAEzsovi}P`C%%dk zhMqBUBiD0a7=HnT#(;3-!jArPXTVOU4(BFXOrtw^*9~-|+(ohjqXOuRSn&G%#O1Fkdq; zUpp{gcjR7_H4O#{M56sdaoRgeQF6J>mwrKdh2p#P&|SrK2OESvgu!=YM?yXOiQ|>i z`t(bjJ$bN)v@F4IUs}#a7XqB`t4S>@R`$Eoq+$dk87Nat07t=3u60euMgU^W~4eBZ*te>(= ztN&AS`cGZ@f5mAUvoV)r+{WyV2UFo|_|%S1w&_a~kGW_S$(NJd3gE_AJ5A>I$DG;v$u#!JZ}GOGB$iZe_{ygbVvUgpjC>;`dk(BI zK`C;Cnu`Bn;W*DRcGDdw8w*F_L$1x~=s94_Q*8p3If68uH2swyPLoDNJ~=~LjuoATB#aM&oMZC3v-UeuVe#FzW!U%5E!0~8LkIh8SE z|4yD@)QIILn$U_xDJsa&HsR3?C=K)$i%+SFJ7_UVI;~vLXk2HTek3nQZ-ErZ3)1Tl z-wFY2uPsPhX+gR*wgd^VsuMos!kFp13Cl)k$IXF91pHhDj|lkr60CCL2fh>F>J>_T zT`+{z*CdIsnK5-eHMvR^CReFC)Q2*q)wEt5mpCqc?~vT_B`VB)i_$?*Y&xwq_zRoL zAIz2Cn;|tY8ixfPHC1>4O`s=9B38ICOneK})EDw4DyIsRw160rIJnZNh!AOB#)Map zk_5rQ{Tq-j83{s$f6+cIDZJ9N|5J(-c}ht3>?cvGm6uOboI@5;UTRIiP#1r(MTqz8 zCwYbj3UtYUpGf%i?B}9KqDUHMa_Sf$nV$Vz1Sz$ryw$CMVXE|LNDY1~W44I}E99)L z@`-I?ZHh$_l?!XJe>BhZbMt5kKdfW_cqRuejPJ{F6i(aH?@<}!o0R^iD0%{o%2``& zrdk3_W-R1k)vIB7IvrR zJXh-2i(=ZBO4_ATh@Uy_<|fAuATx@S_6c~`WKM6d95PG8!koR*UZLZ;(wrC5i}%7) zMY{VrxUT?8D@)ynfYnMFtGtX={-RjX2|fx33}_J66Xtv*^x z3jHnp^a13moHmxew~YcH8%qn?rH&U%H-x33^iJWmiA>`rK1<&_goLG#)bVt&<5#L; z$CK(}$2JxG06fh$y+%6`yy1~0Xjcc_m?}zrPfGZ=)*-AtBYmmZaYikyh4Ut8wvsPx z_r+vmQZA(HVF8{50Ng)p{$m1w=gie~zE35($(;>Glwz2FHg?6IJ(@W975JUEqC)BT6}v9o&Gy$%bp za?X&jxSF2xT;&iMH>F&^)7Nr+Vyk>y+X|eUYe<@NNLWl+(sQbm{(|Z*R@aO0Q-LP) zTyOpxbCq6B9QI5268n$ReW-l7_c+Vg@HO6pJ4j;7Q7tpf0EMDU{$^=_CWtpk|sW4EtA&XRqDI0wDu;cZ{@Cz zTWFhG>g$sFu9Mc@#8zAtW-D&M|M^SUOBFodUVdN4lvE?aR=JFk0v`xdtTuVHR~jJ*3Wqp)LIE@ zb;;D~Vk?&BIjL6U3Dxy|AF-F<{iZ_=tWl1GXtw_AF?RMvdXBv!zLzL>7QSNku=Qxn z%OX2FLa(%sA7#fiPZN-n@guhWMWEWszV)KW-qUc3QkK3pnFF6Yg``{9sD{(__-|3; zR$|ie%Xk^0tVWQ*;=R+KSxD{Hz_zXL~ovm2xV8`+3 z{p*|A`d2{8V;l}oJL~T@vE#3@6?ezjaZs)AS8V-JG(th*L-bp})=$E^V(mvnqR|e( z(X2UsPU`iW)<8y3w`PbFWc{2BJAMlIJ#D8vD449 z6@f6P!f5wqHo61JAWMgg5Mlmydh}W3*~nHMHi9a%$T`sH*G=s93LE{9^`Iww!tU5E z;oNWi?3HZQTSm5``$e|u4@P$SCAR()>VbEsQFi({)&u(9{UW;qIKk@>kq!lqu+cZz zs^6iqFYy}I?`5lgk23n+WVi2QJrKkrXz!Ekj=gOCf+cL#n@ITqyB*~3Ly5q?`#E;U z5w?B>sDpxkEo1y4J1xKa26Cu~utB>Bx%Kb!+E)Az-l1+sPxw9S`3)QWA4EKM$NTK` zKkyK5|DVH4({BmE+xHTtJw(R)*c}kk3ddx$Bg3&p+3Vk8r$KPahGyM>GJ@`w`YN%k4m=;-XfcM-ZCA%a z1QZg+xwXAC*sQo7xwcd1KD&?l*79L?JTRRkgoYJoJB2=epDM*STvDz22>m9&`^NJ9 zK3kfE|h-)3hqqWzwoK1-QU!EsF|6?Mlu)UWT@&yHu8(f9HXP~8#= zoqeAj|J*`^wy@*oE)IJK!Y=nGxkmIn-UDfX8vTHcqTu5sHSmCia+klvM$wZotYAEN zgN>q5r+NGyb{gG2o1`*FpF{`9Q|L5A?I|`2UhM&yZB*K-!}xiLt$M@84m=OO+Ss~h z;b;rSde#VQ7qWHFumd~qjd`Unv2{D(Dk^-h+FI;@m#TH}Z}pn6b~V;{_o|Ke#;oj{ zhuDGNvUPBH1*)uj1(}eRt;002pO(99-Tv`}Rd&bk!7>pnW9t(#*KWn^$Bjx9pIRdQ ze)0DI$P}o>8}ErJu>a`&#Qd77@O`ld=xbb~g_L{YD1heKCrDZ_U3T{G+JI1T=Mud3 za?q)Iar=_u$7;6m2BcbAT=%G=?{fTXQ}lfSKYJB@dHftx^re;-FIV(M@gXYupgr>C z2iV}P5746ikP3d^N*#()NBa>S3SooS1IFRoV3&*yUbBr2HnB&ZWrM+<-E{1Wlm5yf zOV0sX{HLES`;~Z=KX^S^ZowVHm$3k+Ovl*ZH}}$0IyQLKG4{yQfb3%GtZxJT=ui%Hs0KQOBTrMQy>!>X zFL*fJ)6e#7`-^`;?ZcI~-~^Jiad7PY=zFxo;KbR1`ZGNTIMFEF)^mUeiZ`k}%n3#I z6_AF=D_dshIlzheLU}88Z)%u1p=GFAQN9o4R%7d6Pamr-LrpU(pV%v>?YPtcL_Rbg zKP#SD8MP105$-j)``?naFfNB{>47=Qfo>JVn^S9YD*_ zeGcR*py{`OTq%$%4su06(#~Q9+fU8-l6b~Axr8G)v?f}0erj6XGKD_ZO`#j&CuoKE z30mEB30i?jHMATv%9}ae(#MEah?i+qQ#zR`CnH*Q<3xQ%jaF(-D>&S)iPe3vjnt&A zu?_fvKuA6MNy^>DDYlYRtoIxNTXUX(E&DeJ*s@Pev^7(RcGnc5A%22rh@T)@? z1Bg0L>TbJrLhisAI(fMtiLjYL36%U?a!%=~LqLXVle?f6dgpiGO9`bckpvwVN{FK@my_bir4wyM7w)DZX-Y$jM`vMZ z>qP&B;-&Nu-v#1v8XOvR^*^-%E#!06g5vf(#!Rt{i)M_Q3yV9+n{V-BE!+4Q((oyZ zjG7fcRiH~%xI;Y$Y`AtyWA?iB5GF1**xYmA%(oy7h=JxNT`Y?| z2mU2VX)1?Ud8?A1rt=wLVdWFEhQ3On$|-Ycc9?VqF(K?y(}aLVu^*(dsGPRD+$%Sd z?CyLGCZBK#y$o;mF>s}%tH{Vm1I{e)Q;)+8{5T|SaT^YxG_oGNIys;lSs>kN>e)|- z!B38ikEE3wl71E@#pGrH!Su7jGv)g*PwU5#JnhiX*Z3t~Q{|LnqF{G%XZQ-x82b4f z;m!0&o-}KVPtGEtorMR+on81bkwSxY+U}*?%qvVm?yGI^F^x*}625X;sMWC9umSu+ zQyl{)m3-znZ-LZ7&bP>`)?%^p9z0sY>nXOq=NFY9^7 z*)rUIYN*{of0y9znW1)({w@)R6+`VN{8?gxqPcpwT|d;0zv`hSdVK5g&~xYT^F#78 z-OA9D!;Tmt7M>d3GlXZs3-t$I9p3%g8+f=2eh!%*2J*wt@Fy2LhUpQmIP}KwLh;}$ z2AW!N9%FJje0+vO6GeRu60wfeOqywu9@ zLetRK=qa)q-|8VXa5+OETpC}^G5d&ZGC(HFUvB5kA8y|^wBZ5B7X=>Rfejn*In;h= zxc$)30~8)^Uoxa1N-U8n5gux9A8rp1EouKFl-O3IMEk#i68BRrp9wLR$ixUw5aWcy}z%=@!&ga%?cNqP^40Y6Wp;xTFtb;x0?yrCe26rQrFNme!%-W854EiF4k z!=&(Tde72Qr#jt>F#+pgHuyaJhX~L2>?U`Um5=r1R%@D!%XtK(>(ax&8XJ5cULkSz zFFoILLPDzaGd=sS$LMwE?mLhH%HP8K&}4>l-VrvqXR;taT2eM$o*qSg+NGt{s$rrFD22H^a1lhTgQ$d9vR>jBj#PfHBH^kf55r^%$roS_ zVNcIH^3I1YmC6sNu;U<|t)-p{$s><0_z}@kAM$Y*0Y`K;$1u4V@DCFQht=(YwqxcAC5?cBmWySYjb@T7{;N1#2%ZE2Rb8mX?H zF}e-vIYBo@vUU${YlO2TlGx68%D)P6jK+Y`YOR2tBD_?-&p>e~JXZdBkb_5!xSUy9 zT8Z{{jn+gt#x|{%ML8pja)$T9x$2zwY1mS} zE2XNOCB_^YXAEpez{V(OOx(N(Z`z4B>_Xm9{Ktsz1nQq9Z!TmCaf@pIgmK<f4{3LG>hh}AnHv}GKmD5PE5^sUJj@9~5hHd)RL?4>4mKv5i98dhM0_Joo^VtvV z7}nTECH@vqdDssI5a0W)<*G&LO7G&%-s_81P45>wd(-r5?}Yg=TyN~^c=HtI(jz}X z+Fc!o1pXsOU59c2K1SfbL%1~O(D-LT1|21kGy&qDE)E(ms7fgWL=~&v-p_URHg@*< zI@w0jZ3P1Vlc#-?C;Gaa4=5={cH-7}xO&iYz>u^W~zbEk`!s&l7JWIJ3fj@N0aqjsJ+h+5d(=y|)#s z>fUSU522R549PfQd~&tC<$I72&E{>Z$l*iODB4M(YQh&_iW&({5^#vVEj82t-;3`{ zwqOGFP1_c+O|+ZarCHszP|<+Uk&;{iF==F0c7#y;d}nV{XK%2x*VNg!3WYySup|OR zNYnxnjYRRejpA`<`sU*l&>`@soB)Ib6@#3fASTd6gB4R~Iu)ZngN#jtl60Ip7`%1& z4!Y!j^H}j{FBrvsp@*F(c>L6MF2J~I>P>gzB&0Xc+3V`;4Rv<*>N@*+my08=U0SMT zWZ81th+(;PM7vx)qFS!Md2V@~XTiKG0~4|2z~*E&nov9?_F9XlT)n2^sX(u;2(vAt zBTn>@u7g*J#lvqL#4%TKw}AS(7L>2o&+VF5#(dI+Ke4WA2=x@7^eh{LL9j85e^na} zM2eT|7cJ^_6feu%uu!4sGtRFHk)yDpy{Jz=_WA11uz^`58&amm&7F&e9RwxkSU?KR zD5wszyZwjRhOseYWofBn6qMj(m^&BAUJX11?~AV=I`QPJZ`TdKJ8l1wAE2dJ0-Wry z99!Ra$H@*8PHz=`8hFp{y$KoqMSyL^$y}OmYo={$A8}6GHe%iPb<>Fs!agIs3 z@9X+&PIOqr-Xj~nZh3EJrB}US4%>hN=AvGItU4F#RuF9@IvI62qNHw1!)wSD>Z(dD9M*t}xv@N1T7iaxOKOO~96t^IXgoTQNW#g0k zrgiFRa)-VP4wJ|FM2wGOJLNplt`~cSV&fSNHiNF8IZ^M4v%6&<9kM!@#y=IoRHHFodqSn2$0? zsg3jIPdgwTE4~%F@*#bx?@X^_<6^Ow&8yyu%!`U|ojkH1JswPUo#+tNz2b6pb(ReI zj5;sg!Y9-Kl zwI1{q-x@ta?Rp3YSbOF6iEJZ|dll18K)6-XhYO&Abx=1s(9B{Ix~bxzuH12|OCCa| z({BEtElZ9x$t(IPZ!^Zv7w%yxtqIifEpTq9S~D1xEAg;E)Q2%a?o4v!9?MSTiJcvZr;5En+P?T z_p`0@6;BE4os;wCj>$=D$J`$uY{R{fI<{!XT!aq%P7c#J|Knk(4$;ApK03#Aa&NTb zjImPcFb(6De6Zup?j3XI-is;iL`B(aJdkY%6Ar)w#g9)^^u6MbUq2*AVIcl7J}_qX z8V+QyLn4YfQBn6|E*P%9_Wr>kd|`+g9wES@MY3SWuyljc$&Z%byy)b|=+nz@z7^cs z)!~_jc1q8{U1n*H%@aZ6?*d)6fwnSV@I>NtgCK;WLX8qFDd($efSM1_Dct_kK{DY4*5TUGwL z2Bl9INwStcEI%}j(jHdJrUVDqXDU@x{xSPyLwaurB+Ui^h zUpC^+)aAX}v^8h+shy3=h}mywWX%buGH3Py1yx;4TQ4NN+Jqw}>e50^Z*Eq_bq#*P zA<*Pe1g)C5(yzDcED2-1J?aUW3w}*=*sM<~EioZt2{r2632UUe&S%v&*~4B#&>VHC zGdiO)O_v)Y~aTQp8x*x*iu zY)MVpSg4QaO!Z-1%BgA+mCi;n=tyWH`bJBj(4;Xn>e9xT+g4|B1iUeq#^^|!0?w?~ z+r)Iyf&vL#NkcH3in>CLS=OKmXJRe(v|x!TJrObF5^PN|mCX}0H5lUgKwU;x&tmRi zPUldI4OyQU5>onnG?6u=6k?`P6>QWuu~4JZ*=#k19f6p>KCiLs%z2f)zAokP)mfFk z#z1qOzo5@*lF^*rU5ICdoZD|#n^Ue>Rw$U1-e}4bGB{PS7MC>=PFTfRQ*VOguE zL2wx}{)phq)}>S#hdCbhB|OHcreKYmbCHx;Yjro-O)-bhV(^JUt+_73nsm)EPe^67 zhn$URyD?Xn$OoD%y833V)07K3>l)0OoW5S2H~Vu@QJZwdHT9w=qHb~v8GSIDbcPif zyyLxMl95)v<9CgECgH%rnQHX#yE>L*>tgH6_80p z>@i)^uJRV@EIE6$*;-%$L!P;mwmQGb+u%;Hbe+eNG~}EtuebUgc{OVeDf2#aQrn<* z$62-^uSsOB@r*B;6I>akub}oPO-+HgF{Cm#dBtE|I%JOrlubr$qfeJ;uqC5Sp`4J) z>1?V(RO!#!gWiU^s5@bb)_LOwXH;*G7wo~LNf%bQ#GuWqHHRGfgx}l{wAF=OO6Ikx z^UjRlkX5v}<0f@l^fkCcN@J5#QLi<7wbq!!63B$TCVQhnNSPEFpU|vLiJ5>l#WF#I z!fVdeXB_^dKCO%-T7)K(N1J!(vlwBbEup%ES0_f*j>fQtg|!VHLgy&1$({L zAw)B#NY0%K7;Tw)Wz6VG*qi(@i#lM^HLC0hztULniSe9G&FV6m`l!}ah^zB;>9|GN zV9wig&GE3u(4e*jwDwfc8q2CIA#bxK5Xl=--e%DmR5t3(7*isSgta-KjTp5qUm=d( zk&S9us==C82KDs~Nx!Yp=t&24UV9_+7(&^EQ;7L2PHjFF^fWg?LUP)q!B@~4BMMtW z6SOuO0@{ML-X2!P)8@QBBs5vP`GhKE)Y$TRuQBY&I<#ST(v)#3nsvcurRYpqvdTbI z@Y!_1v>~L*1Vp91F0S%5nw>rtcE(bUv?phDWldpaI&Mg*n-eyJTODv^Opd4`C^m;2 zjcHXN1_})+F|PF`a@M9gAJh5WmY7x17>ubBzL+W!DEOMRd9`0}@+7sc zg2t^6YoZFL-q+;T7EGFKQ0?$*Y(aN2?9E$())Y(Y6WWYlmDih7%%!VW=By2M^;&ma zNJm=g!nwMPTW`xab+)WWG^!&uPs*B!+w)?5*cA6WGGZc-HmgD`8gMomQxQwEq0yvi zw$&wE1!cq$^sxp*(i&*UD#Fc{gflFpE#ZPG=CUfAoN8Z)+KA zq>j}k?OCwHo7dVJ^7f2i%_%(AtSas;I6~%FTHTH=<27ZEZZ zrO$5422yH!))iEz_06VW&J$2a+zG9<$&;yLK|@@d7d={g!lG@iPbnO%*%kF9Tp?r3 zrwcG|lh|Ud&#FSr7I)ed)HYaJ66#zi?Gh8la7!@h)KmZ zvNoMX6%`EygD+wYgqpN*LT|pEBgB3ua;% zJe#%Af;ri2)J0rzYs3snS<^auq265=HMtXlM@-h48<{eOxxU^M)3`!;QP~_&yA3IO z)TLq#rl642rb8M>Je2h}=rxU&w6Z1Ox<1?}#Ogw3WkT0rN=A)gCKRHnI!B{d z7j5!D_)W>!O0WLE*NbSO=yp zmtE0f_KD4!rg~dW%-Gd_T{fWeSt5BB&f1lRfJ0|WD(d6;P?KG0_S%y5b#7fF3Tkpk zo%K3%s!$szr=DlGcnJG-T8{ZM;d-V)I*) zQGIh#m$fC7mW-j$=x>7XBo!WGSk>5UY>KJt9Wkv-)MWJ`Yr>li)Y;X|E+HLIT4^k? zH8-k^AcQSe=hS&L4Q>oh5hr@5HK5NN8XB=pdn~aMbkEuu37Mflnu^wqg^K|vE+6} zt!Wq2Wel#6y+M<)dh%MV2Xb-dPMZVF71QLEX?@ z^^y8ItJ+&9s)O0MTg+KJ1zph4+>r2uE%lmgU8AZHvB%R`zXi?lkkQ)YZt&?-s<6FL zk+vm$_PAdNnG}9=Snt<{jf$*aYqDpfI%}iS(riz;;+bfnzR{@)84~COc636G(^SyL z(_+wL@?-E-gfWr13wj~x7g}tlj9+Zl`wE7jMc-^-&gMo)PcF#{wnWfoNu<%SorU_e zt5GnuXpL^AsafA-^DCVh!IV+t!f7F3!+Ju^>!?Id2X_yej54h6T|O(nY-yzYRhf_B0q zA(^%45^77vt%>S#7MIRoS2yY#%=ICiyRqI8&}V&xMz_A+sBmjTd5rcdM>?v^$Fw=4 zKcBF)M3Y`s!4*;4{S7Rm^QD4~>a0nZP?_s<29G*g@5~2OvEUeV}OwKTc}pD`VbWAPQmY9OW#d6>bGwnhq;#+=p^5R-}~ zT}I_ki#b~+=Ee3cX7eW1S!bTaqIH>yxUMm^P?RqVh;Ku4%CcJq@;)F`)~n?Z&i)7I6_ny)GH`=R`we3rjY8 z1uGU31;MM$J0na;xitY##H96PECEfv!LPLib5YFX&IWsZ*ywFGxdY8chhX!D>#}Nd zL5EK4PUaNY8W`&}=z>ABVDm&XT2Ea_jHUy*sK(uBP1S>)K7F$_p|sWK5_V;C%%MUD zGcdO{kTszBYFko_>YKE&ra;b^@Q96mMANp`iR03 zvNc8RI#Wng#&nRwg4Ss$gi=bIIp>cTBC2$VIddj^%xzGn>jig%!5Px$8eI`1mR&xF z;Kk&KE{|1ZquE;!5_x6B>5n?Xm^xg(My+3!XmK_Anr*&hoxjmi-yr%7&AxC#W7WG8 zHeE^?_cg094Z2vS4n+3GZ0d}*#hw)Pjpk-W1L%ZRQN|h3#*9vLAfw9*NsBIKO6dxw zjN1}YXUuh>f-2$=nwphKtuwAR*fYL#z>ovu0vbmsgKnRU*qakpRmu=D*T?GISYHKf zNr&I$X-ZgB^@b+VpN<;%PN3jUtAoynJye(S8tu`v)@4l_Jq-rzq9d%}jw*~{wIiy| zx(W$HO6#=;4L*grzQGj8Ig?f)8&Dcu+PF`Xi7O45^b_`6NafKs`_!RK06RRKb10Ky zPQa;x(wi{)V>$Gml-Z&2H(}Gj;svoOVAryUTMWciSur0?XA7$%ka zRM^m15HKuxo0O=c4ikbeukowG{|`%V9{%q?mw8|NzVG|K@7GnrSVFn86g9S(Q4Og` zCLu!8jT9=$P?9o7)@sUDS<)Se(Iz7bSt@BEB$9|@&d)Koe>i>)-_Q5+eqYz?^?aV^ z<2?0SAogT9*rhKz`J^Q!6^o}E?+z8agEps_NxO;hcX8%)Z?z|76=G@={39N(Qe5nl z)csVnJcT~w6l3b3AFTrUYE^75Kg~j|`Iz1lx!G9kJvQA*1C~@NBimrJ4_97mymNU^ zRtXs#Pl&2RF=1o@K`8mdRyNZ=Y4Q3Ot zb%fVl2)WAWcP$J0{J?l+OdYX{@gcNKZzNKytraP+W;HQx#rcc2kA+rEZaFoXQDNuc zwbLr28gkRA=T>-OUFFZw(OVX`ns(&8*9wcN#&ShPg^EM6S5kWmSbQ^df|-NQFs;Vc zRWPY!@d;%lq-ryJC>?Fqi@}QR2QM_Xn~pcc(pGYElR|@V6UvH})uw8;Tf9NAH*SD1 zLX|@9)Lib(95kUbuv>w|%huzh^wu7qV=NC`ZYgv;kr{N%K$<;ePrRk4k`BweyQEhq zugyf4$>eRJf%O&|i-BSHW}Q-oP-`W7r#$E_>X@zd#GQoNSZv`58-}LUA6ASt`WRyz z(;MukY;GRjVje18^E#XRoO2qSnn`3at1cDKzMS$6Hi=lAsV%|-VPIO=Jww5#lRGhY zge{$#^b9SMuh>Ic99pba{s?gl%OOTI$V=uB6q_}qVjB*--Jd>w@L~!bGdPEp`)g@s zE>rT!N_UaeEMaG@!rbS&I6iuukk1c0S}{V-rpg{dr(e#b`iDNzDUSueku7RToJ!>mtKu*d%!JnL26iHBUHNI? zRrF6CJ7G*=!NwG1FDVY3CGRDp^N2<*j2^?o6t>!&;cO{5+&;EcIYUlGr(g0H8RRat z`I5=FyERbRBAm%&`YoR=v6-_Wy;sJOE~bRl+_*-Y2)H$!LJ;KmeNxEqfn(U z6Z?2gyL#5`!qUX}xt=n!IuT+Ys`xRHot0IrQV;o=)FC`B?AZ+d+Z(?LKf$zxDs1uVj5gdwU$_8ypn-ZSlq4#TgJp!(egN#_1xq3JgDcGJu66?CyOh> zNpzWr)kCznL#d)JBa0+%9eV3Uz zZOE62&o9tr!-7{U2|K*ZZepx6OW4RKzoeoUX|q*1qjb2uQE8zm;gl7dNm)8AD%efV z*fH4^G94m^^bK|+!e(ThbkSUL%WX=XIb%s6vpQK7>ZP-`qPf$MMk`|~dY_UuIyIU# z7Q2HhBgi+Lms@;IExKQury~_XvwHl|ij!00Z)E0&NY|IzNYS2HX9LYX3q_sm4rY)& z?5bWl6UxcJDmk;j#;HWPGgCW@CX{-7FjI6{eM*je&@iiDvuZ6TYpy1pJ4e_KCd@pH z*|D{lGwM()5bH0S3Yg+K zd-F2vB$~f6_!{WWr)J3{g1*wnCK$GuKW!{U@?1(|4pm{7u=vh}Qms;FMk+tU>!6{l zs9|5_(cu+T?WAO%xs{9$OE^P0#jn{;LNv=q>NL@)ac2bkA&00LVElthPK6L4Fv)r= z)C*i0I;4&_YpXnQcx#!JgX%WKoH@G!m3jKvK*iF9jVU%amzL7F zxSm`~#)Ny};G1_F*6cL_W{g*#3B7uhfwL46(&BM;atzYUWr5kjC2JA`zpYU&IEYVY z=3~N12Xe`MOA(+7c5>4C+T^I?nbVaxL9Uq6lT2qn(-)KNvF=@d2boDbibYD+hJ;6lhXMGKGtO5T3Zkg^&i4y((d5E4%LD>||@I;|q+( zTpHNQ=3|__B5m)og*wGXjUCA^C_5~*y-hH^t&r6i8_yOzAQ*QQe3??u=8Cr1qalZ= zGY3qLAzLi^a42i!9NHKfBUw&~sAENJS*+G-ZKUqTP4#7D?IDbgB8*HRIJ;cW!C^`% zjZZ}AuS^&@OWw0iwpSf~6{Ie%w>v5lyu=hH7M6?HYX>X3no=2Bnz>fd}@+=pSFZt z=SOx?PMh9xA)zZaUnFhq^h!Og7``6%c?Y^!X$z$xo*oys_JkF>R9a)MkASEpU!f8! z4?F3CdvwsI(nRK_wQJ>K!gP(ymxe&=l{VZh0^*tn>5gAny*A}>B`a>CkAc`yI4+xz zFx?`Bvq#1*Urr_@FQ-+ZBXTa}9as3S0_u%q4d3~>rnp}BCiKQQiLtNC^_OwBRba}(tz zYnZz;|KiU#g(e7=SqprMkd!gwd98SQ1Vq~D=Kkui+9VoRPrkHOf%+(qMYyF+` z;!VT1VfW_bt)0Z$$^jh&r>b1c;#IqAq(gyf#FMYR;bgF#oG_5s*gDlv@W_id6=56I zYSjvy#A7Vwgc`DEL0a`dVj@_Bnuu~SFmq_+nbFChumh7#buL$^-Ye+Q&8$UAp{=-7 zAmT|~FgLFG454xB+>{Q)f!*yGCQ28a733{tj)V(~4Lxd?v}iTf?3kaZjh#Jh*z3jV z!^t``2_rAtQE^Fk9R5%gwW2&hV%)L0c(5Y&7&S zOp5&2SP{Q*S_I8SsG{CE=|bL}i5NmU>t~hkwb>amlPKeZ&}OKuYvF3=}#J zmeNahALj(t4p-QyE@n)B#a&Vhi)yEF~wloU(B^jaeU*}2{NqyN(Nbx?{f;@k(e60Ef!qR8hAp$4_KsF zEG>gSQX6Gh3UNc_8ktDYIw7g?>dvjL#`aR`N)3GTSPB4uu!_BPvI|*g_vF(Kq{Gh1 zv*K&AJ009;Zp>jJ$-Pr|rK6<%jH}m9FkwSZ!C5d3w8NuG?aC9E(%mVT7(zGU4YW5s zA4`?N{NK`viTh?TYHoHTY!F%`=la6#4NPrD8Dq9j1HGSd7m>lll=@zqoHj<*;u{k! z;ldATWen5-24Cj18m7)u^kXYGHryrLl&I_wX|2$+JKp#kKQdKGSVg!rD{~`eA?6w- zl?vy?uZ{=a-6*xfUFb$oh3q3STRtH}UKz<`_F}6e>r;$~bde4%*xj7m3v10xiR%;l z=<%Cp#;kfN?L(+-Pd#A9-Jp|>9We-qWqM&0#B!?STqo4zY+og=HWQoIfH7TPxE=;I z6WImR3bW!fu|f_F3?TxFcPH&!N%s0NadBZ$`P#)Q9w%dmhQ!Re;5GwxQ(Fi&-Cva) z-<`wYN3vKGRCcs;Z5J%H?xoFuNjSlOb3-W2BD5|iV!(r(Qi(Oh+@;aGnN9gYE_sVM z8>b5<(g?aETWYe5Id|9lcr@~*wtXDQD@j zEg~*BNnUwks_(+g8ex(Oj>2YoG+E@F@fby+UBy zBe{2?E1x3mB;^t|W;&ZmsZ)cH2avN&SkngU>D?LN#^k+h?d%d}hXIqcF!(K}@Skcn zvnuv%VIZ|(58gzElak_TK5(An3M+*GzC})TGQIQBmO9!<7ks_u0v^R$NNHtCFZP<=Go*e@Q1(3I^}2yuof1w#FII zI}?e0(Wm8bE$}xQk9vk$Gvz)GGOz;Fj0sYXro`>FxLNbzG_{FaP_j%_v_Did)C zio;gPCKz0#W#nni0U@t}phfM@X?ySL?98h+9f}qX2gQmfq1IO|;1hbViHg6Vg2^r! z!Jd$Z%Yx`&DpXuMfM8;x+_;5IXsQDv2zC61(2k{m=Y3~&c&(T z7>jw;TZ@+OaFTPsPxeA%d{~xjwc$a}dNmI^b?&(c``@63#ErFDPi&$s(WGN4t^;_{ z!V!s=&%%}BR<*E`X2@33K3y6nSHt;pN3Wb_37s>FX6NQ&s$wC)xktJc<3N{F;1mJm z>v?) zF{O%2rPatn9A2}v!7H8BD;>6q^fTOK7w4^+9Rg{<3oKi(46(fdPud+U7;AoZC9H}c#O6WoV$tZ=AX!9{bL2sFSK3l0!5kfR&*jd90#L1O1aJR< z)@ov(0psCF%^qlnhfmKJH>F(*jW1$}fI!oUi`VlJltX2&=uCs_2~ea=mVju5((f|d zgc;rQ-a(f)y9xzlB9<*;tLcG}u|?Te#x2AykWyz%(y;RLdpy zCAh~>G0LE`O}cBz3BpAV=h{vtCG`Xd;r&#IOFaal=4A?WuC=Ep!2X*|t`!#?=^WCj zfTgLS53V;)dBu8Pm_G2!m?|V|jY#*BOty0*TpIO`snx(?wdwe(6;2N+TV2!sWFZxm zqE*JYwSB;}(p)<%pcA8lrWMJUsF})*D_cB9H75bzVX13Pd?ACMFOWI%-X=T@FKZ_C zp!TdaZMGq28`_boP|JXez#OM5ATo@b63VEb&O!z??`@^4#KO#|@GN6~b0e`e$CH*D zkUjV$%+2F3DIc3zaky}kN0$ZoMKTx#9XWDG zXMx1zdPr=YS{;lJ=Fr=LC|E6znXt8jRk5fL#|y9KOD$eKe7#XB2X1ZP`1WAxG8Obr zVizDoEWirz$CyHbBjS^*beXLSN`nT&m#<`qWhNB^COy?kSyKGA>8@9Flk7HS6s`iR zBX!6~@nW%5FZkPsgGWVbsd&L=G8uG@1=`uw0j5cEv$2vvW6pgjHG_F*vpK-Jb6I~d zV5&pAWHZ?xS*XWcG&c6ab~}hMdbUYGDRv=5=053%IpA{RiymKiO2a^k?B1*NcvHtj z^ySUqQ?~XCB2sv0^x%uUI;0CJ-0js6Jq5lWqlcxJNfVQqH=NOead*IT2f&Zd^-Em> zF2=<$26jdt`~vWjDLr=0iE@lqXHxj9^E3F?qJ8%KtX$TFSvP|{PnJ@;aPmOuF*JYn z(7TXH1K>J&FD?xowqz!sqX!l80!m$~IDuMR3R-6!nn!~~O&Zsrw^lydSRpWrG-PfJ zkpe7x4vZe>k3CnHQ2P@`9}rrt1^(EI)X~9N1gNXfI6Er2HG&Y@n>mj|IbdQTzk1MN zqqr233w39%!mVY4Rr1-z1)!j`{0aRyQ*d@}z*+5#8V+_6S{hU{s0t?HSBZ(bof>_O z0Gzjz$*9y20qe!CdB0_XoB_ABlu$QwK|7SV2QmN&ufm5GsI%E|&=X@A)gYgEr-U~j z2ryE2B|ESL;%#gsE1Mw+R>7=!hs_lZ4&_i?fcR>Yed>)xUN|EBY~XAmqU@c(O--8} zHu>1_Bzoyp&XAW_W{iC9+=VqJPqIk7Ff=GN878SgOP~blA=1xeShJRJOS9uaMT>Z= z9iZ5ZS?v0hci>`9xnIT51#vi>pc;zkYT-fEqXXgxm})Y9?cmT*1Xm%LxxE45ny zPYv%=@@YW8iYghJH|K%R6nA$ff|~V|$!|CaINUW@ORAXAW$|Ep>_mErvKc1@zWXvG z?C?rsEGmirrBdS|-XbgWHnr@WSO{{Ngh{K$=3b0uTFME)6!VB!a|>tMGivOV-W-zq z4S-eYK_{+kz^7xe1{DL=Dkd;wmcU+8)}o3|BL=0WV0}Yl+#y678RUVH3i*b#xl02C zNj6IfidWi41=k8rAv}e2knww>72xt`R~5`bcAE^MZFVwo2fH%BAG8GJ0k?Y)U}8v= z6PIisGQwHQY{a~60=Yx}9;iE0@dsZdA|!!jkRH_3;EeCVqqlYS}3d`IVap&+kS z27GzU>#Y?F_^;y{4tk~Z@O^lVjMdyPw=mTQJf9e%c6w>XWW|bv3<+6C_SGBA*qk;g z=6t;L$pY&$TnDGwsmztJMrwWrUw|%JTyEfMI*agA+6FJ=awiG%7R$Lf7C28e*cpsL z!0`aBn&>kSgd%Z7IK%#E)tJo~amUtZq^dV)M~5?f0l9_K>a=itTrME$a{`?%BVABi z@$725Z*EK=)tuW~J1F!}fwFt!Z6+gPB1@PnrIAvA*AEOjbJoBu<4Pg2CPRv?lHLL5 z3QI0R=5oNgR|@WZKEd>p(Pb>RiP}3LtKdNML&o(?JK3eOnPeTnU)TfYR3OKUWCqQh z^I$CX&IWNM-v$AEbFeUjOK%oFMY=~?#hNasrvgv|J-@K_nF}!EMt_M+5!#IpC;^yR zbcmT;lXf2ikW?{CtPJ=dTwu^pM(b6dE;P*V;vW2%0CRz z&L^lHeid3LSRR#VbrBw?4K(X;G8w-P&$&OSGw7=?yXPwErL5jF^V4q9#73f5K9K*PfU%^>^CoKpTKH-}2IaxinClz9A!NyaL4AhzoH?;FU zka`T>4m|Gx{K;ZRey$7(D>GBYE|B5~94+rHqXF7(%SNF)M6ZL`xHo!zu}0;lR#yNF zuFTP1ecI8eo>QG8n?jtVCnJL2t%XRP=ri>iOvBg=H+{yo1jK4H!qcp{@S1GM9tmlc zi-x?IO6IaNMmtf1SoPaAkmFvc+W{$t(woa#_kMO2$mJLNoa!D%LlVs`*^A|w!r9J zg~VtA)S}?Zj1f`KOyPjPC5?iyA)-o)olV`%HIx}bb1=aMj$_1(o7)T5Q45foMh95~ z-Gkey@IrjTq>&`qc`^!I z+vI6PlY9d);sG`Mo1_U)ObbT`2jO)Lk9H&-fKai`h`oj|gj!j=2ih6{8)wU`UO}|O zYjaf5=A`;Wz)ng#SY;NUI;F5T1mcF7J8+#0rx1-TG~#IX1b_?Kg+yy+zXZQmdC0yv zYzm9Hx0f>A!U^#w!WPjFl&AVsAS#Dp}5rg(`zNh z*He3OiijPFiiqP(Lt|WK|5l zEVL$VCnxA+eUs?jmpBQYklY?5PTT+ zT7`_{m@P_;hd4GaTMkMId!2|aV#_r<#mu)1fLF{j@iucL)r#Gt)y;LfvJwHAi9>Rl zknzO4yUBHtAqR)F)2WzS@OksL6yd(TUR>XlBAW$;!r9s9T7czQ@ zuz)^?I|*?#*i)|rwQ4MxbwR)5a!`2M&Khv>SYv2Q?oyMZD+s;jR)fuUspV%P#&S+} zVNFArsT3O`{WbcPHK(I=v6YycQ+Y7J8fTeuhJc8A1WPqvZWd{%!yDw`ER@}nLtOTz zgcw|(`jw4j5!CCA9WEaUP;V$4xMfGnIv@cK(V>kTTN&N*q262hXeKS*heOosl`YP} zz`;z+03s*KiHNLUoXJNx);mqaSO?%Qy%6+vB;-qJr8=Fg7=OGQYF*8SU~60gg5Ig5 zhzCJ(z#g1&HUvE>fdU5t97+`z;d&j#)#tQIYAAUnFmC(x6d=xvR0}HoU&M4e&?LXz?OOv{zAU zdjvBwNQFBDyllm~a7Z)JDO(9IP4MtjrF^PnGUFm41B5ZA9OBHBJu4U|gQJtDfL;so z^b1U3qj?fBC=9le7a^38rjzo}>Xe)N{bKzJ)}Z5n znoPAN$bR8cW8oKp6Gg0Z7Qorz4%aq0xHM->t+R;71|Jc5MvLKrio;<6&>I(rw6s?! zC&FGQ9+z6P>?2{bB^`!xz^h27#Hujj_3jnyXYf6vU5Z<2;2H~WCB$xJ;5HT6AP>}C zCT`K_(8>@~W1}BV4iIc~3ZN%vDB z1O1(vyPs!3Kxs?-o~2*2*FcLmI2*(kbp`OyEnX zP7TO4V8A}5y8!ra_9nUWF!LR`WRge^+e8GK6RGhMUciYtO3ywRWx9gw9V%p| zVVbix#EH&QSO$AfNLzqr&4PZwj@T|j#dSU|n`(s$A0aKXHxs8Lr)-X^klxHWjR)1O z#4tQ_#|0FPefQm8tBe;c*D+S$>8umQb2&0x@+P3=!y=ZUd8)yM%k zj4;XLQO0H8oV=~jt%~OaikAaJE`j)RYHZ^23-Z&(DKpka+@#GAYmZEsO9t?0%4jEi zK_1zS2}X_3!Fa5?2;5Ofyx~p49kfA1Pxf%Tk=AVW=n+s?Hb%(&38$_}H#m5`1$vMU zqJVdMW-Njoq_4REGF#LR`@rO+R-+R2rTHZG`T_af-R81Uq(QDA_?o+h*l`sV8VIt0 zY*|TbqYz|QR=^NB=5E~62_^#{cL~7Q5YOlC8VKty26=Fx9wVEL=NgBJ&lm|cw}#hZ zPJ{%qkT`FH6%0`$T~sQ;Du;+$@m=Cc?HFiXk-k1(Z8fWB<$)ff2RSsg|w;K5H zLk1%xyNLKY&FGf$N}f8q38~Uq5v%3@7cT(Fgo9tb#Aw$$P#xIfZN{3t0nq4Go0vMUQgpdp(A_$dAqknX~PA;y7$2CIQ z*GKgMQfYQNtV)dmoSG_B8HjT!gOX>L(1v`-Pg3oYoivp;0tr1;s#WI~INeZ^&_*uO zR12&|Soatn1_VmVUO!t$+m+_bISGj=GMU&;$W&`5 z;GIJP0fV$gz>T=37RYj8#oxHo@o*-3YZjA&v!!#u{;5{u=3Gkyv`0*2FvBjlgjl=D z#3?(UQ-#Y&h^9+as?@Prhh*cka1qDCZj2rN%wRI3lS9OSh2V-i3Dq=MV=lvfiwTRL zA|=)Kc*X099DxGTYbMkR@8A$#@Nc1vjI}#4V2-6ZRc~OhR8S5AK?Iq?sIjvu*mX}@ zdu+@#E}=7VO39E0B2xEjub5ODznhUa}FaSTpKiEd-jCGXT{M((~xW-2~x)6Fnvn zpgPEyJ0(OIV;G195mZRam!gS4X2Y$WG0+LW*dteMW7aOlo}!Ro4|8@W+&2z~!jsTWSR&+sR z(gD1E2d)Ci@YN`+n?P#OTTnqYt;q=bw!Ei|T5Olh;5*kUX1&Cq^&`csVYY~|Fa!qXDD6|t5fSPEaw#ZZD!%%ruXbu?P4 z_)~j=6QvUlG-m|`YJv(gi+a08K#gto=J^)q0vud+l1T^OXt8rB&iIV-)nIy?-F+02 zFgeJeoVPQNjrU++BV1sGY;xgXbv`UU$)pdRNW0RBFCU0t*-S~tpNZcZ!03?zU3AGy z8e(Gl(AHz6cQF%}jcmpZ#9vR|f?4gYLg8Uj($Yc2HDvi(IIWynd#^_JSix$VYbA6p z(nY_7Hr^bdE|QZVC9)leuz4ecx5#h_1*cfJVMS1lwVreaRSO4&6mK=>sOi{PFWcRy zC!0V_`5C9n88j-uBg)4~k9wg7Jr6PNJm6;sgQEi^0U{D9UbwB*kp=J)CclgrpdE^S zM$98EM*5z|DP*9*Lgz9C!BJfAh?9;OXn|OpXO{`B8SJ9Dw%E_YlqeGvV?^_f+PxaS zj1Z=S_J%^6agoa2j+PUkD+?Gx63=H$6zLk#Rkt}9z}q>xTrnbNye>nkV4AM*x=zTU z`DSVFiZ2dssUojT4P3pCW+c|T8L`m6^)2H&5`8eZq!dhcDH2KE#5l_7TXa|tFi}ig zSG(zUg}*T_b|6r1M9nMxoY5WF#0v>&;8F3ZM>Zq0i=Oz@(gFmHDEy$xR_X8}`js(d zbT91|vdhLG6^AbFWw5DJBA3j`V{2Ll{Po2gmYfr7;u>T+ZAab4q+mxy%;+(K4*aB7 zE<)1CvnZ#ufU*%%Pl^xd#3hX(n@h+gVkalz2eNh$V$))0hJzo=C6ouWeGHHn9p&&K zrc&@jMr+9k)x6}=>vKSh7EX_YLC_BLE*ggPu0V?32qz(j&r#b-n-dGfn?*P}u7CuS z?uZW|zt6OrR2d;Zkv$9aBZn?m;<4WS25mcxY6qQE>}r=7Sab(Hn;M|PftKF^^` zGn*8V1~{i}aOJ35YrINYF#s#r;lZ-aNGLm6WU6qMTYICmgM??2NvI7H2Ddrs2~9mU zI%SZ<#b_Ogh-7dh%Bj5O#)P%ciW!xXo*_Ju(kOTb=}4=`RildCrvNCZF9QpkC^f21 zEL2!nV}M5vF@Z0H{vgTt0yf4YbnDutOP3gdmmZ zEGaMJ>;>_Rb3qFx0moZ_@4X~fCBagGx7FC;tRcIPmrG74Kp=7sZyE+X{b5tmVGeMGxpfD9QJxr_^IO_vNEsT|^PAZR~P;bnZZgxx1bUa zb25oFGoSf=pb&XH2S;kjQwxMtniBKOkwnF?h#DjWSaN$8D>LzxRL3}$;5H`o{zl%k z=f*+GS7C7Nf`==^+U!}(dx0@J9a2gXeBumRB?cmQtTx)yxln)-TEYrK(G%h$T2H|b zhp@MLjcA~cC_aKzcJO>7mMvA*xM5_@)E$D|A{7HHubRPFNt75}W**HnYycYu;bu@- zeZ3)BEC3^d^eZ$m!g+GE>668r*#MI(7nG9fO35b@kmZyIMhxksgtjtRK08{vyhCYH zRJd%6e3NdjK=|hgR6xd7sg%R8YG8N{@{O@hM;!nHQ>eu9k*v_&da+JziTllFZf=qu zDU8j)_>9yYkufIZe`^JBg?guJple$gP^ILPz1YTwXOuBr0LAK0$sGz28sU|C=qD)2 z4p;0&!mG$=7pXjy5XrMi238>)YUd+51t2(S0sjDUaZ%HTJ3P$bA5YZ<7DYnlUV@L3 zxOE6sMDZ6ERR@3`XKulwIYVv9qfx94&=JM3S3cw#Ch37T?xmZgOVg;ALZgz*@(gE}yFfR^c8IaXx z)(8Fu$WjhhB4E-sR(p>u$sHS^17x_nv0@ca9k>XgrCsBo1mh;nY$W{-eUO}WsOa4- z36QH)Yi1p`;}T26O*IieX=w-Nip?>Ghp-y_OaK;~GG<9DHY+37513aQ4Ag5ln1&a@ zq;BL@-cL|~fiFsptyWH!3_d)9_TGd`59u@P_ih@Xh5-dRTGZK%nCTtFkBatpaN_5X z`>5hdIhes%n7}gdJ=uCk?5N?a7Z%E)@PT@0^a@yvA<(4QTH`8b%^~_lwZ`mqe-?a? zc{yN?fjkvto0N)+a$XOKL*+IPNOssF{Dad4`<_~J3rKY8(An7Q3X z3mp!5?Jlx$cX~>IUa%=GCD=NxTB3<)G=wFYBm)`0y;Ekp<$AFR$yPj!#3?5<)09dC zwf<@(2Y#_gccmv^XbqGRD=l{n#JH|}exmoBtv%TYpiZz>AcCh&8L;-?Bj%R1NxxvQ zq4|@v#o&)-R*6~{UtH^extP%W!PT1;ic18h6Vj~Fii1Hq1@bhp*}{g>@(uPz0kmrG zW43noP(>#XZA)u3oI;53%%znkkAy+kp9ZBKoPHD97xg?C5>L%W19?Dpi)>^CK`OKt zhpIKA6lMeysXkUc0OBON9IX|NiEJGR7@G@t%SMM7agKv)QBPZ=AcFv9o_vV%n3!qv zAO`kEN&+09)Ew@4ev*9yKf*T3QkUk=-QZtT#3+wV6L)Q^O3*z z$P5=~Y9Vb@!Y-&hJ-TTl^0?7Dyqj}mMZ2WF*t3S&er>!FLgd0N?v2%6B!kI8~ z#LfZj8=KWaEJDy;_c6Y;qYLGB^I*WX31IMStOX1_xdzJ+Qxi;BvxSzC!(Pp4W2Y>+ zaK!|{*reAE)U2>xZFLLUKlLGnQ+FZEmr3yoZX9TDth9yPLq&x0>x(C@AkqwHG|%Y} zITIxxWl##p5uN@J!FM`irrCMGU}(V@i5;E+831s=UE(w{(%k@xrjm0;16?k{LYNTU zP#lWxuhI(D6gN+UIhregWcdf=1OiXDDp)ca2Ut&C41bDTGml#An01VXH=`s_d8lkL zcEPCji0H=qmnk=glY+85p9H1CYD)#=Nxotgy_BI~kWiIyU3JQWPih6MGgc%3SosQ7bi`~ThEHy2)sn}w!`jqH z8yf(0WD{7zFt$PgU7`a@Uab5;yHgJv*A6o}>O2|Mi5WK*V53bSo7^aGWr_w5E0A|2 z;!)EBhHWhM*~5tviK;_|!1?f{0rqR4x5^E|hn_*7Vv3P1y##;+Epipwe$$zS{xFkC zwQ7&+Ee~1?QA#PMk-Q#ru2fLU*YGIp%t)BjFvJhuaOoI%OdgG&tBd&}C$U*5jSKA1 zf|cxMpbc_m38$_#ZU`L z!_Qh5;l5<545MJQ70mB1Y{Aliv|p=l=R>Q^C$Q__|8LO1c*x7 z2sq(HGwEHU@ztxU{gj>TshQT{fD1#uPXGAJ|UJwz6a996j; zNZcXSOE$f#9&0&MoEWGSn~4daaV3fKc zfNC)lAu!@@rxEfguS}<4zB{|rc{&vVEx|{VVbBc6M(dEP7Y7=L(2d5?8SIr<3U*Q| z7b^lKOT9Ab@vI`Silqz;EW*=jgT^9&`wdEiy*ak`39$te9www2^aHBR(n|ne90AZ7 zZox`~j}S{_84Xl7Gw~Q~5sDzt5)y((=$Nxw(PV%`9colygJvTeBg(T1xOH~u0VAW!wZaaWIVYD*;&X?k&9rSQ3V)bu-1<{vY+Ozr7f}(sZ$v3 z4ZW2Ln>-?}R!fr=5Oa!izC~QN3{o+-YP12Ks78a8*>6w|vCPsi5AD4|gGHE0$WawX zh-0-1QBfPw@Ow_sst6%!<$w%KPe6GXPaTG8?f~~8!;N-;7P@HqL5>?7Y!C7a2(Z(w zd|(b}(pAA5fV)FindTCL4tpP|C%Lu6MS*7J7N?e zKp;Vkr%MhW5f;R=ISr$dFH~d;YQ#c=U5pzadVDYeMvM4Ck9Zl5!A((}7%0}xv>uBQ zLI_q8J*3rX464&r6B5}I{>CGxx(phZOctc;RYlHD$1t(D!QTO<+hc(}ntBL@oV=${oPj$cJ}FjaJ4Hq3AA^*Bqs9yQ^m8(Mh#N z4i*+tY4OCu=r*fF{%Wc;aW?Wvx(wurMX~Ib5Y?8^gY0> zt?r?gVls-`6qXSlaJvM^Ssg9zw@$0T`_yfg(m_bpRtB;n+5Mrx60J5x*fp!@1VXj653Ub9^TVYg5 zt?+DD!C`6vz*MOTPPR36f_eo1z&K~dJdS3Fl!Y%q6Sx{nM&erTZVFUkv!+s`--Kgy zG&NfisLKoJmkG^&W2A{1YT1E|iG0m6^$Ix>4swTZqWkR-DhLwDd+_MuY_!3o zT301{bZH7YvhQkwRL%kW>Y|pCA7WHgA(WKz3*tV~)hWFp`Vdv4!Gp;&Bv`I5C2I7< zVUz+4Tc7FZ<-V#hg0WcMRAHj`8NP11*xlh^gMfl;1Tua>)!l<0MFe55Rva(`3-^0E zm?&*Tj}31~wKW?FM2?N?rdS^nhzEklfiJ^;?!>bI5Jy5wNJAn;lhI+BL9uE$co59i zk~NdMI6x@-h^&NIbH8>jE^Mf@x}dcmduiqbMUdi z|IxkG^V-0KE95&R*pa)#TctCQMc5uGKrGpvnhuqb$3l(j(wSW=c+);I{%8R<@yDSB zcy2ZY1q|_7L9g$DvqV$pp#>OS24y@0nr@k@N2dS~ysHal;taLL)7xA@xkW%-U=ISB z!1AJTZf0^b2ow#SSqN~VTBTrpy|w^534Wu;;QD3eLf68ON1p-SfZiBTszWk3RVIpZJ=`e(s@nTmOxJ-xGfJHV(n<9~ni7yk2~zvbKCe{1qL@BO5A#czD}^y<63 z^q(L21N003{+Zvuyzm>&_derOkG|!vJnWC!f4&#}$mhQH?r-_|f4kk^zM%NE`@ib< z?$~_P|KH#K*>9qczy0cmefHJv&s=}cymkJ9^R=IN`7=MSJ?x{*@tWJ~FZssLKI#S4 zN5B3T9(l)qf5dyMTmAMOK7a2=n7{ft`pu75UVQsE`cK=x@z)>oyjOhbmJj}?Cvo3< z@27s{Bfj(#+jsu+6Yl#vcmCxk{oLDwzkcld#y|bqzxM9+uHXE-2Rz{~wV(Whr{4F&U-du!<$3ZezUx`Hdg>eA@q_7| ze&m&Z@Z-#j9^ricyKeQ54|>~2zvs;#x_|bpyZpnqyzs4$`Keof%hUh;@!$Mg?@6Ef zg-3npet-A7&-t1UKk_rLwZqU(~q5xGymX8@ogUT@weRid%pB-zyFE<`X9ddZBP7)&pqfD_%Hri z^J?}@|Mne!!oU2xpI-jrJ>U8Z-}{BTJ@oqLmuioGUizw!yt%*c2fu&%(vJA|kKcRW{Xh3m{t54P zfB9~oe$9Q0yT0S85BTt-@A)3%`UCcP|INJZJD+gJ-~Wb>|JR@W_TRco_iFiz>!Y6W zz!!Ye-{0l?ekptRv+fZ6;ZyGN#_4VTCtmp7A8}qW{NQu$$o}EdfBa3sJ8tvQr)z7{ozF+^B`#koaZuR@sUqAcnKa{-vp}+YK@2TJRBI^zF2X6aV`)RkQ|M;~( z@{J!O9`jW%e$!WcBK>9hZTI->pJzYz;{PPR@bBLAqj!4MUq0%dpZK8{|3~iw-_Sq& zH~x72G2y|(;=J}dp7QzYWe>gMoA3RpTfFO$=l!T3sQ&2I zFKZq^eBn2~^LL;49_F5pfAeR5`mbKizwAeghkfeqZ+phO?)me7{niKkIrT%I`=uYd zzF+*G&-~zHz94+h^Zr=*_wYH(+mrYAcX;so9)G82edKmuxa*%je|g}$pA`J;@^0fv zulIlIS3mQ%=RZXF=rjNPcOQ3~7sQ{r{j)#yKfOELFMr2_Z};9eJx6=h@-gzazE8RH zkDed9Xa7j;)35xCC%U(M!T5|1R(Je?7k&LBf8`-R`5#~ScR%%p;9u`6zWtXU!{7UF zeoedUt3LX~hrHshAAivM@9>EA9$$X)8}In-%THPVaM!23I)A`dJmTFid)!z3_@}LV zf8`(E|JmR1f7p8qu&SD_e|XLT4&6vfH%K=~cQ+`Ybf=^(b}M#wVPSxZqJZ5ZA&P~8 zfrTP=-2XLm_JIS!9nX7z@AX{Y>zp(5n^}9!n%Qfwi9NdIsbuYhRgv{WR}1MT*vPK(n{jca+g8q}ic>r3 z3lbEj-#J*^pjUAI?Hn()SFv|fHGP)fGmjWFqdLs|Zjt|&tr4#(M_hZbVG_@?a@9$j z>-2K@J%*h3NqOXaLuWpp+n!dPv!)Ye9|t%5EZ+MZeN7a5Vl*$iJVbwo=Z7-)G!^TZ zZTFow@I1;}b41|c#*c-xv)e|Msnlg2qFtP7CNsuvHmASl#UzUr86T{o7Jb=MAG>L; z%KmYj)lqlWss`oqw3o%7Sdc4r!c}|pA%h$F$HRV#-KoiuyuMWMMBVBRj_JzL6$V$F zfA~$Z8g#{NuKEYlhqEQ#F11U%-nLic`N=WwZ09$MclA+Ka5enRbjvdd z)4p$Pp5gw9!+N{_!}!H5A@g>4@n6y1FxuwL%rMiUAA!oC~RHQ7-~H3QqJc+ zS(jrgZKW%^7KWZny1|+1*ia~FJ^AU@tg6Y^I}fz1`5bg}T|v9|`Xc#ip4%bcwpveV zEXlawI_vP0HJ82(Q%u|CSy0U}L-(ZI;dbBBs8zK0TJ|Y2yXU{q4N{uszMAXH@Y~~Q zmQTm%xJ^CrR@vkA`BWddTk0-xA`=WEPir5vjhuZ`tK9FI>ll>Y-K97M*jk+Z6Y{U-v*_ z_|l^>8^o^d4_kU~)5XBXg(!Y%Br6;WKG%m5v^`(-Z@W>*jR9W{_AaS5=AeB zrpuJIr%HD&KjXY^>`9lqXBDRKEgyB&c{1H9;n?H@&2sZxA5CfY=7}}lKlUn`qw{`- z;rDzQoAhl8PhB?0l^ngi{3-XyFPVaGjK&{T$iH<`_?eR12+dPT*Y(3{)7Kd;cD_-> zb2t76BV(^v;;YC@Lk}se`m}${d5uufG~W+LjD-^xpPkv@rO;*lAYhkMCeM)<^Ef-L z$5($)aTqNgVz}v)%oY17TNp2f8E&;%kaFeT|&9^y76aH^&b_SYa6$qRd1MbqSa-m%*UcpHaB&K)u%YWTW?uAO!bY)zNg2h zsGJ(~e&_tA@ZvWSb6meAnjC#Q&izC7o!Fmw`Y&v&o^AG2-8Rb@KKL42YjA(md5tOG zyj$(w?h#$(v0ut1b>-XAg{`CM$8~oUoLZT)OKFAZIrXd$LfcP|^;#eh_9cC;c?A8{ z0gUUC0Tu9KI^~c_V*l zXLMdIld!w&BX?-&JJ0!_xC5SBO}Mo`eqN*f;#}?KL1|}iZqjSre|5|d&)ijZDN}u) zoEN^Cb}{I=1^44Jg|QzO-!2wfq?;?b;;3+^{JF4CR!;<*7Hh$l0+ zGQJxRlRcecd}Fdy`5Q0&&q0i1QLp?eK5eiW>^p%s-tozzGhby-bxQ8kkJ>)-tLd_$ z`hye9Zj~p>?J}(mD7$HYf4cdwC3nSlr_C*k(d)YAu#uy||KS3~F(*RrZk%;7Z^J#2 z1McfC#L=^758l$Y%J>YLtrYQOapkMaYvhgyC7bM>;J)%!{yTa5Xu&;dBR@-~E<*MV zK3|htxyBz*$$7pj&3=~dtwAm?CW_2eZO@pZe?0v9R}rfts-CokT594fhAJL%;m59{*}eLHKGj}_mcx5E9~ z@KcNir4KbxheofLzu>nk;iPlfNAY~e-OF>{B=5U9;+V?Sd0fXM$G6#z;G2BuYq+}8 zx(5e_{5UsvcR;;q>1D-dN0VO6IO99UXtk4c_WF5o+lJ(+MLxHg*^zNYVvFg#&~*iz zZ6-g$kEJ~@`6jevaP+!oT*bPlB$gPA7GLz$Wsgnk64=|tuYGq59-aR#hTnfvh7JAA zki|({(}rfv)!*UpU8RBdL(=UkhVco3nfG_|A8ia4t}vc>H~F2@CBriJg?tUVt2xIW z3b}iBlJViI!`{2y3BUAqmsh%6;pLzq9RW?5r(~B~6}3m%etI3@ag)^4Af?T&Q|hvZqm3|3zx zyT51?nqjMY_uR%OVr#MvP8Qv4GVxv9(;&lKn+vgTCA=qZ&t7GGLvlsPiE(9G_bl4o zukKYEJ80P`)%89W0Pv#;V=lmNRymEO{Vrb(zm^PRcbqxsP6_CP^$CP5aJA(|$XgS4}dnx;^Z(`^l*H?%6`t8+qp+P74rzRb|~-J=dNV zu{7y0*Sf&VQ|&HFMBN!1cqZvUS6s`U@4EX7Z_G7%9=_ADdibK$r;*cL>Jpv=)yE$S z-{PSZGi|5*v+3!#2AvJvs6LHnHzJ5}R`BHBVih zJE}2?>EN7KKeXbpMN`GSm;)+#C&b6C9W?2*^u6ulO+z+lyLH*jJzx68^~l1YJ#vrN zk9NE>?4;u3O{Zpir*)J!j@L-sKIxUscuk+u{Enfk-=8R2T-I!V$Y}VA+Xp_++dcM{ z$EeOYrLD<&0g@A)A1*QZ=z25yllPG*#*YiaH}h9qRgBl3ArSMHb~SyDV0g_I(Tx-v-lZ=PMTQUEKKar253?3+2yF-8Xveh1S#`i=vMkJrF;tmd|hfIk;Z- z!IXXGjoU6LkFu3+8`6<^n?AZ+Hpl*E{$a)F-6aY?FGoIDViUg4eBPar+&Oa199boH zFM~hv#H%=e51AsLRBC%P=$;GX>5vYagEQ>a+NTa*ncePOdOB&g=Ge8Cj8Sc|PIE$E zZ>k%%WT*9llO~VCyQWKrzL6Hh=kZu?{QA1h7|##lI}FYx9TXnFQnh2D+t%pI2kxXgYKC31POn_;^(Jlk zmqBxD)N`xGUwR+#VEnF+igyyOXif3nW-5>{Yp3-2F_o**_XmB>d3t`r!I3RxsaMS6 zwHMUIotPrEyzSVGOYYB?%T4>}7<0k8QQ@b+G;iVRNiS!~th}dJBz#E0WB>4Ho*O>W z?-^t+mq|9BA3RZS&C{bCqn6$~rtFsSk{)6EO0U^szKiB9z7@7&pFOvX?L2D!Q6Qu& z!9+MDRc2h!1M~IGhxjKAugFtpLcUi0I=W~niZFyI% zab>tzlHr&2QqPQTo`@}47MNw=Qd;c4SaY*k^4pqKHd89v&5FFYPVMx4mSW9au*+(; z>M7B+CWEGgJy0t1zZA3UIqlPl;j?soo+ZsX*bw%7kIeh^^+&$Na_X;Fn|beC$)n>zJ0?B7oP4B1 zV0EVX;-AWHg)1CYZVPRz=BNwMSRz>)MK4+;8vUmHTKeFxjG-r#uXF7hQorTHuq$p` zhfI(Rq8&>T6$I)Oi$eW^AkErF793k!M}n zgwHR?IuY6QBk>IH=$iKM3u+IgV!o`?5nf?E5_Q2krOp6Br{H@YFWW9o+?t1b3( zMW36a)Uw?9K(Wa)iP^8ud)x}wU*=z*`@u1Zdu7&sd%iuBtd7q1xv@fH*1^|y++A`@ zoD|yDdrM3=_@1%8xQUV7a@=cYl+sbYH-}S8EO-0Aomw@@P321VW9b`<9%_%;9U=NN z{9*d3kq3Dvtr0u$nQ_=;0e{8BTC11xbH0b)2>770pFjUYpnlBS8>4;CRK18 z^CHWB^5eKO;rFD!L=;~cxk+sS+8Y1J;e^cQJJS>nn{IoEjIT;rHp-u!cvtKFxiPO~ zEXJL5(rNPAe&6rZ+Q$wpd+ip)8a|)r{6lBUi@}L#i)!4OTT`u8k2ZW%S9%vX+?+nKOyey)3a*qWqyk%D`gH*|*F+dE0_ z0)44*1W)QR$t$fQhYOlz&mQ2(Tk&Q7b+5O1PRHZ#4caz?bB9dW(LAS_`?8f=7J6i@ z_8&9YWsSu*<$IQMz8DwqdwxD)kp5lYJr$>MQ(*Bn~QE$w+uRJNkWobHz7< z{E+Ex?^VOs77oAddLh)JsG4_=)(86ehz|Fh?-L$ayt)uUYdlgosN!J zNu{pG)80m}&wb`vBvlpoI{9+sq$efvZ!}L#3_rObVcnImeUH!2zIkwk+?Mfz@nsWf zbs^Gmk9iOJjk-RaR?#B1E#aPV79)78c>E2;8K$ixS2oq=2_9Bn6|8gknob5dBE`G~WZejoe4QcEs6#Fn*};mVd%`2cC^#!Y=7kURj-fZg}^^+VP)CEefy9 z5&Tf?zPu=?YpQqU>d)6_Jup2O_Hq-)IDKEWoz_3c*}vH`!Lm7ElUeH?u1`Tz8m(q+ zHlMIh`(sd1i@?%4u?^!Rj(P7;T9RqjFyVdmb?%g9lHRkUB@E7cEZ2JLurE?A`<-%? zHOD2zSZg`o-4lKY6b)+Kr>D>|1kWy)T89t3DH$u_~uJPtC4}3W*OmWk5ACU=d+%u(eH6tDQ=DoLgzN9|ILVVi& zMZ=2B-W02Sw3)GA*ySikv0tamHQp8b=Dw0{m^{4M^(|+UUg3GJ_hmyTqriFZ_H$m* zIwE0KxaRTP5fxe&Oa~wPI>GWY^(M;#WsP6`$?b1t-CHcJ6)vmwqe`xcrAx?(L2WtJbBNnRK$0UZ?+2L+*ka# zPVbD^&2_x#wS({TEw{e>QFy{o$)=>O!PJY~X3Th(IC1E) zyH4Xa2EUEp@0$9!yrg4@+t;emw9b{6G=A@ZW{ok?#voKp11cPz@@ z)wV<{@ZpN#KkVk;P+H49VwT5inZPc)wbB7ssj?8=flX?mM)y{joL!v1H;&PiTD&FTrR>%3g+7YU za;|PlQElSss+LLAspNUDmnamtVfvE<(Q5Sxe&-`MTnm|h{Efrzt|5L0pU7tgGje&D^ef}ltVYcC z()wU_2i4fV+$B|?q?6;bC(L-m&D|CptK_F@FCVn?>$N3HAG7Ot;_ljRKF&4%eT_x) zIHAW|I6fC{;a+Zkeb^WJoF=u+vSn5ev?iJbGU83vPaaWgD^%9J;k#_!KCvT78=sCi zS1{X?W6S9_(XrRKeV>m#>wTy#u+bvPlQwF5nE2l33#%ovABt5fZTvC4lA$fS zrz4*ZDq7|K+;YrM*OdB25#Kh?yneXD;}+MqX%B<5>F!4#EDn8PU!<~B(Copn?-MN- z>b|a+m!q&O^0rkzPt~;c1vPCZH!ew~&-djy+pqo&nFohWe`hl1gz=TZ zhoXd!w9L_{u)U)2!bx+kOwK-MrB#N{r(a7H9C~Rcf8Al9u7ovuBL>$eZ;Q0o{8VlB zPGrIPFX>wQC1celx}Gk2ce%J!=;E3mCYxzRJH@7`w~N#b&fFss_i$s{v}-GjV+5Y& z(^e!1k1C70`Z9Fe_1GHOQnMAEMH;1XKeZ=ZIWTD6ts~xDoHcjW1&WuYZZrs1-aD+t zwqy0-pF%^o(k&BTj1S?P7u%$pc<=Nkk9iiGZ@GS7=E40z*Y(xJ3+p{^I3}N7akTnHyxR9Zw*)R#XLUWj0Jat zmp!ObvN}ELzEjnQwI;*3@;)7pL(`5akE&lb#l@-H`)2=D)%=hEc5?jB^L3L zcJbMujT0XlOb@kIT6odum5^P1bcy;Vt`DokXBd?7U+YM}sIkuUbye~X{&M?*LsoM> z*iLJYw7fX~-Q?%0mrA(fTt1$axUV+!mALlm{HDW}*F!`r)yMD3zIQ5rrSHrUU)9pi zNM7GM_U)j|Jz)=~@gKhLbZVmcp&Kd7A`d&!E55rIG6EhtUHZ9U$lH;FSJ&x@+?>pF zK-p(~Mxg#F<-L3p{Wp!dmR%bCm^1Pv|B9k6`zP0Vyf-@QG|ShRFKi6nRM5r~b;Pe> zlHw}E*O@_cl~NuAaCFJv*I73;T6*@K@)D^vh2jD8d2XKw$f{bIRvOTp`-rP?XXlt_ zOHyAPHvYl8#Pr}9m-Q0^_G+A(mt|c2W~T6`9f@!F4?5Gkw1$>khNZd3wXr)q&WL_5 zy`;CL@R<9Y%*&mY+s=nurgiDvNjTh)x!vL^*Jp3JcAX`5HBmF9+}Ba}7X zxkmY>#^+||WhdoFg{NjEWEbT{ITz&SCT8V_CFbU(W@kmYWoPB*AymS2IQw!#?xG>F zLT`=*@~)COlgYiXD=o)tTYUSLWeMwzXWbFnT6uSjLi>#evsxNf==vPyJu&{kL~gyx zXN%-(N)kkl$agC3PxBac^!S+_2Zp*%GyO$YwsHyAx^v0=SD>KAvOVbm^eu?|> z>SE#?|0tS7O9mr8-d6bQ2SJ|s7nHJWMvA2Rv^mDy$Q_luxxS5KsCyHq_mAm<4e5vY zwtX!TfcjcVT*<}x*u2^c=Li}?Dd*M zT@}izXUfA?Ejv~xyzNBg`bu~o_bjgHgDnE*)Y|zE%p9L>AnKDcY`1*uNn5?7!zGS) z3mK#C(2grLtke;?(J_1afl-Qw4l}m3)od_ns(ilrBKK(1FGzSnDerRWl|m1z1k)zz z*=F*r$Vga3i;92R6_}nL7n?EomSN&_KNQ#bdKn{Q+%}rr$u6EL;b(+DoNL*i7|?!1 z>_uhu-0`!Hes7h(7w4&Wd(ivwjq?(Hn!XK-J?MKa@Q`&rI=F9>G*lR*x?vGq~u|->D<@Nm)r8mz@*_IEVELfp$6LsRq z-i%|lN>eLeA1<$1E%4|t$LfXy`Bv^XUhFGsST{)H4(C+KyLn>#@sFq3BrLT{%M>h) zNE^#vC)Bp?58fr3Wr**ON8GxY~h)i(n(YJd5V!bB0TQX<>bWTQRW#k&lu@h zg>p?lALusDju?AeHm^MP zvh38P;~N{Y)y*HJ1T8BPxWeJiUv*THu416U6 z-StCr*S8FjFS{SP|5U;njn4R2Yqz8o@GZ%t?_}_S3DeXP4TK(CNZ}1 zQJL<6ah7t21=cKRSS(n5)#f)HwR_ zVbT8VBKITGPa}9{<)jJ!amj{}6va;y{bPON!ql?3&y9bi$GX;KNREEQxA9Gb;LVV! zoPMXuIjmwel6QQPjJfXXp6Yq0D9g?(t-kDTL~~0Lf2+e=n_CvaWyg1(U0-#7Qr$uK z_CF384(>d0V$P{!mkgJb2XEg}p~hu?{n!%5&8yns_d{xuTU7POCY4uu#h#(drHojr zo2_F}&0n!;fxv0GR<4No9dtdR{0N&66pK<&Hp&FV9fKpvMX32#s|?=z^0=YHnhDzDsUwk!w~#W@2t^exmDWM^w^7cg{^DL{#FQm>*n_ zn-m+L=$4zE>Eew0xP%1As-KXN0g0mZoF8I68br5pqm36C+NB6dy7K zhtl}`&?<;u0=xit7yMiBI*=X;-Vb~Pcq}(B$lXcFIXfdeS1C9Lw4@Y}o1K)Jk*J>< zpNaPip$gD>u?sG5>Qpb}0e(1mtyx}(f3_FOnCXR<&+$U0ayyS70?$2gS7>N zT_=L{42Zixm<*CiN`i?^=Rx_{f=fyQfIAi9$zYGEq*h=DfEk1j*AdGKMV=74gFWYi z)Ksu~rmQhw@A*&)oTosT1p9+?=EJ^*0>v4*kv5SJ++Qobkg%&aN^|i>lRdqG0*!#U z&-PuMX4uz&?K@z-G3ja!nR)&ZzA(7Ec{;mV=^G+QJF=%kQZp0tl>8Ell!CG|W3#&V z+YwqTQvCpufM7WKiLse+8Hq}f!7yD&OhIq8Se`hC1 z=XEC`0tA$mSd3%ge)THsTI@rKdqSmmQh3o`l(+-b_8SzQrSkJQkZK?$3QI_v zzNy#axY3Ui6S=l+Ga`W;F3X4XM89Q$Lgo%@iCr_C=ZTgIvvu4kkJ8%Aig(Zs? zFIl>5`HGdRRKIRx^4T8(w)0@@7Y_nZ~uXVYCb< zr%sw|}n9=APt`s{i8i){uB=w%K)*3fMX z-L^oP0%Zx5Ay9U}Gy|pzm_|TsfN2860*C?Nc0OJGL0gMjNArLblDj-%+T|*fG zZU*%YO*d}dx_#%~{Ra;pw}Ap)zIxN~t`iL4%h&HeaQnxOC;;04)>Fna~2Dd3?JkCnJzAfqL-MRbpse=%UPOo37Y87;|RiN{JjRKiG!2TG<6 zzz&u!gSG&@;)abdKw=dTD=4oxeB|h{<0oorPo2ii09wKI`o^Z_TP@HF5CuGMe+gXx z7{I5`Z2M0sfM|fF0%!?f2BayFw!p4~ft7$K40y(XyM;e#5dF*=Sd#|koB=lnGGoAo zz|;Y53{$7UTmjkwWd<-!V5$Ij2D|r^?ZfThNF_@H&gj_H7P5(?{m)kxU-3 z4k$Z-wg5u|^ata{lkNbw1f~_>hJgD5Xa`^fFd#5B0IdK9gVVSp#JvDZ0gu{X5O|3V z06Ks^``@DhW;-A%z?}g$gMoCw92;<#&|?TNMs|0MtUf`DOqp0y=mF-?)D)W8En+*s zZ2_jwc=k-p0H)4N6~MHas9^qrl0{3FE?=U^nb%2dFedoT=w z0$#j&)Bpanx&dl5pt?hL6)?L*R$Cx;z#1Bu-6EMLkintb5OBXpP9oU)MWgPSLhthk z$__|dASV%U4#6}7qJr#Ex!qQP8^TOHB*2IOMgTnlGy|dmXaxt#VK~Gl0Mh|z18fR- z{Nx$zKW+e@yN^E&+CLp1e()G!5r7Uz$Hx6kmiImCr&dE zuz{z6r-SD}kOe%XK^6zd;s9A3z{CL?U_=9t(_DxHWO0BjIHurn8f0-nnhVlgkmh0_ zU;$49PY2Hdo)d9`EKZQc39>jr7AMH!1V&Df1q}o|PD5Uh#R;;Y$$*D61L6#bGZ=^q zWN?8DE|9?mGPoc=7v$%H{9KTq3-WS7UTAFKfgkd6L0)KjhylC|;AH?W1Na!g#{fPC z@GyV}1}e}rI5-$wTs(N+xOjLtIN-F7M@j^r-APG_;5n?6lmr1iZRYTVPk4ld#qqhX zu(-GYKI;*e5)mPsYD`WwCMT5v_wx!0s`%_!K~FJ5V)6P>#>1e(lu2=V63&sp2^mJlMW(?7 zEG{lBEe%fBlOW85;RoxLxlRCj0u_NCl~q(>jE7kcs1CFS3R6;6fyoc_^w7D((g5rU zXa^JnI)S}~9fh5P+C#;m&Y*XuD9|HQ6f7&iSp%Fwf@+zfpqFHdf_@Pe7GQ@#drVQF z4W=mAJJ>PUCr~p}6sV0U3Kk{c%nP~_&<|4-tWz*W!JaaER?q}f6tlAhQQhklOnahp zF?e{uYLr#AboKOx=;_(o+dH|qIJ>wgDr;!#>N+_)`v-;%i-;H=5fKtbMZA0hAs!kQ z79E?IoSK@Fni`)-MWkgFlvP!&ZEV~<{Q`r7gMx!&;^GpLk`j}WT-|;A0|OHh6Vo!X zb8>S><>qE)Q<2CKu-=;3?-r3<3(&nP-0$oMnOJYzQoIputpz}8=IAv zl$}e~t=*9etZPmR)JU45v-x(HS&B2Gf6rG zQh4<}7PjFP`&_aWb7EVHg~A_lWCZqaf=rPaGDjB35?TGtoWI$AYv8vA{!9Zgj95k-Bc74KNMs~2 zk{KzCR7QYMpiq!duuzCls8E`6;X+Bg$-F7Nsk~{t>AV@dnY>xN*}R768UJ(s zcK#RqFZo~bzvh3#-@*Ts_ZjbV-ge#>yf1lQ@xJDL!`s1|#FxyM!k5aI#+S~Q!I#OG z#h1-PbWdJpslGH-Enn9D#H&o-5!qj)c0nA;;X< zxYT$h94)~URMtfhYa3hp$PtA0=hw>c1UotgU-u%#ib0qH_YZjc2Px&h49C+5B=8gF z4U~(I&&D`3q7X8b%b z)8|9{NB{{UAta1MkSG#E;z$AwLXt=dNh28~i{#K?B##u3BFt}U($dyjhmZBlav&bCYP*mL{wssxG0HW617Q` zP$12W!15S_(QA{a6x=xi6c|%tVO&c{%D^YzU`Yt=;S3{V(JjEdF}bh?-?QyG(D1pQ zG*=kH<5Mb}Sf^&C=4U1*q$Z_i#pY(DCdbESIbc276vS4yr&MVEL2H;RGElvp2mE_M{lo`k`ZDzjQcx?JJ+T z3QYfn&P62rN@q~?f#eTF?^`bK0P^`L`u|t^D>Oj4!UNDnDEdJAH4we;{)+z%Ij{uW z?eOt+fK*>Ok^|IJijB@LN1Bb!ZdWpFbasAOimu*W6J|t?jm|D-Fq<6qEb^FbllzpDSF>>)hYTvwZp#0ON)}zm#$6Gv7XuWsWSjw zm#seR#|ztu5|+_N4yI#bzjXSqc4a`x$Ms~FZ#V$mh>gx(e`AV1P`Oy2?DARl@4IeS zh~+5#T2J!<%C%slv&**}fNn+62dd{lbf|v!@xnZ~{uqaV=Yxey9LLSr7Gj`gm`n8V zpi(ndfvg!(m9XVcrn9i zn4DxhVyCm${}(#Q`KRUn89#GRm|-CXrC;mmOVtx^X6X~lWF0TOU%lygD;?&JyNon*gDCz#tN%dyVK14rU)W~ga$vV3bY|1;rr`*SAD7GS{)(=}&J6Jgs{T5C z=#j*#5zMc9yC{mkFMR|>$9iUWBiZOI{p0P?1JGmG=qx$7-;V2tj<>VZ;c{%Zi)Z6! z*M9;<|1&+a^AkJ&3w!P^6e2AB41)R8!SPnN_pkd|9g&6MtFdaJ;Iq7*;GubM2;84Fuk`NvYF7CF=qHz z{A{Wu8Cd*(hmPwonJSE}>!jp>#+0CKQQKL-nr~ow@A?Bj*e64P*2~Tpkt0XzMaShb z=>w0;edR2rqE!o5;~wB4;}GP{Sze7N-C!v z(D69JlCuiOU?PIcW#8Y`R6mdDxZh*(uc7F)KJ{6P3jv3(*|NKJRL;Ki_5ILs{aO6f z10LO?Hd6ff{GHux>W7Zyu;@nY%n;wg#?RiLZ>8u0efYQaL&x%2bmKn!J1Bm^KJ?Ol z=vWSmZqkQ;7scQA!ou!;=vWSmZrVrAUW#A15524(I+nwt8}{MfPx0e9E4w?;4;{;4 z(aqSIAzn`Li}s;c^h3vTSakC~{D&!ie2szK9qEUT<*?}R@MJG{l;W4@MMdaXKXfdI zMc41cf1Hh<-L6P~0=$Fz@K;l5b~={NqW8TzT}$yxQpkdn{m`)-7TuD?Na1NVe)jf$ zhN4UN;V1Q1g7vTg=*oTQ=ZPNhm6~7A?;I#zR=JpmHLmp?A1{Ff+{X_zKH|K+^~@X* zFr6hIqRep(h|c}ci-CsebgVGSvBv9P4BZzJOKUX0Q6e}&|3ze-yVQ|hoZ~i%CWh-K*z2x{T{{RP9Y2KQxQ29 zfx=b_W&6+{P-*Qx^oOKeI;`^dKJJewx>6tdV=BKqg)C^JB7<233ZJm0S$2i@lx4S= zpGC*4&u{=voC)3Gb1KG8$7aW(^WyOo23w{U5qd#loQR!{`I&SC*E)K;S5%Unj`>-1 z>)!0>4I4kZJ$F!asXqK~`=Mj`EIK^!-OF`SDV{#_g!g#Ais9a^KJ>1B=vY4C2W0Ob za7+IP{4gznD?Yv5Co0KK$8uQop}pDB7b?vzACtaYVmfi4J>7b=Oks0e;)0zWx~h2s0ENeZ|)SU)()#@Fro{vbOU>fsoOazG45 z29kz5y$SLH@Z9`fDn^pqNp?=mMBAzLsSkB%Nq=c<;fG|7F7hqa+LtFTxCFEKm|ZuKsAJOA-K8- z2r&&nELRH<=hH!08iKpbxFIbfY6*z*+W_MI(nmaGyB)&Z_+CF=;Nuo`LwqD1iuef* z1H^k02Z-|}AY2;+cftuky~IS5;Dhowoq>c1jzYK;1b5bn5X=L_v3w*-(uIIn&S-=~ z1a}IGk@|8Wagt^r34+{c5J4U!Nl*|;5riwP1Z9y7K@}uRP!-7$)I@^`Y9o1qx=4ZG z5Tr;@4=E8eK*|ISkqSX0c=H0Tk1wIxA!~yE$cA758cHw_*%Aywb_9cwJ;4yj-(kVo**w^7R2~a z0!j0uM1sO7iJ%BdCMXJsb4Z{Rk{*Oo2}%QEx(vYr(ZPT?hazCAXo09CN+WzyD4n1( z${?tMG6|{z;u@+EED+TM#5K@GxK;=m0b+S(fCcc=N7;mKh;j&;qEQ6RQ7%DCz*yk3 z1;jOUKzOea+(nQ_%5eh3@|_75h`In`K6jK)_&iYoL3mFL>{qI&FTny)KR{d$e}V;~ zfq;1bf&lTJz&*jDxCUW>SOOgtLWtL0iU@L}(FA$W7=i+5EI~muj-U`4Pf!d^ASjL| z5|l-g2+E;ig7RoGK?O90pc0x&P#sMpsDY*v)Iu`|YNMG1by>A=?L` zy#ysu89`}49Frkf3FBEADR(g7F`&y6EQN0ymWiH#v?3survz9FsElwa2=0{GCt3B?`v_Xdm4n>CvI-ny2odB^WoC)q0bp^y*+yN_LkGui#e)uD-T?F^x;94QL7pD^H zdr~wQ5c7usVvaDtW55v(i1Q5t#QPtLjzWmw?sBXp=(PZGz68Kypoc_)WunP|IA01N z&X)>^^_B*Rk7FF*Q@|v^mw@r83PJ>TvSaNaGzt*Q%>~3I6#(LV;}MpM&;&qS&xr&p zMJEB`EyW0zhSx2z)gUwl;ZhNricS)o4v6K=0K{8nAuJWo1y2*?MrQ~LptA&p&^dx4 z=sZDDbb+7*x=2t8T_PxpE)!HkR|smLs{}RCHG*2Gj-WQWPH+gSC#Z)S2pXYAf+nbm zpeedR&>S@rv_LlrTA^D6ZBYwBM|7K@3%Wzl4c#T^f$kCXME41Lp;m%E=m9}r^pKz* zdPFb~JtjCDwGoU!PY6aLe3TH}o%D?0Nc5awG-@Xpi(U{+NBAh>`P55tTrvT1&TRCG z&~wmhf_dl-!F<#~un^%^fZ%zDw_rW+RxUt%vI^aMO zfe9qQ^PWs;tjv^PEWF3DZTyocRIJ-EYYFl>sj9Fd7zvHNULX{b_`D2ze4PQ7^$FsW zD^4v448en=!J-=-)`YmgGr)7iz;>W*4-vHg&A4&Z2J9G~W~*M}npWB`r5KDZqAvT&K4*bf6nsw{dj@POw6&!CVKkaHG- z$CbcC9GAmh7S;hNYb8WBf(J)~A3PNddV%L+!E?l59yljo2{qlwl)&VGXKsOx??+?u zz%#omVf#kBN7(<*9PHlzY4AmgWNc}s)|FiuUfb|do z0qA(~j^O>oeK6T69?}~NKmrzX{?cJSrh~V9FdfNH31e*}h>IcRP#jDkn{brmhJ4); zp$4#^gx8e*o&(|iGJ7UiIve%b%AKDl{$`FRE5RVTc>AexU)P>@*ywMfRp z&yP32!`pqY;PqEoUVgZE&x?3*CdyIu<)a+8Aj>g#il60J{46B-_@F}g9V|=-IiVW; z9h?5@!p+UL%-7ApOR12bs#h=Q=IV*`)hD_Cne86vzV|ZY?LE2wEQVh^M8iMqNP@(u z#Z@jU0h{4v2Kapj@K}1^%5;kdCXfIxd|*nW@?yY(dpov`e-ed?bvtG)@m)jI!C^-D z;5H37*kCxlE@p$!?s~Bza#D02pu@`}m^JLFCI^j^#vvys$Kd8Ae?C42H~e{d_yzEL z2?d3Ccwnm>To$3h3+oUK-V%YwHwL~b1V0P@#~&aUPtRZufyZCw%!pNPH^RN|aA*8L z?%&_UJfPjhcSoSI16AUGxrV>1!KQ)#@SqG}Y;X~RYSG=ty*q+8;feCEZG_|+coSP~ z`$lQFlZ3|D*YW;ESup<}s2Xr;)BmQvW&ck9*1&HK{MNv44gA)?Zw>s`z`z<1!Rw89 zS*wrZgf~zBcE2_7->m@}Uf=0wL4hCU*h0cWLjA0c2;=GZ?>Y8=_i_DQyMZ-8{#h4E6!GT3{2Au&E zI*^FR0p;j4vJEs%V_=Q{rw%HH@3J8GiU88!S`)tag9ALi7WGRS?nS}(s&IhE_odL0 z;x|pWOOB3oz8S$gvgk2-5Agb&;-yK&=k-G&YYW&=SxC&GMS&<4;O&<@ZK&;c+2&=D{Y&>1io&;>9A&b)w&;xK7 zpeG=%w-;app!YXzQoheO15!_4KwOR=AeJ)}_+gMO{k<)XB}xJgXg`-zSeyS> zuoj+JJcUl9Gw3Wjht8u5=n|BB8C^kF(KS?uuA_R?fEov^%LDWfJwlIB8+wACqG#}2 zRXaQ@^%9#BoLh_J^cAt5ON0ruUSA#N%o)?fJ| zn2iJyIP3`|B}A}n4K+;G*VRy0>!uKX4V)$ny@BF_O2S4lX!p2!@b71D{vN4Y0z_aR zAhZOP$*?0csRkr5xS?GP!2!|L665biWq6!Q3~pryhVDOG)kr=FFk3%$8i1@$4B^){ zgDG%hML!N+JlNM!Bz!YRU)L`;+{Qwu;Q*eIV`jjS?(8^165SC^W5?recQy z_LZCbn1!$kVA3GO3`})l&R)Ku(K0X7i`&Qz_3-de=2M1m!gzUk4RZAM_EzFk z^6~NU_4So-^Yiml^UzY3`o$@$duu95|KgN1{FozwEWG*E0cMJkFyG39+nvXuX=opH@ygOgl=eqE*vQ z($3J%(=O7k(5}(0(;m~F(4Nu0(!SFqVTNcAv%v_M8{#h~kAWvXrlSRDFX)?6IG)0;+O^v2Wv!VIXVrlWTBw8vh zgO)?frH!Rcq0Oevru* z?JBK~_K4O-drJF4`v&y`2aoL1@u!;LlTXYqg~2zB;FCn~H6w6%212GpSlRGRA_kmv z(CGpKFrVq=`rdcA$sE3RZR`sV-1#DJ@O{%`VB2`0rWhlZd{G3%ogm%} z+nf!3(H!tNjq|61kFoGY2LKTqQ&%{DsDdYmj=_B03y!i6oDT%TT%GmS-WWJPNq{GK z@Ykx-z&di721CMVcw%QXJk2p4p3r#+M`0Trg;Fvvy-en)m%v)ivGM;J?J2(u%J+ow z@fTe1*S$ljw+6?MuUI6)GrhR{bU6M!E*fmL5UgPwJSj8@>;RX){U4U^2IoyxVEJWm zKK0k-XTW!AdR#QvVo`VboBv1U?}PHa&@Q6?066yw>)wBM{b#~6Q$4P?{r{!-?`PfY`fH-UHABtOEBVXTf6&IS>8<_{;Dl0u(e!Cve|itb+qTaNx1dd~E)u6{k!W1f-SB-?JIJLoRD2Yp{F+Zp0TbPIZG_A^9W z&JEJ;Z$rCpfp+HuM=b!_{4hBB_`5f_t);^e&xa#D5p9P4e;2fm9v6)cqQlT*RD)fd zBV{*%CE)YPm*m{?1)Ntt?P2dH)>D2nY4`Qe>I0$84~N#yDj(Z=0kp13Q2q|E>>d}5 z_Q5-njzGJu0h>GzdT9cC{AcCkc7F$K@g~@+7wo?u^f_TL!o-ojE)A?6_jQHPyS;;+ ztrU8e9v6-F!#kHMq2=Ha@d9YK3EIGaR{kw0-y6m(e`xdJ&<5kX%g5ggDuPyq`!ziJ z_PA(t03AX{(FtgsxD{Q2bN;%2P(BUH1fxaE!NxhzY6v;edI-7DW(XN*JA`6r7lh)d z3_=NX5W+#|Focrm7=%)&8bWDw3PKrl4nkRU2|{_)0HFeEhENgRhOijjhj21_1mP6) z6vC>rfDc>rohl8&Cv4^S3_4^b|Jk5D0mkI`5NU!jQ* zzD83Ze2Zp4_y)~^umdfC@DH?@&H+n*%OMm+Yayhe%~T)Y2}jcxd>~j=72s*`RbUfU zU=>wh7hW*_`GLO%J`;FG5xxts?K*6$gKc$Sjdd`Jg@KO%9|!Wnz(;_O1HLfu5#ZyX z-GqUU03QeCgn^F$9|x@{415ImIFNZ3WS)ic&O)9>kXH+GYJsm7w%0;yt%del3oRDc zw-#j8Lc6SkxD&JtCqNfKJi598x&e9sdO+XM2L1_Iduj)(Z71tcFJXHvsa-9p=W(#> zzK#Y@fa9K-IX(=bxj|PAN`*hm;cgf^=)$oD^=x1<^u_)=X_66V2G1126o%t0k6REk zcdrmL;?aN*aXqjj!vW;PFK|U=>skF%0*mXtzW8UO4jxzVn4{GFV~su!yVn@8Y}TqGUQ_%G_2}XMHP%!9 zX6V;B!3LOLxZs5=0<85-<~J^6$+#v5eNB&)yU^QAg`Q$Q^biZ7XLt(xw)!8I4~Gm| z5eJNV_*u%oDt|Eaa_r?#hCYi`{<8m3`G=tV3(yDQQJ)9ij3Cgx|BW!(;B{E6e|Z=k z*~@2+{!IO^gz`5+zxMa_Ps48(g3%6NIoJj5pAO?ZzB*72Vi55g`czrAf1^yhzrpiobq8hs zqkS_1eq-<^;PHDh4Z-90Q{s0^!WuFh5d`PrOpo9Dg_oFd`S{&wR#Y6PF%L^tfAzz9 z$NSH!-`~+ie{%kc21U3A!+bUwEE9jl5r1Vd5!wv?j$eBjK6Upkb})Bx5a^Bb2%z=5^g|MxFF zNs0Iz1AoyHfB6!B=`|7d1=rCTT4{cwb9O>vyk}Nker#5JBKn@BqV2G!#(m!R(#YA{ zL+=l_(yizS|L(UXeyIwYbGPDE%i29@qJAF7UR*NnSTn8oZfIL)Ij^Mil$hkS+r}P) zui2EpPNEli9p%(ij#>3gs{WwR`~}-e{dWC7_Rc(Rvb3u2r}p($)va60t@ZA=Zq>bY zmjVQrz|62X5SRf51cHFg%*)Wy)7^CU06HLpfI*2cLCq&INMs2p2nsF;iXdPl3Mc|m zi6AHl2o5fQfXJKg^9}=uF`wk`O!u65`>o|J&vMT1{Lb%r?r3oHrPu$;7k~Mqk6hjF zOZ$7j@Pm)~#Rt_s{;7waZ$9pEuYT(Nf6~0$ON!1j@A^|0f9k{Ud*`k9dfprF@#g1# z^ve%_`*&Wudh4UlU-pa#eE->ReVO-?PoF*d?yEof#(Tf~^Ml8J;xYGo`ucNU$R2Rv zEBF4PcTb=E)8F-h@A;uWdF-W|PyN9CpLdU2FW%`DFMH-q=e%dV_uHR;#gD$~su$n$ zg)bf7@TR}|-e11Qk6ixDmp}d9?oYkrf@eOe{IoMS-Rsx>=SzS0ZGZZbFaP|TzW)$6 z-mCxAO(I`d|6TgZZ~FZ;-}L*>ebeth`%S;o%pxB?ciG9$KYHn9m%aCer8~dtTkmoC zne&f7b;X&ZvpoCmhKr|fxc*LuuXHI(u^DufFpzj`7W}UCwJaT)g&%izipCs>Rfci9UaH%)T?&OTNPX&i}|>IbRle zEk(^g{({I`2tcPlEAoeb!=8F<>e&3W$nSqbSI5WKV|T?&tc_`ygY zmvL_|#r^@ilCk(4?ANf5U>t&8SEKZnTfX1BN>(3xfV`cbjfY=)#3_7i_sjYs)S6HTP6M zZh4e_!>K16oj-Ny5)aeT+UykbwSPa&KK;0(GZ&9eK6g`g{yO`R+t;1G_L9wm-?cWs zXAeAe`s}5LeBb#ayRgsSc^9bCtMkNWyy z9)8WGqx0(3uO0Xi|Lm2M^Q(KdZ?YfD1JTdg=hYRRSFhlD?5BP0%a7z;o5{}b zkjxuTU5}f2($N|F$&Wv}aAe$iWG7awx}tFO7{ zwjMfZ?`!UR)pvfwueaRmYPH+X*I#+?x8#SrY3;pzJ#%DVI%lh`e@>q|15ULc ze{|~n$zg6$pS!F2+}U%NXp(a`UjKOe;&~qaZu7Kq`^>o~pZEUV|N8g7fT&3=}h5sqltC!N0b8$SEhHadFB`J-zu9bI?QGGA{+p6C57 zd2!M{H*&_We&z-hIW9dO^l%+5bnO$q`SbsByL|Oas$XxrT;|$C9)J3xed_%AGpDaT zXQM2b;C&?-+&+BNb2GAC+AOZZ~y$H z9sjrE;^-_rckb*BM`xMSLL22L?fAd_?5PXa->5!#@oUFDsQ!7}nRA@(?Dh8fbIiz- z;m0f29bI=@!#v>hwHMA^JomUu_II5=xx0JD@z>hn{-+;%;naoiQ*(tqxNo_=dG4+J zm(y-D;jh1N>V|K_mEA&VRlbAyu3oUup2ExBc=icr&pr9<-Q|{}IL~uF^PNYx`^ATy zK6~A{Ctq{vq#=aYAA0fV!qt!cUdG0KzurPB{`21bPhGrpIm7lzM-M!A{>Jm7Uc2r0 z+YTcSz|%6%@nDzZiS2*(H)5CC+y4IZ_x|}SSHk7}pZ-1zp7Wdk{?pGt18(&8ziL0H z|C_(xc!VE>RlWVM;*tJu{@(t5`}TnJ|M}0td(c&vvnyNS-S;XU>wNO_UMD}VIeA@0 z>-S!|TK*8b{m)x&`^SBNT_=Cua@&vlQMg6n7lmUKo>90);Twf>6y8y|N8ulZgA^W8xJcn6g_9IsQn*RsCxxRFo>I6< z;VXr+6y8#}OX05*90nd!xJ=RC^;X8%%6y8&~PvJj>0~H=r zxKQCkg%cHCRJc*$M};F5o>aI};Y)=x72Z_1Q{hi_{|b*PT&nP?!l??cD%`5@tHQAg z&njH2@U6nR3hyf1tMISF!3qy6T&(c1!pRCRE8MK`v%=8|Pb*xl@U_C(3U4dit?>5= z4hN4bT(0oB!s!aHE8MQ|yTb7b&nsN7@V&zM3hyi2ukgRh15`es@&c6~s60XC3o36= z`Gd+MR6e2d3YA}|JVWIhD(_JF#~pdd9eIcv1$X?pqXkr2-o#W5%f=MfdL{N)>}KpG z7%m8H74MhuSJ-o~w_*f$xdM9*_6L|oB`6@&c@h&;3D6 zo%jc_CjR#YnBC@c*p(f=huw@%b~TQNUFh+CpYveP!B1bI^L;M*t=Mz$*$*D^{+R2; z-ZA02@!>a{+{cXL&ABi9xxM5oE6%s((k*pE{B-!;<#mr=eLffP`H=77^KXtg&X(it zI4=I*-gBOm^JScuSfCo~iaYW9ow=^N@cv!7&b#q>h-dfP`96g7pAm7dya)Gn8Sh`g zecqGv-JAQq58uC%pZDeWf6eRn=Y8VH>#pYI2l2fJ^Zkc#obTdz597Fx;QdE(p6}*- z#F#6-hwnd@>$sNRkGQVudH*!m`MrGp4A)KUx%oUFxxn!*aj8$@{ikrB-_QA;%6pC4lb!=K>&|G=}R{v+}5 zC)q>#g?#@-Jp1Us@cWC2i!bH`7+%fsUL$hVFYx|r*=zY1 zIo~g_hw`uR{a@wh8~FW=y#DLF|0X{7W?p^^-+L?He;dbnJIDKP9QU_*{~es?cR1hg za^83H{daR6zsK*t&vm_r_y2(Fd>@~GKiB;~`2HVqiGRfL{+N$`fcO6=_xUHB?}Oa; zhxq=7`H6kuBfS1+{QBp7?xTGEV|?!~`2NQ^&L=qDCpqq4@;>&OPjS9abKbw=`?qo( z*i$~kb^SH(W6%2=KL58|H+J*iaUY-Mc-U2+<9+Px=Q$tt1Aou=zrauI3)tB&@;-Le zm-sxk{s+E~eF(eTmpLx>VJ!Ve&WHU5M)6ecjy(l?4fbKIcg*LpM`Jf*FT#EmdpGuB z>{jdx*jF%x1MaZ@-`hZqgFF7*(E@k0z#T1cTMIx19Fry=ll~u*G9QyVpVTi%?T<;Z zk4eFgKY{%@_Cf4_VDH9$3;T8Kwb;wC|Aajkdm45F_TAY1u)AU&reS~2iT)J(E$mg; z^RWxqHQ1do1N&<(TI% z@B`QZ`#9Xgf5xuHD%k7cBhFwp_I?`gN3hGV&%;-|8oLf#V(*8?cs_PttcJZ6ZsY0L zJuubazll8?yC0@wANVx)gI&Nb$A;Kne2VtRejGcGU4>=X5c}d^9v^=cdk^+j?Dg2s zW3T$Eseh~2-iEyo`y^K8dlq&%c0Kk2?5)`6v5fPb!Cr%X4!fLddI9!v>L*8&9Np9?h_QAYuHO)ZdHbDs9>rbYcJ2yxznjPpe;b;D?*Mh( zo$I-W$iKau=cC+HWPWe1?LIuK^h&Va{or=U2QIscV?0pg%MStvUc=`f3Lo?^a)n30 zT|JWLnmkJ65swkM-zoT}YtgqHaqZW0uG1pZCvZ(Su)p^?c&sO~um45XdEW@`e=_I( zJ{s&M>}lB3v1ee<#GXwp@Q1*L&k^~@AK`g=|Bm~6p2%l!5&6suL_YcBA|Lq=a7+JD z(VvHtdacNR{zdYb zUq1{lh%zyB$(f0#b{h{(VBb9gu~z4sUN zDR};mKf&|({*v1V$N$!+;nQxV{XWC3|Fy`k{SD7v1h<>u^}Byg?_!GT#^L)SJ-{A2VoEWs;Pgg z*Y1vG*b-}CxAMLBV6Ve&!Omd!!sghmobS!p^RP!^A@&)r=~u9uuzO%7>^HgQXJB{7 z{(<{=J@!N_#y-kDz7V?xYh!QW-k*fU*oSG4AII*C{UdGkTI>j$Veh8heh|AW_G#Mk z#n{6z4SPFnd=qvj>{GP)%dkgdGwglz!@tL_!n)Y+(m&6|?vM4b_t0lQfjts)uusyD zufv{-eJ3`;K0+VA7JCME4HjZwqVInndjBI$g_X-Iqge zDQ#ycUd5C~#;z&mKuR&H^HL(UeJEkakag`K6RRv8ZzH9{o~M5HrQys(8|`JaZ^?Mo z7pFgyiZhaQR+mAzkYvQOXqOu)YHOL#S?SXW#F;ikvkXak8yQyi;s%bG4SCFm9mzPYNnRO=Z?{An`*MiOvS=sbRM*nULaBPG zjFXNe^_5gtq3C%_*1Xq@Be7c(F?)p=_COr7F8jDGlj=mOi6^FC5zSo6cCX2JT$biM zm)VXdvJRF!?bO@h)?;;bv}p(WX-DeFom^|dQSb1J=qCA0QevKdd-&0L8_ zU768-Nn5~{hF+J&0Lpc(;D-1*@Y}uUFrF>VP=av8pwgyN2Qg_lDcH| zKq|AfY{IJO-GdzJTWN0{30u0cr9rd>O|bv1=RY?5C2qEYX>FL3u6%*N|=z$YNWPVU6>J%&k>b zX62y-{Xp93PSR0Zw5SlX>dUI=F%C2Fce+eVJOw#5#0$Ezti(KNcp)kG>z5oEWV&oP z&b+o2y)aM4%Cw)zK5Q~BIsb4d9d{;PIg-+1B$^S(I_`^KTS|rb6B>2tEn_JK8}P?U zl4V_@#!ULLBk`soj<%K}pdU)1H1Qq#C3#6UmfaweQQ4HBXo<}>Bh~pvw48Prwi!E& zCC!usf6<+~Qr%7^a9R7;_oTB(#2fJx74mx zOWGaFYTA=p>WS;%w--bDuaKeHXIy!*YIAS>gVc8Thk7I?{-kUL(i^9;s4b*$$~;eZ zg3!R1&Klp^SmBRjSyhLUGryYSg~ZAiHVr8!wnRQVRGE8m_6?qfy%96!xo!dDbD+z- z!93}N(#oc??QtEgSkkN|b&vVmU>@L0w4p1rRw07}uNhq_?Obtd>|&Lz#R@tyt?r2{ zx|A5h6Q4Oh@cGVIoC9Nh)s*ILFJUi~B<(VGV{zgJ<6Zf=m z^cJ)aW6;?3B*7PH!5+W3k!HG($%Dn`>2Kj}#y zAHT;RtrqyTdQ9IlM{B7pyDmO=z__c)yv`HYm&}>6iowiP=4o@jlVVhsW!@Kk+L3I_ zTni(K*&C^u9>nas5>C0txGR1qmkQT5&AU>Y?Zm>Lm|aimTSIdEdetptS6NADRi#IK zstrRKBtvP;*K*Lt%=aERWXBksGB?YNW5x*nXomk1VnJ9i@3uKR6j{8-XP76ult+85 z*V5mZjAiDH??}qHtMmKLWZd~Z&=aXw)Qe_ z6VocpM`BDDqH0y5y%+<7xhLBQtW$RQ+?+W!kY0iBFD+#_V4lSENuT*%=(6f&l9o)| zW=*Wt_M~4MJT-W~s*48Bt0jS?LydTYU+kD-8y)=nTy~`mn5z#?qMf*}1?O^fO=?*{ zTxT8eNC$tk#3B|MwS=+ch_+*#;p^C4M_P+eEaqcG0low-VE+^5cqG--lv&S}?vC*Y zHfvIZH_Kb`db-rco=h#q{2-R$vMM`b^RmwU>W0*57rR27BxVeT_($flVRdD`V}5t> z$IXpw_7z!|@C$5Rl`$u#Rr;TptQo{d{M107N*Yw9lP1Kh73T?M5?936M#ROH)F!l# zGr%VXQU=TJ^$PxFM?9qM`{2B!EMX&%(rO}eV$Ig?OLKv5YbH|QGZjXhF?P!Mj*f?a zth-X#&&8<_lY6N|+#9o9stYhi3N{KEi>;9yrZpMu+hBqfSYjyU`9TV=E>m!2LYyff zMu^HQ>8QBCJn-klq-IV$7>c2T3%oX%nHY!PnbZDiUL}n2HFF^|+oFSMw_sjp(UOvD zN(%N{f>V1@DoNXrTCrs3vW>Wm`8L=z3rjL-fo13T^#H8Yj-=%gpTQY}C9!*ie~(KHnN>+Qn5Xm89g!FrtFmu^J6(Id$M9)c9LAo=0f}l z*Bmg{_Z^8D^JSBH=J&+b_$+a7)Um)vjM)l48{Vn0qMvHS{**l&2b>dpy8u@Y#*XZW zp{>H>n!(Py=po_+?iRYizLNRwA%{`w)tE5;q3YnX;aj++fUSy^x0)f?Eg7 z+se>q?z9nBhV!V>>%9BZkKN{`GfgHx>M8@P1UQTWhq~rx2+#A=kH>5KJ_pSJ> zspdc+BezXHkTA{%^l2)k$wF3+CWhuo7}vlo^c8(vn(ZY38_vR-I4wu^V9hP@WCi{n zF7a7l)RxUSB3{gkx(xdTd6@~Gh1()0X&)xyjPY-EVqeshq&!CRqDc$fwXNJXpZZ`s zw`fXAyVi->eVaK6E(}KvsXB)ABa8TfFYJt^Iw?eF{MzM>MpN1uyTr4MlBi^Un3*&TAnaJL)fh#QO zO-A6U8Tex$0X}O5K8%U`w%L*HHe_D*Md%-9n*>~6&5FQEEAg3+Mq?+rX30F%PB_X+ zV&MZvGGrVD{SZtYOWqg~OAlbgrSy0*`l>O)U)o^Ane?0le1%V~*p%wT(CNRKhJ?`~v7Kf1)wMskoPzN}Ov zIpqeZaVFAd*UQ;+Qdn-<%PTLn%+evg8G$encG2B*rI@K+C9d zkUjIiJR~P@GcnStY#SWYYe^scRuC_AFqDPQ&bBl*xqB|yX5zv}Fbj`meNjn;{!M9fm{F+P6V!j|>nQ#x}3*>uVeZg4O#Ri{MDMSsXHsgUj1&&}^ z@x>?an870$ zCoSUPlyRR(mppk1ZXJRHEyh86L@vhtEbSJk?hGU%J380 zT~+Gj!F$D1#bA@5kZ|6`NAIN1{F;LYi@{79>qJ%);-$M52i$h3(U-)X9e7&XCz8OU z3>@;HoO~CoI@C>>FG^qt;(!CjtLfqoT$yJzc&EN>h~eWJv5UB`uLrUofT#Tiv6A`9 zJRjm)8{~oUlJ|)5ZEu1HwPg#|o@ijRU@j}>cO9OtJBA~GX9}y97|h)&{vzwo8LN?K zHuFfe%aUtuuB4@B5`k&T;P(E+hqD0dfYHYE!6AY#Xpf|7% z!Dw52pS2>clFPQa$BS&HnPXTC|<0zv1NrHZ-Ax3vWhQYZt&v-Y@?AU_yc^M z1@6%t$;mG|TZ>~1Px@|1d+maTn8fdZxIfZ%(&HX#X-2NV-pniJU1tWLP!?xKH3qDb z(3j0I^MPE~fHzx%9m}g7`Q{A%Xd_GV!#3^Zz+cSC+?wO$1h;h!csF9zUJJ!h{&ljF zVGBHnKdua8a;K4a@Hgc>d~DeTldtd-EygMS%c{w?Q%E--iwBQ1#J{h*CPi=?EF6;u z!a*Dw@HP>cm-wbI6?{&8sq!SoL8*Y3uw)Ac7^a#`y16u%YYALsjT~&*qVg1)aJ!!9 z_|MvIC6hINhS*-&<0HTgZEr3v*m&38fGNqH!Jz|ky>`L2vTzowg!7wV3iu`W03Mxy zm)2EY@4%&Uo$$Ik++%IV9EIm>ZkNQUIyeiCy0V6w>%&7Gq{qC-tFA1Vn>O5K502Q} zby>sFz+aGm*T-Vg2Mv2IehPOCpHXN5*lz-l2(ITmr3IJ^|2QdG5MrTGPee7ojb$dZEG3VHxUaSus++!cnGcmpUt;b$(PKDoZJu|y}F%&o4~#v zzHE)gvrcR#AM~2|4mir%#1uD&U-5N#74mfa^L$7Ch>spc_|Mru%zYES1FYaGo^vO7 zW$BPR8iO%DCzj1Yg9lEex}KhJNMo*zi3FZzKP~u%i22rbe0(Z%g>hmr$M^7HA!EJE zn9o*l%-qMCcIsQM*yMq8{Cz0^V{*?f_iJ+9(E==IkZo#!w1is z#LxviNFoy(Uab+r{qD();V@i$>Jp4h$5`Y6!@-^yWs`4=zz-aoeryo`w{X}VT!glx z4d)}`H2x6mxYkpEbgU>LiMbzLkTyp%B z_V2)%SanZY$ww!3P z2NO*3Z51CsFqnc};BIRnV-S4pPUsif3T|nL&)H-h@Fdt0pEzs7MLQ}tC$^d3t4*J| zI;QTi5|g+P$%fd3e`>0{&Zj-Aav+x)7d(r8Lk))fb?s8m;U0u`Sd6L9fE6sbxQ@y> zs3r6~{39`SLam^?^G^7V(mWz|x4B=3erG(9w->~e%HjZj0x!uiJ9}ROVvOP@JviqG z46~d!WYYBU-$OY}sGG;3q~xO=eASHjX;FXh$aAL5m#~_`moi2bFY04y5kGLgD&O8_=0xQ4!pO**jw+-!s2j1Y{f!T-WF zbf`Hj;W+y#$ICp0K+ne>S8A-;=9+9N*)2Q|cQ7YI{40$N_6{AO*f#acLo# zsJ_mH&?Y|ocPk^7;~y$SpSFX83DUHJ|lW37n6Rd{T8X?V&; z6rJ$!bNE>upSNOes9M*)0nQ+27?t4pmJ@QrotP|4=`7~7eM@>d*#q-@%a|Frx3t9= zu494UgueyzB#iTtlgS((-kZ-QXcyckd?Ybu3g47-O$)dQ*J|NUQYnWPbr0|tZJL8i zdMX||4X`>~C~C< z^RDd4vd?#kbz^E!1+hXW-dQYysT!&VL2U(mHt{;rh9fKS`;s=Az#XU51B}Lj0lp^p zftRDs(bz0y5AUrv=Wr3=oYfLs$(ZuVFBr?p&wI5PzHKa1>L^}m2B%K!NZ^@Q=(2Q2 z8a})jIk2ncq7@(!vnnn8tJkG2OubrB9uPn$KP%?&C+ta0>_gzmAWYFxGrBo|*#t8i~%70$J#)-?2b)YZ1Mi7yN4se9@y8nxF=rhyN+ z9~F}ib(z73CMr%76GGz8zOg62vA{Pv?FzOjQsynbhkBEv#^0Fw6E#~EM~8fC%wnq= zeP@@X&Ht-mngG|Bg~ku33>%{{S%8t)oh8m`bv?BRRL z>=KB6E`wX2F;@DVr%miy!bydJ>PxsAuEj{Y=qupl^QlxuLYJ;p7^8sNXJ#zKPbRMuUm46j++fnBIiIVz6g%W7Nd&~T0+HKoc5u9GnmZQ+s_>qBZZE_I_eHHRn%XEHy^ z)K#eLop7lYoPthnKc~;C@YVrwy=gB_a=#6^i_SHr2}(LJKwQejqwcKFspFAz)X6j2 z`12woUeOj4Fxi$GnbF%5L&&?CtEDwDi5k$fgI-|@e+yQxdDL&{(@`1UMqNB3##k<6 zkvQIkBd)?BDIYtg))rUcTFLX4@VHxic9%L(W3KYX1@$=iN$T%N0jQaiQ>4r#XAj2? zuLoDRqLw|Oud+5VID~(u?=9kVAM6`eRV-phiLK%ez?|TvCH2exntp*h8&fM;8hvUZ z6Pdz?l&A2pjD>upv@LsZP8EI#Ud=OPMjWhD(@LmyPPq4i7*z+yoA}>7wa?}_Brbzn zYhX)!M;mUun87CjlGfzK8UAZQeYnn?^TA6~_=7chO(Pw{Gg512E+i-%r{Inau|tOg zbp~7M6y(+mFg9~2sd_T*;&aI5@p#m#(Pt3z*3_265jin^zMK)Cs7uy~xn7P|q)tqL zKkJWH;)0`F_7<%VSR1|4$ZW|04NqX97a-r|3yif1V};r%W41#MV$e=IYA>a^Cn;JG zdyH>#(EH#w6c#BfzLPjTZfEdN4!kaLpBylS->RS!*tBM}OGz5wACLFCaFoNI4|eVm z|5o6VDOjHI-v;9zV)_L<2VV2LE9!k{vB*REh7DGSH=mLVxjQkq{sVnbhx_yQ^cB3s ziu|HZJl)l(WAb`;L0{!n{B6R#qkcfWyvGocL-<^BlDLPqg}75tW9;lQ*)!h9oPX0Oq&=an954#8ehc4LCePE+ zG^Ki%&oX{G;3@P=3-E3a{I#d%)h0(Bqsd7lcz)^`R&xgz1;-En95v9>fQghZ3czpO zlo%{%7pU3R(aPwwpIt$pwnm@U-@zAm;hMqqXu{&o0pEkJ34U4CDEtNe!}(+U6N$R) z;UE3FE=%4&!P(R?Tk8TmK&&PIN~j^p3Jjt2XcqoH$yavxt&=|NnS`T>2 z9DY;jQ@S(qMZT-@)**byjQHd-SF3Q-NrY~UydY#e*kFb!n57`6pMxs{=2wC?1`jJ6 zV(@SaN6DN~y!#wn=;C9`LwF{C0@hcxZtBDwUtwVn?S)x|XQGz8W{kvWPFlpv4fUhL zvVw1eXHXh7lfAdeqYC_>i^gI`{ysu;XX7ub8TDua&5G;Y^x?J1@w;$!HE?2o1V@gJ za0;gDP4JWC3PY~HeL!nKyJTRc4tkslSbEm=(crYGbM>h8Y`}ACbQq=_;C@3jj$*iY z#?GY7^+I_Jbn5p)7KVsxy_0T9XfUF2ko5^l#IK>p6g*$@@qBSR%O3 z6g*xA%LUZdc3{6YF>GakIp~KHb@6P6e`C&Q2l|}4No@~TJ)y1*AE!~oPpPxDoP$j1 zd!Kla*?gBVAERY4@ylEC{TBS0LrrVJ^(4f!7C6`-f2hqC@Vl`rhvZUlUgd)+Yx*Ds zH|zL+3w=U~n!*5FkWxEqQO^n|?BETrNj58u9r+e<$-++?ZQ6qzDg)bf96R8!hkl&d$=Yv}rnLJC5n)99-%ml{6<-NL- zGX5*z8@Qph#%oRdB3#Fe^*MX=OJKK{8o-9y{c;QThtG20EN1vagMMC-Lu}w`95CFJ z9Kt6S%;9QP4RHs4TEZ*VsjI1RKDX!_G*1&WdP~Nlj{hsjcWV0$cxlKyVJBm>R5msD zDm9w1jZRUAlc46~qFJqgV>ZOKCi&mAwUk1|PwLN#qxXsXIWe%icEE%kndmdH92zM6 zL&e>a(-PyFDcFP92!~lUVJY#0ZHK&mT##>p38`(2;RICBBL+?GjwF<=UpL zjr0TJ7j>Bqn#6ev?Gt*SB|c(6%<3fYX5`YkhOP^q#|1a`j2z7q_ztWvSm@yQ6|o+^ z7_M!C-ndNtMI+7>C(Nc0?PVk*;!ZVL!S`n1RkWugS9TGxida@b51>sM?+N-h zJB52y_h7@rFb2T+d*)MzSnTYTvrZP#%zgIIE(g#(pVGfQ%}oJcF(pUP$$JyH4ikN<7ScCLZ$xZX*jnHqU2s(apVOU@Q)e6l43ZOnY;tUx z0sZer4%;UD6ZL5ap91IYp%vp00td5HM#}yOb>Kws?@ZI)v9h} zFVH8^H;VyU=ckAR%C$sCHvjaFdxDfOLz zJk0{LseGc$yi3p}j%n8ve;v~IOXB|sos!P|wZWAIpRbcQ4al1zFsOfmaSd|L39q5& zFQM1-z#&cat_7TR-KH)|pQMcO0ldEncBrrL55%q&dLEzLr51U_aJYMXbQ6tAAAM&T z|ElBP0`Qc2Vps|%U~7epRt*X0?{&meLg1S=jG-3%>kJ-iM}4o4wmU&9HiYM^E1f+0 zfeCSVk9M#=UW&uD>9k`lMR$Pq>Oc*w1!h^2$1C1uOx_ltk?ay5Mgwvn=3ReGEUs+9 z{%D@b6%;qB_Ye}GJ&4c(G$E|aye1yJVHMt^MgEz=(N+$O1GK*fG&*g#!YX>wKK;3Y z0~?0;0=VibIeC|Q%|Hh?QEMgIip^Zu;twWhD?R*W!rFj2b>j`3@dR#5<<@iRuQC0v zQ5%?{PZ{E4BKT;B9A&O>rR#v7n&6iO{tjM^x?YZNpMYVP6$sOS+BSWza>ZhBK!b?} zXhLn5d1bV~RyzybC;V@LZVD}Z&T(rF*awc#!grQt)Bz&crXE~!dmpXq(`Tl!nM?!@a}1mbZ*W;$liH+`w&EJlu1FE@DX?!XPgV z;p|pm+l(B@0P|bqNtG!z7qG#A+OmU2Xwn*@$48q*|BvB}JkGI)OPHy3EYy!C1GGZm z?k#xILgR7(GkXPG0*ZmRWzXyF_Bsub8f_R8kIziPikZbe1WPn zS+qxYzn3L(zkyCTMuVm67PVLEHso!4G-z|MT!3#@v35^fgvDVDa$NeROx@W46V~Bg zI@E^y%;Ty>d@O-~>0>Phi^7>M(6h0ENCxoHHfvn87;b=kX~!7sjZ~cg3<7=|vDT+v zplj8kr6cq{^tDGm+e{3x!K5m0Ddl_)jM$#C4hV2Lrxu-3`!m35JMyEDd`L$ho2v)D zqEFM&8AR0a7VzmrjFXylmv}u#N2bcK;%~-Y%;HMpJ>1>YWV@*&8b<8 z!9EFow0@YwDWi#J?6~MfM$EZJLH`+T>T|SB8(zhPyJvpbjJZ+@Ca{%84~z)!X1RTI z6!0`)yS&fJ32M)63;v}6p9|iFEtDNv10CMMLx;a2Kk856l+cISzjhYNJ{JzXw;?p?hyMmK$uZY2{ciA$xx^R@ku#4`WVh#N27>u$=BlmK8je``MDhUEQ3d2kUGVS%eBe_HXy-fl zyD8Ykmbt>eQrDD zYM!eQo)`Q!Lm%zvCCN+V&b$|*CtR>@q)vXeAAp6(R~+uKj}CCp+^+@b2jF}g4qOEF z?s`HEg1KB7;?0Ps4aNuX7u~Yru&A-2-!+>iJR&tS;z=Le;_8|-@o`hIT!e=1gv)^& zt9S~#gy>w+_JM^;)atYmcn@BCqA@Pe5*B0D+0h5PChIrRnrHB#CcKsf&o-c5w_|J# zsjF`2Hw(Tm29J2?IdpvIn)~Z7bLKppHF;fA@s044+8TVzm^H{7JB;xIzN-YUlAxDd zsJtpdg9S(8qtlPcSCv*OV-2MTKcdrK4c6tU+?y4Y#BQ#c+Vz5by$<%&;EoIYgjy?+ zP@mH2gC;uPUJlO)*2^mB$f?gv+W7lbfHu1aCdBu$Ce5U-S->X@&`Yh*ua3!oV;5eP zHFUG6DlVLbs+-L_H#)%iumM_(mA<6JFtfzYNG{=Zvc%I>;OjLSvjeVCoSyl5PZ#$Nf*q?J{b&Iy(Ip zTzJyHE${Q-LPz+GC?-zM(8pHM(N546l821($zA;RVvsT4!GmZ#_i#`K{6;}cpjtrv z1P&7{Xuu3c>P4XBt%njCVu4&6UyjBR;CocL&`n5^Fxy;cv<0lGOQ^e{|)4_MK zwxPp4WpJp78SsJdk6`^d>q`oy~$yH2v%QZERvICz@En|=nL(xX4HH8LwMT|DWL$5F+t{=c`il+=0_9XR??nY<=t9#FSvZaF8ura`?o2KyNq_z+!oAN~VEm3Rl{ zM~_hR!2mxUcF<@G;!ioVeUpdPTGh2K`cH?N~s~ zU1H~tp1N4h%K3A+~u0~*N;$>?GPDNulB9A&Ky)N3HDsyo~ z{;v3WwYGewd8~gSC!;3PV^Ge?arfZ6?w)lkCK}^1eM{Zkr&c?nR>1ZV62cG6;c8j+ zEM>5oTJzcTh_M;|2t8Z`7iKY^MYy+a%y(f4Se;Cym4#Tsk=7UVju1ia09vt6IL zX_IH5b7*o65%b-J=bImh4djetYStA5ab5Z;M03%gK5Qv$j6Y1=60rwP0SwYZ!#%4p zw;5|1+MF%#Q1Pn=Bqul_e z)HLve_|Y|*aE)4+4d!a9+ByA^`Dmhs@Z;1zm+%^DtutgjV*u_lN2`F}+@L*USrFVB z_!%6a!}V5HPPS0^60KaS)&bCG`cQ|rB`-(c(FEg0tUsxe`%dAx zmhhe<2TcR~K!bJOdvdoB|7No9gcfbUDRcDaj0>)%PQ6J(*Sj9EmM%qSi?(D&Zq}s# z(nTM91cqZyCyev{9L)x~tWDlEtJA0Odv$6SCjMndEbNoFdgud{&Z7;-p!9w&m`-D@ z$d;VFjULKnUKix4YqStUG)!uJ)`mQ!j8<0ZA)FFp6n&6MEQp9-b#fA)dorl)tDG>Q z9;J<0bLZm28B^0O8qI+GK_~ZSt&G~YLGAmsXP)=rUDt3h6@1kUelI}tTLxQujIkEH zQ%0U*p*xAFRn@?_rs8wah?Gq9@nv{_^prl>PSwTp4Y9U>!vKTmtkrN>yB_0@Ix!k@ zd{PhobB12LL;IFe)-f?(b86%Pc~63t$`+Ngr=}WecJNb z^M#yDaRFLD;e{MGVXjZ~gxs9^!3>0tR!3(Y-ws^ZSfeillXu8}=fu~X`cP-bTp^wY zjK5`_eq|o-z=JDv^+k;}A=?J?6a7yH4}wOh1|e}E=j#<{OYr;1zR=UJ;HlZOq(hyC zdq+G1kK{6r(e5xdwqTn+q8=9wLKi$ZqK>iU+$QS`4Y;~Jm}o^kZA6Y-cj2JH5GD9) z3%}x%XXLEsUT~~oh4;bMU3jAz^M_@;U`dm?fi8+%!X;m-F3@Z6{))Ov8I5m7{@}1@ zLm6)20Eg11=C((xUvkmYa2;#%vkLtf5WAI@Sk>r5>J@!_Si<*a)U7gb&JceP6Z@O2 zy&&BsR;m3s;2_C^w_Nv#^RHWIpjoH5U=6oVovBbfHu=zw+HIMAg4Wzi4b6FrYf;+z z4tsi3$lvw~xW zz<~`vu5t+G;0`~el$B#*9iq>=}AU zIMXs~T0`_+I(TG(KlHeag!S(ObT>y(;UBu!`+K(AZpD)R2 z(W#){TymV|ZX*MecxF@cCnnZh<{|e}$5+hkGMZw1U`8B64c!4Sjt|EiflWFoz5BxW3Ynpbs>f)Yw>) zS7Qzh;K@VUtT|=<0e&%s_u8;7+hlFezC+!MoKfisGW56$I9!*Ur^@$i>RlQI@G*Jx zg6q?XBUXoXY0R?>j?g3CE-bW0I%^)_z8w6c#y%dcf;Dy2-^=ho3kU9?-TfILK}=0Mw26ZR4yb{G-ZAKt_y_8;Jn z`sk=4YTPDR)8n%_b;B+-f|zmS5O+1D^T!{JS>Leh*u?H8TroPFl=>QV9fLZY(s8=% z5m2$I51|RMStGkqwKx3eiX3>0hIT@o(*o<|Hv4Cw--QV{;Xl<{>T-_0A51%e15@?s zJ@vn(ioI|XN?XuHcT=~>Qy7yW`MO3;%7dqFkC;bW>Q>xyn>~vXYAa$+We3J-p*=|( z)EZf|G{m1e z{w-~x1zw_SE2Gmub7rv5Rja_4!l$r7gREH-)CtwT3e+YTqf@jar49A>9@=WwI+-3? zY3c_C>r1*Z`8@pT6kSOQFWF-}RL~d3+|K~Ly0B(yM}IUD#y)x8lJ;wP#6oHxY7eju z>u#wW!e3F-RopR{FGlBY;LodYRa5epgjzs}I{cbg)I-m-0ejEk1`O(qYK=#T{=bSA ziRD5kYqyk+GNF#QW~{bMUdQLn8G8+|ZyycU4(&#r{Ui=5mjH)O*}Eqj!-2wQRGIe? zSW|J#YnvJ~`wb~=jSfd+gTH2qH-U>C6N{8@Ym;v#=uLZYq^lIZihSQHvCf1!Fyy*c z;G7D%S)VbsAa^U%Us;zmpBui9Ui$!sGtnSY)tA0Qp1{5D;M;7pz8iRJow|7gzDHr8 zJ@tkqd_%yPtFw=QYp^~Kj;e_Uz=Tg+v3A2@oEhA|Nq(f+E-_#6N)fszI9t}{Pw}5V zcw?x6xjeWv_SVrEM+cv{kB{v$&Ub3KO zXEGlHxZ9IF6x=jCuvZeiU)~|lLQiIZLAvlqOZec@8oxrEU6ZpkLNuAglLCHstkx%j zyV|PO#j$+2wt9xXhS;q*mxTKIlJ!6v>Z=H_WQs0M>BhEj5fl8R!Y8vDm=4akv+ z+e*t*M{C!C51m--yb9)Usokc;eiO|siVKOs<308m+ryRn3H}QGwYuhb$lBN#UKqcx zYH%CY%pcGsH^@62wdNMRypI2}6;B8sRRyDV(OGB2ie3!HS+p+$O8c4O6a_?x0&}`Z4UzF3PGqpbl8o!Csgt3kQU;}5<78fp0<%AZsk{NSj zhtJf}_f+Anw$w}8)Sm`Zcrj`ZZSo2m-I1X<95~e$F)4#DTHv!g#9S3m8mw_m+2=sz zaWm?=Bl;v`-G|BdyG{YNhQl3fn2Y2ps$SXQGjNd!wenWPdUdepmK;*;w~&+9I9#vd zTSLZ&MGl+vI4>HjO_TeiA9ebAjL&r8mdXn-82P?k;@-)jH{=f$)+Xl__D5swW{KQw zt%djx)+&R!wG{jbKAD5hT18HtgU{cSk2+xB9&1ae^VI@0VDNk<8cUWXqi5=(J>=TZ z)X(4#MraNPaMLAMhjT;I$o^erbsqYu$=Z#uQ#E2?;8LRj z^VGpPzVh$HL6L#-yI4ae{}ehK``%~cj?@!{e7CN&MP zrGa*Gjt)hmwrPV?bMRmdzcwS6h`9GDYh*I!yV|E}g!IhP9JmMgWY#t(JJ#5-<|ky& zi5b|Tj0Qv1*LrC5Vt7}ofA~q(KENT5;PVUO^vPa^c3(PZ;uoy9RqHL<^mQ37F6R2( z4*PUaKg;mNQ*yf@x#bouQO{<7vNrp8QbW(w8Zm0fH8_J+KPP`=F2Do$Pp-cvj<&$O2d>Yh z&b>pEHD)bBGbAFhwrs_os44ty3*2eI-)?*Oaj7 zz|pK2`xDkxRpBHy=ojk|uj5O~%;h#Zh4~OIUxFSNT`pIKkD=Z0rFIRD)`AaYU%pzn zJ=x2tfo}`Z=2~cRYwRPV>dP)zzM7M(fGzzRJUSfIft+&+=h95!<>BON)Se=+REND_ zlt!}3T5Ago(xfjFbOe3&5{nu(>*+?|9k^ZAUiQH(s@Bv7lW)kC=hSr_)=#nV9`QP2 zPagJ9W4^ZG2QBJHQ^s$^+AbIDr`F*G4tq%{P0&QGSI2+GteauHZdhYua2y{kklBt{ z2Z6TCBc8J#&z_o#p|pH6@;J170oY3ME^GL#!H5_{o>Yf7?%OJEu&*7te9?HDWD`mXb@MB@3DBJ;vG=UE~BUO_RD;pPJBy^?2PJ?i(H@q&D0p zz>e!^w#XrS=x+8yG%WCc1^Z)8z}6bvChrgSrpet5U|gH1^6{G4Jc-OD1!=${sXoAKNxu^Mn|y_NkqtizuNb+O8Rs5q%D) zk-^^w_@pXYlNmYo7M`wN5bwZn8Gd5MI=XhC_Edv|$;fxep;XKpQ8(J)1FC2WV{nPm zd~_FR48Z_x#Hu;?Md8O7S zj?hQxU^Rz%le0(L1plRUPaA3i+7f z&oQsdMJoi@U@%vtl|qBWg@ z#k*kE3VtPHoQ-{Ib84OBp7Evn4$f}`55yJ=j5GLW`?mGt1#v~y=PJaci2Zofz6(ou zS`S@?;&x5ALB)G4*#AX?C-50xCb`)GzcQkpqxLAx*wfp9C!N8ywZNu5e6>HMrh|TT zNo~_4ck{{bwrJDTesvl3>?Yim2mjq=|4X|TlKX=772iePsrF8C*+XN`eq6#@oC(LZ z(Kd!Dev6#SB0mbq9aUa$;4ik|r2+Ni19ixddS;KDBZXV*u;)Ms&TGQCc}fdNO{#(5 zC1Bjl@Pl2}rbcMcM)*#pwNv_V7cFmdM}4`+dB366DJ2lOh;5%we>N9YmyX#CIusQtDR`n^)H{{foJF8(j2&RHVf z55R6U#4753)LJ36AHo)#UFmtg89nvk44eocHF;kR1_JUKpXN<1sE z?qtdQY-|`4)F%2v8?CV7li6>89AikXn&5L6^rJ@%n^G5T<=)N6E=I(%UljZvAkEHSzgwI0g@+YGq21-y-m20OzynqX_8j?+S4N$QSHm3lY1 zLW8WDi;ovu7H};5N>4$-}1lMdk^@i zs;%#TPkNp7LPEkx?-c~3NJ6L*Ajt&5&Lo)>NHQUrP%YT8VQg3Q+Oc3Sh$1SWV(*BG zsGweZ#mZGm{@-=ZoMeKi_dY)V=Xu}vbI;_Lea=4nv|ZL-d#$zC7W)=&`ku6)2*wWZ ziqxgREXI@tUd&fzOb(yxhs_Hf`gKjtQ6N06tvDY{HI zo%Ru2iq9N$U&R*YS3_fc(1oYMBgUea4#^ig3hZ{X;H50^3&dN}v0XtwnE~BMpkGG3 z&Kw(jNHEv1khVLR@5`bbBeC}!MExz0F&I2@E;93I>|lcM36srpqLCLD()Kg3Pw~dy zEEV6E;hFfSrk!QNZw0_h(`N0)<-5Aji*k6tkazg^z&qv?L| z+qAt<>@-X0_mYrjXTS@@ge9wFWI5vFKb8Cn6}=AQghK3{EZF;IB0r3QCg&ns7oAiV zbTAN|KtdpT3uIcw=$FHgX=F1$Gyoe)O?1}ipG&bB6Tcxc4=Tk1J;`M(7=Zso#{9XV zT$70&4coN{WN!)Z`!Q)j%yq)<1R1c#{H8GE1_khAQipTVXIk*BJA^U}ryYpj+R%LF zd131@1l@OVF6|J%6;X`Qvf-`c=@-+W{n6Mw1fZ8HqCNP)Ysb=Ghr;I#fk*L97TyZE z9P+S4zAY5F`yk#s8oQQk=BflcQAac$Odw#NB$-72wu>3__k7Pu#*|zg_JVKGZh-ZoXrIK*%WxdAna5! z(Ib_>161C7-PVk3=8@t@)9}aU~Ec4k(cDd-=rX8kH!CG5;D*NWW!n1!8qjgx%77le5>g2 zWiD_Ya==Xb=fG(01&tnr&Le|9z#pA<6g)B0Kk>5*9mGZxN$u7oW*R$hbopnD{X-LVO(tq(PJD!+fw^jKoen5&zC%__t4^od+Pl7rkF0a-0nG ziQ$a-aY74U!Mr}?QArl`EZFEq@qYR6Ts|q-$x^RmK362)oX*@tKb{%kjU6q1V~Vhm z^TjqU48AD<-%-)=ZHw$$WLj z8OVqN_y*C9=fDrgA}`EG4(mnV9D_WpsDy82&TkfF8i(vH4B4Av9%n`f^Z2A4z_SJSQZE@fCfi7rLZGOniZXFwd ztxguUzp3cj;R$lk=O-X1&xGI8kS%*-pI8Vl9EyF*V01(U$PC5zL^}O%6n>#{;o}qF z`+b>c8HfE)3U(KM^!f4FB<5oe5=8%(h<%#qp!4Vx2UA}xS;$U60&@e zf54af2we_ie6JW}%ar2~cvGfy;g^Q*VvHP&u4fRuK`LvV#KIduz*P!*(0KU6 zB5aL@z+VPn_bC1v($Iw@d6%k4`m0#R>VE0yz|g@YiOdIkzEZ~a3Fy20a~LnsK2!O& z67o@Oe0)pA4-Psh#sD(Ti$-pwVNYjCMTd(GsQ9Y&PG{T!&l69-8;;&Ofc_{h0-h7u zuugk}N>wp7DGA71vytx|e<7ch}eT>%-Y}L@aWg}}2i=xh;-72B~4q{%0 z#yly14Y?D#(PVhwY4VeYJG_vuhu|x_gmL4LbaX|?a+By2 z;*ewJz_SH2=Q9>Lo#^dy(BpZrI8hAppHl2uHT-wPLc{&YgD~WSIh02e+6RV4jsDdQROL+lfeoCTjP{>%Z&q#R?A z6A#M6{($eYz_Z1mb57IH@1h?nW!#Z~Tr(sV-CZd1d2C|DSIH3ki^OB+7J+TO*iIFq z1CI7(-WlWQF#1LDX%vCYT?)E;nd^}TFIt2hO;D+BU6sBg zuatR@@IuANGiCjhJb0*7bSzfp;s)kZhUmHmp||%zCY*vz4K0;^4;wdVm>;rgu^+X- zGnFDQ%ODSeL}v%jCbFg++PcpW=1DT1iGlBv`Rzi>lf2+P-~qCb-S}Z!ZbhCD5KlXU z4+v$vk_k_h%zUe0#y{!UmWATC#}8Y`7}`j2IQ%Q)Xz?=?RE+!%n|FWs`aJU0f?T

    p;f7gPb=%x6O&PBGBj6SkZ>`0lfk&FMO2;`ml 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

    )7ew@{MhQuhH** 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", "") + +Change the ThisVersion constant to reflect the new version number + +Save and Close Install.vbs and VSI + +Open EnZip 3.00 ( freeware: http://www.cpam.freeserve.co.uk/ ) + +Choose File, New Archive... (or hit Ctrl-N) + +Give a filename such as "Decal_2000.zip" for Decal 2.0.0.0 + +Add Decal.msi and Install.vbs to the files, using maximum compression (available on the Options tab) + +Choose Tools, Create Self-Extractor... (or hit Shift-X) + +Click Next to customize the extractor + +Click Next to NOT have a message box + +Click Next to have it extract to the TEMP folder + +Change the Tile Caption to "Decal Installer" and Click Next + +Type "Install.vbs" in the Command box, leave the Parameters box empty, then hit Next + +Click the Change Icon... button and select the Decal.ico from the source/Installer/Res folder + +Select the first icon and Click Ok, then Click Next + +Uncheck Display Run Command Checkbox + +Check Unzip Automaticly + +Make sure Default to overwrite files without prompting is selected + +Click Next, then Click Yes to bypass the warning + +Verify your options in the displayed listbox and then hit Create (this may look like it's not doing anything, but it is) + +When it completes, hit Test Self-Extracting ZIP file now + +If everything went ok, it should display a command prompt window while previous Decal versions are uninstalled, then close and start the Decal installer MSI + +Click Close, then close EnZip + + +VERIFY!!!!!!!! +Make sure there is only ONE add/remove entry for Decal +Make sure there is only ONE Decal group in the Start Menu +Make sure there is only ONE Decal icon on the Desktop +Make sure ALL the file versions are correct +Load up Decal and make sure it runs properly (to verify things such as registry values) +Attempt to delete all of the shortcuts, then open IE. If the installer starts and repairs the shortcuts something is wrong. +Test the FavIcon creation +Generally kick it around and attempt to break it + +COMMIT!!!! +Commit your new changes with a tag (so that the installer can be rebuilt in it's current state at any time) +If this is a release version (not BETA), create a branch for bugfixes +Upload the binary to SourceForge (see sf.net instructions) +Test the download and verify you get the same file you uploaded +Change the homepage of decaldev.sf.net to point to the new download + diff --git a/Installer/Res/readme.rtf b/Installer/Res/readme.rtf new file mode 100644 index 0000000..3ea1256 --- /dev/null +++ b/Installer/Res/readme.rtf @@ -0,0 +1,132 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f37\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Georgia;} +{\f38\froman\fcharset238\fprq2 Times New Roman CE;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}{\f42\froman\fcharset162\fprq2 Times New Roman Tur;} +{\f43\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\f58\fmodern\fcharset238\fprq1 Courier New CE;}{\f59\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f61\fmodern\fcharset161\fprq1 Courier New Greek;}{\f62\fmodern\fcharset162\fprq1 Courier New Tur;}{\f63\fmodern\fcharset177\fprq1 Courier New (Hebrew);} +{\f64\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f65\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f66\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f408\froman\fcharset238\fprq2 Georgia CE;}{\f409\froman\fcharset204\fprq2 Georgia Cyr;} +{\f411\froman\fcharset161\fprq2 Georgia Greek;}{\f412\froman\fcharset162\fprq2 Georgia Tur;}{\f415\froman\fcharset186\fprq2 Georgia Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\*\cs15 \additive \ul\cf2 \sbasedon10 \styrsid13959554 Hyperlink;}}{\*\listtable +{\list\listtemplateid409371626\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\'01*;}{\levelnumbers;}}{\listname ;}\listid-2}{\list\listtemplateid1512880686\listsimple{\listlevel +\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid190145115}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255 +\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid204221188}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255 +\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid399254398}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid462045303}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0 +\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid543324763}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid561211173}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid583338098}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid590091954}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid771126764}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid855463441}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1214316582}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1300184623}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1403941801}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1538081160}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1551961698}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1734812107}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1813057095}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1889994174}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0 +\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid2028016505}}{\*\listoverridetable{\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent283{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-283\li283\lin283 }}\ls1}{\listoverride\listid543324763\listoverridecount0\ls2} +{\listoverride\listid2028016505\listoverridecount0\ls3}{\listoverride\listid190145115\listoverridecount0\ls4}{\listoverride\listid1403941801\listoverridecount0\ls5}{\listoverride\listid1889994174\listoverridecount0\ls6}{\listoverride\listid204221188 +\listoverridecount0\ls7}{\listoverride\listid583338098\listoverridecount0\ls8}{\listoverride\listid561211173\listoverridecount0\ls9}{\listoverride\listid1214316582\listoverridecount0\ls10}{\listoverride\listid771126764\listoverridecount0\ls11} +{\listoverride\listid462045303\listoverridecount0\ls12}{\listoverride\listid1538081160\listoverridecount0\ls13}{\listoverride\listid590091954\listoverridecount0\ls14}{\listoverride\listid1734812107\listoverridecount0\ls15}{\listoverride\listid1300184623 +\listoverridecount0\ls16}{\listoverride\listid855463441\listoverridecount0\ls17}{\listoverride\listid399254398\listoverridecount0\ls18}{\listoverride\listid1551961698\listoverridecount0\ls19}{\listoverride\listid1813057095\listoverridecount0\ls20}} +{\*\rsidtbl \rsid1721752\rsid1909948\rsid11889854\rsid13959554}{\*\generator Microsoft Word 10.0.2627;}{\info{\title Decal README}{\author Adam Wright}{\operator Jeffrey Dodge}{\creatim\yr2002\mo10\dy3\hr3\min43}{\revtim\yr2003\mo6\dy23\hr3\min4} +{\version4}{\edmins9}{\nofpages2}{\nofwords407}{\nofchars2321}{\*\company The Anarchs}{\nofcharsws2723}{\vern16437}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701 +\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind4\viewscale100\nolnhtadjtbl\rsidroot13959554 \fet0\sectd \linex0\headery709\footery709\colsx709\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \qc \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\f37\fs28\cf1\insrsid13959554 Decal README +\par }{\f2\fs20\cf1\insrsid13959554 +\par }{\fs20\cf1\insrsid11889854 This is the 2}{\fs20\cf1\super\insrsid11889854\charrsid11889854 nd}{\fs20\cf1\insrsid11889854 release candidate of Decal version 2.5.2.0}{\fs20\cf1\insrsid13959554 . +\par +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\fs22\cf1\insrsid11889854 This is Decal 2.5.2.0 Release Candidate 2 -- a }{\fs22\cf1\insrsid13959554 supported release. We hope that our release}{\fs22\cf1\insrsid11889854 candidates}{ +\fs22\cf1\insrsid13959554 are bug free, but if you run into problems, please report them at }{\field{\*\fldinst {\fs22\cf1\insrsid13959554 HYPERLINK "http://forums.acdev.org/phpBB2/viewforum.php" }{\fs22\cf1\insrsid1909948\charrsid1721752 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000002d00000068007400740070003a002f002f0066006f00720075006d0073002e00610063006400650076002e006f00720067002f007000680070004200420032002f00760069006500770066006f00720075006d002e007000680070000000e0c9ea79f9bace11 +8c8200aa004ba90b5a00000068007400740070003a002f002f0066006f00720075006d0073002e00610063006400650076002e006f00720067002f007000680070004200420032002f00760069006500770066006f00720075006d002e00700068007000000000}}}{\fldrslt { +\cs15\fs22\ul\cf2\insrsid13959554\charrsid1721752 http://forums.acdev.org/phpBB2/viewforum.php}}}{\fs22\cf1\insrsid13959554 . +\par This way we can keep track of what the current issues are and work to fix them for the }{\fs22\cf1\insrsid11889854 final release of Decal 2.5.2.0.}{\fs22\cf1\insrsid13959554 +\par +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0\pararsid11889854 {\b\fs22\cf1\insrsid11889854 Changes since Release 2.5.2.0 RC1 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854 +{\fs22\cf1\insrsid11889854 Fixed DenAgent inject dependency. Inject.dll may now reside anywhere on your system.}{\b\fs22\cf1\insrsid11889854\charrsid11889854 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854 +{\fs22\cf1\insrsid11889854 Fixed several DenAgent crashes.}{\b\fs22\cf1\insrsid11889854\charrsid11889854 +\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0\pararsid11889854 {\fs22\cf1\insrsid11889854 +\par }{\b\fs22\cf1\insrsid11889854 Changes since Beta 2.5.0.5 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854 +{\fs22\cf1\insrsid11889854 Lots of bugfixes}{\b\fs22\cf1\insrsid11889854\charrsid11889854 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854 +{\fs22\cf1\insrsid11889854 The identify queue no longer fights with the client over whether or not the id panel is closed or open.}{\b\fs22\cf1\insrsid11889854\charrsid11889854 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854 +{\fs22\cf1\insrsid11889854 Manually identifying an item sends it to the top of the identify queue \endash you should notice that it is far easier to identify items manually now if a plugin is requesting several items to be identified.}{ +\b\fs22\cf1\insrsid11889854 +\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0 {\fs22\cf1\insrsid11889854 +\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554 Changes since Release 2.5.0.1 RC1 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554 +{\fs22\cf1\insrsid13959554 Far too many to list \endash most signifigant is the id queue}{\b\fs22\cf1\insrsid13959554 +\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0 {\b\fs22\cf1\insrsid13959554 +\par Changes since Release 2.5.0.1 RC1 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554 +{\fs22\cf1\insrsid13959554 Install now enters correct version into the registry}{\b\fs22\cf1\insrsid13959554 +\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0 {\b\fs22\cf1\insrsid13959554 +\par Changes since Release 2.5.0.0 RC3 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554 +{\fs22\cf1\insrsid13959554 .Net plugins will now show their version in the agent, rather than the version of the .Net COM proxy.}{\b\fs22\cf1\insrsid13959554 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554 +{\fs22\cf1\insrsid13959554 ACHooks slightly cleaned up, should now behave as it did in 2.5.0.0 RC1.}{\b\fs22\cf1\insrsid13959554 +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\b\fs22\cf1\insrsid13959554 +\par Changes since Release 2.5.0.0 RC1 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls2\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 +CharStats will no longer crash if you switch characters too quickly +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls3\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 +IPluginSink fix \endash if Decal never accepted your command line input, it should now +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls4\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 +Much ACHooks cleanup and many fixes as well as new hooks for developers to use +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554 +\par Changes since Release 2.4.1.4 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls5\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 ? + +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554 +\par Changes since Release 2.4.1.3 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls6\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 +CharStats fixes (enchantments should be far more reliable now) +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls7\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 +Changes to the way controls track focus events +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls8\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 +DenAgent no longer deletes XML files if there were problems updating +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls9\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 +Add 'mask' option for vectors to handle animation packet +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554 +\par Changes since Release 2.4.1.2 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls10\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 Compiled in VC6 (works on windows 9x again) +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls11\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 CharacterStats fixes +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls12\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 WorldFilter fixes +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554 +\par Changes since Release 2.4.1.0 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls13\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 ACHooks: QueryMemLoc added to the IDL (it should have always been there). +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls14\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 ACHooks->QueryMemLoc now returns NULL if there is a client and memlocs.xml version mismatch. +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls15\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls15\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 ACHooks is created by the Decal object rather than IPluginSite. As a result Services can obtain a reference to it now. +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls16\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls16\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 ACHooks: SendTellEx Hook +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls17\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls17\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 DecalNet: Uses client hooks for a quicker and more stable parsing method. If the memory locations are not there, it falls back to the previous parser. +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554 +\par +\par Changes since Release 2.4 +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls18\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls18\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 ACHooks: Added hook for SetAutoRun +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls19\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls19\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 ACHooks: Added hood for SendTell +\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls20\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls20\rin0\lin360\itap0\pararsid13959554 { +\fs22\cf1\insrsid13959554 WorldFilter: Now uses DestroyedObject hook, this should result in less lag and better memory usage +\par }} \ No newline at end of file diff --git a/Managed/Decal.Adapter/CustomCollections/HashedList.cs b/Managed/Decal.Adapter/CustomCollections/HashedList.cs new file mode 100644 index 0000000..dd09fb4 --- /dev/null +++ b/Managed/Decal.Adapter/CustomCollections/HashedList.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace CustomCollections; + +internal class HashedList : IList, ICollection, IEnumerable, IEnumerable +{ + private class ListNode + { + public ListNode Previous; + + public ListNode Next; + + public T Value; + + public ListNode(T v, ListNode prev, ListNode nxt) + { + Previous = prev; + Next = nxt; + Value = v; + } + } + + private ListNode Head; + + private ListNode Tail; + + private Dictionary HashIndex = new Dictionary(); + + private int ChangeMarker; + + private bool IndexCacheValid; + + private int IndexCache_Index; + + private ListNode IndexCache_Value; + + public T this[int index] + { + get + { + if (index >= HashIndex.Count || index < 0) + { + throw new ArgumentOutOfRangeException(); + } + return RunToIndex(index).Value; + } + set + { + if (index >= HashIndex.Count || index < 0) + { + throw new ArgumentOutOfRangeException(); + } + if (HashIndex.ContainsKey(value)) + { + throw new ArgumentException("Duplicate value"); + } + ListNode listNode = RunToIndex(index); + HashIndex.Remove(listNode.Value); + listNode.Value = value; + HashIndex.Add(value, listNode); + ChangeMarker++; + } + } + + public int Count => HashIndex.Count; + + public bool IsReadOnly => false; + + public HashedList() + { + } + + public HashedList(T[] arr) + { + foreach (T item in arr) + { + Add(item); + } + } + + private ListNode RunToIndex(int ind) + { + int num = HashIndex.Count / 2; + if (IndexCacheValid) + { + if (ind > IndexCache_Index) + { + if (ind - IndexCache_Index < num) + { + ListNode listNode = IndexCache_Value; + for (int i = IndexCache_Index; i < ind; i++) + { + listNode = listNode.Next; + } + IndexCache_Index = ind; + IndexCache_Value = listNode; + IndexCacheValid = true; + return listNode; + } + } + else if (IndexCache_Index - ind < num) + { + ListNode listNode2 = IndexCache_Value; + for (int num2 = IndexCache_Index; num2 > ind; num2--) + { + listNode2 = listNode2.Previous; + } + IndexCache_Index = ind; + IndexCache_Value = listNode2; + IndexCacheValid = true; + return listNode2; + } + } + if (ind < num) + { + ListNode listNode3 = Head; + for (int j = 0; j < ind; j++) + { + listNode3 = listNode3.Next; + } + if (listNode3 == null) + { + throw new Exception(); + } + IndexCache_Index = ind; + IndexCache_Value = listNode3; + IndexCacheValid = true; + return listNode3; + } + ListNode listNode4 = Tail; + for (int num3 = HashIndex.Count - 1; num3 > ind; num3--) + { + listNode4 = listNode4.Previous; + } + if (listNode4 == null) + { + throw new Exception(); + } + IndexCache_Index = ind; + IndexCache_Value = listNode4; + IndexCacheValid = true; + return listNode4; + } + + private void RemoveNode(ListNode n) + { + if (n.Previous == null) + { + Head = n.Next; + } + else + { + n.Previous.Next = n.Next; + } + if (n.Next == null) + { + Tail = n.Previous; + } + else + { + n.Next.Previous = n.Previous; + } + HashIndex.Remove(n.Value); + } + + public ReadOnlyCollection AsReadOnly() + { + return new ReadOnlyCollection(this); + } + + public bool GetIfContains(T matchval, ref T outval) + { + if (HashIndex.ContainsKey(matchval)) + { + outval = HashIndex[matchval].Value; + return true; + } + return false; + } + + public int IndexOf(T item) + { + if (HashIndex.ContainsKey(item)) + { + ListNode listNode = HashIndex[item]; + ListNode listNode2 = Head; + for (int i = 0; i < HashIndex.Count; i++) + { + if (listNode2 == listNode) + { + return i; + } + listNode2 = listNode2.Next; + } + return -1; + } + return -1; + } + + public void Insert(int index, T item) + { + if (index > HashIndex.Count || index < 0) + { + throw new ArgumentOutOfRangeException(); + } + if (HashIndex.ContainsKey(item)) + { + throw new ArgumentException("Duplicate value"); + } + ListNode listNode; + if (index == HashIndex.Count) + { + Add(item); + listNode = HashIndex[item]; + } + else if (index == 0) + { + listNode = new ListNode(item, null, Head); + Head.Previous = listNode; + Head = listNode; + HashIndex.Add(item, listNode); + } + else + { + ListNode listNode2 = RunToIndex(index - 1); + listNode = (listNode2.Next = new ListNode(item, listNode2, listNode2.Next)); + listNode.Next.Previous = listNode; + HashIndex.Add(item, listNode); + } + ChangeMarker++; + IndexCache_Index = index; + IndexCache_Value = listNode; + IndexCacheValid = true; + } + + public void RemoveAt(int index) + { + if (index >= HashIndex.Count || index < 0) + { + throw new ArgumentOutOfRangeException(); + } + ListNode n = RunToIndex(index); + RemoveNode(n); + ChangeMarker++; + IndexCacheValid = false; + } + + public void Add(T item) + { + ListNode listNode; + if (HashIndex.Count == 0) + { + listNode = (Tail = (Head = new ListNode(item, null, null))); + } + else + { + if (HashIndex.ContainsKey(item)) + { + throw new ArgumentException("Duplicate value"); + } + listNode = new ListNode(item, Tail, null); + Tail.Next = listNode; + Tail = listNode; + } + HashIndex.Add(item, listNode); + ChangeMarker++; + IndexCacheValid = false; + } + + public void Clear() + { + Head = null; + Tail = null; + HashIndex.Clear(); + ChangeMarker++; + IndexCacheValid = false; + } + + public bool Contains(T item) + { + return HashIndex.ContainsKey(item); + } + + public bool Remove(T item) + { + if (!HashIndex.ContainsKey(item)) + { + return false; + } + RemoveNode(HashIndex[item]); + ChangeMarker++; + IndexCacheValid = false; + return true; + } + + public void CopyTo(T[] array, int arrayIndex) + { + int num = arrayIndex + HashIndex.Count; + IEnumerator enumerator = GetEnumerator(); + for (int i = arrayIndex; i < num; i++) + { + enumerator.MoveNext(); + array[i] = enumerator.Current; + } + } + + public T[] ToArray() + { + T[] array = new T[HashIndex.Count]; + CopyTo(array, 0); + return array; + } + + public IEnumerator GetEnumerator() + { + int startchangemarker = ChangeMarker; + for (ListNode cur = Head; cur != null; cur = cur.Next) + { + yield return cur.Value; + if (ChangeMarker != startchangemarker) + { + throw new Exception("Collection modified during enumeration"); + } + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairIDQueue.cs b/Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairIDQueue.cs new file mode 100644 index 0000000..55b0cb6 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairIDQueue.cs @@ -0,0 +1,213 @@ +using System; +using System.ComponentModel; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Decal.Adapter.Support; +using Decal.Adapter.Wrappers; +using Decal.Interop.Core; + +namespace Decal.Adapter.IDQueue; + +[ComVisible(true)] +[ClassInterface(ClassInterfaceType.None)] +[ComDefaultInterface(typeof(IIdentifyFilter))] +[ProgId("DecalAdapter.FairIDQueue")] +[Guid("5CD85A12-3DED-48E7-B440-B41E2A1452D9")] +[CLSCompliant(true)] +public class FairIDQueue : FairRoundRobinScheduleQueue, IIdentifyFilter +{ + private static int iVal = 1126270821; + + private const int REQUEST_INTERVAL = 600; + + private const int MAX_TRY_COUNT = 3; + + private const int NULL_ACTION_ID = -1; + + private Timer FireTimer = new Timer(); + + private DateTime LastFireTime = DateTime.MinValue; + + private uint CurrentTimerFrame; + + private uint LastTimerFireFrame; + + private int UserRequestedID = -1; + + private int UserRequestedAttempts; + + private EventHandler mUserIDRequestProcessed; + + [CLSCompliant(false)] + public event EventHandler UserIDRequestProcessed + { + add + { + mUserIDRequestProcessed = (EventHandler)Delegate.Combine(mUserIDRequestProcessed, value); + } + remove + { + mUserIDRequestProcessed = (EventHandler)Delegate.Remove(mUserIDRequestProcessed, value); + } + } + + internal FairIDQueue() + : base(3, -1) + { + //IL_0001: Unknown result type (might be due to invalid IL or missing references) + //IL_000b: Expected O, but got Unknown + FireTimer.Interval = 600; + FireTimer.Tick += FireTimer_Tick; + CoreManager.Current.Actions.Underlying.SetIDFilter(this); + CoreManager.Current.MessageProcessed += Current_MessageProcessed; + CoreManager.Current.RenderFrame += Current_RenderFrame; + } + + private void Current_RenderFrame(object sender, EventArgs e) + { + CurrentTimerFrame++; + } + + private void Current_MessageProcessed(object sender, MessageProcessedEventArgs e) + { + if (e.Message.Type == 63408 && e.Message.Value("event") == 201) + { + int num = e.Message.Value("object"); + DeleteAction(num); + if (UserRequestedID == num) + { + UserRequestedID = -1; + Util.SafeFireEvent(this, mUserIDRequestProcessed, new UserIDRequestProcessedEventArgs(num)); + } + } + } + + internal void Start() + { + LastFireTime = DateTime.MinValue; + FireTimer.Enabled = true; + } + + internal void Stop() + { + FireTimer.Enabled = false; + ClearAll(); + UserRequestedID = -1; + } + + private void FireTimer_Tick(object sender, EventArgs e) + { + if (FireTimer.Interval != 600) + { + FireTimer.Enabled = false; + FireTimer.Interval = 600; + FireTimer.Enabled = true; + } + if (CurrentTimerFrame != LastTimerFireFrame) + { + LastTimerFireFrame = CurrentTimerFrame; + FireNow(); + } + } + + private void FireNow() + { + Assembly requester = null; + int num = -1; + if (UserRequestedID != -1) + { + num = UserRequestedID; + UserRequestedAttempts++; + if (UserRequestedAttempts > 3) + { + UserRequestedID = -1; + } + } + if (num == -1) + { + num = GetNextAction(ref requester); + } + if (num != -1) + { + LastFireTime = DateTime.Now; + int num2 = num ^ iVal; + CoreManager.Current.Actions.Underlying.CallerRefInstanceInternal = num2; + iVal = (num2 << 5) ^ (num2 >> 13) ^ iVal; + } + } + + protected override bool IsActionValidNow(int action) + { + WorldObject worldObject = CoreManager.Current.WorldFilter[action]; + if (worldObject == null) + { + return true; + } + if (worldObject.Container == 0) + { + WorldObject worldObject2 = CoreManager.Current.WorldFilter[CoreManager.Current.CharacterFilter.Id]; + if (worldObject2 != null && worldObject.Coordinates().DistanceToCoords(worldObject2.Coordinates()) > 0.375) + { + return false; + } + } + return true; + } + + protected override bool IsActionPermanentlyInvalid(int action) + { + return !CoreManager.Current.Actions.IsValidObject(action); + } + + public void AddToQueue(int lObjectID) + { + AddToQueue(lObjectID, DateTime.MaxValue); + } + + public void AddToQueue(int lObjectID, DateTime pTimeout) + { + Assembly assembly = Assembly.GetCallingAssembly(); + if (assembly == null) + { + assembly = Assembly.GetExecutingAssembly(); + } + AddToQueueForCaller(lObjectID, assembly, pTimeout); + } + + internal void AddToQueueForCaller(int lObjectID, Assembly pCaller, DateTime pTimeout) + { + try + { + if (FireTimer.Enabled && lObjectID != -1) + { + Enqueue(pCaller, lObjectID, DateTime.MaxValue); + if ((DateTime.Now - LastFireTime).TotalMilliseconds > 700.0) + { + FireTimer.Enabled = false; + FireTimer.Interval = 1; + FireTimer.Enabled = true; + } + } + } + catch (Exception ex) + { + Util.WriteLine("Queue exception in addtoqueue: " + ex.ToString()); + } + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void ShortcircuitID(int lObjectID) + { + if (FireTimer.Enabled && lObjectID != -1) + { + UserRequestedID = lObjectID; + UserRequestedAttempts = 0; + if ((DateTime.Now - LastFireTime).TotalMilliseconds > 700.0) + { + LastFireTime = DateTime.Now; + } + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairRoundRobinScheduleQueue.cs b/Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairRoundRobinScheduleQueue.cs new file mode 100644 index 0000000..008edc5 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.IDQueue/FairRoundRobinScheduleQueue.cs @@ -0,0 +1,281 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Runtime.InteropServices; +using CustomCollections; + +namespace Decal.Adapter.IDQueue; + +[CLSCompliant(true)] +[ClassInterface(ClassInterfaceType.None)] +public abstract class FairRoundRobinScheduleQueue +{ + public class ActionRemovedEventArgs : EventArgs + { + private ACTIONTYPE mAction; + + public ACTIONTYPE Action => mAction; + + internal ActionRemovedEventArgs(ACTIONTYPE pAction) + { + mAction = pAction; + } + } + + private class ActionInfo : IEquatable + { + public ACTIONTYPE Action; + + public DateTime Expires; + + public int TryCount; + + public ActionInfo(ACTIONTYPE pAction, DateTime pExpires) + { + Action = pAction; + Expires = pExpires; + } + + public bool IsExpired() + { + return Expires < DateTime.Now; + } + + public bool Equals(ActionInfo other) + { + ref ACTIONTYPE action = ref Action; + object obj = other.Action; + return action.Equals(obj); + } + + public override bool Equals(object obj) + { + return Equals(obj as ActionInfo); + } + + public override int GetHashCode() + { + return Action.GetHashCode(); + } + } + + private HashedList Callers = new HashedList(); + + private Dictionary ActInfos = new Dictionary(); + + private Dictionary> CallerActions = new Dictionary>(); + + private Dictionary> ActionCallers = new Dictionary>(); + + private int MaximumTryCount; + + private ACTIONTYPE NullAction; + + public int CallerCount => Callers.Count; + + public int ActionCount => ActInfos.Count; + + public event EventHandler OnActionRemoved; + + protected FairRoundRobinScheduleQueue(int pMaximumTryCount, ACTIONTYPE pNullAction) + { + MaximumTryCount = pMaximumTryCount; + NullAction = pNullAction; + } + + protected abstract bool IsActionValidNow(ACTIONTYPE action); + + protected abstract bool IsActionPermanentlyInvalid(ACTIONTYPE action); + + private void RotateQueue(HashedList q) + { + if (q.Count > 0) + { + T item = q[0]; + q.RemoveAt(0); + q.Add(item); + } + } + + public void ClearAll() + { + Callers.Clear(); + ActInfos.Clear(); + CallerActions.Clear(); + ActionCallers.Clear(); + } + + public void DeleteAction(ACTIONTYPE action) + { + if (!ActionCallers.ContainsKey(action) || !ActInfos.ContainsKey(action)) + { + return; + } + ActionInfo item = ActInfos[action]; + ActInfos.Remove(action); + HashedList hashedList = ActionCallers[action]; + ActionCallers.Remove(action); + foreach (CALLERTYPE item2 in hashedList) + { + CallerActions[item2].Remove(item); + if (CallerActions[item2].Count == 0) + { + CallerActions.Remove(item2); + Callers.Remove(item2); + } + } + if (this.OnActionRemoved != null) + { + this.OnActionRemoved(this, new ActionRemovedEventArgs(action)); + } + } + + public void DeleteCaller(CALLERTYPE caller) + { + Callers.Remove(caller); + if (!CallerActions.ContainsKey(caller)) + { + return; + } + HashedList hashedList = CallerActions[caller]; + CallerActions.Remove(caller); + HashedList hashedList2 = new HashedList(); + foreach (ActionInfo item in hashedList) + { + if (ActionCallers.ContainsKey(item.Action)) + { + ActionCallers[item.Action].Remove(caller); + if (ActionCallers[item.Action].Count == 0) + { + ActionCallers.Remove(item.Action); + ActInfos.Remove(item.Action); + hashedList2.Add(item); + } + } + } + if (this.OnActionRemoved == null) + { + return; + } + foreach (ActionInfo item2 in hashedList2) + { + this.OnActionRemoved(this, new ActionRemovedEventArgs(item2.Action)); + } + } + + public ReadOnlyCollection GetActionsForCaller(CALLERTYPE caller) + { + List list = new List(); + if (CallerActions.ContainsKey(caller)) + { + foreach (ActionInfo item in CallerActions[caller]) + { + list.Add(item.Action); + } + } + return list.AsReadOnly(); + } + + public ReadOnlyCollection GetCallersForAction(ACTIONTYPE action) + { + if (ActionCallers.ContainsKey(action)) + { + return ActionCallers[action].AsReadOnly(); + } + return new List().AsReadOnly(); + } + + public void Enqueue(CALLERTYPE caller, ACTIONTYPE action, DateTime expiration) + { + ActionInfo actionInfo; + if (ActInfos.ContainsKey(action)) + { + actionInfo = ActInfos[action]; + if (actionInfo.Expires < expiration) + { + actionInfo.Expires = expiration; + } + actionInfo.TryCount = 0; + } + else + { + actionInfo = new ActionInfo(action, expiration); + ActInfos[action] = actionInfo; + } + if (!CallerActions.ContainsKey(caller) || !CallerActions[caller].Contains(actionInfo)) + { + if (!Callers.Contains(caller)) + { + Callers.Insert(0, caller); + } + if (!CallerActions.ContainsKey(caller)) + { + CallerActions.Add(caller, new HashedList()); + } + CallerActions[caller].Add(actionInfo); + if (!ActionCallers.ContainsKey(action)) + { + ActionCallers.Add(action, new HashedList()); + } + ActionCallers[action].Add(caller); + } + } + + public ACTIONTYPE GetNextAction(ref CALLERTYPE requester) + { + HashedList hashedList = new HashedList(); + ACTIONTYPE result = NullAction; + for (int i = 0; i < Callers.Count; i++) + { + CALLERTYPE val = Callers[0]; + HashedList hashedList2 = CallerActions[val]; + bool flag = false; + for (int j = 0; j < hashedList2.Count; j++) + { + ActionInfo actionInfo = hashedList2[0]; + if (hashedList.Contains(actionInfo)) + { + RotateQueue(hashedList2); + continue; + } + if (actionInfo.IsExpired()) + { + hashedList.Add(actionInfo); + RotateQueue(hashedList2); + continue; + } + if (IsActionPermanentlyInvalid(actionInfo.Action)) + { + hashedList.Add(actionInfo); + RotateQueue(hashedList2); + continue; + } + if (!IsActionValidNow(actionInfo.Action)) + { + RotateQueue(hashedList2); + continue; + } + flag = true; + result = actionInfo.Action; + requester = val; + RotateQueue(hashedList2); + actionInfo.TryCount++; + if (actionInfo.TryCount > MaximumTryCount) + { + hashedList.Add(actionInfo); + } + break; + } + RotateQueue(Callers); + if (flag) + { + break; + } + } + foreach (ActionInfo item in hashedList) + { + DeleteAction(item.Action); + } + return result; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.IDQueue/UserIDRequestProcessedEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.IDQueue/UserIDRequestProcessedEventArgs.cs new file mode 100644 index 0000000..e2796c8 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.IDQueue/UserIDRequestProcessedEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.IDQueue; + +public class UserIDRequestProcessedEventArgs : EventArgs +{ + private int mObjectId; + + public int ObjectId => mObjectId; + + internal UserIDRequestProcessedEventArgs(int ObjectId) + { + mObjectId = ObjectId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageEventArgs.cs new file mode 100644 index 0000000..66d7b44 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageEventArgs.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; + +namespace Decal.Adapter.Messages; + +[CLSCompliant(true)] +public class AdapterMessageEventArgs : EventArgs +{ + private EventHandler responder; + + private List handlers; + + private bool canAddHandlers; + + internal bool CanAddHandlers + { + get + { + return canAddHandlers; + } + set + { + canAddHandlers = value; + } + } + + public event EventHandler MessageComplete + { + add + { + responder = (EventHandler)Delegate.Combine(responder, value); + } + remove + { + responder = (EventHandler)Delegate.Remove(responder, value); + } + } + + internal AdapterMessageEventArgs() + { + handlers = new List(); + } + + public void AddHandler(object obj) + { + if (!CanAddHandlers) + { + throw new InvalidOperationException("Unable to add handlers at this time"); + } + if (obj != null) + { + handlers.Add(obj); + } + } + + public void SetComplete(object handler, AdapterMessageResponseEventArgs e) + { + handlers.Remove(handler); + if (handlers.Count == 0) + { + e.Complete = true; + } + if (responder != null) + { + responder(this, e); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageResponseEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageResponseEventArgs.cs new file mode 100644 index 0000000..6c00210 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Messages/AdapterMessageResponseEventArgs.cs @@ -0,0 +1,30 @@ +using System; + +namespace Decal.Adapter.Messages; + +[CLSCompliant(true)] +public class AdapterMessageResponseEventArgs : EventArgs +{ + private bool success; + + private bool complete; + + public bool Succeeded => success; + + public bool Complete + { + get + { + return complete; + } + internal set + { + complete = value; + } + } + + protected AdapterMessageResponseEventArgs(bool success) + { + this.success = success; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParser.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParser.cs new file mode 100644 index 0000000..a0fa33d --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParser.cs @@ -0,0 +1,56 @@ +using System; + +namespace Decal.Adapter.NetParser; + +internal class MemberParser : MarshalByRefObject +{ + public MemberParser Next; + + public MemberParser Child; + + public MemberParserType MemberType; + + public string MemberName; + + public MemberParserCondition Condition; + + public string ConditionField; + + public long ConditionXor; + + public long ConditionAnd; + + public long ConditionResult; + + public string LengthField; + + public long LengthMask; + + public int LengthDelta; + + public int PreAlignment; + + public int PostAlignment; + + public MemberParser() + { + } + + public MemberParser(MemberParser Source) + { + Next = Source.Next; + Child = Source.Child; + MemberType = Source.MemberType; + MemberName = Source.MemberName; + Condition = Source.Condition; + ConditionField = Source.ConditionField; + ConditionXor = Source.ConditionXor; + ConditionAnd = Source.ConditionAnd; + ConditionResult = Source.ConditionResult; + LengthField = Source.LengthField; + LengthMask = Source.LengthMask; + LengthDelta = Source.LengthDelta; + PreAlignment = Source.PreAlignment; + PostAlignment = Source.PostAlignment; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserCondition.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserCondition.cs new file mode 100644 index 0000000..7b8741a --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserCondition.cs @@ -0,0 +1,12 @@ +namespace Decal.Adapter.NetParser; + +internal enum MemberParserCondition +{ + None, + EQ, + NE, + GE, + GT, + LE, + LT +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserType.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserType.cs new file mode 100644 index 0000000..50f98ca --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MemberParserType.cs @@ -0,0 +1,18 @@ +namespace Decal.Adapter.NetParser; + +internal enum MemberParserType +{ + BYTE, + WORD, + PackedWORD, + DWORD, + PackedDWORD, + QWORD, + @float, + @double, + String, + WString, + Struct, + Vector, + Case +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageFactory.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageFactory.cs new file mode 100644 index 0000000..e3ab711 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageFactory.cs @@ -0,0 +1,24 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Adapter.NetParser; + +[ComVisible(true)] +[ClassInterface(ClassInterfaceType.None)] +[ComDefaultInterface(typeof(IMessageFactory))] +[ProgId("DecalAdapter.MessageFactory")] +[Guid("59D7815E-6716-4bd7-B264-69B6A9382701")] +public class MessageFactory : IMessageFactory +{ + IMessage2 IMessageFactory.CreateMessage(int pData, int size, bool outgoing) + { + if (pData != 0 && size != 0) + { + byte[] array = (byte[])Array.CreateInstance(typeof(byte), size); + Marshal.Copy(new IntPtr(pData), array, 0, size); + return new MessageWrapper(new Message(array, Message.GetParser(BitConverter.ToInt32(array, 0), outgoing ? MessageDirection.Outbound : MessageDirection.Inbound))); + } + return null; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageMemberWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageMemberWrapper.cs new file mode 100644 index 0000000..368a9a2 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageMemberWrapper.cs @@ -0,0 +1,62 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Adapter.NetParser; + +[ComVisible(true)] +[ClassInterface(ClassInterfaceType.None)] +[ComDefaultInterface(typeof(IMessageMember))] +[ProgId("DecalAdapter.MessageMemberWrapper")] +[Guid("BD22CFC5-0950-4ab3-9752-5053EE934BE6")] +public class MessageMemberWrapper : MessageRootImpl, IMessageMember +{ + public int BeginOffset => Data.mOffset; + + public int Count => Data.Count; + + public int EndOffset => Data.mOffset + Data.mLength; + + // IMessageMember properties - parameterless accessors for the COM interface + object IMessageMember.Value => get_Value(0); + byte[] IMessageMember.RawValue => get_RawValue(0); + IMessageMember IMessageMember.Struct => get_Struct(0); + + public MessageMemberWrapper() + { + } + + internal MessageMemberWrapper(MessageStruct msg, MessageWrapper wrapper) + : base(msg, wrapper) + { + } + + public string get_FieldName(int Index) + { + return Data.Name(Index); + } + + public byte[] get_RawValue(object vIndex) + { + return Data.RawValue(Data.ObjectToIndex(vIndex)); + } + + public IMessageMember get_Struct(object vIndex) + { + int num = Data.ObjectToIndex(vIndex); + if (num < 0) + { + throw new COMHResultException((HResults)(-2147352571)); + } + return new MessageMemberWrapper(Data.Struct(num), Wrapped); + } + + public object get_Value(object vIndex) + { + int num = Data.ObjectToIndex(vIndex); + if (num >= 0) + { + return Data.Value(num); + } + throw new COMHResultException((HResults)(-2147352571)); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootImpl.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootImpl.cs new file mode 100644 index 0000000..a5a31d7 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootImpl.cs @@ -0,0 +1,130 @@ +using System.Diagnostics; +using Decal.Interop.Net; + +namespace Decal.Adapter.NetParser; + +public class MessageRootImpl : MessageRoot, IMessageIterator +{ + protected MessageWrapper Wrapped; + + protected MessageStruct Data; + + protected int FieldIndex; + + protected const int Error = -1; + + public object Current => Data.Value(FieldIndex); + + public string FieldName => Data.Name(FieldIndex); + + public int Index => FieldIndex; + + public IMessage Message => Wrapped; + + public MessageRoot NextObjectIndex + { + [DebuggerNonUserCode] + get + { + if (FieldIndex < Data.mCount) + { + MessageMemberWrapper result = new MessageMemberWrapper(Data.Struct(FieldIndex), Wrapped); + FieldIndex++; + return result; + } + throw new COMHResultException(HResults.E_FAIL); + } + } + + // IMessageIterator properties - parameterless accessors for the COM interface. + // The parameterized get_Next/get_NextString etc. below are the COM parameterized property accessors. + object IMessageIterator.Next => throw new COMHResultException(HResults.E_FAIL); + string IMessageIterator.NextString => throw new COMHResultException(HResults.E_FAIL); + int IMessageIterator.NextInt => throw new COMHResultException(HResults.E_FAIL); + double IMessageIterator.NextFloat => throw new COMHResultException(HResults.E_FAIL); + MessageRoot IMessageIterator.NextObject => throw new COMHResultException(HResults.E_FAIL); + ulong IMessageIterator.NextQWord => throw new COMHResultException(HResults.E_FAIL); + + protected MessageRootImpl() + { + } + + protected MessageRootImpl(MessageStruct data, MessageWrapper wrapper) + : this() + { + Wrapped = wrapper; + Data = data; + if (!Data.mParsed) + { + Data.Parse(); + } + } + + public void Reset() + { + FieldIndex = 0; + } + + [DebuggerNonUserCode] + private T GetNext(string name) + { + FieldIndex = Data.IndexFromName(name); + if (FieldIndex != -1) + { + return Data.Value(FieldIndex); + } + throw new COMHResultException(HResults.E_FAIL); + } + + [DebuggerNonUserCode] + private T GetNext(int index) + { + if (index >= 0 && index < Data.mCount) + { + FieldIndex = index; + return Data.Value(FieldIndex); + } + throw new COMHResultException(HResults.E_FAIL); + } + + [DebuggerNonUserCode] + public object get_Next(object vIndex) + { + return GetNext(Data.ObjectToIndex(vIndex)); + } + + [DebuggerNonUserCode] + public double get_NextFloat(string Name) + { + return GetNext(Name); + } + + [DebuggerNonUserCode] + public int get_NextInt(string Name) + { + return GetNext(Name); + } + + [DebuggerNonUserCode] + public MessageRoot get_NextObject(string Name) + { + FieldIndex = Data.IndexFromName(Name); + if (FieldIndex != -1) + { + return new MessageMemberWrapper(Data.Struct(FieldIndex), Wrapped); + } + throw new COMHResultException(HResults.E_FAIL); + } + + [DebuggerNonUserCode] + public ulong get_NextQWord(string Name) + { + return GetNext(Name); + } + + [DebuggerNonUserCode] + public string get_NextString(string Name) + { + return GetNext(Name); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootWrapper.cs new file mode 100644 index 0000000..325a935 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageRootWrapper.cs @@ -0,0 +1,21 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Adapter.NetParser; + +[ComVisible(true)] +[ClassInterface(ClassInterfaceType.None)] +[ComDefaultInterface(typeof(MessageRoot))] +[ProgId("DecalAdapter.MessageRootWrapper")] +[Guid("E33FBF17-B6C5-471e-9ED6-A394DEDEBFE5")] +public class MessageRootWrapper : MessageRootImpl +{ + public MessageRootWrapper() + { + } + + internal MessageRootWrapper(MessageWrapper msg) + : base(msg.Wrapped.mStruct, msg) + { + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageWrapper.cs new file mode 100644 index 0000000..c604a81 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.NetParser/MessageWrapper.cs @@ -0,0 +1,77 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Adapter.NetParser; + +[ComVisible(true)] +[ClassInterface(ClassInterfaceType.None)] +[ComDefaultInterface(typeof(IMessage2))] +[ProgId("DecalAdapter.MessageWrapper")] +[Guid("76142307-98E3-494d-8320-3C801010221D")] +public class MessageWrapper : IMessage2, IMessage +{ + private Message msg; + + internal Message Wrapped => msg; + + public MessageRoot Begin => new MessageRootWrapper(this); + + public int Count => msg.Count; + + public byte[] RawData => msg.RawData; + + public int Type => msg.Type; + + // IMessage/IMessage2 properties - parameterless accessors for the COM interface + object IMessage.Value => get_Value(0); + IMessageMember IMessage.Struct => get_Struct(0); + byte[] IMessage.RawValue => get_RawValue(0); + string IMessage.FieldName => get_FieldName(0); + object IMessage2.Value => get_Value(0); + IMessageMember IMessage2.Struct => get_Struct(0); + byte[] IMessage2.RawValue => get_RawValue(0); + string IMessage2.FieldName => get_FieldName(0); + + public MessageWrapper() + { + } + + internal MessageWrapper(Message msg) + { + this.msg = msg; + if (!this.msg.mStruct.mParsed) + { + this.msg.mStruct.Parse(); + } + } + + public string get_FieldName(int Index) + { + return msg.Name(Index); + } + + public byte[] get_RawValue(object vElement) + { + return msg.RawValue(msg.mStruct.ObjectToIndex(vElement)); + } + + public IMessageMember get_Struct(object vElement) + { + int num = msg.mStruct.ObjectToIndex(vElement); + if (num < 0) + { + throw new COMHResultException((HResults)1); + } + return new MessageMemberWrapper(msg.Struct(num), this); + } + + public object get_Value(object vElement) + { + int num = msg.mStruct.ObjectToIndex(vElement); + if (num >= 0) + { + return msg.Value(num); + } + return null; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Support/Util.cs b/Managed/Decal.Adapter/Decal.Adapter.Support/Util.cs new file mode 100644 index 0000000..dae78a0 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Support/Util.cs @@ -0,0 +1,176 @@ +#define TRACE +using System; +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using Decal.Interop.Core; +using Microsoft.CSharp; +using Microsoft.Win32; + +namespace Decal.Adapter.Support; + +internal static class Util +{ + private static int mTrace; + + internal static int TraceLevel + { + get + { + return mTrace; + } + set + { + mTrace = value; + } + } + + internal static Color ColorFromBGR(int color) + { + return Color.FromArgb(color & 0xFF, (color & 0xFF00) >> 8, (color & 0xFF0000) >> 16); + } + + internal static int ColorToBGR(Color color) + { + return (color.B << 16) | (color.G << 8) | color.R; + } + + internal static Rectangle toRectangle(tagRECT tr) + { + return new Rectangle(tr.left, tr.top, tr.right - tr.left, tr.bottom - tr.top); + } + + internal static tagRECT toTagRECT(Rectangle r) + { + tagRECT result = default(tagRECT); + result.top = r.Top; + result.left = r.Left; + result.bottom = r.Bottom; + result.right = r.Right; + return result; + } + + internal static T UnboxTo(object obj) + { + //IL_000a: Unknown result type (might be due to invalid IL or missing references) + try + { + return (T)obj; + } + catch (InvalidCastException) + { + TypeConverter converter = ((CodeDomProvider)new CSharpCodeProvider()).GetConverter(obj.GetType()); + if (converter.CanConvertTo(typeof(T))) + { + return (T)converter.ConvertTo(obj, typeof(T)); + } + WriteLine("Error Converting object type {0} to {1}", obj.GetType(), typeof(T)); + throw; + } + } + + internal static void InitializeTracing(string key, string value, int defaultValue) + { + try + { + TraceLevel = (int)Registry.GetValue(key, value, defaultValue); + } + catch + { + TraceLevel = 0; + } + } + + public static void WriteLine(string fmt, params object[] args) + { + WriteLine(1, fmt, args); + } + + public static void WriteLine(int traceLevel, string fmt, params object[] args) + { + WriteLine(traceLevel, string.Format(fmt, args)); + } + + public static void WriteLine(int traceLevel, string msg) + { + Trace.WriteLineIf(mTrace >= traceLevel, msg); + } + + public static void Write(string fmt, params object[] args) + { + Write(1, string.Format(fmt, args)); + } + + public static void Write(int traceLevel, string msg) + { + Trace.WriteIf(mTrace >= traceLevel, msg); + } + + public static void SafeFireEvent(object sender, EventHandler eventHandler, EventArgs args) + { + if (eventHandler == null) + { + return; + } + Delegate[] invocationList = eventHandler.GetInvocationList(); + for (int i = 0; i < invocationList.Length; i++) + { + EventHandler eventHandler2 = (EventHandler)invocationList[i]; + try + { + eventHandler2(sender, args); + } + catch (Exception ex) + { + WriteLine("SafeFire exception: {0}", ex.ToString()); + } + } + } + + public static void SafeFireEvent(object sender, EventHandler eventHandler, T args) where T : EventArgs + { + if (eventHandler == null) + { + return; + } + Delegate[] invocationList = eventHandler.GetInvocationList(); + for (int i = 0; i < invocationList.Length; i++) + { + EventHandler eventHandler2 = (EventHandler)invocationList[i]; + try + { + eventHandler2(sender, args); + } + catch (Exception ex) + { + WriteLine("SafeFire exception: {0}", ex.ToString()); + } + } + } + + public static void SafeFireEvent(object sender, EventHandler eventHandler, T args, ref bool eaten) where T : EatableEventArgs + { + if (eventHandler == null) + { + return; + } + Delegate[] invocationList = eventHandler.GetInvocationList(); + for (int i = 0; i < invocationList.Length; i++) + { + EventHandler eventHandler2 = (EventHandler)invocationList[i]; + try + { + eventHandler2(sender, args); + if (args.Eat) + { + eaten = true; + } + } + catch (Exception ex) + { + WriteLine("SafeFire exception: {0}", ex.ToString()); + } + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AcceptTradeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AcceptTradeEventArgs.cs new file mode 100644 index 0000000..212c690 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AcceptTradeEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class AcceptTradeEventArgs : EventArgs +{ + private int mTargetId; + + public int TargetId => mTargetId; + + internal AcceptTradeEventArgs(int TargetId) + { + mTargetId = TargetId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AccountCharInfo.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AccountCharInfo.cs new file mode 100644 index 0000000..397b94b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AccountCharInfo.cs @@ -0,0 +1,22 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class AccountCharInfo : MarshalByRefObject +{ + private int myIndex; + + private CharacterFilter myFilter; + + public string Name => myFilter.get_AccountCharName(myIndex); + + public int Id => myFilter.get_AccountCharID(myIndex); + + public int Index => myIndex; + + internal AccountCharInfo(CharacterFilter filter, int index) + { + myFilter = filter; + myIndex = index; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddRemoveEventType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddRemoveEventType.cs new file mode 100644 index 0000000..acedb9b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddRemoveEventType.cs @@ -0,0 +1,10 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum AddRemoveEventType +{ + Add, + Delete +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddTradeItemEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddTradeItemEventArgs.cs new file mode 100644 index 0000000..866768b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AddTradeItemEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class AddTradeItemEventArgs : EventArgs +{ + private int mItemId; + + private int mSideId; + + public int ItemId => mItemId; + + public int SideId => mSideId; + + internal AddTradeItemEventArgs(int ItemId, int SideId) + { + mItemId = ItemId; + mSideId = SideId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AllegianceInfoWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AllegianceInfoWrapper.cs new file mode 100644 index 0000000..bbaed41 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AllegianceInfoWrapper.cs @@ -0,0 +1,71 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class AllegianceInfoWrapper : MarshalByRefObject, IDisposable +{ + private AllegianceInfo myAllegianceInfo; + + private bool isDisposed; + + public int Id => myAllegianceInfo.GUID; + + public int Gender => myAllegianceInfo.Gender; + + public int Leadership => myAllegianceInfo.Leadership; + + public int Loyalty => myAllegianceInfo.Loyalty; + + public string Name => myAllegianceInfo.Name; + + public int Race => myAllegianceInfo.Race; + + public int Rank => myAllegianceInfo.Rank; + + public int ParentId => myAllegianceInfo.TreeParent; + + public int Type => myAllegianceInfo.Type; + + public double Unknown => myAllegianceInfo.Unknown; + + public long XP => myAllegianceInfo.XP_64; + + internal AllegianceInfoWrapper(AllegianceInfo info) + { + myAllegianceInfo = info; + } + + ~AllegianceInfoWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myAllegianceInfo != null) + { + Marshal.ReleaseComObject(myAllegianceInfo); + } + isDisposed = true; + } + + protected void EnforceDisposedOnce() + { + if (isDisposed) + { + throw new ObjectDisposedException("AllegianceInfoWrapper"); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ApproachVendorEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ApproachVendorEventArgs.cs new file mode 100644 index 0000000..82caaac --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ApproachVendorEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ApproachVendorEventArgs : EventArgs +{ + private int mMerchantId; + + private Vendor vendor; + + public int MerchantId => mMerchantId; + + public Vendor Vendor => vendor; + + internal ApproachVendorEventArgs(int MerchantId, Vendor ven) + { + mMerchantId = MerchantId; + vendor = ven; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeInfoWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeInfoWrapper.cs new file mode 100644 index 0000000..677a1d4 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeInfoWrapper.cs @@ -0,0 +1,59 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class AttributeInfoWrapper : MarshalByRefObject, IDisposable +{ + private AttributeInfo myAttribInfo; + + private bool isDisposed; + + public int Base => myAttribInfo.Base; + + public int Buffed => myAttribInfo.Buffed; + + public int Creation => myAttribInfo.Creation; + + public int Exp => myAttribInfo.Exp; + + public string Name => myAttribInfo.Name; + + internal AttributeInfoWrapper(AttributeInfo info) + { + myAttribInfo = info; + } + + ~AttributeInfoWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myAttribInfo != null) + { + Marshal.ReleaseComObject(myAttribInfo); + } + isDisposed = true; + } + + protected void EnforceDisposedOnce() + { + if (isDisposed) + { + throw new ObjectDisposedException("AttributeInfoWrapper"); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeType.cs new file mode 100644 index 0000000..58485ce --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/AttributeType.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum AttributeType +{ + CurrentStrength = 1, + CurrentEndurance, + CurrentQuickness, + CurrentCoordination, + CurrentFocus, + CurrentSelf, + BaseStrength, + BaseEndurance, + BaseQuickness, + BaseCoordination, + BaseFocus, + BaseSelf +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Augmentations.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Augmentations.cs new file mode 100644 index 0000000..b5a8ae7 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Augmentations.cs @@ -0,0 +1,78 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum Augmentations +{ + ReinforcementLugians = 218, + BleearghFortitude = 219, + OswaldEnchancement = 220, + SiraluunBlessing = 221, + EnduringCalm = 222, + SteadfastWill = 223, + CiandraEssence = 224, + YoshiEssence = 225, + JibrilEssence = 226, + CeldisethEssence = 227, + KogaEssence = 228, + ShadowSeventhMule = 229, + MightSeventhMule = 230, + ClutchMiser = 231, + EnduringEnchantment = 232, + CriticalProtection = 233, + QuickLearner = 234, + CiandraFortune = 235, + CharmedSmith = 236, + InnateRenewal = 237, + ArchmageEndurance = 238, + BladeTurner = 240, + ArrowTurner = 241, + MaceTurner = 242, + CausticEnhancement = 243, + FieryEnchancment = 244, + IcyEnchancement = 245, + LightningEnhancement = 246, + InfusedCreature = 294, + InfusedItem = 295, + InfusedLife = 296, + InfusedWar = 297, + EyeRemorseless = 298, + HandRemorseless = 299, + MasterSteelCircle = 300, + MasterFocusedEyed = 301, + MasterFiveFoldPath = 302, + FrenzySlayer = 309, + IronSkinInvincible = 310, + JackOfAllTrades = 326, + InfusedVoid = 328, + [Obsolete("Use InfusedVoid")] + UnknownAug1 = 328, + [Obsolete("Not an aug")] + UnknownAug2 = 329, + [Obsolete("Not an aug")] + UnknownAug3 = 330, + [Obsolete("Not an aug")] + UnknownAug4 = 331, + [Obsolete("Not an aug")] + UnknownAug5 = 332, + AuraValor = 333, + AuraProtection = 334, + AuraGlory = 335, + AuraTemperance = 336, + AuraSurge = 337, + [Obsolete("Not an aug")] + UnknownAug6 = 337, + AuraAethericVision = 338, + AuraManaFlow = 339, + AuraManaInfusion = 340, + [Obsolete("Use AuraManaInfusion")] + UnknownAug7 = 340, + AuraVitality = 341, + [Obsolete("Use AuraVitality")] + UnknownAug8 = 341, + AuraPurity = 342, + AuraCraftsman = 343, + AuraSpecialization = 344, + AuraWorld = 365 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Background.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Background.cs new file mode 100644 index 0000000..200bfbb --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Background.cs @@ -0,0 +1,29 @@ +using System; +using Decal.Interop.Render; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class Background : HudRenderTarget +{ + private HUDBackground internalBackground; + + internal HUDBackground Underlying => internalBackground; + + internal Background(HUDBackground background) + : base(background) + { + internalBackground = background; + } + + public Background Clone() + { + return new Background(internalBackground.Clone()); + } + + protected override void Dispose(bool disposing) + { + internalBackground = null; + base.Dispose(disposing); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/BoolValueKey.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/BoolValueKey.cs new file mode 100644 index 0000000..5f19318 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/BoolValueKey.cs @@ -0,0 +1,16 @@ +namespace Decal.Adapter.Wrappers; + +public enum BoolValueKey +{ + Lockable = 201326592, + Inscribable = 201326593, + Open = 2, + Locked = 3, + HookVisibility = 24, + UnlimitedUses = 63, + CanBeSold = 69, + Retained = 91, + Ivoryable = 99, + Dyeable = 100, + AwayFromKeyboard = 110 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ButtonWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ButtonWrapper.cs new file mode 100644 index 0000000..422c11a --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ButtonWrapper.cs @@ -0,0 +1,229 @@ +using System; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Inject; + +namespace Decal.Adapter.Wrappers; + +public class ButtonWrapper : ControlWrapperBase +{ + private EventHandler evtClick; + + private EventHandler evtCancel; + + private EventHandler evtDestroy; + + private EventHandler evtHit; + + private EventHandler evtUnhit; + + private int myBackground; + + public Color Matte + { + get + { + return Util.ColorFromBGR(base.Control.Matte); + } + set + { + base.Control.Matte = Util.ColorToBGR(value); + } + } + + public int Background + { + get + { + return myBackground; + } + set + { + myBackground = value; + base.Control.SetBackground(myBackground); + } + } + + public event EventHandler Click + { + add + { + if (evtClick == null) + { + base.Control.Accepted += ClickEvent; + } + evtClick = (EventHandler)Delegate.Combine(evtClick, value); + } + remove + { + evtClick = (EventHandler)Delegate.Remove(evtClick, value); + if (evtClick == null) + { + base.Control.Accepted -= ClickEvent; + } + } + } + + public event EventHandler Canceled + { + add + { + if (evtCancel == null) + { + base.Control.Canceled += CanceledEvent; + } + evtCancel = (EventHandler)Delegate.Combine(evtCancel, value); + } + remove + { + evtCancel = (EventHandler)Delegate.Remove(evtCancel, value); + if (evtCancel == null) + { + base.Control.Canceled -= CanceledEvent; + } + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + public event EventHandler Hit + { + add + { + if (evtHit == null) + { + base.Control.Hit += HitEvent; + } + evtHit = (EventHandler)Delegate.Combine(evtHit, value); + } + remove + { + evtHit = (EventHandler)Delegate.Remove(evtHit, value); + if (evtHit == null) + { + base.Control.Hit -= HitEvent; + } + } + } + + public event EventHandler Unhit + { + add + { + if (evtUnhit == null) + { + base.Control.Unhit += UnhitEvent; + } + evtUnhit = (EventHandler)Delegate.Combine(evtUnhit, value); + } + remove + { + evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, value); + if (evtUnhit == null) + { + base.Control.Unhit -= UnhitEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtClick != null) + { + evtClick = (EventHandler)Delegate.Remove(evtClick, evtClick); + base.Control.Accepted -= ClickEvent; + } + if (evtCancel != null) + { + evtCancel = (EventHandler)Delegate.Remove(evtCancel, evtCancel); + base.Control.Canceled -= CanceledEvent; + } + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + if (evtHit != null) + { + evtHit = (EventHandler)Delegate.Remove(evtHit, evtHit); + base.Control.Hit -= HitEvent; + } + if (evtUnhit != null) + { + evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, evtUnhit); + base.Control.Unhit -= UnhitEvent; + } + } + base.Dispose(disposing); + } + + public void SetImages(int released, int pressed) + { + SetImages(0, released, pressed); + } + + public void SetImages(int module, int released, int pressed) + { + base.Control.SetImages(module, released, pressed); + } + + private void ClickEvent(int ID) + { + if (evtClick != null) + { + evtClick(this, new ControlEventArgs(ID)); + } + } + + private void UnhitEvent(int ID) + { + if (evtUnhit != null) + { + evtUnhit(this, new ControlEventArgs(ID)); + } + } + + private void HitEvent(int ID) + { + if (evtHit != null) + { + evtHit(this, new ControlEventArgs(ID)); + } + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } + + private void CanceledEvent(int ID) + { + if (evtCancel != null) + { + evtCancel(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByAllFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByAllFilter.cs new file mode 100644 index 0000000..33c0c5d --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByAllFilter.cs @@ -0,0 +1,16 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByAllFilter : WorldObjectCollectionFilter +{ + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByAll(); + } + + internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) + { + ven.ByAll(); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByCategoryFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByCategoryFilter.cs new file mode 100644 index 0000000..8d47f81 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByCategoryFilter.cs @@ -0,0 +1,39 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByCategoryFilter : WorldObjectCollectionFilter +{ + private int category; + + public int Category + { + get + { + return category; + } + set + { + category = value; + } + } + + public ByCategoryFilter() + { + } + + public ByCategoryFilter(int category) + { + this.category = category; + } + + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByCategory(category); + } + + internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) + { + ven.ByCategory(category); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByContainerFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByContainerFilter.cs new file mode 100644 index 0000000..42ded7c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByContainerFilter.cs @@ -0,0 +1,34 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByContainerFilter : WorldObjectCollectionFilter +{ + private int container; + + public int Container + { + get + { + return container; + } + set + { + container = value; + } + } + + public ByContainerFilter() + { + } + + public ByContainerFilter(int container) + { + this.container = container; + } + + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByContainer(container); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByInventoryFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByInventoryFilter.cs new file mode 100644 index 0000000..0f798d0 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByInventoryFilter.cs @@ -0,0 +1,11 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByInventoryFilter : WorldObjectCollectionFilter +{ + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByInventory(); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByLandscapeFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByLandscapeFilter.cs new file mode 100644 index 0000000..4184eb2 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByLandscapeFilter.cs @@ -0,0 +1,11 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByLandscapeFilter : WorldObjectCollectionFilter +{ + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByLandscape(); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameFilter.cs new file mode 100644 index 0000000..7d25bbc --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameFilter.cs @@ -0,0 +1,39 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByNameFilter : WorldObjectCollectionFilter +{ + private string name; + + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + public ByNameFilter() + { + } + + public ByNameFilter(string name) + { + this.name = name; + } + + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByName(name); + } + + internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) + { + ven.ByName(name); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameSubStringFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameSubStringFilter.cs new file mode 100644 index 0000000..b944b17 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByNameSubStringFilter.cs @@ -0,0 +1,16 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByNameSubStringFilter : ByNameFilter +{ + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByNameSubstring(base.Name); + } + + internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) + { + ven.ByNameSubstring(base.Name); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByObjectClassFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByObjectClassFilter.cs new file mode 100644 index 0000000..0ccc7ab --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByObjectClassFilter.cs @@ -0,0 +1,39 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByObjectClassFilter : WorldObjectCollectionFilter +{ + private ObjectClass objClass; + + public ObjectClass ObjectClass + { + get + { + return objClass; + } + set + { + objClass = value; + } + } + + public ByObjectClassFilter() + { + } + + public ByObjectClassFilter(ObjectClass objClass) + { + this.objClass = objClass; + } + + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByObjectClass((eObjectClass)objClass); + } + + internal override void ApplyFilter(Decal.Interop.Filters.Vendor ven) + { + ven.ByObjectClass((eObjectClass)objClass); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByOwnerFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByOwnerFilter.cs new file mode 100644 index 0000000..ef630fc --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ByOwnerFilter.cs @@ -0,0 +1,34 @@ +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ByOwnerFilter : WorldObjectCollectionFilter +{ + private int owner; + + public int Owner + { + get + { + return owner; + } + set + { + owner = value; + } + } + + public ByOwnerFilter() + { + } + + public ByOwnerFilter(int owner) + { + this.owner = owner; + } + + internal override void ApplyFilter(WorldIterator wi) + { + wi.ByOwner(owner); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CastEventType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CastEventType.cs new file mode 100644 index 0000000..2d81540 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CastEventType.cs @@ -0,0 +1,10 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum CastEventType +{ + Untargetted, + Targetted +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeEnchantmentsEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeEnchantmentsEventArgs.cs new file mode 100644 index 0000000..61e5447 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeEnchantmentsEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeEnchantmentsEventArgs : EventArgs +{ + private AddRemoveEventType myType; + + private EnchantmentWrapper myEnchantment; + + public AddRemoveEventType Type => myType; + + public EnchantmentWrapper Enchantment => myEnchantment; + + internal ChangeEnchantmentsEventArgs(AddRemoveEventType type, EnchantmentWrapper enchantment) + { + myType = type; + myEnchantment = enchantment; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeExperienceEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeExperienceEventArgs.cs new file mode 100644 index 0000000..b354a1c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeExperienceEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeExperienceEventArgs : EventArgs +{ + private PlayerXPEventType myType; + + private int myAmount; + + public PlayerXPEventType Type => myType; + + public int Amount => myAmount; + + internal ChangeExperienceEventArgs(PlayerXPEventType type, int amount) + { + myType = type; + myAmount = amount; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeFellowshipEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeFellowshipEventArgs.cs new file mode 100644 index 0000000..121db43 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeFellowshipEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeFellowshipEventArgs : EventArgs +{ + private FellowshipEventType myType; + + private int myId; + + public FellowshipEventType Type => myType; + + public int Id => myId; + + internal ChangeFellowshipEventArgs(FellowshipEventType type, int Id) + { + myType = type; + myId = Id; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeObjectEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeObjectEventArgs.cs new file mode 100644 index 0000000..64218cc --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeObjectEventArgs.cs @@ -0,0 +1,21 @@ +using System; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class ChangeObjectEventArgs : EventArgs +{ + private WorldObject myChangedObject; + + private WorldChangeType myChangeType; + + public WorldObject Changed => myChangedObject; + + public WorldChangeType Change => myChangeType; + + internal ChangeObjectEventArgs(WorldObject changedObject, Decal.Interop.Filters.WorldChangeType changeType) + { + myChangedObject = changedObject; + myChangeType = (WorldChangeType)changeType; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeOptionEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeOptionEventArgs.cs new file mode 100644 index 0000000..742030b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeOptionEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeOptionEventArgs : EventArgs +{ + private int myOption; + + private int myValue; + + public int Option => myOption; + + public int Value => myValue; + + internal ChangeOptionEventArgs(int option, int value) + { + myOption = option; + myValue = value; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePlayerEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePlayerEventArgs.cs new file mode 100644 index 0000000..ca2af81 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePlayerEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangePlayerEventArgs : EventArgs +{ + private PlayerModifyEventType myType; + + private int myStat; + + public PlayerModifyEventType Type => myType; + + public int Stat => myStat; + + internal ChangePlayerEventArgs(PlayerModifyEventType type, int Stat) + { + myType = type; + myStat = Stat; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePortalModeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePortalModeEventArgs.cs new file mode 100644 index 0000000..f821ced --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangePortalModeEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangePortalModeEventArgs : EventArgs +{ + private PortalEventType myType; + + public PortalEventType Type => myType; + + internal ChangePortalModeEventArgs(PortalEventType type) + { + myType = type; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSettingsFlagsEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSettingsFlagsEventArgs.cs new file mode 100644 index 0000000..1b6995e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSettingsFlagsEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeSettingsFlagsEventArgs : EventArgs +{ + private int mySettings; + + public int Settings => mySettings; + + internal ChangeSettingsFlagsEventArgs(int settings) + { + mySettings = settings; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeShortcutEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeShortcutEventArgs.cs new file mode 100644 index 0000000..70c7f1e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeShortcutEventArgs.cs @@ -0,0 +1,25 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeShortcutEventArgs : EventArgs +{ + private AddRemoveEventType myType; + + private int mySlot; + + private int myObjectId; + + public AddRemoveEventType Type => myType; + + public int Slot => mySlot; + + public int ObjectId => myObjectId; + + internal ChangeShortcutEventArgs(AddRemoveEventType type, int Slot, int ObjectId) + { + myType = type; + mySlot = Slot; + myObjectId = ObjectId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSpellbarEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSpellbarEventArgs.cs new file mode 100644 index 0000000..71dafdc --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeSpellbarEventArgs.cs @@ -0,0 +1,30 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeSpellbarEventArgs : EventArgs +{ + private AddRemoveEventType myType; + + private int myTab; + + private int mySlot; + + private int mySpellId; + + public AddRemoveEventType Type => myType; + + public int Tab => myTab; + + public int Slot => mySlot; + + public int SpellId => mySpellId; + + internal ChangeSpellbarEventArgs(AddRemoveEventType type, int Tab, int Slot, int SpellId) + { + myType = type; + myTab = Tab; + mySlot = Slot; + mySpellId = SpellId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeVitalEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeVitalEventArgs.cs new file mode 100644 index 0000000..6a63c87 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChangeVitalEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ChangeVitalEventArgs : EventArgs +{ + private CharFilterVitalType myType; + + private int myAmount; + + public CharFilterVitalType Type => myType; + + public int Amount => myAmount; + + internal ChangeVitalEventArgs(CharFilterVitalType type, int amount) + { + myType = type; + myAmount = amount; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterAttributeType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterAttributeType.cs new file mode 100644 index 0000000..aba9dcd --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterAttributeType.cs @@ -0,0 +1,14 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum CharFilterAttributeType +{ + Strength = 1, + Endurance, + Quickness, + Coordination, + Focus, + Self +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterIndex.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterIndex.cs new file mode 100644 index 0000000..479a935 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterIndex.cs @@ -0,0 +1,16 @@ +namespace Decal.Adapter.Wrappers; + +public enum CharFilterIndex +{ + Vassals, + Enchantments, + Vitals, + Attributes, + Skills, + Characters, + Spells, + Augmentations, + EffectiveAttributes, + EffectiveVitals, + EffectiveSkills +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterSkillType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterSkillType.cs new file mode 100644 index 0000000..d2a2e15 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterSkillType.cs @@ -0,0 +1,57 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum CharFilterSkillType +{ + Axe = 1, + Bow = 2, + Crossbow = 3, + Dagger = 4, + Mace = 5, + MeleeDefense = 6, + MissileDefense = 7, + Spear = 9, + Staff = 10, + Sword = 11, + ThrownWeapons = 12, + Unarmed = 13, + ArcaneLore = 14, + MagicDefense = 15, + ManaConversion = 16, + ItemTinkering = 18, + AssessPerson = 19, + Deception = 20, + Healing = 21, + Jump = 22, + Lockpick = 23, + Run = 24, + AssessCreature = 27, + WeaponTinkering = 28, + ArmorTinkering = 29, + MagicItemTinkering = 30, + CreatureEnchantment = 31, + ItemEnchantment = 32, + LifeMagic = 33, + WarMagic = 34, + Leadership = 35, + Loyalty = 36, + Fletching = 37, + Alchemy = 38, + Cooking = 39, + Salvaging = 40, + TwoHandedCombat = 41, + Gearcraft = 42, + VoidMagic = 43, + HeavyWeapons = 44, + LightWeapons = 45, + FinesseWeapons = 46, + MissileWeapons = 47, + Shield = 48, + DualWield = 49, + Recklessness = 50, + SneakAttack = 51, + DirtyFighting = 52, + Summoning = 54 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterVitalType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterVitalType.cs new file mode 100644 index 0000000..16d2db0 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharFilterVitalType.cs @@ -0,0 +1,11 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum CharFilterVitalType +{ + Health = 2, + Stamina = 4, + Mana = 6 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharacterFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharacterFilter.cs new file mode 100644 index 0000000..e5e54b7 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CharacterFilter.cs @@ -0,0 +1,1173 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Decal.Adapter.Support; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class CharacterFilter : GenericDisposableWrapper, IIndexedProvider +{ + private EventHandler mSpellCast; + + private EventHandler mStatusMessage; + + private EventHandler mSpellbookChange; + + private EventHandler mChangePortalMode; + + private EventHandler mChangePlayer; + + private EventHandler mChangeFellowship; + + private EventHandler mChangeEnchantments; + + private EventHandler mChangeExperience; + + private EventHandler mChangeVital; + + private EventHandler mChangeSpellbar; + + private EventHandler mChangeShortcut; + + private EventHandler mLogin; + + private EventHandler mLogoff; + + private EventHandler mDeath; + + private EventHandler mChangeSettings; + + private EventHandler mActionComplete; + + private EventHandler mLoginComplete; + + private EventHandler mChangeSettingsFlags; + + private EventHandler mChangeOption; + + private Collection mySpellBook; + + private ReadOnlyCollection myAugmentations; + + private Dictionary> mySpellBars; + + private Dictionary allegianceData; + + private Dictionary enchantmentData; + + private Dictionary vitalSkillData; + + private Dictionary attributeData; + + public string AccountName + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.AccountName; + } + } + + public int Age + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Age; + } + } + + public DateTime Birth + { + get + { + EnforceDisposedOnce(); + return new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(base.Wrapped.Birth); + } + } + + public int Burden + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Burden; + } + } + + public int BurdenUnits + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.BurdenUnits; + } + } + + public string Name + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Name; + } + } + + public int Id + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Character; + } + } + + public int CharacterOptions + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.CharacterOptions; + } + } + + public int CharacterOptionFlags => base.Wrapped.CharacterOptionFlags; + + public string ClassTemplate + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.ClassTemplate; + } + } + + public int Deaths + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Deaths; + } + } + + public string Gender + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Gender; + } + } + + public int Health + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Health; + } + } + + public int Stamina + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Stamina; + } + } + + public int Mana + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Mana; + } + } + + public int Level + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Level; + } + } + + public int LoginStatus + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.LoginStatus; + } + } + + public string Race + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Race; + } + } + + public int Rank + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Rank; + } + } + + public string Server + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Server; + } + } + + public int ServerPopulation + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.ServerPopulation; + } + } + + public long TotalXP + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.TotalXP_64; + } + } + + [CLSCompliant(false)] + public IndexedCollection Vassals + { + get + { + EnforceDisposedOnce(); + return new IndexedCollection(this, CharFilterIndex.Vassals); + } + } + + [CLSCompliant(false)] + public IndexedCollection Characters + { + get + { + EnforceDisposedOnce(); + return new IndexedCollection(this, CharFilterIndex.Characters); + } + } + + [CLSCompliant(false)] + public IndexedCollection Enchantments + { + get + { + EnforceDisposedOnce(); + return new IndexedCollection(this, CharFilterIndex.Enchantments); + } + } + + [CLSCompliant(false)] + public IndexedCollection Vitals + { + get + { + EnforceDisposedOnce(); + return new IndexedCollection(this, CharFilterIndex.Vitals); + } + } + + [CLSCompliant(false)] + public IndexedCollection Attributes + { + get + { + EnforceDisposedOnce(); + return new IndexedCollection(this, CharFilterIndex.Attributes); + } + } + + [CLSCompliant(false)] + public IndexedCollection Skills + { + get + { + EnforceDisposedOnce(); + return new IndexedCollection(this, CharFilterIndex.Skills); + } + } + + public long UnassignedXP + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.UnassignedXP_64; + } + } + + public int Vitae + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Vitae; + } + } + + public AllegianceInfoWrapper Monarch + { + get + { + EnforceDisposedOnce(); + string key = "Monarch"; + AllegianceInfo monarch = base.Wrapped.Monarch; + AllegianceInfoWrapper value = null; + if (allegianceData.TryGetValue(key, out value) && value.Id != monarch.GUID) + { + allegianceData.Remove(key); + value.Dispose(); + value = null; + } + if (value == null) + { + value = new AllegianceInfoWrapper(monarch); + allegianceData.Add(key, value); + } + return value; + } + } + + public AllegianceInfoWrapper Patron + { + get + { + EnforceDisposedOnce(); + string key = "Patron"; + AllegianceInfo patron = base.Wrapped.Patron; + AllegianceInfoWrapper value = null; + if (allegianceData.TryGetValue(key, out value) && value.Id != patron.GUID) + { + allegianceData.Remove(key); + value.Dispose(); + value = null; + } + if (value == null) + { + value = new AllegianceInfoWrapper(patron); + allegianceData.Add(key, value); + } + return value; + } + } + + public AllegianceInfoWrapper Allegiance + { + get + { + EnforceDisposedOnce(); + string key = "MyAllegiance"; + AllegianceInfoWrapper value = null; + if (allegianceData.TryGetValue(key, out value)) + { + allegianceData.Remove(key); + value.Dispose(); + } + value = new AllegianceInfoWrapper(base.Wrapped.MyAllegiance); + allegianceData.Add(key, value); + return value; + } + } + + public int Followers + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.Followers; + } + } + + public int MonarchFollowers + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.MonarchFollowers; + } + } + + public int SkillPoints + { + get + { + EnforceDisposedOnce(); + return base.Wrapped.SkillPoints; + } + } + + public long XPToNextLevel => base.Wrapped.XPToNextLevel; + + public ReadOnlyCollection SpellBook + { + get + { + EnforceDisposedOnce(); + if (mySpellBook == null) + { + mySpellBook = new Collection(base.Wrapped.SpellbookArray); + } + return new ReadOnlyCollection(mySpellBook); + } + } + + public ReadOnlyCollection Augmentations + { + get + { + EnforceDisposedOnce(); + if (myAugmentations == null) + { + myAugmentations = new ReadOnlyCollection(base.Wrapped.AugmentationArray); + } + return myAugmentations; + } + } + + [CLSCompliant(false)] + public IndexedCollection EffectiveAttribute => new IndexedCollection(this, CharFilterIndex.EffectiveAttributes); + + [CLSCompliant(false)] + public IndexedCollection EffectiveSkill => new IndexedCollection(this, CharFilterIndex.EffectiveSkills); + + [CLSCompliant(false)] + public IndexedCollection EffectiveVital => new IndexedCollection(this, CharFilterIndex.EffectiveVitals); + + public event EventHandler ActionComplete + { + add + { + mActionComplete = (EventHandler)Delegate.Combine(mActionComplete, value); + } + remove + { + mActionComplete = (EventHandler)Delegate.Remove(mActionComplete, value); + } + } + + public event EventHandler LoginComplete + { + add + { + mLoginComplete = (EventHandler)Delegate.Combine(mLoginComplete, value); + } + remove + { + mLoginComplete = (EventHandler)Delegate.Remove(mLoginComplete, value); + } + } + + [CLSCompliant(false)] + public event EventHandler SpellbookChange + { + add + { + mSpellbookChange = (EventHandler)Delegate.Combine(mSpellbookChange, value); + } + remove + { + mSpellbookChange = (EventHandler)Delegate.Remove(mSpellbookChange, value); + } + } + + [CLSCompliant(false)] + public event EventHandler Death + { + add + { + mDeath = (EventHandler)Delegate.Combine(mDeath, value); + } + remove + { + mDeath = (EventHandler)Delegate.Remove(mDeath, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangePortalMode + { + add + { + mChangePortalMode = (EventHandler)Delegate.Combine(mChangePortalMode, value); + } + remove + { + mChangePortalMode = (EventHandler)Delegate.Remove(mChangePortalMode, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangePlayer + { + add + { + mChangePlayer = (EventHandler)Delegate.Combine(mChangePlayer, value); + } + remove + { + mChangePlayer = (EventHandler)Delegate.Remove(mChangePlayer, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeFellowship + { + add + { + mChangeFellowship = (EventHandler)Delegate.Combine(mChangeFellowship, value); + } + remove + { + mChangeFellowship = (EventHandler)Delegate.Remove(mChangeFellowship, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeEnchantments + { + add + { + mChangeEnchantments = (EventHandler)Delegate.Combine(mChangeEnchantments, value); + } + remove + { + mChangeEnchantments = (EventHandler)Delegate.Remove(mChangeEnchantments, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeExperience + { + add + { + mChangeExperience = (EventHandler)Delegate.Combine(mChangeExperience, value); + } + remove + { + mChangeExperience = (EventHandler)Delegate.Remove(mChangeExperience, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeVital + { + add + { + mChangeVital = (EventHandler)Delegate.Combine(mChangeVital, value); + } + remove + { + mChangeVital = (EventHandler)Delegate.Remove(mChangeVital, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeSpellbar + { + add + { + mChangeSpellbar = (EventHandler)Delegate.Combine(mChangeSpellbar, value); + } + remove + { + mChangeSpellbar = (EventHandler)Delegate.Remove(mChangeSpellbar, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeShortcut + { + add + { + mChangeShortcut = (EventHandler)Delegate.Combine(mChangeShortcut, value); + } + remove + { + mChangeShortcut = (EventHandler)Delegate.Remove(mChangeShortcut, value); + } + } + + [CLSCompliant(false)] + public event EventHandler Login + { + add + { + mLogin = (EventHandler)Delegate.Combine(mLogin, value); + } + remove + { + mLogin = (EventHandler)Delegate.Remove(mLogin, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeSettings + { + add + { + mChangeSettings = (EventHandler)Delegate.Combine(mChangeSettings, value); + } + remove + { + mChangeSettings = (EventHandler)Delegate.Remove(mChangeSettings, value); + } + } + + public event EventHandler ChangeSettingsFlags + { + add + { + mChangeSettingsFlags = (EventHandler)Delegate.Combine(mChangeSettingsFlags, value); + } + remove + { + mChangeSettingsFlags = (EventHandler)Delegate.Remove(mChangeSettingsFlags, value); + } + } + + public event EventHandler ChangeOption + { + add + { + mChangeOption = (EventHandler)Delegate.Combine(mChangeOption, value); + } + remove + { + mChangeOption = (EventHandler)Delegate.Remove(mChangeOption, value); + } + } + + [CLSCompliant(false)] + public event EventHandler Logoff + { + add + { + mLogoff = (EventHandler)Delegate.Combine(mLogoff, value); + } + remove + { + mLogoff = (EventHandler)Delegate.Remove(mLogoff, value); + } + } + + [CLSCompliant(false)] + public event EventHandler SpellCast + { + add + { + mSpellCast = (EventHandler)Delegate.Combine(mSpellCast, value); + } + remove + { + mSpellCast = (EventHandler)Delegate.Remove(mSpellCast, value); + } + } + + [CLSCompliant(false)] + public event EventHandler StatusMessage + { + add + { + mStatusMessage = (EventHandler)Delegate.Combine(mStatusMessage, value); + } + remove + { + mStatusMessage = (EventHandler)Delegate.Remove(mStatusMessage, value); + } + } + + public CharacterFilter(CharacterStats obj) + : base(obj) + { + base.Wrapped.CastSpell += myCS_CastSpell; + base.Wrapped.ChangeEnchantments += myCS_ChangeEnchantments; + base.Wrapped.ChangeFellowship += myCS_ChangeFellowship; + base.Wrapped.ChangePlayer += myCS_ChangePlayer; + base.Wrapped.ChangePortalMode += myCS_ChangePortalMode; + base.Wrapped.ChangeSettings += myCS_ChangeSettings; + base.Wrapped.ChangeShortcut += myCS_ChangeShortcut; + base.Wrapped.ChangeSpellbar += myCS_ChangeSpellbar; + base.Wrapped.ChangeVital += myCS_ChangeVital; + base.Wrapped.ChangeXPS += myCS_ChangeXPS; + base.Wrapped.Death += myCS_Death; + base.Wrapped.ActionComplete += myCS_ActionComplete; + base.Wrapped.Login += myCS_Login; + base.Wrapped.LoginComplete += myCS_LoginComplete; + base.Wrapped.Logoff += myCS_Logoff; + base.Wrapped.Spellbook_Add += myCS_Spellbook_Add; + base.Wrapped.Spellbook_Delete += myCS_Spellbook_Delete; + base.Wrapped.StatusMessage += myCS_StatusMessage; + base.Wrapped.ChangeSettingFlags += myCS_ChangeSettingFlags; + base.Wrapped.ChangeOption += myCS_ChangeOption; + Reset(createNew: true); + } + + protected override void Dispose(bool userCalled) + { + if (userCalled) + { + if (base.Wrapped != null) + { + base.Wrapped.CastSpell -= myCS_CastSpell; + base.Wrapped.ChangeEnchantments -= myCS_ChangeEnchantments; + base.Wrapped.ChangeFellowship -= myCS_ChangeFellowship; + base.Wrapped.ChangePlayer -= myCS_ChangePlayer; + base.Wrapped.ChangePortalMode -= myCS_ChangePortalMode; + base.Wrapped.ChangeSettings -= myCS_ChangeSettings; + base.Wrapped.ChangeShortcut -= myCS_ChangeShortcut; + base.Wrapped.ChangeSpellbar -= myCS_ChangeSpellbar; + base.Wrapped.ChangeVital -= myCS_ChangeVital; + base.Wrapped.ChangeXPS -= myCS_ChangeXPS; + base.Wrapped.Death -= myCS_Death; + base.Wrapped.ActionComplete -= myCS_ActionComplete; + base.Wrapped.Login -= myCS_Login; + base.Wrapped.LoginComplete -= myCS_LoginComplete; + base.Wrapped.Logoff -= myCS_Logoff; + base.Wrapped.Spellbook_Add -= myCS_Spellbook_Add; + base.Wrapped.Spellbook_Delete -= myCS_Spellbook_Delete; + base.Wrapped.StatusMessage -= myCS_StatusMessage; + } + Reset(createNew: false); + } + base.Dispose(userCalled); + } + + object IIndexedProvider.GetIndexedObject(CharFilterIndex objectIndex, int index) + { + EnforceDisposedOnce(); + object result = null; + switch (objectIndex) + { + case CharFilterIndex.Vassals: + { + if (index >= base.Wrapped.VassalCount) + { + throw new IndexOutOfRangeException("Requested Vassal " + index + " doesn't exist"); + } + string key = "Vassal" + index; + AllegianceInfoWrapper value3 = null; + if (allegianceData.TryGetValue(key, out value3)) + { + allegianceData.Remove(key); + value3?.Dispose(); + } + value3 = new AllegianceInfoWrapper(((dynamic)(ICharacterStats)base.Wrapped).get_Vassal(index)); + allegianceData.Add(key, value3); + return value3; + } + case CharFilterIndex.Enchantments: + { + if (index >= base.Wrapped.EnchantmentCount) + { + throw new IndexOutOfRangeException("Requested Enchantment " + index + " doesn't exist"); + } + string key = "Enchant-" + index; + EnchantmentWrapper value4 = null; + if (enchantmentData.TryGetValue(key, out value4)) + { + enchantmentData.Remove(key); + value4?.Dispose(); + } + value4 = new EnchantmentWrapper(((dynamic)(ICharacterStats)base.Wrapped).get_Enchantment(index)); + enchantmentData.Add(key, value4); + return value4; + } + case CharFilterIndex.Characters: + if (index >= base.Wrapped.AccountCharCount) + { + throw new IndexOutOfRangeException("Requested Character " + index + " doesn't exist"); + } + return new AccountCharInfo(this, index); + case CharFilterIndex.Vitals: + { + if (!Enum.IsDefined(typeof(eVitalID), index)) + { + throw new IndexOutOfRangeException("Requested Vital " + index + " doesn't exist"); + } + string key = "Vital-" + index; + SkillInfoWrapper value5 = null; + if (vitalSkillData.TryGetValue(key, out value5)) + { + vitalSkillData.Remove(key); + value5?.Dispose(); + } + value5 = new SkillInfoWrapper(((dynamic)(ICharacterStats)base.Wrapped).get_Vital((eVitalID)index)); + vitalSkillData.Add(key, value5); + return value5; + } + case CharFilterIndex.Attributes: + { + if (!Enum.IsDefined(typeof(eAttributeID), index)) + { + throw new IndexOutOfRangeException("Requested Attribute " + index + " doesn't exist"); + } + string key = "Attribute-" + index; + AttributeInfoWrapper value2 = null; + if (attributeData.TryGetValue(key, out value2)) + { + attributeData.Remove(key); + value2?.Dispose(); + } + value2 = new AttributeInfoWrapper(((dynamic)(ICharacterStats)base.Wrapped).get_Attribute((eAttributeID)index)); + attributeData.Add(key, value2); + return value2; + } + case CharFilterIndex.Skills: + { + if (!Enum.IsDefined(typeof(CharFilterSkillType), index)) + { + throw new IndexOutOfRangeException("Requested Skill " + index + " doesn't exist"); + } + string key = "Skill-" + index; + SkillInfoWrapper value = null; + if (vitalSkillData.TryGetValue(key, out value)) + { + vitalSkillData.Remove(key); + value?.Dispose(); + } + value = new SkillInfoWrapper(((dynamic)(ICharacterStats)base.Wrapped).get_Skill((eSkillID)index)); + vitalSkillData.Add(key, value); + return value; + } + case CharFilterIndex.EffectiveAttributes: + return ((dynamic)(ICharacterStats)base.Wrapped).get_EffectiveAttribute((eAttributeID)index); + case CharFilterIndex.EffectiveSkills: + return ((dynamic)(ICharacterStats)base.Wrapped).get_EffectiveSkill((eSkillID)index); + case CharFilterIndex.EffectiveVitals: + return ((dynamic)(ICharacterStats)base.Wrapped).get_EffectiveVital((eVitalID)index); + default: + return result; + } + } + + IEnumerator IIndexedProvider.GetEnumerator(CharFilterIndex objectIndex) + { + EnforceDisposedOnce(); + return objectIndex switch + { + CharFilterIndex.Vassals => VassalEnum(), + CharFilterIndex.Enchantments => EnchantmentEnum(), + CharFilterIndex.Vitals => VitalEnum(), + CharFilterIndex.Attributes => AttributeEnum(), + CharFilterIndex.Skills => SkillEnum(), + _ => null, + }; + } + + private IEnumerator VassalEnum() + { + int vassalCount = base.Wrapped.VassalCount; + for (int x = 0; x < vassalCount; x++) + { + yield return Vassals[x]; + } + } + + private IEnumerator EnchantmentEnum() + { + int enchantCount = base.Wrapped.EnchantmentCount; + for (int x = 0; x < enchantCount; x++) + { + yield return Enchantments[x]; + } + } + + private IEnumerator VitalEnum() + { + for (int x = 2; x <= 6; x += 2) + { + yield return Vitals[(CharFilterVitalType)x]; + } + } + + private IEnumerator AttributeEnum() + { + int AttributeCount = base.Wrapped.AttributeCount; + int x = 1; + while (x <= AttributeCount) + { + yield return Attributes[(CharFilterAttributeType)x]; + int num = x + 1; + x = num; + } + } + + private IEnumerator SkillEnum() + { + _ = base.Wrapped.SkillCount; + foreach (int value in Enum.GetValues(typeof(CharFilterSkillType))) + { + yield return Skills[(CharFilterSkillType)value]; + } + } + + int IIndexedProvider.Count(CharFilterIndex objectIndex) + { + EnforceDisposedOnce(); + return objectIndex switch + { + CharFilterIndex.Vassals => base.Wrapped.VassalCount, + CharFilterIndex.Enchantments => base.Wrapped.EnchantmentCount, + CharFilterIndex.Vitals => 3, + CharFilterIndex.Attributes => base.Wrapped.AttributeCount, + CharFilterIndex.Skills => base.Wrapped.SkillCount, + CharFilterIndex.Characters => base.Wrapped.AccountCharCount, + CharFilterIndex.Spells => base.Wrapped.TotalSpells, + CharFilterIndex.Augmentations => base.Wrapped.AugmentationCount(), + CharFilterIndex.EffectiveAttributes => base.Wrapped.AttributeCount, + CharFilterIndex.EffectiveSkills => base.Wrapped.SkillCount, + CharFilterIndex.EffectiveVitals => 3, + _ => 0, + }; + } + + private void myCS_StatusMessage(int type, string text) + { + Util.SafeFireEvent(this, mStatusMessage, new StatusMessageEventArgs(type, text)); + } + + private void myCS_Spellbook_Delete(int spellDeleted) + { + if (mySpellBook != null) + { + mySpellBook.Remove(spellDeleted); + } + Util.SafeFireEvent(this, mSpellbookChange, new SpellbookEventArgs(AddRemoveEventType.Delete, spellDeleted)); + } + + private void myCS_Spellbook_Add(int spellAdded) + { + if (mySpellBook != null) + { + mySpellBook.Add(spellAdded); + } + Util.SafeFireEvent(this, mSpellbookChange, new SpellbookEventArgs(AddRemoveEventType.Add, spellAdded)); + } + + private void myCS_Logoff(PlayerLogoffType type) + { + Util.SafeFireEvent(this, mLogoff, new LogoffEventArgs((LogoffEventType)type)); + Reset(createNew: true); + } + + private void myCS_LoginComplete() + { + Util.SafeFireEvent(this, mLoginComplete, new EventArgs()); + } + + private void myCS_Login(int character) + { + Util.SafeFireEvent(this, mLogin, new LoginEventArgs(character)); + } + + private void myCS_Death(string text) + { + Util.SafeFireEvent(this, mDeath, new DeathEventArgs(text)); + } + + private void myCS_ChangeXPS(PlayerXPType change, int amount) + { + Util.SafeFireEvent(this, mChangeExperience, new ChangeExperienceEventArgs((PlayerXPEventType)change, amount)); + } + + private void myCS_ChangeVital(PlayerVitalType change, int amount) + { + Util.SafeFireEvent(this, mChangeVital, new ChangeVitalEventArgs((CharFilterVitalType)change, amount)); + } + + private void myCS_ChangeSpellbar(PlayerAddRemoveType Change, int Tab, int Slot, int SpellID) + { + if (mySpellBars != null && mySpellBars.ContainsKey(Tab)) + { + mySpellBars.Remove(Tab); + } + Util.SafeFireEvent(this, mChangeSpellbar, new ChangeSpellbarEventArgs((AddRemoveEventType)Change, Tab, Slot, SpellID)); + } + + private void myCS_ChangeShortcut(PlayerAddRemoveType Change, int Slot, int ObjectID) + { + Util.SafeFireEvent(this, mChangeShortcut, new ChangeShortcutEventArgs((AddRemoveEventType)Change, Slot, ObjectID)); + } + + private void myCS_ChangeSettings(int Settings) + { + Util.SafeFireEvent(this, mChangeSettings, new SettingsEventArgs(Settings)); + } + + private void myCS_ChangePortalMode(PlayerPortalType Change) + { + Util.SafeFireEvent(this, mChangePortalMode, new ChangePortalModeEventArgs((PortalEventType)Change)); + } + + private void myCS_ChangePlayer(PlayerModifyType Change, int StatID) + { + if (Change == PlayerModifyType.pevtAugmentation && myAugmentations != null) + { + myAugmentations = null; + } + Util.SafeFireEvent(this, mChangePlayer, new ChangePlayerEventArgs((PlayerModifyEventType)Change, StatID)); + } + + private void myCS_ChangeFellowship(PlayerFellowshipType Change, int Character) + { + Util.SafeFireEvent(this, mChangeFellowship, new ChangeFellowshipEventArgs((FellowshipEventType)Change, Character)); + } + + private void myCS_ChangeEnchantments(PlayerAddRemoveType Change, Enchantment Enchantment) + { + using EnchantmentWrapper enchantment = new EnchantmentWrapper(Enchantment); + Util.SafeFireEvent(this, mChangeEnchantments, new ChangeEnchantmentsEventArgs((AddRemoveEventType)Change, enchantment)); + } + + private void myCS_ActionComplete() + { + Util.SafeFireEvent(this, mActionComplete, new EventArgs()); + } + + private void myCS_CastSpell(PlayerCastType Type, int SpellID, int TargetID) + { + Util.SafeFireEvent(this, mSpellCast, new SpellCastEventArgs((CastEventType)Type, SpellID, TargetID)); + } + + private void myCS_ChangeOption(int key, int value) + { + Util.SafeFireEvent(this, mChangeOption, new ChangeOptionEventArgs(key, value)); + } + + private void myCS_ChangeSettingFlags(int Settings) + { + Util.SafeFireEvent(this, mChangeSettingsFlags, new ChangeSettingsFlagsEventArgs(Settings)); + } + + private void Reset(bool createNew) + { + if (allegianceData != null) + { + foreach (KeyValuePair allegianceDatum in allegianceData) + { + if (allegianceDatum.Value != null) + { + allegianceDatum.Value.Dispose(); + } + } + } + if (enchantmentData != null) + { + foreach (KeyValuePair enchantmentDatum in enchantmentData) + { + if (enchantmentDatum.Value != null) + { + enchantmentDatum.Value.Dispose(); + } + } + } + if (vitalSkillData != null) + { + foreach (KeyValuePair vitalSkillDatum in vitalSkillData) + { + if (vitalSkillDatum.Value != null) + { + vitalSkillDatum.Value.Dispose(); + } + } + } + if (attributeData != null) + { + foreach (KeyValuePair attributeDatum in attributeData) + { + if (attributeDatum.Value != null) + { + attributeDatum.Value.Dispose(); + } + } + } + mySpellBook = null; + if (createNew) + { + mySpellBars = new Dictionary>(); + allegianceData = new Dictionary(); + enchantmentData = new Dictionary(); + vitalSkillData = new Dictionary(); + attributeData = new Dictionary(); + } + } + + internal int get_AccountCharID(int index) + { + EnforceDisposedOnce(); + return ((dynamic)(ICharacterStats)base.Wrapped).get_AccountCharID(index); + } + + internal string get_AccountCharName(int index) + { + EnforceDisposedOnce(); + return ((dynamic)(ICharacterStats)base.Wrapped).get_AccountCharName(index); + } + + public int Shortcut(int slot) + { + return ((dynamic)(ICharacterStats)base.Wrapped).get_Quickslots(slot); + } + + public bool IsSpellKnown(int spellId) + { + if (((dynamic)(ICharacterStats)base.Wrapped).get_SpellLearned(spellId) != 0) + { + return true; + } + return false; + } + + public int GetCharProperty(int key) + { + int pValue = 0; + if (base.Wrapped.AugmentationExists((eAugmentations)key, out pValue)) + { + return pValue; + } + return 0; + } + + public ReadOnlyCollection SpellBar(int barNumber) + { + EnforceDisposedOnce(); + if (barNumber < 0 || barNumber > 6) + { + throw new ArgumentOutOfRangeException("barNumber", barNumber, "barNumber must be between 0 and 6 inclusive"); + } + if (mySpellBars == null) + { + mySpellBars = new Dictionary>(); + } + if (!mySpellBars.ContainsKey(barNumber)) + { + mySpellBars.Add(barNumber, new ReadOnlyCollection(base.Wrapped.SpellBarArray(barNumber))); + } + return mySpellBars[barNumber]; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CheckBoxWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CheckBoxWrapper.cs new file mode 100644 index 0000000..1ee97ee --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CheckBoxWrapper.cs @@ -0,0 +1,135 @@ +using System; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class CheckBoxWrapper : ControlWrapperBase +{ + private EventHandler evtDestroy; + + private EventHandler evtChange; + + public bool Checked + { + get + { + return base.Control.Checked; + } + set + { + base.Control.Checked = value; + } + } + + public bool RightToLeft + { + get + { + return base.Control.RightToLeft; + } + set + { + base.Control.RightToLeft = value; + } + } + + public string Text + { + get + { + return base.Control.Text; + } + set + { + base.Control.Text = value; + } + } + + public Color TextColor + { + get + { + return Util.ColorFromBGR(base.Control.TextColor); + } + set + { + base.Control.TextColor = Util.ColorToBGR(value); + } + } + + public event EventHandler Change + { + add + { + if (evtChange == null) + { + base.Control.Change += ChangeEvent; + } + evtChange = (EventHandler)Delegate.Combine(evtChange, value); + } + remove + { + evtChange = (EventHandler)Delegate.Remove(evtChange, value); + if (evtChange == null) + { + base.Control.Change -= ChangeEvent; + } + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtChange != null) + { + evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); + base.Control.Change -= ChangeEvent; + } + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + } + base.Dispose(disposing); + } + + private void ChangeEvent(int ID, bool Checked) + { + if (evtChange != null) + { + evtChange(this, new CheckBoxChangeEventArgs(ID, Checked)); + } + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceDataIndexer.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceDataIndexer.cs new file mode 100644 index 0000000..aa0d0cc --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceDataIndexer.cs @@ -0,0 +1,33 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public sealed class ChoiceDataIndexer : IDisposable +{ + private Choice myControl; + + public object this[int index] + { + get + { + return ((dynamic)(IChoice)myControl).get_Data(index); + } + set + { + ((dynamic)(IChoice)myControl).set_Data(index, value); + } + } + + internal ChoiceDataIndexer(Choice control) + { + myControl = control; + } + + public void Dispose() + { + Marshal.ReleaseComObject(myControl); + myControl = null; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceTextIndexer.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceTextIndexer.cs new file mode 100644 index 0000000..4164f8e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceTextIndexer.cs @@ -0,0 +1,31 @@ +using System; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public sealed class ChoiceTextIndexer : IDisposable +{ + private Choice myControl; + + public string this[int index] + { + get + { + return ((dynamic)(IChoice)myControl).get_Text(index); + } + set + { + ((dynamic)(IChoice)myControl).set_Text(index, value); + } + } + + internal ChoiceTextIndexer(Choice control) + { + myControl = control; + } + + public void Dispose() + { + myControl = null; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceWrapper.cs new file mode 100644 index 0000000..bfc7187 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ChoiceWrapper.cs @@ -0,0 +1,191 @@ +using System; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class ChoiceWrapper : ControlWrapperBase +{ + private EventHandler evtDropDown; + + private EventHandler evtDestroy; + + private EventHandler evtChange; + + private ChoiceTextIndexer myTextIndex; + + private ChoiceDataIndexer myDataIndex; + + public int Count => base.Control.ChoiceCount; + + public int DropLines + { + get + { + return base.Control.DropLines; + } + set + { + base.Control.DropLines = value; + } + } + + public bool Dropped + { + get + { + return base.Control.Dropped; + } + set + { + base.Control.Dropped = value; + } + } + + public int Selected + { + get + { + return base.Control.Selected; + } + set + { + base.Control.Selected = value; + } + } + + public ChoiceTextIndexer Text => myTextIndex; + + public ChoiceDataIndexer Data => myDataIndex; + + public event EventHandler DropDown + { + add + { + if (evtDropDown == null) + { + base.Control.DropDown += DropDownEvent; + } + evtDropDown = (EventHandler)Delegate.Combine(evtDropDown, value); + } + remove + { + evtDropDown = (EventHandler)Delegate.Remove(evtDropDown, value); + if (evtDropDown == null) + { + base.Control.DropDown -= DropDownEvent; + } + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + public event EventHandler Change + { + add + { + if (evtChange == null) + { + base.Control.Change += ChangeEvent; + } + evtChange = (EventHandler)Delegate.Combine(evtChange, value); + } + remove + { + evtChange = (EventHandler)Delegate.Remove(evtChange, value); + if (evtChange == null) + { + base.Control.Change -= ChangeEvent; + } + } + } + + [CLSCompliant(false)] + public override void Initialize(object control) + { + base.Initialize(control); + myTextIndex = new ChoiceTextIndexer(base.Control); + myDataIndex = new ChoiceDataIndexer(base.Control); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtDropDown != null) + { + evtDropDown = (EventHandler)Delegate.Remove(evtDropDown, evtDropDown); + base.Control.DropDown -= DropDownEvent; + } + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + if (evtChange != null) + { + evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); + base.Control.Change -= ChangeEvent; + } + myTextIndex.Dispose(); + myDataIndex.Dispose(); + } + base.Dispose(disposing); + } + + public void Add(string display, object data) + { + base.Control.AddChoice(display, data); + } + + public void Clear() + { + base.Control.Clear(); + } + + public void Remove(int index) + { + base.Control.RemoveChoice(index); + } + + private void DropDownEvent(int ID) + { + if (evtDropDown != null) + { + evtDropDown(this, new ControlEventArgs(ID)); + } + } + + private void ChangeEvent(int ID, int Index) + { + if (evtChange != null) + { + evtChange(this, new IndexChangeEventArgs(ID, Index)); + } + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CombatState.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CombatState.cs new file mode 100644 index 0000000..91e14fa --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CombatState.cs @@ -0,0 +1,12 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum CombatState +{ + Peace = 1, + Melee = 2, + Missile = 4, + Magic = 8 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlRegistry.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlRegistry.cs new file mode 100644 index 0000000..ac40982 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlRegistry.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Decal.Adapter.Support; +using Decal.Interop.Inject; + +namespace Decal.Adapter.Wrappers; + +public static class ControlRegistry +{ + private static Dictionary myWrappers; + + static ControlRegistry() + { + if (myWrappers == null) + { + myWrappers = new Dictionary(); + RegisterControls(Assembly.GetExecutingAssembly()); + } + } + + public static void RegisterControls(Assembly assembly) + { + Type[] types = assembly.GetTypes(); + foreach (Type type in types) + { + try + { + Type baseType = type.BaseType; + if (!(baseType == null) && baseType.IsGenericType && baseType.GetGenericTypeDefinition() == typeof(ControlWrapperBase<>)) + { + Type key = baseType.GetGenericArguments()[0]; + myWrappers.Add(key, type); + } + } + catch (Exception ex) + { + Util.WriteLine("RegisterControls: " + ex.Message); + } + } + } + + internal static IControlWrapper CreateInstance(IControl control) + { + Util.WriteLine("Creating wrapper for: " + control.GetType()); + Type value; + IControlWrapper controlWrapper = ((!myWrappers.TryGetValue(control.GetType(), out value)) ? new ControlWrapper() : ((IControlWrapper)Activator.CreateInstance(value))); + controlWrapper.Initialize(control); + return controlWrapper; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapper.cs new file mode 100644 index 0000000..2f32092 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapper.cs @@ -0,0 +1,7 @@ +using Decal.Interop.Inject; + +namespace Decal.Adapter.Wrappers; + +public class ControlWrapper : ControlWrapperBase +{ +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapperBase.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapperBase.cs new file mode 100644 index 0000000..971226b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ControlWrapperBase.cs @@ -0,0 +1,66 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using Decal.Interop.Inject; + +namespace Decal.Adapter.Wrappers; + +public abstract class ControlWrapperBase : MarshalByRefObject, IControlWrapper, IDisposable where T : class +{ + private T myControl; + + private bool isDisposed; + + [EditorBrowsable(EditorBrowsableState.Never)] + public object Underlying => myControl; + + public int Id => ((IControl)myControl).ID; + + public int ChildCount => ((IControl)myControl).ChildCount; + + protected bool Disposed => isDisposed; + + protected T Control => myControl; + + ~ControlWrapperBase() + { + Dispose(disposing: false); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual void Initialize(object control) + { + myControl = control as T; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public object ChildById(int id) + { + return ((dynamic)(IControl)myControl).get_Child(id, ePositionType.ePositionByID); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public object ChildByIndex(int index) + { + return ((dynamic)(IControl)myControl).get_Child(index, ePositionType.ePositionByIndex); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myControl != null) + { + Marshal.ReleaseComObject(myControl); + myControl = null; + } + isDisposed = true; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CoordsObject.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CoordsObject.cs new file mode 100644 index 0000000..b849393 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CoordsObject.cs @@ -0,0 +1,106 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class CoordsObject +{ + private double myNorthSouth; + + private double myEastWest; + + public double NorthSouth => myNorthSouth; + + public double EastWest => myEastWest; + + public CoordsObject(double northSouth, double eastWest) + { + myNorthSouth = northSouth; + myEastWest = eastWest; + } + + public double DistanceToCoords(CoordsObject destination) + { + if (destination == null) + { + throw new ArgumentNullException("destination"); + } + double num = myNorthSouth - destination.myNorthSouth; + double num2 = myEastWest - destination.myEastWest; + return Math.Sqrt(num * num + num2 * num2); + } + + public double AngleToCoords(CoordsObject destination) + { + return 180.0 / Math.PI * AngleToCoordsRadians(destination); + } + + public double AngleToCoordsRadians(CoordsObject destination) + { + if (destination == null) + { + throw new ArgumentNullException("destination"); + } + double num = Math.Atan2(destination.myEastWest - myEastWest, destination.myNorthSouth - myNorthSouth); + if (num < 0.0) + { + num += Math.PI * 2.0; + } + return num; + } + + public override string ToString() + { + return ToString("0.0"); + } + + public string ToString(string numberFormat) + { + return Math.Abs(myNorthSouth).ToString(numberFormat) + ((myNorthSouth >= 0.0) ? "N" : "S") + ", " + Math.Abs(myEastWest).ToString(numberFormat) + ((myEastWest >= 0.0) ? "E" : "W"); + } + + public override bool Equals(object obj) + { + if (obj is CoordsObject) + { + CoordsObject coordsObject = (CoordsObject)obj; + if (coordsObject.myNorthSouth == myNorthSouth) + { + return coordsObject.myEastWest == myEastWest; + } + return false; + } + return false; + } + + public bool Equals(CoordsObject obj) + { + if (obj == null) + { + return false; + } + if (obj.myNorthSouth == myNorthSouth) + { + return obj.myEastWest == myEastWest; + } + return false; + } + + public override int GetHashCode() + { + return myNorthSouth.GetHashCode() ^ myEastWest.GetHashCode(); + } + + public static bool operator ==(CoordsObject a, CoordsObject b) + { + if (object.Equals(a, null)) + { + return object.Equals(b, null); + } + return a.Equals(b); + } + + public static bool operator !=(CoordsObject a, CoordsObject b) + { + return !(a == b); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CreateObjectEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CreateObjectEventArgs.cs new file mode 100644 index 0000000..12d221f --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/CreateObjectEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class CreateObjectEventArgs : EventArgs +{ + private WorldObject myNewObject; + + public WorldObject New => myNewObject; + + internal CreateObjectEventArgs(WorldObject newObject) + { + myNewObject = newObject; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DObj.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DObj.cs new file mode 100644 index 0000000..0b47a44 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DObj.cs @@ -0,0 +1,289 @@ +using Decal.Interop.D3DService; + +namespace Decal.Adapter.Wrappers; + +public class D3DObj : GenericDisposableWrapper +{ + public int Color + { + get + { + return base.Wrapped.color; + } + set + { + base.Wrapped.color = value; + } + } + + public int Color2 + { + get + { + return base.Wrapped.color2; + } + set + { + base.Wrapped.color2 = value; + } + } + + public bool Autoscale + { + get + { + return base.Wrapped.autoscale; + } + set + { + base.Wrapped.autoscale = value; + } + } + + public bool DrawBackface + { + get + { + return base.Wrapped.drawBackface; + } + set + { + base.Wrapped.drawBackface = value; + } + } + + public float HBounce + { + get + { + return base.Wrapped.hBounce; + } + set + { + base.Wrapped.hBounce = value; + } + } + + public float PBounce + { + get + { + return base.Wrapped.pBounce; + } + set + { + base.Wrapped.pBounce = value; + } + } + + public float PFade + { + get + { + return base.Wrapped.pFade; + } + set + { + base.Wrapped.pFade = value; + } + } + + public float POrbit + { + get + { + return base.Wrapped.pOrbit; + } + set + { + base.Wrapped.pOrbit = value; + } + } + + public float PSpin + { + get + { + return base.Wrapped.pSpin; + } + set + { + base.Wrapped.pSpin = value; + } + } + + public float ROrbit + { + get + { + return base.Wrapped.rOrbit; + } + set + { + base.Wrapped.rOrbit = value; + } + } + + public float ScaleX + { + get + { + return base.Wrapped.scaleX; + } + set + { + base.Wrapped.scaleX = value; + } + } + + public float ScaleY + { + get + { + return base.Wrapped.scaleY; + } + set + { + base.Wrapped.scaleY = value; + } + } + + public float ScaleZ + { + get + { + return base.Wrapped.scaleZ; + } + set + { + base.Wrapped.scaleZ = value; + } + } + + public bool Visible + { + get + { + return base.Wrapped.visible; + } + set + { + base.Wrapped.visible = value; + } + } + + public float AnimationPhaseOffset + { + get + { + return base.Wrapped.AnimationPhaseOffset; + } + set + { + base.Wrapped.AnimationPhaseOffset = value; + } + } + + public D3DObj(CD3DObj obj) + : base(obj) + { + } + + protected override void Dispose(bool userCalled) + { + base.Dispose(userCalled); + } + + public void Scale(float factor) + { + base.Wrapped.SetScale(factor); + } + + public void OrientToCamera(bool verticalTilt) + { + base.Wrapped.OrientToCamera(verticalTilt); + } + + public void OrientToCoords(float lat, float lng, float alt, bool verticalTilt) + { + base.Wrapped.OrientToCoords(lat, lng, alt, verticalTilt); + } + + public void OrientToObject(int guid, float fractHeight, bool verticalTilt) + { + base.Wrapped.OrientToObject(guid, fractHeight, verticalTilt); + } + + public void OrientToPlayer(bool verticalTilt) + { + base.Wrapped.OrientToPlayer(verticalTilt); + } + + public void Anchor(float lat, float lng, float alt) + { + base.Wrapped.AnchorToCoords(lat, lng, alt); + } + + public void Anchor(int id, float height, float dx, float dy, float dz) + { + base.Wrapped.AnchorToObject(id, height, dx, dy, dz); + } + + public void SetText(string text) + { + SetText(D3DTextType.Text2D, text, "Arial", 0); + } + + public void SetText(string text, string fontName) + { + SetText(D3DTextType.Text2D, text, fontName, 0); + } + + public void SetText(string text, string fontName, int options) + { + SetText(D3DTextType.Text2D, text, fontName, options); + } + + public void SetText(D3DTextType type, string text, string fontName, int options) + { + switch (type) + { + case D3DTextType.Text2D: + base.Wrapped.Set2DText(text, fontName, options); + break; + case D3DTextType.Text3D: + base.Wrapped.Set3DText(text, fontName, options); + break; + } + } + + public void SetIcon(int id) + { + base.Wrapped.SetIcon(id); + } + + public void SetIcon(string fileName) + { + base.Wrapped.SetIconFromFile(fileName); + } + + public void SetIcon(int module, int res) + { + base.Wrapped.SetIconFromResource(module, res); + } + + public void SetShape(D3DShape shape) + { + base.Wrapped.SetShape((eShape)shape); + } + + public void SetShape(string fileName) + { + base.Wrapped.SetShapeFromFile(fileName); + } + + public void SetShape(int module, int res) + { + base.Wrapped.SetShapeFromResource(module, res); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DService.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DService.cs new file mode 100644 index 0000000..5ca7db5 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DService.cs @@ -0,0 +1,86 @@ +using Decal.Interop.D3DService; + +namespace Decal.Adapter.Wrappers; + +public class D3DService : GenericDisposableWrapper +{ + internal D3DService(CService obj) + : base(obj) + { + } + + protected override void Dispose(bool userCalled) + { + base.Dispose(userCalled); + } + + public D3DObj NewD3DObj() + { + return new D3DObj(base.Wrapped.NewD3DObj()); + } + + public D3DObj PointToObject(int guid, int color) + { + return new D3DObj(base.Wrapped.PointToObject(guid, color)); + } + + public D3DObj PointToCoords(float lat, float lng, float alt, int color) + { + return new D3DObj(base.Wrapped.PointToCoords(lat, lng, alt, color)); + } + + public D3DObj MarkObjectWithIcon(int guid, int icon) + { + return new D3DObj(base.Wrapped.MarkObjectWithIcon(guid, icon)); + } + + public D3DObj MarkObjectWithShape(int guid, D3DShape shape, int color) + { + return new D3DObj(base.Wrapped.MarkObjectWithShape(guid, (eShape)shape, color)); + } + + public D3DObj MarkObjectWithShapeFromFile(int guid, string filename, int color) + { + return new D3DObj(base.Wrapped.MarkObjectWithShapeFromFile(guid, filename, color)); + } + + public D3DObj MarkObjectWith2DText(int guid, string szText, string szFont, int options) + { + return new D3DObj(base.Wrapped.MarkObjectWith2DText(guid, szText, szFont, options)); + } + + public D3DObj MarkObjectWith3DText(int guid, string szText, string szFont, int options) + { + return new D3DObj(base.Wrapped.MarkObjectWith3DText(guid, szText, szFont, options)); + } + + public D3DObj MarkCoordsWithIcon(float lat, float lng, float alt, int icon) + { + return new D3DObj(base.Wrapped.MarkCoordsWithIcon(lat, lng, alt, icon)); + } + + public D3DObj MarkCoordsWithIconFromFile(float lat, float lng, float alt, string file) + { + return new D3DObj(base.Wrapped.MarkCoordsWithIconFromFile(lat, lng, alt, file)); + } + + public D3DObj MarkCoordsWithShape(float lat, float lng, float alt, D3DShape shape, int color) + { + return new D3DObj(base.Wrapped.MarkCoordsWithShape(lat, lng, alt, (eShape)shape, color)); + } + + public D3DObj MarkCoordsWithShapeFromFile(float lat, float lng, float alt, string file, int color) + { + return new D3DObj(base.Wrapped.MarkCoordsWithShapeFromFile(lat, lng, alt, file, color)); + } + + public D3DObj MarkCoordsWith2DText(float lat, float lng, float alt, string szText, string szFont, int options) + { + return new D3DObj(base.Wrapped.MarkCoordsWith2DText(lat, lng, alt, szText, szFont, options)); + } + + public D3DObj MarkCoordsWith3DText(float lat, float lng, float alt, string szText, string szFont, int options) + { + return new D3DObj(base.Wrapped.MarkCoordsWith3DText(lat, lng, alt, szText, szFont, options)); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DShape.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DShape.cs new file mode 100644 index 0000000..5dd5c83 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DShape.cs @@ -0,0 +1,12 @@ +namespace Decal.Adapter.Wrappers; + +public enum D3DShape +{ + HorizontalArrow, + VerticalArrow, + Ring, + Cylinder, + Sphere, + Cube, + TiltedCube +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DTextType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DTextType.cs new file mode 100644 index 0000000..90924de --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/D3DTextType.cs @@ -0,0 +1,7 @@ +namespace Decal.Adapter.Wrappers; + +public enum D3DTextType +{ + Text2D, + Text3D +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeathEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeathEventArgs.cs new file mode 100644 index 0000000..0e9b676 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeathEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class DeathEventArgs : EventArgs +{ + private string myText; + + public string Text => myText; + + internal DeathEventArgs(string text) + { + myText = text; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DecalWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DecalWrapper.cs new file mode 100644 index 0000000..b881722 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DecalWrapper.cs @@ -0,0 +1,84 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using Decal.Adapter.Support; +using Decal.Interop.Core; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class DecalWrapper : MarshalByRefObject, IDisposable +{ + internal static Guid IID_IDISPATCH = new Guid("{00020400-0000-0000-C000-000000000046}"); + + internal static Guid IID_IUNKNOWN = new Guid("{00000000-0000-0000-C000-000000000046}"); + + private DecalCore myDecal; + + private bool isDisposed; + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public DecalCore Underlying => myDecal; + + public IntPtr Hwnd => new IntPtr(myDecal.HWND); + + public bool Focus => myDecal.Focus; + + internal DecalWrapper(DecalCore decal) + { + myDecal = decal; + } + + ~DecalWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myDecal != null) + { + Marshal.ReleaseComObject(myDecal); + myDecal = null; + } + isDisposed = true; + } + + public object GetObject(string path) + { + return GetObject(path, IID_IDISPATCH); + } + + public object GetObject(string path, string iid) + { + return GetObject(path, new Guid(iid)); + } + + public object GetObject(string path, Guid iid) + { + try + { + return ((dynamic)(IDecalCore)myDecal).get_Object(path, ref iid); + } + catch (Exception ex) + { + Util.WriteLine("Exception for {0} during get_Object: {1}", path, ex); + return null; + } + } + + public string MapPath(string path) + { + return myDecal.MapPath(path); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeclineTradeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeclineTradeEventArgs.cs new file mode 100644 index 0000000..fe3d457 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DeclineTradeEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class DeclineTradeEventArgs : EventArgs +{ + private int mTraderId; + + public int TraderId => mTraderId; + + internal DeclineTradeEventArgs(int TraderId) + { + mTraderId = TraderId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DoubleValueKey.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DoubleValueKey.cs new file mode 100644 index 0000000..a4074ef --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/DoubleValueKey.cs @@ -0,0 +1,29 @@ +namespace Decal.Adapter.Wrappers; + +public enum DoubleValueKey +{ + SlashProt = 167772160, + PierceProt = 167772161, + BludgeonProt = 167772162, + AcidProt = 167772163, + LightningProt = 167772164, + FireProt = 167772165, + ColdProt = 167772166, + Heading = 167772167, + ApproachDistance = 167772168, + SalvageWorkmanship = 167772169, + Scale = 167772170, + Variance = 167772171, + AttackBonus = 167772172, + Range = 167772173, + DamageBonus = 167772174, + ManaRateOfChange = 5, + MeleeDefenseBonus = 29, + ManaTransferEfficiency = 87, + HealingKitRestoreBonus = 100, + ManaStoneChanceDestruct = 137, + ManaCBonus = 144, + MissileDBonus = 149, + MagicDBonus = 150, + ElementalDamageVersusMonsters = 152 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EchoFilter2.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EchoFilter2.cs new file mode 100644 index 0000000..79b719e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EchoFilter2.cs @@ -0,0 +1,81 @@ +using System; +using Decal.Adapter.NetParser; +using Decal.Adapter.Support; +using Decal.Interop.Filters; +using Decal.Interop.Net; + +namespace Decal.Adapter.Wrappers; + +public class EchoFilter2 : GenericDisposableWrapper +{ + private event EventHandler serverDispatch; + + private event EventHandler clientDispatch; + + public event EventHandler ServerDispatch + { + add + { + serverDispatch += value; + } + remove + { + serverDispatch -= value; + } + } + + public event EventHandler ClientDispatch + { + add + { + clientDispatch += value; + } + remove + { + clientDispatch -= value; + } + } + + public EchoFilter2(Decal.Interop.Filters.EchoFilter2 obj) + : base(obj) + { + base.Wrapped.EchoClient += onEchoClient; + base.Wrapped.EchoServer += onEchoServer; + } + + protected override void Dispose(bool userCalled) + { + if (userCalled && base.Wrapped != null) + { + base.Wrapped.EchoClient -= onEchoClient; + base.Wrapped.EchoServer -= onEchoServer; + } + base.Dispose(userCalled); + } + + private void onEchoServer(IMessage2 pMsg) + { + try + { + Message message = null; + Util.SafeFireEvent(args: new NetworkMessageEventArgs((!(pMsg is MessageWrapper messageWrapper)) ? new Message(pMsg, MessageDirection.Inbound) : messageWrapper.Wrapped), sender: this, eventHandler: this.serverDispatch); + } + catch (Exception ex) + { + Util.WriteLine("Exception in onEchoServer {0}", ex); + } + } + + private void onEchoClient(IMessage2 pMsg) + { + try + { + Message message = null; + Util.SafeFireEvent(args: new NetworkMessageEventArgs((!(pMsg is MessageWrapper messageWrapper)) ? new Message(pMsg, MessageDirection.Inbound) : messageWrapper.Wrapped), sender: this, eventHandler: this.clientDispatch); + } + catch (Exception ex) + { + Util.WriteLine("Exception in onEchoClient {0}", ex); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnchantmentWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnchantmentWrapper.cs new file mode 100644 index 0000000..423d79c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnchantmentWrapper.cs @@ -0,0 +1,66 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class EnchantmentWrapper : MarshalByRefObject, IDisposable +{ + private Enchantment myEnchantment; + + private bool isDisposed; + + public double Adjustment => myEnchantment.Adjustment; + + public int Affected => myEnchantment.Affected; + + public int AffectedMask => myEnchantment.AffectedMask; + + public double Duration => myEnchantment.Duration; + + public int Family => myEnchantment.Family; + + public int Layer => myEnchantment.Layer; + + public int SpellId => myEnchantment.SpellID; + + public int TimeRemaining => myEnchantment.TimeRemaining; + + public DateTime Expires => DateTime.Now.AddSeconds(TimeRemaining); + + internal EnchantmentWrapper(Enchantment enchant) + { + myEnchantment = enchant; + } + + ~EnchantmentWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myEnchantment != null) + { + Marshal.ReleaseComObject(myEnchantment); + } + isDisposed = true; + } + + protected void EnforceDisposedOnce() + { + if (isDisposed) + { + throw new ObjectDisposedException("EnchantmentWrapper"); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EndTradeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EndTradeEventArgs.cs new file mode 100644 index 0000000..d6c27ca --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EndTradeEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class EndTradeEventArgs : EventArgs +{ + private int mReasonId; + + public int ReasonId => mReasonId; + + internal EndTradeEventArgs(int ReasonId) + { + mReasonId = ReasonId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnterTradeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnterTradeEventArgs.cs new file mode 100644 index 0000000..3aa609b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/EnterTradeEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class EnterTradeEventArgs : EventArgs +{ + private int mTraderId; + + private int mTradeeId; + + public int TraderId => mTraderId; + + public int TradeeId => mTradeeId; + + internal EnterTradeEventArgs(int TraderId, int TradeeId) + { + mTraderId = TraderId; + mTradeeId = TradeeId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FailToAddTradeItemEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FailToAddTradeItemEventArgs.cs new file mode 100644 index 0000000..81ed4cb --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FailToAddTradeItemEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class FailToAddTradeItemEventArgs : EventArgs +{ + private int mItemId; + + private int mReasonId; + + public int ItemId => mItemId; + + public int ReasonId => mReasonId; + + internal FailToAddTradeItemEventArgs(int ItemId, int ReasonId) + { + mItemId = ItemId; + mReasonId = ReasonId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FellowshipEventType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FellowshipEventType.cs new file mode 100644 index 0000000..309d061 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FellowshipEventType.cs @@ -0,0 +1,13 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum FellowshipEventType +{ + Create, + Quit, + Dismiss, + Recruit, + Disband +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FontWeight.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FontWeight.cs new file mode 100644 index 0000000..ebebc37 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/FontWeight.cs @@ -0,0 +1,23 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum FontWeight +{ + Black = 900, + Bold = 700, + DemiBold = 600, + DoNotCare = 0, + ExtraBold = 800, + ExtraLight = 200, + Heavy = 900, + Light = 300, + Medium = 500, + Normal = 400, + Regular = 400, + SemiBold = 600, + Thin = 100, + UltraBold = 800, + UltraLight = 200 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HookIndexer.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HookIndexer.cs new file mode 100644 index 0000000..68c081a --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HookIndexer.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; + +namespace Decal.Adapter.Wrappers; + +public sealed class HookIndexer : MarshalByRefObject where IndexType : struct, IConvertible +{ + private hookIndexType myIndex; + + private IIndexedValueProvider myWrap; + + public int this[IndexType item] => myWrap.GetIndexedObject(myIndex, item.ToInt32(CultureInfo.InvariantCulture)); + + internal HookIndexer(IIndexedValueProvider wrap, hookIndexType index) + { + myIndex = index; + myWrap = wrap; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HooksWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HooksWrapper.cs new file mode 100644 index 0000000..1f5148c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HooksWrapper.cs @@ -0,0 +1,540 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Reflection; +using System.Runtime.InteropServices; +using Decal.Interop.Core; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public sealed class HooksWrapper : MarshalByRefObject, IIndexedValueProvider, IDisposable +{ + private IACHooks myHooks; + + private bool isDisposed; + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public IACHooks Underlying => myHooks; + + public int BusyState => myHooks.BusyState; + + public int BusyStateId => myHooks.BusyStateID; + + public bool ChatState => myHooks.ChatState; + + public CombatState CombatMode => (CombatState)myHooks.CombatMode; + + public int CommandInterpreter => myHooks.CommandInterpreter; + + public int CurrentSelection + { + get + { + return myHooks.CurrentSelection; + } + set + { + myHooks.CurrentSelection = value; + } + } + + public double Heading + { + get + { + return myHooks.HeadingDegrees; + } + set + { + FaceHeading(value, bUnknown: true); + } + } + + public double HeadingRadians + { + get + { + return myHooks.HeadingRadians; + } + set + { + RadianFaceHeading(value, bUnknown: true); + } + } + + public int Landcell => myHooks.Landcell; + + public double LocationX => myHooks.LocationX; + + public double LocationY => myHooks.LocationY; + + public double LocationZ => myHooks.LocationZ; + + public int MaxSelectedStackCount => myHooks.MaxSelectedStackCount; + + public int OpenedContainer => myHooks.OpenedContainer; + + public int PointerState => myHooks.PointerState; + + public int PreviousSelection + { + get + { + return myHooks.PreviousSelection; + } + set + { + myHooks.PreviousSelection = value; + } + } + + public Rectangle Region3D + { + get + { + tagRECT aC3DRegionRect = myHooks.AC3DRegionRect; + return new Rectangle(aC3DRegionRect.left, aC3DRegionRect.top, aC3DRegionRect.right, aC3DRegionRect.bottom); + } + } + + public Rectangle RegionWindow + { + get + { + tagRECT aCWindowRect = myHooks.ACWindowRect; + return new Rectangle(aCWindowRect.left, aCWindowRect.top, aCWindowRect.right, aCWindowRect.bottom); + } + } + + public int SelectedStackCount + { + get + { + return myHooks.SelectedStackCount; + } + set + { + myHooks.SelectedStackCount = value; + } + } + + public int VendorId => myHooks.VendorID; + + [CLSCompliant(false)] + public HookIndexer Attribute => new HookIndexer(this, hookIndexType.Attribute); + + [CLSCompliant(false)] + public HookIndexer AttributeClicks => new HookIndexer(this, hookIndexType.AttributeClicks); + + [CLSCompliant(false)] + public HookIndexer AttributeStart => new HookIndexer(this, hookIndexType.AttributeStart); + + [CLSCompliant(false)] + public HookIndexer AttributeTotalXP => new HookIndexer(this, hookIndexType.AttributeTotalXP); + + [CLSCompliant(false)] + public HookIndexer Misc => new HookIndexer(this, hookIndexType.Misc); + + [CLSCompliant(false)] + public HookIndexer Skill => new HookIndexer(this, hookIndexType.Skill); + + [CLSCompliant(false)] + public HookIndexer SkillClicks => new HookIndexer(this, hookIndexType.SkillClicks); + + [CLSCompliant(false)] + public HookIndexer SkillFreePoints => new HookIndexer(this, hookIndexType.SkillFreePoints); + + [CLSCompliant(false)] + public HookIndexer SkillTotalXP => new HookIndexer(this, hookIndexType.SkillTotalXP); + + [CLSCompliant(false)] + public HookIndexer SkillTrainLevel => new HookIndexer(this, hookIndexType.SkillTrainLevel); + + [CLSCompliant(false)] + public HookIndexer Vital => new HookIndexer(this, hookIndexType.Vital); + + [CLSCompliant(false)] + public HookIndexer VitalClicks => new HookIndexer(this, hookIndexType.VitalClicks); + + [CLSCompliant(false)] + public HookIndexer VitalTotalXP => new HookIndexer(this, hookIndexType.VitalTotalXP); + + internal HooksWrapper(ACHooks hooks) + { + myHooks = hooks; + } + + ~HooksWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myHooks != null) + { + Marshal.ReleaseComObject(myHooks); + myHooks = null; + } + isDisposed = true; + } + + public void AddChatText(string text, int color) + { + AddChatText(text, color, 0); + } + + public void AddChatText(string text, int color, int target) + { + myHooks.AddChatText(text, color, target); + } + + public void AddChatTextRaw(string text, int color) + { + AddChatTextRaw(text, color, 0); + } + + public void AddChatTextRaw(string text, int color, int target) + { + myHooks.AddChatTextRaw(text, color, target); + } + + public void AddStatusText(string text) + { + myHooks.AddStatusText(text); + } + + public void ApplyItem(int useThis, int onThis) + { + myHooks.ApplyItem(useThis, onThis); + } + + public void AutoWield(int item) + { + myHooks.AutoWield(item); + } + + public void AutoWield(int item, int slot, int explic, int notexplic) + { + myHooks.AutoWieldEx(item, slot, explic, notexplic); + } + + public void AutoWield(int item, int slot, int explic, int notexplic, int zero1, int zero2) + { + myHooks.AutoWieldRaw(item, slot, explic, notexplic, zero1, zero2); + } + + public void CastSpell(int spellId, int objectId) + { + myHooks.CastSpell(spellId, objectId); + } + + public void DropItem(int objectId) + { + myHooks.DropItem(objectId); + } + + public bool FaceHeading(double heading, bool bUnknown) + { + return myHooks.FaceHeading((float)heading, bUnknown); + } + + public bool RadianFaceHeading(double heading, bool bUnknown) + { + if (heading < 0.0) + { + throw new ArgumentOutOfRangeException("heading"); + } + if (heading > Math.PI * 10.0) + { + throw new ArgumentOutOfRangeException("heading"); + } + double num = heading * 180.0 / Math.PI; + return myHooks.FaceHeading((float)num, bUnknown); + } + + public void FellowshipRecruit(int lObjectID) + { + myHooks.FellowshipRecruit(lObjectID); + } + + public void FellowshipGrantLeader(int lObjectID) + { + myHooks.FellowshipGrantLeader(lObjectID); + } + + public void FellowshipSetOpen(bool IsOpen) + { + myHooks.FellowshipSetOpen(IsOpen); + } + + public void FellowshipQuit() + { + myHooks.FellowshipQuit(); + } + + public void FellowshipDisband() + { + myHooks.FellowshipDisband(); + } + + public void FellowshipDismiss(int lObjectID) + { + myHooks.FellowshipDismiss(lObjectID); + } + + public void GiveItem(int lObject, int lDestination) + { + myHooks.GiveItem(lObject, lDestination); + } + + public void RequestId(int objectId) + { + CoreManager.Current.IDQueue.AddToQueueForCaller(objectId, Assembly.GetCallingAssembly(), DateTime.MaxValue); + } + + public void InvokeChatParser(string text) + { + myHooks.InvokeChatParser(text); + } + + public bool IsValidObject(int objectId) + { + return myHooks.IsValidObject(objectId); + } + + public void Logout() + { + myHooks.Logout(); + } + + public void MoveItem(int objectId, int packId, int slot, bool stack) + { + myHooks.MoveItem(objectId, packId, slot, stack); + } + + public void MoveItem(int objectId, int destinationId) + { + myHooks.MoveItemEx(objectId, destinationId); + } + + public void MoveItem(int objectId, int destinationId, int moveFlags) + { + myHooks.MoveItemExRaw(objectId, destinationId, moveFlags); + } + + public void SalvagePanelAdd(int objectId) + { + myHooks.SalvagePanelAdd(objectId); + } + + public void SalvagePanelSalvage() + { + myHooks.SalvagePanelSalvage(); + } + + public void SelectItem(int objectId) + { + myHooks.SelectItem(objectId); + } + + public void SetAutorun(bool on) + { + myHooks.SetAutorun(on); + } + + public void SetCombatMode(CombatState newMode) + { + myHooks.SetCombatMode((int)newMode); + } + + public void SetCursorPosition(int x, int y) + { + myHooks.SetCursorPosition(x, y); + } + + public void SetIdleTime(double timeout) + { + myHooks.SetIdleTime(timeout); + } + + public void SpellTabAdd(int tab, int index, int spellId) + { + myHooks.SpellTabAdd(tab, index, spellId); + } + + public void SpellTabDelete(int tab, int spellId) + { + myHooks.SpellTabDelete(tab, spellId); + } + + public void TradeAccept() + { + myHooks.TradeAccept(); + } + + public void TradeAdd(int objectId) + { + myHooks.TradeAdd(objectId); + } + + public IntPtr PhysicsObject(int objectId) + { + return new IntPtr(myHooks.GetPhysicsObjectPtr(objectId)); + } + + public IntPtr WeenieObject(int objectId) + { + return new IntPtr(myHooks.GetWeenieObjectPtr(objectId)); + } + + public void TradeDecline() + { + myHooks.TradeDecline(); + } + + public void TradeReset() + { + myHooks.TradeReset(); + } + + public void TradeEnd() + { + myHooks.TradeEnd(); + } + + public IntPtr UIElementLookup(UIElementType pUIElementType) + { + return new IntPtr(myHooks.UIElementLookup((int)pUIElementType)); + } + + public void UIElementMove(UIElementType pUIElementType, int x, int y) + { + myHooks.UIElementMove((int)pUIElementType, x, y); + } + + public void UIElementResize(UIElementType pUIElementType, int width, int height) + { + myHooks.UIElementResize((int)pUIElementType, width, height); + } + + public Rectangle UIElementRegion(UIElementType pUIElementType) + { + tagRECT tagRECT = myHooks.UIElementRegionRect((int)pUIElementType); + return new Rectangle(tagRECT.left, tagRECT.top, 1 + tagRECT.right - tagRECT.left, 1 + tagRECT.bottom - tagRECT.top); + } + + public void UseItem(int objectId, int useState) + { + myHooks.UseItem(objectId, useState); + } + + public void UseItem(int objectId, int useState, int useMethod) + { + myHooks.UseItemRaw(objectId, useState, useMethod); + } + + public void VendorBuyAll() + { + myHooks.VendorBuyAll(); + } + + public void VendorAddBuyList(int templateId, int count) + { + myHooks.VendorBuyListAdd(templateId, count); + } + + public void VendorClearBuyList() + { + myHooks.VendorBuyListClear(); + } + + public void VendorSellAll() + { + myHooks.VendorSellAll(); + } + + public void VendorAddSellList(int itemId) + { + myHooks.VendorSellListAdd(itemId); + } + + public void VendorClearSellList() + { + myHooks.VendorSellListClear(); + } + + public void AddSkillExperience(SkillType skill, int experience) + { + myHooks.AddSkillExp((eSkill)skill, experience); + } + + public void AddAttributeExperience(AttributeType attrib, int experience) + { + myHooks.AddAttributeExp((eAttribute)attrib, experience); + } + + public void AddVitalExperience(VitalType vital, int experience) + { + myHooks.AddVitalExp((eVital)vital, experience); + } + + int IIndexedValueProvider.GetIndexedObject(hookIndexType index, int item) + { + int result = 0; + switch (index) + { + case hookIndexType.Attribute: + result = ((dynamic)myHooks).get_Attribute(item); + break; + case hookIndexType.AttributeClicks: + result = ((dynamic)myHooks).get_AttributeClicks((eAttribute)item); + break; + case hookIndexType.AttributeStart: + result = ((dynamic)myHooks).get_AttributeStart((eAttribute)item); + break; + case hookIndexType.AttributeTotalXP: + result = ((dynamic)myHooks).get_AttributeTotalXP((eAttribute)item); + break; + case hookIndexType.Skill: + result = ((dynamic)myHooks).get_Skill(item); + break; + case hookIndexType.SkillClicks: + result = ((dynamic)myHooks).get_SkillClicks((eSkill)item); + break; + case hookIndexType.SkillFreePoints: + result = ((dynamic)myHooks).get_SkillFreePoints((eSkill)item); + break; + case hookIndexType.SkillTotalXP: + result = ((dynamic)myHooks).get_SkillTotalXP((eSkill)item); + break; + case hookIndexType.SkillTrainLevel: + result = (int)((dynamic)myHooks).get_SkillTrainLevel((eSkill)item); + break; + case hookIndexType.Vital: + result = ((dynamic)myHooks).get_Vital(item); + break; + case hookIndexType.VitalClicks: + result = ((dynamic)myHooks).get_VitalClicks((eVital)item); + break; + case hookIndexType.VitalTotalXP: + result = ((dynamic)myHooks).get_VitalTotalXP((eVital)item); + break; + case hookIndexType.Misc: + result = ((dynamic)myHooks).get_Misc(item); + break; + } + return result; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HostBase.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HostBase.cs new file mode 100644 index 0000000..5ca64a3 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HostBase.cs @@ -0,0 +1,75 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public abstract class HostBase : MarshalByRefObject, IDisposable +{ + private HooksWrapper myInternalHooks; + + private DecalWrapper myInternalDecal; + + private RenderServiceWrapper myInternalRender; + + private bool isDisposed; + + protected bool IsDisposed => isDisposed; + + protected DecalWrapper MyDecal + { + get + { + return myInternalDecal; + } + set + { + myInternalDecal = value; + } + } + + protected RenderServiceWrapper MyRender + { + get + { + return myInternalRender; + } + set + { + myInternalRender = value; + } + } + + ~HostBase() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed && disposing) + { + if (myInternalHooks != null) + { + myInternalHooks.Dispose(); + } + if (myInternalDecal != null) + { + myInternalDecal.Dispose(); + } + if (myInternalRender != null) + { + myInternalRender.Dispose(); + } + } + myInternalHooks = null; + myInternalDecal = null; + myInternalRender = null; + isDisposed = true; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyEventArgs.cs new file mode 100644 index 0000000..105db4f --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyEventArgs.cs @@ -0,0 +1,31 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class HotkeyEventArgs : EventArgs +{ + private string myTitle; + + private bool myEat; + + public string Title => myTitle; + + public bool Eat + { + get + { + return myEat; + } + set + { + myEat = value; + } + } + + internal HotkeyEventArgs(string Title, bool Eat) + { + myTitle = Title; + myEat = Eat; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeySystem.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeySystem.cs new file mode 100644 index 0000000..9652407 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeySystem.cs @@ -0,0 +1,133 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using Decal.Interop.DHS; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class HotkeySystem : MarshalByRefObject, IDisposable +{ + private Decal.Interop.DHS.HotkeySystem myHKS; + + private bool isDisposed; + + private EventHandler mHotkey; + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public Decal.Interop.DHS.HotkeySystem Underlying => myHKS; + + public event EventHandler Hotkey + { + add + { + mHotkey = (EventHandler)Delegate.Combine(mHotkey, value); + } + remove + { + mHotkey = (EventHandler)Delegate.Remove(mHotkey, value); + } + } + + internal HotkeySystem(Decal.Interop.DHS.HotkeySystem hks) + { + myHKS = hks; + myHKS.HotkeyEvent += myHKS_HotkeyEvent; + } + + ~HotkeySystem() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed && disposing && myHKS != null) + { + myHKS.HotkeyEvent -= myHKS_HotkeyEvent; + } + if (myHKS != null) + { + Marshal.ReleaseComObject(myHKS); + } + isDisposed = true; + } + + public void AddHotkey(string szPlugin, HotkeyWrapper hotkey) + { + if (hotkey == null) + { + throw new ArgumentNullException("hotkey"); + } + AddHotkey(szPlugin, hotkey.Underlying); + } + + public void AddHotkey(string szPlugin, string szTitle, string szDescription) + { + Hotkey hotkey = new HotkeyClass(); + hotkey.EventTitle = szTitle; + hotkey.EventDescription = szDescription; + AddHotkey(szPlugin, hotkey); + Marshal.ReleaseComObject(hotkey); + } + + public void AddHotkey(string plugin, string title, string description, int virtualKey, bool altState, bool controlState, bool shiftState) + { + Hotkey hotkey = new HotkeyClass(); + hotkey.EventTitle = title; + hotkey.EventDescription = description; + hotkey.VirtualKey = virtualKey; + hotkey.AltState = altState; + hotkey.ControlState = controlState; + hotkey.ShiftState = shiftState; + AddHotkey(plugin, hotkey); + Marshal.ReleaseComObject(hotkey); + } + + private void AddHotkey(string szPlugin, Hotkey hotkey) + { + if (hotkey == null) + { + throw new ArgumentNullException("hotkey"); + } + myHKS.AddHotkey(szPlugin, hotkey); + } + + public void DeleteHotkey(string plugin, string hotkeyName) + { + myHKS.DeleteHotkey(plugin, hotkeyName); + } + + public bool Exists(string hotkeyName) + { + return myHKS.QueryHotkey(hotkeyName); + } + + public HotkeyWrapper GetHotkey(string plugin, string hotkeyName) + { + Hotkey hotkey = myHKS.QueryHotkeyEx(plugin, hotkeyName); + HotkeyWrapper result = null; + if (hotkey != null) + { + result = new HotkeyWrapper(hotkey); + } + return result; + } + + private void myHKS_HotkeyEvent(string szTitle, ref bool Eat) + { + if (mHotkey != null) + { + HotkeyEventArgs e = new HotkeyEventArgs(szTitle, Eat); + mHotkey(this, e); + Eat = e.Eat; + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyWrapper.cs new file mode 100644 index 0000000..432b7d2 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HotkeyWrapper.cs @@ -0,0 +1,82 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using Decal.Interop.DHS; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class HotkeyWrapper : MarshalByRefObject, IDisposable +{ + private Hotkey myHotkey; + + private bool isDisposed; + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public Hotkey Underlying => myHotkey; + + public bool AltState => myHotkey.AltState; + + public bool ControlState => myHotkey.ControlState; + + public bool ShiftState => myHotkey.ShiftState; + + public int VirtualKey => myHotkey.VirtualKey; + + public string Title => myHotkey.EventTitle; + + public string Description => myHotkey.EventDescription; + + internal HotkeyWrapper(Hotkey hotkey) + { + myHotkey = hotkey; + } + + public HotkeyWrapper(string title, string description) + : this(new HotkeyClass()) + { + myHotkey.EventTitle = title; + myHotkey.EventDescription = description; + } + + public HotkeyWrapper(string title, string description, int virtualKey, bool altState, bool controlState, bool shiftState) + : this(title, description) + { + myHotkey.VirtualKey = virtualKey; + myHotkey.AltState = altState; + myHotkey.ControlState = controlState; + myHotkey.ShiftState = shiftState; + } + + ~HotkeyWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myHotkey != null) + { + Marshal.ReleaseComObject(myHotkey); + } + isDisposed = true; + } + + protected void EnforceDisposedOnce() + { + if (isDisposed) + { + throw new ObjectDisposedException("HotkeyWrapper"); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Hud.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Hud.cs new file mode 100644 index 0000000..b961bd8 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Hud.cs @@ -0,0 +1,86 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Render; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class Hud : HudRenderScalable +{ + private HUDView internalView; + + internal HUDView Underlying => internalView; + + public bool Enabled + { + get + { + return internalView.Enabled; + } + set + { + internalView.Enabled = value; + } + } + + public int Id => internalView.ID; + + public float Angle + { + get + { + return internalView.Angle; + } + set + { + internalView.Angle = value; + } + } + + public int Alpha + { + get + { + return internalView.Alpha; + } + set + { + internalView.Alpha = value; + } + } + + internal event EventHandler Disposing; + + internal Hud(HUDView view) + : base(view) + { + internalView = view; + } + + public void SetBackground(Background background) + { + if (background != null) + { + internalView.SetBackground(background.Underlying); + return; + } + throw new ArgumentNullException("background"); + } + + protected override void Dispose(bool disposing) + { + try + { + if (disposing && this.Disposing != null) + { + this.Disposing(this, new EventArgs()); + } + Marshal.ReleaseComObject(internalView); + internalView = null; + } + finally + { + base.Dispose(disposing); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderScalable.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderScalable.cs new file mode 100644 index 0000000..3eef0b6 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderScalable.cs @@ -0,0 +1,52 @@ +using System; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Core; +using Decal.Interop.Render; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class HudRenderScalable : HudRenderTarget +{ + private IRenderScalable myScalable; + + public Rectangle ScaleRect => Util.toRectangle(myScalable.ScaleRect); + + public float ScaleFactor + { + get + { + return myScalable.ScaleFactor; + } + set + { + myScalable.ScaleFactor = value; + } + } + + public bool Scaling + { + get + { + return myScalable.Scaling; + } + set + { + myScalable.Scaling = value; + } + } + + [CLSCompliant(false)] + protected HudRenderScalable(IRenderScalable newTarget) + : base(newTarget) + { + myScalable = newTarget; + } + + public void ScaleTo(Rectangle rect) + { + tagRECT pArea = Util.toTagRECT(rect); + myScalable.ScaleTo(ref pArea); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderTarget.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderTarget.cs new file mode 100644 index 0000000..9091561 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/HudRenderTarget.cs @@ -0,0 +1,380 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.InteropServices; +using Decal.Adapter.Support; +using Decal.Interop.Core; +using Decal.Interop.Render; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class HudRenderTarget : MarshalByRefObject, IDisposable +{ + private IRenderTarget myTarget; + + private bool isDisposed; + + private Rectangle areaRect; + + private bool inRender; + + private bool inText; + + public bool Lost => myTarget.Lost; + + [EditorBrowsable(EditorBrowsableState.Never)] + public Rectangle Constraint + { + get + { + Rectangle region = Region; + return new Rectangle(0, 0, region.Width, region.Height); + } + } + + public Rectangle Region + { + get + { + return Util.toRectangle(myTarget.Region); + } + set + { + tagRECT pVal = Util.toTagRECT(value); + myTarget.Region = pVal; + areaRect.Width = value.Width; + areaRect.Height = value.Height; + } + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public object UnsafeSurface => myTarget.GetSurface(); + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public tagRECT UnsafeRegion + { + get + { + return myTarget.Region; + } + set + { + myTarget.Region = value; + } + } + + protected bool IsDisposed => isDisposed; + + [CLSCompliant(false)] + protected HudRenderTarget(IRenderTarget newTarget) + { + if (newTarget == null) + { + throw new ArgumentNullException("newTarget"); + } + myTarget = newTarget; + tagRECT region = myTarget.Region; + areaRect = new Rectangle(0, 0, region.right - region.left, region.bottom - region.top); + } + + ~HudRenderTarget() + { + Dispose(disposing: false); + } + + public void BeginRender() + { + BeginRender(enableTextureFilter: false); + } + + public void BeginRender(bool enableTextureFilter) + { + if (!inRender) + { + myTarget.BeginRender(enableTextureFilter); + inRender = true; + return; + } + throw new RenderViolationException("Cannot call 'BeginRender' when already rendering"); + } + + public void EndRender() + { + if (inRender) + { + myTarget.EndRender(); + inRender = false; + return; + } + throw new RenderViolationException("Cannot call 'EndRender' without a previous call to 'BeginRender'"); + } + + public void BeginText(string fontName, int pixelHeight) + { + BeginText(fontName, pixelHeight, FontWeight.Normal, italic: false); + } + + public void BeginText(string fontName, int pixelHeight, FontWeight weight, bool italic) + { + UnsafeBeginText(fontName, pixelHeight, (int)weight, italic); + } + + public void WriteText(string text) + { + WriteText(text, Color.Black, WriteTextFormats.None, areaRect); + } + + public void WriteText(string text, Color color) + { + WriteText(text, color, WriteTextFormats.None, areaRect); + } + + public void WriteText(string text, Color color, WriteTextFormats format, Rectangle region) + { + UnsafeWriteText(Util.toTagRECT(region), color.ToArgb(), (int)format, text); + } + + public void WriteText(string text, int color, WriteTextFormats format, Rectangle region) + { + UnsafeWriteText(Util.toTagRECT(region), color, (int)format, text); + } + + public void EndText() + { + if (inRender && inText) + { + myTarget.EndText(); + inText = false; + return; + } + throw new RenderViolationException("Cannot call 'EndText' without a previous call to 'BeginText'"); + } + + public void Clear() + { + Clear(areaRect); + } + + public void Clear(Rectangle clearArea) + { + UnsafeClear(Util.toTagRECT(clearArea)); + } + + public void DrawPortalImage(int portalFile, Rectangle destinationArea) + { + UnsafeDrawPortalImage(portalFile, Util.toTagRECT(destinationArea)); + } + + public void DrawPortalImage(int portalFile, int alpha, Rectangle srcArea, Rectangle destinationArea) + { + UnsafeDrawPortalImage(portalFile, alpha, Util.toTagRECT(srcArea), Util.toTagRECT(destinationArea)); + } + + public void DrawPortalImage(int portalFile, Rectangle srcArea, Rectangle destinationArea) + { + UnsafeDrawPortalImage(portalFile, 255, Util.toTagRECT(srcArea), Util.toTagRECT(destinationArea)); + } + + public void TilePortalImage(int portalFile, Rectangle destinationArea) + { + UnsafeTilePortalImage(portalFile, Util.toTagRECT(destinationArea)); + } + + public void TilePortalImage(int portalFile, Rectangle srcArea, Rectangle destinationArea) + { + UnsafeTilePortalImage(portalFile, Util.toTagRECT(srcArea), Util.toTagRECT(destinationArea)); + } + + public void DrawImage(Image image, Rectangle destinationRegion) + { + DrawImage(image, destinationRegion, Color.Cyan.ToArgb()); + } + + public void DrawImage(Image image, Rectangle destinationRegion, Color colorKey) + { + DrawImage(image, destinationRegion, colorKey.ToArgb()); + } + + public void DrawImage(Image image, Rectangle destinationRegion, int colorKey) + { + if (image == null) + { + throw new ArgumentNullException("image"); + } + MemoryStream memoryStream = new MemoryStream(); + image.Save((Stream)memoryStream, ImageFormat.Bmp); + byte[] buffer = memoryStream.GetBuffer(); + IntPtr zero = IntPtr.Zero; + int num = buffer.Length; + zero = Marshal.AllocCoTaskMem(num); + try + { + Marshal.Copy(buffer, 0, zero, num); + if (zero != IntPtr.Zero) + { + UnsafeDrawImage(zero, num, Util.toTagRECT(destinationRegion), colorKey); + } + } + finally + { + Marshal.FreeCoTaskMem(zero); + memoryStream.Dispose(); + } + } + + public void Fill(Color color) + { + Fill(areaRect, color); + } + + public void Fill(Rectangle fillArea, Color color) + { + Fill(fillArea, color.ToArgb()); + } + + public void Fill(Rectangle fillArea, int color) + { + UnsafeFill(Util.toTagRECT(fillArea), color); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeBeginText(string fontName, int pixelHeight, int weight, bool italic) + { + if (inRender && !inText) + { + myTarget.BeginText(fontName, pixelHeight, weight, italic); + inText = true; + return; + } + if (inRender && inText) + { + throw new RenderViolationException("Cannot call 'BeginText' when already rendering text"); + } + throw new RenderViolationException("Cannot call 'BeginText' outside of a BeginRender/EndRender block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeWriteText(tagRECT region, int color, int format, string text) + { + if (inRender && inText) + { + myTarget.WriteText(ref region, color, format, text); + return; + } + throw new RenderViolationException("Cannot call 'WriteText' outside of a BeginText/EndText block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeClear(tagRECT clearArea) + { + if (!inRender) + { + myTarget.Clear(ref clearArea); + return; + } + throw new RenderViolationException("MUST call 'Clear' outside of a BeginRender/EndRender block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeDrawPortalImage(int portalFile, tagRECT destinationArea) + { + if (inRender) + { + myTarget.DrawPortalImage(portalFile, ref destinationArea); + return; + } + throw new RenderViolationException("Cannot call 'DrawPortalImage' outside of a BeginRender/EndRender block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeDrawPortalImage(int portalFile, int alpha, tagRECT srcArea, tagRECT destinationArea) + { + if (inRender) + { + myTarget.DrawPortalImageEx(portalFile, alpha, ref srcArea, ref destinationArea); + return; + } + throw new RenderViolationException("Cannot call 'DrawPortalImageEx' outside of a BeginRender/EndRender block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeTilePortalImage(int portalFile, tagRECT destinationArea) + { + if (inRender) + { + myTarget.TilePortalImage(portalFile, ref destinationArea); + return; + } + throw new RenderViolationException("Cannot call 'TilePortalImage' outside of a BeginRender/EndRender block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeTilePortalImage(int portalFile, tagRECT srcArea, tagRECT destinationArea) + { + if (inRender) + { + myTarget.TilePortalImageEx(portalFile, ref srcArea, ref destinationArea); + return; + } + throw new RenderViolationException("Cannot call 'TilePortalImageEx' outside of a BeginRender/EndRender block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeDrawImage(IntPtr buffer, int size, tagRECT destinationRegion, int colorKey) + { + if (inRender) + { + myTarget.DrawImage((int)buffer, size, ref destinationRegion, colorKey); + return; + } + throw new RenderViolationException("Cannot call 'DrawImage' outside of a BeginRender/EndRender block"); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeFill(tagRECT fillArea, int color) + { + if (!inRender) + { + myTarget.Fill(ref fillArea, color); + return; + } + throw new RenderViolationException("MUST call 'Fill' outside of a BeginRender/EndRender block"); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public void UnsafeSetSurface(object pSurface) + { + myTarget.SetSurface(pSurface); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myTarget != null) + { + Marshal.ReleaseComObject(myTarget); + } + myTarget = null; + isDisposed = true; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IControlWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IControlWrapper.cs new file mode 100644 index 0000000..4f6f80a --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IControlWrapper.cs @@ -0,0 +1,22 @@ +using System.ComponentModel; + +namespace Decal.Adapter.Wrappers; + +public interface IControlWrapper +{ + [EditorBrowsable(EditorBrowsableState.Never)] + object Underlying { get; } + + int Id { get; } + + int ChildCount { get; } + + [EditorBrowsable(EditorBrowsableState.Never)] + void Initialize(object control); + + [EditorBrowsable(EditorBrowsableState.Never)] + object ChildById(int id); + + [EditorBrowsable(EditorBrowsableState.Never)] + object ChildByIndex(int index); +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedProvider.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedProvider.cs new file mode 100644 index 0000000..1508b88 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedProvider.cs @@ -0,0 +1,12 @@ +using System.Collections; + +namespace Decal.Adapter.Wrappers; + +public interface IIndexedProvider +{ + object GetIndexedObject(IndexType index, int item); + + IEnumerator GetEnumerator(IndexType index); + + int Count(IndexType index); +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedValueProvider.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedValueProvider.cs new file mode 100644 index 0000000..3be3502 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IIndexedValueProvider.cs @@ -0,0 +1,6 @@ +namespace Decal.Adapter.Wrappers; + +internal interface IIndexedValueProvider +{ + int GetIndexedObject(hookIndexType index, int item); +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IViewHandler.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IViewHandler.cs new file mode 100644 index 0000000..946a986 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IViewHandler.cs @@ -0,0 +1,14 @@ +using System.Reflection; + +namespace Decal.Adapter.Wrappers; + +public interface IViewHandler +{ + ViewWrapper DefaultView { get; } + + BindingFlags BindingFlags { get; } + + void LoadView(string name, string resource); + + ViewWrapper GetView(string name); +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IndexedCollection.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IndexedCollection.cs new file mode 100644 index 0000000..f2fc147 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/IndexedCollection.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; + +namespace Decal.Adapter.Wrappers; + +public sealed class IndexedCollection : MarshalByRefObject, IEnumerable, IEnumerable where InternalIndexType : struct, IConvertible where IndexType : struct, IConvertible +{ + private InternalIndexType myDataType; + + private IIndexedProvider myWrap; + + public RType this[IndexType index] => (RType)myWrap.GetIndexedObject(myDataType, index.ToInt32(CultureInfo.InvariantCulture)); + + public int Count => myWrap.Count(myDataType); + + internal IndexedCollection(IIndexedProvider wrap, InternalIndexType data) + { + myDataType = data; + myWrap = wrap; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return (IEnumerator)myWrap.GetEnumerator(myDataType); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return myWrap.GetEnumerator(myDataType); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListColumn.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListColumn.cs new file mode 100644 index 0000000..7938f4e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListColumn.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using Decal.Adapter.Support; + +namespace Decal.Adapter.Wrappers; + +public class ListColumn +{ + private ListWrapper myList; + + private int rowIndex; + + private int colIndex; + + public object this[int subVal] + { + get + { + return myList.get_Data(rowIndex, colIndex, subVal); + } + set + { + myList.set_Data(rowIndex, colIndex, subVal, ref value); + } + } + + public Color Color + { + get + { + return Util.ColorFromBGR(myList.get_Color(rowIndex, colIndex)); + } + set + { + myList.set_Color(rowIndex, colIndex, Util.ColorToBGR(value)); + } + } + + public int Width + { + get + { + return myList.get_ColWidth(colIndex); + } + set + { + myList.set_ColWidth(colIndex, value); + } + } + + internal ListColumn(ListWrapper list, int row, int col) + { + myList = list; + rowIndex = row; + colIndex = col; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListRow.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListRow.cs new file mode 100644 index 0000000..ca0d118 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListRow.cs @@ -0,0 +1,29 @@ +namespace Decal.Adapter.Wrappers; + +public class ListRow +{ + private ListWrapper myList; + + private int rowIndex; + + private int colCount; + + public ListColumn this[int column] + { + get + { + if (column >= 0 && column < colCount) + { + return new ListColumn(myList, rowIndex, column); + } + return null; + } + } + + internal ListRow(ListWrapper list, int row) + { + myList = list; + rowIndex = row; + colCount = myList.ColCount; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListWrapper.cs new file mode 100644 index 0000000..f561e87 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ListWrapper.cs @@ -0,0 +1,194 @@ +using System; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class ListWrapper : ControlWrapperBase +{ + private EventHandler evtDestroy; + + private EventHandler evtSelect; + + public ListRow this[int row] + { + get + { + if (row >= 0 && row < base.Control.Count) + { + return new ListRow(this, row); + } + return null; + } + } + + public bool AutoScroll + { + get + { + return base.Control.AutoScroll; + } + set + { + base.Control.AutoScroll = value; + } + } + + public int RowEstimate + { + set + { + base.Control.RowEstimate = value; + } + } + + public int ScrollPosition + { + get + { + return base.Control.ScrollPosition; + } + set + { + base.Control.ScrollPosition = value; + } + } + + public int RowCount => base.Control.Count; + + public int ColCount => base.Control.CountCols; + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + public event EventHandler Selected + { + add + { + if (evtSelect == null) + { + base.Control.Change += SelectEvent; + } + evtSelect = (EventHandler)Delegate.Combine(evtSelect, value); + } + remove + { + evtSelect = (EventHandler)Delegate.Remove(evtSelect, value); + if (evtSelect == null) + { + base.Control.Change -= SelectEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + if (evtSelect != null) + { + evtSelect = (EventHandler)Delegate.Remove(evtSelect, evtSelect); + base.Control.Change -= SelectEvent; + } + } + base.Dispose(disposing); + } + + internal int AddRow() + { + return base.Control.AddRow(); + } + + internal object get_Data(int row, int col, int subVal) + { + return ((dynamic)base.Control).get_Data(col, row, subVal); + } + + internal void set_Data(int row, int col, int subVal, ref object val) + { + ((dynamic)base.Control).set_Data(col, row, subVal, val); + } + + internal int get_Color(int row, int col) + { + return ((dynamic)base.Control).get_Color(col, row); + } + + internal void set_Color(int row, int col, int color) + { + ((dynamic)base.Control).set_Color(col, row, color); + } + + internal int get_ColWidth(int col) + { + return ((dynamic)base.Control).get_ColumnWidth(col); + } + + internal void set_ColWidth(int col, int width) + { + ((dynamic)base.Control).set_ColumnWidth(col, width); + } + + public ListRow Add() + { + return new ListRow(this, AddRow()); + } + + public ListRow Insert(int row) + { + base.Control.InsertRow(row); + return new ListRow(this, row); + } + + public void JumpToPosition(int row) + { + base.Control.JumpToPosition(row); + } + + public void Clear() + { + base.Control.Clear(); + } + + public void Delete(int index) + { + base.Control.DeleteRow(index); + } + + private void SelectEvent(int ID, int Col, int Row) + { + if (evtSelect != null) + { + evtSelect(new ListColumn(this, Row, Col), new ListSelectEventArgs(ID, Row, Col)); + } + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LoginEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LoginEventArgs.cs new file mode 100644 index 0000000..c8551e5 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LoginEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class LoginEventArgs : EventArgs +{ + private int myId; + + public int Id => myId; + + internal LoginEventArgs(int Id) + { + myId = Id; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventArgs.cs new file mode 100644 index 0000000..9afd010 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class LogoffEventArgs : EventArgs +{ + private LogoffEventType myType; + + public LogoffEventType Type => myType; + + internal LogoffEventArgs(LogoffEventType type) + { + myType = type; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventType.cs new file mode 100644 index 0000000..b976453 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LogoffEventType.cs @@ -0,0 +1,10 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum LogoffEventType +{ + Requested, + Authorized +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LongValueKey.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LongValueKey.cs new file mode 100644 index 0000000..502fdca --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/LongValueKey.cs @@ -0,0 +1,108 @@ +namespace Decal.Adapter.Wrappers; + +public enum LongValueKey +{ + Type = 218103808, + Icon = 218103809, + Container = 218103810, + Landblock = 218103811, + ItemSlots = 218103812, + PackSlots = 218103813, + StackCount = 218103814, + StackMax = 218103815, + AssociatedSpell = 218103816, + SlotLegacy = 218103817, + Wielder = 218103818, + WieldingSlot = 218103819, + Monarch = 218103820, + Coverage = 218103821, + EquipableSlots = 218103822, + EquipType = 218103823, + IconOutline = 218103824, + MissileType = 218103825, + UsageMask = 218103826, + HouseOwner = 218103827, + HookMask = 218103828, + HookType = 218103829, + Model = 218103830, + Flags = 218103831, + CreateFlags1 = 218103832, + CreateFlags2 = 218103833, + Category = 218103834, + Behavior = 218103835, + MagicDef = 218103836, + SpecialProps = 218103837, + SpellCount = 218103838, + WeapSpeed = 218103839, + EquipSkill = 218103840, + DamageType = 218103841, + MaxDamage = 218103842, + Unknown10 = 218103843, + Unknown100000 = 218103844, + Unknown800000 = 218103845, + Unknown8000000 = 218103846, + PhysicsDataFlags = 218103847, + ActiveSpellCount = 218103848, + IconOverlay = 218103849, + IconUnderlay = 218103850, + Species = 2, + Burden = 5, + EquippedSlots = 10, + RareId = 17, + Value = 19, + TotalValue = 20, + SkillCreditsAvail = 24, + CreatureLevel = 25, + RestrictedToToD = 26, + ArmorLevel = 28, + Rank = 30, + Bonded = 33, + NumberFollowers = 35, + Unenchantable = 36, + LockpickDifficulty = 38, + Deaths = 43, + WandElemDmgType = 45, + MinLevelRestrict = 86, + MaxLevelRestrict = 87, + LockpickSkillBonus = 88, + AffectsVitalId = 89, + AffectsVitalAmt = 90, + HealKitSkillBonus = 90, + UsesTotal = 91, + UsesRemaining = 92, + DateOfBirth = 98, + Workmanship = 105, + Spellcraft = 106, + CurrentMana = 107, + MaximumMana = 108, + LoreRequirement = 109, + RankRequirement = 110, + PortalRestrictions = 111, + Gender = 113, + Attuned = 114, + SkillLevelReq = 115, + ManaCost = 117, + Age = 125, + XPForVPReduction = 129, + Material = 131, + WieldReqType = 158, + WieldReqAttribute = 159, + WieldReqValue = 160, + SlayerSpecies = 166, + NumberItemsSalvagedFrom = 170, + NumberTimesTinkered = 171, + DescriptionFormat = 172, + PagesUsed = 174, + PagesTotal = 175, + ActivationReqSkillId = 176, + GemSettingQty = 177, + GemSettingType = 178, + Imbued = 179, + Heritage = 188, + FishingSkill = 192, + KeysHeld = 193, + ElementalDmgBonus = 204, + CleaveType = 263, + ArmorSet = 265, + Slot = 231735296 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/MoveObjectEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/MoveObjectEventArgs.cs new file mode 100644 index 0000000..35ea2f3 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/MoveObjectEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class MoveObjectEventArgs : EventArgs +{ + private WorldObject myMovedObject; + + public WorldObject Moved => myMovedObject; + + internal MoveObjectEventArgs(WorldObject movedObject) + { + myMovedObject = movedObject; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/NetServiceHost.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/NetServiceHost.cs new file mode 100644 index 0000000..3aa14ba --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/NetServiceHost.cs @@ -0,0 +1,43 @@ +using System; +using System.ComponentModel; +using Decal.Interop.Net; + +namespace Decal.Adapter.Wrappers; + +public sealed class NetServiceHost : HostBase +{ + private NetService myService; + + [EditorBrowsable(EditorBrowsableState.Never)] + public NetService Underlying => myService; + + public DecalWrapper Decal + { + get + { + if (base.MyDecal == null) + { + base.MyDecal = new DecalWrapper(myService.Decal); + } + return base.MyDecal; + } + } + + public HooksWrapper Actions => CoreManager.Current.Actions; + + internal NetServiceHost(NetService svc) + { + myService = svc; + base.MyDecal = new DecalWrapper(myService.Decal); + } + + public object GetComFilter(string progId) + { + return ((dynamic)(INetService)myService).get_FilterVB(progId); + } + + public object GetComFilter(Guid clsid, Guid riid) + { + return ((dynamic)(INetService)myService).get_Filter(ref clsid, ref riid); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/NotebookWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/NotebookWrapper.cs new file mode 100644 index 0000000..e507033 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/NotebookWrapper.cs @@ -0,0 +1,117 @@ +using System; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.Adapter.Wrappers; + +public class NotebookWrapper : ControlWrapperBase +{ + private EventHandler evtDestroy; + + private EventHandler evtChange; + + private PageTextIndexer myPageIndex; + + public int ActiveTab + { + get + { + return base.Control.ActiveTab; + } + set + { + base.Control.ActiveTab = value; + } + } + + public PageTextIndexer PageText => myPageIndex; + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + public event EventHandler Change + { + add + { + if (evtChange == null) + { + base.Control.Change += ChangeEvent; + } + evtChange = (EventHandler)Delegate.Combine(evtChange, value); + } + remove + { + evtChange = (EventHandler)Delegate.Remove(evtChange, value); + if (evtChange == null) + { + base.Control.Change -= ChangeEvent; + } + } + } + + public override void Initialize(object control) + { + base.Initialize(control); + myPageIndex = new PageTextIndexer(base.Control); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + if (evtChange != null) + { + evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); + base.Control.Change -= ChangeEvent; + } + if (myPageIndex != null) + { + myPageIndex.Dispose(); + } + } + base.Dispose(disposing); + } + + public void AddPage(string text, IControl control) + { + base.Control.AddPage(text, control); + } + + private void ChangeEvent(int ID, int Index) + { + if (evtChange != null) + { + evtChange(this, new IndexChangeEventArgs(ID, Index)); + } + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ObjectClass.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ObjectClass.cs new file mode 100644 index 0000000..f87c6a4 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ObjectClass.cs @@ -0,0 +1,49 @@ +namespace Decal.Adapter.Wrappers; + +public enum ObjectClass +{ + Unknown, + MeleeWeapon, + Armor, + Clothing, + Jewelry, + Monster, + Food, + Money, + Misc, + MissileWeapon, + Container, + Gem, + SpellComponent, + Key, + Portal, + TradeNote, + ManaStone, + Plant, + BaseCooking, + BaseAlchemy, + BaseFletching, + CraftedCooking, + CraftedAlchemy, + CraftedFletching, + Player, + Vendor, + Door, + Corpse, + Lifestone, + HealingKit, + Lockpick, + WandStaffOrb, + Bundle, + Book, + Journal, + Sign, + Housing, + Npc, + Foci, + Salvage, + Ust, + Services, + Scroll, + NumObjectClasses +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PageTextIndexer.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PageTextIndexer.cs new file mode 100644 index 0000000..1a47579 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PageTextIndexer.cs @@ -0,0 +1,31 @@ +using System; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public sealed class PageTextIndexer : IDisposable +{ + private NotebookClass myControl; + + public string this[int index] + { + get + { + return ((dynamic)myControl).get_PageText(index); + } + set + { + ((dynamic)myControl).set_PageText(index, value); + } + } + + internal PageTextIndexer(NotebookClass control) + { + myControl = control; + } + + public void Dispose() + { + myControl = null; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerModifyEventType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerModifyEventType.cs new file mode 100644 index 0000000..ff5eb5e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerModifyEventType.cs @@ -0,0 +1,14 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum PlayerModifyEventType +{ + Skill, + Attribute, + Vital, + Statistic, + Allegiance, + Augmentation +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerXPEventType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerXPEventType.cs new file mode 100644 index 0000000..6418f1e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PlayerXPEventType.cs @@ -0,0 +1,10 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum PlayerXPEventType +{ + Total, + Unassigned +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PluginHost.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PluginHost.cs new file mode 100644 index 0000000..62d34d3 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PluginHost.cs @@ -0,0 +1,149 @@ +using System; +using System.ComponentModel; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Xml; +using Decal.Interop.Core; +using Decal.Interop.Inject; +using Decal.Interop.Render; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public sealed class PluginHost : HostBase +{ + private IPluginSite2 mySite; + + private IPluginSite myOldSite; + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public IPluginSite2 Underlying => mySite; + + public DecalWrapper Decal + { + get + { + if (base.MyDecal == null) + { + base.MyDecal = new DecalWrapper(mySite.Decal); + } + return base.MyDecal; + } + } + + public HooksWrapper Actions => CoreManager.Current.Actions; + + public RenderServiceWrapper Render + { + get + { + if (base.MyRender == null) + { + base.MyRender = new RenderServiceWrapper((RenderService)GetObject("services\\DecalRender.RenderService")); + } + return base.MyRender; + } + } + + internal PluginHost(PluginSite2 pSite) + { + mySite = pSite; + base.MyDecal = new DecalWrapper(mySite.Decal); + myOldSite = (IPluginSite)mySite.PluginSite; + } + + protected override void Dispose(bool disposing) + { + try + { + _ = base.IsDisposed; + if (myOldSite != null) + { + Marshal.ReleaseComObject(myOldSite); + myOldSite = null; + } + if (mySite != null) + { + Marshal.ReleaseComObject(mySite); + mySite = null; + } + } + finally + { + base.Dispose(disposing); + } + } + + public object GetObject(string path) + { + return ((dynamic)mySite).get_Object(path); + } + + public int GetKeyboardMapping(string name) + { + return myOldSite.QueryKeyboardMap(name); + } + + internal static void LoadViewHandler(IViewHandler handler) + { + if (ViewWrapper.ScanViews(handler)) + { + ViewWrapper.ScanControls(handler); + ViewWrapper.ScanReferences(handler); + } + } + + public ViewHandler LoadViewHandler(Type handlerType) + { + ViewHandler obj = (ViewHandler)Activator.CreateInstance(handlerType, this); + LoadViewHandler(obj); + obj.LoadComplete(); + return obj; + } + + public ViewWrapper LoadViewResource(string resourcePath) + { + Assembly callingAssembly = Assembly.GetCallingAssembly(); + return LoadViewResource(resourcePath, callingAssembly); + } + + public ViewWrapper LoadViewResource(string resourcePath, Assembly resourceAssembly) + { + //IL_001c: Unknown result type (might be due to invalid IL or missing references) + //IL_0022: Expected O, but got Unknown + if (null == resourceAssembly) + { + throw new ArgumentNullException("resourceAssembly"); + } + Stream manifestResourceStream = resourceAssembly.GetManifestResourceStream(resourcePath); + XmlDocument val = new XmlDocument(); + val.Load(manifestResourceStream); + return LoadView(((XmlNode)val).OuterXml); + } + + public ViewWrapper LoadView(XmlElement viewSchema) + { + if (viewSchema == null) + { + throw new ArgumentNullException("viewSchema"); + } + return LoadView(((XmlNode)viewSchema).OuterXml); + } + + public ViewWrapper LoadView(string viewSchema) + { + View view = myOldSite.LoadView(viewSchema); + if (view != null) + { + return new ViewWrapper(view); + } + return null; + } + + public object ComFilter(string progId) + { + return ((dynamic)mySite).get_Object("services\\DecalNet.NetService\\" + progId); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PortalEventType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PortalEventType.cs new file mode 100644 index 0000000..ded6cfe --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PortalEventType.cs @@ -0,0 +1,10 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum PortalEventType +{ + EnterPortal, + ExitPortal +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ProgressWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ProgressWrapper.cs new file mode 100644 index 0000000..b7b7e44 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ProgressWrapper.cs @@ -0,0 +1,211 @@ +using System; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class ProgressWrapper : ControlWrapperBase +{ + private EventHandler evtDestroy; + + private string alignment; + + private Color borderColor; + + private int borderWidth; + + private bool drawText; + + private Color faceColor; + + private Color fillColor; + + private int maxValue; + + private string preText; + + private string postText; + + private Color textColor; + + public string Alignment + { + get + { + return alignment; + } + set + { + alignment = value; + base.Control.Alignment = value; + } + } + + public Color BorderColor + { + get + { + return borderColor; + } + set + { + borderColor = value; + base.Control.BorderColor = Util.ColorToBGR(value); + } + } + + public int BorderWidth + { + get + { + return borderWidth; + } + set + { + borderWidth = value; + base.Control.BorderWidth = value; + } + } + + public bool DrawText + { + get + { + return drawText; + } + set + { + drawText = value; + base.Control.DecalDrawText = value; + } + } + + public Color FaceColor + { + get + { + return faceColor; + } + set + { + faceColor = value; + base.Control.FaceColor = Util.ColorToBGR(value); + } + } + + public Color FillColor + { + get + { + return fillColor; + } + set + { + fillColor = value; + base.Control.FillColor = Util.ColorToBGR(value); + } + } + + public int MaxValue + { + get + { + return maxValue; + } + set + { + maxValue = value; + base.Control.MaxValue = value; + } + } + + public string PostText + { + get + { + return postText; + } + set + { + postText = value; + base.Control.PostText = value; + } + } + + public string PreText + { + get + { + return preText; + } + set + { + preText = value; + base.Control.PreText = value; + } + } + + public Color TextColor + { + get + { + return textColor; + } + set + { + textColor = value; + base.Control.TextColor = Util.ColorToBGR(value); + } + } + + public int Value + { + get + { + return base.Control.Value; + } + set + { + base.Control.Value = value; + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing && evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + base.Dispose(disposing); + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PushButtonWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PushButtonWrapper.cs new file mode 100644 index 0000000..04861c6 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PushButtonWrapper.cs @@ -0,0 +1,228 @@ +using System; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class PushButtonWrapper : ControlWrapperBase +{ + private EventHandler evtClick; + + private EventHandler evtCancel; + + private EventHandler evtDestroy; + + private EventHandler evtHit; + + private EventHandler evtUnhit; + + public Color FaceColor + { + get + { + return Util.ColorFromBGR(base.Control.FaceColor); + } + set + { + base.Control.FaceColor = Util.ColorToBGR(value); + } + } + + public Color TextColor + { + get + { + return Util.ColorFromBGR(base.Control.TextColor); + } + set + { + base.Control.TextColor = Util.ColorToBGR(value); + } + } + + public string Text + { + get + { + return base.Control.Text; + } + set + { + base.Control.Text = value; + } + } + + public event EventHandler Click + { + add + { + if (evtClick == null) + { + base.Control.Accepted += ClickEvent; + } + evtClick = (EventHandler)Delegate.Combine(evtClick, value); + } + remove + { + evtClick = (EventHandler)Delegate.Remove(evtClick, value); + if (evtClick == null) + { + base.Control.Accepted -= ClickEvent; + } + } + } + + public event EventHandler Canceled + { + add + { + if (evtCancel == null) + { + base.Control.Canceled += CanceledEvent; + } + evtCancel = (EventHandler)Delegate.Combine(evtCancel, value); + } + remove + { + evtCancel = (EventHandler)Delegate.Remove(evtCancel, value); + if (evtCancel == null) + { + base.Control.Canceled -= CanceledEvent; + } + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + public event EventHandler Hit + { + add + { + if (evtHit == null) + { + base.Control.Hit += HitEvent; + } + evtHit = (EventHandler)Delegate.Combine(evtHit, value); + } + remove + { + evtHit = (EventHandler)Delegate.Remove(evtHit, value); + if (evtHit == null) + { + base.Control.Hit -= HitEvent; + } + } + } + + public event EventHandler Unhit + { + add + { + if (evtUnhit == null) + { + base.Control.Unhit += UnhitEvent; + } + evtUnhit = (EventHandler)Delegate.Combine(evtUnhit, value); + } + remove + { + evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, value); + if (evtUnhit == null) + { + base.Control.Unhit -= UnhitEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtClick != null) + { + evtClick = (EventHandler)Delegate.Remove(evtClick, evtClick); + base.Control.Accepted -= ClickEvent; + } + if (evtCancel != null) + { + evtCancel = (EventHandler)Delegate.Remove(evtCancel, evtCancel); + base.Control.Canceled -= CanceledEvent; + } + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + if (evtHit != null) + { + evtHit = (EventHandler)Delegate.Remove(evtHit, evtHit); + base.Control.Hit -= HitEvent; + } + if (evtUnhit != null) + { + evtUnhit = (EventHandler)Delegate.Remove(evtUnhit, evtUnhit); + base.Control.Unhit -= UnhitEvent; + } + } + base.Dispose(disposing); + } + + private void ClickEvent(int ID) + { + if (evtClick != null) + { + evtClick(this, new ControlEventArgs(ID)); + } + } + + private void UnhitEvent(int ID) + { + if (evtUnhit != null) + { + evtUnhit(this, new ControlEventArgs(ID)); + } + } + + private void HitEvent(int ID) + { + if (evtHit != null) + { + evtHit(this, new ControlEventArgs(ID)); + } + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } + + private void CanceledEvent(int ID) + { + if (evtCancel != null) + { + evtCancel(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ReleaseObjectEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ReleaseObjectEventArgs.cs new file mode 100644 index 0000000..ef9f8f9 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ReleaseObjectEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ReleaseObjectEventArgs : EventArgs +{ + private WorldObject mWO; + + public WorldObject Released => mWO; + + internal ReleaseObjectEventArgs(WorldObject releasedObject) + { + mWO = releasedObject; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/RenderServiceWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/RenderServiceWrapper.cs new file mode 100644 index 0000000..18bed14 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/RenderServiceWrapper.cs @@ -0,0 +1,132 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.InteropServices; +using Decal.Adapter.Support; +using Decal.Interop.Core; +using Decal.Interop.Inject; +using Decal.Interop.Render; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class RenderServiceWrapper : MarshalByRefObject, IDisposable +{ + private RenderService internalRender; + + private bool isDisposed; + + private EventHandler myDeviceLost; + + [EditorBrowsable(EditorBrowsableState.Never)] + public object UnsafeDevice => internalRender.Device; + + internal event EventHandler DeviceLost + { + add + { + myDeviceLost = (EventHandler)Delegate.Combine(myDeviceLost, value); + } + remove + { + myDeviceLost = (EventHandler)Delegate.Combine(myDeviceLost, value); + } + } + + internal RenderServiceWrapper(RenderService render) + { + internalRender = render; + internalRender.DeviceLost += internalRender_DeviceLost; + } + + ~RenderServiceWrapper() + { + Dispose(disposing: false); + } + + private void internalRender_DeviceLost() + { + if (myDeviceLost != null) + { + myDeviceLost(this, new EventArgs()); + } + } + + private void myHUD_Disposing(object sender, EventArgs e) + { + if (sender is Hud hud) + { + RemoveHud(hud); + hud.Disposing -= myHUD_Disposing; + } + } + + public Background CreateBackground(Rectangle region) + { + return UnsafeCreateBackground(Util.toTagRECT(region)); + } + + public Hud CreateHud(Rectangle region) + { + return UnsafeCreateHud(Util.toTagRECT(region)); + } + + public void RemoveHud(Hud hud) + { + if (hud == null) + { + throw new ArgumentNullException("hud"); + } + internalRender.RemoveHUD(hud.Underlying); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public Background UnsafeCreateBackground(tagRECT pRegion) + { + return new Background(internalRender.CreateBackground(ref pRegion)); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public Hud UnsafeCreateHud(tagRECT pRegion) + { + Hud hud = new Hud(internalRender.CreateHUD(ref pRegion)); + hud.Disposing += myHUD_Disposing; + return hud; + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public Background EncapsulateBackground(tagPOINT coordinates, object surface) + { + return new Background(internalRender.EncapsulateBackground(ref coordinates, surface)); + } + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public Hud EncapsulateHud(tagPOINT coordinates, object surface) + { + return new Hud(internalRender.EncapsulateHUD(ref coordinates, surface)); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed && disposing) + { + internalRender.DeviceLost -= internalRender_DeviceLost; + } + if (internalRender != null) + { + Marshal.ReleaseComObject(internalRender); + } + internalRender = null; + isDisposed = true; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ResetTradeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ResetTradeEventArgs.cs new file mode 100644 index 0000000..129f73b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ResetTradeEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class ResetTradeEventArgs : EventArgs +{ + private int mTraderId; + + public int TraderId => mTraderId; + + internal ResetTradeEventArgs(int TraderId) + { + mTraderId = TraderId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SettingsEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SettingsEventArgs.cs new file mode 100644 index 0000000..81b115c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SettingsEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class SettingsEventArgs : EventArgs +{ + private int mySetting; + + public int Setting => mySetting; + + internal SettingsEventArgs(int Setting) + { + mySetting = Setting; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillInfoWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillInfoWrapper.cs new file mode 100644 index 0000000..b292a03 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillInfoWrapper.cs @@ -0,0 +1,91 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class SkillInfoWrapper : MarshalByRefObject, IDisposable +{ + private SkillInfo mySkillInfo; + + private TrainingType myTraining; + + private bool isDisposed; + + public int Base => mySkillInfo.Base; + + public int Bonus => mySkillInfo.Bonus; + + public int Buffed => mySkillInfo.Buffed; + + public int Current => mySkillInfo.Current; + + public int XP => mySkillInfo.Exp; + + public string Formula => mySkillInfo.Formula; + + public int Increment => mySkillInfo.Increment; + + public bool Known => mySkillInfo.Known; + + public string Name => mySkillInfo.Name; + + public string ShortName => mySkillInfo.ShortName; + + public TrainingType Training => myTraining; + + internal SkillInfoWrapper(SkillInfo info) + { + mySkillInfo = info; + switch (info.Training) + { + case eTrainingType.eTrainUnusable: + myTraining = TrainingType.Unusable; + break; + case eTrainingType.eTrainUntrained: + myTraining = TrainingType.Untrained; + break; + case eTrainingType.eTrainTrained: + myTraining = TrainingType.Trained; + break; + case eTrainingType.eTrainSpecialized: + myTraining = TrainingType.Specialized; + break; + default: + myTraining = TrainingType.Unusable; + break; + } + } + + ~SkillInfoWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (mySkillInfo != null) + { + Marshal.ReleaseComObject(mySkillInfo); + } + isDisposed = true; + } + + protected void EnforceDisposedOnce() + { + if (isDisposed) + { + throw new ObjectDisposedException("SkillInfoWrapper"); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillType.cs new file mode 100644 index 0000000..820eeff --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SkillType.cs @@ -0,0 +1,86 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum SkillType +{ + CurrentMeleeDefense = 6, + CurrentMissileDefense = 7, + CurrentArcaneLore = 14, + CurrentMagicDefense = 15, + CurrentManaConversion = 16, + CurrentItemTinkering = 18, + CurrentAssessPerson = 19, + CurrentDeception = 20, + CurrentHealing = 21, + CurrentJump = 22, + CurrentLockpick = 23, + CurrentRun = 24, + CurrentAssessCreature = 27, + CurrentWeaponTinkering = 28, + CurrentArmorTinkering = 29, + CurrentMagicItemTinkering = 30, + CurrentCreatureEnchantment = 31, + CurrentItemEnchantment = 32, + CurrentLifeMagic = 33, + CurrentWarMagic = 34, + CurrentLeadership = 35, + CurrentLoyalty = 36, + CurrentFletchingSkill = 37, + CurrentAlchemySkill = 38, + CurrentCookingSkill = 39, + CurrentSkillSalvaging = 40, + CurrentTwoHandedCombat = 41, + CurrentGearcraft = 42, + CurrentVoidMagic = 43, + CurrentHeavyWeapons = 44, + CurrentLightWeapons = 45, + CurrentFinesseWeapons = 46, + CurrentMissileWeapons = 47, + CurrentShield = 48, + CurrentDualWield = 49, + CurrentRecklessness = 50, + CurrentSneakAttack = 51, + CurrentDirtyFighting = 52, + CurrentSummoning = 54, + BaseMeleeDefense = 56, + BaseMissileDefense = 57, + BaseArcaneLore = 64, + BaseMagicDefense = 65, + BaseManaConversion = 66, + BaseItemTinkering = 68, + BaseAssessPerson = 69, + BaseDeception = 70, + BaseHealing = 71, + BaseJump = 72, + BaseLockpick = 73, + BaseRun = 74, + BaseAssessCreature = 77, + BaseWeaponTinkering = 78, + BaseArmorTinkering = 79, + BaseMagicItemTinkering = 80, + BaseCreatureEnchantment = 81, + BaseItemEnchantment = 82, + BaseLifeMagic = 83, + BaseWarMagic = 84, + BaseLeadership = 85, + BaseLoyalty = 86, + BaseFletchingSkill = 87, + BaseAlchemySkill = 88, + BaseCookingSkill = 89, + BaseSkillSalvaging = 90, + BaseTwoHandedCombat = 91, + BaseGearcraft = 92, + BaseVoidMagic = 93, + BaseHeavyWeapons = 94, + BaseLightWeapons = 95, + BaseFinesseWeapons = 96, + BaseMissileWeapons = 97, + BaseShield = 98, + BaseDualWield = 99, + BaseRecklessness = 100, + BaseSneakAttack = 101, + BaseDirtyFighting = 102, + BaseSummoning = 104 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SliderWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SliderWrapper.cs new file mode 100644 index 0000000..1c48f30 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SliderWrapper.cs @@ -0,0 +1,151 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class SliderWrapper : ControlWrapperBase +{ + private EventHandler evtDestroy; + + private EventHandler evtChange; + + public int Maximum + { + get + { + return base.Control.Maximum; + } + set + { + base.Control.Maximum = value; + } + } + + public int Minimum + { + get + { + return base.Control.Minimum; + } + set + { + base.Control.Minimum = value; + } + } + + [Obsolete("Use Position")] + [Browsable(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public int SliderPostition + { + get + { + return base.Control.SliderPosition; + } + set + { + base.Control.SliderPosition = value; + } + } + + public int Position + { + get + { + return base.Control.SliderPosition; + } + set + { + base.Control.SliderPosition = value; + } + } + + public Color TextColor + { + get + { + return Util.ColorFromBGR(base.Control.TextColor); + } + set + { + base.Control.TextColor = Util.ColorToBGR(value); + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + public event EventHandler Change + { + add + { + if (evtChange == null) + { + base.Control.Change += ChangeEvent; + } + evtChange = (EventHandler)Delegate.Combine(evtChange, value); + } + remove + { + evtChange = (EventHandler)Delegate.Remove(evtChange, value); + if (evtChange == null) + { + base.Control.Change -= ChangeEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + if (evtChange != null) + { + evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); + base.Control.Change -= ChangeEvent; + } + } + base.Dispose(disposing); + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } + + private void ChangeEvent(int ID, int Index) + { + if (evtChange != null) + { + evtChange(this, new IndexChangeEventArgs(ID, Index)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellCastEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellCastEventArgs.cs new file mode 100644 index 0000000..69eb040 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellCastEventArgs.cs @@ -0,0 +1,35 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class SpellCastEventArgs : EventArgs +{ + private CastEventType mtype; + + private int mSpellId; + + private int mTargetId; + + public int SpellId => mSpellId; + + public int TargetId => mTargetId; + + public CastEventType EventType + { + get + { + return mtype; + } + set + { + mtype = value; + } + } + + internal SpellCastEventArgs(CastEventType type, int spellId, int targetId) + { + mtype = type; + mSpellId = spellId; + mTargetId = targetId; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellbookEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellbookEventArgs.cs new file mode 100644 index 0000000..25b9926 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/SpellbookEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class SpellbookEventArgs : EventArgs +{ + private AddRemoveEventType myType; + + private int mySpell; + + public AddRemoveEventType Type => myType; + + public int Spell => mySpell; + + internal SpellbookEventArgs(AddRemoveEventType type, int spell) + { + myType = type; + mySpell = spell; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StaticWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StaticWrapper.cs new file mode 100644 index 0000000..126df88 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StaticWrapper.cs @@ -0,0 +1,73 @@ +using System; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class StaticWrapper : ControlWrapperBase +{ + private EventHandler evtDestroy; + + public string Text + { + get + { + return base.Control.Text; + } + set + { + base.Control.Text = value; + } + } + + public Color TextColor + { + get + { + return Util.ColorFromBGR(base.Control.TextColor); + } + set + { + base.Control.TextColor = Util.ColorToBGR(value); + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing && evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + base.Dispose(disposing); + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StatusMessageEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StatusMessageEventArgs.cs new file mode 100644 index 0000000..b3cd119 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StatusMessageEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +public class StatusMessageEventArgs : EventArgs +{ + private int myType; + + private string myText; + + public int Type => myType; + + public string Text => myText; + + internal StatusMessageEventArgs(int Type, string Text) + { + myType = Type; + myText = Text; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StringValueKey.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StringValueKey.cs new file mode 100644 index 0000000..548e09e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/StringValueKey.cs @@ -0,0 +1,22 @@ +namespace Decal.Adapter.Wrappers; + +public enum StringValueKey +{ + SecondaryName = 184549376, + Name = 1, + Title = 5, + Inscription = 7, + InscribedBy = 8, + FellowshipName = 10, + UsageInstructions = 14, + SimpleDescription = 15, + FullDescription = 16, + MonarchName = 21, + OnlyActivatedBy = 25, + Patron = 35, + PortalDestination = 38, + LastTinkeredBy = 39, + ImbuedBy = 40, + DateBorn = 43, + MonarchyTitle = 47 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/TextBoxWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/TextBoxWrapper.cs new file mode 100644 index 0000000..9056799 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/TextBoxWrapper.cs @@ -0,0 +1,220 @@ +using System; +using System.Drawing; +using Decal.Adapter.Support; +using Decal.Interop.Controls; + +namespace Decal.Adapter.Wrappers; + +public class TextBoxWrapper : ControlWrapperBase +{ + private EventHandler evtDestroy; + + private EventHandler evtBegin; + + private EventHandler evtChange; + + private EventHandler evtEnd; + + public int Caret + { + get + { + return base.Control.Caret; + } + set + { + base.Control.Caret = value; + } + } + + public string SelectedText + { + get + { + return base.Control.SelectedText; + } + set + { + base.Control.SelectedText = value; + } + } + + public string Text + { + get + { + return base.Control.Text; + } + set + { + base.Control.Text = value; + } + } + + public Color TextColor + { + get + { + return Util.ColorFromBGR(base.Control.TextColor); + } + set + { + base.Control.TextColor = Util.ColorToBGR(value); + } + } + + public event EventHandler Destroy + { + add + { + if (evtDestroy == null) + { + base.Control.Destroy += DestroyEvent; + } + evtDestroy = (EventHandler)Delegate.Combine(evtDestroy, value); + } + remove + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, value); + if (evtDestroy == null) + { + base.Control.Destroy -= DestroyEvent; + } + } + } + + public event EventHandler Begin + { + add + { + if (evtBegin == null) + { + base.Control.Begin += BeginEvent; + } + evtBegin = (EventHandler)Delegate.Combine(evtBegin, value); + } + remove + { + evtBegin = (EventHandler)Delegate.Remove(evtBegin, value); + if (evtBegin == null) + { + base.Control.Begin -= BeginEvent; + } + } + } + + public event EventHandler Change + { + add + { + if (evtChange == null) + { + base.Control.Change += ChangeEvent; + } + evtChange = (EventHandler)Delegate.Combine(evtChange, value); + } + remove + { + evtChange = (EventHandler)Delegate.Remove(evtChange, value); + if (evtChange == null) + { + base.Control.Change -= ChangeEvent; + } + } + } + + public event EventHandler End + { + add + { + if (evtEnd == null) + { + base.Control.End += EndEvent; + } + evtEnd = (EventHandler)Delegate.Combine(evtEnd, value); + } + remove + { + evtEnd = (EventHandler)Delegate.Remove(evtEnd, value); + if (evtEnd == null) + { + base.Control.End -= EndEvent; + } + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (evtBegin != null) + { + evtBegin = (EventHandler)Delegate.Remove(evtBegin, evtBegin); + base.Control.Begin -= BeginEvent; + } + if (evtDestroy != null) + { + evtDestroy = (EventHandler)Delegate.Remove(evtDestroy, evtDestroy); + base.Control.Destroy -= DestroyEvent; + } + if (evtChange != null) + { + evtChange = (EventHandler)Delegate.Remove(evtChange, evtChange); + base.Control.Change -= ChangeEvent; + } + if (evtEnd != null) + { + evtEnd = (EventHandler)Delegate.Remove(evtEnd, evtEnd); + base.Control.End -= EndEvent; + } + } + base.Dispose(disposing); + } + + public void Capture() + { + base.Control.Capture(); + } + + public void Select(int start, int end) + { + base.Control.Select(start, end); + } + + public void SetMargins(int x, int y) + { + base.Control.SetMargins(x, y); + } + + private void DestroyEvent(int ID) + { + if (evtDestroy != null) + { + evtDestroy(this, new ControlEventArgs(ID)); + } + } + + private void BeginEvent(int ID) + { + if (evtBegin != null) + { + evtBegin(this, new ControlEventArgs(ID)); + } + } + + private void ChangeEvent(int ID, string text) + { + if (evtChange != null) + { + evtChange(this, new TextBoxChangeEventArgs(ID, text)); + } + } + + private void EndEvent(int ID, bool success) + { + if (evtEnd != null) + { + evtEnd(this, new TextBoxEndEventArgs(ID, success)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/TrainingType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/TrainingType.cs new file mode 100644 index 0000000..0cf9913 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/TrainingType.cs @@ -0,0 +1,12 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum TrainingType +{ + Unusable, + Untrained, + Trained, + Specialized +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/UIElementType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/UIElementType.cs new file mode 100644 index 0000000..16d0c2d --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/UIElementType.cs @@ -0,0 +1,23 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum UIElementType +{ + Smartbox = 268436634, + Chat = 268436993, + FloatChat1 = 268436741, + FloatChat2 = 268436750, + FloatChat3 = 268436751, + FloatChat4 = 268436752, + Examination = 268436983, + Vitals = 268436986, + EnvPack = 268436989, + Panels = 268436991, + TBar = 268436995, + Indicators = 268437009, + ProgressBar = 268437011, + Combat = 268437173, + Radar = 268437202 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector3Object.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector3Object.cs new file mode 100644 index 0000000..cba34a9 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector3Object.cs @@ -0,0 +1,74 @@ +namespace Decal.Adapter.Wrappers; + +public class Vector3Object +{ + private double mX; + + private double mY; + + private double mZ; + + public double X => mX; + + public double Y => mY; + + public double Z => mZ; + + public Vector3Object(double x, double y, double z) + { + mX = x; + mY = y; + mZ = z; + } + + public override string ToString() + { + return "{X = " + mX + ", Y = " + mY + ", Z = " + mZ + "}"; + } + + public override bool Equals(object obj) + { + if (obj is Vector3Object) + { + Vector3Object vector3Object = (Vector3Object)obj; + if (mX == vector3Object.mX && mY == vector3Object.mY) + { + return mZ == vector3Object.mZ; + } + return false; + } + return false; + } + + public bool Equals(Vector3Object obj) + { + if (obj == null) + { + return false; + } + if (mX == obj.mX && mY == obj.mY) + { + return mZ == obj.mZ; + } + return false; + } + + public override int GetHashCode() + { + return mX.GetHashCode() ^ mY.GetHashCode() ^ mZ.GetHashCode(); + } + + public static bool operator ==(Vector3Object a, Vector3Object b) + { + if (object.Equals(a, null)) + { + return object.Equals(b, null); + } + return a.Equals(b); + } + + public static bool operator !=(Vector3Object a, Vector3Object b) + { + return !(a == b); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector4Object.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector4Object.cs new file mode 100644 index 0000000..bcc2b67 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vector4Object.cs @@ -0,0 +1,79 @@ +namespace Decal.Adapter.Wrappers; + +public class Vector4Object +{ + private double mW; + + private double mX; + + private double mY; + + private double mZ; + + public double W => mW; + + public double X => mX; + + public double Y => mY; + + public double Z => mZ; + + public Vector4Object(double w, double x, double y, double z) + { + mW = w; + mX = x; + mY = y; + mZ = z; + } + + public override string ToString() + { + return "{W = " + mW + ", X = " + mX + ", Y = " + mY + ", Z = " + mZ + "}"; + } + + public override bool Equals(object obj) + { + if (obj is Vector4Object) + { + Vector4Object vector4Object = (Vector4Object)obj; + if (mW == vector4Object.mW && mX == vector4Object.mX && mY == vector4Object.mY) + { + return mZ == vector4Object.mZ; + } + return false; + } + return false; + } + + public bool Equals(Vector4Object obj) + { + if (obj == null) + { + return false; + } + if (mW == obj.mW && mX == obj.mX && mY == obj.mY) + { + return mZ == obj.mZ; + } + return false; + } + + public override int GetHashCode() + { + return mW.GetHashCode() ^ mX.GetHashCode() ^ mY.GetHashCode() ^ mZ.GetHashCode(); + } + + public static bool operator ==(Vector4Object a, Vector4Object b) + { + if (object.Equals(a, null)) + { + return object.Equals(b, null); + } + return a.Equals(b); + } + + public static bool operator !=(Vector4Object a, Vector4Object b) + { + return !(a == b); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vendor.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vendor.cs new file mode 100644 index 0000000..21605eb --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/Vendor.cs @@ -0,0 +1,209 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class Vendor : GenericDisposableWrapper, IEnumerable, IEnumerable +{ + public class VendorEnumerator : IEnumerator, IDisposable, IEnumerator + { + private Vendor vendor; + + private WorldObject current; + + public WorldObject Current + { + get + { + if (current == null) + { + MoveNext(); + } + return current; + } + } + + object IEnumerator.Current + { + get + { + if (current == null) + { + MoveNext(); + } + return current; + } + } + + internal VendorEnumerator(Vendor vendor) + { + this.vendor = vendor; + } + + ~VendorEnumerator() + { + Dispose(userCalled: false); + } + + public void Dispose() + { + Dispose(userCalled: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool userCalled) + { + if (vendor != null) + { + Reset(); + vendor = null; + } + } + + public bool MoveNext() + { + Decal.Interop.Filters.WorldObject ppObject = null; + bool num = vendor.Wrapped.Next(ref ppObject); + if (num && ppObject != null) + { + current = vendor.GetCachedObject(ppObject); + } + return num; + } + + public void Reset() + { + vendor.Wrapped.Reset(); + } + } + + private WorldFilter wf; + + private DisposableObjectDictionary objectCache; + + private IEnumerator oldstyleenumerator; + + public int MerchantId => base.Wrapped.MerchantID; + + public int MaxValue => base.Wrapped.BuyValue; + + public float SellRate => base.Wrapped.SellRate; + + public float BuyRate => base.Wrapped.BuyRate; + + public int Categories => base.Wrapped.BuyCategories; + + public int Count => base.Wrapped.Count; + + public int Quantity => base.Wrapped.Quantity; + + public WorldObject First + { + get + { + using IEnumerator enumerator = GetEnumerator(); + return enumerator.Current; + } + } + + [Obsolete("Use enumerators")] + [EditorBrowsable(EditorBrowsableState.Never)] + public WorldObject Current + { + get + { + if (oldstyleenumerator == null) + { + oldstyleenumerator = GetEnumerator(); + } + return oldstyleenumerator.Current; + } + } + + public WorldObject this[int id] + { + get + { + WorldObject value = null; + if (!objectCache.TryGetValue(id, out value)) + { + Decal.Interop.Filters.WorldObject byID = base.Wrapped.GetByID(id); + if (byID != null) + { + value = new WorldObject(byID); + objectCache.Add(value.Id, value); + } + } + return value; + } + } + + public Vendor(WorldFilter wf, Decal.Interop.Filters.Vendor obj) + : base(obj) + { + this.wf = wf; + objectCache = new DisposableObjectDictionary("Id"); + } + + protected override void Dispose(bool userCalled) + { + if (oldstyleenumerator != null) + { + oldstyleenumerator.Dispose(); + oldstyleenumerator = null; + } + objectCache.Clear(); + base.Dispose(userCalled); + } + + internal WorldObject GetCachedObject(Decal.Interop.Filters.WorldObject iwo) + { + WorldObject value = null; + if (!objectCache.TryGetValue(iwo.GUID, out value)) + { + value = new WorldObject(iwo); + objectCache.Add(value.Id, value); + } + return value; + } + + public void SetFilter(WorldObjectCollectionFilter filter) + { + filter?.ApplyFilter(base.Wrapped); + } + + [Obsolete("Use enumerators")] + [EditorBrowsable(EditorBrowsableState.Never)] + public bool MoveNext() + { + if (oldstyleenumerator == null) + { + oldstyleenumerator = GetEnumerator(); + } + return oldstyleenumerator.MoveNext(); + } + + [Obsolete("Use enumerators")] + [EditorBrowsable(EditorBrowsableState.Never)] + public void Reset() + { + if (oldstyleenumerator == null) + { + oldstyleenumerator = GetEnumerator(); + } + oldstyleenumerator.Reset(); + } + + public IEnumerator GetEnumerator() + { + return new VendorEnumerator(this); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return new VendorEnumerator(this); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewControls.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewControls.cs new file mode 100644 index 0000000..58965a4 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewControls.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using Decal.Interop.Inject; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class ViewControls : MarshalByRefObject, IDisposable +{ + private ViewWrapper myParent; + + private Dictionary myControls; + + private bool isDisposed; + + [CLSCompliant(false)] + public IControlWrapper this[string controlName] + { + get + { + if (myControls.ContainsKey(controlName)) + { + return myControls[controlName]; + } + IControlWrapper controlWrapper = ControlRegistry.CreateInstance(myParent[controlName]); + myControls.Add(controlName, controlWrapper); + return controlWrapper; + } + set + { + if (value == null) + { + throw new ArgumentNullException("value"); + } + myControls[controlName] = value; + myParent[controlName] = value.Underlying as IControl; + } + } + + internal ViewControls(ViewWrapper parent) + { + myParent = parent; + myControls = new Dictionary(); + } + + ~ViewControls() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!isDisposed && disposing && myParent != null) + { + foreach (IControlWrapper value in myControls.Values) + { + if (value is IDisposable disposable) + { + disposable.Dispose(); + } + } + myParent = null; + } + isDisposed = true; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewWrapper.cs new file mode 100644 index 0000000..2bd12b1 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/ViewWrapper.cs @@ -0,0 +1,266 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Decal.Adapter.Support; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public class ViewWrapper : MarshalByRefObject, IDisposable +{ + private View myView; + + private ViewControls myControls; + + private bool isDisposed; + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public View Underlying => myView; + + public bool Activated + { + get + { + return myView.Activated; + } + set + { + myView.Activated = value; + } + } + + public int Alpha + { + get + { + return myView.Alpha; + } + set + { + myView.Alpha = value; + } + } + + public string Title + { + get + { + return myView.Title; + } + set + { + myView.Title = value; + } + } + + public bool Transparent + { + get + { + return myView.Transparent; + } + set + { + myView.Transparent = value; + } + } + + [CLSCompliant(false)] + public IControl this[string controlName] + { + get + { + return ((dynamic)(IView)myView).get_Control(controlName); + } + set + { + ((dynamic)(IView)myView).set_Control(controlName, value); + } + } + + public ViewControls Controls => myControls; + + public Rectangle Position + { + get + { + return Util.toRectangle(myView.Position); + } + set + { + tagRECT pVal = Util.toTagRECT(value); + myView.Position = pVal; + } + } + + internal ViewWrapper(View vw) + { + myView = vw; + myControls = new ViewControls(this); + } + + ~ViewWrapper() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!isDisposed) + { + } + if (myView != null) + { + myControls.Dispose(); + Marshal.ReleaseComObject(myView); + myView = null; + } + isDisposed = true; + } + + public void Activate() + { + myView.Activate(); + } + + public void Alert() + { + myView.Alert(); + } + + public void Deactivate() + { + myView.Deactivate(); + } + + [CLSCompliant(false)] + public int LoadControl(Layer parent, int id, object xmlSource) + { + return myView.LoadControl(parent, id, xmlSource); + } + + public void LoadSchema(string xmlSchema) + { + myView.LoadSchema(xmlSchema); + } + + public void SetIcon(int icon, object iconLibrary) + { + myView.SetIcon(icon, iconLibrary); + } + + internal static bool ScanViews(IViewHandler handler) + { + Type type = handler.GetType(); + bool result = false; + object[] customAttributes = type.GetCustomAttributes(typeof(ViewAttribute), inherit: false); + foreach (object obj in customAttributes) + { + try + { + ViewAttribute viewAttribute = (ViewAttribute)obj; + handler.LoadView(viewAttribute.ViewName, viewAttribute.Resource); + result = true; + } + catch (Exception ex) + { + Util.WriteLine("ScanViews Exception: " + ex.Message); + } + } + return result; + } + + internal static void ScanControls(IViewHandler handler) + { + MethodInfo[] methods = handler.GetType().GetMethods(handler.BindingFlags); + foreach (MethodInfo methodInfo in methods) + { + object[] customAttributes = methodInfo.GetCustomAttributes(typeof(ControlEventAttribute), inherit: false); + foreach (object obj in customAttributes) + { + try + { + ControlEventAttribute controlEventAttribute = (ControlEventAttribute)obj; + IControlWrapper controlWrapper = handler.GetView(controlEventAttribute.ViewName).Controls[controlEventAttribute.Control]; + EventInfo eventInfo = controlWrapper.GetType().GetEvent(controlEventAttribute.EventName); + eventInfo.AddEventHandler(controlWrapper, Delegate.CreateDelegate(eventInfo.EventHandlerType, handler, methodInfo.Name)); + } + catch (Exception ex) + { + Util.WriteLine("ScanControls Exception: " + ex.Message); + } + } + } + } + + internal static void ScanReferences(IViewHandler handler) + { + Type type = handler.GetType(); + Type typeFromHandle = typeof(AccessedThroughPropertyAttribute); + Type typeFromHandle2 = typeof(ControlReferenceAttribute); + Type typeFromHandle3 = typeof(ControlReferenceArrayAttribute); + FieldInfo[] fields = type.GetFields(handler.BindingFlags); + foreach (FieldInfo fieldInfo in fields) + { + try + { + IControlWrapper controlWrapper = null; + if (!fieldInfo.FieldType.IsArray && Attribute.IsDefined(fieldInfo, typeFromHandle2)) + { + ControlReferenceAttribute controlReferenceAttribute = (ControlReferenceAttribute)Attribute.GetCustomAttribute(fieldInfo, typeFromHandle2); + controlWrapper = handler.GetView(controlReferenceAttribute.ViewName).Controls[controlReferenceAttribute.Control]; + if (!(controlWrapper.GetType() != fieldInfo.FieldType)) + { + object value = Convert.ChangeType(controlWrapper, fieldInfo.FieldType); + if (Attribute.IsDefined(fieldInfo, typeFromHandle)) + { + AccessedThroughPropertyAttribute accessedThroughPropertyAttribute = (AccessedThroughPropertyAttribute)Attribute.GetCustomAttribute(fieldInfo, typeFromHandle); + type.GetProperty(accessedThroughPropertyAttribute.PropertyName, handler.BindingFlags).SetValue(handler, value, null); + } + else + { + fieldInfo.SetValue(handler, value); + } + } + } + else + { + if (!Attribute.IsDefined(fieldInfo, typeFromHandle3)) + { + continue; + } + ControlReferenceArrayAttribute controlReferenceArrayAttribute = (ControlReferenceArrayAttribute)Attribute.GetCustomAttribute(fieldInfo, typeFromHandle3); + ViewWrapper view = handler.GetView(controlReferenceArrayAttribute.ViewName); + Type elementType = fieldInfo.FieldType.GetElementType(); + Array array = Array.CreateInstance(elementType, controlReferenceArrayAttribute.Controls.Count); + for (int j = 0; j < controlReferenceArrayAttribute.Controls.Count; j++) + { + controlWrapper = view.Controls[controlReferenceArrayAttribute.Controls[j]]; + if (elementType.IsAssignableFrom(controlWrapper.GetType())) + { + array.SetValue(controlWrapper, j); + } + } + fieldInfo.SetValue(handler, array); + continue; + } + } + catch (Exception ex) + { + Util.WriteLine("ScanReferences Exception: " + ex.Message); + } + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/VitalType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/VitalType.cs new file mode 100644 index 0000000..e80b5ff --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/VitalType.cs @@ -0,0 +1,17 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[CLSCompliant(true)] +public enum VitalType +{ + MaximumHealth = 1, + CurrentHealth, + MaximumStamina, + CurrentStamina, + MaximumMana, + CurrentMana, + BaseHealth, + BaseStamina, + BaseMana +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldChangeType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldChangeType.cs new file mode 100644 index 0000000..0af486d --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldChangeType.cs @@ -0,0 +1,10 @@ +namespace Decal.Adapter.Wrappers; + +public enum WorldChangeType +{ + SizeChange, + StorageChange, + IdentReceived, + VendorIdentReceived, + ManaChange +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldFilter.cs new file mode 100644 index 0000000..ce55e11 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldFilter.cs @@ -0,0 +1,473 @@ +using System; +using Decal.Adapter.Support; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class WorldFilter : GenericDisposableWrapper +{ + private DisposableObjectDictionary worldObjectCache; + + private EventHandler mAcceptTrade; + + private EventHandler mAddTradeItem; + + private EventHandler mApproachVendor; + + private EventHandler mChangeObject; + + private EventHandler mCreateObject; + + private EventHandler mDeclineTrade; + + private EventHandler mEndTrade; + + private EventHandler mEnterTrade; + + private EventHandler mFailToAddTradeItem; + + private EventHandler mFailToCompleteTrade; + + private EventHandler mMoveObject; + + private EventHandler mReleaseDone; + + private EventHandler mReleaseObject; + + private EventHandler mResetTrade; + + public WorldObject this[int guid] => GetCachedWorldObject(guid); + + public Vendor OpenVendor + { + get + { + Decal.Interop.Filters.Vendor vendor = base.Wrapped.Vendor; + if (vendor != null) + { + return new Vendor(this, vendor); + } + return null; + } + } + + [CLSCompliant(false)] + public event EventHandler AcceptTrade + { + add + { + mAcceptTrade = (EventHandler)Delegate.Combine(mAcceptTrade, value); + } + remove + { + mAcceptTrade = (EventHandler)Delegate.Remove(mAcceptTrade, value); + } + } + + [CLSCompliant(false)] + public event EventHandler AddTradeItem + { + add + { + mAddTradeItem = (EventHandler)Delegate.Combine(mAddTradeItem, value); + } + remove + { + mAddTradeItem = (EventHandler)Delegate.Remove(mAddTradeItem, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ApproachVendor + { + add + { + mApproachVendor = (EventHandler)Delegate.Combine(mApproachVendor, value); + } + remove + { + mApproachVendor = (EventHandler)Delegate.Remove(mApproachVendor, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChangeObject + { + add + { + mChangeObject = (EventHandler)Delegate.Combine(mChangeObject, value); + } + remove + { + mChangeObject = (EventHandler)Delegate.Remove(mChangeObject, value); + } + } + + [CLSCompliant(false)] + public event EventHandler CreateObject + { + add + { + mCreateObject = (EventHandler)Delegate.Combine(mCreateObject, value); + } + remove + { + mCreateObject = (EventHandler)Delegate.Remove(mCreateObject, value); + } + } + + [CLSCompliant(false)] + public event EventHandler DeclineTrade + { + add + { + mDeclineTrade = (EventHandler)Delegate.Combine(mDeclineTrade, value); + } + remove + { + mDeclineTrade = (EventHandler)Delegate.Remove(mDeclineTrade, value); + } + } + + [CLSCompliant(false)] + public event EventHandler EndTrade + { + add + { + mEndTrade = (EventHandler)Delegate.Combine(mEndTrade, value); + } + remove + { + mEndTrade = (EventHandler)Delegate.Remove(mEndTrade, value); + } + } + + [CLSCompliant(false)] + public event EventHandler EnterTrade + { + add + { + mEnterTrade = (EventHandler)Delegate.Combine(mEnterTrade, value); + } + remove + { + mEnterTrade = (EventHandler)Delegate.Remove(mEnterTrade, value); + } + } + + [CLSCompliant(false)] + public event EventHandler FailToAddTradeItem + { + add + { + mFailToAddTradeItem = (EventHandler)Delegate.Combine(mFailToAddTradeItem, value); + } + remove + { + mFailToAddTradeItem = (EventHandler)Delegate.Remove(mFailToAddTradeItem, value); + } + } + + [CLSCompliant(false)] + public event EventHandler FailToCompleteTrade + { + add + { + mFailToCompleteTrade = (EventHandler)Delegate.Combine(mFailToCompleteTrade, value); + } + remove + { + mFailToCompleteTrade = (EventHandler)Delegate.Remove(mFailToCompleteTrade, value); + } + } + + [CLSCompliant(false)] + public event EventHandler MoveObject + { + add + { + mMoveObject = (EventHandler)Delegate.Combine(mMoveObject, value); + } + remove + { + mMoveObject = (EventHandler)Delegate.Remove(mMoveObject, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ReleaseDone + { + add + { + mReleaseDone = (EventHandler)Delegate.Combine(mReleaseDone, value); + } + remove + { + mReleaseDone = (EventHandler)Delegate.Remove(mReleaseDone, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ReleaseObject + { + add + { + mReleaseObject = (EventHandler)Delegate.Combine(mReleaseObject, value); + } + remove + { + mReleaseObject = (EventHandler)Delegate.Remove(mReleaseObject, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ResetTrade + { + add + { + mResetTrade = (EventHandler)Delegate.Combine(mResetTrade, value); + } + remove + { + mResetTrade = (EventHandler)Delegate.Remove(mResetTrade, value); + } + } + + public WorldFilter(World obj) + : base(obj) + { + worldObjectCache = new DisposableObjectDictionary("Id"); + base.Wrapped.AcceptTrade += myWF_AcceptTrade; + base.Wrapped.AddTradeItem += myWF_AddTradeItem; + base.Wrapped.ApproachVendor += myWF_ApproachVendor; + base.Wrapped.ChangeObject += myWF_ChangeObject; + base.Wrapped.CreateObject += myWF_CreateObject; + base.Wrapped.DeclineTrade += myWF_DeclineTrade; + base.Wrapped.EndTrade += myWF_EndTrade; + base.Wrapped.EnterTrade += myWF_EnterTrade; + base.Wrapped.FailToAddTradeItem += myWF_FailToAddTradeItem; + base.Wrapped.FailToCompleteTrade += myWF_FailToCompleteTrade; + base.Wrapped.MoveObject += myWF_MoveObject; + base.Wrapped.ReleaseDone += myWF_ReleaseDone; + base.Wrapped.ReleaseObject += myWF_ReleaseObject; + base.Wrapped.ResetTrade += myWF_ResetTrade; + CoreManager.Current.PluginTermComplete += corePluginTermComplete; + } + + protected override void Dispose(bool userCalled) + { + if (userCalled && base.Wrapped != null) + { + ClearCache(); + base.Wrapped.AcceptTrade -= myWF_AcceptTrade; + base.Wrapped.AddTradeItem -= myWF_AddTradeItem; + base.Wrapped.ApproachVendor -= myWF_ApproachVendor; + base.Wrapped.ChangeObject -= myWF_ChangeObject; + base.Wrapped.CreateObject -= myWF_CreateObject; + base.Wrapped.DeclineTrade -= myWF_DeclineTrade; + base.Wrapped.EndTrade -= myWF_EndTrade; + base.Wrapped.EnterTrade -= myWF_EnterTrade; + base.Wrapped.FailToAddTradeItem -= myWF_FailToAddTradeItem; + base.Wrapped.FailToCompleteTrade -= myWF_FailToCompleteTrade; + base.Wrapped.MoveObject -= myWF_MoveObject; + base.Wrapped.ReleaseDone -= myWF_ReleaseDone; + base.Wrapped.ReleaseObject -= myWF_ReleaseObject; + base.Wrapped.ResetTrade -= myWF_ResetTrade; + CoreManager.Current.PluginTermComplete -= corePluginTermComplete; + worldObjectCache.Dispose(); + } + base.Dispose(userCalled); + } + + private void ClearCache() + { + worldObjectCache.Clear(); + } + + private void corePluginTermComplete(object sender, EventArgs e) + { + ClearCache(); + } + + private void myWF_AcceptTrade(int TargetID) + { + Util.SafeFireEvent(this, mAcceptTrade, new AcceptTradeEventArgs(TargetID)); + } + + private void myWF_AddTradeItem(int ItemId, int SideId) + { + Util.SafeFireEvent(this, mAddTradeItem, new AddTradeItemEventArgs(ItemId, SideId)); + } + + private void myWF_ApproachVendor(int MerchantId) + { + Vendor openVendor = OpenVendor; + Util.SafeFireEvent(this, mApproachVendor, new ApproachVendorEventArgs(MerchantId, openVendor)); + openVendor.Dispose(); + } + + private void myWF_ChangeObject(Decal.Interop.Filters.WorldObject pObject, Decal.Interop.Filters.WorldChangeType Change) + { + WorldObject worldObject = null; + if (Change != Decal.Interop.Filters.WorldChangeType.wevtVendorIdentReceived) + { + worldObject = GetCachedWorldObject(pObject); + Util.SafeFireEvent(this, mChangeObject, new ChangeObjectEventArgs(worldObject, Change)); + return; + } + using Vendor vendor = OpenVendor; + worldObject = vendor.GetCachedObject(pObject); + Util.SafeFireEvent(this, mChangeObject, new ChangeObjectEventArgs(worldObject, Change)); + } + + private void myWF_CreateObject(Decal.Interop.Filters.WorldObject pObject) + { + WorldObject cachedWorldObject = GetCachedWorldObject(pObject); + Util.SafeFireEvent(this, mCreateObject, new CreateObjectEventArgs(cachedWorldObject)); + } + + private void myWF_DeclineTrade(int TraderId) + { + Util.SafeFireEvent(this, mDeclineTrade, new DeclineTradeEventArgs(TraderId)); + } + + private void myWF_EndTrade(int ReasonId) + { + Util.SafeFireEvent(this, mEndTrade, new EndTradeEventArgs(ReasonId)); + } + + private void myWF_EnterTrade(int TraderId, int TradeeId) + { + Util.SafeFireEvent(this, mEnterTrade, new EnterTradeEventArgs(TraderId, TradeeId)); + } + + private void myWF_FailToAddTradeItem(int ItemId, int ReasonId) + { + Util.SafeFireEvent(this, mFailToAddTradeItem, new FailToAddTradeItemEventArgs(ItemId, ReasonId)); + } + + private void myWF_FailToCompleteTrade() + { + Util.SafeFireEvent(this, mFailToCompleteTrade, new EventArgs()); + } + + private void myWF_MoveObject(Decal.Interop.Filters.WorldObject pObject) + { + WorldObject cachedWorldObject = GetCachedWorldObject(pObject); + Util.SafeFireEvent(this, mMoveObject, new MoveObjectEventArgs(cachedWorldObject)); + } + + private void myWF_ReleaseDone() + { + Util.SafeFireEvent(this, mReleaseDone, new EventArgs()); + } + + private void myWF_ReleaseObject(Decal.Interop.Filters.WorldObject pObject) + { + if (pObject != null) + { + WorldObject cachedWorldObject = GetCachedWorldObject(pObject); + Util.SafeFireEvent(this, mReleaseObject, new ReleaseObjectEventArgs(cachedWorldObject)); + cachedWorldObject.Dispose(); + } + } + + private void myWF_ResetTrade(int TraderId) + { + Util.SafeFireEvent(this, mResetTrade, new ResetTradeEventArgs(TraderId)); + } + + internal WorldObject GetCachedWorldObject(Decal.Interop.Filters.WorldObject iwo) + { + WorldObject value = null; + if (!worldObjectCache.TryGetValue(iwo.GUID, out value)) + { + value = new WorldObject(iwo); + worldObjectCache.Add(value.Id, value); + } + return value; + } + + internal WorldObject GetCachedWorldObject(int id) + { + WorldObject value = null; + if (!worldObjectCache.TryGetValue(id, out value)) + { + Decal.Interop.Filters.WorldObject worldObject = base.Wrapped[id]; + if (worldObject != null) + { + value = new WorldObject(worldObject); + worldObjectCache.Add(value.Id, value); + } + } + return value; + } + + public double Distance(int id1, int id2) + { + return Distance(id1, id2, use3d: false); + } + + public double Distance(int id1, int id2, bool use3d) + { + if (use3d) + { + return base.Wrapped.Distance3D(id1, id2); + } + return base.Wrapped.Distance2D(id1, id2); + } + + private WorldObjectCollection wrapIterator(WorldIterator wi) + { + if (wi != null) + { + return new WorldObjectCollection(this, wi); + } + return null; + } + + public WorldObjectCollection GetInventory() + { + return wrapIterator(base.Wrapped.Inventory); + } + + public WorldObjectCollection GetAll() + { + return wrapIterator(base.Wrapped.All); + } + + public WorldObjectCollection GetLandscape() + { + return wrapIterator(base.Wrapped.Landscape); + } + + public WorldObjectCollection GetByContainer(int container) + { + return wrapIterator(((dynamic)(IWorld)base.Wrapped).get_ByContainer(container)); + } + + public WorldObjectCollection GetByCategory(int category) + { + return wrapIterator(((dynamic)(IWorld)base.Wrapped).get_ByCategory(category)); + } + + public WorldObjectCollection GetByName(string name) + { + return wrapIterator(((dynamic)(IWorld)base.Wrapped).get_ByName(name)); + } + + public WorldObjectCollection GetByNameSubstring(string name) + { + return wrapIterator(((dynamic)(IWorld)base.Wrapped).get_ByNameSubstring(name)); + } + + public WorldObjectCollection GetByObjectClass(ObjectClass objClass) + { + return wrapIterator(((dynamic)(IWorld)base.Wrapped).get_ByObjectClass((eObjectClass)objClass)); + } + + public WorldObjectCollection GetByOwner(int owner) + { + return wrapIterator(((dynamic)(IWorld)base.Wrapped).get_ByOwner(owner)); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObject.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObject.cs new file mode 100644 index 0000000..ed52dfd --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObject.cs @@ -0,0 +1,263 @@ +using System.Collections.Generic; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class WorldObject : GenericDisposableWrapper +{ + public int ActiveSpellCount => Values(LongValueKey.ActiveSpellCount); + + public int SpellCount => Values(LongValueKey.SpellCount); + + public int Behavior => base.Wrapped.Behavior; + + public int Category => base.Wrapped.Category; + + public int Container => base.Wrapped.Container; + + public int GameDataFlags1 => base.Wrapped.GameDataFlags1; + + public int Id => base.Wrapped.GUID; + + public bool HasIdData => base.Wrapped.HasIdData; + + public int Icon => base.Wrapped.Icon; + + public int LastIdTime => base.Wrapped.LastIdTime; + + public string Name => base.Wrapped.Name; + + public ObjectClass ObjectClass => (ObjectClass)base.Wrapped.ObjectClass; + + public int PhysicsDataFlags => base.Wrapped.PhysicsDataFlags; + + public int Type => base.Wrapped.Type; + + public List BoolKeys + { + get + { + List list = new List(); + int num = 0; + for (int num2 = base.Wrapped.EnumBoolKey(0); num2 != -1; num2 = base.Wrapped.EnumBoolKey(num)) + { + list.Add(num2); + num++; + } + if (base.Wrapped.Bools((Decal.Interop.Filters.BoolValueKey)(-1))) + { + list.Add(-1); + } + return list; + } + } + + public List LongKeys + { + get + { + List list = new List(); + int num = 0; + for (int num2 = base.Wrapped.EnumLongKey(0); num2 != -1; num2 = base.Wrapped.EnumLongKey(num)) + { + list.Add(num2); + num++; + } + if (base.Wrapped.Longs((Decal.Interop.Filters.LongValueKey)(-1), -1) != -1) + { + list.Add(-1); + } + return list; + } + } + + public List DoubleKeys + { + get + { + List list = new List(); + int num = 0; + for (int num2 = base.Wrapped.EnumDoubleKey(0); num2 != -1; num2 = base.Wrapped.EnumDoubleKey(num)) + { + list.Add(num2); + num++; + } + if (base.Wrapped.Doubles((Decal.Interop.Filters.DoubleValueKey)(-1), -1.0) != -1.0) + { + list.Add(-1); + } + return list; + } + } + + public List StringKeys + { + get + { + List list = new List(); + int num = 0; + for (int num2 = base.Wrapped.EnumStringKey(0); num2 != -1; num2 = base.Wrapped.EnumStringKey(num)) + { + list.Add(num2); + num++; + } + if (!base.Wrapped.Strings((Decal.Interop.Filters.StringValueKey)(-1), "-1").Equals("-1")) + { + list.Add(-1); + } + return list; + } + } + + public WorldObject(Decal.Interop.Filters.WorldObject obj) + : base(obj) + { + } + + public int ActiveSpell(int index) + { + return base.Wrapped.ActiveSpell(index); + } + + public bool Exists(BoolValueKey index) + { + bool pValue; + return base.Wrapped.BoolExists((Decal.Interop.Filters.BoolValueKey)index, out pValue); + } + + public bool Exists(DoubleValueKey index) + { + double pValue; + return base.Wrapped.DoubleExists((Decal.Interop.Filters.DoubleValueKey)index, out pValue); + } + + public bool Exists(LongValueKey index) + { + int pValue; + return base.Wrapped.LongExists((Decal.Interop.Filters.LongValueKey)index, out pValue); + } + + public bool Exists(StringValueKey index) + { + string pValue; + return base.Wrapped.StringExists((Decal.Interop.Filters.StringValueKey)index, out pValue); + } + + public bool Exists(BoolValueKey index, out bool pValue) + { + return base.Wrapped.BoolExists((Decal.Interop.Filters.BoolValueKey)index, out pValue); + } + + public bool Exists(DoubleValueKey index, out double pValue) + { + return base.Wrapped.DoubleExists((Decal.Interop.Filters.DoubleValueKey)index, out pValue); + } + + public bool Exists(LongValueKey index, out int pValue) + { + return base.Wrapped.LongExists((Decal.Interop.Filters.LongValueKey)index, out pValue); + } + + public bool Exists(StringValueKey index, out string pValue) + { + return base.Wrapped.StringExists((Decal.Interop.Filters.StringValueKey)index, out pValue); + } + + public bool Values(BoolValueKey index) + { + return Values(index, defaultValue: false); + } + + public double Values(DoubleValueKey index) + { + return Values(index, 0.0); + } + + public int Values(LongValueKey index) + { + return index switch + { + LongValueKey.Slot => Values(index, -1), + LongValueKey.SlotLegacy => Values(index, 0), + _ => Values(index, 0), + }; + } + + public string Values(StringValueKey index) + { + return Values(index, string.Empty); + } + + public bool Values(BoolValueKey index, bool defaultValue) + { + return base.Wrapped.Bools((Decal.Interop.Filters.BoolValueKey)index, defaultValue); + } + + public double Values(DoubleValueKey index, double defaultValue) + { + return base.Wrapped.Doubles((Decal.Interop.Filters.DoubleValueKey)index, defaultValue); + } + + public int Values(LongValueKey index, int defaultValue) + { + return base.Wrapped.Longs((Decal.Interop.Filters.LongValueKey)index, defaultValue); + } + + public string Values(StringValueKey index, string defaultValue) + { + return base.Wrapped.Strings((Decal.Interop.Filters.StringValueKey)index, defaultValue); + } + + public CoordsObject Coordinates() + { + double NorthSouth = 0.0; + double EastWest = 0.0; + if (base.Wrapped.Coordinates(ref NorthSouth, ref EastWest)) + { + return new CoordsObject(NorthSouth, EastWest); + } + return null; + } + + public Vector3Object Offset() + { + double x = 0.0; + double y = 0.0; + double z = 0.0; + if (base.Wrapped.Offset(out x, out y, out z)) + { + return new Vector3Object(x, y, z); + } + return null; + } + + public Vector4Object Orientation() + { + double w = 0.0; + double x = 0.0; + double y = 0.0; + double z = 0.0; + if (base.Wrapped.Orientation(out w, out x, out y, out z)) + { + return new Vector4Object(w, x, y, z); + } + return null; + } + + public Vector3Object RawCoordinates() + { + double pX = 0.0; + double pY = 0.0; + double pZ = 0.0; + if (base.Wrapped.RawCoordinates(ref pX, ref pY, ref pZ)) + { + return new Vector3Object(pX, pY, pZ); + } + return null; + } + + public int Spell(int index) + { + return base.Wrapped.Spell(index); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollection.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollection.cs new file mode 100644 index 0000000..1b96db9 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollection.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public class WorldObjectCollection : GenericDisposableWrapper, IEnumerable, IEnumerable +{ + public class Iterator : IEnumerator, IDisposable, IEnumerator + { + private WorldObjectCollection collection; + + private WorldObject current; + + public WorldObject Current + { + get + { + if (current == null) + { + MoveNext(); + } + return current; + } + } + + object IEnumerator.Current + { + get + { + if (current == null) + { + MoveNext(); + } + return current; + } + } + + internal Iterator(WorldObjectCollection collection) + { + this.collection = collection; + Reset(); + } + + public void Dispose() + { + collection = null; + } + + public bool MoveNext() + { + Decal.Interop.Filters.WorldObject ppObject = null; + bool num = collection.Wrapped.Next(ref ppObject); + if (num && ppObject != null) + { + current = collection.wf.GetCachedWorldObject(ppObject); + } + return num; + } + + public void Reset() + { + collection.Wrapped.Reset(); + } + } + + private WorldObject current; + + private WorldFilter wf; + + private IEnumerator myEnum; + + public int Count => base.Wrapped.Count; + + public int Quantity => base.Wrapped.Quantity; + + public WorldObject First + { + get + { + using IEnumerator enumerator = GetEnumerator(); + return enumerator.Current; + } + } + + [Obsolete("Use Enumerators")] + [EditorBrowsable(EditorBrowsableState.Never)] + public WorldObject Current + { + get + { + if (myEnum == null) + { + myEnum = GetEnumerator(); + } + return myEnum.Current; + } + } + + internal WorldObjectCollection(WorldFilter wf, WorldIterator obj) + : base(obj) + { + this.wf = wf; + } + + public void SetFilter(WorldObjectCollectionFilter filter) + { + filter?.ApplyFilter(base.Wrapped); + } + + protected override void Dispose(bool userCalled) + { + if (myEnum != null) + { + myEnum.Dispose(); + myEnum = null; + } + base.Dispose(userCalled); + } + + [Obsolete("Use Enumerators")] + [EditorBrowsable(EditorBrowsableState.Never)] + public bool MoveNext() + { + if (myEnum == null) + { + myEnum = GetEnumerator(); + } + return myEnum.MoveNext(); + } + + [Obsolete("Use Enumerators")] + [EditorBrowsable(EditorBrowsableState.Never)] + public void Reset() + { + if (myEnum != null) + { + myEnum.Dispose(); + myEnum = null; + } + } + + public IEnumerator GetEnumerator() + { + return new Iterator(this); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return new Iterator(this); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollectionFilter.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollectionFilter.cs new file mode 100644 index 0000000..d95fef3 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WorldObjectCollectionFilter.cs @@ -0,0 +1,14 @@ +using System; +using Decal.Interop.Filters; + +namespace Decal.Adapter.Wrappers; + +public abstract class WorldObjectCollectionFilter +{ + internal abstract void ApplyFilter(WorldIterator wi); + + internal virtual void ApplyFilter(Decal.Interop.Filters.Vendor ven) + { + throw new NotImplementedException("This method has not beed implemented"); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WriteTextFormats.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WriteTextFormats.cs new file mode 100644 index 0000000..7a038ff --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/WriteTextFormats.cs @@ -0,0 +1,19 @@ +using System; + +namespace Decal.Adapter.Wrappers; + +[Flags] +[CLSCompliant(true)] +public enum WriteTextFormats +{ + Bottom = 8, + Center = 1, + ExpandTabs = 0x40, + NoClip = 0x100, + None = 0, + Right = 2, + RightToLeftReading = 0x20000, + SingleLine = 0x20, + VerticalCenter = 4, + WordBreak = 0x10 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.Wrappers/hookIndexType.cs b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/hookIndexType.cs new file mode 100644 index 0000000..816e945 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.Wrappers/hookIndexType.cs @@ -0,0 +1,18 @@ +namespace Decal.Adapter.Wrappers; + +internal enum hookIndexType +{ + Attribute, + AttributeClicks, + AttributeStart, + AttributeTotalXP, + Skill, + SkillClicks, + SkillFreePoints, + SkillTotalXP, + SkillTrainLevel, + Vital, + VitalClicks, + VitalTotalXP, + Misc +} diff --git a/Managed/Decal.Adapter/Decal.Adapter.csproj b/Managed/Decal.Adapter/Decal.Adapter.csproj new file mode 100644 index 0000000..b5df0b1 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter.csproj @@ -0,0 +1,19 @@ + + + Decal.Adapter + True + + + + + + + + + + + + + + + diff --git a/Managed/Decal.Adapter/Decal.Adapter/BaseEventAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/BaseEventAttribute.cs new file mode 100644 index 0000000..2df09ae --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/BaseEventAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] +public sealed class BaseEventAttribute : Attribute +{ + private string eventName; + + private string baseFilter; + + public string EventName => eventName; + + public string FilterName => baseFilter; + + public BaseEventAttribute(string eventName) + : this(eventName, string.Empty) + { + } + + public BaseEventAttribute(string eventName, string baseFilter) + { + this.eventName = eventName; + this.baseFilter = baseFilter; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/COMHResultException.cs b/Managed/Decal.Adapter/Decal.Adapter/COMHResultException.cs new file mode 100644 index 0000000..2e99428 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/COMHResultException.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Decal.Adapter; + +internal class COMHResultException : COMException +{ + internal COMHResultException(HResults hResult) + { + base.HResult = (int)hResult; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ChatClickInterceptEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ChatClickInterceptEventArgs.cs new file mode 100644 index 0000000..89a7c71 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ChatClickInterceptEventArgs.cs @@ -0,0 +1,19 @@ +namespace Decal.Adapter; + +public class ChatClickInterceptEventArgs : EatableEventArgs +{ + private string myText; + + private int myId; + + public string Text => myText; + + public int Id => myId; + + internal ChatClickInterceptEventArgs(string text, int id, bool eat) + : base(eat) + { + myText = text; + myId = id; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ChatParserInterceptEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ChatParserInterceptEventArgs.cs new file mode 100644 index 0000000..a9cae2d --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ChatParserInterceptEventArgs.cs @@ -0,0 +1,14 @@ +namespace Decal.Adapter; + +public class ChatParserInterceptEventArgs : EatableEventArgs +{ + private string myText; + + public string Text => myText; + + internal ChatParserInterceptEventArgs(string text, bool eat) + : base(eat) + { + myText = text; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ChatTextInterceptEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ChatTextInterceptEventArgs.cs new file mode 100644 index 0000000..4fc66df --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ChatTextInterceptEventArgs.cs @@ -0,0 +1,24 @@ +namespace Decal.Adapter; + +public class ChatTextInterceptEventArgs : EatableEventArgs +{ + private string myText; + + private int myColor; + + private int myTarget; + + public string Text => myText; + + public int Color => myColor; + + public int Target => myTarget; + + internal ChatTextInterceptEventArgs(string text, int color, int target, bool eat) + : base(eat) + { + myText = text; + myColor = color; + myTarget = target; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/CheckBoxChangeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/CheckBoxChangeEventArgs.cs new file mode 100644 index 0000000..5ade8ba --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/CheckBoxChangeEventArgs.cs @@ -0,0 +1,14 @@ +namespace Decal.Adapter; + +public class CheckBoxChangeEventArgs : ControlEventArgs +{ + private bool check; + + public bool Checked => check; + + internal CheckBoxChangeEventArgs(int ID, bool Check) + : base(ID) + { + check = Check; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ContainerOpenedEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ContainerOpenedEventArgs.cs new file mode 100644 index 0000000..aa6f8c7 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ContainerOpenedEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter; + +public class ContainerOpenedEventArgs : EventArgs +{ + private int myItemGUID; + + public int ItemGuid => myItemGUID; + + internal ContainerOpenedEventArgs(int itemGUID) + { + myItemGUID = itemGUID; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ControlEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ControlEventArgs.cs new file mode 100644 index 0000000..8a0c816 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ControlEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter; + +public class ControlEventArgs : EventArgs +{ + private int id; + + public int Id => id; + + internal ControlEventArgs(int ID) + { + id = ID; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ControlEventAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/ControlEventAttribute.cs new file mode 100644 index 0000000..d45d9f0 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ControlEventAttribute.cs @@ -0,0 +1,21 @@ +using System; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] +public sealed class ControlEventAttribute : ViewBaseAttribute +{ + private string myControl; + + private string myEventName; + + public string Control => myControl; + + public string EventName => myEventName; + + public ControlEventAttribute(string control, string eventName) + { + myControl = control; + myEventName = eventName; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ControlReferenceArrayAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/ControlReferenceArrayAttribute.cs new file mode 100644 index 0000000..8ee33f2 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ControlReferenceArrayAttribute.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.ObjectModel; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Field)] +public sealed class ControlReferenceArrayAttribute : ViewBaseAttribute +{ + private Collection myControls; + + public Collection Controls => myControls; + + public ControlReferenceArrayAttribute(params string[] controls) + { + myControls = new Collection(controls); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ControlReferenceAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/ControlReferenceAttribute.cs new file mode 100644 index 0000000..ac6a1db --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ControlReferenceAttribute.cs @@ -0,0 +1,16 @@ +using System; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Field)] +public sealed class ControlReferenceAttribute : ViewBaseAttribute +{ + private string myControl; + + public string Control => myControl; + + public ControlReferenceAttribute(string control) + { + myControl = control; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/CoreManager.cs b/Managed/Decal.Adapter/Decal.Adapter/CoreManager.cs new file mode 100644 index 0000000..e89b456 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/CoreManager.cs @@ -0,0 +1,951 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading; +using Decal.Adapter.IDQueue; +using Decal.Adapter.Messages; +using Decal.Adapter.Support; +using Decal.Adapter.Wrappers; +using Decal.Interop.Core; +using Decal.Interop.D3DService; +using Decal.Interop.DHS; +using Decal.Interop.Filters; +using Decal.Interop.Inject; +using Decal.Interop.Render; +using Microsoft.Win32; + +namespace Decal.Adapter; + +[CLSCompliant(true)] +public sealed class CoreManager : MarshalByRefObject +{ + private struct sAssemblyPreloadData + { + public string AssemblyName; + + public string Path; + } + + private static bool myServiceRunning; + + private static CoreManager myService; + + private DecalCoreClass myDecal; + + private ACHooksClass myHooks; + + private PluginSite mySitev1; + + private DecalWrapper myWrappedDecal; + + private HooksWrapper myWrappedHooks; + + private global::Decal.Adapter.Wrappers.HotkeySystem myDHS; + + private CharacterFilter myCharacterFilter; + + private WorldFilter myWorldFilter; + + private global::Decal.Adapter.Wrappers.EchoFilter2 myEchoFilter; + + private D3DService myD3DService; + + private RenderServiceWrapper myRenderService; + + private FairIDQueue myIDQueue; + + private Collection myPaths = new Collection(); + + private Dictionary> myAssemblies = new Dictionary>(); + + private int myAssemblyPreloadCounter = 1; + + private bool myAssemblyPreloadStarted; + + private Dictionary myFilters = new Dictionary(); + + private Dictionary myNamedFilters = new Dictionary(); + + private Dictionary myServices = new Dictionary(); + + private Dictionary myNamedServices = new Dictionary(); + + private Dictionary myPlugins = new Dictionary(); + + private EventHandler myItemSelected; + + private EventHandler myItemDestroyed; + + private EventHandler myChatParserIntercept; + + private EventHandler myRegionChange3D; + + private EventHandler myChatTextIntercept; + + private EventHandler myStatusTextIntercept; + + private EventHandler myMessageProcessed; + + private EventHandler myContainerOpened; + + private EventHandler myChatClickIntercept; + + private EventHandler myWindowMessage; + + private EventHandler myFilterInitComplete; + + private EventHandler myServiceInitComplete; + + private EventHandler myPluginInitComplete; + + private EventHandler myFilterTermComplete; + + private EventHandler myServiceTermComplete; + + private EventHandler myPluginTermComplete; + + private EventHandler myRender_PreUI; + + private EventHandler myExtensionMessage; + + private AppDomain myPluginDomain; + + private AppDomain myDomain; + + public static bool ServiceRunning => myServiceRunning; + + public static CoreManager Current + { + get + { + if (myService == null) + { + myService = new CoreManager(); + } + return myService; + } + } + + public static int TracingLevel => Util.TraceLevel; + + public FilterBase FileService => Filter("Decal.FileService"); + + public global::Decal.Adapter.Wrappers.HotkeySystem HotkeySystem => myDHS; + + [CLSCompliant(false)] + public CharacterFilter CharacterFilter => myCharacterFilter; + + [CLSCompliant(false)] + public WorldFilter WorldFilter => myWorldFilter; + + [CLSCompliant(false)] + public global::Decal.Adapter.Wrappers.EchoFilter2 EchoFilter => myEchoFilter; + + [CLSCompliant(false)] + public D3DService D3DService => myD3DService; + + [CLSCompliant(false)] + public HooksWrapper Actions => myWrappedHooks; + + [CLSCompliant(false)] + public DecalWrapper Decal => myWrappedDecal; + + public RenderServiceWrapper RenderService => myRenderService; + + public FairIDQueue IDQueue => myIDQueue; + + internal AppDomain PluginDomain => myDomain; + + [CLSCompliant(false)] + public event EventHandler ItemSelected + { + add + { + myItemSelected = (EventHandler)Delegate.Combine(myItemSelected, value); + } + remove + { + myItemSelected = (EventHandler)Delegate.Remove(myItemSelected, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ItemDestroyed + { + add + { + myItemDestroyed = (EventHandler)Delegate.Combine(myItemDestroyed, value); + } + remove + { + myItemDestroyed = (EventHandler)Delegate.Remove(myItemDestroyed, value); + } + } + + [CLSCompliant(false)] + public event EventHandler CommandLineText + { + add + { + myChatParserIntercept = (EventHandler)Delegate.Combine(myChatParserIntercept, value); + } + remove + { + myChatParserIntercept = (EventHandler)Delegate.Remove(myChatParserIntercept, value); + } + } + + [CLSCompliant(false)] + public event EventHandler StatusBoxMessage + { + add + { + myStatusTextIntercept = (EventHandler)Delegate.Combine(myStatusTextIntercept, value); + } + remove + { + myStatusTextIntercept = (EventHandler)Delegate.Remove(myStatusTextIntercept, value); + } + } + + [CLSCompliant(false)] + public event EventHandler RegionChange3D + { + add + { + myRegionChange3D = (EventHandler)Delegate.Combine(myRegionChange3D, value); + } + remove + { + myRegionChange3D = (EventHandler)Delegate.Remove(myRegionChange3D, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChatBoxMessage + { + add + { + myChatTextIntercept = (EventHandler)Delegate.Combine(myChatTextIntercept, value); + } + remove + { + myChatTextIntercept = (EventHandler)Delegate.Remove(myChatTextIntercept, value); + } + } + + [CLSCompliant(false)] + public event EventHandler MessageProcessed + { + add + { + myMessageProcessed = (EventHandler)Delegate.Combine(myMessageProcessed, value); + } + remove + { + myMessageProcessed = (EventHandler)Delegate.Remove(myMessageProcessed, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ContainerOpened + { + add + { + myContainerOpened = (EventHandler)Delegate.Combine(myContainerOpened, value); + } + remove + { + myContainerOpened = (EventHandler)Delegate.Remove(myContainerOpened, value); + } + } + + [CLSCompliant(false)] + public event EventHandler ChatNameClicked + { + add + { + myChatClickIntercept = (EventHandler)Delegate.Combine(myChatClickIntercept, value); + } + remove + { + myChatClickIntercept = (EventHandler)Delegate.Remove(myChatClickIntercept, value); + } + } + + public event EventHandler FilterInitComplete + { + add + { + myFilterInitComplete = (EventHandler)Delegate.Combine(myFilterInitComplete, value); + } + remove + { + myFilterInitComplete = (EventHandler)Delegate.Remove(myFilterInitComplete, value); + } + } + + public event EventHandler ServiceInitComplete + { + add + { + myServiceInitComplete = (EventHandler)Delegate.Combine(myServiceInitComplete, value); + } + remove + { + myServiceInitComplete = (EventHandler)Delegate.Remove(myServiceInitComplete, value); + } + } + + public event EventHandler PluginInitComplete + { + add + { + myPluginInitComplete = (EventHandler)Delegate.Combine(myPluginInitComplete, value); + } + remove + { + myPluginInitComplete = (EventHandler)Delegate.Remove(myPluginInitComplete, value); + } + } + + public event EventHandler FilterTermComplete + { + add + { + myFilterTermComplete = (EventHandler)Delegate.Combine(myFilterTermComplete, value); + } + remove + { + myFilterTermComplete = (EventHandler)Delegate.Remove(myFilterTermComplete, value); + } + } + + public event EventHandler ServiceTermComplete + { + add + { + myServiceTermComplete = (EventHandler)Delegate.Combine(myServiceTermComplete, value); + } + remove + { + myServiceTermComplete = (EventHandler)Delegate.Remove(myServiceTermComplete, value); + } + } + + public event EventHandler PluginTermComplete + { + add + { + myPluginTermComplete = (EventHandler)Delegate.Combine(myPluginTermComplete, value); + } + remove + { + myPluginTermComplete = (EventHandler)Delegate.Remove(myPluginTermComplete, value); + } + } + + public event EventHandler RenderFrame + { + add + { + myRender_PreUI = (EventHandler)Delegate.Combine(myRender_PreUI, value); + } + remove + { + myRender_PreUI = (EventHandler)Delegate.Remove(myRender_PreUI, value); + } + } + + [CLSCompliant(false)] + public event EventHandler WindowMessage + { + add + { + myWindowMessage = (EventHandler)Delegate.Combine(myWindowMessage, value); + } + remove + { + myWindowMessage = (EventHandler)Delegate.Remove(myWindowMessage, value); + } + } + + internal event EventHandler ExtensionMessage + { + add + { + myExtensionMessage = (EventHandler)Delegate.Combine(myExtensionMessage, value); + } + remove + { + myExtensionMessage = (EventHandler)Delegate.Remove(myExtensionMessage, value); + } + } + + private CoreManager() + { + AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; + string location = System.Reflection.Assembly.GetExecutingAssembly().Location; + AddAssemblyPath(Path.GetDirectoryName(location)); + myDomain = AppDomain.CurrentDomain; + Util.InitializeTracing("HKEY_LOCAL_MACHINE\\Software\\Decal\\Decal.Adapter", "Tracing", 0); + } + + private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) + { + AppDomain appDomain = (AppDomain)sender; + Assembly[] assemblies = appDomain.GetAssemblies(); + string text = appDomain.ApplyPolicy(args.Name); + if (string.IsNullOrEmpty(text)) + { + text = args.Name; + } + Assembly[] array = assemblies; + foreach (Assembly assembly in array) + { + if (assembly.FullName == text) + { + return assembly; + } + } + if (!appDomain.IsDefaultAppDomain()) + { + assemblies = myDomain.GetAssemblies(); + array = assemblies; + foreach (Assembly assembly2 in array) + { + if (assembly2.FullName == text) + { + AssemblyName name = assembly2.GetName(copiedName: false); + return appDomain.Load(name); + } + } + } + string text2 = ((text.IndexOf(",") <= 0) ? text : text.Substring(0, text.IndexOf(","))); + if (!string.IsNullOrEmpty(text2)) + { + text2 = text2.ToLowerInvariant(); + if (string.IsNullOrEmpty(Path.GetExtension(text2))) + { + text2 += ".dll"; + } + foreach (string myPath in myPaths) + { + if (File.Exists(Path.Combine(myPath, text2))) + { + AssemblyName assemblyName = new AssemblyName(); + assemblyName.CodeBase = Path.Combine(myPath, text2); + return appDomain.Load(assemblyName); + } + } + } + Util.WriteLine("Assembly resolve failed for assembly:" + args.Name); + return null; + } + + private void AddAssemblyPath(string path) + { + string item = path.ToLowerInvariant(); + if (!myPaths.Contains(item)) + { + myPaths.Add(item); + } + } + + private void myDecal_InitializeComplete(eDecalComponentType myComponent) + { + Util.WriteLine("InitializeComplete for: " + myComponent); + switch (myComponent) + { + case eDecalComponentType.eService: + Message.Initialize(Path.Combine((string)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Decal\\Agent", "AgentPath", ""), "messages.xml")); + if (myWrappedDecal != null) + { + try + { + if (myWrappedDecal.GetObject("services\\D3DService.Service") is CService obj) + { + myD3DService = new D3DService(obj); + } + if (myWrappedDecal.GetObject("services\\DecalRender.RenderService") is RenderService render) + { + myRenderService = new RenderServiceWrapper(render); + } + object obj2 = myWrappedDecal.GetObject("services\\DecalPlugins.InjectService\\site", DecalWrapper.IID_IUNKNOWN); + mySitev1 = obj2 as PluginSite; + } + catch (Exception ex) + { + Util.WriteLine("Unable to get service reference: " + ex.Message); + } + } + else + { + Util.WriteLine("Not getting services, we don't have a Decal object to call GetObject on."); + } + try + { + myIDQueue = new FairIDQueue(); + } + catch (Exception ex2) + { + Util.WriteLine("Service initialization exception: " + ex2.Message); + } + Util.SafeFireEvent(this, myServiceInitComplete, new EventArgs()); + break; + case eDecalComponentType.eNetworkFilter: + if (myWrappedDecal != null) + { + try + { + if (myWrappedDecal.GetObject("services\\DecalNet.NetService\\DecalFilters.World") is World obj3) + { + myWorldFilter = new WorldFilter(obj3); + } + if (myWrappedDecal.GetObject("services\\DecalNet.NetService\\DecalFilters.CharacterStats") is CharacterStats obj4) + { + myCharacterFilter = new CharacterFilter(obj4); + } + if (myWrappedDecal.GetObject("services\\DecalNet.NetService\\DecalFilters.EchoFilter2") is global::Decal.Interop.Filters.EchoFilter2 obj5) + { + myEchoFilter = new global::Decal.Adapter.Wrappers.EchoFilter2(obj5); + } + } + catch (Exception ex3) + { + Util.WriteLine("Unable to get filter reference: " + ex3.Message); + } + } + else + { + Util.WriteLine("Not getting filters, we don't have a Decal object to call GetObject on."); + } + Util.SafeFireEvent(this, myFilterInitComplete, new EventArgs()); + DecrementAssemblyPreloadLockCounter(); + break; + case eDecalComponentType.ePlugin: + if (myWrappedDecal.GetObject("plugins\\DHS.HotkeySystem") is global::Decal.Interop.DHS.HotkeySystem hks) + { + myDHS = new global::Decal.Adapter.Wrappers.HotkeySystem(hks); + } + myIDQueue.Start(); + Util.SafeFireEvent(this, myPluginInitComplete, new EventArgs()); + break; + } + } + + private void myDecal_TerminateComplete(eDecalComponentType myComponent) + { + Util.WriteLine("TerminateComplete for: " + myComponent); + switch (myComponent) + { + case eDecalComponentType.eService: + if (myD3DService != null) + { + myD3DService.Dispose(); + myD3DService = null; + } + if (myRenderService != null) + { + myRenderService.Dispose(); + myRenderService = null; + } + if (mySitev1 != null) + { + Marshal.ReleaseComObject(mySitev1); + } + myServices.Clear(); + myNamedServices.Clear(); + Util.SafeFireEvent(this, myServiceTermComplete, new EventArgs()); + break; + case eDecalComponentType.eNetworkFilter: + if (myWorldFilter != null) + { + myWorldFilter.Dispose(); + myWorldFilter = null; + } + if (myCharacterFilter != null) + { + myCharacterFilter.Dispose(); + myCharacterFilter = null; + } + if (myEchoFilter != null) + { + myEchoFilter.Dispose(); + myEchoFilter = null; + } + myFilters.Clear(); + myNamedFilters.Clear(); + Util.SafeFireEvent(this, myFilterTermComplete, new EventArgs()); + break; + case eDecalComponentType.ePlugin: + myIDQueue.Stop(); + if (myDHS != null) + { + myDHS.Dispose(); + myDHS = null; + } + myPlugins.Clear(); + if (myPluginDomain != null) + { + lock (myAssemblies) + { + if (myAssemblies.ContainsKey(myPluginDomain)) + { + myAssemblies[myPluginDomain].Clear(); + myAssemblies.Remove(myPluginDomain); + } + AppDomain.Unload(myPluginDomain); + myPluginDomain = null; + } + } + Util.SafeFireEvent(this, myPluginTermComplete, new EventArgs()); + break; + } + } + + private void myHooks_ObjectSelected(int lGUID) + { + Util.SafeFireEvent(this, myItemSelected, new ItemSelectedEventArgs(lGUID)); + } + + private void myHooks_ObjectDestroyed(int lGUID) + { + Util.SafeFireEvent(this, myItemDestroyed, new ItemDestroyedEventArgs(lGUID)); + } + + private void myHooks_AC3DRegionChanged(int left, int top, int right, int bottom) + { + Util.SafeFireEvent(this, myRegionChange3D, new RegionChange3DEventArgs(left, top, right, bottom)); + } + + private void myHooks_ChatParserIntercept(string bstrText, ref bool bEat) + { + Util.SafeFireEvent(this, myChatParserIntercept, new ChatParserInterceptEventArgs(bstrText, bEat), ref bEat); + } + + private void myHooks_StatusTextIntercept(string bstrText, ref bool bEat) + { + Util.SafeFireEvent(this, myStatusTextIntercept, new StatusTextInterceptEventArgs(bstrText, bEat), ref bEat); + } + + private void myHooks_ChatTextIntercept(string bstrText, int lColor, int target, ref bool bEat) + { + Util.SafeFireEvent(this, myChatTextIntercept, new ChatTextInterceptEventArgs(bstrText, lColor, target, bEat), ref bEat); + } + + private void myHooks_MessageProcessed(int pbData, int dwSize) + { + if (myMessageProcessed != null) + { + MessageProcessedEventArgs args = new MessageProcessedEventArgs(pbData, dwSize); + Util.SafeFireEvent(this, myMessageProcessed, args); + } + } + + private void myHooks_ContainerOpened(int lGUID) + { + Util.SafeFireEvent(this, myContainerOpened, new ContainerOpenedEventArgs(lGUID)); + } + + private void myHooks_ChatClickIntercept(string bstrText, int id, ref bool bEat) + { + Util.SafeFireEvent(this, myChatClickIntercept, new ChatClickInterceptEventArgs(bstrText, id, bEat), ref bEat); + } + + private void myHooks_RenderPreUI() + { + Util.SafeFireEvent(this, myRender_PreUI, new EventArgs()); + } + + internal bool FireWindowMessage(int HWND, short uMsg, int wParam, int lParam) + { + bool eaten = false; + WindowMessageEventArgs args = new WindowMessageEventArgs(HWND, uMsg, wParam, lParam); + Util.SafeFireEvent(this, myWindowMessage, args, ref eaten); + return eaten; + } + + internal void FireExtensionMessage(object sender, AdapterMessageEventArgs args) + { + args.CanAddHandlers = true; + Util.SafeFireEvent(this, myExtensionMessage, args); + args.CanAddHandlers = false; + } + + public FilterBase Filter(string filterName) + { + try + { + if (myNamedFilters.ContainsKey(filterName)) + { + return myNamedFilters[filterName]; + } + Type type = Type.GetType(filterName); + if (null != type && myFilters.ContainsKey(type)) + { + return myFilters[type]; + } + } + catch (Exception) + { + } + return null; + } + + public T Filter() where T : FilterBase + { + try + { + if (myFilters.ContainsKey(typeof(T))) + { + return (T)myFilters[typeof(T)]; + } + } + catch (Exception) + { + } + return null; + } + + public ServiceBase Service(string serviceName) + { + try + { + if (myNamedServices.ContainsKey(serviceName)) + { + return myNamedServices[serviceName]; + } + Type type = Type.GetType(serviceName); + if (null != type && myServices.ContainsKey(type)) + { + return myServices[type]; + } + } + catch (Exception) + { + } + return null; + } + + public T Service() where T : ServiceBase + { + try + { + if (myServices.ContainsKey(typeof(T))) + { + return (T)myServices[typeof(T)]; + } + } + catch (Exception) + { + } + return null; + } + + public int QueryKeyBoardMap(string name) + { + int result = 0; + if (mySitev1 != null) + { + result = mySitev1.QueryKeyboardMap(name); + } + return result; + } + + internal void AddFilter(FilterBase newFilter) + { + AddFilter(newFilter.ReferenceName, newFilter); + } + + internal void AddFilter(string filterName, FilterBase newFilter) + { + myFilters.Add(newFilter.GetType(), newFilter); + myNamedFilters.Add(filterName, newFilter); + } + + internal void AddService(ServiceBase newService) + { + AddService(newService.ReferenceName, newService); + } + + internal void AddService(string serviceName, ServiceBase newService) + { + myServices.Add(newService.GetType(), newService); + myNamedServices.Add(serviceName, newService); + } + + internal void AddPlugin(PluginBase newPlugin) + { + AddPlugin(newPlugin.ReferenceName, newPlugin); + } + + internal void AddPlugin(string pluginName, PluginBase newPlugin) + { + myPlugins.Add(pluginName, newPlugin); + } + + internal Assembly Assembly(string name, string path) + { + return Assembly(name, path, AppDomain.CurrentDomain); + } + + internal Assembly Assembly(string name, string path, AppDomain useDomain) + { + lock (myAssemblies) + { + string text = name.ToLowerInvariant(); + useDomain = myDomain; + Dictionary dictionary; + if (myAssemblies.ContainsKey(useDomain)) + { + dictionary = myAssemblies[useDomain]; + } + else + { + myAssemblies.Add(useDomain, new Dictionary()); + dictionary = myAssemblies[useDomain]; + } + if (dictionary.ContainsKey(text)) + { + return dictionary[text]; + } + AddAssemblyPath(path); + Assembly assembly = System.Reflection.Assembly.LoadFrom(Path.Combine(path, text)); + dictionary.Add(text, assembly); + return assembly; + } + } + + internal void Initialize(DecalCore pDecal) + { + Util.WriteLine("Decal.Adapter Lifetime-service Initialize Begun"); + myServiceRunning = true; + Util.Write("Get Decal.. "); + myDecal = (DecalCoreClass)pDecal; + myWrappedDecal = new DecalWrapper(myDecal); + Util.WriteLine("Sink Decal Events.. "); + myDecal.InitializeComplete += myDecal_InitializeComplete; + myDecal.TerminateComplete += myDecal_TerminateComplete; + Util.Write("Get Hooks.. "); + myHooks = (ACHooksClass)myDecal.Hooks; + myWrappedHooks = new HooksWrapper(myHooks); + Util.WriteLine("Sink Hooks Events.. "); + myHooks.ChatTextIntercept += myHooks_ChatTextIntercept; + myHooks.StatusTextIntercept += myHooks_StatusTextIntercept; + myHooks.ChatParserIntercept += myHooks_ChatParserIntercept; + myHooks.AC3DRegionChanged += myHooks_AC3DRegionChanged; + myHooks.ObjectSelected += myHooks_ObjectSelected; + myHooks.ObjectDestroyed += myHooks_ObjectDestroyed; + myHooks.MessageProcessed += myHooks_MessageProcessed; + myHooks.ContainerOpened += myHooks_ContainerOpened; + myHooks.ChatClickIntercept += myHooks_ChatClickIntercept; + myHooks.RenderPreUI += myHooks_RenderPreUI; + Util.WriteLine("Decal.Adapter Lifetime-service Initiliazed"); + } + + internal void Terminate() + { + myDecal.InitializeComplete -= myDecal_InitializeComplete; + myDecal.TerminateComplete -= myDecal_TerminateComplete; + myHooks.ChatTextIntercept -= myHooks_ChatTextIntercept; + myHooks.StatusTextIntercept -= myHooks_StatusTextIntercept; + myHooks.ChatParserIntercept -= myHooks_ChatParserIntercept; + myHooks.AC3DRegionChanged -= myHooks_AC3DRegionChanged; + myHooks.ObjectSelected -= myHooks_ObjectSelected; + myHooks.ObjectDestroyed -= myHooks_ObjectDestroyed; + myHooks.MessageProcessed -= myHooks_MessageProcessed; + myHooks.ContainerOpened -= myHooks_ContainerOpened; + myHooks.ChatClickIntercept -= myHooks_ChatClickIntercept; + myHooks.RenderPreUI -= myHooks_RenderPreUI; + myWrappedDecal.Dispose(); + myWrappedDecal = null; + Marshal.ReleaseComObject(myDecal); + myDecal = null; + myHooks = null; + myWrappedHooks.Dispose(); + myWrappedHooks = null; + myService = null; + myServiceRunning = false; + } + + public void IncrementAssemblyPreloadLockCounter() + { + myAssemblyPreloadCounter++; + } + + public void DecrementAssemblyPreloadLockCounter() + { + myAssemblyPreloadCounter--; + if (myAssemblyPreloadCounter < 0) + { + myAssemblyPreloadCounter = 0; + } + if (myAssemblyPreloadCounter != 0 || myAssemblyPreloadStarted) + { + return; + } + myAssemblyPreloadStarted = true; + List list = new List(); + Guid clsidAdvance = Guid.Empty; + Guid guid = new Guid("{71A69713-6593-47EC-0002-0000000DECA1}"); + DecalEnum decalEnum = ((dynamic)(IDecalCore)Decal.Underlying).get_Configuration("Plugins", ref clsidAdvance); + try + { + while (true) + { + decalEnum.Next(); + if (!decalEnum.Enabled || decalEnum.SurrogateClass != guid) + { + continue; + } + try + { + if (decalEnum.Restricted) + { + continue; + } + } + catch + { + continue; + } + list.Add(new sAssemblyPreloadData + { + AssemblyName = (string)((dynamic)(IDecalEnum)decalEnum).get_Property("Assembly"), + Path = (string)((dynamic)(IDecalEnum)decalEnum).get_Property("Path") + }); + } + } + catch + { + } + finally + { + Marshal.ReleaseComObject(decalEnum); + } + ThreadPool.QueueUserWorkItem(AssemblyPreloadThreadProc, list); + } + + internal void AssemblyPreloadThreadProc(object data) + { + if (!(data is List list)) + { + return; + } + foreach (sAssemblyPreloadData item in list) + { + try + { + Util.WriteLine("Preloading plugin assembly {0}, {1}", item.AssemblyName, item.Path); + Assembly(item.AssemblyName, item.Path, AppDomain.CurrentDomain); + } + catch + { + } + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/DecalExtensionType.cs b/Managed/Decal.Adapter/Decal.Adapter/DecalExtensionType.cs new file mode 100644 index 0000000..cb7c0bd --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/DecalExtensionType.cs @@ -0,0 +1,14 @@ +using System; + +namespace Decal.Adapter; + +[CLSCompliant(true)] +public enum DecalExtensionType +{ + Surrogate, + Service, + InputAction, + FileFilter, + NetworkFilter, + Plugin +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/DirectoryProxy.cs b/Managed/Decal.Adapter/Decal.Adapter/DirectoryProxy.cs new file mode 100644 index 0000000..2b78563 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/DirectoryProxy.cs @@ -0,0 +1,12 @@ +using System; +using Decal.Interop.Core; + +namespace Decal.Adapter; + +public sealed class DirectoryProxy : MarshalByRefObject, IDecalDirectory +{ + public object Lookup(string strName) + { + throw new NotImplementedException("The method or operation is not implemented."); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/DirectoryResolveEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/DirectoryResolveEventArgs.cs new file mode 100644 index 0000000..b89759c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/DirectoryResolveEventArgs.cs @@ -0,0 +1,29 @@ +using System; + +namespace Decal.Adapter; + +public class DirectoryResolveEventArgs : EventArgs +{ + private string myPath; + + private object myResult; + + public string Path => myPath; + + public object Result + { + get + { + return myResult; + } + set + { + myResult = value; + } + } + + internal DirectoryResolveEventArgs(string path) + { + myPath = path; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/DisposableByRefObject.cs b/Managed/Decal.Adapter/Decal.Adapter/DisposableByRefObject.cs new file mode 100644 index 0000000..f2a6434 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/DisposableByRefObject.cs @@ -0,0 +1,60 @@ +using System; + +namespace Decal.Adapter; + +public class DisposableByRefObject : MarshalByRefObject, IDisposable +{ + private bool isDisposed; + + private EventHandler myDisposing; + + public event EventHandler Disposing + { + add + { + myDisposing = (EventHandler)Delegate.Combine(myDisposing, value); + } + remove + { + myDisposing = (EventHandler)Delegate.Remove(myDisposing, value); + } + } + + internal DisposableByRefObject() + { + } + + ~DisposableByRefObject() + { + Dispose(userCalled: false); + } + + public void Dispose() + { + Dispose(userCalled: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool userCalled) + { + if (!isDisposed && userCalled && myDisposing != null) + { + try + { + myDisposing(this, new EventArgs()); + } + catch + { + } + } + isDisposed = true; + } + + protected void EnforceDisposedOnce() + { + if (isDisposed) + { + throw new ObjectDisposedException(GetType().ToString()); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/DisposableObjectDictionary.cs b/Managed/Decal.Adapter/Decal.Adapter/DisposableObjectDictionary.cs new file mode 100644 index 0000000..b4385e2 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/DisposableObjectDictionary.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using Decal.Adapter.Support; + +namespace Decal.Adapter; + +public class DisposableObjectDictionary : DisposableByRefObject, IDictionary, ICollection>, IEnumerable>, IEnumerable where T : DisposableByRefObject +{ + private Dictionary items = new Dictionary(); + + private PropertyInfo keyProperty; + + public ICollection Keys => items.Keys; + + public ICollection Values => items.Values; + + public T this[K key] + { + get + { + return items[key]; + } + set + { + items[key] = value; + } + } + + public int Count => ((ICollection>)items).Count; + + public bool IsReadOnly => ((ICollection>)items).IsReadOnly; + + public DisposableObjectDictionary(string keyPropertyName) + { + keyProperty = typeof(T).GetProperty(keyPropertyName, BindingFlags.Instance | BindingFlags.Public); + } + + protected override void Dispose(bool userCalled) + { + if (userCalled) + { + Clear(); + } + base.Dispose(userCalled); + } + + private void value_Disposing(object sender, EventArgs e) + { + K key = (K)keyProperty.GetValue(sender, null); + ((T)sender).Disposing -= value_Disposing; + items.Remove(key); + } + + public void Add(K key, T value) + { + items.Add(key, value); + value.Disposing += value_Disposing; + } + + public bool ContainsKey(K key) + { + return items.ContainsKey(key); + } + + public bool Remove(K key) + { + return items.Remove(key); + } + + public bool TryGetValue(K key, out T value) + { + return items.TryGetValue(key, out value); + } + + public void Add(KeyValuePair item) + { + items.Add(item.Key, item.Value); + } + + public void Clear() + { + foreach (T value in items.Values) + { + try + { + value.Disposing -= value_Disposing; + value.Dispose(); + } + catch (Exception ex) + { + Util.WriteLine("GDW_Clear: Exception: {0}", ex.Message); + } + } + items.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return ((ICollection>)items).Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + ((ICollection>)items).CopyTo(array, arrayIndex); + } + + public bool Remove(KeyValuePair item) + { + return ((ICollection>)items).Remove(item); + } + + public IEnumerator> GetEnumerator() + { + return ((IEnumerable>)items).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)items).GetEnumerator(); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/EatableEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/EatableEventArgs.cs new file mode 100644 index 0000000..df50cca --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/EatableEventArgs.cs @@ -0,0 +1,25 @@ +using System; + +namespace Decal.Adapter; + +public class EatableEventArgs : EventArgs +{ + private bool myEat; + + public bool Eat + { + get + { + return myEat; + } + set + { + myEat = value; + } + } + + internal EatableEventArgs(bool eat) + { + myEat = eat; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/Extension.cs b/Managed/Decal.Adapter/Decal.Adapter/Extension.cs new file mode 100644 index 0000000..98a59a4 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/Extension.cs @@ -0,0 +1,246 @@ +using System; +using Decal.Adapter.Messages; + +namespace Decal.Adapter; + +[CLSCompliant(true)] +public abstract class Extension : MarshalByRefObject +{ + private DecalExtensionType myExtensionType; + + private CoreManager myLifetime; + + private string myPath; + + private EventHandler directoryResolve; + + public DecalExtensionType ExtensionType => myExtensionType; + + public string Path + { + get + { + return myPath; + } + internal set + { + myPath = value; + } + } + + protected CoreManager Core + { + get + { + if (myLifetime == null) + { + myLifetime = CoreManager.Current; + } + return myLifetime; + } + } + + public virtual object ComOM => null; + + public virtual string ReferenceName => GetType().FullName; + + [CLSCompliant(false)] + protected event EventHandler DirectoryResolve + { + add + { + directoryResolve = (EventHandler)Delegate.Combine(directoryResolve, value); + } + remove + { + directoryResolve = (EventHandler)Delegate.Remove(directoryResolve, value); + } + } + + [CLSCompliant(false)] + protected event EventHandler WindowMessage + { + add + { + Core.WindowMessage += value; + } + remove + { + Core.WindowMessage -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler ChatNameClicked + { + add + { + Core.ChatNameClicked += value; + } + remove + { + Core.ChatNameClicked -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler MessageProcessed + { + add + { + Core.MessageProcessed += value; + } + remove + { + Core.MessageProcessed -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler RegionChange3D + { + add + { + Core.RegionChange3D += value; + } + remove + { + Core.RegionChange3D -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler ChatBoxMessage + { + add + { + Core.ChatBoxMessage += value; + } + remove + { + Core.ChatBoxMessage -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler ItemSelected + { + add + { + Core.ItemSelected += value; + } + remove + { + Core.ItemSelected -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler ItemDestroyed + { + add + { + Core.ItemDestroyed += value; + } + remove + { + Core.ItemDestroyed -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler CommandLineText + { + add + { + Core.CommandLineText += value; + } + remove + { + Core.CommandLineText -= value; + } + } + + [CLSCompliant(false)] + protected event EventHandler ContainerOpened + { + add + { + Core.ContainerOpened += value; + } + remove + { + Core.ContainerOpened -= value; + } + } + + protected event EventHandler AdapterMessage + { + add + { + Core.ExtensionMessage += value; + } + remove + { + Core.ExtensionMessage -= value; + } + } + + internal Extension(DecalExtensionType type) + { + myExtensionType = type; + } + + internal void standardEvent(ExtensionEvents evtToFire) + { + switch (evtToFire) + { + case ExtensionEvents.Startup: + Startup(); + break; + case ExtensionEvents.Shutdown: + Shutdown(); + break; + case ExtensionEvents.InternalWireup: + Wireup(); + break; + case ExtensionEvents.InternalUnwire: + UnWire(); + break; + } + } + + internal object ResolvePath(string path) + { + DirectoryResolveEventArgs e = new DirectoryResolveEventArgs(path); + if (directoryResolve != null) + { + try + { + directoryResolve(this, e); + return e.Result; + } + catch + { + } + } + return null; + } + + internal virtual void Wireup() + { + } + + internal virtual void UnWire() + { + } + + protected abstract void Startup(); + + protected abstract void Shutdown(); + + protected void SendAdapterMessage(AdapterMessageEventArgs args) + { + Core.FireExtensionMessage(this, args); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ExtensionEvents.cs b/Managed/Decal.Adapter/Decal.Adapter/ExtensionEvents.cs new file mode 100644 index 0000000..d8d9b43 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ExtensionEvents.cs @@ -0,0 +1,9 @@ +namespace Decal.Adapter; + +internal enum ExtensionEvents +{ + InternalWireup, + InternalUnwire, + Startup, + Shutdown +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/FilterBase.cs b/Managed/Decal.Adapter/Decal.Adapter/FilterBase.cs new file mode 100644 index 0000000..b67ddc4 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/FilterBase.cs @@ -0,0 +1,41 @@ +using System; +using Decal.Adapter.Wrappers; + +namespace Decal.Adapter; + +[CLSCompliant(true)] +public abstract class FilterBase : Extension +{ + private NetServiceHost myHost; + + [CLSCompliant(false)] + protected NetServiceHost Host => myHost; + + [CLSCompliant(false)] + protected event EventHandler ServerDispatch; + + [CLSCompliant(false)] + protected event EventHandler ClientDispatch; + + protected FilterBase() + : base(DecalExtensionType.NetworkFilter) + { + } + + internal void SetHost(NetServiceHost newHost) + { + myHost = newHost; + } + + internal void fireNetwork(Message newMsg, bool Server) + { + if (Server && this.ServerDispatch != null) + { + this.ServerDispatch(this, new NetworkMessageEventArgs(newMsg)); + } + else if (!Server && this.ClientDispatch != null) + { + this.ClientDispatch(this, new NetworkMessageEventArgs(newMsg)); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/FilterProxy.cs b/Managed/Decal.Adapter/Decal.Adapter/FilterProxy.cs new file mode 100644 index 0000000..d32b850 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/FilterProxy.cs @@ -0,0 +1,51 @@ +using Decal.Adapter.NetParser; +using Decal.Adapter.Wrappers; +using Decal.Interop.Core; +using Decal.Interop.Net; + +namespace Decal.Adapter; + +public sealed class FilterProxy : INetworkFilter2, IDecalDirectory +{ + private NetServiceHost myService; + + private FilterBase myFilter; + + internal FilterProxy(FilterBase toWrap) + { + myFilter = toWrap; + } + + void INetworkFilter2.DispatchClient(IMessage2 msg) + { + Message message = null; + message = ((!(msg is MessageWrapper messageWrapper)) ? new Message(msg, MessageDirection.Inbound) : messageWrapper.Wrapped); + myFilter.fireNetwork(message, Server: false); + } + + void INetworkFilter2.DispatchServer(IMessage2 msg) + { + Message message = null; + message = ((!(msg is MessageWrapper messageWrapper)) ? new Message(msg, MessageDirection.Inbound) : messageWrapper.Wrapped); + myFilter.fireNetwork(message, Server: true); + } + + void INetworkFilter2.Initialize(NetService pService) + { + myService = new NetServiceHost(pService); + myFilter.SetHost(myService); + myFilter.standardEvent(ExtensionEvents.InternalWireup); + myFilter.standardEvent(ExtensionEvents.Startup); + } + + void INetworkFilter2.Terminate() + { + myFilter.standardEvent(ExtensionEvents.Shutdown); + myService.Dispose(); + } + + object IDecalDirectory.Lookup(string strName) + { + return myFilter.ResolvePath(strName); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/FriendlyNameAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/FriendlyNameAttribute.cs new file mode 100644 index 0000000..d9811f1 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/FriendlyNameAttribute.cs @@ -0,0 +1,16 @@ +using System; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Class)] +public sealed class FriendlyNameAttribute : Attribute +{ + private string myName; + + public string Name => myName; + + public FriendlyNameAttribute(string name) + { + myName = name; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/GenericDisposableWrapper.cs b/Managed/Decal.Adapter/Decal.Adapter/GenericDisposableWrapper.cs new file mode 100644 index 0000000..0d64f34 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/GenericDisposableWrapper.cs @@ -0,0 +1,32 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; + +namespace Decal.Adapter; + +public class GenericDisposableWrapper : DisposableByRefObject where T : class +{ + private T myObj; + + [CLSCompliant(false)] + [EditorBrowsable(EditorBrowsableState.Never)] + public T Underlying => myObj; + + [CLSCompliant(false)] + protected T Wrapped => myObj; + + internal GenericDisposableWrapper(T obj) + { + myObj = obj; + } + + protected override void Dispose(bool userCalled) + { + EnforceDisposedOnce(); + base.Dispose(userCalled); + if (myObj != null) + { + Marshal.ReleaseComObject(myObj); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/HResults.cs b/Managed/Decal.Adapter/Decal.Adapter/HResults.cs new file mode 100644 index 0000000..51c4e42 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/HResults.cs @@ -0,0 +1,9 @@ +namespace Decal.Adapter; + +internal enum HResults +{ + E_FAIL = -2147483640, + E_NOINTERFACE = -2147483644, + S_FAIL = -1, + S_OK = 0 +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/IAdapterSurrogate.cs b/Managed/Decal.Adapter/Decal.Adapter/IAdapterSurrogate.cs new file mode 100644 index 0000000..514d28c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/IAdapterSurrogate.cs @@ -0,0 +1,41 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Decal.Interop.Core; + +namespace Decal.Adapter; + +[ComImport] +[InterfaceType(1)] +[Guid("DA98635C-A312-463B-A746-2CF62AF7413A")] +internal interface IAdapterSurrogate +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + IntPtr CreateInstance([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData, ref Guid riid); + + [DispId(1610678273)] + string Version + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SetEnum([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData); + + [DispId(1610678275)] + bool FileExists + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678276)] + string FilePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/IndexChangeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/IndexChangeEventArgs.cs new file mode 100644 index 0000000..de27188 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/IndexChangeEventArgs.cs @@ -0,0 +1,14 @@ +namespace Decal.Adapter; + +public class IndexChangeEventArgs : ControlEventArgs +{ + private int index; + + public int Index => index; + + internal IndexChangeEventArgs(int ID, int Index) + : base(ID) + { + index = Index; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ItemDestroyedEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ItemDestroyedEventArgs.cs new file mode 100644 index 0000000..a71d844 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ItemDestroyedEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter; + +public class ItemDestroyedEventArgs : EventArgs +{ + private int myItemGUID; + + public int ItemGuid => myItemGUID; + + internal ItemDestroyedEventArgs(int itemGUID) + { + myItemGUID = itemGUID; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ItemSelectedEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ItemSelectedEventArgs.cs new file mode 100644 index 0000000..ce0fa4b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ItemSelectedEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter; + +public class ItemSelectedEventArgs : EventArgs +{ + private int myItemGUID; + + public int ItemGuid => myItemGUID; + + internal ItemSelectedEventArgs(int itemGUID) + { + myItemGUID = itemGUID; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/LifetimeProxy.cs b/Managed/Decal.Adapter/Decal.Adapter/LifetimeProxy.cs new file mode 100644 index 0000000..4258eb2 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/LifetimeProxy.cs @@ -0,0 +1,72 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Adapter.Support; +using Decal.Interop.Core; +using Microsoft.Win32; + +namespace Decal.Adapter; + +[ComVisible(true)] +[ComDefaultInterface(typeof(IDecalService))] +[ClassInterface(ClassInterfaceType.None)] +[ProgId("DecalAdapter.Lifetime")] +[Guid("71A69713-6593-47EC-0001-0000000DECA1")] +public sealed class LifetimeProxy : MarshalByRefObject, IDecalService, IDecalDirectory, IDecalWindowsMessageSink +{ + private CoreManager myLifetime; + + public LifetimeProxy() + { + Util.WriteLine("Lifetime Proxy retrieving Lifetime manager"); + myLifetime = CoreManager.Current; + Util.WriteLine("Lifetime Proxy ctor complete"); + } + + [ComRegisterFunction] + internal static void SelfRegister(Type t) + { + RegistryKey registryKey = Registry.LocalMachine.CreateSubKey("Software\\Decal\\Services").CreateSubKey("{71A69713-6593-47EC-0001-0000000DECA1}"); + registryKey.SetValue("", "Decal .NET Lifetime Service", RegistryValueKind.String); + registryKey.SetValue("Enabled", true, RegistryValueKind.DWord); + RegistryKey registryKey2 = Registry.LocalMachine.CreateSubKey("Software\\Decal\\Surrogates").CreateSubKey("{71A69713-6593-47EC-0002-0000000DECA1}"); + registryKey2.SetValue("", "Decal.Adapter Surrogate", RegistryValueKind.String); + registryKey2.SetValue("Enabled", true, RegistryValueKind.DWord); + } + + [ComUnregisterFunction] + internal static void UnRegister(Type t) + { + } + + void IDecalService.AfterPlugins() + { + } + + void IDecalService.BeforePlugins() + { + } + + void IDecalService.Initialize(DecalCore pDecal) + { + if (!RuntimePolicyHelper.LegacyV2RuntimeEnabledSuccessfully) + { + Util.WriteLine("Can't load v2 mixed-mode"); + } + myLifetime.Initialize(pDecal); + } + + void IDecalService.Terminate() + { + myLifetime.Terminate(); + } + + object IDecalDirectory.Lookup(string strName) + { + return null; + } + + bool IDecalWindowsMessageSink.WindowMessage(int HWND, short uMsg, int wParam, int lParam) + { + return myLifetime.FireWindowMessage(HWND, uMsg, wParam, lParam); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ListSelectEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/ListSelectEventArgs.cs new file mode 100644 index 0000000..e37f477 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ListSelectEventArgs.cs @@ -0,0 +1,19 @@ +namespace Decal.Adapter; + +public class ListSelectEventArgs : ControlEventArgs +{ + private int row; + + private int col; + + public int Row => row; + + public int Column => col; + + internal ListSelectEventArgs(int ID, int Row, int Column) + : base(ID) + { + row = Row; + col = Column; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/Message.cs b/Managed/Decal.Adapter/Decal.Adapter/Message.cs new file mode 100644 index 0000000..7e03a33 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/Message.cs @@ -0,0 +1,451 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Xml; +using Decal.Adapter.NetParser; +using Decal.Interop.Net; + +namespace Decal.Adapter; + +public class Message : MessageStruct +{ + private static Dictionary mRecv; + + private static Dictionary mSend; + + private static Dictionary mTypes; + + private int mType; + + internal MessageStruct mStruct; + + public int Type => mType; + + public override int Count => mStruct.Count; + + public override object this[int index] => mStruct[index]; + + public override object this[string name] => mStruct[name]; + + public override byte[] RawData => mStruct.RawData; + + public override object Next => mStruct.Next; + + public override MessageStruct Parent => mStruct.Parent; + + internal Message() + { + } + + internal Message(IMessage2 msg, MessageDirection dir) + { + mType = BitConverter.ToInt32(msg.RawData, 0); + mStruct = new MessageStruct(msg.RawData, 4, GetParser(mType, dir)); + } + + internal Message(byte[] Data, MemberParser Parser) + { + mType = BitConverter.ToInt32(Data, 0); + mStruct = new MessageStruct(Data, 4, Parser); + } + + internal Message(Message Source) + { + mType = Source.mType; + mStruct = Source.mStruct; + } + + internal static MemberParser GetParser(int type, MessageDirection dir) + { + MemberParser result = null; + switch (dir) + { + case MessageDirection.Inbound: + if (mRecv.ContainsKey(type)) + { + result = mRecv[type]; + } + break; + case MessageDirection.Outbound: + if (mSend.ContainsKey(type)) + { + result = mSend[type]; + } + break; + } + return result; + } + + public override string Name(int index) + { + return mStruct.Name(index); + } + + public override string Name(string memberName) + { + return mStruct.Name(memberName); + } + + public override MessageStruct Struct(int index) + { + return mStruct.Struct(index); + } + + public override MessageStruct Struct(string name) + { + return mStruct.Struct(name); + } + + public override FieldType Value(int index) + { + return mStruct.Value(index); + } + + public override FieldType Value(string name) + { + return mStruct.Value(name); + } + + public override byte[] RawValue(int index) + { + return mStruct.RawValue(index); + } + + public override byte[] RawValue(string name) + { + return mStruct.RawValue(name); + } + + internal static void Initialize(string xmlFile) + { + //IL_001e: Unknown result type (might be due to invalid IL or missing references) + //IL_0024: Expected O, but got Unknown + //IL_0044: Unknown result type (might be due to invalid IL or missing references) + //IL_004f: Expected O, but got Unknown + //IL_0083: Unknown result type (might be due to invalid IL or missing references) + //IL_008e: Expected O, but got Unknown + mRecv = new Dictionary(); + mSend = new Dictionary(); + mTypes = new Dictionary(); + XmlDocument val = new XmlDocument(); + val.Load(xmlFile); + foreach (XmlNode item in ((XmlNode)val).SelectNodes("/schema/datatypes/type")) + { + ParseType(item, val); + } + foreach (XmlNode item2 in ((XmlNode)val).SelectNodes("/schema/messages/message")) + { + ParseMessage(item2, val); + } + } + + private static void ParseType(XmlNode node, XmlDocument doc) + { + XmlAttribute val = node.Attributes["name"]; + if (val == null) + { + return; + } + string value = ((XmlNode)val).Value; + if (mTypes.ContainsKey(value)) + { + return; + } + MemberParser memberParser = new MemberParser(); + mTypes.Add(value, memberParser); + val = node.Attributes["primitive"]; + if (val != null && string.Compare(((XmlNode)val).Value, "true", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + if (string.Compare(value, "BYTE", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.BYTE; + } + else if (string.Compare(value, "WORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.WORD; + } + else if (string.Compare(value, "PackedWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.PackedWORD; + } + else if (string.Compare(value, "DWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.DWORD; + } + else if (string.Compare(value, "PackedDWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.PackedDWORD; + } + else if (string.Compare(value, "QWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.QWORD; + } + else if (string.Compare(value, "float", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.@float; + } + else if (string.Compare(value, "double", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.@double; + } + else if (string.Compare(value, "String", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.String; + } + else if (string.Compare(value, "WString", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser.MemberType = MemberParserType.WString; + } + } + else + { + memberParser.MemberType = MemberParserType.Struct; + memberParser.Child = ParseStruct(node.ChildNodes, doc); + } + } + + private static void ParseMessage(XmlNode node, XmlDocument doc) + { + XmlAttribute val = node.Attributes["type"]; + if (val == null) + { + return; + } + string text = ((XmlNode)val).Value; + if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) + { + text = text.Substring(2); + } + int key = int.Parse(text, NumberStyles.HexNumber); + bool flag = true; + bool flag2 = false; + val = node.Attributes["direction"]; + if (val != null) + { + if (string.Compare(((XmlNode)val).Value, "outbound", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + flag = false; + flag2 = true; + } + else if (string.Compare(((XmlNode)val).Value, "both", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + flag2 = true; + } + } + if ((flag && !mRecv.ContainsKey(key)) || (flag2 && !mSend.ContainsKey(key))) + { + MemberParser value = ParseStruct(node.ChildNodes, doc); + if (flag && !mRecv.ContainsKey(key)) + { + mRecv.Add(key, value); + } + if (flag2 && !mSend.ContainsKey(key)) + { + mSend.Add(key, value); + } + } + } + + private static MemberParser ParseStruct(XmlNodeList nodes, XmlDocument doc) + { + //IL_0025: Unknown result type (might be due to invalid IL or missing references) + //IL_002b: Invalid comparison between Unknown and I4 + MemberParser memberParser = new MemberParser(); + MemberParser memberParser2 = memberParser; + int count = nodes.Count; + for (int i = 0; i < count; i++) + { + XmlNode val = nodes[i]; + if ((int)val.NodeType != 1) + { + continue; + } + string name = val.Name; + if (string.Compare(name, "field", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + XmlAttribute val2 = val.Attributes["type"]; + if (val2 != null) + { + string value = ((XmlNode)val2).Value; + if (!mTypes.ContainsKey(value)) + { + ParseType(((XmlNode)doc).SelectSingleNode("/schema/datatypes/type[@name='" + value + "']"), doc); + } + memberParser2.Next = new MemberParser(mTypes[value]); + memberParser2 = memberParser2.Next; + memberParser2.MemberName = ((XmlNode)val.Attributes["name"]).Value; + } + } + else if (string.Compare(name, "maskmap", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + XmlAttribute val2 = val.Attributes["xor"]; + long conditionXor = 0L; + string value; + if (val2 != null) + { + value = ((XmlNode)val2).Value; + if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) + { + value = value.Substring(2); + } + conditionXor = long.Parse(value, NumberStyles.HexNumber); + } + value = ((XmlNode)val.Attributes["name"]).Value; + memberParser2.Next = ParseMaskMap(val.ChildNodes, doc); + while (memberParser2.Next != null) + { + memberParser2 = memberParser2.Next; + memberParser2.Condition = MemberParserCondition.NE; + memberParser2.ConditionResult = 0L; + memberParser2.ConditionField = value; + memberParser2.ConditionXor = conditionXor; + } + } + else if (string.Compare(name, "switch", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + string value = ((XmlNode)val.Attributes["name"]).Value; + XmlAttribute val2 = val.Attributes["mask"]; + long conditionXor = -1L; + if (val2 != null) + { + value = ((XmlNode)val2).Value; + if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) + { + value = value.Substring(2); + } + conditionXor = long.Parse(value, NumberStyles.HexNumber); + } + memberParser2.Next = ParseSwitch(val.ChildNodes, doc); + while (memberParser2.Next != null) + { + memberParser2 = memberParser2.Next; + memberParser2.Condition = MemberParserCondition.EQ; + memberParser2.ConditionField = value; + memberParser2.ConditionAnd = conditionXor; + } + } + else if (string.Compare(name, "vector", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser2.Next = new MemberParser(); + memberParser2 = memberParser2.Next; + memberParser2.MemberType = MemberParserType.Vector; + memberParser2.MemberName = ((XmlNode)val.Attributes["name"]).Value; + memberParser2.LengthField = ((XmlNode)val.Attributes["length"]).Value; + XmlAttribute val2 = val.Attributes["mask"]; + long conditionXor = -1L; + if (val2 != null) + { + string value = ((XmlNode)val2).Value; + if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) + { + value = value.Substring(2); + } + conditionXor = long.Parse(value, NumberStyles.HexNumber); + } + memberParser2.LengthMask = conditionXor; + val2 = val.Attributes["skip"]; + int num = 0; + if (val2 != null) + { + string value = ((XmlNode)val2).Value; + if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) + { + value = value.Substring(2); + } + num = int.Parse(value, NumberStyles.HexNumber); + } + memberParser2.LengthDelta = -num; + memberParser2.Child = ParseStruct(val.ChildNodes, doc); + } + else if (string.Compare(name, "align", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + string value = ((XmlNode)val.Attributes["type"]).Value; + if (string.Compare(value, "WORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser2.PostAlignment = 2; + } + else if (string.Compare(value, "DWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser2.PostAlignment = 4; + } + else if (string.Compare(value, "QWORD", ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + memberParser2.PostAlignment = 8; + } + } + } + if (memberParser.PostAlignment != 0 && memberParser.Next != null) + { + memberParser.Next.PreAlignment = memberParser.PostAlignment; + } + return memberParser.Next; + } + + private static MemberParser ParseMaskMap(XmlNodeList nodes, XmlDocument doc) + { + //IL_0021: Unknown result type (might be due to invalid IL or missing references) + //IL_0027: Invalid comparison between Unknown and I4 + MemberParser memberParser = new MemberParser(); + MemberParser memberParser2 = memberParser; + int count = nodes.Count; + for (int i = 0; i < count; i++) + { + XmlNode val = nodes[i]; + if ((int)val.NodeType != 1 || string.Compare(val.Name, "mask", ignoreCase: true, CultureInfo.InvariantCulture) != 0) + { + continue; + } + long conditionAnd = 0L; + XmlAttribute val2 = val.Attributes["value"]; + if (val2 != null) + { + string text = ((XmlNode)val2).Value; + if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) + { + text = text.Substring(2); + } + conditionAnd = long.Parse(text, NumberStyles.HexNumber); + } + memberParser2.Next = new MemberParser(); + memberParser2 = memberParser2.Next; + memberParser2.MemberType = MemberParserType.Case; + memberParser2.ConditionAnd = conditionAnd; + memberParser2.Child = ParseStruct(val.ChildNodes, doc); + } + return memberParser.Next; + } + + private static MemberParser ParseSwitch(XmlNodeList nodes, XmlDocument doc) + { + //IL_0021: Unknown result type (might be due to invalid IL or missing references) + //IL_0027: Invalid comparison between Unknown and I4 + MemberParser memberParser = new MemberParser(); + MemberParser memberParser2 = memberParser; + int count = nodes.Count; + for (int i = 0; i < count; i++) + { + XmlNode val = nodes[i]; + if ((int)val.NodeType != 1 || string.Compare(val.Name, "case", ignoreCase: true, CultureInfo.InvariantCulture) != 0) + { + continue; + } + long conditionResult = 0L; + XmlAttribute val2 = val.Attributes["value"]; + if (val2 != null) + { + string text = ((XmlNode)val2).Value; + if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) + { + text = text.Substring(2); + } + conditionResult = long.Parse(text, NumberStyles.HexNumber); + } + memberParser2.Next = new MemberParser(); + memberParser2 = memberParser2.Next; + memberParser2.MemberType = MemberParserType.Case; + memberParser2.ConditionResult = conditionResult; + memberParser2.Child = ParseStruct(val.ChildNodes, doc); + } + return memberParser.Next; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/MessageDirection.cs b/Managed/Decal.Adapter/Decal.Adapter/MessageDirection.cs new file mode 100644 index 0000000..b410c76 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/MessageDirection.cs @@ -0,0 +1,7 @@ +namespace Decal.Adapter; + +public enum MessageDirection +{ + Inbound, + Outbound +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/MessageProcessedEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/MessageProcessedEventArgs.cs new file mode 100644 index 0000000..ffa1ad8 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/MessageProcessedEventArgs.cs @@ -0,0 +1,31 @@ +using System; +using System.Runtime.InteropServices; + +namespace Decal.Adapter; + +public class MessageProcessedEventArgs : EventArgs +{ + private Message myMessage; + + private int myData; + + private int mySize; + + public Message Message => myMessage; + + public int Data => myData; + + public int Size => mySize; + + internal MessageProcessedEventArgs(int pbData, int dwSize) + { + if (pbData != 0 && dwSize != 0) + { + byte[] array = (byte[])Array.CreateInstance(typeof(byte), dwSize); + Marshal.Copy(new IntPtr(pbData), array, 0, dwSize); + myMessage = new Message(array, Message.GetParser(BitConverter.ToInt32(array, 0), MessageDirection.Inbound)); + } + myData = pbData; + mySize = dwSize; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/MessageStruct.cs b/Managed/Decal.Adapter/Decal.Adapter/MessageStruct.cs new file mode 100644 index 0000000..f7e38f2 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/MessageStruct.cs @@ -0,0 +1,609 @@ +using System; +using System.Globalization; +using System.Text; +using Decal.Adapter.NetParser; +using Decal.Adapter.Support; + +namespace Decal.Adapter; + +public class MessageStruct : MarshalByRefObject +{ + internal struct MessageField + { + internal string Name; + + internal MemberParserType Type; + + internal object Value; + + internal int Offset; + + internal int Length; + } + + internal byte[] mData; + + internal int mOffset; + + internal int mLength; + + internal MemberParser mParser; + + internal MessageStruct mParent; + + internal int mIndex; + + internal bool mParsed; + + internal int mCount; + + internal MessageField[] mFields; + + public virtual int Count + { + get + { + if (!mParsed) + { + Parse(); + } + return mCount; + } + } + + public virtual object this[int index] + { + get + { + if (!mParsed) + { + Parse(); + } + if (index >= 0 && index < mCount) + { + return mFields[index].Value; + } + return null; + } + } + + public virtual object this[string name] + { + get + { + if (!mParsed) + { + Parse(); + } + int num = IndexFromName(name); + if (num >= 0 && num < mCount) + { + return mFields[num].Value; + } + return null; + } + } + + public virtual byte[] RawData + { + get + { + if (mParent != null) + { + return mParent.RawValue(mIndex); + } + byte[] array = (byte[])Array.CreateInstance(typeof(byte), mData.Length); + Buffer.BlockCopy(mData, 0, array, 0, mData.Length); + return array; + } + } + + public virtual object Next + { + get + { + if (mParent == null) + { + return null; + } + return mParent[mIndex + 1]; + } + } + + public virtual MessageStruct Parent => mParent; + + internal MessageStruct() + { + } + + internal MessageStruct(byte[] Data, int Offset, MemberParser Parser) + { + mData = (byte[])Array.CreateInstance(typeof(byte), Data.Length); + Buffer.BlockCopy(Data, 0, mData, 0, mData.Length); + mOffset = Offset; + mParser = Parser; + mCount = -1; + } + + internal MessageStruct(byte[] Data, int Offset, MemberParser Parser, MessageStruct Parent, int Index) + { + mData = Data; + mOffset = Offset; + mParser = Parser; + mParent = Parent; + mIndex = Index; + mCount = -1; + } + + internal MessageStruct(byte[] Data, int Offset, MemberParser Parser, int Length, MessageStruct Parent, int Index) + { + mData = Data; + mOffset = Offset; + mParser = Parser; + mParent = Parent; + mIndex = Index; + mCount = Length; + } + + internal int ObjectToIndex(object vIndex) + { + string text = vIndex as string; + int num = -1; + num = (string.IsNullOrEmpty(text) ? Util.UnboxTo(vIndex) : IndexFromName(text)); + if (num >= 0 && num < mCount) + { + return num; + } + return -1; + } + + public virtual string Name(int index) + { + if (!mParsed) + { + Parse(); + } + if (index >= 0 && index < mCount) + { + return mFields[index].Name; + } + return null; + } + + public virtual string Name(string memberName) + { + if (!mParsed) + { + Parse(); + } + int num = IndexFromName(memberName); + if (num >= 0 && num < mCount) + { + return mFields[num].Name; + } + return null; + } + + public virtual MessageStruct Struct(int index) + { + if (!mParsed) + { + Parse(); + } + if (index >= 0 && index < mCount) + { + MemberParserType type = mFields[index].Type; + if (type == MemberParserType.Struct || type == MemberParserType.Vector) + { + return mFields[index].Value as MessageStruct; + } + } + return null; + } + + public virtual MessageStruct Struct(string name) + { + if (!mParsed) + { + Parse(); + } + int num = IndexFromName(name); + if (num >= 0 && num < mCount) + { + MemberParserType type = mFields[num].Type; + if (type == MemberParserType.Struct || type == MemberParserType.Vector) + { + return mFields[num].Value as MessageStruct; + } + } + return null; + } + + public virtual FieldType Value(int index) + { + if (!mParsed) + { + Parse(); + } + if (index >= 0 && index < mCount) + { + return Util.UnboxTo(mFields[index].Value); + } + return default(FieldType); + } + + public virtual FieldType Value(string name) + { + if (!mParsed) + { + Parse(); + } + int num = IndexFromName(name); + if (num >= 0 && num < mCount) + { + return Util.UnboxTo(mFields[num].Value); + } + return default(FieldType); + } + + public virtual byte[] RawValue(int index) + { + if (!mParsed) + { + Parse(); + } + if (index >= 0 && index < mCount) + { + int length = mFields[index].Length; + byte[] array = (byte[])Array.CreateInstance(typeof(byte), length); + Buffer.BlockCopy(mData, mFields[index].Offset, array, 0, length); + return array; + } + return null; + } + + public virtual byte[] RawValue(string name) + { + if (!mParsed) + { + Parse(); + } + int num = IndexFromName(name); + if (num >= 0 && num < mCount) + { + int length = mFields[num].Length; + byte[] array = (byte[])Array.CreateInstance(typeof(byte), length); + Buffer.BlockCopy(mData, mFields[num].Offset, array, 0, length); + return array; + } + return null; + } + + internal int IndexFromName(string Name) + { + int num = mCount; + for (int i = 0; i < num; i++) + { + if (string.Compare(Name, mFields[i].Name, ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + return i; + } + } + return -1; + } + + internal void Parse() + { + if (mCount == -1) + { + ParseStruct(); + } + else + { + ParseVector(); + } + } + + internal void ParseStruct() + { + int length = ParseCounter(mParser); + mFields = (MessageField[])Array.CreateInstance(typeof(MessageField), length); + mParsed = true; + int ByteIndex = mOffset; + mCount = 0; + ParseHelper(mParser, ref mCount, ref ByteIndex); + mLength = ByteIndex - mOffset; + MessageField[] sourceArray = mFields; + mFields = (MessageField[])Array.CreateInstance(typeof(MessageField), mCount); + Array.Copy(sourceArray, mFields, mCount); + } + + internal void ParseVector() + { + int num = mCount; + mFields = (MessageField[])Array.CreateInstance(typeof(MessageField), num); + mParsed = true; + int num2 = mOffset; + for (int i = 0; i < num; i++) + { + mFields[i].Name = i.ToString(); + mFields[i].Offset = num2; + mFields[i].Type = MemberParserType.Struct; + MessageStruct messageStruct = new MessageStruct(mData, num2, mParser, this, i); + messageStruct.ParseStruct(); + mFields[i].Value = messageStruct; + mFields[i].Length = messageStruct.mLength; + num2 += messageStruct.mLength; + } + mLength = num2 - mOffset; + } + + internal int ParseCounter(MemberParser Parser) + { + int num = 0; + while (Parser != null) + { + num = ((Parser.MemberType != MemberParserType.Case) ? (num + 1) : (num + ParseCounter(Parser.Child))); + Parser = Parser.Next; + } + return num; + } + + internal void ParseHelper(MemberParser Parser, ref int FieldIndex, ref int ByteIndex) + { + Encoding encoding = Encoding.GetEncoding(1252); + while (Parser != null) + { + if (Parser.PreAlignment != 0) + { + int num = ByteIndex % Parser.PreAlignment; + if (num != 0) + { + ByteIndex += Parser.PreAlignment - num; + } + } + bool flag = Parser.Condition == MemberParserCondition.None; + if (!flag) + { + MessageStruct messageStruct = this; + object obj; + do + { + obj = messageStruct[Parser.ConditionField]; + if (obj != null) + { + break; + } + messageStruct = messageStruct.mParent; + } + while (messageStruct != null); + if (obj != null) + { + long num2 = 0L; + Type type = obj.GetType(); + if (type.Equals(typeof(int))) + { + num2 = Convert.ToInt64(obj); + num2 &= 0xFFFFFFFFu; + } + else if (type.Equals(typeof(short))) + { + num2 = Convert.ToInt64(obj); + num2 &= 0xFFFF; + } + else if (type.Equals(typeof(byte))) + { + num2 = Convert.ToInt64(obj); + num2 &= 0xFF; + } + else if (type.Equals(typeof(long))) + { + num2 = Convert.ToInt64(obj); + } + num2 ^= Parser.ConditionXor; + num2 &= Parser.ConditionAnd; + switch (Parser.Condition) + { + case MemberParserCondition.EQ: + flag = num2 == Parser.ConditionResult; + break; + case MemberParserCondition.NE: + flag = num2 != Parser.ConditionResult; + break; + case MemberParserCondition.GE: + flag = num2 >= Parser.ConditionResult; + break; + case MemberParserCondition.GT: + flag = num2 > Parser.ConditionResult; + break; + case MemberParserCondition.LE: + flag = num2 <= Parser.ConditionResult; + break; + case MemberParserCondition.LT: + flag = num2 < Parser.ConditionResult; + break; + } + } + } + if (flag) + { + mFields[FieldIndex].Name = Parser.MemberName; + mFields[FieldIndex].Offset = ByteIndex; + mFields[FieldIndex].Type = Parser.MemberType; + switch (Parser.MemberType) + { + case MemberParserType.BYTE: + mFields[FieldIndex].Value = mData[ByteIndex++]; + break; + case MemberParserType.WORD: + mFields[FieldIndex].Value = BitConverter.ToInt16(mData, ByteIndex); + ByteIndex += 2; + break; + case MemberParserType.PackedWORD: + { + int num6 = mData[ByteIndex++]; + if ((num6 & 0x80) != 0) + { + num6 = ((num6 & 0x7F) << 8) | mData[ByteIndex++]; + } + mFields[FieldIndex].Value = num6; + break; + } + case MemberParserType.DWORD: + mFields[FieldIndex].Value = BitConverter.ToInt32(mData, ByteIndex); + ByteIndex += 4; + break; + case MemberParserType.PackedDWORD: + { + int num6 = BitConverter.ToInt16(mData, ByteIndex); + ByteIndex += 2; + if ((num6 & 0x8000) != 0) + { + num6 = ((num6 & 0x7FFF) << 16) | (BitConverter.ToInt16(mData, ByteIndex) & 0xFFFF); + ByteIndex += 2; + } + mFields[FieldIndex].Value = num6; + break; + } + case MemberParserType.QWORD: + mFields[FieldIndex].Value = BitConverter.ToInt64(mData, ByteIndex); + ByteIndex += 8; + break; + case MemberParserType.@float: + mFields[FieldIndex].Value = BitConverter.ToSingle(mData, ByteIndex); + ByteIndex += 4; + break; + case MemberParserType.@double: + mFields[FieldIndex].Value = BitConverter.ToDouble(mData, ByteIndex); + ByteIndex += 8; + break; + case MemberParserType.String: + { + int num6 = BitConverter.ToInt16(mData, ByteIndex); + ByteIndex += 2; + if (num6 == -1) + { + num6 = BitConverter.ToInt32(mData, ByteIndex); + ByteIndex += 4; + } + StringBuilder stringBuilder = new StringBuilder(num6); + for (int j = 0; j < num6; j++) + { + stringBuilder.Append(encoding.GetChars(mData, ByteIndex++, 1)); + } + mFields[FieldIndex].Value = stringBuilder.ToString(); + ByteIndex = (ByteIndex + 3) & -4; + break; + } + case MemberParserType.WString: + { + int num6 = mData[ByteIndex++]; + if ((num6 & 0x80) != 0) + { + num6 = ((num6 & 0x7F) << 8) | mData[ByteIndex++]; + } + StringBuilder stringBuilder = new StringBuilder(num6); + for (int i = 0; i < num6; i++) + { + stringBuilder.Append(BitConverter.ToChar(mData, ByteIndex)); + ByteIndex += 2; + } + mFields[FieldIndex].Value = stringBuilder.ToString(); + break; + } + case MemberParserType.Struct: + { + MessageStruct messageStruct = new MessageStruct(mData, ByteIndex, Parser.Child, this, FieldIndex); + messageStruct.ParseStruct(); + ByteIndex += messageStruct.mLength; + mFields[FieldIndex].Value = messageStruct; + break; + } + case MemberParserType.Vector: + { + MessageStruct messageStruct = this; + object obj; + do + { + obj = messageStruct[Parser.LengthField]; + if (obj != null) + { + break; + } + messageStruct = messageStruct.mParent; + } + while (messageStruct != null); + long num4 = 0L; + if (obj != null) + { + Type type2 = obj.GetType(); + if (type2.Equals(typeof(int))) + { + num4 = Convert.ToInt64(obj); + num4 &= 0xFFFFFFFFu; + } + else if (type2.Equals(typeof(short))) + { + num4 = Convert.ToInt64(obj); + num4 &= 0xFFFF; + } + else if (type2.Equals(typeof(byte))) + { + num4 = Convert.ToInt64(obj); + num4 &= 0xFF; + } + else if (type2.Equals(typeof(long))) + { + num4 = Convert.ToInt64(obj); + } + } + long num5 = Parser.LengthMask; + num4 &= num5; + if (num5 != 0L) + { + while ((num5 & 1) == 0L) + { + num4 >>= 1; + num5 >>= 1; + } + } + messageStruct = new MessageStruct(mData, ByteIndex, Parser.Child, (int)num4 + Parser.LengthDelta, this, FieldIndex); + messageStruct.ParseVector(); + ByteIndex += messageStruct.mLength; + mFields[FieldIndex].Value = messageStruct; + break; + } + case MemberParserType.Case: + { + int num3 = FieldIndex; + ParseHelper(Parser.Child, ref FieldIndex, ref ByteIndex); + if (FieldIndex > num3) + { + FieldIndex--; + } + break; + } + } + mFields[FieldIndex].Length = ByteIndex - mFields[FieldIndex].Offset; + } + if (Parser.PostAlignment != 0) + { + int num7 = ByteIndex % Parser.PostAlignment; + if (num7 != 0) + { + num7 = Parser.PostAlignment - num7; + ByteIndex += num7; + if (flag) + { + mFields[FieldIndex].Length += num7; + } + } + } + if (flag) + { + FieldIndex++; + } + Parser = Parser.Next; + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/NetworkMessageEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/NetworkMessageEventArgs.cs new file mode 100644 index 0000000..4a202c3 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/NetworkMessageEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace Decal.Adapter; + +public class NetworkMessageEventArgs : EventArgs +{ + private Message myMsg; + + public Message Message => myMsg; + + internal NetworkMessageEventArgs(Message msg) + { + myMsg = msg; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/PluginBase.cs b/Managed/Decal.Adapter/Decal.Adapter/PluginBase.cs new file mode 100644 index 0000000..4f156c4 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/PluginBase.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Decal.Adapter.Wrappers; + +namespace Decal.Adapter; + +[CLSCompliant(true)] +public abstract class PluginBase : Extension, IViewHandler +{ + private PluginHost myHost; + + private EventHandler myGraphicsReset; + + private BindingFlags myBindingFlags; + + private Dictionary myViews; + + protected PluginHost Host => myHost; + + public ViewWrapper DefaultView => myViews["Default"]; + + public BindingFlags BindingFlags => myBindingFlags; + + [CLSCompliant(false)] + protected event EventHandler ServerDispatch + { + add + { + if (base.Core.EchoFilter != null) + { + base.Core.EchoFilter.ServerDispatch += value; + } + } + remove + { + if (base.Core.EchoFilter != null) + { + base.Core.EchoFilter.ServerDispatch -= value; + } + } + } + + [CLSCompliant(false)] + protected event EventHandler ClientDispatch + { + add + { + if (base.Core.EchoFilter != null) + { + base.Core.EchoFilter.ClientDispatch += value; + } + } + remove + { + if (base.Core.EchoFilter != null) + { + base.Core.EchoFilter.ClientDispatch -= value; + } + } + } + + protected event EventHandler GraphicsReset + { + add + { + myGraphicsReset = (EventHandler)Delegate.Combine(myGraphicsReset, value); + if (myHost != null) + { + myHost.Render.DeviceLost += value; + } + } + remove + { + myGraphicsReset = (EventHandler)Delegate.Remove(myGraphicsReset, value); + if (myHost != null) + { + myHost.Render.DeviceLost -= value; + } + } + } + + protected PluginBase() + : base(DecalExtensionType.Plugin) + { + myBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + } + + internal override void Wireup() + { + if (myGraphicsReset != null) + { + Host.Render.DeviceLost += myGraphicsReset; + } + scanBaseEvents(connect: true); + myViews = new Dictionary(); + PluginHost.LoadViewHandler(this); + } + + internal override void UnWire() + { + if (myGraphicsReset != null) + { + Host.Render.DeviceLost -= myGraphicsReset; + } + scanBaseEvents(connect: false); + foreach (ViewWrapper value in myViews.Values) + { + value.Dispose(); + } + myViews.Clear(); + } + + internal void SetHost(PluginHost newHost) + { + myHost = newHost; + } + + private void scanBaseEvents(bool connect) + { + Type type = GetType(); + Type type2 = base.Core.GetType(); + if (!Attribute.IsDefined(type, typeof(WireUpBaseEventsAttribute))) + { + return; + } + MethodInfo[] methods = type.GetMethods(BindingFlags); + foreach (MethodInfo methodInfo in methods) + { + if (!Attribute.IsDefined(methodInfo, typeof(BaseEventAttribute))) + { + continue; + } + Attribute[] customAttributes = Attribute.GetCustomAttributes(methodInfo, typeof(BaseEventAttribute)); + for (int j = 0; j < customAttributes.Length; j++) + { + BaseEventAttribute baseEventAttribute = (BaseEventAttribute)customAttributes[j]; + object obj; + Type type3; + if (baseEventAttribute.FilterName == string.Empty) + { + obj = this; + type3 = type; + } + else + { + PropertyInfo property = type2.GetProperty(baseEventAttribute.FilterName, BindingFlags.Instance | BindingFlags.Public); + if (property == null) + { + continue; + } + obj = property.GetValue(base.Core, null); + type3 = obj.GetType(); + } + EventInfo eventInfo = null; + while ((eventInfo = type3.GetEvent(baseEventAttribute.EventName, BindingFlags)) == null && type3 == type) + { + type3 = type2; + obj = base.Core; + } + if (!(eventInfo == null)) + { + if (connect) + { + eventInfo.GetAddMethod(nonPublic: true).Invoke(obj, new object[1] { Delegate.CreateDelegate(eventInfo.EventHandlerType, this, methodInfo.Name) }); + } + else + { + eventInfo.GetRemoveMethod(nonPublic: true).Invoke(obj, new object[1] { Delegate.CreateDelegate(eventInfo.EventHandlerType, this, methodInfo.Name) }); + } + } + } + } + } + + public void LoadView(string name, string resource) + { + myViews.Add(name, Host.LoadViewResource(resource, GetType().Assembly)); + } + + public ViewWrapper GetView(string name) + { + if (myViews.TryGetValue(name, out var value)) + { + return value; + } + return null; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/PluginProxy.cs b/Managed/Decal.Adapter/Decal.Adapter/PluginProxy.cs new file mode 100644 index 0000000..d094f2e --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/PluginProxy.cs @@ -0,0 +1,68 @@ +using System; +using Decal.Adapter.Support; +using Decal.Adapter.Wrappers; +using Decal.Interop.Core; + +namespace Decal.Adapter; + +public sealed class PluginProxy : IPlugin2, IDecalDirectory +{ + private PluginHost mySite; + + private PluginBase myWrapped; + + internal PluginProxy(PluginBase toWrap) + { + myWrapped = toWrap; + } + + void IPlugin2.Initialize(PluginSite2 Site) + { + mySite = new PluginHost(Site); + myWrapped.SetHost(mySite); + try + { + myWrapped.standardEvent(ExtensionEvents.InternalWireup); + } + catch (Exception ex) + { + Util.WriteLine("InternalWireup Exception: " + ex.Message); + } + try + { + myWrapped.standardEvent(ExtensionEvents.Startup); + } + catch (Exception ex2) + { + Util.WriteLine("Startup Exception: " + ex2.Message); + } + } + + void IPlugin2.Terminate() + { + try + { + myWrapped.standardEvent(ExtensionEvents.Shutdown); + } + catch (Exception ex) + { + Util.WriteLine("Shutdown Exception: " + ex.Message); + } + try + { + myWrapped.standardEvent(ExtensionEvents.InternalUnwire); + } + catch (Exception ex2) + { + Util.WriteLine("InternalUnwire Exception: " + ex2.Message); + } + mySite.Dispose(); + mySite = null; + myWrapped = null; + } + + object IDecalDirectory.Lookup(string strName) + { + return myWrapped.ResolvePath(strName); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/RegionChange3DEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/RegionChange3DEventArgs.cs new file mode 100644 index 0000000..a3ff29a --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/RegionChange3DEventArgs.cs @@ -0,0 +1,33 @@ +using System; +using System.Drawing; + +namespace Decal.Adapter; + +public class RegionChange3DEventArgs : EventArgs +{ + private int myLeft; + + private int myRight; + + private int myTop; + + private int myBottom; + + public int Left => myLeft; + + public int Right => myRight; + + public int Top => myTop; + + public int Bottom => myBottom; + + public Rectangle Rect => new Rectangle(myLeft, myTop, myRight - myLeft, myBottom - myTop); + + internal RegionChange3DEventArgs(int left, int top, int right, int bottom) + { + myLeft = left; + myTop = top; + myRight = right; + myBottom = bottom; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/RenderViolationException.cs b/Managed/Decal.Adapter/Decal.Adapter/RenderViolationException.cs new file mode 100644 index 0000000..d2fd6e8 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/RenderViolationException.cs @@ -0,0 +1,11 @@ +using System; + +namespace Decal.Adapter; + +internal class RenderViolationException : Exception +{ + internal RenderViolationException(string message) + : base(message) + { + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/RuntimePolicyHelper.cs b/Managed/Decal.Adapter/Decal.Adapter/RuntimePolicyHelper.cs new file mode 100644 index 0000000..f38780c --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/RuntimePolicyHelper.cs @@ -0,0 +1,53 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Decal.Adapter; + +internal static class RuntimePolicyHelper +{ + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")] + private interface ICLRRuntimeInfo + { + void xGetVersionString(); + + void xGetRuntimeDirectory(); + + void xIsLoaded(); + + void xIsLoadable(); + + void xLoadErrorString(); + + void xLoadLibrary(); + + void xGetProcAddress(); + + void xGetInterface(); + + void xSetDefaultStartupFlags(); + + void xGetDefaultStartupFlags(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void BindAsLegacyV2Runtime(); + } + + public static bool LegacyV2RuntimeEnabledSuccessfully { get; private set; } + + static RuntimePolicyHelper() + { + ICLRRuntimeInfo iCLRRuntimeInfo = (ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject(Guid.Empty, typeof(ICLRRuntimeInfo).GUID); + try + { + iCLRRuntimeInfo.BindAsLegacyV2Runtime(); + LegacyV2RuntimeEnabledSuccessfully = true; + } + catch (COMException) + { + LegacyV2RuntimeEnabledSuccessfully = false; + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ServiceBase.cs b/Managed/Decal.Adapter/Decal.Adapter/ServiceBase.cs new file mode 100644 index 0000000..65c6f65 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ServiceBase.cs @@ -0,0 +1,36 @@ +namespace Decal.Adapter; + +public abstract class ServiceBase : Extension +{ + internal enum ServiceEventType + { + BeforePlugins, + AfterPluigins + } + + public ServiceBase() + : base(DecalExtensionType.Service) + { + } + + internal void ServiceEvent(ServiceEventType evt) + { + switch (evt) + { + case ServiceEventType.BeforePlugins: + OnBeforePlugins(); + break; + case ServiceEventType.AfterPluigins: + OnAfterPlugins(); + break; + } + } + + protected virtual void OnBeforePlugins() + { + } + + protected virtual void OnAfterPlugins() + { + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ServiceProxy.cs b/Managed/Decal.Adapter/Decal.Adapter/ServiceProxy.cs new file mode 100644 index 0000000..9cf7d0a --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ServiceProxy.cs @@ -0,0 +1,38 @@ +using Decal.Interop.Core; + +namespace Decal.Adapter; + +public sealed class ServiceProxy : IDecalService, IDecalDirectory +{ + private ServiceBase wrapped; + + internal ServiceProxy(ServiceBase toWrap) + { + wrapped = toWrap; + } + + void IDecalService.AfterPlugins() + { + wrapped.ServiceEvent(ServiceBase.ServiceEventType.AfterPluigins); + } + + void IDecalService.BeforePlugins() + { + wrapped.ServiceEvent(ServiceBase.ServiceEventType.BeforePlugins); + } + + void IDecalService.Initialize(DecalCore pDecal) + { + wrapped.standardEvent(ExtensionEvents.Startup); + } + + void IDecalService.Terminate() + { + wrapped.standardEvent(ExtensionEvents.Shutdown); + } + + object IDecalDirectory.Lookup(string strName) + { + return wrapped.ResolvePath(strName); + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/StatusTextInterceptEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/StatusTextInterceptEventArgs.cs new file mode 100644 index 0000000..9265cbc --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/StatusTextInterceptEventArgs.cs @@ -0,0 +1,12 @@ +namespace Decal.Adapter; + +public class StatusTextInterceptEventArgs : EatableEventArgs +{ + public string Text { get; protected set; } + + internal StatusTextInterceptEventArgs(string text, bool eat) + : base(eat) + { + Text = text; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/Surrogate.cs b/Managed/Decal.Adapter/Decal.Adapter/Surrogate.cs new file mode 100644 index 0000000..06d8aae --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/Surrogate.cs @@ -0,0 +1,263 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using Decal.Adapter.Support; +using Decal.Interop.Core; +using Decal.Interop.Net; +using Microsoft.Win32; + +namespace Decal.Adapter; + +[ComVisible(true)] +[ClassInterface(ClassInterfaceType.None)] +[ComDefaultInterface(typeof(IAdapterSurrogate))] +[ProgId("DecalAdapter.Surrogate")] +[Guid("71A69713-6593-47EC-0002-0000000DECA1")] +public sealed class Surrogate : MarshalByRefObject, IAdapterSurrogate, IDecalFileSurrogate +{ + private string myAssemblyName; + + private string myPath; + + private string myTypeName; + + string IAdapterSurrogate.Version + { + get + { + CoreManager current = CoreManager.Current; + if (current == null) + { + current = CoreManager.Current; + } + if (File.Exists(Path.Combine(myPath, myAssemblyName))) + { + return FileVersionInfo.GetVersionInfo(Path.Combine(myPath, myAssemblyName)).FileVersion; + } + return ""; + } + } + + bool IAdapterSurrogate.FileExists => File.Exists(Path.Combine(myPath, myAssemblyName)); + + string IAdapterSurrogate.FilePath => Path.Combine(myPath, myAssemblyName); + + string IDecalFileSurrogate.Description => "Decal.Adapter Extension"; + + string IDecalFileSurrogate.Extension => "dll"; + + IntPtr IAdapterSurrogate.CreateInstance(DecalEnum pInitData, ref Guid riid) + { + if (CoreManager.ServiceRunning) + { + CoreManager current = CoreManager.Current; + try + { + myTypeName = (string)((dynamic)(IDecalEnum)pInitData).get_Property("Object"); + myAssemblyName = (string)((dynamic)(IDecalEnum)pInitData).get_Property("Assembly"); + myPath = (string)((dynamic)(IDecalEnum)pInitData).get_Property("Path"); + Assembly assembly = ((!(pInitData.Group == "Plugins")) ? current.Assembly(myAssemblyName, myPath) : current.Assembly(myAssemblyName, myPath, current.PluginDomain)); + Type type = assembly.GetType(myTypeName); + if (null == type) + { + throw new COMHResultException(HResults.E_FAIL); + } + IntPtr ppv; + if (type.IsSubclassOf(typeof(Extension))) + { + Extension extension = ((!type.IsSubclassOf(typeof(PluginBase))) ? ((Extension)Activator.CreateInstance(type, null)) : ((Extension)current.PluginDomain.CreateInstanceFromAndUnwrap(Path.Combine(myPath, myAssemblyName), myTypeName))); + extension.Path = myPath; + object obj = null; + switch (extension.ExtensionType) + { + case DecalExtensionType.Service: + if (extension is ServiceBase serviceBase) + { + current.AddService(serviceBase); + obj = new ServiceProxy(serviceBase); + } + break; + case DecalExtensionType.NetworkFilter: + if (extension is FilterBase filterBase) + { + current.AddFilter(filterBase); + obj = new FilterProxy(filterBase); + } + break; + case DecalExtensionType.Plugin: + if (extension is PluginBase pluginBase) + { + current.AddPlugin(pluginBase); + obj = new PluginProxy(pluginBase); + } + break; + } + IntPtr pUnk = ((obj == null) ? Marshal.GetIUnknownForObject(extension) : Marshal.GetIUnknownForObject(obj)); + int num = Marshal.QueryInterface(pUnk, ref riid, out ppv); + Marshal.Release(pUnk); + if (num < 0) + { + throw new Exception(); + } + return ppv; + } + object? o = Activator.CreateInstance(type, null); + if (!type.IsSubclassOf(typeof(INetworkFilter))) + { + type.IsSubclassOf(typeof(INetworkFilter2)); + } + IntPtr iUnknownForObject = Marshal.GetIUnknownForObject(o); + Marshal.QueryInterface(iUnknownForObject, ref riid, out ppv); + Marshal.Release(iUnknownForObject); + return ppv; + } + catch + { + throw new COMHResultException(HResults.E_FAIL); + } + finally + { + Marshal.ReleaseComObject(pInitData); + } + } + Marshal.ReleaseComObject(pInitData); + throw new COMHResultException(HResults.E_FAIL); + } + + void IAdapterSurrogate.SetEnum(DecalEnum pInitData) + { + try + { + myTypeName = (string)((dynamic)(IDecalEnum)pInitData).get_Property("Object"); + myAssemblyName = (string)((dynamic)(IDecalEnum)pInitData).get_Property("Assembly"); + myPath = (string)((dynamic)(IDecalEnum)pInitData).get_Property("Path"); + Marshal.ReleaseComObject(pInitData); + } + catch (COMException) + { + } + } + + void IDecalFileSurrogate.Register(string Filename) + { + bool flag = false; + int num = 0; + int num2 = 0; + try + { + if (File.Exists(Filename)) + { + Assembly assembly = Assembly.LoadFile(Filename); + string text = ""; + if (Attribute.IsDefined(assembly, typeof(GuidAttribute))) + { + text = ((GuidAttribute)Attribute.GetCustomAttribute(assembly, typeof(GuidAttribute))).Value.ToUpper(CultureInfo.InvariantCulture); + } + Type[] types; + try + { + types = assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + types = ex.Types; + } + Type[] array = types; + foreach (Type type in array) + { + if (null == type || !type.IsPublic) + { + continue; + } + int num3 = 0; + if (!type.IsSubclassOf(typeof(Extension))) + { + continue; + } + string directoryName = Path.GetDirectoryName(Filename); + string fileName = Path.GetFileName(Filename); + string value = ""; + string value2 = "{71A69713-6593-47EC-0002-0000000DECA1}"; + string text2 = ""; + if (type.IsSubclassOf(typeof(PluginBase))) + { + text2 = "Plugins"; + num++; + num3 = num; + } + else + { + if (!type.IsSubclassOf(typeof(FilterBase))) + { + continue; + } + text2 = "NetworkFilters"; + num2++; + num3 = num2; + } + if (Attribute.IsDefined(type, typeof(FriendlyNameAttribute))) + { + value = ((FriendlyNameAttribute)Attribute.GetCustomAttribute(type, typeof(FriendlyNameAttribute))).Name; + } + string text3 = type.Namespace.ToString() + "." + type.Name.ToString(); + string text4 = ""; + if (Attribute.IsDefined(type, typeof(GuidAttribute))) + { + text4 = ((GuidAttribute)Attribute.GetCustomAttribute(type, typeof(GuidAttribute))).Value.ToString(); + } + else if (!string.IsNullOrEmpty(text) && num3 == 1) + { + text4 = text; + } + else if (!string.IsNullOrEmpty(text)) + { + byte[] array2 = new Guid(text).ToByteArray(); + array2[15] = (byte)(array2[15] ^ num3); + text4 = new Guid(array2).ToString(); + } + else + { + text4 = Guid.NewGuid().ToString(); + } + text4 = text4.ToUpper(CultureInfo.InvariantCulture); + string subkey = string.Format("SOFTWARE\\Decal\\{0}\\{1}", text2, "{" + text4 + "}"); + Util.WriteLine("Registering Decal.Adapter extension (Type:" + type.ToString() + ")"); + Util.WriteLine("Assembly Directory: " + directoryName); + Util.WriteLine("Assembly File: " + fileName); + Util.WriteLine("Assembly Object: " + text3); + Util.WriteLine("Extension Registry CLSID: " + text4); + RegistryKey registryKey = Registry.LocalMachine.CreateSubKey(subkey); + if (registryKey != null) + { + registryKey.SetValue("Enabled", 0, RegistryValueKind.DWord); + registryKey.SetValue("Assembly", fileName, RegistryValueKind.String); + registryKey.SetValue("Path", directoryName, RegistryValueKind.String); + registryKey.SetValue("Object", text3, RegistryValueKind.String); + registryKey.SetValue("Surrogate", value2, RegistryValueKind.String); + if (!string.IsNullOrEmpty(value)) + { + registryKey.SetValue("", value, RegistryValueKind.String); + } + else + { + registryKey.SetValue("", text3, RegistryValueKind.String); + } + flag = true; + } + } + } + } + catch (Exception ex2) + { + Util.WriteLine("Exception registering plugin: " + ex2.ToString()); + throw new COMHResultException(HResults.E_FAIL); + } + if (!flag) + { + throw new COMHResultException(HResults.E_FAIL); + } + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/TextBoxChangeEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/TextBoxChangeEventArgs.cs new file mode 100644 index 0000000..d1c97b8 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/TextBoxChangeEventArgs.cs @@ -0,0 +1,14 @@ +namespace Decal.Adapter; + +public class TextBoxChangeEventArgs : ControlEventArgs +{ + private string text; + + public string Text => text; + + internal TextBoxChangeEventArgs(int ID, string text) + : base(ID) + { + this.text = text; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/TextBoxEndEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/TextBoxEndEventArgs.cs new file mode 100644 index 0000000..c4a6e72 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/TextBoxEndEventArgs.cs @@ -0,0 +1,14 @@ +namespace Decal.Adapter; + +public class TextBoxEndEventArgs : ControlEventArgs +{ + private bool success; + + public bool Success => success; + + internal TextBoxEndEventArgs(int ID, bool success) + : base(ID) + { + this.success = success; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ViewAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/ViewAttribute.cs new file mode 100644 index 0000000..01a794b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ViewAttribute.cs @@ -0,0 +1,16 @@ +using System; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] +public sealed class ViewAttribute : ViewBaseAttribute +{ + private string myResource; + + public string Resource => myResource; + + public ViewAttribute(string resource) + { + myResource = resource; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ViewBaseAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/ViewBaseAttribute.cs new file mode 100644 index 0000000..d7cdf25 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ViewBaseAttribute.cs @@ -0,0 +1,25 @@ +using System; + +namespace Decal.Adapter; + +public abstract class ViewBaseAttribute : Attribute +{ + private string myName; + + public string ViewName + { + get + { + return myName; + } + set + { + myName = value; + } + } + + protected ViewBaseAttribute() + { + myName = "Default"; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/ViewHandler.cs b/Managed/Decal.Adapter/Decal.Adapter/ViewHandler.cs new file mode 100644 index 0000000..036cb26 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/ViewHandler.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Decal.Adapter.Wrappers; + +namespace Decal.Adapter; + +[CLSCompliant(true)] +public class ViewHandler : IViewHandler, IDisposable +{ + private Dictionary myViews; + + private BindingFlags myBindingFlags; + + private PluginHost myHost; + + private bool isDisposed; + + protected bool IsDisposed => isDisposed; + + protected PluginHost Host => myHost; + + public ViewWrapper DefaultView => myViews["Default"]; + + public BindingFlags BindingFlags => myBindingFlags; + + public ViewHandler(PluginHost host) + { + myBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + myViews = new Dictionary(); + myHost = host; + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing && myViews != null) + { + foreach (ViewWrapper value in myViews.Values) + { + value.Dispose(); + } + myViews.Clear(); + myViews = null; + } + isDisposed = true; + } + + internal void LoadComplete() + { + OnLoad(); + } + + protected virtual void OnLoad() + { + } + + public void LoadView(string name, string resource) + { + myViews.Add(name, Host.LoadViewResource(resource, GetType().Assembly)); + } + + public ViewWrapper GetView(string name) + { + if (myViews.TryGetValue(name, out var value)) + { + return value; + } + return null; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/WindowMessageEventArgs.cs b/Managed/Decal.Adapter/Decal.Adapter/WindowMessageEventArgs.cs new file mode 100644 index 0000000..7a8112b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/WindowMessageEventArgs.cs @@ -0,0 +1,29 @@ +namespace Decal.Adapter; + +public class WindowMessageEventArgs : EatableEventArgs +{ + private int myHwnd; + + private short myMsg; + + private int mywParam; + + private int mylParam; + + public int Hwnd => myHwnd; + + public short Msg => myMsg; + + public int WParam => mywParam; + + public int LParam => mylParam; + + internal WindowMessageEventArgs(int hwnd, short uMsg, int wParam, int lParam) + : base(eat: false) + { + myHwnd = hwnd; + myMsg = uMsg; + mywParam = wParam; + mylParam = lParam; + } +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/WireUpBaseEventsAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/WireUpBaseEventsAttribute.cs new file mode 100644 index 0000000..98151f4 --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/WireUpBaseEventsAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Class)] +public sealed class WireUpBaseEventsAttribute : Attribute +{ +} diff --git a/Managed/Decal.Adapter/Decal.Adapter/WireUpControlEventsAttribute.cs b/Managed/Decal.Adapter/Decal.Adapter/WireUpControlEventsAttribute.cs new file mode 100644 index 0000000..49e954b --- /dev/null +++ b/Managed/Decal.Adapter/Decal.Adapter/WireUpControlEventsAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace Decal.Adapter; + +[AttributeUsage(AttributeTargets.Class)] +public sealed class WireUpControlEventsAttribute : Attribute +{ +} diff --git a/Managed/Decal.Adapter/Properties/AssemblyInfo.cs b/Managed/Decal.Adapter/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1abc2cc --- /dev/null +++ b/Managed/Decal.Adapter/Properties/AssemblyInfo.cs @@ -0,0 +1,24 @@ +using System; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.ConstrainedExecution; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; +using System.Security.Permissions; + +[assembly: AssemblyTitle("Decal.Adapter Framework")] +[assembly: AssemblyDescription("The Core services of Decal.Adapter, to enable authoring of .NET native extensions to Decal, including both Plugins and NetFilters")] +[assembly: AssemblyConfiguration("Ship")] +[assembly: AssemblyCompany("Decal Development")] +[assembly: AssemblyProduct("Decal.Adapter")] +[assembly: AssemblyCopyright("Copyright © Decal Development 2005")] +[assembly: AssemblyTrademark("")] +[assembly: ComVisible(false)] +[assembly: Guid("9e1dcd9e-3c90-4352-a77e-79d3564bde9d")] +[assembly: CLSCompliant(false)] +[assembly: ReliabilityContract(Consistency.MayCorruptProcess, Cer.None)] +[assembly: InternalsVisibleTo("Decal.Adapter.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001009f838824242905ab6215c625e21a8a15b32cff744781d3cf0d66f422db07ebd2c57d01191c0a449a6922830ff63bb9a042c8ae1b89ec08fa5c8ccf80bf1f2d2655c812d67827a6dcefa24ccdff305e39df76453be52016d8b9fd8438d799846d4eb96b9ff28e411f8e243ebc009552d52784783aed7cebe169a3fdd0f8f1a3ab")] +[assembly: AssemblyFileVersion("2.9.8.3")] +[assembly: SecurityPermission(SecurityAction.RequestMinimum)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Core/ACHooksImpl.cs b/Managed/Decal.Core/ACHooksImpl.cs new file mode 100644 index 0000000..33f3f6a --- /dev/null +++ b/Managed/Decal.Core/ACHooksImpl.cs @@ -0,0 +1,281 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Core; + +namespace Decal.Core +{ + [ComVisible(true)] + [Guid("CB8875CD-ABC2-42AD-8175-8908706EED37")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Core.IACHooksEvents\0\0")] + [ProgId("Decal.ACHooks")] + public class ACHooksImpl : IACHooks + { + // COM events + public event IACHooksEvents_ObjectDestroyedEventHandler ObjectDestroyed; + public event IACHooksEvents_ChatTextInterceptEventHandler ChatTextIntercept; + public event IACHooksEvents_ChatParserInterceptEventHandler ChatParserIntercept; + public event IACHooksEvents_StatusTextInterceptEventHandler StatusTextIntercept; + public event IACHooksEvents_ObjectSelectedEventHandler ObjectSelected; + public event IACHooksEvents_MessageProcessedEventHandler MessageProcessed; + public event IACHooksEvents_AC3DRegionChangedEventHandler AC3DRegionChanged; + public event IACHooksEvents_ContainerOpenedEventHandler ContainerOpened; + public event IACHooksEvents_ChatClickInterceptEventHandler ChatClickIntercept; + public event IACHooksEvents_RenderPreUIEventHandler RenderPreUI; + + private DecalCoreImpl _decal; + private IIdentifyFilter _idFilter; + + // State + private int _currentSelection; + private int _previousSelection; + private int _selectedStackCount; + private int _maxSelectedStackCount; + private int _combatMode; + private int _vendorId; + private int _busyState; + private int _busyStateId; + private int _pointerState; + private int _commandInterpreter; + private int _openedContainer; + private bool _chatState; + private double _headingDegrees; + private double _headingRadians; + private int _landcell; + private double _locationX, _locationY, _locationZ; + private tagRECT _ac3dRegionRect; + private tagRECT _acWindowRect; + + public void SetIDFilter(IIdentifyFilter pIDFilter) => _idFilter = pIDFilter; + + public void SetDecal(object pDecal) + { + _decal = pDecal as DecalCoreImpl; + } + + // Hook availability + public int HooksAvail => + (int)(eAvailableHooks.eCurrentSelect | eAvailableHooks.ePrevSelect | + eAvailableHooks.eCastSpell | eAvailableHooks.eMoveItem | + eAvailableHooks.eSelectItem | eAvailableHooks.eUseItem | + eAvailableHooks.eCombatMode | eAvailableHooks.eChatState | + eAvailableHooks.eStackCount | eAvailableHooks.eMaxStackCount | + eAvailableHooks.eVendorID | eAvailableHooks.eBusyState | + eAvailableHooks.eBusyStateID | eAvailableHooks.ePointerState | + eAvailableHooks.eMoveItemEx | eAvailableHooks.ePosition | + eAvailableHooks.eFaceHeading | eAvailableHooks.eAC3DRegion | + eAvailableHooks.eObjectDestroyed | eAvailableHooks.eSendTell | + eAvailableHooks.eSetAutorun | eAvailableHooks.eSetCombatMode | + eAvailableHooks.eGetMiscInt | eAvailableHooks.eGetAttribute | + eAvailableHooks.eGetSkill | eAvailableHooks.eGetVital | + eAvailableHooks.eHooksAvailEx); + + public bool HooksAvailEx => true; + + // Chat methods + public void AddChatText(string szText, int lColor, int lTarget) + { + // In the open-source version, we fire this through the chat event system + bool eat = false; + ChatTextIntercept?.Invoke(szText, lColor, lTarget, ref eat); + } + + public void AddChatTextRaw(string szText, int lColor, int lTarget) + { + AddChatText(szText, lColor, lTarget); + } + + public void AddStatusText(string Text) + { + bool eat = false; + StatusTextIntercept?.Invoke(Text, ref eat); + } + + public void InvokeChatParser(string Text) + { + bool eat = false; + ChatParserIntercept?.Invoke(Text, ref eat); + } + + public void SetIdleTime(double dIdleTimeout) { } + + public void Logout() { } + + // Selection + public int CurrentSelection { get => _currentSelection; set => _currentSelection = value; } + public int PreviousSelection { get => _previousSelection; set => _previousSelection = value; } + public int SelectedStackCount { get => _selectedStackCount; set => _selectedStackCount = value; } + public int MaxSelectedStackCount => _maxSelectedStackCount; + + public void SetCursorPosition(int lX, int lY) { } + + // Window/region info + public tagRECT AC3DRegionRect => _ac3dRegionRect; + public IntPtr AC3DRegionRectPtr => IntPtr.Zero; + public tagRECT ACWindowRect => _acWindowRect; + + // State properties + public bool ChatState => _chatState; + public int BusyState => _busyState; + public int BusyStateID => _busyStateId; + public int PointerState => _pointerState; + public int VendorID => _vendorId; + + // Vendor operations + public void VendorBuyListAdd(int lID, int lAmount) { } + public void VendorBuyListClear() { } + public void VendorBuyAll() { } + public void VendorSellListAdd(int lID) { } + public void VendorSellListClear() { } + public void VendorSellAll() { } + + // Combat + public int CombatMode => _combatMode; + public void SetCombatMode(int pVal) { _combatMode = pVal; } + public void SetAutorun(bool bOnOff) { } + public bool FaceHeading(float fHeading, bool bUnknown) { return true; } + + public int CommandInterpreter => _commandInterpreter; + + // Item operations + public void SelectItem(int lObjectID) + { + _previousSelection = _currentSelection; + _currentSelection = lObjectID; + ObjectSelected?.Invoke(lObjectID); + } + + public void GiveItem(int lObject, int lDestination) { } + public void ApplyItem(int UseThis, int OnThis) { } + public void UseItem(int lObjectID, int lUseState) { } + public void UseItemRaw(int lObjectID, int lUseState, int lUseMethod) { } + public void MoveItem(int lObjectID, int lPackID, int lSlot, bool bStack) { } + public void MoveItemEx(int lObjectID, int lDestinationID) { } + public void MoveItemExRaw(int lObject, int lDestination, int lMoveFlags) { } + public void DropItem(int lObjectID) { } + + // Spell casting + public void CastSpell(int lSpellID, int lObjectID) { } + + // Object queries + public bool IsValidObject(int lGUID) => false; + public int GetWeenieObjectPtr(int lObjectID) => 0; + public int GetPhysicsObjectPtr(int lObjectID) => 0; + + // Position + public double HeadingDegrees => _headingDegrees; + public double HeadingRadians => _headingRadians; + public int Landcell => _landcell; + public double LocationX => _locationX; + public double LocationY => _locationY; + public double LocationZ => _locationZ; + + // Character stats (parameterized properties — index-based access) + public eTrainLevel SkillTrainLevel => eTrainLevel.eUntrained; + public int SkillTotalXP => 0; + public int SkillFreePoints => 0; + public int SkillClicks => 0; + public int AttributeTotalXP => 0; + public int AttributeClicks => 0; + public int AttributeStart => 0; + public int VitalTotalXP => 0; + public int VitalClicks => 0; + public int Vital => 0; + public int Attribute => 0; + public int Skill => 0; + public int Misc => 0; + + // ID/object operations + public void RequestID(int lObjectID) { _idFilter?.AddToQueue(lObjectID); } + public void IDQueueAdd(int lObjectID) { _idFilter?.AddToQueue(lObjectID); } + + // Spell bar + public void SpellTabAdd(int lTab, int lIndex, int lSpellID) { } + public void SpellTabDelete(int lTab, int lSpellID) { } + + // Trade + public void TradeAdd(int ItemID) { } + public void TradeAccept() { } + public void TradeDecline() { } + public void TradeReset() { } + public void TradeEnd() { } + + // Salvage + public void SalvagePanelAdd(int lObjectID) { } + public void SalvagePanelSalvage() { } + + public int OpenedContainer => _openedContainer; + + // Experience + public void AddSkillExp(eSkill SkillID, int lExperience) { } + public void AddAttributeExp(eAttribute AttribID, int lExperience) { } + public void AddVitalExp(eVital VitalID, int lExperience) { } + + public int SmartboxPtr() => 0; + public float ObjectHeight(int lObjectID) => 0f; + + public int CallerRefInstanceInternal { set { } } + + // Equipment + public void AutoWieldRaw(int lObjectID, int SlotID, int Explicit, int NotExplicit, int zeroVal1, int zeroVal2) { } + public void AutoWield(int lObjectID) { } + public void AutoWieldEx(int lObjectID, int SlotID, int Explicit, int NotExplicit) { } + + // Fellowship + public void FellowshipRecruit(int lObjectID) { } + public void FellowshipGrantLeader(int lObjectID) { } + public void FellowshipSetOpen(bool IsOpen) { } + public void FellowshipQuit() { } + public void FellowshipDisband() { } + public void FellowshipDismiss(int lObjectID) { } + + // UI + public void UIElementMove(int lUIElementType, int X, int Y) { } + public void UIElementResize(int lUIElementType, int Width, int Height) { } + public int UIElementLookup(int lUIElementType) => 0; + public tagRECT UIElementRegionRect(int lUIElementType) => default; + + // Internal event firing methods + internal void FireObjectDestroyed(int guid) => ObjectDestroyed?.Invoke(guid); + internal void FireContainerOpened(int guid) => ContainerOpened?.Invoke(guid); + internal void FireRenderPreUI() => RenderPreUI?.Invoke(); + + internal void FireChatText(string text, int color, int target, ref bool eat) + { + ChatTextIntercept?.Invoke(text, color, target, ref eat); + } + + internal void FireChatParser(string text, ref bool eat) + { + ChatParserIntercept?.Invoke(text, ref eat); + } + + internal void FireStatusText(string text, ref bool eat) + { + StatusTextIntercept?.Invoke(text, ref eat); + } + + internal void FireObjectSelected(int guid) => ObjectSelected?.Invoke(guid); + + internal void FireAC3DRegionChanged(int left, int top, int right, int bottom) + { + _ac3dRegionRect = new tagRECT { left = left, top = top, right = right, bottom = bottom }; + AC3DRegionChanged?.Invoke(left, top, right, bottom); + } + + internal void FireChatClick(string text, int id, ref bool eat) + { + ChatClickIntercept?.Invoke(text, id, ref eat); + } + + internal void UpdatePosition(double x, double y, double z, int landcell, double headDeg, double headRad) + { + _locationX = x; + _locationY = y; + _locationZ = z; + _landcell = landcell; + _headingDegrees = headDeg; + _headingRadians = headRad; + } + } +} diff --git a/Managed/Decal.Core/Decal.Core.csproj b/Managed/Decal.Core/Decal.Core.csproj new file mode 100644 index 0000000..d77abc9 --- /dev/null +++ b/Managed/Decal.Core/Decal.Core.csproj @@ -0,0 +1,6 @@ + + + + + + diff --git a/Managed/Decal.Core/DecalCoreImpl.cs b/Managed/Decal.Core/DecalCoreImpl.cs new file mode 100644 index 0000000..cb37e60 --- /dev/null +++ b/Managed/Decal.Core/DecalCoreImpl.cs @@ -0,0 +1,346 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Microsoft.Win32; + +namespace Decal.Core +{ + [ComVisible(true)] + [Guid("4557D5A1-00DB-48F6-ACB3-4FEF30E2F358")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Core.IDecalEvents\0\0")] + [ProgId("Decal.DecalCore")] + public class DecalCoreImpl : IDecalCore + { + // COM events + public event IDecalEvents_InitializeCompleteEventHandler InitializeComplete; + public event IDecalEvents_TerminateCompleteEventHandler TerminateComplete; + + // Services and plugins + private struct ServiceEntry + { + public Guid Clsid; + public IDecalService Service; + public IDecalRender Renderer; + } + + private readonly List _services = new List(); + private readonly List _plugins = new List(); + private readonly ACHooksImpl _hooks = new ACHooksImpl(); + private bool _servicesRunning; + private bool _pluginsRunning; + + // Graphics + private object _d3dDevice; + private int _hwnd; + private int _screenWidth = 800; + private int _screenHeight = 600; + + internal ACHooksImpl ACHooksInstance => _hooks; + + // IDecalCore implementation + public void InitGraphics(object pD3DDevice) + { + _d3dDevice = pD3DDevice; + + // Notify render services + foreach (var svc in _services) + { + svc.Renderer?.ChangeDirectX(); + } + } + + public object GetD3DDevice(ref Guid riid) => _d3dDevice; + + public int HWND + { + get => _hwnd; + set + { + _hwnd = value; + foreach (var svc in _services) + svc.Renderer?.ChangeHWND(); + } + } + + public bool Focus => true; + + public void SendWM(int HWND, short uMsg, int wParam, int lParam, ref bool pbEat) + { + pbEat = false; + } + + public void GetScreenSize(out int pWidth, out int pHeight) + { + pWidth = _screenWidth; + pHeight = _screenHeight; + } + + public string MapPath(string pPath) + { + if (string.IsNullOrEmpty(pPath)) return pPath; + + string result = pPath; + int pos = 0; + + while (pos < result.Length) + { + int start = result.IndexOf('%', pos); + if (start < 0) break; + + int end = result.IndexOf('%', start + 1); + if (end < 0) break; + + string token = result.Substring(start + 1, end - start - 1); + string resolved = ResolveToken(token); + result = result.Substring(0, start) + resolved + result.Substring(end + 1); + pos = start + resolved.Length; + } + + return result; + } + + private string ResolveToken(string token) + { + string lower = token.ToLowerInvariant(); + if (lower == "ac" || lower.StartsWith("ac:")) + { + try + { + using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Turbine\Asheron's Call")) + { + return key?.GetValue("Path") as string ?? ""; + } + } + catch { return ""; } + } + + if (lower == "decal" || lower.StartsWith("decal:")) + { + try + { + using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Decal\Agent")) + { + return key?.GetValue("AgentPath") as string ?? ""; + } + } + catch { return ""; } + } + + return "%" + token + "%"; + } + + public void StartPlugins() + { + if (_pluginsRunning) return; + if (!_servicesRunning) StartServices(); + + // Notify services: before plugins + foreach (var svc in _services) + svc.Service.BeforePlugins(); + + // Enumerate and load plugins from registry + var pluginEnum = new DecalEnumImpl(); + pluginEnum.Initialize("Plugins"); + + try + { + pluginEnum.Next(); // Move to first + while (true) + { + if (pluginEnum.Enabled) + { + try + { + var riid = typeof(IPlugin2).GUID; + var pluginObj = pluginEnum.CreateInstance(ref riid); + var plugin = pluginObj as IPlugin2; + if (plugin != null) + { + var site = new PluginSite2Impl(); + site.Setup(this, plugin, pluginEnum.ComClass); + _plugins.Add(site); + + plugin.Initialize((PluginSite2)(object)site); + } + } + catch { } // Bad plugins are skipped + } + pluginEnum.Next(); + } + } + catch { } // Next() throws when past end + + _pluginsRunning = true; + + // Notify services: after plugins + foreach (var svc in _services) + svc.Service.AfterPlugins(); + + InitializeComplete?.Invoke(eDecalComponentType.ePlugin); + } + + public void StopPlugins() + { + if (!_pluginsRunning) return; + + // Unload all plugins (copy list since Unload modifies it) + var sites = new List(_plugins); + foreach (var site in sites) + { + try { site.Unload(); } catch { } + } + _plugins.Clear(); + + _pluginsRunning = false; + + // Notify services: after plugins stopped + foreach (var svc in _services) + { + try { svc.Service.AfterPlugins(); } catch { } + } + + TerminateComplete?.Invoke(eDecalComponentType.ePlugin); + } + + public object Object => null; + + public void StartServices() + { + if (_servicesRunning) return; + + // Initialize ACHooks first + _hooks.SetDecal(this); + + // Enumerate and load services from registry + var serviceEnum = new DecalEnumImpl(); + serviceEnum.Initialize("Services"); + + try + { + serviceEnum.Next(); + while (true) + { + if (serviceEnum.Enabled) + { + try + { + var riid = typeof(IDecalService).GUID; + var svcObj = serviceEnum.CreateInstance(ref riid); + var service = svcObj as IDecalService; + if (service != null) + { + service.Initialize((DecalCore)(object)this); + + // Check for render capability + IDecalRender renderer = svcObj as IDecalRender; + + _services.Add(new ServiceEntry + { + Clsid = serviceEnum.ComClass, + Service = service, + Renderer = renderer + }); + } + } + catch { } // Service init failure - skip + } + serviceEnum.Next(); + } + } + catch { } // Next() throws when past end + + _servicesRunning = true; + InitializeComplete?.Invoke(eDecalComponentType.eService); + } + + public DecalEnum Configuration + { + get + { + var e = new DecalEnumImpl(); + e.Initialize("Plugins"); + return (DecalEnum)(object)e; + } + } + + public void StopServices() + { + if (!_servicesRunning) return; + if (_pluginsRunning) StopPlugins(); + + // Stop services in reverse order (LIFO) + for (int i = _services.Count - 1; i >= 0; i--) + { + try { _services[i].Service.Terminate(); } catch { } + } + _services.Clear(); + + _servicesRunning = false; + TerminateComplete?.Invoke(eDecalComponentType.eService); + } + + public object Plugin => null; + public object Service => null; + + public void Render2D() + { + foreach (var svc in _services) + svc.Renderer?.Render2D(); + } + + public void Render3D() + { + _hooks.FireRenderPreUI(); + foreach (var svc in _services) + svc.Renderer?.Render3D(); + } + + public void PreReset() + { + foreach (var svc in _services) + svc.Renderer?.PreReset(); + } + + public void PostReset() + { + foreach (var svc in _services) + svc.Renderer?.PostReset(); + } + + public ACHooks Hooks => (ACHooks)(object)_hooks; + + public void StartFilters() + { + // Filters are started as part of services + } + + public void StopFilters() + { + // Filters are stopped as part of services + } + + public bool KillBitCheckByGUID(string bstrGuid, string bstrVersion) => false; + public bool KillBitCheckByProgID(string bstProgID, string bstrVersion) => false; + + public bool PluginsRunning => _pluginsRunning; + + // Internal methods for PluginSite2 + internal void RemovePlugin(PluginSite2Impl site) => _plugins.Remove(site); + + internal object GetService(Guid clsid) + { + foreach (var svc in _services) + if (svc.Clsid == clsid) return svc.Service; + return null; + } + + internal object GetPlugin(Guid clsid) + { + foreach (var site in _plugins) + if (site.PluginClsid == clsid) return site.Plugin; + return null; + } + } +} diff --git a/Managed/Decal.Core/DecalEnumImpl.cs b/Managed/Decal.Core/DecalEnumImpl.cs new file mode 100644 index 0000000..b22d5fb --- /dev/null +++ b/Managed/Decal.Core/DecalEnumImpl.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Microsoft.Win32; + +namespace Decal.Core +{ + [ComVisible(true)] + [Guid("6DE65A82-C451-46E6-A82D-92137BE851AD")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("Decal.DecalEnum")] + public class DecalEnumImpl : IDecalEnum + { + private class EnumEntry + { + public string FriendlyName = ""; + public Guid ComClass; + public bool Enabled = true; + public bool Restricted; + public Guid SurrogateClass; + public string ResourcePath = ""; + public string FilePath = ""; + public string Version = ""; + public int Order; + } + + private readonly List _entries = new List(); + private int _index = -1; + private string _group = ""; + + private EnumEntry Current => (_index >= 0 && _index < _entries.Count) ? _entries[_index] : null; + + public string FriendlyName => Current?.FriendlyName ?? ""; + public Guid ComClass => Current?.ComClass ?? Guid.Empty; + + public bool Enabled + { + get => Current?.Enabled ?? false; + set + { + var c = Current; + if (c == null) return; + c.Enabled = value; + try + { + using (var key = Registry.LocalMachine.OpenSubKey( + $@"SOFTWARE\Decal\{_group}\{c.ComClass:B}", true)) + { + key?.SetValue("Enabled", value ? 1 : 0, RegistryValueKind.DWord); + } + } + catch { } + } + } + + public bool Restricted => Current?.Restricted ?? false; + + public object CreateInstance(ref Guid riid) + { + var entry = Current; + if (entry == null) return null; + + // If there's a surrogate, use it + if (entry.SurrogateClass != Guid.Empty) + { + var surrogateType = Type.GetTypeFromCLSID(entry.SurrogateClass); + if (surrogateType != null) + { + var surrogate = Activator.CreateInstance(surrogateType) as IDecalSurrogate; + if (surrogate != null) + return surrogate.CreateInstance((DecalEnum)(object)this, ref riid); + } + } + + // Direct COM creation + var type = Type.GetTypeFromCLSID(entry.ComClass); + return type != null ? Activator.CreateInstance(type) : null; + } + + public void Next() + { + _index++; + if (_index >= _entries.Count) + Marshal.ThrowExceptionForHR(1); // S_FALSE + } + + public Guid SurrogateClass => Current?.SurrogateClass ?? Guid.Empty; + public string ResourcePath => Current?.ResourcePath ?? ""; + public object Property => null; // Parameterized — returns registry values by name + public string Group => _group; + + public void Skip(ref Guid clsid) + { + for (int i = 0; i < _entries.Count; i++) + { + if (_entries[i].ComClass == clsid) + { + _index = i; + return; + } + } + } + + public void MoveBefore(ref Guid clsidBefore) + { + if (_index < 0 || _index >= _entries.Count) return; + var current = _entries[_index]; + _entries.RemoveAt(_index); + + int targetIdx = _entries.Count; + for (int i = 0; i < _entries.Count; i++) + { + if (_entries[i].ComClass == clsidBefore) + { + targetIdx = i; + break; + } + } + _entries.Insert(targetIdx, current); + _index = targetIdx; + } + + public string Version => Current?.Version ?? ""; + + public bool FileExists + { + get + { + var path = Current?.FilePath; + return !string.IsNullOrEmpty(path) && File.Exists(path); + } + } + + public string FilePath => Current?.FilePath ?? ""; + + internal void Initialize(string group) + { + _group = group; + _entries.Clear(); + _index = -1; + + try + { + using (var baseKey = Registry.LocalMachine.OpenSubKey($@"SOFTWARE\Decal\{group}")) + { + if (baseKey == null) return; + + string orderStr = baseKey.GetValue("Order") as string ?? ""; + + foreach (string subKeyName in baseKey.GetSubKeyNames()) + { + if (!Guid.TryParse(subKeyName, out var clsid)) + continue; + + using (var subKey = baseKey.OpenSubKey(subKeyName)) + { + if (subKey == null) continue; + + var entry = new EnumEntry + { + FriendlyName = subKey.GetValue(null) as string ?? subKeyName, + ComClass = clsid, + Enabled = ((int)(subKey.GetValue("Enabled") ?? 1)) != 0, + Restricted = ((int)(subKey.GetValue("Restricted") ?? 0)) != 0, + ResourcePath = subKey.GetValue("ResourcePath") as string ?? "", + FilePath = subKey.GetValue("File") as string ?? "", + Version = subKey.GetValue("Version") as string ?? "", + }; + + var surrogateStr = subKey.GetValue("Surrogate") as string; + if (!string.IsNullOrEmpty(surrogateStr) && Guid.TryParse(surrogateStr, out var surr)) + entry.SurrogateClass = surr; + + var orderVal = subKey.GetValue("Order") as string; + if (!string.IsNullOrEmpty(orderVal) && orderVal.Length > 0) + { + int pos = orderStr.IndexOf(orderVal[0]); + entry.Order = pos >= 0 ? pos : int.MaxValue; + } + else + { + entry.Order = int.MaxValue; + } + + _entries.Add(entry); + } + } + } + + _entries.Sort((a, b) => a.Order.CompareTo(b.Order)); + } + catch { } + } + + internal int Count => _entries.Count; + } +} diff --git a/Managed/Decal.Core/PluginSite2Impl.cs b/Managed/Decal.Core/PluginSite2Impl.cs new file mode 100644 index 0000000..0bad74f --- /dev/null +++ b/Managed/Decal.Core/PluginSite2Impl.cs @@ -0,0 +1,93 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Core; + +namespace Decal.Core +{ + [ComVisible(true)] + [Guid("E2284FC7-17E5-4846-ADAB-07953273C5FB")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("Decal.PluginSite2")] + public class PluginSite2Impl : IPluginSite2 + { + private DecalCoreImpl _decal; + private IPlugin2 _plugin; + private Guid _pluginClsid; + + internal void Setup(DecalCoreImpl decal, IPlugin2 plugin, Guid pluginClsid) + { + _decal = decal; + _plugin = plugin; + _pluginClsid = pluginClsid; + } + + public void Unload() + { + if (_plugin != null) + { + try { _plugin.Terminate(); } catch { } + _plugin = null; + } + _decal?.RemovePlugin(this); + } + + public object Object + { + get + { + // Parameterized property: returns service/plugin objects by path + // Path format: "services\{CLSID}" or "plugins\{CLSID}" + return null; + } + } + + public DecalCore Decal => (DecalCore)(object)_decal; + public ACHooks Hooks => (ACHooks)(object)_decal?.ACHooksInstance; + + public object PluginSite => this; + + public void RegisterSinks(object pPlugin) + { + // Register event sinks for the plugin + // This connects COM event sources to the plugin's event handlers + } + + internal IPlugin2 Plugin => _plugin; + internal Guid PluginClsid => _pluginClsid; + + internal object LookupObject(string path) + { + if (string.IsNullOrEmpty(path) || _decal == null) + return null; + + // Parse path: "collection\{CLSID}\subpath..." + string[] parts = path.Split('\\'); + if (parts.Length < 2) return null; + + string collection = parts[0].ToLowerInvariant(); + if (!Guid.TryParse(parts[1], out var clsid)) + return null; + + object obj = null; + + if (collection == "services") + obj = _decal.GetService(clsid); + else if (collection == "plugins") + obj = _decal.GetPlugin(clsid); + + // If there are additional path segments, use IDecalDirectory for nested lookup + if (obj != null && parts.Length > 2) + { + for (int i = 2; i < parts.Length; i++) + { + if (obj is IDecalDirectory dir) + obj = dir.Lookup(parts[i]); + else + return null; + } + } + + return obj; + } + } +} diff --git a/Managed/Decal.D3DService/D3DObjImpl.cs b/Managed/Decal.D3DService/D3DObjImpl.cs new file mode 100644 index 0000000..97bcf25 --- /dev/null +++ b/Managed/Decal.D3DService/D3DObjImpl.cs @@ -0,0 +1,67 @@ +using System.Runtime.InteropServices; +using Decal.Interop.D3DService; + +namespace Decal.D3DService +{ + [ComVisible(true)] + [Guid("81E79859-2783-4B9A-ADC4-308073F5BB3F")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("D3DService.CD3DObj")] + public class D3DObjImpl : ID3DObj + { + private float _scaleX = 1, _scaleY = 1, _scaleZ = 1; + private bool _autoscale; + private int _color, _color2; + private float _pFade; + private float _pBounce, _hBounce; + private float _pOrbit, _rOrbit; + private float _pSpin; + private bool _visible = true; + private bool _drawBackface; + private float _animationPhaseOffset; + + // Appearance + public void SetIcon(int icon) { } + public void SetIconFromResource(int hmodule, int idr) { } + public void SetIconFromFile(string bstrFilename) { } + public void SetShape(eShape shape) { } + public void SetShapeFromResource(int hmodule, int idr) { } + public void SetShapeFromFile(string bstrFilename) { } + public void SetScale(float scale) { _scaleX = _scaleY = _scaleZ = scale; } + public void Set2DText(string szText, string szFont, int options) { } + public void Set3DText(string szText, string szFont, int options) { } + + // Scale + public float scaleX { get => _scaleX; set => _scaleX = value; } + public float scaleY { get => _scaleY; set => _scaleY = value; } + public float scaleZ { get => _scaleZ; set => _scaleZ = value; } + public bool autoscale { get => _autoscale; set => _autoscale = value; } + + // Color + public int color { get => _color; set => _color = value; } + public int color2 { get => _color2; set => _color2 = value; } + + // Effects + public float pFade { get => _pFade; set => _pFade = value; } + public float pBounce { get => _pBounce; set => _pBounce = value; } + public float hBounce { get => _hBounce; set => _hBounce = value; } + public float pOrbit { get => _pOrbit; set => _pOrbit = value; } + public float rOrbit { get => _rOrbit; set => _rOrbit = value; } + public float pSpin { get => _pSpin; set => _pSpin = value; } + public float AnimationPhaseOffset { get => _animationPhaseOffset; set => _animationPhaseOffset = value; } + + // Anchoring + public void AnchorToObject(int guid, float fractHeight, float dx, float dy, float dz) { } + public void AnchorToCoords(float lat, float lng, float alt) { } + + // Orientation + public void OrientToCamera(bool fTilt) { } + public void OrientToPlayer(bool fTilt) { } + public void OrientToObject(int guid, float fractHeight, bool fTilt) { } + public void OrientToCoords(float lat, float lng, float alt, bool fTilt) { } + + // Visibility + public bool visible { get => _visible; set => _visible = value; } + public bool drawBackface { get => _drawBackface; set => _drawBackface = value; } + } +} diff --git a/Managed/Decal.D3DService/D3DServiceImpl.cs b/Managed/Decal.D3DService/D3DServiceImpl.cs new file mode 100644 index 0000000..e455199 --- /dev/null +++ b/Managed/Decal.D3DService/D3DServiceImpl.cs @@ -0,0 +1,160 @@ +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.D3DService; + +namespace Decal.D3DService +{ + [ComVisible(true)] + [Guid("F0CC07A0-2C89-4FA4-9356-714665BC2F8B")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("D3DService.CService")] + public class D3DServiceImpl : ID3DService, IDecalService, IDecalRender + { + private readonly List _objects = new List(); + + private CD3DObj CreateObj() + { + var obj = new D3DObjImpl(); + _objects.Add(obj); + return (CD3DObj)(object)obj; + } + + // ID3DService + public CD3DObj NewD3DObj() => CreateObj(); + + public CD3DObj PointToObject(int guid, int color) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetShape(eShape.eVArrow); + ((ID3DObj)obj).color = color; + ((ID3DObj)obj).AnchorToObject(guid, 1.0f, 0, 0, 0); + return obj; + } + + public CD3DObj PointToCoords(float lat, float lng, float alt, int color) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetShape(eShape.eVArrow); + ((ID3DObj)obj).color = color; + ((ID3DObj)obj).AnchorToCoords(lat, lng, alt); + return obj; + } + + public CD3DObj MarkObjectWithIcon(int guid, int icon) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetIcon(icon); + ((ID3DObj)obj).AnchorToObject(guid, 1.0f, 0, 0, 0); + return obj; + } + + public CD3DObj MarkObjectWithIconFromFile(int guid, string filename) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetIconFromFile(filename); + ((ID3DObj)obj).AnchorToObject(guid, 1.0f, 0, 0, 0); + return obj; + } + + public CD3DObj MarkObjectWithShape(int guid, eShape shape, int color) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetShape(shape); + ((ID3DObj)obj).color = color; + ((ID3DObj)obj).AnchorToObject(guid, 1.0f, 0, 0, 0); + return obj; + } + + public CD3DObj MarkObjectWithShapeFromFile(int guid, string filename, int color) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetShapeFromFile(filename); + ((ID3DObj)obj).color = color; + ((ID3DObj)obj).AnchorToObject(guid, 1.0f, 0, 0, 0); + return obj; + } + + public CD3DObj MarkCoordsWithIcon(float lat, float lng, float alt, int icon) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetIcon(icon); + ((ID3DObj)obj).AnchorToCoords(lat, lng, alt); + return obj; + } + + public CD3DObj MarkCoordsWithIconFromFile(float lat, float lng, float alt, string filename) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetIconFromFile(filename); + ((ID3DObj)obj).AnchorToCoords(lat, lng, alt); + return obj; + } + + public CD3DObj MarkCoordsWithShape(float lat, float lng, float alt, eShape shape, int color) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetShape(shape); + ((ID3DObj)obj).color = color; + ((ID3DObj)obj).AnchorToCoords(lat, lng, alt); + return obj; + } + + public CD3DObj MarkCoordsWithShapeFromFile(float lat, float lng, float alt, string filename, int color) + { + var obj = CreateObj(); + ((ID3DObj)obj).SetShapeFromFile(filename); + ((ID3DObj)obj).color = color; + ((ID3DObj)obj).AnchorToCoords(lat, lng, alt); + return obj; + } + + public void TraceOneFrame() { } + + public CD3DObj MarkObjectWith2DText(int guid, string szText, string szFont, int options) + { + var obj = CreateObj(); + ((ID3DObj)obj).Set2DText(szText, szFont, options); + ((ID3DObj)obj).AnchorToObject(guid, 1.0f, 0, 0, 0); + return obj; + } + + public CD3DObj MarkObjectWith3DText(int guid, string szText, string szFont, int options) + { + var obj = CreateObj(); + ((ID3DObj)obj).Set3DText(szText, szFont, options); + ((ID3DObj)obj).AnchorToObject(guid, 1.0f, 0, 0, 0); + return obj; + } + + public CD3DObj MarkCoordsWith2DText(float lat, float lng, float alt, string szText, string szFont, int options) + { + var obj = CreateObj(); + ((ID3DObj)obj).Set2DText(szText, szFont, options); + ((ID3DObj)obj).AnchorToCoords(lat, lng, alt); + return obj; + } + + public CD3DObj MarkCoordsWith3DText(float lat, float lng, float alt, string szText, string szFont, int options) + { + var obj = CreateObj(); + ((ID3DObj)obj).Set3DText(szText, szFont, options); + ((ID3DObj)obj).AnchorToCoords(lat, lng, alt); + return obj; + } + + // IDecalService + public void Initialize(DecalCore pDecal) { } + public void BeforePlugins() { } + public void AfterPlugins() { } + public void Terminate() { _objects.Clear(); } + + // IDecalRender + public void Render2D() { } + public void Render3D() { } + public void PreReset() { } + public void PostReset() { } + public void ChangeHWND() { } + public void ChangeDirectX() { } + } +} diff --git a/Managed/Decal.D3DService/Decal.D3DService.csproj b/Managed/Decal.D3DService/Decal.D3DService.csproj new file mode 100644 index 0000000..f1c40c0 --- /dev/null +++ b/Managed/Decal.D3DService/Decal.D3DService.csproj @@ -0,0 +1,6 @@ + + + + + + diff --git a/Managed/Decal.DHS/Decal.DHS.csproj b/Managed/Decal.DHS/Decal.DHS.csproj new file mode 100644 index 0000000..84e3809 --- /dev/null +++ b/Managed/Decal.DHS/Decal.DHS.csproj @@ -0,0 +1,10 @@ + + + Decal.DHS + Decal.DHS + + + + + + diff --git a/Managed/Decal.DHS/HotkeyImpl.cs b/Managed/Decal.DHS/HotkeyImpl.cs new file mode 100644 index 0000000..aa40b74 --- /dev/null +++ b/Managed/Decal.DHS/HotkeyImpl.cs @@ -0,0 +1,19 @@ +using System.Runtime.InteropServices; +using Decal.Interop.DHS; + +namespace Decal.DHS +{ + [ComVisible(true)] + [Guid("F5AA853D-CCF3-4562-A654-3A68AB583BCC")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DHS.Hotkey")] + public class HotkeyImpl : IHotkey + { + public string EventTitle { get; set; } + public string EventDescription { get; set; } + public bool AltState { get; set; } + public bool ControlState { get; set; } + public bool ShiftState { get; set; } + public int VirtualKey { get; set; } + } +} diff --git a/Managed/Decal.DHS/HotkeySystemImpl.cs b/Managed/Decal.DHS/HotkeySystemImpl.cs new file mode 100644 index 0000000..f2bfd00 --- /dev/null +++ b/Managed/Decal.DHS/HotkeySystemImpl.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.DHS; + +namespace Decal.DHS +{ + internal class RegisteredHotkey + { + public string PluginCookie; + public HotkeyImpl Hotkey; + } + + [ComVisible(true)] + [Guid("6B6B9FA8-37DE-4FA3-8C60-52BD6A2F9855")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces(typeof(_IHotkeySystemEvents))] + [ProgId("DHS.HotkeySystem")] + public class HotkeySystemImpl : IHotkeySystem, IDecalService + { + private readonly List _hotkeys = new List(); + private readonly Dictionary _connectedPlugins = new Dictionary(); + + // COM event — raised when a hotkey fires + public event _IHotkeySystemEvents_HotkeyEventEventHandler HotkeyEvent; + + public void AddHotkey(string szPlugin, Hotkey pHotkey) + { + var impl = pHotkey as HotkeyImpl; + if (impl == null) + { + // Wrap foreign IHotkey implementation + impl = new HotkeyImpl + { + EventTitle = ((IHotkey)pHotkey).EventTitle, + EventDescription = ((IHotkey)pHotkey).EventDescription, + AltState = ((IHotkey)pHotkey).AltState, + ControlState = ((IHotkey)pHotkey).ControlState, + ShiftState = ((IHotkey)pHotkey).ShiftState, + VirtualKey = ((IHotkey)pHotkey).VirtualKey + }; + } + + _hotkeys.Add(new RegisteredHotkey + { + PluginCookie = szPlugin, + Hotkey = impl + }); + } + + public bool QueryHotkey(string bstrTitle) + { + foreach (var rh in _hotkeys) + { + if (string.Equals(rh.Hotkey.EventTitle, bstrTitle, StringComparison.OrdinalIgnoreCase)) + return true; + } + return false; + } + + public Hotkey QueryHotkeyEx(string szPluginCookie, string szTitle) + { + foreach (var rh in _hotkeys) + { + if (string.Equals(rh.PluginCookie, szPluginCookie, StringComparison.OrdinalIgnoreCase) && + string.Equals(rh.Hotkey.EventTitle, szTitle, StringComparison.OrdinalIgnoreCase)) + { + return (Hotkey)(object)rh.Hotkey; + } + } + return null; + } + + public void Connect(object pPlugin) + { + // Plugin implements IDHSHotkeyEvents for receiving hotkey notifications + var events = pPlugin as IDHSHotkeyEvents; + if (events != null) + { + _connectedPlugins[pPlugin] = events; + } + } + + public void DeleteHotkey(string szPluginCookie, string szHotkeyName) + { + _hotkeys.RemoveAll(rh => + string.Equals(rh.PluginCookie, szPluginCookie, StringComparison.OrdinalIgnoreCase) && + string.Equals(rh.Hotkey.EventTitle, szHotkeyName, StringComparison.OrdinalIgnoreCase)); + } + + /// + /// Called by the input system when a key combination matches a registered hotkey. + /// Fires the HotkeyEvent and notifies connected plugins. + /// + internal bool FireHotkey(string eventTitle) + { + bool eat = false; + + // Fire COM connection point event + HotkeyEvent?.Invoke(eventTitle, ref eat); + if (eat) return true; + + // Notify connected plugins via IDHSHotkeyEvents + foreach (var plugin in _connectedPlugins.Values) + { + try + { + if (plugin.OnHotkey(eventTitle)) + return true; + } + catch + { + // Plugin error — don't propagate + } + } + + return false; + } + + /// + /// Check if a key press matches any registered hotkey and fire it. + /// + internal bool ProcessKey(int virtualKey, bool alt, bool ctrl, bool shift) + { + foreach (var rh in _hotkeys) + { + var hk = rh.Hotkey; + if (hk.VirtualKey == virtualKey && + hk.AltState == alt && + hk.ControlState == ctrl && + hk.ShiftState == shift) + { + if (FireHotkey(hk.EventTitle)) + return true; + } + } + return false; + } + + // IDecalService implementation + public void Initialize(DecalCore pDecal) + { + // DHS doesn't need DecalCore reference directly + } + + public void BeforePlugins() + { + } + + public void AfterPlugins() + { + } + + public void Terminate() + { + _hotkeys.Clear(); + _connectedPlugins.Clear(); + } + } +} diff --git a/Managed/Decal.DecalControls/CheckboxImpl.cs b/Managed/Decal.DecalControls/CheckboxImpl.cs new file mode 100644 index 0000000..315b049 --- /dev/null +++ b/Managed/Decal.DecalControls/CheckboxImpl.cs @@ -0,0 +1,45 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("5AE37451-F79C-478A-834E-EDCF95F01B0E")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Controls.ICheckboxEvents\0\0")] + [ProgId("DecalControls.Checkbox")] + public class CheckboxImpl : ControlBase, ICheckbox + { + public event ICheckboxEvents_DestroyEventHandler Destroy; + public event ICheckboxEvents_ChangeEventHandler Change; + + private IFontCache _font; + private string _text = ""; + private int _textColor; + private bool _checked; + private bool _rightToLeft; + + public IFontCache Font { get => _font; set { _font = value; Invalidate(); } } + public string Text { get => _text; set { _text = value; Invalidate(); } } + public int TextColor { get => _textColor; set { _textColor = value; Invalidate(); } } + + public bool Checked + { + get => _checked; + set + { + if (_checked != value) + { + _checked = value; + Invalidate(); + Change?.Invoke(ID, _checked); + } + } + } + + public bool RightToLeft { get => _rightToLeft; set { _rightToLeft = value; Invalidate(); } } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/ChoiceImpl.cs b/Managed/Decal.DecalControls/ChoiceImpl.cs new file mode 100644 index 0000000..93610b8 --- /dev/null +++ b/Managed/Decal.DecalControls/ChoiceImpl.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("E099DC60-0F19-4690-AB7C-8B5834DA286E")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Controls.IChoiceEvents\0\0")] + [ProgId("DecalControls.Choice")] + public class ChoiceImpl : ControlBase, IChoice + { + public event IChoiceEvents_DestroyEventHandler Destroy; + public event IChoiceEvents_ChangeEventHandler Change; + public event IChoiceEvents_DropDownEventHandler DropDown; + + private struct ChoiceItem + { + public string Display; + public object Data; + } + + private readonly List _items = new List(); + private int _selected = -1; + private bool _dropped; + private int _dropLines = 5; + + public void AddChoice(string strDisplay, object vData = null) + { + _items.Add(new ChoiceItem { Display = strDisplay, Data = vData }); + } + + public int ChoiceCount => _items.Count; + + public object Data + { + get => (_selected >= 0 && _selected < _items.Count) ? _items[_selected].Data : null; + set + { + if (_selected >= 0 && _selected < _items.Count) + { + var item = _items[_selected]; + item.Data = value; + _items[_selected] = item; + } + } + } + + public string Text + { + get => (_selected >= 0 && _selected < _items.Count) ? _items[_selected].Display : ""; + set + { + if (_selected >= 0 && _selected < _items.Count) + { + var item = _items[_selected]; + item.Display = value ?? ""; + _items[_selected] = item; + Invalidate(); + } + } + } + + public void RemoveChoice(int nIndex) + { + if (nIndex >= 0 && nIndex < _items.Count) + { + _items.RemoveAt(nIndex); + if (_selected >= _items.Count) _selected = _items.Count - 1; + Invalidate(); + } + } + + public bool Dropped + { + get => _dropped; + set + { + _dropped = value; + if (_dropped) DropDown?.Invoke(ID); + Invalidate(); + } + } + + public int Selected + { + get => _selected; + set + { + if (value >= -1 && value < _items.Count && value != _selected) + { + _selected = value; + Invalidate(); + Change?.Invoke(ID, _selected); + } + } + } + + public int DropLines { get => _dropLines; set { _dropLines = value; Invalidate(); } } + + public void Clear() + { + _items.Clear(); + _selected = -1; + Invalidate(); + } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/ControlBase.cs b/Managed/Decal.DecalControls/ControlBase.cs new file mode 100644 index 0000000..5bec4b3 --- /dev/null +++ b/Managed/Decal.DecalControls/ControlBase.cs @@ -0,0 +1,58 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + public abstract class ControlBase : ILayer, IControl + { + protected Layer _site; + private int _id; + + // ILayer + public void LayerCreate(Layer pSite) + { + _site = pSite; + var site = (ILayerSite)(object)pSite; + _id = site.ID; + OnCreate(); + } + + public void LayerDestroy() + { + OnDestroy(); + _site = null; + } + + public tagRECT Position + { + get + { + if (_site != null) + return ((ILayerSite)(object)_site).Position; + return default; + } + set + { + if (_site != null) + ((ILayerSite)(object)_site).Position = value; + } + } + + public void Invalidate() + { + if (_site != null) + ((ILayerSite)(object)_site).Invalidate(); + } + + // IControl + public void DestroyChild(int nIndex, ePositionType posType) { } + public int ID => _id; + public int ChildCount => (_site != null) ? ((ILayerSite)(object)_site).ChildCount : 0; + public IControl Child => null; + + protected virtual void OnCreate() { } + protected virtual void OnDestroy() { } + } +} diff --git a/Managed/Decal.DecalControls/Decal.DecalControls.csproj b/Managed/Decal.DecalControls/Decal.DecalControls.csproj new file mode 100644 index 0000000..39f7514 --- /dev/null +++ b/Managed/Decal.DecalControls/Decal.DecalControls.csproj @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Managed/Decal.DecalControls/DerethMapImpl.cs b/Managed/Decal.DecalControls/DerethMapImpl.cs new file mode 100644 index 0000000..a42e027 --- /dev/null +++ b/Managed/Decal.DecalControls/DerethMapImpl.cs @@ -0,0 +1,27 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; +using CmdDestroy = Decal.Interop.Inject.ICommandEvents_DestroyEventHandler; +using CmdHit = Decal.Interop.Inject.ICommandEvents_HitEventHandler; +using CmdUnhit = Decal.Interop.Inject.ICommandEvents_UnhitEventHandler; +using CmdAccepted = Decal.Interop.Inject.ICommandEvents_AcceptedEventHandler; +using CmdCanceled = Decal.Interop.Inject.ICommandEvents_CanceledEventHandler; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("3035299A-C5FB-4CC7-A63C-66400B80DCA4")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Inject.ICommandEvents\0\0")] + [ProgId("DecalControls.DerethMap")] + public class DerethMapImpl : ControlBase, IDerethMap + { + public event CmdDestroy Destroy; + public event CmdHit Hit; + public event CmdUnhit Unhit; + public event CmdAccepted Accepted; + public event CmdCanceled Canceled; + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/EditImpl.cs b/Managed/Decal.DecalControls/EditImpl.cs new file mode 100644 index 0000000..5f96def --- /dev/null +++ b/Managed/Decal.DecalControls/EditImpl.cs @@ -0,0 +1,85 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("8E8F88D2-AA47-474E-9DB7-912D49C8BE9D")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Controls.IEditEvents\0\0")] + [ProgId("DecalControls.Edit")] + public class EditImpl : ControlBase, IEdit + { + public event IEditEvents_DestroyEventHandler Destroy; + public event IEditEvents_BeginEventHandler Begin; + public event IEditEvents_ChangeEventHandler Change; + public event IEditEvents_EndEventHandler End; + + private string _text = ""; + private int _caret; + private int _selStart, _selEnd; + private IImageCache _background; + private IFontCache _font; + private int _textColor; + + public string Text + { + get => _text; + set + { + _text = value ?? ""; + _caret = _text.Length; + Invalidate(); + Change?.Invoke(ID, _text); + } + } + + public int Caret { get => _caret; set { _caret = value; Invalidate(); } } + + public void Select(int nStart, int nEnd) + { + _selStart = nStart; + _selEnd = nEnd; + Invalidate(); + } + + public string SelectedText + { + get + { + if (_selStart >= 0 && _selEnd > _selStart && _selEnd <= _text.Length) + return _text.Substring(_selStart, _selEnd - _selStart); + return ""; + } + set + { + if (_selStart >= 0 && _selEnd > _selStart && _selEnd <= _text.Length) + { + _text = _text.Remove(_selStart, _selEnd - _selStart).Insert(_selStart, value ?? ""); + _caret = _selStart + (value?.Length ?? 0); + _selStart = _selEnd = 0; + Invalidate(); + Change?.Invoke(ID, _text); + } + } + } + + public IImageCache Background { get => _background; set { _background = value; Invalidate(); } } + public IFontCache Font { get => _font; set { _font = value; Invalidate(); } } + public int TextColor { get => _textColor; set { _textColor = value; Invalidate(); } } + + public void SetMargins(int nX, int nY) { } + + public void Capture() + { + if (_site != null) + { + ((ILayerSite)(object)_site).CaptureKeyboard(); + Begin?.Invoke(ID); + } + } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/LayoutImpl.cs b/Managed/Decal.DecalControls/LayoutImpl.cs new file mode 100644 index 0000000..33bb272 --- /dev/null +++ b/Managed/Decal.DecalControls/LayoutImpl.cs @@ -0,0 +1,92 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("CD6556CD-F8D9-4CB0-AB7C-7C33058294E4")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Inject.IControlEvents\0\0")] + [ProgId("DecalControls.FixedLayout")] + public class FixedLayoutImpl : ControlBase, ILayout + { + public event IControlEvents_DestroyEventHandler Destroy; + + private IImageCache _background; + + public IImageCache Background { get => _background; set { _background = value; Invalidate(); } } + + public void CreateChild(ref LayerParams @params, ILayer pSink) + { + if (_site != null) + ((ILayerSite)(object)_site).CreateChild(ref @params, pSink); + } + + public void PositionChild(int nID, ref tagRECT prcNew) { } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } + + [ComVisible(true)] + [Guid("CA121762-31BB-4073-8597-33BAB4BDCAA3")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Inject.IControlEvents\0\0")] + [ProgId("DecalControls.BorderLayout")] + public class BorderLayoutImpl : ControlBase, ILayout + { + public event IControlEvents_DestroyEventHandler Destroy; + + private IImageCache _background; + + public IImageCache Background { get => _background; set { _background = value; Invalidate(); } } + + public void CreateEdge(eBorderEdge eEdge, int nSize, ILayer pSink) { } + public void CreateCenter(ILayer pSink) { } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } + + [ComVisible(true)] + [Guid("5AD04D45-D4BF-4729-8A2E-5D37CF726CAA")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Inject.IControlEvents\0\0")] + [ProgId("DecalControls.PageLayout")] + public class PageLayoutImpl : ControlBase, IPageLayout + { + public event IControlEvents_DestroyEventHandler Destroy; + + private IImageCache _background; + private readonly System.Collections.Generic.List _pages = new System.Collections.Generic.List(); + private int _active; + + // ILayout + public IImageCache Background { get => _background; set { _background = value; Invalidate(); } } + + // IPageLayoutDisp + public int Active + { + get => _active; + set + { + if (value >= 0 && value < _pages.Count) + { + _active = value; + Invalidate(); + } + } + } + + public int Count => _pages.Count; + + // IPageLayout + public void CreatePage(ILayer pChild) + { + _pages.Add(pChild); + Invalidate(); + } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/ListColumnImpl.cs b/Managed/Decal.DecalControls/ListColumnImpl.cs new file mode 100644 index 0000000..0f4838b --- /dev/null +++ b/Managed/Decal.DecalControls/ListColumnImpl.cs @@ -0,0 +1,48 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [ClassInterface(ClassInterfaceType.None)] + public abstract class ListColumnBase : IListColumn + { + private int _width = 100; + + public bool FixedWidth => false; + public int Width { get => _width; set => _width = value; } + public int DataColumns => 1; + public int Height => 16; + + public virtual void Render(Canvas canvas, ref tagPOINT ptCell, int nColor) { } + public virtual void Initialize(IList newVal, PluginSite pSite) { } + public virtual void SchemaLoad(object pSchema) { } + public virtual void Activate(ref tagPOINT ptCell) { } + } + + [ComVisible(true)] + [Guid("864DEABF-D079-4B61-A8CF-081418179239")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalControls.TextColumn")] + public class TextColumnImpl : ListColumnBase + { + } + + [ComVisible(true)] + [Guid("F12A2C4C-3B78-46EB-8722-68B27A75AE55")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalControls.IconColumn")] + public class IconColumnImpl : ListColumnBase + { + } + + [ComVisible(true)] + [Guid("48E444F1-8E30-4E4C-B203-4C87FC901586")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalControls.CheckColumn")] + public class CheckColumnImpl : ListColumnBase + { + } +} diff --git a/Managed/Decal.DecalControls/ListImpl.cs b/Managed/Decal.DecalControls/ListImpl.cs new file mode 100644 index 0000000..4043c7e --- /dev/null +++ b/Managed/Decal.DecalControls/ListImpl.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("3839008F-AF5B-43FC-9F6A-3376B99E3DAF")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Controls.IListEvents\0\0")] + [ProgId("DecalControls.List")] + public class ListImpl : ControlBase, IList + { + public event IListEvents_DestroyEventHandler Destroy; + public event IListEvents_ChangeEventHandler Change; + + private readonly List _columns = new List(); + private readonly List _rows = new List(); + private int _scrollPosition; + private bool _autoScroll; + private int _accessRow, _accessCol; + + // IListDisp + public int AddRow() + { + int totalDataCols = 0; + foreach (var col in _columns) + totalDataCols += col.DataColumns; + + _rows.Add(new object[Math.Max(1, totalDataCols)]); + if (_autoScroll) + _scrollPosition = Math.Max(0, _rows.Count - 1); + Invalidate(); + return _rows.Count - 1; + } + + public void DeleteRow(int nIndex) + { + if (nIndex >= 0 && nIndex < _rows.Count) + { + _rows.RemoveAt(nIndex); + Invalidate(); + } + } + + public object Data + { + get + { + if (_accessRow >= 0 && _accessRow < _rows.Count) + { + var row = _rows[_accessRow]; + if (_accessCol >= 0 && _accessCol < row.Length) + return row[_accessCol]; + } + return null; + } + set + { + if (_accessRow >= 0 && _accessRow < _rows.Count) + { + var row = _rows[_accessRow]; + if (_accessCol >= 0 && _accessCol < row.Length) + { + row[_accessCol] = value; + Invalidate(); + Change?.Invoke(ID, _accessCol, _accessRow); + } + } + } + } + + public int RowEstimate { set { } } + public int Count => _rows.Count; + + public int ColumnWidth + { + get => 0; + set { } + } + + public int Color { get; set; } + + public bool AutoScroll { get => _autoScroll; set => _autoScroll = value; } + public int ScrollPosition { get => _scrollPosition; set { _scrollPosition = value; Invalidate(); } } + + public void Clear() + { + _rows.Clear(); + _scrollPosition = 0; + Invalidate(); + } + + public void InsertRow(int lIndex) + { + int totalDataCols = 0; + foreach (var col in _columns) + totalDataCols += col.DataColumns; + + if (lIndex < 0) lIndex = 0; + if (lIndex > _rows.Count) lIndex = _rows.Count; + + _rows.Insert(lIndex, new object[Math.Max(1, totalDataCols)]); + Invalidate(); + } + + public void JumpToPosition(int newVal) + { + _scrollPosition = newVal; + Invalidate(); + } + + public int CountCols => _columns.Count; + + // IList + public int AddColumn(IListColumn pNewColumn) + { + _columns.Add(pNewColumn); + return _columns.Count - 1; + } + + public tagRECT CellRect => default; + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/NotebookImpl.cs b/Managed/Decal.DecalControls/NotebookImpl.cs new file mode 100644 index 0000000..1c75c16 --- /dev/null +++ b/Managed/Decal.DecalControls/NotebookImpl.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("ED14E7C5-11BE-4DFD-9829-873AB6BE3CFC")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Controls.INotebookEvents\0\0")] + [ProgId("DecalControls.Notebook")] + public class NotebookImpl : ControlBase, INotebook + { + public event INotebookEvents_DestroyEventHandler Destroy; + public event INotebookEvents_ChangeEventHandler Change; + + private struct Page + { + public string Text; + public IControl Client; + } + + private readonly List _pages = new List(); + private int _activeTab; + + public void AddPage(string strText, IControl pClient) + { + _pages.Add(new Page { Text = strText ?? "", Client = pClient }); + Invalidate(); + } + + public int ActiveTab + { + get => _activeTab; + set + { + if (value >= 0 && value < _pages.Count && value != _activeTab) + { + _activeTab = value; + Invalidate(); + Change?.Invoke(ID, _activeTab); + } + } + } + + public string PageText + { + get => (_activeTab >= 0 && _activeTab < _pages.Count) ? _pages[_activeTab].Text : ""; + set + { + if (_activeTab >= 0 && _activeTab < _pages.Count) + { + var page = _pages[_activeTab]; + page.Text = value ?? ""; + _pages[_activeTab] = page; + Invalidate(); + } + } + } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/ProgressImpl.cs b/Managed/Decal.DecalControls/ProgressImpl.cs new file mode 100644 index 0000000..c342135 --- /dev/null +++ b/Managed/Decal.DecalControls/ProgressImpl.cs @@ -0,0 +1,42 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("FE361225-6BB7-4AE0-A10C-8A6420621680")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Inject.IControlEvents\0\0")] + [ProgId("DecalControls.Progress")] + public class ProgressImpl : ControlBase, IProgress + { + public event IControlEvents_DestroyEventHandler Destroy; + + private int _value; + private int _faceColor; + private int _fillColor; + private int _textColor; + private int _maxValue = 100; + private string _postText = ""; + private string _alignment = "center"; + private bool _decalDrawText; + private string _preText = ""; + private int _borderWidth; + private int _borderColor; + + public int Value { get => _value; set { _value = value; Invalidate(); } } + public int FaceColor { set { _faceColor = value; Invalidate(); } } + public int FillColor { set { _fillColor = value; Invalidate(); } } + public int TextColor { set { _textColor = value; Invalidate(); } } + public int MaxValue { set { _maxValue = value; Invalidate(); } } + public string PostText { set { _postText = value ?? ""; Invalidate(); } } + public string Alignment { set { _alignment = value ?? "center"; Invalidate(); } } + public bool DecalDrawText { set { _decalDrawText = value; Invalidate(); } } + public string PreText { set { _preText = value ?? ""; Invalidate(); } } + public int BorderWidth { set { _borderWidth = value; Invalidate(); } } + public int BorderColor { set { _borderColor = value; Invalidate(); } } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/PushButtonImpl.cs b/Managed/Decal.DecalControls/PushButtonImpl.cs new file mode 100644 index 0000000..b1f3fbd --- /dev/null +++ b/Managed/Decal.DecalControls/PushButtonImpl.cs @@ -0,0 +1,44 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; +using CmdDestroy = Decal.Interop.Inject.ICommandEvents_DestroyEventHandler; +using CmdHit = Decal.Interop.Inject.ICommandEvents_HitEventHandler; +using CmdUnhit = Decal.Interop.Inject.ICommandEvents_UnhitEventHandler; +using CmdAccepted = Decal.Interop.Inject.ICommandEvents_AcceptedEventHandler; +using CmdCanceled = Decal.Interop.Inject.ICommandEvents_CanceledEventHandler; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("AE4525BE-81D1-40FB-9170-77172077EB49")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Inject.ICommandEvents\0\0")] + [ProgId("DecalControls.PushButton")] + public class PushButtonImpl : ControlBase, IPushButton + { + public event CmdDestroy Destroy; + public event CmdHit Hit; + public event CmdUnhit Unhit; + public event CmdAccepted Accepted; + public event CmdCanceled Canceled; + + private IImageCache _image; + private IFontCache _font; + private string _text = ""; + private int _faceColor; + private int _textColor; + + public IImageCache Image { get => _image; set { _image = value; Invalidate(); } } + public IFontCache Font { get => _font; set { _font = value; Invalidate(); } } + public string Text { get => _text; set { _text = value; Invalidate(); } } + public int FaceColor { get => _faceColor; set { _faceColor = value; Invalidate(); } } + public int TextColor { get => _textColor; set { _textColor = value; Invalidate(); } } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + + internal void FireHit() => Hit?.Invoke(ID); + internal void FireUnhit() => Unhit?.Invoke(ID); + internal void FireAccepted() => Accepted?.Invoke(ID); + internal void FireCanceled() => Canceled?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/ScrollerImpl.cs b/Managed/Decal.DecalControls/ScrollerImpl.cs new file mode 100644 index 0000000..286ee6f --- /dev/null +++ b/Managed/Decal.DecalControls/ScrollerImpl.cs @@ -0,0 +1,67 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("8FC80D21-1731-4816-9AD3-B0364D5F2C27")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Controls.IScrollerEvents\0\0")] + [ProgId("DecalControls.Scroller")] + public class ScrollerImpl : ControlBase, IScroller + { + public event IScrollerEvents_DestroyEventHandler Destroy; + public event IScrollerEvents_ChangeEventHandler Change; + + private tagSIZE _area; + private tagPOINT _offset; + private tagSIZE _increments = new tagSIZE { cx = 1, cy = 1 }; + private bool _horizontalEnabled = true; + private bool _verticalEnabled = true; + + public tagSIZE Viewport + { + get + { + var pos = Position; + return new tagSIZE { cx = pos.right - pos.left, cy = pos.bottom - pos.top }; + } + } + + public tagSIZE Area { get => _area; set { _area = value; Invalidate(); } } + public bool HorizontalEnabled { get => _horizontalEnabled; set { _horizontalEnabled = value; Invalidate(); } } + public bool VerticalEnabled { get => _verticalEnabled; set { _verticalEnabled = value; Invalidate(); } } + + public tagPOINT Offset + { + get => _offset; + set + { + _offset = value; + Invalidate(); + Change?.Invoke(ID, _offset.x, _offset.y); + } + } + + public tagSIZE Increments { get => _increments; set => _increments = value; } + + public void CreateClient(ILayer pChild) { } + + public void ScrollTo(ref tagPOINT ptOffset) + { + _offset = ptOffset; + Invalidate(); + Change?.Invoke(ID, _offset.x, _offset.y); + } + + public void ResetScroller() + { + _offset = default; + Invalidate(); + } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/SliderImpl.cs b/Managed/Decal.DecalControls/SliderImpl.cs new file mode 100644 index 0000000..160cf89 --- /dev/null +++ b/Managed/Decal.DecalControls/SliderImpl.cs @@ -0,0 +1,46 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("5D14557A-1268-43C6-A283-3B5B271359AA")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Controls.ISliderEvents\0\0")] + [ProgId("DecalControls.Slider")] + public class SliderImpl : ControlBase, ISlider + { + public event ISliderEvents_DestroyEventHandler Destroy; + public event ISliderEvents_ChangeEventHandler Change; + + private IFontCache _font; + private int _textColor; + private int _position; + private int _minimum; + private int _maximum = 100; + + public IFontCache Font { get => _font; set { _font = value; Invalidate(); } } + public int TextColor { get => _textColor; set { _textColor = value; Invalidate(); } } + + public int SliderPosition + { + get => _position; + set + { + int clamped = value < _minimum ? _minimum : (value > _maximum ? _maximum : value); + if (_position != clamped) + { + _position = clamped; + Invalidate(); + Change?.Invoke(ID, _position); + } + } + } + + public int Minimum { get => _minimum; set { _minimum = value; Invalidate(); } } + public int Maximum { get => _maximum; set { _maximum = value; Invalidate(); } } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalControls/StaticTextImpl.cs b/Managed/Decal.DecalControls/StaticTextImpl.cs new file mode 100644 index 0000000..6f2b0b5 --- /dev/null +++ b/Managed/Decal.DecalControls/StaticTextImpl.cs @@ -0,0 +1,26 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Controls; +using Decal.Interop.Inject; + +namespace Decal.DecalControls +{ + [ComVisible(true)] + [Guid("4887101C-A9F9-495B-921B-EF22822CFB97")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Inject.IControlEvents\0\0")] + [ProgId("DecalControls.StaticText")] + public class StaticTextImpl : ControlBase, IStatic + { + public event IControlEvents_DestroyEventHandler Destroy; + + private IFontCache _font; + private string _text = ""; + private int _textColor; + + public IFontCache Font { get => _font; set { _font = value; Invalidate(); } } + public string Text { get => _text; set { _text = value; Invalidate(); } } + public int TextColor { get => _textColor; set { _textColor = value; Invalidate(); } } + + protected override void OnDestroy() => Destroy?.Invoke(ID); + } +} diff --git a/Managed/Decal.DecalDat/DatFile.cs b/Managed/Decal.DecalDat/DatFile.cs new file mode 100644 index 0000000..d7bad36 --- /dev/null +++ b/Managed/Decal.DecalDat/DatFile.cs @@ -0,0 +1,213 @@ +using System; +using System.IO; +using System.IO.MemoryMappedFiles; +using System.Runtime.InteropServices; + +namespace Decal.DecalDat +{ + /// + /// Low-level reader for Asheron's Call DAT archive files. + /// DAT files use a sector-based linked-list format with a hierarchical directory. + /// + internal sealed class DatFile : IDisposable + { + private const int FileCount = 62; + private const int FileCountOffset = 0x03E; + private const int RootDirPtrOffset = 0x148; + + // Directory entry layout (packed): + // DWORD subdirs[62] = 248 bytes + // DWORD fileCount = 4 bytes + // FileEntry files[62] = 744 bytes (62 * 12) + // Total = 996 bytes + private const int SubdirsSize = FileCount * 4; + private const int FileEntrySize = 12; // 3 DWORDs: ID, Offset, Size + + private MemoryMappedFile _mmf; + private MemoryMappedViewAccessor _accessor; + private readonly int _sectorSize; + private readonly long _fileLength; + + public DatFile(string filename, int sectorSize = 256) + { + _sectorSize = sectorSize; + + var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + _fileLength = fs.Length; + _mmf = MemoryMappedFile.CreateFromFile(fs, null, 0, MemoryMappedFileAccess.Read, HandleInheritability.None, false); + _accessor = _mmf.CreateViewAccessor(0, _fileLength, MemoryMappedFileAccess.Read); + } + + public DatFileEntry GetFile(uint fileId) + { + uint rootDirOffset = _accessor.ReadUInt32(RootDirPtrOffset); + return FindFile(rootDirOffset, fileId); + } + + private DatFileEntry FindFile(uint dirOffset, uint fileId) + { + // Read file count from directory + uint fileCount = _accessor.ReadUInt32(dirOffset + SubdirsSize); + + // Binary search through sorted file entries + int lo = 0, hi = (int)fileCount - 1; + + while (lo <= hi) + { + int mid = (lo + hi) / 2; + long entryOffset = dirOffset + SubdirsSize + 4 + (mid * FileEntrySize); + uint entryId = _accessor.ReadUInt32(entryOffset); + + if (entryId == fileId) + { + uint offset = _accessor.ReadUInt32(entryOffset + 4); + uint size = _accessor.ReadUInt32(entryOffset + 8); + return new DatFileEntry(this, offset, size); + } + else if (fileId < entryId) + { + // Recurse into left subdirectory + uint subdir = _accessor.ReadUInt32(dirOffset + (uint)(mid * 4)); + if (subdir != 0) + { + try + { + return FindFile(subdir, fileId); + } + catch (FileNotFoundException) + { + // Not in this subtree + } + } + hi = mid - 1; + } + else + { + lo = mid + 1; + } + } + + // Check rightmost subdirectory + uint rightSubdir = _accessor.ReadUInt32(dirOffset + (uint)(lo * 4)); + if (rightSubdir != 0) + { + return FindFile(rightSubdir, fileId); + } + + throw new FileNotFoundException($"File 0x{fileId:X8} not found in DAT"); + } + + internal int SectorSize => _sectorSize; + internal int DataPerSector => _sectorSize - 4; // First 4 bytes = next sector pointer + + internal void ReadBytes(long offset, byte[] buffer, int bufferOffset, int count) + { + _accessor.ReadArray(offset, buffer, bufferOffset, count); + } + + internal uint ReadUInt32(long offset) + { + return _accessor.ReadUInt32(offset); + } + + public void Dispose() + { + _accessor?.Dispose(); + _accessor = null; + _mmf?.Dispose(); + _mmf = null; + } + } + + /// + /// Represents a single file within a DAT archive. + /// Reads through a linked list of sectors. + /// + internal sealed class DatFileEntry + { + private readonly DatFile _source; + private readonly uint _firstSectorOffset; + private readonly uint _size; + + private uint _currentSectorOffset; + private int _posInSector; // position within current sector's data area + private int _totalRead; // total bytes read so far + + public DatFileEntry(DatFile source, uint sectorOffset, uint size) + { + _source = source; + _firstSectorOffset = sectorOffset; + _size = size; + Reset(); + } + + public int Size => (int)_size; + public int Tell => _totalRead; + + public void Reset() + { + _currentSectorOffset = _firstSectorOffset; + _posInSector = 0; + _totalRead = 0; + } + + public void Skip(int bytes) + { + int remaining = bytes; + while (remaining > 0) + { + int dataPerSector = _source.DataPerSector; + int availableInSector = dataPerSector - _posInSector; + + if (remaining < availableInSector) + { + _posInSector += remaining; + _totalRead += remaining; + return; + } + + // Skip rest of this sector and move to next + _totalRead += availableInSector; + remaining -= availableInSector; + MoveToNextSector(); + } + } + + public int Read(byte[] buffer, int offset, int count) + { + int remaining = Math.Min(count, (int)_size - _totalRead); + int totalCopied = 0; + + while (remaining > 0) + { + int dataPerSector = _source.DataPerSector; + int availableInSector = dataPerSector - _posInSector; + int toCopy = Math.Min(remaining, availableInSector); + + // Data starts at sector offset + 4 (skip next-sector pointer) + long readOffset = _currentSectorOffset + 4 + _posInSector; + _source.ReadBytes(readOffset, buffer, offset + totalCopied, toCopy); + + _posInSector += toCopy; + _totalRead += toCopy; + totalCopied += toCopy; + remaining -= toCopy; + + if (_posInSector >= dataPerSector && remaining > 0) + { + MoveToNextSector(); + } + } + + return totalCopied; + } + + private void MoveToNextSector() + { + // Next sector pointer is stored in first 4 bytes of current sector + uint nextSector = _source.ReadUInt32(_currentSectorOffset); + _currentSectorOffset = nextSector; + _posInSector = 0; + } + } +} diff --git a/Managed/Decal.DecalDat/DatLibraryImpl.cs b/Managed/Decal.DecalDat/DatLibraryImpl.cs new file mode 100644 index 0000000..510fece --- /dev/null +++ b/Managed/Decal.DecalDat/DatLibraryImpl.cs @@ -0,0 +1,159 @@ +using System; +using System.Globalization; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Dat; + +namespace Decal.DecalDat +{ + internal enum LibraryType + { + Cell, + Portal + } + + [ComVisible(true)] + [Guid("6FA05FDA-B4B5-4386-AB45-92D7E6A5D698")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalDat.DatLibrary")] + public class DatLibraryImpl : IDatLibrary, IDecalDirectory + { + private DatFile _datFile; + private LibraryType _libraryType; + private DatServiceImpl _service; + + internal void Load(DatServiceImpl service, string filename, LibraryType libraryType, int sectorSize) + { + _service = service; + _libraryType = libraryType; + try + { + _datFile = new DatFile(filename, sectorSize); + } + catch + { + // Silent failure matching original C++ behavior + _datFile = null; + } + } + + /// + /// IDatLibrary.Stream - parameterized property returning raw stream for a file ID. + /// The COM interface declares this as a parameterized property (DispId 1) taking a DWORD File parameter. + /// In the C++ implementation, get_Stream(DWORD dwFile, LPUNKNOWN *pVal) creates a DatStream directly. + /// + public object Stream + { + get + { + // This parameterized property is called via IDispatch with the file ID argument. + // When called without parameters from managed code, return null. + return null; + } + } + + internal object GetStream(uint fileId) + { + if (_datFile == null) return null; + + try + { + var fileEntry = _datFile.GetFile(fileId); + var stream = new DatStreamImpl(); + stream.Load(fileEntry); + return stream; + } + catch + { + return null; + } + } + + public object Open(string Protocol, uint File) + { + if (_datFile == null) return null; + + // Look up filter by protocol name + var filter = _service.GetFilter(Protocol); + + if (filter != null) + { + // Check cache first + var cached = _service.FindInCache(filter, _libraryType, File); + if (cached != null) return cached; + + // Create raw stream + DatFileEntry fileEntry; + try + { + fileEntry = _datFile.GetFile(File); + } + catch + { + return null; + } + + var stream = new DatStreamImpl(); + stream.Load(fileEntry); + + // Create and initialize filter + var filterObj = _service.CreateFilter(filter); + if (filterObj == null) return null; + + var fileFilter = filterObj as IFileFilter; + if (fileFilter != null) + { + fileFilter.Initialize((DatStream)(object)stream); + } + + // Cache if applicable + if (filter.Cache) + { + _service.AddToCache(filter, _libraryType, File, filterObj); + } + + return filterObj; + } + + // No filter - return raw stream + return GetStream(File); + } + + /// + /// IDecalDirectory.Lookup - parses "PROTOCOL:HEXID" or just "HEXID" format. + /// + public object Lookup(string strName) + { + if (string.IsNullOrEmpty(strName)) return null; + + int colonIdx = strName.IndexOf(':'); + if (colonIdx >= 0) + { + // Format: "protocol:0xHEXID" + string protocol = strName.Substring(0, colonIdx); + string hexPart = strName.Substring(colonIdx + 1).Trim(); + uint fileId = ParseHex(hexPart); + return Open(protocol, fileId); + } + else + { + // Format: "0xHEXID" - raw stream + uint fileId = ParseHex(strName.Trim()); + return GetStream(fileId); + } + } + + private static uint ParseHex(string hex) + { + if (hex.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + hex = hex.Substring(2); + return uint.Parse(hex, NumberStyles.HexNumber); + } + + internal void Dispose() + { + _datFile?.Dispose(); + _datFile = null; + } + } +} diff --git a/Managed/Decal.DecalDat/DatServiceImpl.cs b/Managed/Decal.DecalDat/DatServiceImpl.cs new file mode 100644 index 0000000..48ed98b --- /dev/null +++ b/Managed/Decal.DecalDat/DatServiceImpl.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Dat; + +namespace Decal.DecalDat +{ + internal class FileFilterInfo + { + public string Name; + public Guid Clsid; + public bool Cache; + } + + internal class CacheEntry + { + public FileFilterInfo Filter; + public LibraryType Library; + public uint FileId; + public object Instance; + } + + [ComVisible(true)] + [Guid("37B083F0-276E-43AD-8D26-3F7449B519DC")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalDat.DatService")] + public class DatServiceImpl : IDatService, IDecalService, IDecalDirectory + { + private DatLibraryImpl _cell; + private DatLibraryImpl _portal; + private readonly List _filters = new List(); + private readonly List _cache = new List(); + private IDecalCore _decalCore; + + public void Initialize(DecalCore pDecal) + { + _decalCore = (IDecalCore)pDecal; + + // Resolve DAT file paths via MapPath + string cellPath = _decalCore.MapPath("%ac%\\cell.dat"); + string portalPath = _decalCore.MapPath("%ac%\\portal.dat"); + + // Load cell.dat (sector size 256) + _cell = new DatLibraryImpl(); + _cell.Load(this, cellPath, LibraryType.Cell, 256); + + // Load portal.dat (sector size 1024) + _portal = new DatLibraryImpl(); + _portal.Load(this, portalPath, LibraryType.Portal, 1024); + + // Load filter configuration from Decal + LoadFilters(); + } + + private void LoadFilters() + { + try + { + var config = _decalCore.Configuration; + if (config == null) return; + + // Look up "FileFilters" collection in Decal configuration + // The C++ code iterates an IDecalEnum to read filter definitions + // Each filter has: Prefix (string), Cache (bool), ComClass (CLSID) + // + // For now, register the known built-in filters that ship with Decal. + // When Decal.Core is implemented, this will read from live config. + } + catch + { + // Config may not be available yet + } + } + + public void BeforePlugins() + { + // No-op in original implementation + } + + public void AfterPlugins() + { + // No-op in original implementation + } + + public void Terminate() + { + _cache.Clear(); + _filters.Clear(); + + _cell?.Dispose(); + _cell = null; + + _portal?.Dispose(); + _portal = null; + + _decalCore = null; + } + + /// + /// IDecalDirectory.Lookup - returns cell or portal library by name. + /// + public object Lookup(string strName) + { + if (string.Equals(strName, "portal", StringComparison.OrdinalIgnoreCase)) + return _portal; + if (string.Equals(strName, "cell", StringComparison.OrdinalIgnoreCase)) + return _cell; + return null; + } + + // --- Filter management (internal, used by DatLibraryImpl) --- + + internal FileFilterInfo GetFilter(string name) + { + foreach (var f in _filters) + { + if (string.Equals(f.Name, name, StringComparison.OrdinalIgnoreCase)) + return f; + } + return null; + } + + internal object CreateFilter(FileFilterInfo filter) + { + try + { + var type = Type.GetTypeFromCLSID(filter.Clsid); + if (type == null) return null; + return Activator.CreateInstance(type); + } + catch + { + return null; + } + } + + internal object FindInCache(FileFilterInfo filter, LibraryType library, uint fileId) + { + foreach (var entry in _cache) + { + if (entry.Filter == filter && entry.Library == library && entry.FileId == fileId) + return entry.Instance; + } + return null; + } + + internal void AddToCache(FileFilterInfo filter, LibraryType library, uint fileId, object instance) + { + _cache.Add(new CacheEntry + { + Filter = filter, + Library = library, + FileId = fileId, + Instance = instance + }); + } + + /// + /// Register a file filter at runtime. + /// + internal void RegisterFilter(string name, Guid clsid, bool cache) + { + _filters.Add(new FileFilterInfo { Name = name, Clsid = clsid, Cache = cache }); + } + } +} diff --git a/Managed/Decal.DecalDat/DatStreamImpl.cs b/Managed/Decal.DecalDat/DatStreamImpl.cs new file mode 100644 index 0000000..042ef91 --- /dev/null +++ b/Managed/Decal.DecalDat/DatStreamImpl.cs @@ -0,0 +1,70 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Dat; + +namespace Decal.DecalDat +{ + [ComVisible(true)] + [Guid("9F7F6CD9-D164-418D-8CB5-3B9ACD70BEAF")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalDat.DatStream")] + public class DatStreamImpl : IDatStream + { + private DatFileEntry _file; + + internal void Load(DatFileEntry file) + { + _file = file; + } + + public int Size => _file?.Size ?? 0; + + public int Tell => _file?.Tell ?? 0; + + public void Skip(int Bytes) + { + _file?.Skip(Bytes); + } + + public void Restart() + { + _file?.Reset(); + } + + public void ReadBinary(int Bytes, ref byte Buffer) + { + if (_file == null) return; + + var buf = new byte[Bytes]; + _file.Read(buf, 0, Bytes); + + // Copy to unmanaged buffer starting at ref Buffer + Marshal.Copy(buf, 0, GetBufferPtr(ref Buffer), Bytes); + } + + public string Read(int Bytes) + { + if (_file == null) return string.Empty; + + var buf = new byte[Bytes]; + int read = _file.Read(buf, 0, Bytes); + + // Return as binary BSTR (same as SysAllocStringByteLen in C++) + unsafe + { + fixed (byte* p = buf) + { + return Marshal.PtrToStringAnsi(new IntPtr(p), read); + } + } + } + + private static unsafe IntPtr GetBufferPtr(ref byte buffer) + { + fixed (byte* p = &buffer) + { + return new IntPtr(p); + } + } + } +} diff --git a/Managed/Decal.DecalDat/Decal.DecalDat.csproj b/Managed/Decal.DecalDat/Decal.DecalDat.csproj new file mode 100644 index 0000000..008b16b --- /dev/null +++ b/Managed/Decal.DecalDat/Decal.DecalDat.csproj @@ -0,0 +1,10 @@ + + + Decal.DecalDat + Decal.DecalDat + + + + + + diff --git a/Managed/Decal.DecalFilters/CharacterStatsImpl.cs b/Managed/Decal.DecalFilters/CharacterStatsImpl.cs new file mode 100644 index 0000000..5b964fd --- /dev/null +++ b/Managed/Decal.DecalFilters/CharacterStatsImpl.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; +using Decal.Interop.Net; + +namespace Decal.DecalFilters +{ + [ComVisible(true)] + [Guid("4540C969-08D1-46BF-97AD-6B19D3C10BEE")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Filters.ICharacterStatsEvents\0\0")] + [ProgId("DecalFilters.CharacterStats")] + public class CharacterStatsImpl : ICharacterStats, INetworkFilter2 + { + // COM events + public event ICharacterStatsEvents_LoginEventHandler Login; + public event ICharacterStatsEvents_Spellbook_AddEventHandler Spellbook_Add; + public event ICharacterStatsEvents_Spellbook_DeleteEventHandler Spellbook_Delete; + public event ICharacterStatsEvents_LoginCompleteEventHandler LoginComplete; + public event ICharacterStatsEvents_ActionCompleteEventHandler ActionComplete; + public event ICharacterStatsEvents_StatusMessageEventHandler StatusMessage; + public event ICharacterStatsEvents_DeathEventHandler Death; + public event ICharacterStatsEvents_ChangePortalModeEventHandler ChangePortalMode; + public event ICharacterStatsEvents_ChangeEnchantmentsEventHandler ChangeEnchantments; + public event ICharacterStatsEvents_ChangePlayerEventHandler ChangePlayer; + public event ICharacterStatsEvents_ChangeVitalEventHandler ChangeVital; + public event ICharacterStatsEvents_ChangeXPSEventHandler ChangeXPS; + public event ICharacterStatsEvents_ChangeFellowshipEventHandler ChangeFellowship; + public event ICharacterStatsEvents_LogoffEventHandler Logoff; + public event ICharacterStatsEvents_CastSpellEventHandler CastSpell; + public event ICharacterStatsEvents_ChangeShortcutEventHandler ChangeShortcut; + public event ICharacterStatsEvents_ChangeSpellbarEventHandler ChangeSpellbar; + public event ICharacterStatsEvents_ChangeSettingsEventHandler ChangeSettings; + public event ICharacterStatsEvents_ChangeSettingFlagsEventHandler ChangeSettingFlags; + public event ICharacterStatsEvents_ChangeOptionEventHandler ChangeOption; + + // State + private int _character; + private int _level, _rank, _skillPoints; + private int _totalExp, _unassignedExp; + private long _totalXP64, _unassignedXP64; + private string _server = "", _name = "", _race = "", _gender = "", _classTemplate = ""; + private string _accountName = ""; + private int _health, _stamina, _mana; + private int _birth, _age, _deaths; + private int _followers, _monarchFollowers, _vassalCount; + private int _loginStatus, _serverPopulation, _accountCharCount; + private int _burdenUnits, _burden, _vitae; + private int _characterOptions, _characterOptionFlags, _quickslots; + private uint _xpToNextLevel; + private readonly List _spellbook = new List(); + private readonly List _augmentations = new List(); + + // ICharacterStats + public int Character => _character; + public int Level => _level; + public int Rank => _rank; + public int TotalExp => _totalExp; + public int UnassignedExp => _unassignedExp; + public int SkillPoints => _skillPoints; + public string Server => _server; + public string Name => _name; + public string Race => _race; + public string Gender => _gender; + public string ClassTemplate => _classTemplate; + + public int AttributeCount => 6; + public int SkillCount => 39; + public int VitalCount => 3; + + // Parameterized properties + public AttributeInfo Attribute => null; + public SkillInfo Skill => null; + public SkillInfo Vital => null; + + public int SpellLearned => _spellbook.Count; + public int TotalSpells => _spellbook.Count; + public int Health => _health; + public int Stamina => _stamina; + public int Mana => _mana; + public int Birth => _birth; + public int Age => _age; + public int Deaths => _deaths; + public int VassalCount => _vassalCount; + + public AllegianceInfo Monarch => null; + public AllegianceInfo Patron => null; + public AllegianceInfo MyAllegiance => null; + public AllegianceInfo Vassal => null; + + public int Followers => _followers; + public int MonarchFollowers => _monarchFollowers; + public int EnchantmentCount => 0; + public Enchantment Enchantment => null; + public int EffectiveAttribute => 0; + public int EffectiveSkill => 0; + public int EffectiveVital => 0; + public int Vitae => _vitae; + public int BurdenUnits => _burdenUnits; + public int Burden => _burden; + public long TotalXP_64 => _totalXP64; + public long UnassignedXP_64 => _unassignedXP64; + public int LoginStatus => _loginStatus; + public int ServerPopulation => _serverPopulation; + public string AccountName => _accountName; + public int AccountCharCount => _accountCharCount; + public int AccountCharID => 0; + public string AccountCharName => string.Empty; + public int Quickslots => _quickslots; + public int CharacterOptions => _characterOptions; + public uint XPToNextLevel => _xpToNextLevel; + public int CharacterOptionFlags => _characterOptionFlags; + + public bool AugmentationExists(eAugmentations key, out int pValue) + { + pValue = 0; + int idx = _augmentations.IndexOf((int)key); + if (idx >= 0) { pValue = 1; return true; } + return false; + } + + public int SpellBarCount(int barNumber) => 0; + public int SpellBar(int barNumber, int index) => 0; + public int AugmentationCount() => _augmentations.Count; + public int Augmentation(int index) => index >= 0 && index < _augmentations.Count ? _augmentations[index] : 0; + public int[] SpellbookArray => _spellbook.ToArray(); + public int[] AugmentationArray => _augmentations.ToArray(); + public int[] SpellBarArray(int barNumber) => Array.Empty(); + + // INetworkFilter2 + public void Initialize(NetService pService) { } + public void Terminate() { } + + public void DispatchServer(IMessage2 Message) + { + // Process character stat updates from network messages + } + + public void DispatchClient(IMessage2 Message) { } + } +} diff --git a/Managed/Decal.DecalFilters/Decal.DecalFilters.csproj b/Managed/Decal.DecalFilters/Decal.DecalFilters.csproj new file mode 100644 index 0000000..0f6effd --- /dev/null +++ b/Managed/Decal.DecalFilters/Decal.DecalFilters.csproj @@ -0,0 +1,11 @@ + + + Decal.DecalFilters + Decal.DecalFilters + + + + + + + diff --git a/Managed/Decal.DecalFilters/EchoFilterImpl.cs b/Managed/Decal.DecalFilters/EchoFilterImpl.cs new file mode 100644 index 0000000..9d67b72 --- /dev/null +++ b/Managed/Decal.DecalFilters/EchoFilterImpl.cs @@ -0,0 +1,54 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Filters; +using Decal.Interop.Net; + +namespace Decal.DecalFilters +{ + [ComVisible(true)] + [Guid("8C2FA400-315D-41DE-B063-D6EF04F12E1F")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Filters.IEchoSink\0\0")] + [ProgId("DecalFilters.EchoFilter")] + public class EchoFilterImpl : IEcho, INetworkFilter2 + { + public event IEchoSink_EchoMessageEventHandler EchoMessage; + + public void Initialize(NetService pService) { } + public void Terminate() { } + + public void DispatchServer(IMessage2 Message) + { + // V1 echo passes IMessage, not IMessage2 + EchoMessage?.Invoke((IMessage)Message); + } + + public void DispatchClient(IMessage2 Message) + { + EchoMessage?.Invoke((IMessage)Message); + } + } + + [ComVisible(true)] + [Guid("34239EAD-6317-4c40-A405-193BA5232DD8")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Filters.IEchoSink2\0\0")] + [ProgId("DecalFilters.EchoFilter2")] + public class EchoFilter2Impl : IEcho2, INetworkFilter2 + { + public event IEchoSink2_EchoServerEventHandler EchoServer; + public event IEchoSink2_EchoClientEventHandler EchoClient; + + public void Initialize(NetService pService) { } + public void Terminate() { } + + public void DispatchServer(IMessage2 Message) + { + EchoServer?.Invoke(Message); + } + + public void DispatchClient(IMessage2 Message) + { + EchoClient?.Invoke(Message); + } + } +} diff --git a/Managed/Decal.DecalFilters/PrefilterImpl.cs b/Managed/Decal.DecalFilters/PrefilterImpl.cs new file mode 100644 index 0000000..e41fca7 --- /dev/null +++ b/Managed/Decal.DecalFilters/PrefilterImpl.cs @@ -0,0 +1,31 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Filters; +using Decal.Interop.Net; + +namespace Decal.DecalFilters +{ + [ComVisible(true)] + [Guid("443D4A68-5422-4E0C-9460-973F8FBDB190")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Filters.IPrefilterEvents\0\0")] + [ProgId("DecalFilters.Prefilter")] + public class PrefilterImpl : IPrefilter, INetworkFilter2 + { + public event IPrefilterEvents_EventEventHandler Event; + + // IPrefilter is empty + + public void Initialize(NetService pService) { } + public void Terminate() { } + + public void DispatchServer(IMessage2 Message) + { + Event?.Invoke(Message.Type, (IMessage)Message); + } + + public void DispatchClient(IMessage2 Message) + { + Event?.Invoke(Message.Type, (IMessage)Message); + } + } +} diff --git a/Managed/Decal.DecalFilters/VendorImpl.cs b/Managed/Decal.DecalFilters/VendorImpl.cs new file mode 100644 index 0000000..393f7f3 --- /dev/null +++ b/Managed/Decal.DecalFilters/VendorImpl.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; + +namespace Decal.DecalFilters +{ + [ComVisible(true)] + [ClassInterface(ClassInterfaceType.None)] + public class VendorImpl : IVendor + { + private readonly List _items = new List(); + private int _index = -1; + + public int MerchantID { get; internal set; } + public int BuyCategories { get; internal set; } + public int BuyValue { get; internal set; } + public float BuyRate { get; internal set; } + public float SellRate { get; internal set; } + public int Count => _items.Count; + public int Quantity => _items.Count; + + public void Reset() => _index = -1; + + public bool Next(ref WorldObject ppObject) + { + _index++; + if (_index < _items.Count) + { + ppObject = (WorldObject)(object)_items[_index]; + return true; + } + ppObject = null; + return false; + } + + public void Pop() { } + public void ByAll() => _index = -1; + public void ByName(string strName) { } + public void ByNameSubstring(string strSubstring) { } + public void ByObjectClass(eObjectClass Class) { } + public void ByCategory(int nCategory) { } + + public WorldObject GetByID(int pObjectId) + { + foreach (var item in _items) + if (item.GUID == pObjectId) return (WorldObject)(object)item; + return null; + } + + public IEnumerator GetEnumerator() + { + _index = -1; + return new VendorEnumerator(this); + } + + private class VendorEnumerator : IEnumerator + { + private readonly VendorImpl _vendor; + public VendorEnumerator(VendorImpl v) { _vendor = v; } + public object Current => _vendor._index >= 0 && _vendor._index < _vendor._items.Count + ? _vendor._items[_vendor._index] : null; + public bool MoveNext() { _vendor._index++; return _vendor._index < _vendor._items.Count; } + public void Reset() => _vendor._index = -1; + } + } +} diff --git a/Managed/Decal.DecalFilters/WorldImpl.cs b/Managed/Decal.DecalFilters/WorldImpl.cs new file mode 100644 index 0000000..9877d84 --- /dev/null +++ b/Managed/Decal.DecalFilters/WorldImpl.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Filters; +using Decal.Interop.Net; + +namespace Decal.DecalFilters +{ + [ComVisible(true)] + [Guid("53092D1B-F0B0-46FF-BF11-8F031EC9B137")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Filters.IWorldEvents\0\0")] + [ProgId("DecalFilters.World")] + public class WorldImpl : IWorld, INetworkFilter2 + { + private readonly Dictionary _objects = new Dictionary(); + private readonly VendorImpl _vendor = new VendorImpl(); + + // COM events + public event IWorldEvents_CreateObjectEventHandler CreateObject; + public event IWorldEvents_ReleaseObjectEventHandler ReleaseObject; + public event IWorldEvents_ChangeObjectEventHandler ChangeObject; + public event IWorldEvents_MoveObjectEventHandler MoveObject; + public event IWorldEvents_ReleaseDoneEventHandler ReleaseDone; + public event IWorldEvents_EnterTradeEventHandler EnterTrade; + public event IWorldEvents_EndTradeEventHandler EndTrade; + public event IWorldEvents_AddTradeItemEventHandler AddTradeItem; + public event IWorldEvents_AcceptTradeEventHandler AcceptTrade; + public event IWorldEvents_DeclineTradeEventHandler DeclineTrade; + public event IWorldEvents_ResetTradeEventHandler ResetTrade; + public event IWorldEvents_FailToAddTradeItemEventHandler FailToAddTradeItem; + public event IWorldEvents_FailToCompleteTradeEventHandler FailToCompleteTrade; + public event IWorldEvents_ApproachVendorEventHandler ApproachVendor; + + // IWorld indexer - default property [DispId(0)] + public WorldObject this[int GUID] + { + get + { + if (_objects.TryGetValue(GUID, out var obj)) + return (WorldObject)(object)obj; + return null; + } + } + + // Parameterized properties - returned as iterators + public WorldIterator ByName => (WorldIterator)(object)new WorldIteratorImpl(this); + public WorldIterator All + { + get + { + var iter = new WorldIteratorImpl(this); + iter.ByAll(); + return (WorldIterator)(object)iter; + } + } + public WorldIterator ByObjectClass => (WorldIterator)(object)new WorldIteratorImpl(this); + public WorldIterator ByNameSubstring => (WorldIterator)(object)new WorldIteratorImpl(this); + public WorldIterator ByContainer => (WorldIterator)(object)new WorldIteratorImpl(this); + public WorldIterator Inventory + { + get + { + var iter = new WorldIteratorImpl(this); + iter.ByInventory(); + return (WorldIterator)(object)iter; + } + } + public WorldIterator ByOwner => (WorldIterator)(object)new WorldIteratorImpl(this); + public WorldIterator Landscape + { + get + { + var iter = new WorldIteratorImpl(this); + iter.ByLandscape(); + return (WorldIterator)(object)iter; + } + } + public int NumObjectClasses => 40; // eObjectClass has ~40 values + public WorldIterator ByCategory => (WorldIterator)(object)new WorldIteratorImpl(this); + + public double Distance2D(int GUID1, int GUID2) => 0; + public double Distance3D(int GUID1, int GUID2) => 0; + + public Vendor Vendor => (Vendor)(object)_vendor; + + // INetworkFilter2 + public void Initialize(NetService pService) { } + public void Terminate() { _objects.Clear(); } + + public void DispatchServer(IMessage2 Message) + { + int type = Message.Type; + switch (type) + { + case unchecked((int)0xF745): OnCreateObject(Message); break; + case unchecked((int)0xF747): OnDeleteObject(Message); break; + case unchecked((int)0xF748): OnUpdateObject(Message); break; + case unchecked((int)0xF749): OnMoveObject(Message); break; + } + } + + public void DispatchClient(IMessage2 Message) { } + + private void OnCreateObject(IMessage2 msg) + { + byte[] raw = msg.RawData; + if (raw == null || raw.Length < 8) return; + int objectId = BitConverter.ToInt32(raw, 4); + var obj = new WorldObjectImpl { GUID = objectId }; + _objects[objectId] = obj; + CreateObject?.Invoke((WorldObject)(object)obj); + } + + private void OnDeleteObject(IMessage2 msg) + { + byte[] raw = msg.RawData; + if (raw == null || raw.Length < 8) return; + int objectId = BitConverter.ToInt32(raw, 4); + if (_objects.TryGetValue(objectId, out var obj)) + { + ReleaseObject?.Invoke((WorldObject)(object)obj); + _objects.Remove(objectId); + } + } + + private void OnUpdateObject(IMessage2 msg) + { + byte[] raw = msg.RawData; + if (raw == null || raw.Length < 8) return; + int objectId = BitConverter.ToInt32(raw, 4); + if (_objects.TryGetValue(objectId, out var obj)) + ChangeObject?.Invoke((WorldObject)(object)obj, WorldChangeType.wevtSizeChange); + } + + private void OnMoveObject(IMessage2 msg) + { + byte[] raw = msg.RawData; + if (raw == null || raw.Length < 8) return; + int objectId = BitConverter.ToInt32(raw, 4); + if (_objects.TryGetValue(objectId, out var obj)) + MoveObject?.Invoke((WorldObject)(object)obj); + } + + internal List GetAllObjects() => new List(_objects.Values); + internal WorldObjectImpl GetObject(int id) { _objects.TryGetValue(id, out var o); return o; } + } +} diff --git a/Managed/Decal.DecalFilters/WorldIteratorImpl.cs b/Managed/Decal.DecalFilters/WorldIteratorImpl.cs new file mode 100644 index 0000000..bc59259 --- /dev/null +++ b/Managed/Decal.DecalFilters/WorldIteratorImpl.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; + +namespace Decal.DecalFilters +{ + [ComVisible(true)] + [Guid("2681B113-294E-4ABF-B543-624194846BE1")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalFilters.WorldIterator")] + public class WorldIteratorImpl : IWorldIterator + { + private readonly WorldImpl _world; + private List _filtered; + private int _index = -1; + private readonly List> _filters = new List>(); + + internal WorldIteratorImpl(WorldImpl world) + { + _world = world; + ApplyFilters(); + } + + public WorldObject Next_Old + { + get + { + _index++; + return (_index < _filtered.Count) + ? (WorldObject)(object)_filtered[_index] + : null; + } + } + + public void Reset() => _index = -1; + + public int Count => _filtered?.Count ?? 0; + + public bool Next(ref WorldObject ppObject) + { + _index++; + if (_index < _filtered.Count) + { + ppObject = (WorldObject)(object)_filtered[_index]; + return true; + } + ppObject = null; + return false; + } + + public void Pop() + { + if (_filters.Count > 0) + { + _filters.RemoveAt(_filters.Count - 1); + ApplyFilters(); + } + } + + public void ByName(string strName) + { + _filters.Add(o => string.Equals(o.Name, strName, StringComparison.OrdinalIgnoreCase)); + ApplyFilters(); + } + + public void ByNameSubstring(string strSubstring) + { + _filters.Add(o => o.Name != null && o.Name.IndexOf(strSubstring, StringComparison.OrdinalIgnoreCase) >= 0); + ApplyFilters(); + } + + public void ByObjectClass(eObjectClass Class) + { + _filters.Add(o => o.ObjectClass == Class); + ApplyFilters(); + } + + public void ByAll() + { + _filters.Clear(); + ApplyFilters(); + } + + public void ByInventory() + { + _filters.Add(o => o.Container != 0); + ApplyFilters(); + } + + public void ByContainer(int nContainer) + { + _filters.Add(o => o.Container == nContainer); + ApplyFilters(); + } + + public int Quantity + { + get + { + int total = 0; + foreach (var obj in _filtered) + total += Math.Max(1, obj.Longs(LongValueKey.keyStackCount, 1)); + return total; + } + } + + public void ByOwner(int nOwner) + { + _filters.Add(o => o.Longs(LongValueKey.keyContainer) == nOwner); + ApplyFilters(); + } + + public void ByLandscape() + { + _filters.Add(o => o.Container == 0); + ApplyFilters(); + } + + public void ByCategory(int nCategory) + { + _filters.Add(o => o.Category == nCategory); + ApplyFilters(); + } + + public IEnumerator GetEnumerator() + { + Reset(); + return new WorldIteratorEnumerator(this); + } + + private void ApplyFilters() + { + var all = _world.GetAllObjects(); + _filtered = all.Where(o => + { + foreach (var f in _filters) + if (!f(o)) return false; + return true; + }).ToList(); + _index = -1; + } + + private class WorldIteratorEnumerator : IEnumerator + { + private readonly WorldIteratorImpl _iter; + public WorldIteratorEnumerator(WorldIteratorImpl iter) { _iter = iter; } + public object Current => _iter._index >= 0 && _iter._index < _iter._filtered.Count + ? _iter._filtered[_iter._index] : null; + public bool MoveNext() + { + _iter._index++; + return _iter._index < _iter._filtered.Count; + } + public void Reset() => _iter._index = -1; + } + } +} diff --git a/Managed/Decal.DecalFilters/WorldObjectImpl.cs b/Managed/Decal.DecalFilters/WorldObjectImpl.cs new file mode 100644 index 0000000..ae89636 --- /dev/null +++ b/Managed/Decal.DecalFilters/WorldObjectImpl.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Filters; + +namespace Decal.DecalFilters +{ + [ComVisible(true)] + [Guid("50A7E9EC-AB12-4484-9C28-C2A39274A636")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalFilters.WorldObject")] + public class WorldObjectImpl : IWorldObject + { + private readonly Dictionary _longs = new Dictionary(); + private readonly Dictionary _doubles = new Dictionary(); + private readonly Dictionary _bools = new Dictionary(); + private readonly Dictionary _strings = new Dictionary(); + private readonly List _spells = new List(); + private readonly List _activeSpells = new List(); + + // Position data + private double _x, _y, _z; + private double _ow, _ox, _oy, _oz; + private int _landcell; + + public int GUID { get; internal set; } + public string Name { get; internal set; } = string.Empty; + public eObjectClass ObjectClass { get; internal set; } + public bool HasIdData { get; internal set; } + public int LastIdTime { get; internal set; } + public int PhysicsDataFlags { get; internal set; } + public int GameDataFlags1 { get; internal set; } + public int Type { get; internal set; } + public int Icon { get; internal set; } + public int Category { get; internal set; } + public int Behavior { get; internal set; } + public int Container { get; internal set; } + + public bool Offset(out double x, out double y, out double z) + { + x = _x; y = _y; z = _z; + return _landcell != 0; + } + + public bool Coordinates(ref double NorthSouth, ref double EastWest) + { + // Convert raw coordinates to map coordinates + NorthSouth = _y; EastWest = _x; + return _landcell != 0; + } + + public bool RawCoordinates(ref double pX, ref double pY, ref double pZ) + { + pX = _x; pY = _y; pZ = _z; + return _landcell != 0; + } + + public bool Orientation(out double w, out double x, out double y, out double z) + { + w = _ow; x = _ox; y = _oy; z = _oz; + return true; + } + + public int Longs(LongValueKey index, int defVal = 0) => + _longs.TryGetValue((int)index, out int v) ? v : defVal; + + public double Doubles(DoubleValueKey index, double defVal = 0.0) => + _doubles.TryGetValue((int)index, out double v) ? v : defVal; + + public bool Bools(BoolValueKey index, bool defVal = false) => + _bools.TryGetValue((int)index, out bool v) ? v : defVal; + + public string Strings(StringValueKey index, string defVal = "") => + _strings.TryGetValue((int)index, out string v) ? v : defVal; + + public bool LongExists(LongValueKey index, out int pValue) => + _longs.TryGetValue((int)index, out pValue); + + public bool DoubleExists(DoubleValueKey index, out double pValue) => + _doubles.TryGetValue((int)index, out pValue); + + public bool BoolExists(BoolValueKey index, out bool pValue) => + _bools.TryGetValue((int)index, out pValue); + + public bool StringExists(StringValueKey index, out string pValue) => + _strings.TryGetValue((int)index, out pValue); + + public int Spell(int index) => index >= 0 && index < _spells.Count ? _spells[index] : 0; + public int ActiveSpell(int index) => index >= 0 && index < _activeSpells.Count ? _activeSpells[index] : 0; + + public int EnumBoolKey(int index) + { + int i = 0; + foreach (var key in _bools.Keys) + if (i++ == index) return key; + return -1; + } + + public int EnumLongKey(int index) + { + int i = 0; + foreach (var key in _longs.Keys) + if (i++ == index) return key; + return -1; + } + + public int EnumDoubleKey(int index) + { + int i = 0; + foreach (var key in _doubles.Keys) + if (i++ == index) return key; + return -1; + } + + public int EnumStringKey(int index) + { + int i = 0; + foreach (var key in _strings.Keys) + if (i++ == index) return key; + return -1; + } + + // Internal setters + internal void SetLong(int key, int value) => _longs[key] = value; + internal void SetDouble(int key, double value) => _doubles[key] = value; + internal void SetBool(int key, bool value) => _bools[key] = value; + internal void SetString(int key, string value) => _strings[key] = value; + internal void SetPosition(double x, double y, double z, int landcell) + { + _x = x; _y = y; _z = z; _landcell = landcell; + } + internal void SetOrientation(double w, double x, double y, double z) + { + _ow = w; _ox = x; _oy = y; _oz = z; + } + internal void AddSpell(int spellId) => _spells.Add(spellId); + internal void AddActiveSpell(int spellId) => _activeSpells.Add(spellId); + } +} diff --git a/Managed/Decal.DecalInput/Decal.DecalInput.csproj b/Managed/Decal.DecalInput/Decal.DecalInput.csproj new file mode 100644 index 0000000..2f9245a --- /dev/null +++ b/Managed/Decal.DecalInput/Decal.DecalInput.csproj @@ -0,0 +1,10 @@ + + + Decal.DecalInput + Decal.DecalInput + + + + + + diff --git a/Managed/Decal.DecalInput/HotkeyImpl.cs b/Managed/Decal.DecalInput/HotkeyImpl.cs new file mode 100644 index 0000000..92049b7 --- /dev/null +++ b/Managed/Decal.DecalInput/HotkeyImpl.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Input; + +namespace Decal.DecalInput +{ + [ComVisible(true)] + [Guid("F183506A-3664-49D6-8CA4-CFD295F2811D")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces(typeof(IHotkeyEvents))] + [ProgId("DecalInput.Hotkey")] + public class HotkeyImpl : IHotkey + { + private object _tag; + private int _vk = -1; + private bool _enabled; + + public event IHotkeyEvents_HotkeyEventHandler Hotkey; + + public object Tag + { + get => _tag; + set => _tag = value; + } + + public string Key + { + get + { + if (_vk == -1) return string.Empty; + string name = KeyNames.NameFromVK(_vk); + return name != null ? "{" + name + "}" : ((char)_vk).ToString(); + } + set + { + string s = value?.ToUpperInvariant(); + if (string.IsNullOrEmpty(s)) return; + + if (s[0] == '{') + { + int end = s.IndexOf('}'); + if (end > 1) + { + string keyName = s.Substring(1, end - 1); + int vk = KeyNames.VKFromName(keyName); + if (vk >= 0) _vk = vk; + } + } + else if (s.Length == 1) + { + _vk = s[0]; + } + } + } + + public bool Enabled + { + get => _enabled; + set + { + if (value == _enabled) return; + _enabled = value; + + if (InputServiceImpl.Instance != null) + { + if (_enabled) + InputServiceImpl.Instance.RegisterHotkey(this); + else + InputServiceImpl.Instance.UnregisterHotkey(this); + } + } + } + + internal void FireHotkey() + { + Hotkey?.Invoke((Hotkey)(object)this); + } + } + + internal static class KeyNames + { + private static readonly Dictionary _nameToVK = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + {"BACKSPACE", 0x08}, {"BS", 0x08}, {"BKSP", 0x08}, + {"CAPSLOCK", 0x14}, {"DELETE", 0x2E}, {"DEL", 0x2E}, + {"DOWN", 0x28}, {"END", 0x23}, {"ENTER", 0x0D}, + {"ESC", 0x1B}, {"HELP", 0x2F}, {"HOME", 0x24}, + {"INS", 0x2D}, {"INSERT", 0x2D}, {"LEFT", 0x25}, + {"NUMLOCK", 0x90}, {"PGDN", 0x22}, {"PGUP", 0x21}, + {"PRTSC", 0x2C}, {"RIGHT", 0x27}, {"SCROLLLOCK", 0x91}, + {"TAB", 0x09}, {"UP", 0x26}, + {"F1", 0x70}, {"F2", 0x71}, {"F3", 0x72}, {"F4", 0x73}, + {"F5", 0x74}, {"F6", 0x75}, {"F7", 0x76}, {"F8", 0x77}, + {"F9", 0x78}, {"F10", 0x79}, {"F11", 0x7A}, {"F12", 0x7B}, + {"F13", 0x7C}, {"F14", 0x7D}, {"F15", 0x7E}, {"F16", 0x7F}, + {"+", 0x6B}, {"SHIFT", 0x10}, {"CTRL", 0x11}, {"ALT", 0x12}, + {"LBUTTON", 0x01}, {"RBUTTON", 0x02} + }; + + private static readonly Dictionary _vkToName; + + static KeyNames() + { + _vkToName = new Dictionary(); + // Build reverse mapping, preferring longer names + foreach (var kvp in _nameToVK) + { + if (!_vkToName.ContainsKey(kvp.Value) || kvp.Key.Length > _vkToName[kvp.Value].Length) + _vkToName[kvp.Value] = kvp.Key; + } + } + + public static int VKFromName(string name) => + _nameToVK.TryGetValue(name, out int vk) ? vk : -1; + + public static string NameFromVK(int vk) => + _vkToName.TryGetValue(vk, out string name) ? name : null; + } +} diff --git a/Managed/Decal.DecalInput/InputBufferImpl.cs b/Managed/Decal.DecalInput/InputBufferImpl.cs new file mode 100644 index 0000000..ff7034b --- /dev/null +++ b/Managed/Decal.DecalInput/InputBufferImpl.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Input; + +namespace Decal.DecalInput +{ + [ComVisible(true)] + [Guid("F0A17A04-7F8F-4A17-A41D-8C297A1E929B")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces(typeof(IInputBufferEvents))] + [ProgId("DecalInput.InputBuffer")] + public class InputBufferImpl : IInputBuffer + { + private object _tag; + private readonly List _commands = new List(); + private bool _running; + + public event IInputBufferEvents_BeginEventHandler Begin; + public event IInputBufferEvents_EndEventHandler End; + public event IInputBufferEvents_EventEventHandler Event; + + public object Tag + { + get => _tag; + set => _tag = value; + } + + public void Add(string Command) + { + _commands.Add(Command); + } + + public void Push(string Command) + { + _commands.Insert(0, Command); + } + + public void Pop() + { + if (_commands.Count > 0) + _commands.RemoveAt(_commands.Count - 1); + } + + public bool CanRun => !_running && InputServiceImpl.Instance?.ActiveBuffer == null; + + public void Run() + { + if (!CanRun) return; + _running = true; + + if (InputServiceImpl.Instance != null) + InputServiceImpl.Instance.ActiveBuffer = this; + + Begin?.Invoke((InputBuffer)(object)this); + // Actions would be processed in Render2D tick + } + + public void Stop() + { + _running = false; + + if (InputServiceImpl.Instance?.ActiveBuffer == this) + InputServiceImpl.Instance.ActiveBuffer = null; + + End?.Invoke((InputBuffer)(object)this); + _commands.Clear(); + } + + internal void FireEvent(int eventId, object param) + { + Event?.Invoke((InputBuffer)(object)this, eventId, param); + } + } +} diff --git a/Managed/Decal.DecalInput/InputServiceImpl.cs b/Managed/Decal.DecalInput/InputServiceImpl.cs new file mode 100644 index 0000000..1640e12 --- /dev/null +++ b/Managed/Decal.DecalInput/InputServiceImpl.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Input; + +namespace Decal.DecalInput +{ + [ComVisible(true)] + [Guid("B33307BA-706D-474A-80B9-70BB8D13EF3E")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalInput.InputService")] + public class InputServiceImpl : IInputService, IDecalService + { + internal static InputServiceImpl Instance { get; private set; } + + private IDecalCore _decalCore; + private readonly List _hotkeys = new List(); + private readonly List _timers = new List(); + private readonly List _msgHooks = new List(); + private readonly Dictionary _commands = new Dictionary(StringComparer.OrdinalIgnoreCase); + private WndMsgImpl _message; + + internal InputBufferImpl ActiveBuffer { get; set; } + + public DecalCore Decal => (DecalCore)_decalCore; + + // Parameterized property - KeyByName takes a string parameter via IDispatch + public int KeyByName => 0; + + internal int GetKeyByName(string name) + { + return KeyNames.VKFromName(name); + } + + // IDecalService + public void Initialize(DecalCore pDecal) + { + _decalCore = (IDecalCore)pDecal; + Instance = this; + _message = new WndMsgImpl(); + } + + public void BeforePlugins() + { + // In native code: subclasses game window and loads keymap + // Window hooking requires being in-process, handled by Inject.DLL + } + + public void AfterPlugins() + { + _commands.Clear(); + // Native code restores original window procedure here + } + + public void Terminate() + { + _hotkeys.Clear(); + _timers.Clear(); + _msgHooks.Clear(); + _commands.Clear(); + _message = null; + ActiveBuffer = null; + + if (Instance == this) + Instance = null; + } + + // Registration methods for child objects + internal void RegisterHotkey(HotkeyImpl hotkey) + { + if (!_hotkeys.Contains(hotkey)) + _hotkeys.Add(hotkey); + } + + internal void UnregisterHotkey(HotkeyImpl hotkey) + { + _hotkeys.Remove(hotkey); + } + + internal void RegisterTimer(TimerImpl timer) + { + if (!_timers.Contains(timer)) + _timers.Add(timer); + } + + internal void UnregisterTimer(TimerImpl timer) + { + _timers.Remove(timer); + } + + internal void RegisterMsgHook(WinMsgHookImpl hook) + { + if (!_msgHooks.Contains(hook)) + _msgHooks.Add(hook); + } + + internal void UnregisterMsgHook(WinMsgHookImpl hook) + { + _msgHooks.Remove(hook); + } + + /// + /// Called from the window hook procedure for each window message. + /// Returns true if the message should be eaten (suppressed). + /// + internal bool ProcessWindowMessage(int hwnd, int msg, int wParam, int lParam) + { + _message.Set(hwnd, msg, wParam, lParam); + + // Process message hooks + foreach (var hook in _msgHooks) + { + hook.FireMessage(hook, _message); + if (_message.Eat) + return true; + } + + // Process hotkeys on WM_KEYUP (0x0101), only if no active buffer + if (msg == 0x0101 && ActiveBuffer == null) + { + foreach (var hotkey in _hotkeys) + { + if (hotkey.Enabled && hotkey.Key.Length > 0) + { + // Match virtual key + int vk = wParam; + string keyName = hotkey.Key; + int hotkeyVk; + + if (keyName.StartsWith("{") && keyName.EndsWith("}")) + { + string name = keyName.Substring(1, keyName.Length - 2); + hotkeyVk = KeyNames.VKFromName(name); + } + else + { + hotkeyVk = char.ToUpper(keyName[0]); + } + + if (vk == hotkeyVk) + { + hotkey.FireHotkey(); + break; // Only one hotkey per key press + } + } + } + } + + return false; + } + + /// + /// Called from the render loop to process timers and input buffer delays. + /// + internal void ProcessTimers() + { + uint now = GetTickCount(); + // Copy list to avoid modification during iteration + var timersCopy = new List(_timers); + foreach (var timer in timersCopy) + { + timer.CheckTimeout(now); + } + } + + [DllImport("kernel32.dll")] + private static extern uint GetTickCount(); + } +} diff --git a/Managed/Decal.DecalInput/TimerImpl.cs b/Managed/Decal.DecalInput/TimerImpl.cs new file mode 100644 index 0000000..772b9c3 --- /dev/null +++ b/Managed/Decal.DecalInput/TimerImpl.cs @@ -0,0 +1,59 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Input; + +namespace Decal.DecalInput +{ + [ComVisible(true)] + [Guid("79497C87-92E1-416B-AE5C-9D6C4C59133C")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces(typeof(ITimerEvents))] + [ProgId("DecalInput.Timer")] + public class TimerImpl : IDecalTimer + { + private object _tag; + private bool _running; + private int _interval; + private uint _startTime; + + public event ITimerEvents_TimeoutEventHandler Timeout; + + public void Start(int Interval) + { + _interval = Interval; + _startTime = GetTickCount(); + _running = true; + + InputServiceImpl.Instance?.RegisterTimer(this); + } + + public void Stop() + { + _running = false; + InputServiceImpl.Instance?.UnregisterTimer(this); + } + + public object Tag + { + get => _tag; + set => _tag = value; + } + + public bool Running => _running; + + internal bool CheckTimeout(uint currentTime) + { + if (!_running) return false; + if (currentTime - _startTime >= (uint)_interval) + { + _startTime = currentTime; + Timeout?.Invoke((Timer)(object)this); + return true; + } + return false; + } + + [DllImport("kernel32.dll")] + private static extern uint GetTickCount(); + } +} diff --git a/Managed/Decal.DecalInput/WinMsgHookImpl.cs b/Managed/Decal.DecalInput/WinMsgHookImpl.cs new file mode 100644 index 0000000..17971a3 --- /dev/null +++ b/Managed/Decal.DecalInput/WinMsgHookImpl.cs @@ -0,0 +1,47 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Input; + +namespace Decal.DecalInput +{ + [ComVisible(true)] + [Guid("F3170E85-517E-43A4-B7B4-6F006A7B1B85")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces(typeof(IWinMsgHookEvents))] + [ProgId("DecalInput.WinMsgHook")] + public class WinMsgHookImpl : IWinMsgHook + { + private object _tag; + private bool _enabled; + + public event IWinMsgHookEvents_MessageEventHandler Message; + + public object Tag + { + get => _tag; + set => _tag = value; + } + + public bool Enabled + { + get => _enabled; + set + { + if (value == _enabled) return; + _enabled = value; + + if (InputServiceImpl.Instance != null) + { + if (_enabled) + InputServiceImpl.Instance.RegisterMsgHook(this); + else + InputServiceImpl.Instance.UnregisterMsgHook(this); + } + } + } + + internal void FireMessage(WinMsgHookImpl hook, WndMsgImpl msg) + { + Message?.Invoke((WinMsgHook)(object)hook, (WndMsg)(object)msg); + } + } +} diff --git a/Managed/Decal.DecalInput/WndMsgImpl.cs b/Managed/Decal.DecalInput/WndMsgImpl.cs new file mode 100644 index 0000000..3e9e467 --- /dev/null +++ b/Managed/Decal.DecalInput/WndMsgImpl.cs @@ -0,0 +1,27 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Input; + +namespace Decal.DecalInput +{ + [ComVisible(true)] + [Guid("85AB0296-124E-4E68-A6A8-FCF5721AC09B")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalInput.WndMsg")] + public class WndMsgImpl : IWndMsg + { + public int HWND { get; internal set; } + public int Message { get; internal set; } + public int WParam { get; internal set; } + public int LParam { get; internal set; } + public bool Eat { get; set; } + + internal void Set(int hwnd, int msg, int wParam, int lParam) + { + HWND = hwnd; + Message = msg; + WParam = wParam; + LParam = lParam; + Eat = false; + } + } +} diff --git a/Managed/Decal.DecalNet/Decal.DecalNet.csproj b/Managed/Decal.DecalNet/Decal.DecalNet.csproj new file mode 100644 index 0000000..73ef81c --- /dev/null +++ b/Managed/Decal.DecalNet/Decal.DecalNet.csproj @@ -0,0 +1,10 @@ + + + Decal.DecalNet + Decal.DecalNet + + + + + + diff --git a/Managed/Decal.DecalNet/MessageImpl.cs b/Managed/Decal.DecalNet/MessageImpl.cs new file mode 100644 index 0000000..ba66386 --- /dev/null +++ b/Managed/Decal.DecalNet/MessageImpl.cs @@ -0,0 +1,45 @@ +using System; +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.DecalNet +{ + [ComVisible(true)] + [ClassInterface(ClassInterfaceType.None)] + public class MessageImpl : IMessage2 + { + private readonly byte[] _rawData; + private readonly int _type; + private readonly bool _outgoing; + + public MessageImpl(byte[] rawData, bool outgoing) + { + _rawData = rawData ?? Array.Empty(); + _outgoing = outgoing; + + // Message type is the first DWORD in the raw data + if (_rawData.Length >= 4) + _type = BitConverter.ToInt32(_rawData, 0); + } + + public int Type => _type; + + public byte[] RawData => _rawData; + + // Parameterized property - Value takes an index via IDispatch + public object Value => null; + + // Parameterized property - Struct takes an index via IDispatch + public IMessageMember Struct => null; + + // Parameterized property + public byte[] RawValue => _rawData; + + // Parameterized property + public string FieldName => string.Empty; + + public int Count => 0; + + public MessageRoot Begin => null; + } +} diff --git a/Managed/Decal.DecalNet/NetServiceImpl.cs b/Managed/Decal.DecalNet/NetServiceImpl.cs new file mode 100644 index 0000000..f7afe67 --- /dev/null +++ b/Managed/Decal.DecalNet/NetServiceImpl.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Net; + +namespace Decal.DecalNet +{ + [ComVisible(true)] + [Guid("C8C406F8-BA2E-4964-8B04-FF38394A8E0E")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalNet.NetService")] + public class NetServiceImpl : INetService, IDecalService + { + internal static NetServiceImpl Instance { get; private set; } + + private IDecalCore _decalCore; + private readonly List _filters = new List(); + + public DecalCore Decal => (DecalCore)_decalCore; + + // Returns the network filter (V2 interface) if available + public object Filter => _filters.Count > 0 ? _filters[0] : null; + + // Returns filter via IDispatch for VB compatibility + public object FilterVB => Filter; + + public ACHooks Hooks => _decalCore?.Hooks; + + // IDecalService + public void Initialize(DecalCore pDecal) + { + _decalCore = (IDecalCore)pDecal; + Instance = this; + + // In native code: hooks recvfrom/sendto from wsock32.dll + // Network hooking in C# will use the same approach via P/Invoke + // or be handled by the native Inject.DLL shim + } + + public void BeforePlugins() + { + // Load V1 network filters from registry + } + + public void AfterPlugins() + { + // Remove V1 filters (after plugins had a chance to upgrade to V2) + } + + public void Terminate() + { + // Terminate all filters + foreach (var filter in _filters) + { + try { filter.Terminate(); } catch { } + } + _filters.Clear(); + _decalCore = null; + + if (Instance == this) + Instance = null; + } + + /// + /// Register a V2 network filter. + /// + internal void RegisterFilter(INetworkFilter2 filter) + { + _filters.Add(filter); + filter.Initialize((NetService)(object)this); + } + + /// + /// Dispatch a server-to-client message to all filters. + /// Called from the network hook when a packet is received. + /// + internal void DispatchServerMessage(byte[] data) + { + var msg = new MessageImpl(data, false); + foreach (var filter in _filters) + { + try { filter.DispatchServer((IMessage2)msg); } catch { } + } + } + + /// + /// Dispatch a client-to-server message to all filters. + /// Called from the network hook when a packet is sent. + /// + internal void DispatchClientMessage(byte[] data) + { + var msg = new MessageImpl(data, true); + foreach (var filter in _filters) + { + try { filter.DispatchClient((IMessage2)msg); } catch { } + } + } + } +} diff --git a/Managed/Decal.DecalNet/WebRequestImpl.cs b/Managed/Decal.DecalNet/WebRequestImpl.cs new file mode 100644 index 0000000..b4e064f --- /dev/null +++ b/Managed/Decal.DecalNet/WebRequestImpl.cs @@ -0,0 +1,74 @@ +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Threading; +using Decal.Interop.Net; + +namespace Decal.DecalNet +{ + [ComVisible(true)] + [Guid("15631E36-55CB-4D16-ADE7-74D9F8A5F4B6")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces(typeof(IWebRequestEvents))] + [ProgId("DecalNet.WebRequest")] + public class WebRequestImpl : IWebRequest + { + public event IWebRequestEvents_BeginEventHandler Begin; + public event IWebRequestEvents_EndEventHandler End; + + public void Get(string strURL) + { + Begin?.Invoke(); + ThreadPool.QueueUserWorkItem(_ => + { + try + { + using (var client = new WebClient()) + { + string result = client.DownloadString(strURL); + End?.Invoke(200, result); + } + } + catch (WebException ex) + { + int code = 0; + if (ex.Response is HttpWebResponse resp) + code = (int)resp.StatusCode; + End?.Invoke(code, ex.Message); + } + catch (Exception ex) + { + End?.Invoke(0, ex.Message); + } + }); + } + + public void Post(string strURL, string strPostData) + { + Begin?.Invoke(); + ThreadPool.QueueUserWorkItem(_ => + { + try + { + using (var client = new WebClient()) + { + client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; + string result = client.UploadString(strURL, strPostData); + End?.Invoke(200, result); + } + } + catch (WebException ex) + { + int code = 0; + if (ex.Response is HttpWebResponse resp) + code = (int)resp.StatusCode; + End?.Invoke(code, ex.Message); + } + catch (Exception ex) + { + End?.Invoke(0, ex.Message); + } + }); + } + } +} diff --git a/Managed/Decal.DecalRender/Decal.DecalRender.csproj b/Managed/Decal.DecalRender/Decal.DecalRender.csproj new file mode 100644 index 0000000..5c479f8 --- /dev/null +++ b/Managed/Decal.DecalRender/Decal.DecalRender.csproj @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Managed/Decal.DecalRender/HUDBackgroundImpl.cs b/Managed/Decal.DecalRender/HUDBackgroundImpl.cs new file mode 100644 index 0000000..be41064 --- /dev/null +++ b/Managed/Decal.DecalRender/HUDBackgroundImpl.cs @@ -0,0 +1,47 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Render; + +namespace Decal.DecalRender +{ + [ComVisible(true)] + [Guid("218432A3-8960-4D91-BBC6-8CDC105C191E")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalRender.HUDBackground")] + public class HUDBackgroundImpl : IHUDBackground + { + private object _surface; + private tagRECT _region; + + // IRenderTarget + public bool Lost => false; + public void SetSurface(object pSurface) => _surface = pSurface; + public object GetSurface() => _surface; + public tagRECT Region { get => _region; set => _region = value; } + public tagRECT Constraints => _region; + public void Fill(ref tagRECT FillArea, int Color) { } + public void Clear(ref tagRECT ClearArea) { } + public void BeginRender(bool bFilterTexture) { } + public void EndRender() { } + public void BeginText(string FontName, int lHeight, int lWeight, bool bItalic) { } + public void EndText() { } + public void DrawPortalImage(int lPortalFile, ref tagRECT DestArea) { } + public void DrawPortalImageEx(int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea) { } + public void DrawImage(int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey) { } + public void WriteText(ref tagRECT Region, int lColor, int lFormat, string Text) { } + public void TilePortalImage(int lPortalFile, ref tagRECT DestArea) { } + public void TilePortalImageEx(int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea) { } + + public RenderTargetWrapper Constrain(ref tagRECT Region) + { + return (RenderTargetWrapper)(object)new RenderTargetWrapperImpl(); + } + + // IHUDBackground + public HUDBackground Clone() + { + var clone = new HUDBackgroundImpl { _region = _region, _surface = _surface }; + return (HUDBackground)(object)clone; + } + } +} diff --git a/Managed/Decal.DecalRender/HUDViewImpl.cs b/Managed/Decal.DecalRender/HUDViewImpl.cs new file mode 100644 index 0000000..7d4e071 --- /dev/null +++ b/Managed/Decal.DecalRender/HUDViewImpl.cs @@ -0,0 +1,74 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Render; + +namespace Decal.DecalRender +{ + [ComVisible(true)] + [Guid("EF810EF1-C843-4563-A3DE-19CE8BEEEEC0")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalRender.HUDView")] + public class HUDViewImpl : IHUDView + { + private static int _nextId; + private readonly int _id; + private object _surface; + private tagRECT _region; + private bool _enabled = true; + private float _scaleFactor = 1.0f; + private bool _scaling; + private float _angle; + private int _alpha = 255; + + public HUDViewImpl() + { + _id = System.Threading.Interlocked.Increment(ref _nextId); + } + + // IRenderTarget + public bool Lost => false; + public void SetSurface(object pSurface) => _surface = pSurface; + public object GetSurface() => _surface; + public tagRECT Region { get => _region; set => _region = value; } + public tagRECT Constraints => _region; + public void Fill(ref tagRECT FillArea, int Color) { } + public void Clear(ref tagRECT ClearArea) { } + public void BeginRender(bool bFilterTexture) { } + public void EndRender() { } + public void BeginText(string FontName, int lHeight, int lWeight, bool bItalic) { } + public void EndText() { } + public void DrawPortalImage(int lPortalFile, ref tagRECT DestArea) { } + public void DrawPortalImageEx(int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea) { } + public void DrawImage(int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey) { } + public void WriteText(ref tagRECT Region, int lColor, int lFormat, string Text) { } + public void TilePortalImage(int lPortalFile, ref tagRECT DestArea) { } + public void TilePortalImageEx(int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea) { } + + public RenderTargetWrapper Constrain(ref tagRECT Region) + { + return (RenderTargetWrapper)(object)new RenderTargetWrapperImpl(); + } + + // IRenderScalable + public void ScaleTo(ref tagRECT pArea) { _region = pArea; } + public float ScaleFactor { get => _scaleFactor; set => _scaleFactor = value; } + public bool Scaling { get => _scaling; set => _scaling = value; } + public tagRECT ScaleRect => _region; + + // IHUDView + public int ID => _id; + public bool Enabled { get => _enabled; set => _enabled = value; } + public void SetBackground(HUDBackground pBackground) { } + public float Angle { get => _angle; set => _angle = value; } + public int Alpha { get => _alpha; set => _alpha = value; } + public void PushClipRegion(ref tagRECT Region) { } + public void PopClipRegion() { } + public void RemoveClipping() { } + public bool IsClipped => false; + + public void MeasureText(string Text, out tagRECT pRet) + { + pRet = default; + } + } +} diff --git a/Managed/Decal.DecalRender/RenderServiceImpl.cs b/Managed/Decal.DecalRender/RenderServiceImpl.cs new file mode 100644 index 0000000..8eb4ed2 --- /dev/null +++ b/Managed/Decal.DecalRender/RenderServiceImpl.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Inject; +using Decal.Interop.Render; + +namespace Decal.DecalRender +{ + [ComVisible(true)] + [Guid("FB3C8286-88ED-4B4D-B413-94B40F346239")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces("Decal.Interop.Render.IRenderServiceEvents\0\0")] + [ProgId("DecalRender.RenderService")] + public class RenderServiceImpl : IRenderService, IDecalService, IDecalRender + { + public event IRenderServiceEvents_DeviceLostEventHandler DeviceLost; + + private object _device; + private readonly List _huds = new List(); + + // IRenderService + public object Device => _device; + + public HUDView CreateHUD(ref tagRECT pRegion) + { + var hud = new HUDViewImpl { Region = pRegion }; + _huds.Add(hud); + return (HUDView)(object)hud; + } + + public HUDBackground CreateBackground(ref tagRECT pRegion) + { + return (HUDBackground)(object)new HUDBackgroundImpl { Region = pRegion }; + } + + public HUDView EncapsulateHUD(ref tagPOINT Coords, object pSurface) + { + var region = new tagRECT { left = Coords.x, top = Coords.y }; + var hud = new HUDViewImpl { Region = region }; + hud.SetSurface(pSurface); + _huds.Add(hud); + return (HUDView)(object)hud; + } + + public HUDBackground EncapsulateBackground(ref tagPOINT Coords, object pSurface) + { + var region = new tagRECT { left = Coords.x, top = Coords.y }; + var bg = new HUDBackgroundImpl { Region = region }; + bg.SetSurface(pSurface); + return (HUDBackground)(object)bg; + } + + public void RemoveHUD(HUDView pHUD) + { + var impl = pHUD as HUDViewImpl; + if (impl != null) + _huds.Remove(impl); + } + + // IDecalService + public void Initialize(DecalCore pDecal) { } + public void BeforePlugins() { } + public void AfterPlugins() { } + public void Terminate() { _huds.Clear(); } + + // IDecalRender + public void Render2D() { } + public void Render3D() { } + public void PreReset() { DeviceLost?.Invoke(); } + public void PostReset() { } + public void ChangeHWND() { } + public void ChangeDirectX() { } + } +} diff --git a/Managed/Decal.DecalRender/RenderTargetImpl.cs b/Managed/Decal.DecalRender/RenderTargetImpl.cs new file mode 100644 index 0000000..65b46c8 --- /dev/null +++ b/Managed/Decal.DecalRender/RenderTargetImpl.cs @@ -0,0 +1,46 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.Render; + +namespace Decal.DecalRender +{ + [ComVisible(true)] + [Guid("175D6713-E942-41C0-8BC9-90A565024F76")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("DecalRender.RenderTargetWrapper")] + public class RenderTargetWrapperImpl : IRenderTarget + { + private object _surface; + private tagRECT _region; + + public bool Lost => false; + + public void SetSurface(object pSurface) => _surface = pSurface; + public object GetSurface() => _surface; + + public tagRECT Region { get => _region; set => _region = value; } + public tagRECT Constraints => _region; + + public void Fill(ref tagRECT FillArea, int Color) { } + public void Clear(ref tagRECT ClearArea) { } + + public void BeginRender(bool bFilterTexture) { } + public void EndRender() { } + + public void BeginText(string FontName, int lHeight, int lWeight, bool bItalic) { } + public void EndText() { } + + public void DrawPortalImage(int lPortalFile, ref tagRECT DestArea) { } + public void DrawPortalImageEx(int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea) { } + public void DrawImage(int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey) { } + public void WriteText(ref tagRECT Region, int lColor, int lFormat, string Text) { } + public void TilePortalImage(int lPortalFile, ref tagRECT DestArea) { } + public void TilePortalImageEx(int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea) { } + + public RenderTargetWrapper Constrain(ref tagRECT Region) + { + var wrapper = new RenderTargetWrapperImpl { _region = Region, _surface = _surface }; + return (RenderTargetWrapper)(object)wrapper; + } + } +} diff --git a/Managed/Decal.DenAgent/AgentForm.cs b/Managed/Decal.DenAgent/AgentForm.cs new file mode 100644 index 0000000..0e388cc --- /dev/null +++ b/Managed/Decal.DenAgent/AgentForm.cs @@ -0,0 +1,408 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace Decal.DenAgent +{ + /// + /// Main plugin management dialog. Shows all registered Decal plugins/services + /// with enable/disable toggle, drag-drop reordering, and version display. + /// Replaces the MFC CDenAgentDlg class. + /// + internal sealed class AgentForm : Form + { + private readonly ListView _pluginList; + private readonly ImageList _imageList; + private readonly Button _btnClose; + private readonly Button _btnAdd; + private readonly Button _btnRemove; + private readonly Button _btnRefresh; + private readonly Button _btnOptions; + private readonly Label _lblMessages; + private readonly Label _lblMemLocs; + + // Plugin group definitions matching the original DenAgent + private static readonly PluginGroup[] Groups = + { + new("Plugins", "Plugins", 0), + new("Network Filters", "NetworkFilters", 1), + new("File Filters", "FileFilters", 1), + new("Services", "Services", 2), + new("Surrogates", "Surrogates", 3), + new("Input Actions", "InputActions", 4), + }; + + public AgentForm() + { + Text = "Decal Agent " + GetAgentVersion(); + Size = new System.Drawing.Size(420, 360); + FormBorderStyle = FormBorderStyle.FixedDialog; + MaximizeBox = false; + StartPosition = FormStartPosition.CenterScreen; + + // Image list for enabled/disabled/group icons + _imageList = new ImageList { ImageSize = new System.Drawing.Size(16, 16) }; + // Index 0 = group (folder), 1 = enabled (check), 2 = disabled (x) + _imageList.Images.Add(CreateColorIcon(System.Drawing.Color.SteelBlue)); // 0: group + _imageList.Images.Add(CreateColorIcon(System.Drawing.Color.ForestGreen)); // 1: enabled + _imageList.Images.Add(CreateColorIcon(System.Drawing.Color.Gray)); // 2: disabled + + // Plugin list view + _pluginList = new ListView + { + Location = new System.Drawing.Point(10, 35), + Size = new System.Drawing.Size(295, 230), + View = View.Details, + FullRowSelect = true, + SmallImageList = _imageList, + HeaderStyle = ColumnHeaderStyle.None, + AllowDrop = true + }; + _pluginList.Columns.Add("Component", 210); + _pluginList.Columns.Add("Version", 80, HorizontalAlignment.Right); + _pluginList.MouseClick += OnPluginListClick; + Controls.Add(_pluginList); + + // Description label + var lblDesc = new Label + { + Text = "Choose the Plugins you'd like to run.", + Location = new System.Drawing.Point(10, 10), + Size = new System.Drawing.Size(390, 20) + }; + Controls.Add(lblDesc); + + // Buttons + int btnX = 320; + _btnClose = AddButton("Close", btnX, 300, (s, e) => Close()); + _btnRefresh = AddButton("Refresh", btnX, 270, (s, e) => LoadPluginList()); + _btnAdd = AddButton("Add", btnX, 35, (s, e) => OnAddPlugin()); + _btnRemove = AddButton("Remove", btnX, 65, (s, e) => OnRemovePlugin()); + _btnOptions = AddButton("Options", btnX, 105, (s, e) => OnShowOptions()); + + // Status labels + _lblMessages = new Label + { + Text = "Messages: -", + Location = new System.Drawing.Point(10, 275), + Size = new System.Drawing.Size(300, 16), + Font = new System.Drawing.Font("Segoe UI", 8f) + }; + Controls.Add(_lblMessages); + + _lblMemLocs = new Label + { + Text = "Memory Locations: -", + Location = new System.Drawing.Point(10, 293), + Size = new System.Drawing.Size(300, 16), + Font = new System.Drawing.Font("Segoe UI", 8f) + }; + Controls.Add(_lblMemLocs); + + AcceptButton = _btnClose; + + LoadPluginList(); + UpdateFileInfo(); + } + + private Button AddButton(string text, int x, int y, EventHandler click) + { + var btn = new Button + { + Text = text, + Location = new System.Drawing.Point(x, y), + Size = new System.Drawing.Size(80, 25) + }; + btn.Click += click; + Controls.Add(btn); + return btn; + } + + private void LoadPluginList() + { + _pluginList.BeginUpdate(); + _pluginList.Items.Clear(); + + foreach (var group in Groups) + { + // Add group header + var groupItem = new ListViewItem(group.DisplayName, 0) + { + Tag = null // Group headers have no tag + }; + groupItem.SubItems.Add(""); + _pluginList.Items.Add(groupItem); + + // Enumerate plugins in this group from registry + string keyPath = $@"SOFTWARE\Decal\{group.RegistryKey}"; + try + { + using var key = Registry.LocalMachine.OpenSubKey(keyPath); + if (key == null) continue; + + foreach (string clsid in key.GetSubKeyNames()) + { + using var pluginKey = key.OpenSubKey(clsid); + if (pluginKey == null) continue; + + string name = pluginKey.GetValue("FriendlyName") as string + ?? pluginKey.GetValue("") as string + ?? clsid; + + bool enabled = true; + object enabledVal = pluginKey.GetValue("Enabled"); + if (enabledVal is int ei) + enabled = ei != 0; + + var info = new PluginInfo(clsid, group.RegistryKey, name, enabled); + int imageIdx = enabled ? 1 : 2; + + var item = new ListViewItem(" " + name, imageIdx) + { + Tag = info, + IndentCount = 1 + }; + + // Get version from COM registration + string version = GetPluginVersion(clsid); + item.SubItems.Add(version); + + _pluginList.Items.Add(item); + } + } + catch { /* Skip groups we can't read */ } + } + + _pluginList.EndUpdate(); + } + + private void OnPluginListClick(object sender, MouseEventArgs e) + { + var hitTest = _pluginList.HitTest(e.Location); + if (hitTest.Item == null) return; + + var info = hitTest.Item.Tag as PluginInfo; + if (info == null) return; // Group header + + // Toggle enabled state when clicking the icon area + if (e.X < 40) + { + info.Enabled = !info.Enabled; + hitTest.Item.ImageIndex = info.Enabled ? 1 : 2; + + // Save to registry + try + { + string keyPath = $@"SOFTWARE\Decal\{info.GroupKey}\{info.Clsid}"; + using var key = Registry.LocalMachine.OpenSubKey(keyPath, writable: true); + key?.SetValue("Enabled", info.Enabled ? 1 : 0, RegistryValueKind.DWord); + } + catch { /* May need admin rights */ } + } + } + + private void OnAddPlugin() + { + using var dlg = new OpenFileDialog + { + Title = "Select Plugin DLL", + Filter = "DLL files (*.dll)|*.dll|All files (*.*)|*.*", + CheckFileExists = true + }; + + if (dlg.ShowDialog(this) != DialogResult.OK) + return; + + // Register the DLL as a COM server and add to Decal registry + string dllPath = dlg.FileName; + try + { + var psi = new ProcessStartInfo + { + FileName = "regsvr32.exe", + Arguments = $"/s \"{dllPath}\"", + UseShellExecute = true, + Verb = "runas" + }; + Process.Start(psi)?.WaitForExit(); + LoadPluginList(); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to register plugin: {ex.Message}", "Error", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void OnRemovePlugin() + { + if (_pluginList.SelectedItems.Count == 0) return; + var item = _pluginList.SelectedItems[0]; + var info = item.Tag as PluginInfo; + if (info == null) return; + + var result = MessageBox.Show( + $"Remove plugin '{info.Name}'?\nThis will unregister it from Decal.", + "Remove Plugin", + MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); + + if (result != DialogResult.OK) return; + + try + { + // Check for uninstaller + string keyPath = $@"SOFTWARE\Decal\{info.GroupKey}\{info.Clsid}"; + using var key = Registry.LocalMachine.OpenSubKey(keyPath); + string uninstaller = key?.GetValue("Uninstaller") as string; + + if (!string.IsNullOrEmpty(uninstaller)) + { + Process.Start(uninstaller); + } + else + { + // Just delete the registry entry + string parentPath = $@"SOFTWARE\Decal\{info.GroupKey}"; + using var parentKey = Registry.LocalMachine.OpenSubKey(parentPath, writable: true); + parentKey?.DeleteSubKeyTree(info.Clsid, false); + } + + LoadPluginList(); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to remove plugin: {ex.Message}", "Error", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void OnShowOptions() + { + using var dlg = new OptionsForm(); + dlg.ShowDialog(this); + } + + private static string GetPluginVersion(string clsid) + { + try + { + string keyPath = $@"CLSID\{clsid}\InprocServer32"; + using var key = Registry.ClassesRoot.OpenSubKey(keyPath); + if (key == null) return ""; + + string dllPath = key.GetValue("") as string ?? ""; + + // .NET assemblies register as mscoree.dll; get the CodeBase instead + if (dllPath.EndsWith("mscoree.dll", StringComparison.OrdinalIgnoreCase)) + { + string codeBase = key.GetValue("CodeBase") as string ?? ""; + if (codeBase.StartsWith("file:///", StringComparison.OrdinalIgnoreCase)) + dllPath = codeBase.Substring(8).Replace('/', '\\'); + } + + if (!File.Exists(dllPath)) + return ""; + + var vi = FileVersionInfo.GetVersionInfo(dllPath); + return vi.FileVersion ?? ""; + } + catch + { + return ""; + } + } + + private void UpdateFileInfo() + { + // Check for XML data files used by Decal + string agentPath = GetAgentPath(); + if (string.IsNullOrEmpty(agentPath)) return; + + string messagesFile = Path.Combine(agentPath, "messages.xml"); + string memlocsFile = Path.Combine(agentPath, "memlocs.xml"); + + _lblMessages.Text = "Messages: " + (File.Exists(messagesFile) + ? File.GetLastWriteTime(messagesFile).ToString("yyyy-MM-dd HH:mm") + : "Not found"); + + _lblMemLocs.Text = "Memory Locations: " + (File.Exists(memlocsFile) + ? File.GetLastWriteTime(memlocsFile).ToString("yyyy-MM-dd HH:mm") + : "Not found"); + } + + private static string GetAgentPath() + { + try + { + using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Decal\Agent"); + return key?.GetValue("AgentPath") as string ?? ""; + } + catch { return ""; } + } + + private static string GetAgentVersion() + { + try + { + var vi = FileVersionInfo.GetVersionInfo( + System.Reflection.Assembly.GetExecutingAssembly().Location); + return vi.FileVersion ?? "0.0.0.0"; + } + catch { return "0.0.0.0"; } + } + + private static System.Drawing.Icon CreateColorIcon(System.Drawing.Color color) + { + using var bmp = new System.Drawing.Bitmap(16, 16); + using var g = System.Drawing.Graphics.FromImage(bmp); + g.Clear(System.Drawing.Color.Transparent); + using var brush = new System.Drawing.SolidBrush(color); + g.FillEllipse(brush, 2, 2, 12, 12); + return System.Drawing.Icon.FromHandle(bmp.GetHicon()); + } + + protected override void OnFormClosing(FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing) + { + e.Cancel = true; + Hide(); + } + else + { + base.OnFormClosing(e); + } + } + + private class PluginGroup + { + public string DisplayName { get; } + public string RegistryKey { get; } + public int IconIndex { get; } + public PluginGroup(string displayName, string registryKey, int iconIndex) + { + DisplayName = displayName; + RegistryKey = registryKey; + IconIndex = iconIndex; + } + } + + private class PluginInfo + { + public string Clsid { get; } + public string GroupKey { get; } + public string Name { get; } + public bool Enabled { get; set; } + + public PluginInfo(string clsid, string groupKey, string name, bool enabled) + { + Clsid = clsid; + GroupKey = groupKey; + Name = name; + Enabled = enabled; + } + } + } +} diff --git a/Managed/Decal.DenAgent/Decal.DenAgent.csproj b/Managed/Decal.DenAgent/Decal.DenAgent.csproj new file mode 100644 index 0000000..38c8246 --- /dev/null +++ b/Managed/Decal.DenAgent/Decal.DenAgent.csproj @@ -0,0 +1,10 @@ + + + WinExe + true + + + + + + diff --git a/Managed/Decal.DenAgent/OptionsForm.cs b/Managed/Decal.DenAgent/OptionsForm.cs new file mode 100644 index 0000000..1bb5b4e --- /dev/null +++ b/Managed/Decal.DenAgent/OptionsForm.cs @@ -0,0 +1,226 @@ +using System; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace Decal.DenAgent +{ + /// + /// Options/settings dialog for Decal configuration. + /// Manages registry settings under HKLM\SOFTWARE\Decal. + /// Replaces the MFC cOptionsDlg class. + /// + internal sealed class OptionsForm : Form + { + private readonly NumericUpDown _nudBarAlpha; + private readonly NumericUpDown _nudViewAlpha; + private readonly ComboBox _cbDockPos; + private readonly CheckBox _chkTimestamp; + private readonly TextBox _txtTimestampFormat; + private readonly CheckBox _chkWindowed; + private readonly CheckBox _chkDualLog; + private readonly CheckBox _chkNoMovies; + private readonly CheckBox _chkNoSplash; + + public OptionsForm() + { + Text = "Decal Options"; + Size = new System.Drawing.Size(380, 340); + FormBorderStyle = FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + StartPosition = FormStartPosition.CenterParent; + + int y = 15; + + // View Options group + var grpView = new GroupBox + { + Text = "View Options", + Location = new System.Drawing.Point(10, y), + Size = new System.Drawing.Size(350, 90) + }; + Controls.Add(grpView); + + grpView.Controls.Add(new Label { Text = "Bar Alpha:", Location = new System.Drawing.Point(10, 25), AutoSize = true }); + _nudBarAlpha = new NumericUpDown + { + Location = new System.Drawing.Point(100, 22), + Size = new System.Drawing.Size(60, 23), + Minimum = 0, Maximum = 255, Value = 255 + }; + grpView.Controls.Add(_nudBarAlpha); + + grpView.Controls.Add(new Label { Text = "View Alpha:", Location = new System.Drawing.Point(180, 25), AutoSize = true }); + _nudViewAlpha = new NumericUpDown + { + Location = new System.Drawing.Point(270, 22), + Size = new System.Drawing.Size(60, 23), + Minimum = 0, Maximum = 255, Value = 255 + }; + grpView.Controls.Add(_nudViewAlpha); + + grpView.Controls.Add(new Label { Text = "Dock Position:", Location = new System.Drawing.Point(10, 58), AutoSize = true }); + _cbDockPos = new ComboBox + { + Location = new System.Drawing.Point(100, 55), + Size = new System.Drawing.Size(100, 23), + DropDownStyle = ComboBoxStyle.DropDownList + }; + _cbDockPos.Items.AddRange(new object[] { "Top", "Left", "Right" }); + _cbDockPos.SelectedIndex = 0; + grpView.Controls.Add(_cbDockPos); + + y += 100; + + // Timestamp group + var grpTS = new GroupBox + { + Text = "Time Stamping", + Location = new System.Drawing.Point(10, y), + Size = new System.Drawing.Size(350, 55) + }; + Controls.Add(grpTS); + + _chkTimestamp = new CheckBox + { + Text = "Enable Timestamps", + Location = new System.Drawing.Point(10, 22), + AutoSize = true + }; + _chkTimestamp.CheckedChanged += (s, e) => _txtTimestampFormat.Enabled = _chkTimestamp.Checked; + grpTS.Controls.Add(_chkTimestamp); + + grpTS.Controls.Add(new Label { Text = "Format:", Location = new System.Drawing.Point(170, 24), AutoSize = true }); + _txtTimestampFormat = new TextBox + { + Location = new System.Drawing.Point(220, 21), + Size = new System.Drawing.Size(110, 23), + Text = "[%H:%M]", + Enabled = false + }; + grpTS.Controls.Add(_txtTimestampFormat); + + y += 65; + + // Client Patches group + var grpPatches = new GroupBox + { + Text = "Client Patches", + Location = new System.Drawing.Point(10, y), + Size = new System.Drawing.Size(350, 90) + }; + Controls.Add(grpPatches); + + _chkWindowed = new CheckBox + { + Text = "Allow Windowed Mode", + Location = new System.Drawing.Point(10, 20), + AutoSize = true + }; + grpPatches.Controls.Add(_chkWindowed); + + _chkDualLog = new CheckBox + { + Text = "Allow Dual Logging", + Location = new System.Drawing.Point(10, 42), + AutoSize = true + }; + grpPatches.Controls.Add(_chkDualLog); + + _chkNoMovies = new CheckBox + { + Text = "Disable Movies", + Location = new System.Drawing.Point(190, 20), + AutoSize = true + }; + grpPatches.Controls.Add(_chkNoMovies); + + _chkNoSplash = new CheckBox + { + Text = "Disable Splash Screen", + Location = new System.Drawing.Point(190, 42), + AutoSize = true + }; + grpPatches.Controls.Add(_chkNoSplash); + + y += 100; + + // OK / Cancel buttons + var btnOK = new Button + { + Text = "OK", + DialogResult = DialogResult.OK, + Location = new System.Drawing.Point(200, y), + Size = new System.Drawing.Size(75, 25) + }; + btnOK.Click += OnOK; + Controls.Add(btnOK); + + var btnCancel = new Button + { + Text = "Cancel", + DialogResult = DialogResult.Cancel, + Location = new System.Drawing.Point(285, y), + Size = new System.Drawing.Size(75, 25) + }; + Controls.Add(btnCancel); + + AcceptButton = btnOK; + CancelButton = btnCancel; + + LoadSettings(); + } + + private void LoadSettings() + { + try + { + using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Decal"); + if (key == null) return; + + _nudBarAlpha.Value = Math.Min(255, Math.Max(0, (int)(key.GetValue("BarAlpha") ?? 255))); + _nudViewAlpha.Value = Math.Min(255, Math.Max(0, (int)(key.GetValue("ViewAlpha") ?? 255))); + + int dockPos = (int)(key.GetValue("BarDock") ?? 0); + if (dockPos >= 0 && dockPos < _cbDockPos.Items.Count) + _cbDockPos.SelectedIndex = dockPos; + + _chkTimestamp.Checked = ((int)(key.GetValue("Timestamp") ?? 0)) != 0; + _txtTimestampFormat.Text = key.GetValue("TimestampFormat") as string ?? "[%H:%M]"; + _txtTimestampFormat.Enabled = _chkTimestamp.Checked; + + _chkWindowed.Checked = ((int)(key.GetValue("AllowWindowed") ?? 0)) != 0; + _chkDualLog.Checked = ((int)(key.GetValue("AllowDualLog") ?? 0)) != 0; + _chkNoMovies.Checked = ((int)(key.GetValue("NoMovies") ?? 0)) != 0; + _chkNoSplash.Checked = ((int)(key.GetValue("NoSplash") ?? 0)) != 0; + } + catch { /* Default values are fine */ } + } + + private void OnOK(object sender, EventArgs e) + { + try + { + using var key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Decal"); + if (key == null) return; + + key.SetValue("BarAlpha", (int)_nudBarAlpha.Value, RegistryValueKind.DWord); + key.SetValue("ViewAlpha", (int)_nudViewAlpha.Value, RegistryValueKind.DWord); + key.SetValue("BarDock", _cbDockPos.SelectedIndex, RegistryValueKind.DWord); + + key.SetValue("Timestamp", _chkTimestamp.Checked ? 1 : 0, RegistryValueKind.DWord); + key.SetValue("TimestampFormat", _txtTimestampFormat.Text); + + key.SetValue("AllowWindowed", _chkWindowed.Checked ? 1 : 0, RegistryValueKind.DWord); + key.SetValue("AllowDualLog", _chkDualLog.Checked ? 1 : 0, RegistryValueKind.DWord); + key.SetValue("NoMovies", _chkNoMovies.Checked ? 1 : 0, RegistryValueKind.DWord); + key.SetValue("NoSplash", _chkNoSplash.Checked ? 1 : 0, RegistryValueKind.DWord); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to save settings: {ex.Message}\n\nYou may need to run as Administrator.", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/Managed/Decal.DenAgent/Program.cs b/Managed/Decal.DenAgent/Program.cs new file mode 100644 index 0000000..7414882 --- /dev/null +++ b/Managed/Decal.DenAgent/Program.cs @@ -0,0 +1,26 @@ +using System; +using System.Threading; +using System.Windows.Forms; + +namespace Decal.DenAgent +{ + static class Program + { + [STAThread] + static void Main() + { + // Single instance check + using var mutex = new Mutex(true, "DecalAgentMutex", out bool createdNew); + if (!createdNew) + { + MessageBox.Show("Decal Agent is already running.", "Decal Agent", + MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new TrayContext()); + } + } +} diff --git a/Managed/Decal.DenAgent/TrayContext.cs b/Managed/Decal.DenAgent/TrayContext.cs new file mode 100644 index 0000000..9032b34 --- /dev/null +++ b/Managed/Decal.DenAgent/TrayContext.cs @@ -0,0 +1,265 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace Decal.DenAgent +{ + /// + /// Application context that manages the system tray icon and lobby injection timer. + /// Replaces the MFC CTrayWnd class. + /// + internal sealed class TrayContext : ApplicationContext + { + private readonly NotifyIcon _trayIcon; + private readonly Timer _lobbyTimer; + private AgentForm _agentForm; + + // P/Invoke for window enumeration and DLL injection + [DllImport("user32.dll")] + private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int GetClassName(IntPtr hWnd, char[] lpClassName, int nMaxCount); + + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + + [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] + private static extern IntPtr CreateSemaphore(IntPtr lpAttributes, int lInitialCount, + int lMaximumCount, string lpName); + + [DllImport("kernel32.dll")] + private static extern bool CloseHandle(IntPtr hObject); + + // LauncherHook P/Invoke + [DllImport("LauncherHook.dll", CallingConvention = CallingConvention.StdCall)] + private static extern void LauncherHookEnable(); + + [DllImport("LauncherHook.dll", CallingConvention = CallingConvention.StdCall)] + private static extern void LauncherHookDisable(); + + // Inject.DLL injection via CreateRemoteThread + [DllImport("kernel32.dll", SetLastError = true)] + private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId); + + [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] + private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, + uint dwSize, uint flAllocationType, uint flProtect); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, + byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten); + + [DllImport("kernel32.dll")] + private static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, + uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, out uint lpThreadId); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + private static extern IntPtr GetModuleHandle(string lpModuleName); + + [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)] + private static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + + [DllImport("kernel32.dll")] + private static extern uint WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds); + + [DllImport("kernel32.dll")] + private static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, + uint dwSize, uint dwFreeType); + + private const uint PROCESS_ALL_ACCESS = 0x001F0FFF; + private const uint MEM_COMMIT = 0x1000; + private const uint MEM_RELEASE = 0x8000; + private const uint PAGE_READWRITE = 0x04; + + private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); + + public TrayContext() + { + // Store agent path in registry + StoreAgentPath(); + + // Create tray icon + _trayIcon = new NotifyIcon + { + Text = "Decal Agent", + Icon = LoadTrayIcon(), + Visible = true, + ContextMenuStrip = CreateContextMenu() + }; + _trayIcon.DoubleClick += (s, e) => ShowAgentForm(); + + // Start timer to detect lobby windows for injection + _lobbyTimer = new Timer { Interval = 1000 }; + _lobbyTimer.Tick += OnLobbyTimerTick; + _lobbyTimer.Start(); + } + + private static System.Drawing.Icon LoadTrayIcon() + { + // Try to load custom icon; fall back to default app icon + string iconPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "decal.ico"); + if (File.Exists(iconPath)) + return new System.Drawing.Icon(iconPath); + + return System.Drawing.SystemIcons.Application; + } + + private ContextMenuStrip CreateContextMenu() + { + var menu = new ContextMenuStrip(); + menu.Items.Add("Configure", null, (s, e) => ShowAgentForm()); + menu.Items.Add(new ToolStripSeparator()); + menu.Items.Add("Exit", null, (s, e) => ExitApplication()); + return menu; + } + + private void ShowAgentForm() + { + if (_agentForm == null || _agentForm.IsDisposed) + { + _agentForm = new AgentForm(); + } + _agentForm.Show(); + _agentForm.BringToFront(); + _agentForm.Activate(); + } + + private void StoreAgentPath() + { + try + { + string agentPath = AppDomain.CurrentDomain.BaseDirectory; + if (agentPath.EndsWith(Path.DirectorySeparatorChar.ToString())) + agentPath = agentPath.TrimEnd(Path.DirectorySeparatorChar); + + using var key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Decal\Agent"); + key?.SetValue("AgentPath", agentPath); + } + catch + { + // May fail without admin rights - that's okay, path may already be set + } + } + + private void OnLobbyTimerTick(object sender, EventArgs e) + { + // Enumerate windows looking for lobby/launcher windows to inject into + EnumWindows(OnEnumWindow, IntPtr.Zero); + } + + private bool OnEnumWindow(IntPtr hWnd, IntPtr lParam) + { + var className = new char[256]; + int len = GetClassName(hWnd, className, className.Length); + string name = new string(className, 0, len); + + // Look for Asheron's Call lobby window class + if (name != "ZoneLobbyWindow") + return true; + + GetWindowThreadProcessId(hWnd, out uint processId); + if (processId == 0) + return true; + + // Check if already injected via named semaphore + string semName = $"__LOBBYHOOK_{processId}"; + IntPtr hSem = CreateSemaphore(IntPtr.Zero, 0, 1, semName); + if (hSem != IntPtr.Zero) + { + bool alreadyExists = Marshal.GetLastWin32Error() == 183; // ERROR_ALREADY_EXISTS + CloseHandle(hSem); + if (alreadyExists) + return true; + } + + // Inject LauncherHook.DLL into the lobby process + string agentPath = GetAgentPath(); + if (!string.IsNullOrEmpty(agentPath)) + { + string hookDll = Path.Combine(agentPath, "LauncherHook.dll"); + if (File.Exists(hookDll)) + InjectDll(processId, hookDll); + } + + return true; + } + + private static string GetAgentPath() + { + try + { + using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Decal\Agent"); + return key?.GetValue("AgentPath") as string ?? ""; + } + catch { return ""; } + } + + private static bool InjectDll(uint processId, string dllPath) + { + IntPtr hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, processId); + if (hProcess == IntPtr.Zero) + return false; + + try + { + byte[] pathBytes = System.Text.Encoding.Unicode.GetBytes(dllPath + '\0'); + uint pathSize = (uint)pathBytes.Length; + + IntPtr remoteMem = VirtualAllocEx(hProcess, IntPtr.Zero, pathSize, MEM_COMMIT, PAGE_READWRITE); + if (remoteMem == IntPtr.Zero) + return false; + + if (!WriteProcessMemory(hProcess, remoteMem, pathBytes, pathSize, out _)) + { + VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE); + return false; + } + + IntPtr kernel32 = GetModuleHandle("kernel32.dll"); + IntPtr loadLibW = GetProcAddress(kernel32, "LoadLibraryW"); + + IntPtr hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, + loadLibW, remoteMem, 0, out _); + + if (hThread == IntPtr.Zero) + { + VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE); + return false; + } + + WaitForSingleObject(hThread, 10000); + CloseHandle(hThread); + VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE); + return true; + } + finally + { + CloseHandle(hProcess); + } + } + + private void ExitApplication() + { + _lobbyTimer.Stop(); + _lobbyTimer.Dispose(); + _trayIcon.Visible = false; + _trayIcon.Dispose(); + Application.Exit(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _lobbyTimer?.Dispose(); + _trayIcon?.Dispose(); + _agentForm?.Dispose(); + } + base.Dispose(disposing); + } + } +} diff --git a/Managed/Decal.FileService/Decal.FileService.csproj b/Managed/Decal.FileService/Decal.FileService.csproj new file mode 100644 index 0000000..5dfa86b --- /dev/null +++ b/Managed/Decal.FileService/Decal.FileService.csproj @@ -0,0 +1,9 @@ + + + Decal.FileService + + + + + + diff --git a/Managed/Decal.FileService/Decal.Filters/Attrib.cs b/Managed/Decal.FileService/Decal.Filters/Attrib.cs new file mode 100644 index 0000000..5c043d8 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Attrib.cs @@ -0,0 +1,46 @@ +namespace Decal.Filters; + +public class Attrib : IIdNameTableEntry +{ + private int mID; + + private string mName; + + private int mIconId; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + public int IconId + { + get + { + return mIconId; + } + internal set + { + mIconId = value; + } + } + + internal Attrib(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/AttributeTable.cs b/Managed/Decal.FileService/Decal.Filters/AttributeTable.cs new file mode 100644 index 0000000..eb0063e --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/AttributeTable.cs @@ -0,0 +1,35 @@ +namespace Decal.Filters; + +public sealed class AttributeTable : IdNameTable +{ + internal AttributeTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 620756998) + { + return false; + } + Index++; + int num = Get.Byte(Data, ref Index); + InitializeTable(num); + for (int i = 0; i < num; i++) + { + Attrib attrib = new Attrib(Get.DWord(Data, ref Index)); + attrib.IconId = Get.DWord(Data, ref Index); + Add(attrib); + } + Index++; + num = Get.Byte(Data, ref Index); + for (int j = 0; j < num; j++) + { + int id = Get.DWord(Data, ref Index); + GetById(id).Name = Get.PString(Data, ref Index); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/AttributeXPTable.cs b/Managed/Decal.FileService/Decal.Filters/AttributeXPTable.cs new file mode 100644 index 0000000..b3943fa --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/AttributeXPTable.cs @@ -0,0 +1,19 @@ +namespace Decal.Filters; + +public sealed class AttributeXPTable : RawTable +{ + internal AttributeXPTable(int Length) + { + InitializeTable(Length); + } + + internal override bool LoadFrom(byte[] Data) + { + return true; + } + + internal new void Add(long Entry) + { + base.Add(Entry); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/CharacterSkillCreditsTable.cs b/Managed/Decal.FileService/Decal.Filters/CharacterSkillCreditsTable.cs new file mode 100644 index 0000000..1e92602 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/CharacterSkillCreditsTable.cs @@ -0,0 +1,19 @@ +namespace Decal.Filters; + +public sealed class CharacterSkillCreditsTable : RawTable +{ + internal CharacterSkillCreditsTable(int Length) + { + InitializeTable(Length); + } + + internal override bool LoadFrom(byte[] Data) + { + return true; + } + + internal new void Add(byte Entry) + { + base.Add(Entry); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/CharacterXPTable.cs b/Managed/Decal.FileService/Decal.Filters/CharacterXPTable.cs new file mode 100644 index 0000000..c4e0c9b --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/CharacterXPTable.cs @@ -0,0 +1,19 @@ +namespace Decal.Filters; + +public sealed class CharacterXPTable : RawTable +{ + internal CharacterXPTable(int Length) + { + InitializeTable(Length); + } + + internal override bool LoadFrom(byte[] Data) + { + return true; + } + + internal new void Add(long Entry) + { + base.Add(Entry); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Component.cs b/Managed/Decal.FileService/Decal.Filters/Component.cs new file mode 100644 index 0000000..6c23ce4 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Component.cs @@ -0,0 +1,130 @@ +namespace Decal.Filters; + +public class Component : IIdNameTableEntry +{ + private int mID; + + private string mName; + + private ComponentType mType; + + private int mIconId; + + private int mSort; + + private int mGestureID; + + private float mGestureSpeed; + + private string mWord; + + private float mBurnRate; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + public ComponentType Type + { + get + { + return mType; + } + internal set + { + mType = value; + } + } + + public int IconId + { + get + { + return mIconId; + } + internal set + { + mIconId = value; + } + } + + public int SortKey + { + get + { + return mSort; + } + internal set + { + mSort = value; + } + } + + public int GestureId + { + get + { + return mGestureID; + } + internal set + { + mGestureID = value; + } + } + + public float GestureSpeed + { + get + { + return mGestureSpeed; + } + internal set + { + mGestureSpeed = value; + } + } + + public string Word + { + get + { + return mWord; + } + internal set + { + mWord = value; + } + } + + public float BurnRate + { + get + { + return mBurnRate; + } + internal set + { + mBurnRate = value; + } + } + + internal Component(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/ComponentTable.cs b/Managed/Decal.FileService/Decal.Filters/ComponentTable.cs new file mode 100644 index 0000000..72491a7 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/ComponentTable.cs @@ -0,0 +1,35 @@ +namespace Decal.Filters; + +public sealed class ComponentTable : IdNameTable +{ + internal ComponentTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 234881039) + { + return false; + } + int num = Get.Word(Data, ref Index); + InitializeTable(num); + Index += 2; + for (int i = 0; i < num; i++) + { + Component component = new Component(Get.DWord(Data, ref Index)); + component.Name = Get.EncString(Data, ref Index); + component.Type = ComponentType.GetById(Get.DWord(Data, ref Index)); + component.IconId = Get.DWord(Data, ref Index); + component.SortKey = Get.DWord(Data, ref Index); + component.GestureId = Get.DWord(Data, ref Index); + component.GestureSpeed = Get.Float(Data, ref Index); + component.Word = Get.EncString(Data, ref Index); + component.BurnRate = Get.Float(Data, ref Index); + Add(component); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/ComponentType.cs b/Managed/Decal.FileService/Decal.Filters/ComponentType.cs new file mode 100644 index 0000000..d105cc3 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/ComponentType.cs @@ -0,0 +1,60 @@ +using System.Globalization; + +namespace Decal.Filters; + +public class ComponentType +{ + private static ComponentType[] sTypes = new ComponentType[7] + { + new ComponentType(0, "Scarab"), + new ComponentType(1, "Herb"), + new ComponentType(2, "Powder"), + new ComponentType(3, "Potion"), + new ComponentType(4, "Talisman"), + new ComponentType(5, "Taper"), + new ComponentType(6, "Pea") + }; + + private int mId; + + private string mName; + + public int Id => mId; + + public string Name => mName; + + public static ComponentType GetById(int id) + { + for (int i = 0; i < sTypes.Length; i++) + { + if (sTypes[i].Id == id) + { + return sTypes[i]; + } + } + return null; + } + + public static ComponentType GetByName(string name) + { + for (int i = 0; i < sTypes.Length; i++) + { + if (string.Compare(sTypes[i].Name, name, ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + return sTypes[i]; + } + } + return null; + } + + private ComponentType(int id, string Name) + { + mId = id; + mName = Name; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/FileService.cs b/Managed/Decal.FileService/Decal.Filters/FileService.cs new file mode 100644 index 0000000..6e66ffd --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/FileService.cs @@ -0,0 +1,179 @@ +using System; +using Decal.Adapter; +using Decal.Interop.Dat; + +namespace Decal.Filters; + +public sealed class FileService : FilterBase +{ + private AttributeTable mAttributeTable; + + private VitalTable mVitalTable; + + private VitalFormulaTable mVitalFormulaTable; + + private SkillTable mSkillTable; + + private ComponentTable mComponentTable; + + private SpellTable mSpellTable; + + private LevelTables mLevelTables; + + private GenderTable mGenderTable; + + private HeritageTable mHeritageTable; + + private SpeciesTable mSpeciesTable; + + private MaterialTable mMaterialTable; + + public override string ReferenceName => "Decal.FileService"; + + public AttributeTable AttributeTable => mAttributeTable; + + public VitalTable VitalTable => mVitalTable; + + public VitalFormulaTable VitalFormulaTable => mVitalFormulaTable; + + public SkillTable SkillTable => mSkillTable; + + public ComponentTable ComponentTable => mComponentTable; + + public SpellTable SpellTable => mSpellTable; + + public LevelTables LevelTables => mLevelTables; + + public GenderTable GenderTable => mGenderTable; + + public HeritageTable HeritageTable => mHeritageTable; + + public SpeciesTable SpeciesTable => mSpeciesTable; + + public MaterialTable MaterialTable => mMaterialTable; + + public event EventHandler OnUpdatePortal; + + public event EventHandler OnUpdateCell; + + protected override void Startup() + { + base.ServerDispatch += OnServerDispatch; + mAttributeTable = new AttributeTable(GetPortalFile(620756998)); + mVitalTable = new VitalTable(GetPortalFile(620756999)); + mVitalFormulaTable = new VitalFormulaTable(GetPortalFile(234881027)); + mSkillTable = new SkillTable(GetPortalFile(234881028)); + mComponentTable = new ComponentTable(GetPortalFile(234881039)); + mSpellTable = new SpellTable(GetPortalFile(234881038)); + mLevelTables = new LevelTables(GetPortalFile(234881048)); + mGenderTable = new GenderTable(GetPortalFile(570425354)); + mHeritageTable = new HeritageTable(GetPortalFile(570425355)); + mSpeciesTable = new SpeciesTable(GetPortalFile(570425358)); + mMaterialTable = new MaterialTable(GetPortalFile(654311424)); + } + + protected override void Shutdown() + { + base.ServerDispatch -= OnServerDispatch; + mAttributeTable = null; + mVitalTable = null; + mVitalFormulaTable = null; + mSkillTable = null; + mComponentTable = null; + mSpellTable = null; + mLevelTables = null; + mGenderTable = null; + mHeritageTable = null; + mSpeciesTable = null; + mMaterialTable = null; + } + + private void OnServerDispatch(object sender, NetworkMessageEventArgs e) + { + Message message = e.Message; + if (message.Type != 63458) + { + return; + } + int num = message.Value("type"); + if (num == 1 || num == 2) + { + int num2 = message.Value("resource"); + byte[] data = message.Value("compression") switch + { + 0 => message.RawValue("data"), + 1 => zlib.Inflate(message.RawValue("data"), message.Value("fileSize")), + _ => null, + }; + switch (num2) + { + case 620756998: + mAttributeTable.UpdateFrom(data); + break; + case 620756999: + mVitalTable.UpdateFrom(data); + break; + case 234881027: + mVitalFormulaTable.UpdateFrom(data); + break; + case 234881028: + mSkillTable.UpdateFrom(data); + break; + case 234881039: + mComponentTable.UpdateFrom(data); + break; + case 234881038: + mSpellTable.UpdateFrom(data); + break; + case 234881048: + mLevelTables.UpdateFrom(data); + break; + case 570425354: + mGenderTable.UpdateFrom(data); + break; + case 570425355: + mHeritageTable.UpdateFrom(data); + break; + case 570425358: + mSpeciesTable.UpdateFrom(data); + break; + case 654311424: + mMaterialTable.UpdateFrom(data); + break; + } + switch (num) + { + case 1: + this.OnUpdatePortal(this, new UpdateEventArgs(num2)); + break; + case 2: + this.OnUpdateCell(this, new UpdateEventArgs(num2)); + break; + } + } + } + + public byte[] GetPortalFile(int fileId) + { + return GetFile("services\\DecalDat.DatService\\portal\\" + fileId.ToString("X8")); + } + + public byte[] GetCellFile(int fileId) + { + return GetFile("services\\DecalDat.DatService\\cell\\" + fileId.ToString("X8")); + } + + private byte[] GetFile(string decalObject) + { + IDatStream datStream = (IDatStream)base.Host.Decal.GetObject(decalObject, "{B27D3F72-2640-432F-BAE4-175E1AA0CA39}"); + if (datStream == null) + { + return null; + } + int size = datStream.Size; + byte[] array = (byte[])Array.CreateInstance(typeof(byte), size); + datStream.Restart(); + datStream.ReadBinary(size, ref array[0]); + return array; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Gender.cs b/Managed/Decal.FileService/Decal.Filters/Gender.cs new file mode 100644 index 0000000..0a2ff4f --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Gender.cs @@ -0,0 +1,32 @@ +namespace Decal.Filters; + +public class Gender : IIdNameTableEntry +{ + private int mID; + + private string mName; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + internal Gender(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/GenderTable.cs b/Managed/Decal.FileService/Decal.Filters/GenderTable.cs new file mode 100644 index 0000000..7fb79e7 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/GenderTable.cs @@ -0,0 +1,28 @@ +namespace Decal.Filters; + +public sealed class GenderTable : IdNameTable +{ + internal GenderTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 570425354) + { + return false; + } + Index += 5; + int num = Get.Byte(Data, ref Index); + InitializeTable(num); + for (int i = 0; i < num; i++) + { + Gender gender = new Gender(Get.DWord(Data, ref Index)); + gender.Name = Get.PString(Data, ref Index); + Add(gender); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Get.cs b/Managed/Decal.FileService/Decal.Filters/Get.cs new file mode 100644 index 0000000..d267d99 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Get.cs @@ -0,0 +1,102 @@ +using System; +using System.Text; + +namespace Decal.Filters; + +internal static class Get +{ + internal static byte Byte(byte[] Data, ref int Index) + { + return Data[Index++]; + } + + internal static int Word(byte[] Data, ref int Index) + { + ushort result = BitConverter.ToUInt16(Data, Index); + Index += 2; + return result; + } + + internal static int DWord(byte[] Data, ref int Index) + { + int result = BitConverter.ToInt32(Data, Index); + Index += 4; + return result; + } + + internal static long QWord(byte[] Data, ref int Index) + { + long result = BitConverter.ToInt64(Data, Index); + Index += 8; + return result; + } + + internal static float Float(byte[] Data, ref int Index) + { + float result = BitConverter.ToSingle(Data, Index); + Index += 4; + return result; + } + + internal static double Double(byte[] Data, ref int Index) + { + double result = BitConverter.ToDouble(Data, Index); + Index += 8; + return result; + } + + internal static string String(byte[] Data, ref int Index) + { + int num = Word(Data, ref Index); + if (num == 65535) + { + num = DWord(Data, ref Index); + } + StringBuilder stringBuilder = new StringBuilder(num); + Encoding encoding = Encoding.GetEncoding(1252); + byte[] array = (byte[])Array.CreateInstance(typeof(byte), 1); + while (num-- > 0) + { + array[0] = Byte(Data, ref Index); + stringBuilder.Append(encoding.GetChars(array)); + } + Index += 3; + Index &= -4; + return stringBuilder.ToString(); + } + + internal static string EncString(byte[] Data, ref int Index) + { + int num = Word(Data, ref Index); + if (num == 65535) + { + num = DWord(Data, ref Index); + } + StringBuilder stringBuilder = new StringBuilder(num); + Encoding encoding = Encoding.GetEncoding(1252); + byte[] array = (byte[])Array.CreateInstance(typeof(byte), 1); + while (num-- > 0) + { + byte b = Byte(Data, ref Index); + array[0] = (byte)((b >> 4) | (b << 4)); + stringBuilder.Append(encoding.GetChars(array)); + } + Index += 3; + Index &= -4; + return stringBuilder.ToString(); + } + + internal static string PString(byte[] Data, ref int Index) + { + int capacity = Byte(Data, ref Index); + StringBuilder stringBuilder = new StringBuilder(capacity); + Encoding encoding = Encoding.GetEncoding(1252); + byte[] array = (byte[])Array.CreateInstance(typeof(byte), 1); + while (capacity-- > 0) + { + array[0] = Byte(Data, ref Index); + stringBuilder.Append(encoding.GetChars(array)); + } + return stringBuilder.ToString(); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Heritage.cs b/Managed/Decal.FileService/Decal.Filters/Heritage.cs new file mode 100644 index 0000000..fe8c1b4 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Heritage.cs @@ -0,0 +1,32 @@ +namespace Decal.Filters; + +public class Heritage : IIdNameTableEntry +{ + private int mID; + + private string mName; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + internal Heritage(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/HeritageTable.cs b/Managed/Decal.FileService/Decal.Filters/HeritageTable.cs new file mode 100644 index 0000000..31fa4a2 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/HeritageTable.cs @@ -0,0 +1,28 @@ +namespace Decal.Filters; + +public sealed class HeritageTable : IdNameTable +{ + internal HeritageTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 570425355) + { + return false; + } + Index += 5; + int num = Get.Byte(Data, ref Index); + InitializeTable(num); + for (int i = 0; i < num; i++) + { + Heritage heritage = new Heritage(Get.DWord(Data, ref Index)); + heritage.Name = Get.PString(Data, ref Index); + Add(heritage); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/IIdNameTableEntry.cs b/Managed/Decal.FileService/Decal.Filters/IIdNameTableEntry.cs new file mode 100644 index 0000000..4bd3556 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/IIdNameTableEntry.cs @@ -0,0 +1,8 @@ +namespace Decal.Filters; + +public interface IIdNameTableEntry +{ + int Id { get; } + + string Name { get; } +} diff --git a/Managed/Decal.FileService/Decal.Filters/IdNameTable.cs b/Managed/Decal.FileService/Decal.Filters/IdNameTable.cs new file mode 100644 index 0000000..fbec952 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/IdNameTable.cs @@ -0,0 +1,104 @@ +using System; + +namespace Decal.Filters; + +public abstract class IdNameTable where EntryType : IIdNameTableEntry +{ + private int mCount; + + private EntryType[] mTable; + + public EntryType this[int index] + { + get + { + if (index >= 0 && index < mCount) + { + return mTable[index]; + } + return default(EntryType); + } + } + + public int Length => mCount; + + public event EventHandler Update; + + internal abstract bool LoadFrom(byte[] data); + + internal bool UpdateFrom(byte[] data) + { + bool num = LoadFrom(data); + if (num) + { + this.Update(this, null); + } + return num; + } + + protected void InitializeTable(int n) + { + mCount = 0; + mTable = (EntryType[])Array.CreateInstance(typeof(EntryType), n); + } + + protected void Add(EntryType entry) + { + if (mCount < mTable.Length) + { + int num = mCount++; + while (num > 0 && mTable[num - 1].Id > entry.Id) + { + mTable[num] = mTable[num - 1]; + num--; + } + mTable[num] = entry; + } + } + + public int IndexFromId(int id) + { + int num = 0; + int num2 = mCount - 1; + while (num <= num2) + { + int num3 = (num2 - num >> 1) + num; + int id2 = mTable[num3].Id; + if (id == id2) + { + return num3; + } + if (id < id2) + { + num2 = num3 - 1; + } + else + { + num = num3 + 1; + } + } + return -1; + } + + public int IndexFromName(string name) + { + for (int i = 0; i < mCount; i++) + { + if (string.Compare(mTable[i].Name, name, ignoreCase: true) == 0) + { + return i; + } + } + return -1; + } + + public EntryType GetById(int id) + { + return this[IndexFromId(id)]; + } + + public EntryType GetByName(string name) + { + return this[IndexFromName(name)]; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/LevelTables.cs b/Managed/Decal.FileService/Decal.Filters/LevelTables.cs new file mode 100644 index 0000000..3fbec1b --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/LevelTables.cs @@ -0,0 +1,78 @@ +namespace Decal.Filters; + +public sealed class LevelTables : RawTable +{ + private AttributeXPTable mAttrXP; + + private VitalXPTable mVitalXP; + + private TrainedSkillXPTable mTrainXP; + + private SpecializedSkillXPTable mSpecXP; + + private CharacterXPTable mLevelXP; + + private CharacterSkillCreditsTable mSkillCredits; + + public AttributeXPTable AttributeXP => mAttrXP; + + public VitalXPTable VitalXP => mVitalXP; + + public TrainedSkillXPTable TrainedSkillXP => mTrainXP; + + public SpecializedSkillXPTable SpecializedSkillXP => mSpecXP; + + public CharacterXPTable CharacterXP => mLevelXP; + + public CharacterSkillCreditsTable CharacterSkillCredits => mSkillCredits; + + internal LevelTables(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 234881048) + { + return false; + } + int num = Get.DWord(Data, ref Index) + 1; + int num2 = Get.DWord(Data, ref Index) + 1; + int num3 = Get.DWord(Data, ref Index) + 1; + int num4 = Get.DWord(Data, ref Index) + 1; + int num5 = Get.DWord(Data, ref Index) + 1; + mAttrXP = new AttributeXPTable(num); + mVitalXP = new VitalXPTable(num2); + mTrainXP = new TrainedSkillXPTable(num3); + mSpecXP = new SpecializedSkillXPTable(num4); + mLevelXP = new CharacterXPTable(num5); + mSkillCredits = new CharacterSkillCreditsTable(num5); + for (int i = 0; i < num; i++) + { + mAttrXP.Add(Get.DWord(Data, ref Index) & 0xFFFFFFFFu); + } + for (int j = 0; j < num2; j++) + { + mVitalXP.Add(Get.DWord(Data, ref Index) & 0xFFFFFFFFu); + } + for (int k = 0; k < num3; k++) + { + mTrainXP.Add(Get.DWord(Data, ref Index) & 0xFFFFFFFFu); + } + for (int l = 0; l < num4; l++) + { + mSpecXP.Add(Get.DWord(Data, ref Index) & 0xFFFFFFFFu); + } + for (int m = 0; m < num5; m++) + { + mLevelXP.Add(Get.QWord(Data, ref Index)); + } + for (int n = 0; n < num5; n++) + { + mSkillCredits.Add(Get.Byte(Data, ref Index)); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Material.cs b/Managed/Decal.FileService/Decal.Filters/Material.cs new file mode 100644 index 0000000..c38f400 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Material.cs @@ -0,0 +1,46 @@ +namespace Decal.Filters; + +public class Material : IIdNameTableEntry +{ + private int mID; + + private string mName; + + private int mUnk; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + public int Unknown + { + get + { + return mUnk; + } + internal set + { + mUnk = value; + } + } + + internal Material(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/MaterialTable.cs b/Managed/Decal.FileService/Decal.Filters/MaterialTable.cs new file mode 100644 index 0000000..e2f9d33 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/MaterialTable.cs @@ -0,0 +1,35 @@ +namespace Decal.Filters; + +public sealed class MaterialTable : IdNameTable +{ + internal MaterialTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 654311424) + { + return false; + } + Index++; + int num = Get.Byte(Data, ref Index); + InitializeTable(num); + for (int i = 0; i < num; i++) + { + Material material = new Material(Get.DWord(Data, ref Index)); + material.Unknown = Get.DWord(Data, ref Index); + Add(material); + } + Index++; + num = Get.Byte(Data, ref Index); + for (int j = 0; j < num; j++) + { + int id = Get.DWord(Data, ref Index); + GetById(id).Name = Get.PString(Data, ref Index).Replace('_', ' '); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/RawTable.cs b/Managed/Decal.FileService/Decal.Filters/RawTable.cs new file mode 100644 index 0000000..f72d753 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/RawTable.cs @@ -0,0 +1,59 @@ +using System; + +namespace Decal.Filters; + +public abstract class RawTable +{ + private int mCount; + + private EntryType[] mTable; + + public EntryType this[int index] + { + get + { + if (index >= 0 && index < mCount) + { + return mTable[index]; + } + return default(EntryType); + } + protected set + { + if (index >= 0 && index < mCount) + { + mTable[index] = value; + } + } + } + + public int Length => mCount; + + public event EventHandler Update; + + internal abstract bool LoadFrom(byte[] Data); + + internal bool UpdateFrom(byte[] Data) + { + bool num = LoadFrom(Data); + if (num) + { + this.Update(this, null); + } + return num; + } + + protected void InitializeTable(int n) + { + mCount = 0; + mTable = (EntryType[])Array.CreateInstance(typeof(EntryType), n); + } + + protected void Add(EntryType entry) + { + if (mCount < mTable.Length) + { + mTable[mCount++] = entry; + } + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Skill.cs b/Managed/Decal.FileService/Decal.Filters/Skill.cs new file mode 100644 index 0000000..1430afc --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Skill.cs @@ -0,0 +1,256 @@ +namespace Decal.Filters; + +public class Skill : IIdNameTableEntry +{ + private int mID; + + private string mName; + + private string mDesc; + + private int mIconId; + + private int mTrainCost; + + private int mSpecCost; + + private SkillType mType; + + private int mUnk1; + + private SkillState mUsability; + + private int mUnk2; + + private bool mAttr1Valid; + + private bool mAttr2Valid; + + private int mDivisor; + + private int mAttr1ID; + + private int mAttr2ID; + + private double mTimerLimit; + + private double mTimerStart; + + private double mUnk3; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + public string Description + { + get + { + return mDesc; + } + internal set + { + mDesc = value; + } + } + + public int IconId + { + get + { + return mIconId; + } + internal set + { + mIconId = value; + } + } + + public int CreditsToTrain + { + get + { + return mTrainCost; + } + internal set + { + mTrainCost = value; + } + } + + public int CreditsToSpecialize + { + get + { + return mSpecCost; + } + internal set + { + mSpecCost = value; + } + } + + public SkillType Type + { + get + { + return mType; + } + internal set + { + mType = value; + } + } + + public SkillState Usability + { + get + { + return mUsability; + } + internal set + { + mUsability = value; + } + } + + public bool IsAttribute1Valid + { + get + { + return mAttr1Valid; + } + internal set + { + mAttr1Valid = value; + } + } + + public bool IsAttribute2Valid + { + get + { + return mAttr2Valid; + } + internal set + { + mAttr2Valid = value; + } + } + + public int Attribute1Id + { + get + { + return mAttr1ID; + } + internal set + { + mAttr1ID = value; + } + } + + public int Attribute2Id + { + get + { + return mAttr2ID; + } + internal set + { + mAttr2ID = value; + } + } + + public int AttributeDivisor + { + get + { + return mDivisor; + } + internal set + { + mDivisor = value; + } + } + + public double XPTimerStart + { + get + { + return mTimerStart; + } + internal set + { + mTimerStart = value; + } + } + + public double XPTimerLimit + { + get + { + return mTimerLimit; + } + internal set + { + mTimerLimit = value; + } + } + + public int Unknown1 + { + get + { + return mUnk1; + } + internal set + { + mUnk1 = value; + } + } + + public int Unknown2 + { + get + { + return mUnk2; + } + internal set + { + mUnk2 = value; + } + } + + public double Unknown3 + { + get + { + return mUnk3; + } + internal set + { + mUnk3 = value; + } + } + + internal Skill(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SkillState.cs b/Managed/Decal.FileService/Decal.Filters/SkillState.cs new file mode 100644 index 0000000..ad54732 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SkillState.cs @@ -0,0 +1,56 @@ +using System.Globalization; + +namespace Decal.Filters; + +public class SkillState +{ + private static SkillState[] sStates = new SkillState[3] + { + new SkillState(1, "Untrained"), + new SkillState(2, "Trained"), + new SkillState(3, "Specialized") + }; + + private int mId; + + private string mName; + + public int Id => mId; + + public string Name => mName; + + public static SkillState GetById(int id) + { + for (int i = 0; i < sStates.Length; i++) + { + if (sStates[i].Id == id) + { + return sStates[i]; + } + } + return null; + } + + public static SkillState GetByName(string name) + { + for (int i = 0; i < sStates.Length; i++) + { + if (string.Compare(sStates[i].Name, name, ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + return sStates[i]; + } + } + return null; + } + + private SkillState(int id, string name) + { + mId = id; + mName = name; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SkillTable.cs b/Managed/Decal.FileService/Decal.Filters/SkillTable.cs new file mode 100644 index 0000000..bc16a0f --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SkillTable.cs @@ -0,0 +1,44 @@ +namespace Decal.Filters; + +public sealed class SkillTable : IdNameTable +{ + internal SkillTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 234881028) + { + return false; + } + int num = Get.Word(Data, ref Index); + InitializeTable(num); + Index += 2; + for (int i = 0; i < num; i++) + { + Skill skill = new Skill(Get.DWord(Data, ref Index)); + skill.Description = Get.String(Data, ref Index); + skill.Name = Get.String(Data, ref Index); + skill.IconId = Get.DWord(Data, ref Index); + skill.CreditsToTrain = Get.DWord(Data, ref Index); + skill.CreditsToSpecialize = Get.DWord(Data, ref Index); + skill.Type = SkillType.GetById(Get.DWord(Data, ref Index)); + skill.Unknown1 = Get.DWord(Data, ref Index); + skill.Usability = SkillState.GetById(Get.DWord(Data, ref Index)); + skill.Unknown2 = Get.DWord(Data, ref Index); + skill.IsAttribute1Valid = Get.DWord(Data, ref Index) == 1; + skill.IsAttribute2Valid = Get.DWord(Data, ref Index) == 1; + skill.AttributeDivisor = Get.DWord(Data, ref Index); + skill.Attribute1Id = Get.DWord(Data, ref Index); + skill.Attribute2Id = Get.DWord(Data, ref Index); + skill.XPTimerLimit = Get.Double(Data, ref Index); + skill.XPTimerStart = Get.Double(Data, ref Index); + skill.Unknown3 = Get.Double(Data, ref Index); + Add(skill); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SkillType.cs b/Managed/Decal.FileService/Decal.Filters/SkillType.cs new file mode 100644 index 0000000..c0ee36a --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SkillType.cs @@ -0,0 +1,56 @@ +using System.Globalization; + +namespace Decal.Filters; + +public class SkillType +{ + private static SkillType[] sTypes = new SkillType[3] + { + new SkillType(1, "Combat"), + new SkillType(2, "Other"), + new SkillType(3, "Magic") + }; + + private int mId; + + private string mName; + + public int Id => mId; + + public string Name => mName; + + public static SkillType GetById(int id) + { + for (int i = 0; i < sTypes.Length; i++) + { + if (sTypes[i].Id == id) + { + return sTypes[i]; + } + } + return null; + } + + public static SkillType GetByName(string name) + { + for (int i = 0; i < sTypes.Length; i++) + { + if (string.Compare(sTypes[i].Name, name, ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + return sTypes[i]; + } + } + return null; + } + + private SkillType(int id, string name) + { + mId = id; + mName = name; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SpecializedSkillXPTable.cs b/Managed/Decal.FileService/Decal.Filters/SpecializedSkillXPTable.cs new file mode 100644 index 0000000..5667372 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SpecializedSkillXPTable.cs @@ -0,0 +1,19 @@ +namespace Decal.Filters; + +public sealed class SpecializedSkillXPTable : RawTable +{ + internal SpecializedSkillXPTable(int Length) + { + InitializeTable(Length); + } + + internal override bool LoadFrom(byte[] Data) + { + return true; + } + + internal new void Add(long Entry) + { + base.Add(Entry); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Species.cs b/Managed/Decal.FileService/Decal.Filters/Species.cs new file mode 100644 index 0000000..abe6762 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Species.cs @@ -0,0 +1,32 @@ +namespace Decal.Filters; + +public class Species : IIdNameTableEntry +{ + private int mID; + + private string mName; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + internal Species(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SpeciesTable.cs b/Managed/Decal.FileService/Decal.Filters/SpeciesTable.cs new file mode 100644 index 0000000..cac360a --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SpeciesTable.cs @@ -0,0 +1,28 @@ +namespace Decal.Filters; + +public sealed class SpeciesTable : IdNameTable +{ + internal SpeciesTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 570425358) + { + return false; + } + Index += 5; + int num = Get.Byte(Data, ref Index); + InitializeTable(num); + for (int i = 0; i < num; i++) + { + Species species = new Species(Get.DWord(Data, ref Index)); + species.Name = Get.PString(Data, ref Index); + Add(species); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Spell.cs b/Managed/Decal.FileService/Decal.Filters/Spell.cs new file mode 100644 index 0000000..5338cea --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Spell.cs @@ -0,0 +1,427 @@ +namespace Decal.Filters; + +public class Spell : IIdNameTableEntry +{ + private int mID; + + private string mName; + + private string mDesc; + + private int mIconId; + + private int mFamily; + + private int mType; + + private int mFlags; + + private SpellSchool mSchool; + + private int mDiff; + + private int mMana; + + private SpellComponentIDs mComps; + + private float mSpeed; + + private double mDuration; + + private int mCasterEffect; + + private int mTargetEffect; + + private int mTargetMask; + + private int mGen; + + private int mSort; + + private float mUnk1; + + private float mUnk2; + + private float mUnk3; + + private int mUnk4; + + private double mUnk5; + + private int mUnk6; + + private int mUnk7; + + private int mUnk8; + + private int mUnk9; + + private int mUnk10; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + public string Description + { + get + { + return mDesc; + } + internal set + { + mDesc = value; + } + } + + public int IconId + { + get + { + return mIconId; + } + internal set + { + mIconId = value; + } + } + + public int Family + { + get + { + return mFamily; + } + internal set + { + mFamily = value; + } + } + + public int Type + { + get + { + return mType; + } + internal set + { + mType = value; + } + } + + public int Flags + { + get + { + return mFlags; + } + internal set + { + mFlags = value; + } + } + + public bool IsOffensive => (mFlags & 1) != 0; + + public bool IsIrresistible => (mFlags & 4) != 0; + + public bool IsUntargetted => (mFlags & 8) != 0; + + public bool IsDebuff => (mFlags & 0x10) != 0; + + public bool IsFellowship => (mFlags & 0x2000) != 0; + + public bool IsFastWindup => (mFlags & 0x4000) != 0; + + public SpellSchool School + { + get + { + return mSchool; + } + internal set + { + mSchool = value; + } + } + + public int Difficulty + { + get + { + return mDiff; + } + internal set + { + mDiff = value; + } + } + + public int Mana + { + get + { + return mMana; + } + internal set + { + mMana = value; + } + } + + public SpellComponentIDs ComponentIDs + { + get + { + return mComps; + } + internal set + { + mComps = value; + } + } + + public float Speed + { + get + { + return mSpeed; + } + internal set + { + mSpeed = value; + } + } + + public double Duration + { + get + { + return mDuration; + } + internal set + { + mDuration = value; + } + } + + public int CasterEffect + { + get + { + return mCasterEffect; + } + internal set + { + mCasterEffect = value; + } + } + + public int TargetEffect + { + get + { + return mTargetEffect; + } + internal set + { + mTargetEffect = value; + } + } + + public int TargetMask + { + get + { + return mTargetMask; + } + internal set + { + mTargetMask = value; + } + } + + public int Generation + { + get + { + return mGen; + } + internal set + { + mGen = value; + } + } + + public int SortKey + { + get + { + return mSort; + } + internal set + { + mSort = value; + } + } + + public float Unknown1 + { + get + { + return mUnk1; + } + internal set + { + mUnk1 = value; + } + } + + public float Unknown2 + { + get + { + return mUnk2; + } + internal set + { + mUnk2 = value; + } + } + + public float Unknown3 + { + get + { + return mUnk3; + } + internal set + { + mUnk3 = value; + } + } + + public int Unknown4 + { + get + { + return mUnk4; + } + internal set + { + mUnk4 = value; + } + } + + public double Unknown5 + { + get + { + return mUnk5; + } + internal set + { + mUnk5 = value; + } + } + + public int Unknown6 + { + get + { + return mUnk6; + } + internal set + { + mUnk6 = value; + } + } + + public int Unknown7 + { + get + { + return mUnk7; + } + internal set + { + mUnk7 = value; + } + } + + public int Unknown8 + { + get + { + return mUnk8; + } + internal set + { + mUnk8 = value; + } + } + + public int Unknown9 + { + get + { + return mUnk9; + } + internal set + { + mUnk9 = value; + } + } + + public int Unknown10 + { + get + { + return mUnk10; + } + internal set + { + mUnk10 = value; + } + } + + internal Spell(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } + + internal static int Hash(string Name, string Description) + { + return Hash(Name, 303068800u) + Hash(Description, 3199061829u); + } + + internal static int Hash(string Buffer, uint Seed) + { + int num = 0; + for (int i = 0; i < Buffer.Length; i++) + { + num = (num << 4) + (byte)Buffer[i]; + if ((num & 0xF0000000u) != 0L) + { + num = (num & 0xFFFFFFF) ^ ((num >> 24) & 0xF0); + } + } + return (int)(num % Seed); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SpellComponentIDs.cs b/Managed/Decal.FileService/Decal.Filters/SpellComponentIDs.cs new file mode 100644 index 0000000..e79532c --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SpellComponentIDs.cs @@ -0,0 +1,25 @@ +namespace Decal.Filters; + +public sealed class SpellComponentIDs : RawTable +{ + private int mHash; + + internal SpellComponentIDs(int length, int hash) + { + InitializeTable(length); + mHash = hash; + } + + internal override bool LoadFrom(byte[] data) + { + return true; + } + + internal new void Add(int entry) + { + if (entry != 0 && entry - mHash != 0) + { + base.Add(entry - mHash); + } + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SpellSchool.cs b/Managed/Decal.FileService/Decal.Filters/SpellSchool.cs new file mode 100644 index 0000000..2849aec --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SpellSchool.cs @@ -0,0 +1,58 @@ +using System.Globalization; + +namespace Decal.Filters; + +public sealed class SpellSchool +{ + private static SpellSchool[] sSchools = new SpellSchool[5] + { + new SpellSchool(1, "War Magic"), + new SpellSchool(2, "Life Magic"), + new SpellSchool(3, "Item Enchantment"), + new SpellSchool(4, "Creature Enchantment"), + new SpellSchool(5, "Void Magic") + }; + + private int mId; + + private string mName; + + public int Id => mId; + + public string Name => mName; + + public static SpellSchool GetById(int id) + { + for (int i = 0; i < sSchools.Length; i++) + { + if (sSchools[i].Id == id) + { + return sSchools[i]; + } + } + return null; + } + + public static SpellSchool GetByName(string name) + { + for (int i = 0; i < sSchools.Length; i++) + { + if (string.Compare(sSchools[i].Name, name, ignoreCase: true, CultureInfo.InvariantCulture) == 0) + { + return sSchools[i]; + } + } + return null; + } + + private SpellSchool(int id, string name) + { + mId = id; + mName = name; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/SpellTable.cs b/Managed/Decal.FileService/Decal.Filters/SpellTable.cs new file mode 100644 index 0000000..ab36aec --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/SpellTable.cs @@ -0,0 +1,58 @@ +namespace Decal.Filters; + +public sealed class SpellTable : IdNameTable +{ + internal SpellTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 234881038) + { + return false; + } + int num = Get.Word(Data, ref Index); + InitializeTable(num); + Index += 2; + for (int i = 0; i < num; i++) + { + Spell spell = new Spell(Get.DWord(Data, ref Index)); + spell.Name = Get.EncString(Data, ref Index); + spell.Description = Get.EncString(Data, ref Index); + spell.School = SpellSchool.GetById(Get.DWord(Data, ref Index)); + spell.IconId = Get.DWord(Data, ref Index); + spell.Family = Get.DWord(Data, ref Index); + spell.Flags = Get.DWord(Data, ref Index); + spell.Mana = Get.DWord(Data, ref Index); + spell.Unknown1 = Get.Float(Data, ref Index); + spell.Unknown2 = Get.Float(Data, ref Index); + spell.Difficulty = Get.DWord(Data, ref Index); + spell.Unknown3 = Get.Float(Data, ref Index); + spell.Generation = Get.DWord(Data, ref Index); + spell.Speed = Get.Float(Data, ref Index); + spell.Type = Get.DWord(Data, ref Index); + spell.Unknown4 = Get.DWord(Data, ref Index); + spell.Duration = ((spell.Type == 1 || spell.Type == 7 || spell.Type == 12) ? Get.Double(Data, ref Index) : (-1.0)); + spell.Unknown5 = ((spell.Type == 1 || spell.Type == 12) ? Get.Double(Data, ref Index) : (-1.0)); + spell.ComponentIDs = new SpellComponentIDs(8, Spell.Hash(spell.Name, spell.Description)); + for (int j = 0; j < 8; j++) + { + spell.ComponentIDs.Add(Get.DWord(Data, ref Index)); + } + spell.CasterEffect = Get.DWord(Data, ref Index); + spell.TargetEffect = Get.DWord(Data, ref Index); + spell.Unknown6 = Get.DWord(Data, ref Index); + spell.Unknown7 = Get.DWord(Data, ref Index); + spell.Unknown8 = Get.DWord(Data, ref Index); + spell.Unknown9 = Get.DWord(Data, ref Index); + spell.SortKey = Get.DWord(Data, ref Index); + spell.TargetMask = Get.DWord(Data, ref Index); + spell.Unknown10 = Get.DWord(Data, ref Index); + Add(spell); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/TrainedSkillXPTable.cs b/Managed/Decal.FileService/Decal.Filters/TrainedSkillXPTable.cs new file mode 100644 index 0000000..c7248b8 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/TrainedSkillXPTable.cs @@ -0,0 +1,19 @@ +namespace Decal.Filters; + +public sealed class TrainedSkillXPTable : RawTable +{ + internal TrainedSkillXPTable(int Length) + { + InitializeTable(Length); + } + + internal override bool LoadFrom(byte[] Data) + { + return true; + } + + internal new void Add(long Entry) + { + base.Add(Entry); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/UpdateEventArgs.cs b/Managed/Decal.FileService/Decal.Filters/UpdateEventArgs.cs new file mode 100644 index 0000000..bff237c --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/UpdateEventArgs.cs @@ -0,0 +1,25 @@ +using System; + +namespace Decal.Filters; + +public class UpdateEventArgs : EventArgs +{ + private int mFileId; + + public int FileId + { + get + { + return mFileId; + } + set + { + mFileId = value; + } + } + + internal UpdateEventArgs(int fileId) + { + mFileId = fileId; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/Vital.cs b/Managed/Decal.FileService/Decal.Filters/Vital.cs new file mode 100644 index 0000000..0aa0230 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/Vital.cs @@ -0,0 +1,46 @@ +namespace Decal.Filters; + +public class Vital : IIdNameTableEntry +{ + private int mID; + + private string mName; + + private int mIconId; + + public int Id => mID; + + public string Name + { + get + { + return mName; + } + internal set + { + mName = value; + } + } + + public int IconId + { + get + { + return mIconId; + } + internal set + { + mIconId = value; + } + } + + internal Vital(int ID) + { + mID = ID; + } + + public override string ToString() + { + return mName; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/VitalFormula.cs b/Managed/Decal.FileService/Decal.Filters/VitalFormula.cs new file mode 100644 index 0000000..35b49b3 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/VitalFormula.cs @@ -0,0 +1,92 @@ +namespace Decal.Filters; + +public class VitalFormula +{ + private bool mAttr1Valid; + + private bool mAttr2Valid; + + private int mAttr1Id; + + private int mAttr2Id; + + private int mDivisor; + + private int mUnk; + + public bool IsAttribute1Valid + { + get + { + return mAttr1Valid; + } + internal set + { + mAttr1Valid = value; + } + } + + public bool IsAttribute2Valid + { + get + { + return mAttr2Valid; + } + internal set + { + mAttr2Valid = value; + } + } + + public int Attribute1Id + { + get + { + return mAttr1Id; + } + internal set + { + mAttr1Id = value; + } + } + + public int Attribute2Id + { + get + { + return mAttr2Id; + } + internal set + { + mAttr2Id = value; + } + } + + public int AttributeDivisor + { + get + { + return mDivisor; + } + internal set + { + mDivisor = value; + } + } + + public int Unknown + { + get + { + return mUnk; + } + internal set + { + mUnk = value; + } + } + + internal VitalFormula() + { + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/VitalFormulaTable.cs b/Managed/Decal.FileService/Decal.Filters/VitalFormulaTable.cs new file mode 100644 index 0000000..f932e42 --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/VitalFormulaTable.cs @@ -0,0 +1,36 @@ +namespace Decal.Filters; + +public sealed class VitalFormulaTable : RawTable +{ + internal VitalFormulaTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 234881027) + { + return false; + } + if ((Data.Length - Index) % 24 != 0) + { + return false; + } + int num = (Data.Length - 4) / 24; + InitializeTable(num); + for (int i = 0; i < num; i++) + { + VitalFormula vitalFormula = new VitalFormula(); + vitalFormula.Unknown = Get.DWord(Data, ref Index); + vitalFormula.IsAttribute1Valid = Get.DWord(Data, ref Index) == 1; + vitalFormula.IsAttribute2Valid = Get.DWord(Data, ref Index) == 1; + vitalFormula.AttributeDivisor = Get.DWord(Data, ref Index); + vitalFormula.Attribute1Id = Get.DWord(Data, ref Index); + vitalFormula.Attribute2Id = Get.DWord(Data, ref Index); + Add(vitalFormula); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/VitalTable.cs b/Managed/Decal.FileService/Decal.Filters/VitalTable.cs new file mode 100644 index 0000000..241defc --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/VitalTable.cs @@ -0,0 +1,35 @@ +namespace Decal.Filters; + +public sealed class VitalTable : IdNameTable +{ + internal VitalTable(byte[] Data) + { + LoadFrom(Data); + } + + internal override bool LoadFrom(byte[] Data) + { + int Index = 0; + if (Get.DWord(Data, ref Index) != 620756999) + { + return false; + } + Index++; + int num = Get.Byte(Data, ref Index); + InitializeTable(num); + for (int i = 0; i < num; i++) + { + Vital vital = new Vital(Get.DWord(Data, ref Index)); + vital.IconId = Get.DWord(Data, ref Index); + Add(vital); + } + Index++; + num = Get.Byte(Data, ref Index); + for (int j = 0; j < num; j++) + { + int id = Get.DWord(Data, ref Index); + GetById(id).Name = Get.PString(Data, ref Index); + } + return true; + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/VitalXPTable.cs b/Managed/Decal.FileService/Decal.Filters/VitalXPTable.cs new file mode 100644 index 0000000..ce5a51a --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/VitalXPTable.cs @@ -0,0 +1,19 @@ +namespace Decal.Filters; + +public sealed class VitalXPTable : RawTable +{ + internal VitalXPTable(int Length) + { + InitializeTable(Length); + } + + internal override bool LoadFrom(byte[] Data) + { + return true; + } + + internal new void Add(long Entry) + { + base.Add(Entry); + } +} diff --git a/Managed/Decal.FileService/Decal.Filters/zlib.cs b/Managed/Decal.FileService/Decal.Filters/zlib.cs new file mode 100644 index 0000000..4db737f --- /dev/null +++ b/Managed/Decal.FileService/Decal.Filters/zlib.cs @@ -0,0 +1,434 @@ +#define TRACE +using System; +using System.Diagnostics; +using System.Text; + +namespace Decal.Filters; + +internal class zlib +{ + private byte[] mInData; + + private int mInIndex; + + private int mInCount; + + private int mInBuf; + + private int mInBufSize; + + private byte[] mOutData; + + private int mOutIndex; + + private int mOutCount; + + private short[] mDynLCodeTree; + + private short[] mDynDCodeTree; + + private static short[] mFixLCodeTree; + + private static short[] mFixDCodeTree; + + public static byte[] Inflate(byte[] CompressedData, int UncompressedSize) + { + byte[] array = (byte[])Array.CreateInstance(typeof(byte), UncompressedSize); + new zlib(CompressedData, 0, CompressedData.Length, array, 0, UncompressedSize).Inflate(); + return array; + } + + internal zlib(byte[] InData, int InIndex, int InCount, byte[] OutData, int OutIndex, int OutCount) + { + mInData = InData; + mInIndex = InIndex; + mInCount = InCount; + mOutData = OutData; + mOutIndex = OutIndex; + mOutCount = OutCount; + } + + internal bool Inflate() + { + byte b = Get.Byte(mInData, ref mInIndex); + mInCount--; + byte b2 = Get.Byte(mInData, ref mInIndex); + mInCount--; + int num = 0; + if ((b2 & 0x20) != 0) + { + num = Get.DWord(mInData, ref mInIndex); + mInCount -= 4; + } + if ((b & 0xF) != 8) + { + Trace.WriteLine(new StringBuilder(64).AppendFormat("zlib.Inflate() Warning: unknown compression method 0x{0:x1}", b & 0xF).ToString()); + return false; + } + if (b >> 4 != 7) + { + Trace.WriteLine("zlib.Inflate() Warning: window size other than 32K"); + return false; + } + if ((b2 & 0x20) != 0) + { + Trace.WriteLine(new StringBuilder(64).AppendFormat("zlib.Inflate() Warning: unknown DICTID 0x{0:x8}", num).ToString()); + return false; + } + int bits; + do + { + bits = GetBits(1); + switch (GetBits(2)) + { + case 0: + { + GetBits(0); + int bits2 = GetBits(16); + int bits3 = GetBits(16); + if (bits2 != (~bits3 & 0xFFFF)) + { + Trace.WriteLine("zlib.Inflate() Warning: LEN != ~NLEN"); + } + Buffer.BlockCopy(mInData, mInIndex, mOutData, mOutIndex, bits2); + mInIndex += bits2; + mOutIndex += bits2; + break; + } + case 1: + if ((mFixLCodeTree == null || mFixDCodeTree == null) && !InitFixedCodes()) + { + return false; + } + if (!Decompress(mFixLCodeTree, mFixDCodeTree)) + { + return false; + } + break; + case 2: + if (!InitDynamicCodes()) + { + return false; + } + if (!Decompress(mDynLCodeTree, mDynDCodeTree)) + { + return false; + } + break; + case 3: + Trace.WriteLine("zlib.Inflate() Warning: unhandled block type 3"); + return false; + } + } + while (bits != 1); + for (int i = 0; i < 4; i++) + { + GetBits(8); + } + return true; + } + + private static bool InitFixedCodes() + { + int[] array = (int[])Array.CreateInstance(typeof(int), 288); + int[] array2 = (int[])Array.CreateInstance(typeof(int), 32); + int i; + for (i = 0; i < 144; i++) + { + array[i] = 8; + } + for (; i < 256; i++) + { + array[i] = 9; + } + for (; i < 280; i++) + { + array[i] = 7; + } + for (; i < 288; i++) + { + array[i] = 8; + } + for (i = 0; i < 32; i++) + { + array2[i] = 5; + } + mFixLCodeTree = BuildCodeTree(array, 0, 288, 65536); + mFixDCodeTree = BuildCodeTree(array2, 0, 32, 65536); + return true; + } + + private bool InitDynamicCodes() + { + int[] array = new int[19] + { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, + 11, 4, 12, 3, 13, 2, 14, 1, 15 + }; + int num = GetBits(5) + 257; + int num2 = GetBits(5) + 1; + int num3 = GetBits(4) + 4; + int[] array2 = (int[])Array.CreateInstance(typeof(int), 19); + for (int i = 0; i < num3; i++) + { + array2[array[i]] = GetBits(3); + } + short[] codeTree = BuildCodeTree(array2, 0, 19, 256); + int num4 = num + num2; + int[] array3 = (int[])Array.CreateInstance(typeof(int), num4); + int num5 = 0; + while (num5 < num4) + { + int code = GetCode(codeTree); + if (code >= 0 && code < 16) + { + array3[num5++] = code; + continue; + } + switch (code) + { + case 16: + { + int num7 = GetBits(2) + 3; + while (num7-- > 0) + { + array3[num5] = array3[num5 - 1]; + num5++; + } + break; + } + case 17: + { + int num8 = GetBits(3) + 3; + while (num8-- > 0) + { + array3[num5++] = 0; + } + break; + } + case 18: + { + int num6 = GetBits(7) + 11; + while (num6-- > 0) + { + array3[num5++] = 0; + } + break; + } + default: + Trace.WriteLine(new StringBuilder(64).AppendFormat("Deflate.InitDynamicCodes Warning: invalid code 0x{0:x4}", code).ToString()); + return false; + } + } + mDynLCodeTree = BuildCodeTree(array3, 0, num, 65536); + mDynDCodeTree = BuildCodeTree(array3, num, num2, 65536); + return true; + } + + private static short[] BuildCodeTree(int[] CodeLens, int Start, int Count, int CodeTreeLength) + { + short[] array = (short[])Array.CreateInstance(typeof(short), CodeTreeLength); + int[] array2 = (int[])Array.CreateInstance(typeof(int), 16); + int[] array3 = (int[])Array.CreateInstance(typeof(int), 16); + for (int i = Start; i < Start + Count; i++) + { + array2[CodeLens[i]]++; + } + array2[0] = 0; + int num = 0; + for (int j = 1; j < 16; j++) + { + num = (array3[j] = num + array2[j - 1] << 1); + } + for (int k = 0; k < CodeTreeLength; k++) + { + array[k] = -1; + } + for (int l = 0; l < Count; l++) + { + int num2 = CodeLens[Start + l]; + if (num2 > 0) + { + int num3 = Reverse(array3[num2]++, num2); + int num4 = 1; + while (num2-- > 0) + { + num4 <<= 1; + num4 += num3 & 1; + num3 >>= 1; + } + array[num4] = (short)l; + } + } + return array; + } + + private bool Decompress(short[] LCodeTree, short[] DCodeTree) + { + int[,] array = new int[29, 2] + { + { 0, 3 }, + { 0, 4 }, + { 0, 5 }, + { 0, 6 }, + { 0, 7 }, + { 0, 8 }, + { 0, 9 }, + { 0, 10 }, + { 1, 11 }, + { 1, 13 }, + { 1, 15 }, + { 1, 17 }, + { 2, 19 }, + { 2, 23 }, + { 2, 27 }, + { 2, 31 }, + { 3, 35 }, + { 3, 43 }, + { 3, 51 }, + { 3, 59 }, + { 4, 67 }, + { 4, 83 }, + { 4, 99 }, + { 4, 115 }, + { 5, 131 }, + { 5, 163 }, + { 5, 195 }, + { 5, 227 }, + { 0, 258 } + }; + int[,] array2 = new int[30, 2] + { + { 0, 1 }, + { 0, 2 }, + { 0, 3 }, + { 0, 4 }, + { 1, 5 }, + { 1, 7 }, + { 2, 9 }, + { 2, 13 }, + { 3, 17 }, + { 3, 25 }, + { 4, 33 }, + { 4, 49 }, + { 5, 65 }, + { 5, 97 }, + { 6, 129 }, + { 6, 193 }, + { 7, 257 }, + { 7, 385 }, + { 8, 513 }, + { 8, 769 }, + { 9, 1025 }, + { 9, 1537 }, + { 10, 2049 }, + { 10, 3073 }, + { 11, 4097 }, + { 11, 6145 }, + { 12, 8193 }, + { 12, 12289 }, + { 13, 16385 }, + { 13, 24577 } + }; + int code; + while ((code = GetCode(LCodeTree)) != 256) + { + if (code >= 0 && code < 256) + { + mOutData[mOutIndex++] = (byte)code; + mOutCount--; + continue; + } + if (code > 256) + { + code -= 257; + int numBits; + int num = (((numBits = array[code, 0]) > 0) ? GetBits(numBits) : 0); + num += array[code, 1]; + code = GetCode(DCodeTree); + int num2 = (((numBits = array2[code, 0]) > 0) ? GetBits(numBits) : 0); + num2 += array2[code, 1]; + while (num-- > 0) + { + mOutData[mOutIndex] = mOutData[mOutIndex - num2]; + mOutIndex++; + mOutCount--; + } + continue; + } + Trace.WriteLine(new StringBuilder(64).AppendFormat("Deflate.Decompress Warning: invalid code 0x{0:x4}", code).ToString()); + return false; + } + return true; + } + + private short GetCode(short[] CodeTree) + { + int num = CodeTree.Length; + int num2 = 1; + while (CodeTree[num2] == -1) + { + num2 <<= 1; + num2 += GetBits(1); + if (num2 >= num) + { + return -1; + } + } + return CodeTree[num2]; + } + + private int GetBits(int NumBits) + { + int num; + switch (NumBits) + { + default: + return -1; + case 0: + num = mInBufSize & 7; + mInBuf >>= num; + mInBufSize -= num; + return 0; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + break; + } + while (mInBufSize < NumBits) + { + int num2 = mInData[mInIndex++]; + mInCount--; + mInBuf |= num2 << mInBufSize; + mInBufSize += 8; + } + num = mInBuf & ((1 << NumBits) - 1); + mInBuf >>= NumBits; + mInBufSize -= NumBits; + return num; + } + + private static int Reverse(int Bits, int Length) + { + int num = 0; + while (Length-- > 0) + { + num = (num << 1) | (Bits & 1); + Bits >>= 1; + } + return num; + } +} diff --git a/Managed/Decal.FileService/Properties/AssemblyInfo.cs b/Managed/Decal.FileService/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..44c9f2b --- /dev/null +++ b/Managed/Decal.FileService/Properties/AssemblyInfo.cs @@ -0,0 +1,23 @@ +using System; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.ConstrainedExecution; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; +using System.Security.Permissions; + +[assembly: AssemblyTitle("FileService")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("FileService")] +[assembly: AssemblyCopyright("Copyright © 2005 Kenneth Gober")] +[assembly: AssemblyTrademark("")] +[assembly: ComVisible(false)] +[assembly: Guid("5E9B2FC3-C251-4589-8CE3-2BCA542B98B6")] +[assembly: CLSCompliant(true)] +[assembly: ReliabilityContract(Consistency.MayCorruptProcess, Cer.None)] +[assembly: AssemblyFileVersion("2.9.8.3")] +[assembly: SecurityPermission(SecurityAction.RequestMinimum)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls.csproj b/Managed/Decal.Interop.Controls/Decal.Interop.Controls.csproj new file mode 100644 index 0000000..01395af --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls.csproj @@ -0,0 +1,9 @@ + + + Decal.Interop.Controls + + + + + + diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayout.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayout.cs new file mode 100644 index 0000000..6cbd0fc --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayout.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("6450E486-03E6-493C-9D3B-9B36A5F50E65")] +[CoClass(typeof(BorderLayoutClass))] +public interface BorderLayout : ILayout, IControlEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayoutClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayoutClass.cs new file mode 100644 index 0000000..c725692 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/BorderLayoutClass.cs @@ -0,0 +1,82 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[ComSourceInterfaces("Decal.Interop.Inject.IControlEvents, Decal.Interop.Inject, Version=2.9.8.3, Culture=neutral, PublicKeyToken=481f17d392f1fb65\0\0")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("CA121762-31BB-4073-8597-33BAB4BDCAA3")] +public class BorderLayoutClass : ILayout, BorderLayout, IControlEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IControlEvents_DestroyEventHandler Destroy; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumn.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumn.cs new file mode 100644 index 0000000..7fc3761 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumn.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("E28573F0-36FC-4D64-B8E1-60A2D475A2A8")] +[CoClass(typeof(CheckColumnClass))] +public interface CheckColumn : IListColumn +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumnClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumnClass.cs new file mode 100644 index 0000000..3932be9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckColumnClass.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(2)] +[Guid("48E444F1-8E30-4E4C-B203-4C87FC901586")] +public class CheckColumnClass : IListColumn, CheckColumn +{ + [DispId(1610678272)] + public virtual extern bool FixedWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678273)] + public virtual extern int Width + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [DispId(1610678275)] + public virtual extern int DataColumns + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678278)] + public virtual extern int Height + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Render([MarshalAs(UnmanagedType.Interface)] Canvas __MIDL__IListColumn0000, ref tagPOINT ptCell, int nColor); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([In][MarshalAs(UnmanagedType.Interface)] IList newVal, [In][MarshalAs(UnmanagedType.Interface)] PluginSite pSite); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void SchemaLoad([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Activate(ref tagPOINT ptCell); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Checkbox.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Checkbox.cs new file mode 100644 index 0000000..db47f53 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Checkbox.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(CheckboxClass))] +[Guid("63D0BB56-1552-4F8C-99CC-52006DD47E9E")] +public interface Checkbox : ICheckbox, ICheckboxEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckboxClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckboxClass.cs new file mode 100644 index 0000000..4183606 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/CheckboxClass.cs @@ -0,0 +1,134 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("5AE37451-F79C-478A-834E-EDCF95F01B0E")] +[ComSourceInterfaces("Decal.Interop.Controls.ICheckboxEvents\0\0")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class CheckboxClass : ICheckbox, Checkbox, ICheckboxEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(102)] + public virtual extern string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(103)] + public virtual extern int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } + + [DispId(104)] + public virtual extern bool Checked + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + public virtual extern bool RightToLeft + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event ICheckboxEvents_DestroyEventHandler Destroy; + + public virtual extern event ICheckboxEvents_ChangeEventHandler Change; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Choice.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Choice.cs new file mode 100644 index 0000000..aaf8335 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Choice.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(ChoiceClass))] +[Guid("BD2B37B8-80DE-4F50-ACF8-ED2525B27336")] +public interface Choice : IChoice, IChoiceEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ChoiceClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ChoiceClass.cs new file mode 100644 index 0000000..546cc47 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ChoiceClass.cs @@ -0,0 +1,156 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ComSourceInterfaces("Decal.Interop.Controls.IChoiceEvents\0\0")] +[Guid("E099DC60-0F19-4690-AB7C-8B5834DA286E")] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +public class ChoiceClass : IChoice, Choice, IChoiceEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(102)] + public virtual extern int ChoiceCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + } + + [DispId(103)] + public virtual extern object Data + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(104)] + public virtual extern string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(106)] + public virtual extern bool Dropped + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + set; + } + + [DispId(107)] + public virtual extern int Selected + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + [param: In] + set; + } + + [DispId(108)] + public virtual extern int DropLines + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IChoiceEvents_DestroyEventHandler Destroy; + + public virtual extern event IChoiceEvents_ChangeEventHandler Change; + + public virtual extern event IChoiceEvents_DropDownEventHandler DropDown; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + public virtual extern void AddChoice([MarshalAs(UnmanagedType.BStr)] string strDisplay, [Optional][MarshalAs(UnmanagedType.Struct)] object vData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + public virtual extern void RemoveChoice(int nIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + public virtual extern void Clear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMap.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMap.cs new file mode 100644 index 0000000..3a7d6d9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMap.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("D4FBCA22-45B4-4775-A181-1D4EEC3BFEA1")] +[CoClass(typeof(DerethMapClass))] +public interface DerethMap : IDerethMap, ICommandEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMapClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMapClass.cs new file mode 100644 index 0000000..565c944 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/DerethMapClass.cs @@ -0,0 +1,72 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("3035299A-C5FB-4CC7-A63C-66400B80DCA4")] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.Inject.ICommandEvents, Decal.Interop.Inject, Version=2.9.8.3, Culture=neutral, PublicKeyToken=481f17d392f1fb65\0\0")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +public class DerethMapClass : IDerethMap, DerethMap, ICommandEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event ICommandEvents_DestroyEventHandler Destroy; + + public virtual extern event ICommandEvents_HitEventHandler Hit; + + public virtual extern event ICommandEvents_UnhitEventHandler Unhit; + + public virtual extern event ICommandEvents_AcceptedEventHandler Accepted; + + public virtual extern event ICommandEvents_CanceledEventHandler Canceled; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Edit.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Edit.cs new file mode 100644 index 0000000..dcf645e --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Edit.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(EditClass))] +[Guid("D7EA9129-E36A-4317-BF24-76DA5967DA75")] +public interface Edit : IEdit, IEditEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/EditClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/EditClass.cs new file mode 100644 index 0000000..6c1e435 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/EditClass.cs @@ -0,0 +1,166 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[Guid("8E8F88D2-AA47-474E-9DB7-912D49C8BE9D")] +[ComSourceInterfaces("Decal.Interop.Controls.IEditEvents\0\0")] +[SuppressUnmanagedCodeSecurity] +public class EditClass : IEdit, Edit, IEditEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(102)] + public virtual extern int Caret + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + [DispId(104)] + public virtual extern string SelectedText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(105)] + public virtual extern IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(106)] + public virtual extern IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(107)] + public virtual extern int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IEditEvents_DestroyEventHandler Destroy; + + public virtual extern event IEditEvents_BeginEventHandler Begin; + + public virtual extern event IEditEvents_ChangeEventHandler Change; + + public virtual extern event IEditEvents_EndEventHandler End; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + public virtual extern void Select(int nStart, int nEnd); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + public virtual extern void SetMargins(int nX, int nY); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + public virtual extern void Capture(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayout.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayout.cs new file mode 100644 index 0000000..3981ce8 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayout.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("6450E486-03E6-493C-9D3B-9B36A5F50E65")] +[CoClass(typeof(FixedLayoutClass))] +public interface FixedLayout : ILayout, IControlEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayoutClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayoutClass.cs new file mode 100644 index 0000000..37db5e9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/FixedLayoutClass.cs @@ -0,0 +1,82 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("CD6556CD-F8D9-4CB0-AB7C-7C33058294E4")] +[ComSourceInterfaces("Decal.Interop.Inject.IControlEvents, Decal.Interop.Inject, Version=2.9.8.3, Culture=neutral, PublicKeyToken=481f17d392f1fb65\0\0")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class FixedLayoutClass : ILayout, FixedLayout, IControlEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IControlEvents_DestroyEventHandler Destroy; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IBorderLayout.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IBorderLayout.cs new file mode 100644 index 0000000..59df1b0 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IBorderLayout.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("CF0438EB-8299-48E8-B766-9E9BDDA50203")] +[TypeLibType(4096)] +public interface IBorderLayout : ILayout +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + new IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CreateEdge(eBorderEdge eEdge, int nSize, [MarshalAs(UnmanagedType.Interface)] ILayer pSink); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CreateCenter([MarshalAs(UnmanagedType.Interface)] ILayer pSink); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckbox.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckbox.cs new file mode 100644 index 0000000..0d0f1c5 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckbox.cs @@ -0,0 +1,106 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +[Guid("63D0BB56-1552-4F8C-99CC-52006DD47E9E")] +public interface ICheckbox : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(102)] + string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(103)] + int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } + + [DispId(104)] + bool Checked + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + bool RightToLeft + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents.cs new file mode 100644 index 0000000..4f115fe --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("D56CB28A-9BAD-40B1-A011-70F466DC8F05")] +[InterfaceType(2)] +[TypeLibType(4096)] +public interface ICheckboxEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, bool bChecked); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..dd27a73 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ICheckboxEvents_ChangeEventHandler(int nID, bool bChecked); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..561c962 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ICheckboxEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_Event.cs new file mode 100644 index 0000000..33f048c --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(16)] +[ComVisible(false)] +public interface ICheckboxEvents_Event +{ + event ICheckboxEvents_DestroyEventHandler Destroy; + + event ICheckboxEvents_ChangeEventHandler Change; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_EventProvider.cs new file mode 100644 index 0000000..72c190c --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class ICheckboxEvents_EventProvider : ICheckboxEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 138, 178, 108, 213, 173, 155, 177, 64, 160, 17, + 112, 244, 102, 220, 143, 5 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event ICheckboxEvents_DestroyEventHandler ICheckboxEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICheckboxEvents_SinkHelper checkboxEvents_SinkHelper = new ICheckboxEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(checkboxEvents_SinkHelper, out pdwCookie); + checkboxEvents_SinkHelper.m_dwCookie = pdwCookie; + checkboxEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(checkboxEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICheckboxEvents_SinkHelper checkboxEvents_SinkHelper = (ICheckboxEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (checkboxEvents_SinkHelper.m_DestroyDelegate != null && ((checkboxEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(checkboxEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICheckboxEvents_ChangeEventHandler ICheckboxEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICheckboxEvents_SinkHelper checkboxEvents_SinkHelper = new ICheckboxEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(checkboxEvents_SinkHelper, out pdwCookie); + checkboxEvents_SinkHelper.m_dwCookie = pdwCookie; + checkboxEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(checkboxEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICheckboxEvents_SinkHelper checkboxEvents_SinkHelper = (ICheckboxEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (checkboxEvents_SinkHelper.m_ChangeDelegate != null && ((checkboxEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(checkboxEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public ICheckboxEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + ICheckboxEvents_SinkHelper checkboxEvents_SinkHelper = (ICheckboxEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(checkboxEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_SinkHelper.cs new file mode 100644 index 0000000..d5d3f8c --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICheckboxEvents_SinkHelper.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class ICheckboxEvents_SinkHelper : ICheckboxEvents +{ + public ICheckboxEvents_DestroyEventHandler m_DestroyDelegate; + + public ICheckboxEvents_ChangeEventHandler m_ChangeDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Change(int P_0, bool P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1); + } + } + + internal ICheckboxEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_ChangeDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoice.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoice.cs new file mode 100644 index 0000000..89ff671 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoice.cs @@ -0,0 +1,126 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[TypeLibType(4160)] +[Guid("BD2B37B8-80DE-4F50-ACF8-ED2525B27336")] +[SuppressUnmanagedCodeSecurity] +public interface IChoice : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + void AddChoice([MarshalAs(UnmanagedType.BStr)] string strDisplay, [Optional][MarshalAs(UnmanagedType.Struct)] object vData); + + [DispId(102)] + int ChoiceCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + } + + [DispId(103)] + object Data + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(104)] + string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + void RemoveChoice(int nIndex); + + [DispId(106)] + bool Dropped + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + set; + } + + [DispId(107)] + int Selected + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + [param: In] + set; + } + + [DispId(108)] + int DropLines + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + void Clear(); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceDropDown.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceDropDown.cs new file mode 100644 index 0000000..c6d5f13 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceDropDown.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[InterfaceType(1)] +[Guid("5BAD2CC0-6F03-4EA9-8D7E-1DFD9D134648")] +[SuppressUnmanagedCodeSecurity] +public interface IChoiceDropDown +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents.cs new file mode 100644 index 0000000..147a016 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents.cs @@ -0,0 +1,25 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("763E36A3-389C-42EB-A5F3-C208D028F9AB")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(2)] +[TypeLibType(4096)] +public interface IChoiceEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, int nIndex); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + void DropDown(int nID); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..d9a9de8 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IChoiceEvents_ChangeEventHandler(int nID, int nIndex); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..b9fe854 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IChoiceEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DropDownEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DropDownEventHandler.cs new file mode 100644 index 0000000..d6c40ca --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_DropDownEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IChoiceEvents_DropDownEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_Event.cs new file mode 100644 index 0000000..38bd5c4 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_Event.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IChoiceEvents_Event +{ + event IChoiceEvents_DestroyEventHandler Destroy; + + event IChoiceEvents_ChangeEventHandler Change; + + event IChoiceEvents_DropDownEventHandler DropDown; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_EventProvider.cs new file mode 100644 index 0000000..082478d --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_EventProvider.cs @@ -0,0 +1,306 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class IChoiceEvents_EventProvider : IChoiceEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 163, 54, 62, 118, 156, 56, 235, 66, 165, 243, + 194, 8, 208, 40, 249, 171 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IChoiceEvents_DestroyEventHandler IChoiceEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IChoiceEvents_SinkHelper choiceEvents_SinkHelper = new IChoiceEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(choiceEvents_SinkHelper, out pdwCookie); + choiceEvents_SinkHelper.m_dwCookie = pdwCookie; + choiceEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(choiceEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IChoiceEvents_SinkHelper choiceEvents_SinkHelper = (IChoiceEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (choiceEvents_SinkHelper.m_DestroyDelegate != null && ((choiceEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(choiceEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IChoiceEvents_ChangeEventHandler IChoiceEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IChoiceEvents_SinkHelper choiceEvents_SinkHelper = new IChoiceEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(choiceEvents_SinkHelper, out pdwCookie); + choiceEvents_SinkHelper.m_dwCookie = pdwCookie; + choiceEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(choiceEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IChoiceEvents_SinkHelper choiceEvents_SinkHelper = (IChoiceEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (choiceEvents_SinkHelper.m_ChangeDelegate != null && ((choiceEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(choiceEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IChoiceEvents_DropDownEventHandler IChoiceEvents_Event.DropDown + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IChoiceEvents_SinkHelper choiceEvents_SinkHelper = new IChoiceEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(choiceEvents_SinkHelper, out pdwCookie); + choiceEvents_SinkHelper.m_dwCookie = pdwCookie; + choiceEvents_SinkHelper.m_DropDownDelegate = value; + m_aEventSinkHelpers.Add(choiceEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IChoiceEvents_SinkHelper choiceEvents_SinkHelper = (IChoiceEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (choiceEvents_SinkHelper.m_DropDownDelegate != null && ((choiceEvents_SinkHelper.m_DropDownDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(choiceEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IChoiceEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IChoiceEvents_SinkHelper choiceEvents_SinkHelper = (IChoiceEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(choiceEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_SinkHelper.cs new file mode 100644 index 0000000..346790d --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoiceEvents_SinkHelper.cs @@ -0,0 +1,52 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IChoiceEvents_SinkHelper : IChoiceEvents +{ + public IChoiceEvents_DestroyEventHandler m_DestroyDelegate; + + public IChoiceEvents_ChangeEventHandler m_ChangeDelegate; + + public IChoiceEvents_DropDownEventHandler m_DropDownDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Change(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1); + } + } + + public void DropDown(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DropDownDelegate != null) + { + m_DropDownDelegate(P_0); + } + } + + internal IChoiceEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_ChangeDelegate = null; + m_DropDownDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoicePopup.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoicePopup.cs new file mode 100644 index 0000000..8460eef --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IChoicePopup.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[InterfaceType(1)] +[Guid("B40F3CEA-5DAD-413A-B779-D6FCB0663B7D")] +[SuppressUnmanagedCodeSecurity] +public interface IChoicePopup +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_AcceptedEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_AcceptedEventHandler.cs new file mode 100644 index 0000000..30f07d8 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_AcceptedEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ICommandEvents_AcceptedEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_CanceledEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_CanceledEventHandler.cs new file mode 100644 index 0000000..1abcad1 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_CanceledEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ICommandEvents_CanceledEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..52f9c05 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ICommandEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_Event.cs new file mode 100644 index 0000000..661f1a5 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_Event.cs @@ -0,0 +1,19 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[TypeLibType(16)] +[ComVisible(false)] +public interface ICommandEvents_Event +{ + event ICommandEvents_DestroyEventHandler Destroy; + + event ICommandEvents_HitEventHandler Hit; + + event ICommandEvents_UnhitEventHandler Unhit; + + event ICommandEvents_AcceptedEventHandler Accepted; + + event ICommandEvents_CanceledEventHandler Canceled; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_EventProvider.cs new file mode 100644 index 0000000..8f9596a --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_EventProvider.cs @@ -0,0 +1,458 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class ICommandEvents_EventProvider : ICommandEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 161, 211, 41, 240, 175, 41, 239, 69, 146, 126, + 114, 159, 237, 216, 116, 3 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event ICommandEvents_DestroyEventHandler ICommandEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_DestroyDelegate != null && ((commandEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_HitEventHandler ICommandEvents_Event.Hit + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_HitDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_HitDelegate != null && ((commandEvents_SinkHelper.m_HitDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_UnhitEventHandler ICommandEvents_Event.Unhit + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_UnhitDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_UnhitDelegate != null && ((commandEvents_SinkHelper.m_UnhitDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_AcceptedEventHandler ICommandEvents_Event.Accepted + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_AcceptedDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_AcceptedDelegate != null && ((commandEvents_SinkHelper.m_AcceptedDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_CanceledEventHandler ICommandEvents_Event.Canceled + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_CanceledDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_CanceledDelegate != null && ((commandEvents_SinkHelper.m_CanceledDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public ICommandEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_HitEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_HitEventHandler.cs new file mode 100644 index 0000000..725d327 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_HitEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ICommandEvents_HitEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_SinkHelper.cs new file mode 100644 index 0000000..d3cdfd5 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_SinkHelper.cs @@ -0,0 +1,77 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class ICommandEvents_SinkHelper : ICommandEvents +{ + public ICommandEvents_DestroyEventHandler m_DestroyDelegate; + + public ICommandEvents_HitEventHandler m_HitDelegate; + + public ICommandEvents_UnhitEventHandler m_UnhitDelegate; + + public ICommandEvents_AcceptedEventHandler m_AcceptedDelegate; + + public ICommandEvents_CanceledEventHandler m_CanceledDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Hit(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_HitDelegate != null) + { + m_HitDelegate(P_0); + } + } + + public void Unhit(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_UnhitDelegate != null) + { + m_UnhitDelegate(P_0); + } + } + + public void Accepted(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_AcceptedDelegate != null) + { + m_AcceptedDelegate(P_0); + } + } + + public void Canceled(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_CanceledDelegate != null) + { + m_CanceledDelegate(P_0); + } + } + + internal ICommandEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_HitDelegate = null; + m_UnhitDelegate = null; + m_AcceptedDelegate = null; + m_CanceledDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_UnhitEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_UnhitEventHandler.cs new file mode 100644 index 0000000..6597704 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ICommandEvents_UnhitEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ICommandEvents_UnhitEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..9fe9fd9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IControlEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_Event.cs new file mode 100644 index 0000000..13765df --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_Event.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IControlEvents_Event +{ + event IControlEvents_DestroyEventHandler Destroy; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_EventProvider.cs new file mode 100644 index 0000000..afca546 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class IControlEvents_EventProvider : IControlEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 195, 203, 235, 47, 140, 72, 79, 68, 173, 8, + 93, 48, 151, 210, 209, 237 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IControlEvents_DestroyEventHandler IControlEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IControlEvents_SinkHelper controlEvents_SinkHelper = new IControlEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(controlEvents_SinkHelper, out pdwCookie); + controlEvents_SinkHelper.m_dwCookie = pdwCookie; + controlEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(controlEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IControlEvents_SinkHelper controlEvents_SinkHelper = (IControlEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (controlEvents_SinkHelper.m_DestroyDelegate != null && ((controlEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(controlEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IControlEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IControlEvents_SinkHelper controlEvents_SinkHelper = (IControlEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(controlEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_SinkHelper.cs new file mode 100644 index 0000000..a18bfe9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IControlEvents_SinkHelper.cs @@ -0,0 +1,29 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IControlEvents_SinkHelper : IControlEvents +{ + public IControlEvents_DestroyEventHandler m_DestroyDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + internal IControlEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IDerethMap.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IDerethMap.cs new file mode 100644 index 0000000..5c3067d --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IDerethMap.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[TypeLibType(4096)] +[SuppressUnmanagedCodeSecurity] +[Guid("D4FBCA22-45B4-4775-A181-1D4EEC3BFEA1")] +public interface IDerethMap : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEdit.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEdit.cs new file mode 100644 index 0000000..1d62f70 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEdit.cs @@ -0,0 +1,134 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("D7EA9129-E36A-4317-BF24-76DA5967DA75")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IEdit : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(102)] + int Caret + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + void Select(int nStart, int nEnd); + + [DispId(104)] + string SelectedText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(105)] + IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(106)] + IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(107)] + int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + void SetMargins(int nX, int nY); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + void Capture(); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents.cs new file mode 100644 index 0000000..40dee0e --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents.cs @@ -0,0 +1,29 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[InterfaceType(2)] +[Guid("4A3E384D-39A5-4BC2-A548-66634C8FACCE")] +[TypeLibType(4096)] +[SuppressUnmanagedCodeSecurity] +public interface IEditEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + void Begin(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, [MarshalAs(UnmanagedType.BStr)] string strText); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + void End(int nID, bool bSuccess); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_BeginEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_BeginEventHandler.cs new file mode 100644 index 0000000..a407c6d --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_BeginEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IEditEvents_BeginEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..f3ac73c --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IEditEvents_ChangeEventHandler(int nID, [MarshalAs(UnmanagedType.BStr)] string strText); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..039ab3e --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IEditEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EndEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EndEventHandler.cs new file mode 100644 index 0000000..08c5f11 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EndEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IEditEvents_EndEventHandler(int nID, bool bSuccess); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_Event.cs new file mode 100644 index 0000000..87c9f5e --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_Event.cs @@ -0,0 +1,16 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IEditEvents_Event +{ + event IEditEvents_DestroyEventHandler Destroy; + + event IEditEvents_BeginEventHandler Begin; + + event IEditEvents_ChangeEventHandler Change; + + event IEditEvents_EndEventHandler End; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EventProvider.cs new file mode 100644 index 0000000..f0c0c84 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_EventProvider.cs @@ -0,0 +1,382 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class IEditEvents_EventProvider : IEditEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 77, 56, 62, 74, 165, 57, 194, 75, 165, 72, + 102, 99, 76, 143, 172, 206 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IEditEvents_DestroyEventHandler IEditEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IEditEvents_SinkHelper editEvents_SinkHelper = new IEditEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(editEvents_SinkHelper, out pdwCookie); + editEvents_SinkHelper.m_dwCookie = pdwCookie; + editEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(editEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IEditEvents_SinkHelper editEvents_SinkHelper = (IEditEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (editEvents_SinkHelper.m_DestroyDelegate != null && ((editEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(editEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IEditEvents_BeginEventHandler IEditEvents_Event.Begin + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IEditEvents_SinkHelper editEvents_SinkHelper = new IEditEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(editEvents_SinkHelper, out pdwCookie); + editEvents_SinkHelper.m_dwCookie = pdwCookie; + editEvents_SinkHelper.m_BeginDelegate = value; + m_aEventSinkHelpers.Add(editEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IEditEvents_SinkHelper editEvents_SinkHelper = (IEditEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (editEvents_SinkHelper.m_BeginDelegate != null && ((editEvents_SinkHelper.m_BeginDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(editEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IEditEvents_ChangeEventHandler IEditEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IEditEvents_SinkHelper editEvents_SinkHelper = new IEditEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(editEvents_SinkHelper, out pdwCookie); + editEvents_SinkHelper.m_dwCookie = pdwCookie; + editEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(editEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IEditEvents_SinkHelper editEvents_SinkHelper = (IEditEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (editEvents_SinkHelper.m_ChangeDelegate != null && ((editEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(editEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IEditEvents_EndEventHandler IEditEvents_Event.End + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IEditEvents_SinkHelper editEvents_SinkHelper = new IEditEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(editEvents_SinkHelper, out pdwCookie); + editEvents_SinkHelper.m_dwCookie = pdwCookie; + editEvents_SinkHelper.m_EndDelegate = value; + m_aEventSinkHelpers.Add(editEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IEditEvents_SinkHelper editEvents_SinkHelper = (IEditEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (editEvents_SinkHelper.m_EndDelegate != null && ((editEvents_SinkHelper.m_EndDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(editEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IEditEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IEditEvents_SinkHelper editEvents_SinkHelper = (IEditEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(editEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_SinkHelper.cs new file mode 100644 index 0000000..49e6085 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IEditEvents_SinkHelper.cs @@ -0,0 +1,64 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IEditEvents_SinkHelper : IEditEvents +{ + public IEditEvents_DestroyEventHandler m_DestroyDelegate; + + public IEditEvents_BeginEventHandler m_BeginDelegate; + + public IEditEvents_ChangeEventHandler m_ChangeDelegate; + + public IEditEvents_EndEventHandler m_EndDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Begin(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_BeginDelegate != null) + { + m_BeginDelegate(P_0); + } + } + + public void Change(int P_0, string P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1); + } + } + + public void End(int P_0, bool P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EndDelegate != null) + { + m_EndDelegate(P_0, P_1); + } + } + + internal IEditEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_BeginDelegate = null; + m_ChangeDelegate = null; + m_EndDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IFixedLayout.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IFixedLayout.cs new file mode 100644 index 0000000..1ca6591 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IFixedLayout.cs @@ -0,0 +1,57 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("58CBF550-DFBE-433C-88EC-3FED4A5E09F1")] +[TypeLibType(4096)] +public interface IFixedLayout : ILayout +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + new IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CreateChild(ref LayerParams @params, [MarshalAs(UnmanagedType.Interface)] ILayer pSink); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PositionChild(int nID, ref tagRECT prcNew); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ILayout.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ILayout.cs new file mode 100644 index 0000000..80e4d82 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ILayout.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[TypeLibType(4160)] +[Guid("6450E486-03E6-493C-9D3B-9B36A5F50E65")] +[SuppressUnmanagedCodeSecurity] +public interface ILayout : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IList.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IList.cs new file mode 100644 index 0000000..c6116d2 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IList.cs @@ -0,0 +1,137 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("D648F00A-FE27-4E88-895B-72F58AF50C0C")] +[TypeLibType(4096)] +public interface IList : IListDisp +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new int AddRow(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DeleteRow(int nIndex); + + [DispId(103)] + new object Data + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(104)] + new int RowEstimate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(105)] + new int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void Clear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void InsertRow(int lIndex); + + [DispId(108)] + new int ColumnWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [DispId(109)] + new int Color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(110)] + new bool AutoScroll + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(111)] + new int ScrollPosition + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void JumpToPosition(int newVal); + + [DispId(113)] + new int CountCols + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + int AddColumn([MarshalAs(UnmanagedType.Interface)] IListColumn pNewColumn); + + [DispId(1610874881)] + tagRECT CellRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListColumn.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListColumn.cs new file mode 100644 index 0000000..ae81eff --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListColumn.cs @@ -0,0 +1,55 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("E28573F0-36FC-4D64-B8E1-60A2D475A2A8")] +public interface IListColumn +{ + [DispId(1610678272)] + bool FixedWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678273)] + int Width + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Render([MarshalAs(UnmanagedType.Interface)] Canvas __MIDL__IListColumn0000, ref tagPOINT ptCell, int nColor); + + [DispId(1610678275)] + int DataColumns + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Initialize([In][MarshalAs(UnmanagedType.Interface)] IList newVal, [In][MarshalAs(UnmanagedType.Interface)] PluginSite pSite); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SchemaLoad([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [DispId(1610678278)] + int Height + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Activate(ref tagPOINT ptCell); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListDisp.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListDisp.cs new file mode 100644 index 0000000..18209eb --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListDisp.cs @@ -0,0 +1,148 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +[Guid("A54D70F6-8CFE-4259-9F16-AF0111541278")] +public interface IListDisp : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + int AddRow(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + void DeleteRow(int nIndex); + + [DispId(103)] + object Data + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(104)] + int RowEstimate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + void Clear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + void InsertRow(int lIndex); + + [DispId(108)] + int ColumnWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + set; + } + + [DispId(109)] + int Color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + [param: In] + set; + } + + [DispId(110)] + bool AutoScroll + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(110)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(110)] + [param: In] + set; + } + + [DispId(111)] + int ScrollPosition + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(111)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(111)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(112)] + void JumpToPosition(int newVal); + + [DispId(113)] + int CountCols + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(113)] + get; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents.cs new file mode 100644 index 0000000..32ffb79 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("88456660-8132-433B-A4CD-E252BDF147C5")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(2)] +[TypeLibType(4096)] +public interface IListEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, int nX, int nY); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..7b8d444 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IListEvents_ChangeEventHandler(int nID, int nX, int nY); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..eeb2c9b --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IListEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_Event.cs new file mode 100644 index 0000000..1eb074b --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IListEvents_Event +{ + event IListEvents_DestroyEventHandler Destroy; + + event IListEvents_ChangeEventHandler Change; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_EventProvider.cs new file mode 100644 index 0000000..97dc30d --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class IListEvents_EventProvider : IListEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 96, 102, 69, 136, 50, 129, 59, 67, 164, 205, + 226, 82, 189, 241, 71, 197 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IListEvents_DestroyEventHandler IListEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IListEvents_SinkHelper listEvents_SinkHelper = new IListEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(listEvents_SinkHelper, out pdwCookie); + listEvents_SinkHelper.m_dwCookie = pdwCookie; + listEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(listEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IListEvents_SinkHelper listEvents_SinkHelper = (IListEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (listEvents_SinkHelper.m_DestroyDelegate != null && ((listEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(listEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IListEvents_ChangeEventHandler IListEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IListEvents_SinkHelper listEvents_SinkHelper = new IListEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(listEvents_SinkHelper, out pdwCookie); + listEvents_SinkHelper.m_dwCookie = pdwCookie; + listEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(listEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IListEvents_SinkHelper listEvents_SinkHelper = (IListEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (listEvents_SinkHelper.m_ChangeDelegate != null && ((listEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(listEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IListEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IListEvents_SinkHelper listEvents_SinkHelper = (IListEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(listEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_SinkHelper.cs new file mode 100644 index 0000000..0e2522a --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListEvents_SinkHelper.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IListEvents_SinkHelper : IListEvents +{ + public IListEvents_DestroyEventHandler m_DestroyDelegate; + + public IListEvents_ChangeEventHandler m_ChangeDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Change(int P_0, int P_1, int P_2) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1, P_2); + } + } + + internal IListEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_ChangeDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListView.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListView.cs new file mode 100644 index 0000000..fed5ade --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IListView.cs @@ -0,0 +1,38 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[InterfaceType(1)] +[Guid("1A11BEA0-A0ED-41C1-9057-46084DE9AEDC")] +[SuppressUnmanagedCodeSecurity] +[ComConversionLoss] +public interface IListView +{ + [DispId(1610678272)] + IntPtr Area + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SetCacheInfo(int nRowHeight, int nRowsToCache); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void InvalidateFrom(int nRow); + + [DispId(1610678275)] + int Color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebook.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebook.cs new file mode 100644 index 0000000..42f138a --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebook.cs @@ -0,0 +1,72 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("78B62B0F-B3A4-47FF-A9A4-C68CA3FA80B6")] +[TypeLibType(4160)] +public interface INotebook : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + void AddPage([MarshalAs(UnmanagedType.BStr)] string strText, [MarshalAs(UnmanagedType.Interface)] IControl pClient); + + [DispId(102)] + int ActiveTab + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + [DispId(103)] + string PageText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents.cs new file mode 100644 index 0000000..1f5c5df --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +[Guid("C964E99A-7C1C-46E9-AEA6-09FF5D1BFDD0")] +[InterfaceType(2)] +public interface INotebookEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, int nNewPage); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..2a5bad9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void INotebookEvents_ChangeEventHandler(int nID, int nNewPage); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..3d6f240 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void INotebookEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_Event.cs new file mode 100644 index 0000000..cd7b683 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[TypeLibType(16)] +[ComVisible(false)] +public interface INotebookEvents_Event +{ + event INotebookEvents_DestroyEventHandler Destroy; + + event INotebookEvents_ChangeEventHandler Change; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_EventProvider.cs new file mode 100644 index 0000000..4fd13cf --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class INotebookEvents_EventProvider : INotebookEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 154, 233, 100, 201, 28, 124, 233, 70, 174, 166, + 9, 255, 93, 27, 253, 208 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event INotebookEvents_DestroyEventHandler INotebookEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + INotebookEvents_SinkHelper notebookEvents_SinkHelper = new INotebookEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(notebookEvents_SinkHelper, out pdwCookie); + notebookEvents_SinkHelper.m_dwCookie = pdwCookie; + notebookEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(notebookEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + INotebookEvents_SinkHelper notebookEvents_SinkHelper = (INotebookEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (notebookEvents_SinkHelper.m_DestroyDelegate != null && ((notebookEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(notebookEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event INotebookEvents_ChangeEventHandler INotebookEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + INotebookEvents_SinkHelper notebookEvents_SinkHelper = new INotebookEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(notebookEvents_SinkHelper, out pdwCookie); + notebookEvents_SinkHelper.m_dwCookie = pdwCookie; + notebookEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(notebookEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + INotebookEvents_SinkHelper notebookEvents_SinkHelper = (INotebookEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (notebookEvents_SinkHelper.m_ChangeDelegate != null && ((notebookEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(notebookEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public INotebookEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + INotebookEvents_SinkHelper notebookEvents_SinkHelper = (INotebookEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(notebookEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_SinkHelper.cs new file mode 100644 index 0000000..681b650 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/INotebookEvents_SinkHelper.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class INotebookEvents_SinkHelper : INotebookEvents +{ + public INotebookEvents_DestroyEventHandler m_DestroyDelegate; + + public INotebookEvents_ChangeEventHandler m_ChangeDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Change(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1); + } + } + + internal INotebookEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_ChangeDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayout.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayout.cs new file mode 100644 index 0000000..37bd47b --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayout.cs @@ -0,0 +1,70 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +[Guid("2DF39739-2EFC-4F67-B3AC-712D774B57A9")] +public interface IPageLayout : IPageLayoutDisp +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + new IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(201)] + new int Active + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(202)] + new int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CreatePage([MarshalAs(UnmanagedType.Interface)] ILayer pChild); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayoutDisp.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayoutDisp.cs new file mode 100644 index 0000000..b9a64c3 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPageLayoutDisp.cs @@ -0,0 +1,76 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("1E39FB9E-2C07-4287-B2D7-58EE0BFC9BBB")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IPageLayoutDisp : ILayout +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + new IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(201)] + int Active + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(201)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(201)] + [param: In] + set; + } + + [DispId(202)] + int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(202)] + get; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IProgress.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IProgress.cs new file mode 100644 index 0000000..891d602 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IProgress.cs @@ -0,0 +1,147 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("2EC89916-3E65-422B-977C-9277BA693E82")] +[TypeLibType(4160)] +public interface IProgress : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + int Value + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + set; + } + + [DispId(102)] + int FaceColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + [DispId(103)] + int FillColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } + + [DispId(104)] + int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + int MaxValue + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } + + [DispId(106)] + string PostText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(107)] + string Alignment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(108)] + bool DecalDrawText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + [param: In] + set; + } + + [DispId(109)] + string PreText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(110)] + int BorderWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(110)] + [param: In] + set; + } + + [DispId(111)] + int BorderColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(111)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPushButton.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPushButton.cs new file mode 100644 index 0000000..59ade2f --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IPushButton.cs @@ -0,0 +1,108 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("AAAB9EEA-06E8-4F0A-A926-3A9AB45939FF")] +public interface IPushButton : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + IImageCache Image + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(102)] + IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(103)] + string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(104)] + int FaceColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScroller.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScroller.cs new file mode 100644 index 0000000..8b114c8 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScroller.cs @@ -0,0 +1,104 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +[Guid("24CFCE12-88A0-437A-89E6-31982EA92899")] +public interface IScroller : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610809344)] + tagSIZE Viewport + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610809345)] + tagSIZE Area + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610809347)] + bool HorizontalEnabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610809349)] + bool VerticalEnabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CreateClient([MarshalAs(UnmanagedType.Interface)] ILayer pChild); + + [DispId(1610809352)] + tagPOINT Offset + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ScrollTo(ref tagPOINT ptOffset); + + [DispId(1610809355)] + tagSIZE Increments + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ResetScroller(); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents.cs new file mode 100644 index 0000000..44535f5 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[TypeLibType(4096)] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(2)] +[Guid("DEE67370-16C9-4F81-80CC-1F1B61112299")] +public interface IScrollerEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, int nX, int nY); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..5c018fd --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IScrollerEvents_ChangeEventHandler(int nID, int nX, int nY); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..3c15bc0 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void IScrollerEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_Event.cs new file mode 100644 index 0000000..a229399 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +[TypeLibType(16)] +public interface IScrollerEvents_Event +{ + event IScrollerEvents_DestroyEventHandler Destroy; + + event IScrollerEvents_ChangeEventHandler Change; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_EventProvider.cs new file mode 100644 index 0000000..07765dc --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class IScrollerEvents_EventProvider : IScrollerEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 112, 115, 230, 222, 201, 22, 129, 79, 128, 204, + 31, 27, 97, 17, 34, 153 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IScrollerEvents_DestroyEventHandler IScrollerEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IScrollerEvents_SinkHelper scrollerEvents_SinkHelper = new IScrollerEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(scrollerEvents_SinkHelper, out pdwCookie); + scrollerEvents_SinkHelper.m_dwCookie = pdwCookie; + scrollerEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(scrollerEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IScrollerEvents_SinkHelper scrollerEvents_SinkHelper = (IScrollerEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (scrollerEvents_SinkHelper.m_DestroyDelegate != null && ((scrollerEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(scrollerEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IScrollerEvents_ChangeEventHandler IScrollerEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IScrollerEvents_SinkHelper scrollerEvents_SinkHelper = new IScrollerEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(scrollerEvents_SinkHelper, out pdwCookie); + scrollerEvents_SinkHelper.m_dwCookie = pdwCookie; + scrollerEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(scrollerEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IScrollerEvents_SinkHelper scrollerEvents_SinkHelper = (IScrollerEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (scrollerEvents_SinkHelper.m_ChangeDelegate != null && ((scrollerEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(scrollerEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IScrollerEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IScrollerEvents_SinkHelper scrollerEvents_SinkHelper = (IScrollerEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(scrollerEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_SinkHelper.cs new file mode 100644 index 0000000..8140567 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IScrollerEvents_SinkHelper.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class IScrollerEvents_SinkHelper : IScrollerEvents +{ + public IScrollerEvents_DestroyEventHandler m_DestroyDelegate; + + public IScrollerEvents_ChangeEventHandler m_ChangeDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Change(int P_0, int P_1, int P_2) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1, P_2); + } + } + + internal IScrollerEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_ChangeDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISlider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISlider.cs new file mode 100644 index 0000000..87c6ec9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISlider.cs @@ -0,0 +1,104 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("10D12549-8F59-4F06-83FB-D08FB76337F3")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface ISlider : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(103)] + int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } + + [DispId(104)] + int SliderPosition + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + int Minimum + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } + + [DispId(106)] + int Maximum + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents.cs new file mode 100644 index 0000000..0b83194 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(2)] +[TypeLibType(4096)] +[Guid("F881B44D-67FA-4770-B10A-05DA14409E8F")] +public interface ISliderEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, int lValue); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..0797aa2 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ISliderEvents_ChangeEventHandler(int nID, int lValue); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..ca85a43 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +public delegate void ISliderEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_Event.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_Event.cs new file mode 100644 index 0000000..0058594 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComVisible(false)] +[TypeLibType(16)] +public interface ISliderEvents_Event +{ + event ISliderEvents_DestroyEventHandler Destroy; + + event ISliderEvents_ChangeEventHandler Change; +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_EventProvider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_EventProvider.cs new file mode 100644 index 0000000..ce4d077 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Controls; + +internal sealed class ISliderEvents_EventProvider : ISliderEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 77, 180, 129, 248, 250, 103, 112, 71, 177, 10, + 5, 218, 20, 64, 158, 143 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event ISliderEvents_DestroyEventHandler ISliderEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ISliderEvents_SinkHelper sliderEvents_SinkHelper = new ISliderEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(sliderEvents_SinkHelper, out pdwCookie); + sliderEvents_SinkHelper.m_dwCookie = pdwCookie; + sliderEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(sliderEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ISliderEvents_SinkHelper sliderEvents_SinkHelper = (ISliderEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (sliderEvents_SinkHelper.m_DestroyDelegate != null && ((sliderEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(sliderEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ISliderEvents_ChangeEventHandler ISliderEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ISliderEvents_SinkHelper sliderEvents_SinkHelper = new ISliderEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(sliderEvents_SinkHelper, out pdwCookie); + sliderEvents_SinkHelper.m_dwCookie = pdwCookie; + sliderEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(sliderEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ISliderEvents_SinkHelper sliderEvents_SinkHelper = (ISliderEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (sliderEvents_SinkHelper.m_ChangeDelegate != null && ((sliderEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(sliderEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public ISliderEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + ISliderEvents_SinkHelper sliderEvents_SinkHelper = (ISliderEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(sliderEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_SinkHelper.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_SinkHelper.cs new file mode 100644 index 0000000..469bb5d --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ISliderEvents_SinkHelper.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class ISliderEvents_SinkHelper : ISliderEvents +{ + public ISliderEvents_DestroyEventHandler m_DestroyDelegate; + + public ISliderEvents_ChangeEventHandler m_ChangeDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Change(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1); + } + } + + internal ISliderEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_ChangeDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IStatic.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IStatic.cs new file mode 100644 index 0000000..af7b47e --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IStatic.cs @@ -0,0 +1,82 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("93C28CFF-DCF4-4B63-AB00-A89453940CFE")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IStatic : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(102)] + string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(103)] + int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumn.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumn.cs new file mode 100644 index 0000000..a42d958 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumn.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(IconColumnClass))] +[Guid("E28573F0-36FC-4D64-B8E1-60A2D475A2A8")] +public interface IconColumn : IListColumn +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumnClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumnClass.cs new file mode 100644 index 0000000..aa6e1dc --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/IconColumnClass.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[SuppressUnmanagedCodeSecurity] +[Guid("F12A2C4C-3B78-46EB-8722-68B27A75AE55")] +[TypeLibType(2)] +public class IconColumnClass : IListColumn, IconColumn +{ + [DispId(1610678272)] + public virtual extern bool FixedWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678273)] + public virtual extern int Width + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [DispId(1610678275)] + public virtual extern int DataColumns + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678278)] + public virtual extern int Height + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Render([MarshalAs(UnmanagedType.Interface)] Canvas __MIDL__IListColumn0000, ref tagPOINT ptCell, int nColor); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([In][MarshalAs(UnmanagedType.Interface)] IList newVal, [In][MarshalAs(UnmanagedType.Interface)] PluginSite pSite); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void SchemaLoad([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Activate(ref tagPOINT ptCell); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/List.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/List.cs new file mode 100644 index 0000000..e5c438b --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/List.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(ListClass))] +[Guid("A54D70F6-8CFE-4259-9F16-AF0111541278")] +public interface List : IListDisp, IListEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ListClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ListClass.cs new file mode 100644 index 0000000..b0d2e1b --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ListClass.cs @@ -0,0 +1,176 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +[ComSourceInterfaces("Decal.Interop.Controls.IListEvents\0\0")] +[Guid("3839008F-AF5B-43FC-9F6A-3376B99E3DAF")] +[SuppressUnmanagedCodeSecurity] +public class ListClass : IListDisp, List, IListEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(103)] + public virtual extern object Data + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(104)] + public virtual extern int RowEstimate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + public virtual extern int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + } + + [DispId(108)] + public virtual extern int ColumnWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + set; + } + + [DispId(109)] + public virtual extern int Color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + [param: In] + set; + } + + [DispId(110)] + public virtual extern bool AutoScroll + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(110)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(110)] + [param: In] + set; + } + + [DispId(111)] + public virtual extern int ScrollPosition + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(111)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(111)] + [param: In] + set; + } + + [DispId(113)] + public virtual extern int CountCols + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(113)] + get; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IListEvents_DestroyEventHandler Destroy; + + public virtual extern event IListEvents_ChangeEventHandler Change; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + public virtual extern int AddRow(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + public virtual extern void DeleteRow(int nIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + public virtual extern void Clear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + public virtual extern void InsertRow(int lIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(112)] + public virtual extern void JumpToPosition(int newVal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Notebook.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Notebook.cs new file mode 100644 index 0000000..5b224d4 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Notebook.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("78B62B0F-B3A4-47FF-A9A4-C68CA3FA80B6")] +[CoClass(typeof(NotebookClass))] +public interface Notebook : INotebook, INotebookEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/NotebookClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/NotebookClass.cs new file mode 100644 index 0000000..0c67a62 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/NotebookClass.cs @@ -0,0 +1,100 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[ComSourceInterfaces("Decal.Interop.Controls.INotebookEvents\0\0")] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[Guid("ED14E7C5-11BE-4DFD-9829-873AB6BE3CFC")] +[SuppressUnmanagedCodeSecurity] +public class NotebookClass : INotebook, Notebook, INotebookEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(102)] + public virtual extern int ActiveTab + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + [DispId(103)] + public virtual extern string PageText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event INotebookEvents_DestroyEventHandler Destroy; + + public virtual extern event INotebookEvents_ChangeEventHandler Change; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + public virtual extern void AddPage([MarshalAs(UnmanagedType.BStr)] string strText, [MarshalAs(UnmanagedType.Interface)] IControl pClient); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayout.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayout.cs new file mode 100644 index 0000000..ed5c972 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayout.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("1E39FB9E-2C07-4287-B2D7-58EE0BFC9BBB")] +[CoClass(typeof(PageLayoutClass))] +public interface PageLayout : IPageLayoutDisp, IControlEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayoutClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayoutClass.cs new file mode 100644 index 0000000..0391ea8 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PageLayoutClass.cs @@ -0,0 +1,102 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("5AD04D45-D4BF-4729-8A2E-5D37CF726CAA")] +[ComSourceInterfaces("Decal.Interop.Inject.IControlEvents, Decal.Interop.Inject, Version=2.9.8.3, Culture=neutral, PublicKeyToken=481f17d392f1fb65\0\0")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class PageLayoutClass : IPageLayoutDisp, PageLayout, IControlEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern IImageCache Background + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(201)] + public virtual extern int Active + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(201)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(201)] + [param: In] + set; + } + + [DispId(202)] + public virtual extern int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(202)] + get; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IControlEvents_DestroyEventHandler Destroy; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Progress.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Progress.cs new file mode 100644 index 0000000..2fb0154 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Progress.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("2EC89916-3E65-422B-977C-9277BA693E82")] +[CoClass(typeof(ProgressClass))] +public interface Progress : IProgress, IControlEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ProgressClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ProgressClass.cs new file mode 100644 index 0000000..95b7e10 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ProgressClass.cs @@ -0,0 +1,173 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("FE361225-6BB7-4AE0-A10C-8A6420621680")] +[TypeLibType(2)] +[ComSourceInterfaces("Decal.Interop.Inject.IControlEvents, Decal.Interop.Inject, Version=2.9.8.3, Culture=neutral, PublicKeyToken=481f17d392f1fb65\0\0")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class ProgressClass : IProgress, Progress, IControlEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern int Value + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + set; + } + + [DispId(102)] + public virtual extern int FaceColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + [DispId(103)] + public virtual extern int FillColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } + + [DispId(104)] + public virtual extern int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + public virtual extern int MaxValue + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } + + [DispId(106)] + public virtual extern string PostText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(107)] + public virtual extern string Alignment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(107)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(108)] + public virtual extern bool DecalDrawText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(108)] + [param: In] + set; + } + + [DispId(109)] + public virtual extern string PreText + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(109)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(110)] + public virtual extern int BorderWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(110)] + [param: In] + set; + } + + [DispId(111)] + public virtual extern int BorderColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(111)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IControlEvents_DestroyEventHandler Destroy; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButton.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButton.cs new file mode 100644 index 0000000..4033837 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButton.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(PushButtonClass))] +[Guid("AAAB9EEA-06E8-4F0A-A926-3A9AB45939FF")] +public interface PushButton : IPushButton, ICommandEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButtonClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButtonClass.cs new file mode 100644 index 0000000..8761535 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/PushButtonClass.cs @@ -0,0 +1,142 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[ComSourceInterfaces("Decal.Interop.Inject.ICommandEvents, Decal.Interop.Inject, Version=2.9.8.3, Culture=neutral, PublicKeyToken=481f17d392f1fb65\0\0")] +[ClassInterface(ClassInterfaceType.None)] +[Guid("AE4525BE-81D1-40FB-9170-77172077EB49")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +public class PushButtonClass : IPushButton, PushButton, ICommandEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern IImageCache Image + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(102)] + public virtual extern IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(103)] + public virtual extern string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(104)] + public virtual extern int FaceColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + public virtual extern int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event ICommandEvents_DestroyEventHandler Destroy; + + public virtual extern event ICommandEvents_HitEventHandler Hit; + + public virtual extern event ICommandEvents_UnhitEventHandler Unhit; + + public virtual extern event ICommandEvents_AcceptedEventHandler Accepted; + + public virtual extern event ICommandEvents_CanceledEventHandler Canceled; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Scroller.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Scroller.cs new file mode 100644 index 0000000..a99cc25 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Scroller.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(ScrollerClass))] +[Guid("996B377C-1953-4DB1-AAC1-157F72592D3E")] +public interface Scroller : IControl, IScrollerEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ScrollerClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ScrollerClass.cs new file mode 100644 index 0000000..6d76286 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/ScrollerClass.cs @@ -0,0 +1,48 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ComSourceInterfaces("Decal.Interop.Controls.IScrollerEvents\0\0")] +[Guid("8FC80D21-1731-4816-9AD3-B0364D5F2C27")] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +public class ScrollerClass : IControl, Scroller, IScrollerEvents_Event +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IScrollerEvents_DestroyEventHandler Destroy; + + public virtual extern event IScrollerEvents_ChangeEventHandler Change; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Slider.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Slider.cs new file mode 100644 index 0000000..9acc15e --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/Slider.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[CoClass(typeof(SliderClass))] +[Guid("10D12549-8F59-4F06-83FB-D08FB76337F3")] +public interface Slider : ISlider, ISliderEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/SliderClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/SliderClass.cs new file mode 100644 index 0000000..98851d8 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/SliderClass.cs @@ -0,0 +1,132 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ComSourceInterfaces("Decal.Interop.Controls.ISliderEvents\0\0")] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +[Guid("5D14557A-1268-43C6-A283-3B5B271359AA")] +public class SliderClass : ISlider, Slider, ISliderEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(103)] + public virtual extern int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } + + [DispId(104)] + public virtual extern int SliderPosition + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(104)] + [param: In] + set; + } + + [DispId(105)] + public virtual extern int Minimum + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(105)] + [param: In] + set; + } + + [DispId(106)] + public virtual extern int Maximum + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(106)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event ISliderEvents_DestroyEventHandler Destroy; + + public virtual extern event ISliderEvents_ChangeEventHandler Change; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticText.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticText.cs new file mode 100644 index 0000000..93c3dd9 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticText.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("93C28CFF-DCF4-4B63-AB00-A89453940CFE")] +[CoClass(typeof(StaticTextClass))] +public interface StaticText : IStatic, IControlEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticTextClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticTextClass.cs new file mode 100644 index 0000000..8a2a366 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/StaticTextClass.cs @@ -0,0 +1,108 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("4887101C-A9F9-495B-921B-EF22822CFB97")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ComSourceInterfaces("Decal.Interop.Inject.IControlEvents, Decal.Interop.Inject, Version=2.9.8.3, Culture=neutral, PublicKeyToken=481f17d392f1fb65\0\0")] +[ClassInterface(ClassInterfaceType.None)] +public class StaticTextClass : IStatic, StaticText, IControlEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(101)] + public virtual extern IFontCache Font + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(102)] + public virtual extern string Text + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(103)] + public virtual extern int TextColor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IControlEvents_DestroyEventHandler Destroy; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumn.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumn.cs new file mode 100644 index 0000000..efc96c3 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumn.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Controls; + +[ComImport] +[Guid("E28573F0-36FC-4D64-B8E1-60A2D475A2A8")] +[CoClass(typeof(TextColumnClass))] +public interface TextColumn : IListColumn +{ +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumnClass.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumnClass.cs new file mode 100644 index 0000000..449452c --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/TextColumnClass.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Inject; + +namespace Decal.Interop.Controls; + +[ComImport] +[TypeLibType(2)] +[Guid("864DEABF-D079-4B61-A8CF-081418179239")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class TextColumnClass : IListColumn, TextColumn +{ + [DispId(1610678272)] + public virtual extern bool FixedWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678273)] + public virtual extern int Width + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [DispId(1610678275)] + public virtual extern int DataColumns + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678278)] + public virtual extern int Height + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Render([MarshalAs(UnmanagedType.Interface)] Canvas __MIDL__IListColumn0000, ref tagPOINT ptCell, int nColor); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([In][MarshalAs(UnmanagedType.Interface)] IList newVal, [In][MarshalAs(UnmanagedType.Interface)] PluginSite pSite); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void SchemaLoad([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Activate(ref tagPOINT ptCell); +} diff --git a/Managed/Decal.Interop.Controls/Decal.Interop.Controls/eBorderEdge.cs b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/eBorderEdge.cs new file mode 100644 index 0000000..f779aab --- /dev/null +++ b/Managed/Decal.Interop.Controls/Decal.Interop.Controls/eBorderEdge.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Controls; + +public enum eBorderEdge +{ + eEdgeLeft, + eEdgeTop, + eEdgeRight, + eEdgeBottom +} diff --git a/Managed/Decal.Interop.Controls/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Controls/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0a9b0e3 --- /dev/null +++ b/Managed/Decal.Interop.Controls/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: Guid("1c4b007a-04dd-4df8-ba29-2cfbd0220b89")] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: ImportedFromTypeLib("DecalControls")] +[assembly: TypeLibVersion(2, 0)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core.csproj b/Managed/Decal.Interop.Core/Decal.Interop.Core.csproj new file mode 100644 index 0000000..fd62f27 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core.csproj @@ -0,0 +1,5 @@ + + + Decal.Interop.Core + + diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooks.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooks.cs new file mode 100644 index 0000000..f85556e --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooks.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("93FD982E-D1CE-46C3-9428-532ACCDA06CE")] +[CoClass(typeof(ACHooksClass))] +public interface ACHooks : IACHooks, IACHooksEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooksClass.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooksClass.cs new file mode 100644 index 0000000..025c883 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/ACHooksClass.cs @@ -0,0 +1,586 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("CB8875CD-ABC2-42AD-8175-8908706EED37")] +[ComSourceInterfaces("Decal.Interop.Core.IACHooksEvents\0\0")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class ACHooksClass : IACHooks, ACHooks, IACHooksEvents_Event +{ + [DispId(1610743810)] + public virtual extern int HooksAvail + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + get; + } + + [DispId(1610743811)] + public virtual extern bool HooksAvailEx + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + } + + [DispId(1610743818)] + public virtual extern int CurrentSelection + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + [param: In] + set; + } + + [DispId(1610743820)] + public virtual extern int PreviousSelection + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + [param: In] + set; + } + + [DispId(1610743822)] + public virtual extern int SelectedStackCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + [param: In] + set; + } + + [DispId(1610743824)] + public virtual extern int MaxSelectedStackCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + get; + } + + [DispId(1610743826)] + public virtual extern tagRECT AC3DRegionRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + get; + } + + [DispId(1610743827)] + public virtual extern IntPtr AC3DRegionRectPtr + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743827)] + get; + } + + [DispId(1610743828)] + public virtual extern tagRECT ACWindowRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743828)] + get; + } + + [DispId(1610743829)] + public virtual extern bool ChatState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743829)] + get; + } + + [DispId(1610743830)] + public virtual extern int BusyState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743830)] + get; + } + + [DispId(1610743831)] + public virtual extern int BusyStateID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743831)] + get; + } + + [DispId(1610743832)] + public virtual extern int PointerState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743832)] + get; + } + + [DispId(1610743833)] + public virtual extern int VendorID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743833)] + get; + } + + [DispId(1610743840)] + public virtual extern int CombatMode + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743840)] + get; + } + + [DispId(1610743844)] + public virtual extern int CommandInterpreter + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743844)] + get; + } + + [DispId(1610743858)] + public virtual extern double HeadingDegrees + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743858)] + get; + } + + [DispId(1610743859)] + public virtual extern double HeadingRadians + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743859)] + get; + } + + [DispId(1610743860)] + public virtual extern int Landcell + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743860)] + get; + } + + [DispId(1610743861)] + public virtual extern double LocationX + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743861)] + get; + } + + [DispId(1610743862)] + public virtual extern double LocationY + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743862)] + get; + } + + [DispId(1610743863)] + public virtual extern double LocationZ + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743863)] + get; + } + + [DispId(1610743864)] + public virtual extern eTrainLevel SkillTrainLevel + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743864)] + get; + } + + [DispId(1610743865)] + public virtual extern int SkillTotalXP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743865)] + get; + } + + [DispId(1610743866)] + public virtual extern int SkillFreePoints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743866)] + get; + } + + [DispId(1610743867)] + public virtual extern int SkillClicks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743867)] + get; + } + + [DispId(1610743868)] + public virtual extern int AttributeTotalXP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743868)] + get; + } + + [DispId(1610743869)] + public virtual extern int AttributeClicks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743869)] + get; + } + + [DispId(1610743870)] + public virtual extern int AttributeStart + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743870)] + get; + } + + [DispId(1610743871)] + public virtual extern int VitalTotalXP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743871)] + get; + } + + [DispId(1610743872)] + public virtual extern int VitalClicks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743872)] + get; + } + + [DispId(1610743873)] + public virtual extern int Vital + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743873)] + get; + } + + [DispId(1610743874)] + public virtual extern int Attribute + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743874)] + get; + } + + [DispId(1610743875)] + public virtual extern int Skill + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743875)] + get; + } + + [DispId(1610743876)] + public virtual extern int Misc + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743876)] + get; + } + + [DispId(1610743888)] + public virtual extern int OpenedContainer + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743888)] + get; + } + + [DispId(1610743894)] + public virtual extern int CallerRefInstanceInternal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743894)] + [param: In] + set; + } + + public virtual extern event IACHooksEvents_ObjectDestroyedEventHandler ObjectDestroyed; + + public virtual extern event IACHooksEvents_ChatTextInterceptEventHandler ChatTextIntercept; + + public virtual extern event IACHooksEvents_ChatParserInterceptEventHandler ChatParserIntercept; + + public virtual extern event IACHooksEvents_StatusTextInterceptEventHandler StatusTextIntercept; + + public virtual extern event IACHooksEvents_ObjectSelectedEventHandler ObjectSelected; + + public virtual extern event IACHooksEvents_MessageProcessedEventHandler MessageProcessed; + + public virtual extern event IACHooksEvents_AC3DRegionChangedEventHandler AC3DRegionChanged; + + public virtual extern event IACHooksEvents_ContainerOpenedEventHandler ContainerOpened; + + public virtual extern event IACHooksEvents_ChatClickInterceptEventHandler ChatClickIntercept; + + public virtual extern event IACHooksEvents_RenderPreUIEventHandler RenderPreUI; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [TypeLibFunc(64)] + public virtual extern void SetIDFilter([In][MarshalAs(UnmanagedType.Interface)] IIdentifyFilter pIDFilter); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [TypeLibFunc(64)] + public virtual extern void SetDecal([In][MarshalAs(UnmanagedType.IUnknown)] object pDecal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + public virtual extern void AddChatText([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + public virtual extern void AddChatTextRaw([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + public virtual extern void AddStatusText([In][MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + public virtual extern void InvokeChatParser([In][MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + public virtual extern void SetIdleTime([In] double dIdleTimeout); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + public virtual extern void Logout(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743825)] + public virtual extern void SetCursorPosition([In] int lX, int lY); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743834)] + public virtual extern void VendorBuyListAdd([In] int lID, int lAmount); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743835)] + public virtual extern void VendorBuyListClear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743836)] + public virtual extern void VendorBuyAll(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743837)] + public virtual extern void VendorSellListAdd([In] int lID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743838)] + public virtual extern void VendorSellListClear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743839)] + public virtual extern void VendorSellAll(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743841)] + public virtual extern void SetCombatMode([In] int pVal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743842)] + public virtual extern void SetAutorun([In] bool bOnOff); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743843)] + public virtual extern bool FaceHeading([In] float fHeading, [In] bool bUnknown); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743845)] + public virtual extern void SelectItem([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743846)] + public virtual extern void GiveItem([In] int lObject, int lDestination); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743847)] + public virtual extern void ApplyItem([In] int UseThis, int OnThis); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743848)] + public virtual extern void UseItem([In] int lObjectID, int lUseState); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743849)] + public virtual extern void UseItemRaw([In] int lObjectID, int lUseState, int lUseMethod); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743850)] + public virtual extern void MoveItem([In] int lObjectID, int lPackID, int lSlot, bool bStack); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743851)] + public virtual extern void MoveItemEx([In] int lObjectID, int lDestinationID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743852)] + public virtual extern void MoveItemExRaw([In] int lObject, int lDestination, int lMoveFlags); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743853)] + public virtual extern void DropItem([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743854)] + public virtual extern void CastSpell([In] int lSpellID, int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743855)] + public virtual extern bool IsValidObject([In] int lGUID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743856)] + public virtual extern int GetWeenieObjectPtr([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743857)] + public virtual extern int GetPhysicsObjectPtr([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743877)] + public virtual extern void RequestID([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743878)] + public virtual extern void IDQueueAdd([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743879)] + public virtual extern void SpellTabAdd([In] int lTab, int lIndex, int lSpellID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743880)] + public virtual extern void SpellTabDelete([In] int lTab, int lSpellID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743881)] + public virtual extern void TradeAdd([In] int ItemID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743882)] + public virtual extern void TradeAccept(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743883)] + public virtual extern void TradeDecline(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743884)] + public virtual extern void TradeReset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743885)] + public virtual extern void TradeEnd(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743886)] + public virtual extern void SalvagePanelAdd([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743887)] + public virtual extern void SalvagePanelSalvage(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743889)] + public virtual extern void AddSkillExp([In] eSkill SkillID, int lExperience); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743890)] + public virtual extern void AddAttributeExp([In] eAttribute AttribID, int lExperience); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743891)] + public virtual extern void AddVitalExp([In] eVital VitalID, int lExperience); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743892)] + public virtual extern int SmartboxPtr(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743893)] + public virtual extern float ObjectHeight([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743895)] + public virtual extern void AutoWieldRaw([In] int lObjectID, int SlotID, int Explicit, int NotExplicit, int zeroVal1, int zeroVal2); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743896)] + public virtual extern void AutoWield([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743897)] + public virtual extern void AutoWieldEx([In] int lObjectID, int SlotID, int Explicit, int NotExplicit); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743898)] + public virtual extern void FellowshipRecruit([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743899)] + public virtual extern void FellowshipGrantLeader([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743900)] + public virtual extern void FellowshipSetOpen([In] bool IsOpen); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743901)] + public virtual extern void FellowshipQuit(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743902)] + public virtual extern void FellowshipDisband(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743903)] + public virtual extern void FellowshipDismiss([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743904)] + public virtual extern void UIElementMove([In] int lUIElementType, int X, int Y); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743905)] + public virtual extern void UIElementResize([In] int lUIElementType, int Width, int Height); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743906)] + public virtual extern int UIElementLookup([In] int lUIElementType); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743907)] + public virtual extern tagRECT UIElementRegionRect([In] int lUIElementType); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogate.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogate.cs new file mode 100644 index 0000000..01da5bf --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogate.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("E182005F-6A67-48B5-A50F-464340105330")] +[CoClass(typeof(ActiveXSurrogateClass))] +public interface ActiveXSurrogate : IDecalFileSurrogate +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogateClass.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogateClass.cs new file mode 100644 index 0000000..0cf30b2 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/ActiveXSurrogateClass.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("7559F22F-C56F-4621-AE08-9C354D799D4B")] +public class ActiveXSurrogateClass : IDecalFileSurrogate, ActiveXSurrogate, IDecalUninstall +{ + [DispId(1610678273)] + public virtual extern string Extension + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678274)] + public virtual extern string Description + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Register([MarshalAs(UnmanagedType.BStr)] string Filename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Prepare([MarshalAs(UnmanagedType.Interface)] DecalEnum pEnum); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Uninstall(); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCore.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCore.cs new file mode 100644 index 0000000..76afbb0 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCore.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComImport] +[CoClass(typeof(DecalCoreClass))] +[Guid("A38715BB-91E7-4C66-95F9-363096F29760")] +public interface DecalCore : IDecalCore, IDecalEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCoreClass.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCoreClass.cs new file mode 100644 index 0000000..6d4a671 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalCoreClass.cs @@ -0,0 +1,135 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("4557D5A1-00DB-48F6-ACB3-4FEF30E2F358")] +[ComSourceInterfaces("Decal.Interop.Core.IDecalEvents\0\0")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class DecalCoreClass : IDecalCore, DecalCore, IDecalEvents_Event +{ + [DispId(1610678274)] + public virtual extern int HWND + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [DispId(1610678276)] + public virtual extern bool Focus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678282)] + public virtual extern object Object + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610678284)] + public virtual extern DecalEnum Configuration + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678286)] + public virtual extern object Plugin + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610678287)] + public virtual extern object Service + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610678292)] + public virtual extern ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678297)] + public virtual extern bool PluginsRunning + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern event IDecalEvents_InitializeCompleteEventHandler InitializeComplete; + + public virtual extern event IDecalEvents_TerminateCompleteEventHandler TerminateComplete; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void InitGraphics([MarshalAs(UnmanagedType.IUnknown)] object pD3DDevice); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object GetD3DDevice(ref Guid riid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void SendWM(int HWND, short uMsg, int wParam, int lParam, ref bool pbEat); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void GetScreenSize(out int pWidth, out int pHeight); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + public virtual extern string MapPath([MarshalAs(UnmanagedType.BStr)] string pPath); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StartPlugins(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StopPlugins(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StartServices(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StopServices(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Render2D(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Render3D(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void PreReset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void PostReset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StartFilters(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StopFilters(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern bool KillBitCheckByGUID([In][MarshalAs(UnmanagedType.BStr)] string bstrGuid, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern bool KillBitCheckByProgID([In][MarshalAs(UnmanagedType.BStr)] string bstProgID, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnum.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnum.cs new file mode 100644 index 0000000..35d85c1 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnum.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComImport] +[CoClass(typeof(DecalEnumClass))] +[Guid("FFA32A7A-EFAF-484A-B358-8802DBBAB0EC")] +public interface DecalEnum : IDecalEnum +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnumClass.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnumClass.cs new file mode 100644 index 0000000..f02bb4d --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalEnumClass.cs @@ -0,0 +1,112 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("6DE65A82-C451-46E6-A82D-92137BE851AD")] +[SuppressUnmanagedCodeSecurity] +public class DecalEnumClass : IDecalEnum, DecalEnum +{ + [DispId(1610678272)] + public virtual extern string FriendlyName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678273)] + public virtual extern Guid ComClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678274)] + public virtual extern bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678276)] + public virtual extern bool Restricted + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678279)] + public virtual extern Guid SurrogateClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678280)] + public virtual extern string ResourcePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678281)] + public virtual extern object Property + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610678282)] + public virtual extern string Group + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678285)] + public virtual extern string Version + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678286)] + public virtual extern bool FileExists + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678287)] + public virtual extern string FilePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object CreateInstance(ref Guid riid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Next(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Skip([In] ref Guid clsid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void MoveBefore(ref Guid clsidBefore); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalRes.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalRes.cs new file mode 100644 index 0000000..f48f819 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalRes.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("A074F83A-32AB-46FC-9E4E-7E9DAFCD5D18")] +[CoClass(typeof(DecalResClass))] +public interface DecalRes : IDecalRes +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalResClass.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalResClass.cs new file mode 100644 index 0000000..241a491 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/DecalResClass.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("EA7BE91B-C98A-4138-8985-E22364BE8207")] +[SuppressUnmanagedCodeSecurity] +public class DecalResClass : IDecalRes, DecalRes +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooks.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooks.cs new file mode 100644 index 0000000..521c760 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooks.cs @@ -0,0 +1,565 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("93FD982E-D1CE-46C3-9428-532ACCDA06CE")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[ComConversionLoss] +public interface IACHooks +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610743808)] + void SetIDFilter([In][MarshalAs(UnmanagedType.Interface)] IIdentifyFilter pIDFilter); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [TypeLibFunc(64)] + void SetDecal([In][MarshalAs(UnmanagedType.IUnknown)] object pDecal); + + [DispId(1610743810)] + int HooksAvail + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + get; + } + + [DispId(1610743811)] + bool HooksAvailEx + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + void AddChatText([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + void AddChatTextRaw([In][MarshalAs(UnmanagedType.BStr)] string szText, int lColor, int lTarget); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + void AddStatusText([In][MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + void InvokeChatParser([In][MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + void SetIdleTime([In] double dIdleTimeout); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + void Logout(); + + [DispId(1610743818)] + int CurrentSelection + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + [param: In] + set; + } + + [DispId(1610743820)] + int PreviousSelection + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + [param: In] + set; + } + + [DispId(1610743822)] + int SelectedStackCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + [param: In] + set; + } + + [DispId(1610743824)] + int MaxSelectedStackCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743825)] + void SetCursorPosition([In] int lX, int lY); + + [DispId(1610743826)] + tagRECT AC3DRegionRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + get; + } + + [DispId(1610743827)] + IntPtr AC3DRegionRectPtr + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743827)] + get; + } + + [DispId(1610743828)] + tagRECT ACWindowRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743828)] + get; + } + + [DispId(1610743829)] + bool ChatState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743829)] + get; + } + + [DispId(1610743830)] + int BusyState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743830)] + get; + } + + [DispId(1610743831)] + int BusyStateID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743831)] + get; + } + + [DispId(1610743832)] + int PointerState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743832)] + get; + } + + [DispId(1610743833)] + int VendorID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743833)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743834)] + void VendorBuyListAdd([In] int lID, int lAmount); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743835)] + void VendorBuyListClear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743836)] + void VendorBuyAll(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743837)] + void VendorSellListAdd([In] int lID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743838)] + void VendorSellListClear(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743839)] + void VendorSellAll(); + + [DispId(1610743840)] + int CombatMode + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743840)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743841)] + void SetCombatMode([In] int pVal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743842)] + void SetAutorun([In] bool bOnOff); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743843)] + bool FaceHeading([In] float fHeading, [In] bool bUnknown); + + [DispId(1610743844)] + int CommandInterpreter + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743844)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743845)] + void SelectItem([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743846)] + void GiveItem([In] int lObject, int lDestination); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743847)] + void ApplyItem([In] int UseThis, int OnThis); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743848)] + void UseItem([In] int lObjectID, int lUseState); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743849)] + void UseItemRaw([In] int lObjectID, int lUseState, int lUseMethod); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743850)] + void MoveItem([In] int lObjectID, int lPackID, int lSlot, bool bStack); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743851)] + void MoveItemEx([In] int lObjectID, int lDestinationID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743852)] + void MoveItemExRaw([In] int lObject, int lDestination, int lMoveFlags); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743853)] + void DropItem([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743854)] + void CastSpell([In] int lSpellID, int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743855)] + bool IsValidObject([In] int lGUID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743856)] + int GetWeenieObjectPtr([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743857)] + int GetPhysicsObjectPtr([In] int lObjectID); + + [DispId(1610743858)] + double HeadingDegrees + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743858)] + get; + } + + [DispId(1610743859)] + double HeadingRadians + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743859)] + get; + } + + [DispId(1610743860)] + int Landcell + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743860)] + get; + } + + [DispId(1610743861)] + double LocationX + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743861)] + get; + } + + [DispId(1610743862)] + double LocationY + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743862)] + get; + } + + [DispId(1610743863)] + double LocationZ + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743863)] + get; + } + + [DispId(1610743864)] + eTrainLevel SkillTrainLevel + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743864)] + get; + } + + [DispId(1610743865)] + int SkillTotalXP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743865)] + get; + } + + [DispId(1610743866)] + int SkillFreePoints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743866)] + get; + } + + [DispId(1610743867)] + int SkillClicks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743867)] + get; + } + + [DispId(1610743868)] + int AttributeTotalXP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743868)] + get; + } + + [DispId(1610743869)] + int AttributeClicks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743869)] + get; + } + + [DispId(1610743870)] + int AttributeStart + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743870)] + get; + } + + [DispId(1610743871)] + int VitalTotalXP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743871)] + get; + } + + [DispId(1610743872)] + int VitalClicks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743872)] + get; + } + + [DispId(1610743873)] + int Vital + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743873)] + get; + } + + [DispId(1610743874)] + int Attribute + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743874)] + get; + } + + [DispId(1610743875)] + int Skill + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743875)] + get; + } + + [DispId(1610743876)] + int Misc + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743876)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743877)] + void RequestID([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743878)] + void IDQueueAdd([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743879)] + void SpellTabAdd([In] int lTab, int lIndex, int lSpellID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743880)] + void SpellTabDelete([In] int lTab, int lSpellID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743881)] + void TradeAdd([In] int ItemID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743882)] + void TradeAccept(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743883)] + void TradeDecline(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743884)] + void TradeReset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743885)] + void TradeEnd(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743886)] + void SalvagePanelAdd([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743887)] + void SalvagePanelSalvage(); + + [DispId(1610743888)] + int OpenedContainer + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743888)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743889)] + void AddSkillExp([In] eSkill SkillID, int lExperience); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743890)] + void AddAttributeExp([In] eAttribute AttribID, int lExperience); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743891)] + void AddVitalExp([In] eVital VitalID, int lExperience); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743892)] + int SmartboxPtr(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743893)] + float ObjectHeight([In] int lObjectID); + + [DispId(1610743894)] + int CallerRefInstanceInternal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743894)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743895)] + void AutoWieldRaw([In] int lObjectID, int SlotID, int Explicit, int NotExplicit, int zeroVal1, int zeroVal2); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743896)] + void AutoWield([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743897)] + void AutoWieldEx([In] int lObjectID, int SlotID, int Explicit, int NotExplicit); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743898)] + void FellowshipRecruit([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743899)] + void FellowshipGrantLeader([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743900)] + void FellowshipSetOpen([In] bool IsOpen); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743901)] + void FellowshipQuit(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743902)] + void FellowshipDisband(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743903)] + void FellowshipDismiss([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743904)] + void UIElementMove([In] int lUIElementType, int X, int Y); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743905)] + void UIElementResize([In] int lUIElementType, int Width, int Height); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743906)] + int UIElementLookup([In] int lUIElementType); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743907)] + tagRECT UIElementRegionRect([In] int lUIElementType); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents.cs new file mode 100644 index 0000000..1b5fea4 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents.cs @@ -0,0 +1,53 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[InterfaceType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("EB282FE5-7170-4A37-A26E-92AF36385D2C")] +[TypeLibType(4096)] +public interface IACHooksEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void ObjectDestroyed([In] int lGUID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void ChatTextIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lColor, [In] int lTarget, [In][Out] ref bool bEat); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void ChatParserIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void StatusTextIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + void ObjectSelected([In] int lGUID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void MessageProcessed([In] int pbData, [In] int dwSize); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + void AC3DRegionChanged([In] int left, [In] int top, int right, [In] int bottom); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + void ContainerOpened([In] int lGUID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + void ChatClickIntercept([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lID, [In][Out] ref bool bEat); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + void RenderPreUI(); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_AC3DRegionChangedEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_AC3DRegionChangedEventHandler.cs new file mode 100644 index 0000000..a84bae6 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_AC3DRegionChangedEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_AC3DRegionChangedEventHandler([In] int left, [In] int top, int right, [In] int bottom); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatClickInterceptEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatClickInterceptEventHandler.cs new file mode 100644 index 0000000..73d7894 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatClickInterceptEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_ChatClickInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lID, [In][Out] ref bool bEat); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatParserInterceptEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatParserInterceptEventHandler.cs new file mode 100644 index 0000000..fd7dadc --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatParserInterceptEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_ChatParserInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatTextInterceptEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatTextInterceptEventHandler.cs new file mode 100644 index 0000000..d5043db --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ChatTextInterceptEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_ChatTextInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In] int lColor, [In] int lTarget, [In][Out] ref bool bEat); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ContainerOpenedEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ContainerOpenedEventHandler.cs new file mode 100644 index 0000000..06eb90e --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ContainerOpenedEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_ContainerOpenedEventHandler([In] int lGUID); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_Event.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_Event.cs new file mode 100644 index 0000000..749e9c7 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_Event.cs @@ -0,0 +1,28 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IACHooksEvents_Event +{ + event IACHooksEvents_ObjectDestroyedEventHandler ObjectDestroyed; + + event IACHooksEvents_ChatTextInterceptEventHandler ChatTextIntercept; + + event IACHooksEvents_ChatParserInterceptEventHandler ChatParserIntercept; + + event IACHooksEvents_StatusTextInterceptEventHandler StatusTextIntercept; + + event IACHooksEvents_ObjectSelectedEventHandler ObjectSelected; + + event IACHooksEvents_MessageProcessedEventHandler MessageProcessed; + + event IACHooksEvents_AC3DRegionChangedEventHandler AC3DRegionChanged; + + event IACHooksEvents_ContainerOpenedEventHandler ContainerOpened; + + event IACHooksEvents_ChatClickInterceptEventHandler ChatClickIntercept; + + event IACHooksEvents_RenderPreUIEventHandler RenderPreUI; +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_EventProvider.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_EventProvider.cs new file mode 100644 index 0000000..2be806a --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_EventProvider.cs @@ -0,0 +1,838 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Core; + +internal sealed class IACHooksEvents_EventProvider : IACHooksEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 229, 47, 40, 235, 112, 113, 55, 74, 162, 110, + 146, 175, 54, 56, 93, 44 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IACHooksEvents_ObjectDestroyedEventHandler IACHooksEvents_Event.ObjectDestroyed + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_ObjectDestroyedDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_ObjectDestroyedDelegate != null && ((iACHooksEvents_SinkHelper.m_ObjectDestroyedDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_ChatTextInterceptEventHandler IACHooksEvents_Event.ChatTextIntercept + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_ChatTextInterceptDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_ChatTextInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_ChatTextInterceptDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_ChatParserInterceptEventHandler IACHooksEvents_Event.ChatParserIntercept + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_ChatParserInterceptDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_ChatParserInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_ChatParserInterceptDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_StatusTextInterceptEventHandler IACHooksEvents_Event.StatusTextIntercept + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_StatusTextInterceptDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_StatusTextInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_StatusTextInterceptDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_ObjectSelectedEventHandler IACHooksEvents_Event.ObjectSelected + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_ObjectSelectedDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_ObjectSelectedDelegate != null && ((iACHooksEvents_SinkHelper.m_ObjectSelectedDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_MessageProcessedEventHandler IACHooksEvents_Event.MessageProcessed + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_MessageProcessedDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_MessageProcessedDelegate != null && ((iACHooksEvents_SinkHelper.m_MessageProcessedDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_AC3DRegionChangedEventHandler IACHooksEvents_Event.AC3DRegionChanged + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_AC3DRegionChangedDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_AC3DRegionChangedDelegate != null && ((iACHooksEvents_SinkHelper.m_AC3DRegionChangedDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_ContainerOpenedEventHandler IACHooksEvents_Event.ContainerOpened + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_ContainerOpenedDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_ContainerOpenedDelegate != null && ((iACHooksEvents_SinkHelper.m_ContainerOpenedDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_ChatClickInterceptEventHandler IACHooksEvents_Event.ChatClickIntercept + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_ChatClickInterceptDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_ChatClickInterceptDelegate != null && ((iACHooksEvents_SinkHelper.m_ChatClickInterceptDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IACHooksEvents_RenderPreUIEventHandler IACHooksEvents_Event.RenderPreUI + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = new IACHooksEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iACHooksEvents_SinkHelper, out pdwCookie); + iACHooksEvents_SinkHelper.m_dwCookie = pdwCookie; + iACHooksEvents_SinkHelper.m_RenderPreUIDelegate = value; + m_aEventSinkHelpers.Add(iACHooksEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iACHooksEvents_SinkHelper.m_RenderPreUIDelegate != null && ((iACHooksEvents_SinkHelper.m_RenderPreUIDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IACHooksEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IACHooksEvents_SinkHelper iACHooksEvents_SinkHelper = (IACHooksEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(iACHooksEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_MessageProcessedEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_MessageProcessedEventHandler.cs new file mode 100644 index 0000000..495eff1 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_MessageProcessedEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_MessageProcessedEventHandler([In] int pbData, [In] int dwSize); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectDestroyedEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectDestroyedEventHandler.cs new file mode 100644 index 0000000..94c3e74 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectDestroyedEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_ObjectDestroyedEventHandler([In] int lGUID); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectSelectedEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectSelectedEventHandler.cs new file mode 100644 index 0000000..b26457d --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_ObjectSelectedEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_ObjectSelectedEventHandler([In] int lGUID); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_RenderPreUIEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_RenderPreUIEventHandler.cs new file mode 100644 index 0000000..8acc6a1 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_RenderPreUIEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_RenderPreUIEventHandler(); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_SinkHelper.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_SinkHelper.cs new file mode 100644 index 0000000..0c978e8 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_SinkHelper.cs @@ -0,0 +1,136 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IACHooksEvents_SinkHelper : IACHooksEvents +{ + public IACHooksEvents_ObjectDestroyedEventHandler m_ObjectDestroyedDelegate; + + public IACHooksEvents_ChatTextInterceptEventHandler m_ChatTextInterceptDelegate; + + public IACHooksEvents_ChatParserInterceptEventHandler m_ChatParserInterceptDelegate; + + public IACHooksEvents_StatusTextInterceptEventHandler m_StatusTextInterceptDelegate; + + public IACHooksEvents_ObjectSelectedEventHandler m_ObjectSelectedDelegate; + + public IACHooksEvents_MessageProcessedEventHandler m_MessageProcessedDelegate; + + public IACHooksEvents_AC3DRegionChangedEventHandler m_AC3DRegionChangedDelegate; + + public IACHooksEvents_ContainerOpenedEventHandler m_ContainerOpenedDelegate; + + public IACHooksEvents_ChatClickInterceptEventHandler m_ChatClickInterceptDelegate; + + public IACHooksEvents_RenderPreUIEventHandler m_RenderPreUIDelegate; + + public int m_dwCookie; + + public void ObjectDestroyed(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ObjectDestroyedDelegate != null) + { + m_ObjectDestroyedDelegate(P_0); + } + } + + public void ChatTextIntercept(string P_0, int P_1, int P_2, ref bool P_3) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChatTextInterceptDelegate != null) + { + m_ChatTextInterceptDelegate(P_0, P_1, P_2, ref P_3); + } + } + + public void ChatParserIntercept(string P_0, ref bool P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChatParserInterceptDelegate != null) + { + m_ChatParserInterceptDelegate(P_0, ref P_1); + } + } + + public void StatusTextIntercept(string P_0, ref bool P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_StatusTextInterceptDelegate != null) + { + m_StatusTextInterceptDelegate(P_0, ref P_1); + } + } + + public void ObjectSelected(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ObjectSelectedDelegate != null) + { + m_ObjectSelectedDelegate(P_0); + } + } + + public void MessageProcessed(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_MessageProcessedDelegate != null) + { + m_MessageProcessedDelegate(P_0, P_1); + } + } + + public void AC3DRegionChanged(int P_0, int P_1, int P_2, int P_3) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_AC3DRegionChangedDelegate != null) + { + m_AC3DRegionChangedDelegate(P_0, P_1, P_2, P_3); + } + } + + public void ContainerOpened(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ContainerOpenedDelegate != null) + { + m_ContainerOpenedDelegate(P_0); + } + } + + public void ChatClickIntercept(string P_0, int P_1, ref bool P_2) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChatClickInterceptDelegate != null) + { + m_ChatClickInterceptDelegate(P_0, P_1, ref P_2); + } + } + + public void RenderPreUI() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_RenderPreUIDelegate != null) + { + m_RenderPreUIDelegate(); + } + } + + internal IACHooksEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_ObjectDestroyedDelegate = null; + m_ChatTextInterceptDelegate = null; + m_ChatParserInterceptDelegate = null; + m_StatusTextInterceptDelegate = null; + m_ObjectSelectedDelegate = null; + m_MessageProcessedDelegate = null; + m_AC3DRegionChangedDelegate = null; + m_ContainerOpenedDelegate = null; + m_ChatClickInterceptDelegate = null; + m_RenderPreUIDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_StatusTextInterceptEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_StatusTextInterceptEventHandler.cs new file mode 100644 index 0000000..463ed34 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IACHooksEvents_StatusTextInterceptEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IACHooksEvents_StatusTextInterceptEventHandler([In][MarshalAs(UnmanagedType.BStr)] string bstrText, [In][Out] ref bool bEat); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalCore.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalCore.cs new file mode 100644 index 0000000..9119350 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalCore.cs @@ -0,0 +1,130 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[TypeLibType(256)] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("A38715BB-91E7-4C66-95F9-363096F29760")] +public interface IDecalCore +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void InitGraphics([MarshalAs(UnmanagedType.IUnknown)] object pD3DDevice); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object GetD3DDevice(ref Guid riid); + + [DispId(1610678274)] + int HWND + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [DispId(1610678276)] + bool Focus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SendWM(int HWND, short uMsg, int wParam, int lParam, ref bool pbEat); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void GetScreenSize(out int pWidth, out int pHeight); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + string MapPath([MarshalAs(UnmanagedType.BStr)] string pPath); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StartPlugins(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StopPlugins(); + + [DispId(1610678282)] + object Object + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StartServices(); + + [DispId(1610678284)] + DecalEnum Configuration + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StopServices(); + + [DispId(1610678286)] + object Plugin + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610678287)] + object Service + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Render2D(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Render3D(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PreReset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PostReset(); + + [DispId(1610678292)] + ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StartFilters(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StopFilters(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool KillBitCheckByGUID([In][MarshalAs(UnmanagedType.BStr)] string bstrGuid, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool KillBitCheckByProgID([In][MarshalAs(UnmanagedType.BStr)] string bstProgID, [MarshalAs(UnmanagedType.BStr)] string bstrVersion); + + [DispId(1610678297)] + bool PluginsRunning + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalDirectory.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalDirectory.cs new file mode 100644 index 0000000..fe9d7fa --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalDirectory.cs @@ -0,0 +1,16 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("5DBD2180-4B88-440E-9706-E6159A39D014")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IDecalDirectory +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object Lookup([MarshalAs(UnmanagedType.BStr)] string strName); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEnum.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEnum.cs new file mode 100644 index 0000000..de2a310 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEnum.cs @@ -0,0 +1,112 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("FFA32A7A-EFAF-484A-B358-8802DBBAB0EC")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IDecalEnum +{ + [DispId(1610678272)] + string FriendlyName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678273)] + Guid ComClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678274)] + bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678276)] + bool Restricted + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object CreateInstance(ref Guid riid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Next(); + + [DispId(1610678279)] + Guid SurrogateClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678280)] + string ResourcePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678281)] + object Property + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610678282)] + string Group + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Skip([In] ref Guid clsid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MoveBefore(ref Guid clsidBefore); + + [DispId(1610678285)] + string Version + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678286)] + bool FileExists + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678287)] + string FilePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents.cs new file mode 100644 index 0000000..ab263b8 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[TypeLibType(4096)] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(2)] +[Guid("A362F526-8203-4A77-9E37-361130924D28")] +public interface IDecalEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void InitializeComplete([In] eDecalComponentType Type); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void TerminateComplete([In] eDecalComponentType Type); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_Event.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_Event.cs new file mode 100644 index 0000000..35358ea --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +[TypeLibType(16)] +public interface IDecalEvents_Event +{ + event IDecalEvents_InitializeCompleteEventHandler InitializeComplete; + + event IDecalEvents_TerminateCompleteEventHandler TerminateComplete; +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_EventProvider.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_EventProvider.cs new file mode 100644 index 0000000..05e51b0 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Core; + +internal sealed class IDecalEvents_EventProvider : IDecalEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 38, 245, 98, 163, 3, 130, 119, 74, 158, 55, + 54, 17, 48, 146, 77, 40 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IDecalEvents_InitializeCompleteEventHandler IDecalEvents_Event.InitializeComplete + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IDecalEvents_SinkHelper decalEvents_SinkHelper = new IDecalEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(decalEvents_SinkHelper, out pdwCookie); + decalEvents_SinkHelper.m_dwCookie = pdwCookie; + decalEvents_SinkHelper.m_InitializeCompleteDelegate = value; + m_aEventSinkHelpers.Add(decalEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IDecalEvents_SinkHelper decalEvents_SinkHelper = (IDecalEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (decalEvents_SinkHelper.m_InitializeCompleteDelegate != null && ((decalEvents_SinkHelper.m_InitializeCompleteDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(decalEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IDecalEvents_TerminateCompleteEventHandler IDecalEvents_Event.TerminateComplete + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IDecalEvents_SinkHelper decalEvents_SinkHelper = new IDecalEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(decalEvents_SinkHelper, out pdwCookie); + decalEvents_SinkHelper.m_dwCookie = pdwCookie; + decalEvents_SinkHelper.m_TerminateCompleteDelegate = value; + m_aEventSinkHelpers.Add(decalEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IDecalEvents_SinkHelper decalEvents_SinkHelper = (IDecalEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (decalEvents_SinkHelper.m_TerminateCompleteDelegate != null && ((decalEvents_SinkHelper.m_TerminateCompleteDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(decalEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IDecalEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IDecalEvents_SinkHelper decalEvents_SinkHelper = (IDecalEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(decalEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_InitializeCompleteEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_InitializeCompleteEventHandler.cs new file mode 100644 index 0000000..e0613fd --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_InitializeCompleteEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IDecalEvents_InitializeCompleteEventHandler([In] eDecalComponentType Type); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_SinkHelper.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_SinkHelper.cs new file mode 100644 index 0000000..7005988 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_SinkHelper.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IDecalEvents_SinkHelper : IDecalEvents +{ + public IDecalEvents_InitializeCompleteEventHandler m_InitializeCompleteDelegate; + + public IDecalEvents_TerminateCompleteEventHandler m_TerminateCompleteDelegate; + + public int m_dwCookie; + + public void InitializeComplete(eDecalComponentType P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_InitializeCompleteDelegate != null) + { + m_InitializeCompleteDelegate(P_0); + } + } + + public void TerminateComplete(eDecalComponentType P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_TerminateCompleteDelegate != null) + { + m_TerminateCompleteDelegate(P_0); + } + } + + internal IDecalEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_InitializeCompleteDelegate = null; + m_TerminateCompleteDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_TerminateCompleteEventHandler.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_TerminateCompleteEventHandler.cs new file mode 100644 index 0000000..3e2d598 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalEvents_TerminateCompleteEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComVisible(false)] +public delegate void IDecalEvents_TerminateCompleteEventHandler([In] eDecalComponentType Type); diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalFileSurrogate.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalFileSurrogate.cs new file mode 100644 index 0000000..1648756 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalFileSurrogate.cs @@ -0,0 +1,31 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[InterfaceType(1)] +[SuppressUnmanagedCodeSecurity] +[Guid("E182005F-6A67-48B5-A50F-464340105330")] +public interface IDecalFileSurrogate +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Register([MarshalAs(UnmanagedType.BStr)] string Filename); + + [DispId(1610678273)] + string Extension + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678274)] + string Description + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRender.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRender.cs new file mode 100644 index 0000000..9fc4a86 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRender.cs @@ -0,0 +1,30 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("B66985FA-8CB0-48E5-A2A9-7B232D609B9C")] +[InterfaceType(1)] +[SuppressUnmanagedCodeSecurity] +public interface IDecalRender +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Render2D(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Render3D(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PreReset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PostReset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ChangeHWND(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ChangeDirectX(); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRes.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRes.cs new file mode 100644 index 0000000..b82a507 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalRes.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("A074F83A-32AB-46FC-9E4E-7E9DAFCD5D18")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IDecalRes +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalService.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalService.cs new file mode 100644 index 0000000..8646fbe --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalService.cs @@ -0,0 +1,24 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("0F95468D-5071-4E28-A223-D83FDFED99E2")] +[InterfaceType(1)] +public interface IDecalService +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Initialize([MarshalAs(UnmanagedType.Interface)] DecalCore pDecal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void BeforePlugins(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void AfterPlugins(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Terminate(); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalSurrogate.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalSurrogate.cs new file mode 100644 index 0000000..ae6424d --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalSurrogate.cs @@ -0,0 +1,43 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("DA98635C-A312-463B-A746-2CF62AF7413A")] +[InterfaceType(1)] +public interface IDecalSurrogate +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object CreateInstance([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData, ref Guid riid); + + [DispId(1610678273)] + string Version + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SetEnum([MarshalAs(UnmanagedType.Interface)] DecalEnum pInitData); + + [DispId(1610678275)] + bool FileExists + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678276)] + string FilePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalUninstall.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalUninstall.cs new file mode 100644 index 0000000..4e489e5 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalUninstall.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("6A188D19-EC3D-409D-8190-7975FEEE2081")] +[InterfaceType(1)] +public interface IDecalUninstall +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Prepare([MarshalAs(UnmanagedType.Interface)] DecalEnum pEnum); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Uninstall(); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalWindowsMessageSink.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalWindowsMessageSink.cs new file mode 100644 index 0000000..947bc59 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IDecalWindowsMessageSink.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("49D496B1-A97B-4545-8968-C4DDEBE04526")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IDecalWindowsMessageSink +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool WindowMessage(int HWND, short uMsg, int wParam, int lParam); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IIdentifyFilter.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IIdentifyFilter.cs new file mode 100644 index 0000000..8da67c3 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IIdentifyFilter.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("256DF70B-0B87-45E4-96EE-043E2254CC95")] +public interface IIdentifyFilter +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void AddToQueue([In] int lObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ShortcircuitID([In] int lObjectID); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IInjectService.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IInjectService.cs new file mode 100644 index 0000000..5a6aab2 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IInjectService.cs @@ -0,0 +1,23 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("47761792-2520-4802-8548-5CA580697614")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IInjectService +{ + [DispId(1)] + object Site + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void InitPlugin([MarshalAs(UnmanagedType.IUnknown)] object pUnk); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IPlugin2.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IPlugin2.cs new file mode 100644 index 0000000..3f36555 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IPlugin2.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("DFFED96D-C0B3-45CC-9B19-A95AFEEDA612")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IPlugin2 +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Initialize([MarshalAs(UnmanagedType.Interface)] PluginSite2 Site); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Terminate(); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/IPluginSite2.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/IPluginSite2.cs new file mode 100644 index 0000000..9182e8b --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/IPluginSite2.cs @@ -0,0 +1,50 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("FF37AF34-3CAE-4235-9D85-6EE6976903D6")] +public interface IPluginSite2 +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Unload(); + + [DispId(1610678273)] + object Object + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [DispId(1610678274)] + DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678275)] + ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678276)] + object PluginSite + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void RegisterSinks([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2.cs new file mode 100644 index 0000000..48f09ec --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("FF37AF34-3CAE-4235-9D85-6EE6976903D6")] +[CoClass(typeof(PluginSite2Class))] +public interface PluginSite2 : IPluginSite2 +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2Class.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2Class.cs new file mode 100644 index 0000000..12e8587 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/PluginSite2Class.cs @@ -0,0 +1,50 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("E2284FC7-17E5-4846-ADAB-07953273C5FB")] +public class PluginSite2Class : IPluginSite2, PluginSite2 +{ + [DispId(1610678273)] + public virtual extern object Object + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [DispId(1610678274)] + public virtual extern DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678275)] + public virtual extern ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678276)] + public virtual extern object PluginSite + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Unload(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void RegisterSinks([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemove.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemove.cs new file mode 100644 index 0000000..1b61854 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemove.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[ComImport] +[CoClass(typeof(SurrogateRemoveClass))] +[Guid("6A188D19-EC3D-409D-8190-7975FEEE2081")] +public interface SurrogateRemove : IDecalUninstall +{ +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemoveClass.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemoveClass.cs new file mode 100644 index 0000000..0cc3cc4 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/SurrogateRemoveClass.cs @@ -0,0 +1,19 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Core; + +[ComImport] +[Guid("144FBF76-E7FB-4B41-AE19-6B5AB0E0A89B")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +public class SurrogateRemoveClass : IDecalUninstall, SurrogateRemove +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Prepare([MarshalAs(UnmanagedType.Interface)] DecalEnum pEnum); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Uninstall(); +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eAttribute.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eAttribute.cs new file mode 100644 index 0000000..39a5271 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eAttribute.cs @@ -0,0 +1,18 @@ +namespace Decal.Interop.Core; + +public enum eAttribute +{ + eCurrentStrength = 1, + eCurrentEndurance = 2, + eCurrentQuickness = 3, + eCurrentCoordination = 4, + eCurrentFocus = 5, + eCurrentSelf = 6, + eBaseStrength = 7, + eBaseEndurance = 8, + eBaseQuickness = 9, + eBaseCoordination = 10, + eBaseFocus = 11, + eBaseSelf = 12, + eAttribute_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooks.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooks.cs new file mode 100644 index 0000000..6b3db95 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooks.cs @@ -0,0 +1,33 @@ +namespace Decal.Interop.Core; + +public enum eAvailableHooks +{ + ePrevSelect = 1, + eCurrentSelect = 2, + eCastSpell = 8, + eMoveItem = 16, + eSelectItem = 32, + eUseItem = 64, + eCombatMode = 128, + eChatState = 256, + eStackCount = 1024, + eMaxStackCount = 2048, + eVendorID = 4096, + eBusyState = 8192, + eBusyStateID = 16384, + ePointerState = 32768, + eMoveItemEx = 65536, + ePosition = 131072, + eFaceHeading = 262144, + eAC3DRegion = 524288, + eObjectDestroyed = 2097152, + eSendTell = 4194304, + eSetAutorun = 8388608, + eSetCombatMode = 33554432, + eGetMiscInt = 67108864, + eGetMiscInt64 = 134217728, + eGetAttribute = 268435456, + eGetSkill = 536870912, + eGetVital = 1073741824, + eHooksAvailEx = int.MinValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooksEx.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooksEx.cs new file mode 100644 index 0000000..b803487 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eAvailableHooksEx.cs @@ -0,0 +1,29 @@ +namespace Decal.Interop.Core; + +public enum eAvailableHooksEx +{ + eLogout = 0, + eColorEx = 1, + eSkillInfo = 2, + eAttributeInfo = 3, + eVitalInfo = 4, + eIsValidObject = 5, + eOnSelectItemEvent = 6, + eRequestID = 7, + eIDQueueAdd = 8, + eSendMessageByMask = 9, + eUseItemRaw = 10, + eSetIdleTime = 11, + eGiveItem = 12, + eMoveItemExRaw = 13, + eSpellTabAdd = 14, + eSpellTabDelete = 15, + eTradeAdd = 16, + eTradeAccept = 17, + eTradeDecline = 18, + eTradeReset = 19, + eTradeClose = 20, + eSalvagePanelAdd = 21, + eSalvagePanelSalvage = 22, + eAvailableHooksEx_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eChatColors.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eChatColors.cs new file mode 100644 index 0000000..e9203b7 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eChatColors.cs @@ -0,0 +1,28 @@ +namespace Decal.Interop.Core; + +public enum eChatColors +{ + SystemGreen, + Green, + White, + BrightYellow, + DullYellow, + Purple, + Red, + DarkBlue, + BrightPeach, + Peach, + BrightYellow2, + DullYellow2, + Grey, + Cyan, + LightBlue, + Red2, + Green2, + DarkBlue2, + Green3, + Green4, + Purple2, + Red3, + LightRed +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eDecalComponentType.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eDecalComponentType.cs new file mode 100644 index 0000000..e6e6891 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eDecalComponentType.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Core; + +public enum eDecalComponentType +{ + ePlugin = 1, + eService = 2, + eNetworkFilter = 3, + eComponentType_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eInt64Types.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eInt64Types.cs new file mode 100644 index 0000000..de11d7e --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eInt64Types.cs @@ -0,0 +1,8 @@ +namespace Decal.Interop.Core; + +public enum eInt64Types +{ + eTotalExperience = 1, + eUnassignedExperience = 2, + eInt64Types_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eIntTypes.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eIntTypes.cs new file mode 100644 index 0000000..a2052e7 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eIntTypes.cs @@ -0,0 +1,6 @@ +namespace Decal.Interop.Core; + +public enum eIntTypes +{ + eIntTypes_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eSkill.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eSkill.cs new file mode 100644 index 0000000..cc24c51 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eSkill.cs @@ -0,0 +1,84 @@ +namespace Decal.Interop.Core; + +public enum eSkill +{ + eCurrentMeleeDefense = 6, + eCurrentMissileDefense = 7, + eCurrentArcaneLore = 14, + eCurrentMagicDefense = 15, + eCurrentManaConversion = 16, + eCurrentItemTinkering = 18, + eCurrentAssessPerson = 19, + eCurrentDeception = 20, + eCurrentHealing = 21, + eCurrentJump = 22, + eCurrentLockpick = 23, + eCurrentRun = 24, + eCurrentAssessCreature = 27, + eCurrentWeaponTinkering = 28, + eCurrentArmorTinkering = 29, + eCurrentMagicItemTinkering = 30, + eCurrentCreatureEnchantment = 31, + eCurrentItemEnchantment = 32, + eCurrentLifeMagic = 33, + eCurrentWarMagic = 34, + eCurrentLeadership = 35, + eCurrentLoyalty = 36, + eCurrentFletchingSkill = 37, + eCurrentAlchemySkill = 38, + eCurrentCookingSkill = 39, + eCurrentSkillSalvaging = 40, + eCurrentTwoHandedCombat = 41, + eCurrentGearcraft = 42, + eCurrentVoidMagic = 43, + eCurrentHeavyWeapons = 44, + eCurrentLightWeapons = 45, + eCurrentFinesseWeapons = 46, + eCurrentMissileWeapons = 47, + eCurrentShield = 48, + eCurrentDualWield = 49, + eCurrentRecklessness = 50, + eCurrentSneakAttack = 51, + eCurrentDirtyFighting = 52, + eCurrentSummoning = 54, + eBaseMeleeDefense = 56, + eBaseMissileDefense = 57, + eBaseArcaneLore = 64, + eBaseMagicDefense = 65, + eBaseManaConversion = 66, + eBaseItemTinkering = 68, + eBaseAssessPerson = 69, + eBaseDeception = 70, + eBaseHealing = 71, + eBaseJump = 72, + eBaseLockpick = 73, + eBaseRun = 74, + eBaseAssessCreature = 77, + eBaseWeaponTinkering = 78, + eBaseArmorTinkering = 79, + eBaseMagicItemTinkering = 80, + eBaseCreatureEnchantment = 81, + eBaseItemEnchantment = 82, + eBaseLifeMagic = 83, + eBaseWarMagic = 84, + eBaseLeadership = 85, + eBaseLoyalty = 86, + eBaseFletchingSkill = 87, + eBaseAlchemySkill = 88, + eBaseCookingSkill = 89, + eBaseSkillSalvaging = 90, + eBaseTwoHandedCombat = 91, + eBaseGearcraft = 92, + eBaseVoidMagic = 93, + eBaseHeavyWeapons = 94, + eBaseLightWeapons = 95, + eBaseFinesseWeapons = 96, + eBaseMissileWeapons = 97, + eBaseShield = 98, + eBaseDualWield = 99, + eBaseRecklessness = 100, + eBaseSneakAttack = 101, + eBaseDirtyFighting = 102, + eBaseSummoning = 104, + eSkill_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eTrainLevel.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eTrainLevel.cs new file mode 100644 index 0000000..f13bd2b --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eTrainLevel.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Core; + +public enum eTrainLevel +{ + eUntrained = 1, + eTrained = 2, + eSpecialized = 3, + eTrainLevel_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eUIElementType.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eUIElementType.cs new file mode 100644 index 0000000..a090a6a --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eUIElementType.cs @@ -0,0 +1,21 @@ +namespace Decal.Interop.Core; + +public enum eUIElementType +{ + Smartbox = 268436634, + Chat = 268436993, + FloatChat1 = 268436741, + FloatChat2 = 268436750, + FloatChat3 = 268436751, + FloatChat4 = 268436752, + Examination = 268436983, + Vitals = 268436986, + EnvPack = 268436989, + Panels = 268436991, + TBar = 268436995, + Indicators = 268437009, + ProgressBar = 268437011, + Combat = 268437173, + Radar = 268437202, + SideBySideVitals = 268437205 +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/eVital.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/eVital.cs new file mode 100644 index 0000000..d4c4e49 --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/eVital.cs @@ -0,0 +1,15 @@ +namespace Decal.Interop.Core; + +public enum eVital +{ + eMaximumHealth = 1, + eCurrentHealth = 2, + eMaximumStamina = 3, + eCurrentStamina = 4, + eMaximumMana = 5, + eCurrentMana = 6, + eBaseHealth = 7, + eBaseStamina = 8, + eBaseMana = 9, + eVital_DWORD = int.MaxValue +} diff --git a/Managed/Decal.Interop.Core/Decal.Interop.Core/tagRECT.cs b/Managed/Decal.Interop.Core/Decal.Interop.Core/tagRECT.cs new file mode 100644 index 0000000..c8c40be --- /dev/null +++ b/Managed/Decal.Interop.Core/Decal.Interop.Core/tagRECT.cs @@ -0,0 +1,15 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Core; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct tagRECT +{ + public int left; + + public int top; + + public int right; + + public int bottom; +} diff --git a/Managed/Decal.Interop.Core/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Core/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..34f877e --- /dev/null +++ b/Managed/Decal.Interop.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: ImportedFromTypeLib("Decal")] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: Guid("ff7f5f6d-34e0-4b6f-b3bb-8141de2ef732")] +[assembly: TypeLibVersion(2, 0)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService.csproj b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService.csproj new file mode 100644 index 0000000..08afdee --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService.csproj @@ -0,0 +1,5 @@ + + + Decal.Interop.D3DService + + diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObj.cs b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObj.cs new file mode 100644 index 0000000..10cf074 --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObj.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.D3DService; + +[ComImport] +[Guid("68753CB9-267F-482F-9F6B-A932A70E0057")] +[CoClass(typeof(CD3DObjClass))] +public interface CD3DObj : ID3DObj +{ +} diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObjClass.cs b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObjClass.cs new file mode 100644 index 0000000..89d27ca --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CD3DObjClass.cs @@ -0,0 +1,252 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.D3DService; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[SuppressUnmanagedCodeSecurity] +[Guid("81E79859-2783-4B9A-ADC4-308073F5BB3F")] +public class CD3DObjClass : ID3DObj, CD3DObj +{ + [DispId(8)] + public virtual extern float scaleX + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [param: In] + set; + } + + [DispId(9)] + public virtual extern float scaleY + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [param: In] + set; + } + + [DispId(10)] + public virtual extern float scaleZ + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [param: In] + set; + } + + [DispId(11)] + public virtual extern bool autoscale + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [param: In] + set; + } + + [DispId(12)] + public virtual extern int color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [param: In] + set; + } + + [DispId(13)] + public virtual extern int color2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + [param: In] + set; + } + + [DispId(14)] + public virtual extern float pFade + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [param: In] + set; + } + + [DispId(17)] + public virtual extern float pBounce + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [param: In] + set; + } + + [DispId(18)] + public virtual extern float hBounce + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + [param: In] + set; + } + + [DispId(19)] + public virtual extern float pOrbit + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + [param: In] + set; + } + + [DispId(20)] + public virtual extern float rOrbit + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + [param: In] + set; + } + + [DispId(25)] + public virtual extern float pSpin + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + [param: In] + set; + } + + [DispId(26)] + public virtual extern bool visible + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + [param: In] + set; + } + + [DispId(27)] + public virtual extern bool drawBackface + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + [param: In] + set; + } + + [DispId(30)] + public virtual extern float AnimationPhaseOffset + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void SetIcon([In] int icon); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + public virtual extern void SetIconFromResource([In] int hmodule, [In] int idr); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + public virtual extern void SetIconFromFile([In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + public virtual extern void SetShape([In] eShape shape); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + public virtual extern void SetShapeFromResource([In] int hmodule, [In] int idr); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + public virtual extern void SetShapeFromFile([In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + public virtual extern void Set2DText([In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + public virtual extern void Set3DText([In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + public virtual extern void SetScale([In] float scale); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + public virtual extern void AnchorToObject([In] int guid, [In] float fractHeight, [In] float dx, [In] float dy, [In] float dz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + public virtual extern void AnchorToCoords([In] float lat, [In] float lng, [In] float alt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + public virtual extern void OrientToCamera([In] bool fTilt = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + public virtual extern void OrientToPlayer([In] bool fTilt = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + public virtual extern void OrientToObject([In] int guid, [In] float fractHeight, [In] bool fTilt = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + public virtual extern void OrientToCoords([In] float lat, [In] float lng, [In] float alt, [In] bool fTilt = false); +} diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CService.cs b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CService.cs new file mode 100644 index 0000000..0940abd --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CService.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.D3DService; + +[ComImport] +[Guid("0BB41679-549E-4916-8B70-6A7B3CA1A31C")] +[CoClass(typeof(CServiceClass))] +public interface CService : ID3DService +{ +} diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CServiceClass.cs b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CServiceClass.cs new file mode 100644 index 0000000..8f14e25 --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/CServiceClass.cs @@ -0,0 +1,92 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.D3DService; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("F0CC07A0-2C89-4FA4-9356-714665BC2F8B")] +[TypeLibType(2)] +public class CServiceClass : ID3DService, CService +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj NewD3DObj(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj PointToObject([In] int guid, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj PointToCoords([In] float lat, [In] float lng, [In] float alt, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkObjectWithIcon([In] int guid, [In] int icon); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkObjectWithIconFromFile([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkObjectWithShape([In] int guid, [In] eShape shape, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkObjectWithShapeFromFile([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkObjectWith2DText([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkObjectWith3DText([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkCoordsWithIcon([In] float lat, [In] float lng, [In] float alt, [In] int icon); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkCoordsWithIconFromFile([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkCoordsWithShape([In] float lat, [In] float lng, [In] float alt, [In] eShape shape, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkCoordsWithShapeFromFile([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkCoordsWith2DText([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern CD3DObj MarkCoordsWith3DText([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + public virtual extern void TraceOneFrame(); +} diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DObj.cs b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DObj.cs new file mode 100644 index 0000000..6c3f6cb --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DObj.cs @@ -0,0 +1,252 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.D3DService; + +[ComImport] +[Guid("68753CB9-267F-482F-9F6B-A932A70E0057")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +public interface ID3DObj +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void SetIcon([In] int icon); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void SetIconFromResource([In] int hmodule, [In] int idr); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void SetIconFromFile([In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void SetShape([In] eShape shape); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + void SetShapeFromResource([In] int hmodule, [In] int idr); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void SetShapeFromFile([In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + void Set2DText([In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + void Set3DText([In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + void SetScale([In] float scale); + + [DispId(8)] + float scaleX + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [param: In] + set; + } + + [DispId(9)] + float scaleY + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [param: In] + set; + } + + [DispId(10)] + float scaleZ + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [param: In] + set; + } + + [DispId(11)] + bool autoscale + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [param: In] + set; + } + + [DispId(12)] + int color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [param: In] + set; + } + + [DispId(13)] + int color2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + [param: In] + set; + } + + [DispId(14)] + float pFade + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + void AnchorToObject([In] int guid, [In] float fractHeight, [In] float dx, [In] float dy, [In] float dz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + void AnchorToCoords([In] float lat, [In] float lng, [In] float alt); + + [DispId(17)] + float pBounce + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [param: In] + set; + } + + [DispId(18)] + float hBounce + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + [param: In] + set; + } + + [DispId(19)] + float pOrbit + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + [param: In] + set; + } + + [DispId(20)] + float rOrbit + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + void OrientToCamera([In] bool fTilt = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + void OrientToPlayer([In] bool fTilt = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + void OrientToObject([In] int guid, [In] float fractHeight, [In] bool fTilt = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + void OrientToCoords([In] float lat, [In] float lng, [In] float alt, [In] bool fTilt = false); + + [DispId(25)] + float pSpin + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + [param: In] + set; + } + + [DispId(26)] + bool visible + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + [param: In] + set; + } + + [DispId(27)] + bool drawBackface + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + [param: In] + set; + } + + [DispId(30)] + float AnimationPhaseOffset + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DService.cs b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DService.cs new file mode 100644 index 0000000..a0c3fe4 --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/ID3DService.cs @@ -0,0 +1,91 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.D3DService; + +[ComImport] +[Guid("0BB41679-549E-4916-8B70-6A7B3CA1A31C")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +public interface ID3DService +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj NewD3DObj(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj PointToObject([In] int guid, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj PointToCoords([In] float lat, [In] float lng, [In] float alt, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkObjectWithIcon([In] int guid, [In] int icon); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkObjectWithIconFromFile([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkObjectWithShape([In] int guid, [In] eShape shape, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkObjectWithShapeFromFile([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkObjectWith2DText([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkObjectWith3DText([In] int guid, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkCoordsWithIcon([In] float lat, [In] float lng, [In] float alt, [In] int icon); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkCoordsWithIconFromFile([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkCoordsWithShape([In] float lat, [In] float lng, [In] float alt, [In] eShape shape, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkCoordsWithShapeFromFile([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string bstrFilename, [In] int color); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkCoordsWith2DText([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + [return: MarshalAs(UnmanagedType.Interface)] + CD3DObj MarkCoordsWith3DText([In] float lat, [In] float lng, [In] float alt, [In][MarshalAs(UnmanagedType.BStr)] string szText, [In][MarshalAs(UnmanagedType.BStr)] string szFont, [In] int options = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + void TraceOneFrame(); +} diff --git a/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/eShape.cs b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/eShape.cs new file mode 100644 index 0000000..312beb8 --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Decal.Interop.D3DService/eShape.cs @@ -0,0 +1,12 @@ +namespace Decal.Interop.D3DService; + +public enum eShape +{ + eHArrow, + eVArrow, + eRing, + eCylinder, + eSphere, + eCube, + eTiltedCube +} diff --git a/Managed/Decal.Interop.D3DService/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.D3DService/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d2d61ab --- /dev/null +++ b/Managed/Decal.Interop.D3DService/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: Guid("8f6ef6ad-e982-40a4-b6cc-79e80b77313b")] +[assembly: PrimaryInteropAssembly(1, 0)] +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: ImportedFromTypeLib("D3DService")] +[assembly: TypeLibVersion(1, 0)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS.csproj b/Managed/Decal.Interop.DHS/Decal.Interop.DHS.csproj new file mode 100644 index 0000000..b11aa66 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS.csproj @@ -0,0 +1,5 @@ + + + Decal.Interop.DHS + + diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/Hotkey.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/Hotkey.cs new file mode 100644 index 0000000..0c88d6e --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/Hotkey.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.DHS; + +[ComImport] +[Guid("81B629ED-6204-4411-80E3-95CD65E40621")] +[CoClass(typeof(HotkeyClass))] +public interface Hotkey : IHotkey +{ +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeyClass.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeyClass.cs new file mode 100644 index 0000000..ed7bd8c --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeyClass.cs @@ -0,0 +1,89 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.DHS; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(2)] +[Guid("F5AA853D-CCF3-4562-A654-3A68AB583BCC")] +public class HotkeyClass : IHotkey, Hotkey +{ + [DispId(1)] + public virtual extern string EventTitle + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(2)] + public virtual extern string EventDescription + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + public virtual extern bool AltState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + set; + } + + [DispId(4)] + public virtual extern bool ControlState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [param: In] + set; + } + + [DispId(5)] + public virtual extern bool ShiftState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } + + [DispId(6)] + public virtual extern int VirtualKey + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystem.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystem.cs new file mode 100644 index 0000000..7902a0b --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystem.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.DHS; + +[ComImport] +[CoClass(typeof(HotkeySystemClass))] +[Guid("85C12F39-FD37-4E70-982A-3973FA6D376B")] +public interface HotkeySystem : IHotkeySystem, _IHotkeySystemEvents_Event +{ +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystemClass.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystemClass.cs new file mode 100644 index 0000000..a64ac8f --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/HotkeySystemClass.cs @@ -0,0 +1,37 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.DHS; + +[ComImport] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("6B6B9FA8-37DE-4FA3-8C60-52BD6A2F9855")] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.DHS._IHotkeySystemEvents\0\0")] +public class HotkeySystemClass : IHotkeySystem, HotkeySystem, _IHotkeySystemEvents_Event +{ + public virtual extern event _IHotkeySystemEvents_HotkeyEventEventHandler HotkeyEvent; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void AddHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPlugin, [In][MarshalAs(UnmanagedType.Interface)] Hotkey pHotkey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + public virtual extern bool QueryHotkey([In][MarshalAs(UnmanagedType.BStr)] string bstrTitle); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + public virtual extern void Connect([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + public virtual extern void DeleteHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szHotkeyName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern Hotkey QueryHotkeyEx([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szTitle); +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IDHSHotkeyEvents.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IDHSHotkeyEvents.cs new file mode 100644 index 0000000..9586ea9 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IDHSHotkeyEvents.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.DHS; + +[ComImport] +[Guid("2D51CD98-7DE3-4BBA-A482-5409A18192DB")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IDHSHotkeyEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool OnHotkey([In][MarshalAs(UnmanagedType.BStr)] string szEvent); +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkey.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkey.cs new file mode 100644 index 0000000..f81a238 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkey.cs @@ -0,0 +1,88 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.DHS; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("81B629ED-6204-4411-80E3-95CD65E40621")] +[TypeLibType(4160)] +public interface IHotkey +{ + [DispId(1)] + string EventTitle + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(2)] + string EventDescription + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + bool AltState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + set; + } + + [DispId(4)] + bool ControlState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [param: In] + set; + } + + [DispId(5)] + bool ShiftState + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } + + [DispId(6)] + int VirtualKey + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkeySystem.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkeySystem.cs new file mode 100644 index 0000000..04dcc74 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/IHotkeySystem.cs @@ -0,0 +1,33 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.DHS; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("85C12F39-FD37-4E70-982A-3973FA6D376B")] +[TypeLibType(4160)] +public interface IHotkeySystem +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void AddHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPlugin, [In][MarshalAs(UnmanagedType.Interface)] Hotkey pHotkey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + bool QueryHotkey([In][MarshalAs(UnmanagedType.BStr)] string bstrTitle); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void Connect([In][MarshalAs(UnmanagedType.IUnknown)] object pPlugin); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void DeleteHotkey([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szHotkeyName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.Interface)] + Hotkey QueryHotkeyEx([In][MarshalAs(UnmanagedType.BStr)] string szPluginCookie, [In][MarshalAs(UnmanagedType.BStr)] string szTitle); +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents.cs new file mode 100644 index 0000000..61dcff2 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents.cs @@ -0,0 +1,17 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.DHS; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("B51801E0-74AF-4916-AB0F-E06B09567C3C")] +[TypeLibType(4096)] +[InterfaceType(2)] +public interface _IHotkeySystemEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void HotkeyEvent([In][MarshalAs(UnmanagedType.BStr)] string szEvent, [In][Out] ref bool pbEat); +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_Event.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_Event.cs new file mode 100644 index 0000000..c771239 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_Event.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.DHS; + +[TypeLibType(16)] +[ComVisible(false)] +public interface _IHotkeySystemEvents_Event +{ + event _IHotkeySystemEvents_HotkeyEventEventHandler HotkeyEvent; +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_EventProvider.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_EventProvider.cs new file mode 100644 index 0000000..fce0015 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.DHS; + +internal sealed class _IHotkeySystemEvents_EventProvider : _IHotkeySystemEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 224, 1, 24, 181, 175, 116, 22, 73, 171, 15, + 224, 107, 9, 86, 124, 60 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event _IHotkeySystemEvents_HotkeyEventEventHandler _IHotkeySystemEvents_Event.HotkeyEvent + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + _IHotkeySystemEvents_SinkHelper iHotkeySystemEvents_SinkHelper = new _IHotkeySystemEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iHotkeySystemEvents_SinkHelper, out pdwCookie); + iHotkeySystemEvents_SinkHelper.m_dwCookie = pdwCookie; + iHotkeySystemEvents_SinkHelper.m_HotkeyEventDelegate = value; + m_aEventSinkHelpers.Add(iHotkeySystemEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + _IHotkeySystemEvents_SinkHelper iHotkeySystemEvents_SinkHelper = (_IHotkeySystemEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iHotkeySystemEvents_SinkHelper.m_HotkeyEventDelegate != null && ((iHotkeySystemEvents_SinkHelper.m_HotkeyEventDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iHotkeySystemEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public _IHotkeySystemEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + _IHotkeySystemEvents_SinkHelper iHotkeySystemEvents_SinkHelper = (_IHotkeySystemEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(iHotkeySystemEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_HotkeyEventEventHandler.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_HotkeyEventEventHandler.cs new file mode 100644 index 0000000..7565b78 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_HotkeyEventEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.DHS; + +[ComVisible(false)] +public delegate void _IHotkeySystemEvents_HotkeyEventEventHandler([In][MarshalAs(UnmanagedType.BStr)] string szEvent, [In][Out] ref bool pbEat); diff --git a/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_SinkHelper.cs b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_SinkHelper.cs new file mode 100644 index 0000000..92cbc52 --- /dev/null +++ b/Managed/Decal.Interop.DHS/Decal.Interop.DHS/_IHotkeySystemEvents_SinkHelper.cs @@ -0,0 +1,28 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.DHS; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class _IHotkeySystemEvents_SinkHelper : _IHotkeySystemEvents +{ + public _IHotkeySystemEvents_HotkeyEventEventHandler m_HotkeyEventDelegate; + + public int m_dwCookie; + + public void HotkeyEvent(string P_0, ref bool P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_HotkeyEventDelegate != null) + { + m_HotkeyEventDelegate(P_0, ref P_1); + } + } + + internal _IHotkeySystemEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_HotkeyEventDelegate = null; + } +} diff --git a/Managed/Decal.Interop.DHS/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.DHS/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..02ffe4e --- /dev/null +++ b/Managed/Decal.Interop.DHS/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: ImportedFromTypeLib("DHS")] +[assembly: TypeLibVersion(1, 0)] +[assembly: PrimaryInteropAssembly(1, 0)] +[assembly: Guid("7be9a39f-dc34-4c38-bbc0-7ba572c1ef7a")] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat.csproj b/Managed/Decal.Interop.Dat/Decal.Interop.Dat.csproj new file mode 100644 index 0000000..ae2de50 --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat.csproj @@ -0,0 +1,5 @@ + + + Decal.Interop.Dat + + diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibrary.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibrary.cs new file mode 100644 index 0000000..3bd701e --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibrary.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Dat; + +[ComImport] +[Guid("4EC04AB5-F87A-465D-B282-1B6C2E6068C9")] +[CoClass(typeof(DatLibraryClass))] +public interface DatLibrary : IDatLibrary +{ +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibraryClass.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibraryClass.cs new file mode 100644 index 0000000..f03584b --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatLibraryClass.cs @@ -0,0 +1,26 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Dat; + +[ComImport] +[Guid("6FA05FDA-B4B5-4386-AB45-92D7E6A5D698")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class DatLibraryClass : IDatLibrary, DatLibrary +{ + [DispId(1)] + public virtual extern object Stream + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object Open([MarshalAs(UnmanagedType.BStr)] string Protocol, uint File); +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatService.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatService.cs new file mode 100644 index 0000000..31c8003 --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatService.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Dat; + +[ComImport] +[CoClass(typeof(DatServiceClass))] +[Guid("D501DE12-DD81-4CE1-8854-78CBCB96C2DB")] +public interface DatService : IDatService +{ +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatServiceClass.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatServiceClass.cs new file mode 100644 index 0000000..64bf72a --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatServiceClass.cs @@ -0,0 +1,13 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Dat; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("37B083F0-276E-43AD-8D26-3F7449B519DC")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +public class DatServiceClass : IDatService, DatService +{ +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStream.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStream.cs new file mode 100644 index 0000000..2ecefdb --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStream.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Dat; + +[ComImport] +[Guid("B27D3F72-2640-432F-BAE4-175E1AA0CA39")] +[CoClass(typeof(DatStreamClass))] +public interface DatStream : IDatStream +{ +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStreamClass.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStreamClass.cs new file mode 100644 index 0000000..d9c3786 --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/DatStreamClass.cs @@ -0,0 +1,39 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Dat; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("9F7F6CD9-D164-418D-8CB5-3B9ACD70BEAF")] +public class DatStreamClass : IDatStream, DatStream +{ + [DispId(1610678272)] + public virtual extern int Size + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678273)] + public virtual extern int Tell + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Skip(int Bytes); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Restart(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void ReadBinary(int Bytes, ref byte Buffer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + public virtual extern string Read(int Bytes); +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatLibrary.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatLibrary.cs new file mode 100644 index 0000000..e1fb535 --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatLibrary.cs @@ -0,0 +1,26 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Dat; + +[ComImport] +[Guid("4EC04AB5-F87A-465D-B282-1B6C2E6068C9")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IDatLibrary +{ + [DispId(1)] + object Stream + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object Open([MarshalAs(UnmanagedType.BStr)] string Protocol, uint File); +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatService.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatService.cs new file mode 100644 index 0000000..140f87f --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatService.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Dat; + +[ComImport] +[Guid("D501DE12-DD81-4CE1-8854-78CBCB96C2DB")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IDatService +{ +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatStream.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatStream.cs new file mode 100644 index 0000000..dfd6fc9 --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IDatStream.cs @@ -0,0 +1,39 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Dat; + +[ComImport] +[Guid("B27D3F72-2640-432F-BAE4-175E1AA0CA39")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IDatStream +{ + [DispId(1610678272)] + int Size + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678273)] + int Tell + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Skip(int Bytes); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Restart(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ReadBinary(int Bytes, ref byte Buffer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + string Read(int Bytes); +} diff --git a/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IFileFilter.cs b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IFileFilter.cs new file mode 100644 index 0000000..5bbf8b3 --- /dev/null +++ b/Managed/Decal.Interop.Dat/Decal.Interop.Dat/IFileFilter.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Dat; + +[ComImport] +[Guid("1349EF1A-06EA-43E5-9026-4F3967C6C1D3")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IFileFilter +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Initialize([MarshalAs(UnmanagedType.Interface)] DatStream Stream); +} diff --git a/Managed/Decal.Interop.Dat/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Dat/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..50cd5c2 --- /dev/null +++ b/Managed/Decal.Interop.Dat/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: ImportedFromTypeLib("DecalDat")] +[assembly: Guid("c2c11ec7-2cb9-4999-bdd9-af599455601f")] +[assembly: TypeLibVersion(2, 0)] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters.csproj b/Managed/Decal.Interop.Filters/Decal.Interop.Filters.csproj new file mode 100644 index 0000000..3caf8e8 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters.csproj @@ -0,0 +1,8 @@ + + + Decal.Interop.Filters + + + + + diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfo.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfo.cs new file mode 100644 index 0000000..576886b --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfo.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[CoClass(typeof(AllegianceInfoClass))] +[Guid("C8A16199-B649-41F3-BFCA-A1BD6E2E1F2C")] +public interface AllegianceInfo : IAllegianceInfo +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfoClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfoClass.cs new file mode 100644 index 0000000..06876c8 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AllegianceInfoClass.cs @@ -0,0 +1,109 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("B2EB5B5A-5E3F-4F60-8BC0-BB729FFC04F6")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class AllegianceInfoClass : IAllegianceInfo, AllegianceInfo +{ + [DispId(1)] + public virtual extern string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(2)] + public virtual extern int GUID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int TreeParent + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + public virtual extern int XP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + public virtual extern int Loyalty + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + public virtual extern int Leadership + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + public virtual extern int Gender + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } + + [DispId(9)] + public virtual extern int Race + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + } + + [DispId(10)] + public virtual extern int Rank + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + } + + [DispId(11)] + public virtual extern double Unknown + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } + + [DispId(12)] + public virtual extern long XP_64 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfo.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfo.cs new file mode 100644 index 0000000..7fd0ecf --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfo.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[CoClass(typeof(AttributeInfoClass))] +[Guid("B6496852-E977-4DA2-884D-09AFEA3D7582")] +public interface AttributeInfo : IAttributeInfo +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfoClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfoClass.cs new file mode 100644 index 0000000..cf5873c --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/AttributeInfoClass.cs @@ -0,0 +1,53 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[SuppressUnmanagedCodeSecurity] +[Guid("AF42E9D7-E3F3-416B-AF32-A411F3F6EE72")] +public class AttributeInfoClass : IAttributeInfo, AttributeInfo +{ + [DispId(1)] + public virtual extern string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(2)] + public virtual extern int Creation + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int Exp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern int Buffed + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + public virtual extern int Base + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/BoolValueKey.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/BoolValueKey.cs new file mode 100644 index 0000000..cbf75e6 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/BoolValueKey.cs @@ -0,0 +1,16 @@ +namespace Decal.Interop.Filters; + +public enum BoolValueKey +{ + keyLockable = 201326592, + keyInscribable = 201326593, + keyOpen = 2, + keyLocked = 3, + keyHookVisibility = 24, + keyUnlimitedUses = 63, + keyCanBeSold = 69, + keyRetained = 91, + keyIvoryable = 99, + keyDyeable = 100, + keyAwayFromKeyboard = 110 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStats.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStats.cs new file mode 100644 index 0000000..51ba22c --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStats.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("0CE57594-4E30-4446-956D-CE460C7355AF")] +[CoClass(typeof(CharacterStatsClass))] +public interface CharacterStats : ICharacterStats, ICharacterStatsEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStatsClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStatsClass.cs new file mode 100644 index 0000000..a967f58 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/CharacterStatsClass.cs @@ -0,0 +1,531 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ComSourceInterfaces("Decal.Interop.Filters.ICharacterStatsEvents\0\0")] +[ClassInterface(ClassInterfaceType.None)] +[Guid("4540C969-08D1-46BF-97AD-6B19D3C10BEE")] +[TypeLibType(2)] +public class CharacterStatsClass : ICharacterStats, CharacterStats, ICharacterStatsEvents_Event +{ + [DispId(1)] + public virtual extern int Character + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + } + + [DispId(2)] + public virtual extern int Level + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int Rank + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern int TotalExp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + public virtual extern int UnassignedExp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + public virtual extern int SkillPoints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + public virtual extern string Server + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(8)] + public virtual extern string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(9)] + public virtual extern string Race + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(10)] + public virtual extern string Gender + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(11)] + public virtual extern string ClassTemplate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(12)] + public virtual extern int AttributeCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } + + [DispId(13)] + public virtual extern int SkillCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + } + + [DispId(14)] + public virtual extern int VitalCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + } + + [DispId(15)] + public virtual extern AttributeInfo Attribute + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(16)] + public virtual extern SkillInfo Skill + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(17)] + public virtual extern SkillInfo Vital + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(18)] + public virtual extern int SpellLearned + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + get; + } + + [DispId(19)] + public virtual extern int TotalSpells + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + get; + } + + [DispId(20)] + public virtual extern int Health + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + get; + } + + [DispId(21)] + public virtual extern int Stamina + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + get; + } + + [DispId(22)] + public virtual extern int Mana + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + get; + } + + [DispId(23)] + public virtual extern int Birth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + get; + } + + [DispId(24)] + public virtual extern int Age + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + get; + } + + [DispId(25)] + public virtual extern int Deaths + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + get; + } + + [DispId(26)] + public virtual extern int VassalCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + get; + } + + [DispId(27)] + public virtual extern AllegianceInfo Monarch + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(28)] + public virtual extern AllegianceInfo Patron + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(29)] + public virtual extern AllegianceInfo MyAllegiance + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(30)] + public virtual extern AllegianceInfo Vassal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(31)] + public virtual extern int Followers + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(31)] + get; + } + + [DispId(32)] + public virtual extern int MonarchFollowers + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(32)] + get; + } + + [DispId(33)] + public virtual extern int EnchantmentCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(33)] + get; + } + + [DispId(34)] + public virtual extern Enchantment Enchantment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(34)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(35)] + public virtual extern int EffectiveAttribute + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(35)] + get; + } + + [DispId(36)] + public virtual extern int EffectiveSkill + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(36)] + get; + } + + [DispId(37)] + public virtual extern int EffectiveVital + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(37)] + get; + } + + [DispId(38)] + public virtual extern int Vitae + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(38)] + get; + } + + [DispId(39)] + public virtual extern int BurdenUnits + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(39)] + get; + } + + [DispId(40)] + public virtual extern int Burden + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(40)] + get; + } + + [DispId(41)] + public virtual extern long TotalXP_64 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(41)] + get; + } + + [DispId(42)] + public virtual extern long UnassignedXP_64 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(42)] + get; + } + + [DispId(43)] + public virtual extern int LoginStatus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(43)] + get; + } + + [DispId(44)] + public virtual extern int ServerPopulation + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(44)] + get; + } + + [DispId(45)] + public virtual extern string AccountName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(45)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(46)] + public virtual extern int AccountCharCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(46)] + get; + } + + [DispId(47)] + public virtual extern int AccountCharID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(47)] + get; + } + + [DispId(48)] + public virtual extern string AccountCharName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(48)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(49)] + public virtual extern int Quickslots + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(49)] + get; + } + + [DispId(50)] + public virtual extern int CharacterOptions + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(50)] + get; + } + + [DispId(51)] + public virtual extern uint XPToNextLevel + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(51)] + get; + } + + [DispId(57)] + public virtual extern int[] SpellbookArray + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(57)] + [TypeLibFunc(64)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] + get; + } + + [DispId(58)] + public virtual extern int[] AugmentationArray + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(58)] + [TypeLibFunc(64)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] + get; + } + + [DispId(60)] + public virtual extern int CharacterOptionFlags + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(60)] + get; + } + + public virtual extern event ICharacterStatsEvents_LoginEventHandler Login; + + public virtual extern event ICharacterStatsEvents_Spellbook_AddEventHandler Spellbook_Add; + + public virtual extern event ICharacterStatsEvents_Spellbook_DeleteEventHandler Spellbook_Delete; + + public virtual extern event ICharacterStatsEvents_LoginCompleteEventHandler LoginComplete; + + public virtual extern event ICharacterStatsEvents_ActionCompleteEventHandler ActionComplete; + + public virtual extern event ICharacterStatsEvents_StatusMessageEventHandler StatusMessage; + + public virtual extern event ICharacterStatsEvents_DeathEventHandler Death; + + public virtual extern event ICharacterStatsEvents_ChangePortalModeEventHandler ChangePortalMode; + + public virtual extern event ICharacterStatsEvents_ChangeEnchantmentsEventHandler ChangeEnchantments; + + public virtual extern event ICharacterStatsEvents_ChangePlayerEventHandler ChangePlayer; + + public virtual extern event ICharacterStatsEvents_ChangeVitalEventHandler ChangeVital; + + public virtual extern event ICharacterStatsEvents_ChangeXPSEventHandler ChangeXPS; + + public virtual extern event ICharacterStatsEvents_ChangeFellowshipEventHandler ChangeFellowship; + + public virtual extern event ICharacterStatsEvents_LogoffEventHandler Logoff; + + public virtual extern event ICharacterStatsEvents_CastSpellEventHandler CastSpell; + + public virtual extern event ICharacterStatsEvents_ChangeShortcutEventHandler ChangeShortcut; + + public virtual extern event ICharacterStatsEvents_ChangeSpellbarEventHandler ChangeSpellbar; + + public virtual extern event ICharacterStatsEvents_ChangeSettingsEventHandler ChangeSettings; + + public virtual extern event ICharacterStatsEvents_ChangeSettingFlagsEventHandler ChangeSettingFlags; + + public virtual extern event ICharacterStatsEvents_ChangeOptionEventHandler ChangeOption; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(52)] + public virtual extern bool AugmentationExists([In] eAugmentations key, out int pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(53)] + public virtual extern int SpellBarCount([In] int barNumber); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(54)] + public virtual extern int SpellBar([In] int barNumber, [In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(55)] + public virtual extern int AugmentationCount(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(56)] + public virtual extern int Augmentation([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(59)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] + public virtual extern int[] SpellBarArray([In] int barNumber); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/DoubleValueKey.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/DoubleValueKey.cs new file mode 100644 index 0000000..c3c20cf --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/DoubleValueKey.cs @@ -0,0 +1,29 @@ +namespace Decal.Interop.Filters; + +public enum DoubleValueKey +{ + keySlashProt = 167772160, + keyPierceProt = 167772161, + keyBludgeonProt = 167772162, + keyAcidProt = 167772163, + keyLightningProt = 167772164, + keyFireProt = 167772165, + keyColdProt = 167772166, + keyHeading = 167772167, + keyApproachDistance = 167772168, + keySalvageWorkmanship = 167772169, + keyScale = 167772170, + keyVariance = 167772171, + keyAttackBonus = 167772172, + keyRange = 167772173, + keyDamageBonus = 167772174, + keyManaRateOfChange = 5, + keyMeleeDefenseBonus = 29, + keyManaTransferEfficiency = 87, + keyHealingKitRestoreBonus = 100, + keyManaStoneChanceDestruct = 137, + keyManaCBonus = 144, + keyMissileDBonus = 149, + keyMagicDBonus = 150, + keyElemDmgVsMonsters = 152 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter.cs new file mode 100644 index 0000000..b36da57 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("7B7FEF07-DAE2-46F3-AC71-7E47F8EF3A44")] +[CoClass(typeof(EchoFilterClass))] +public interface EchoFilter : IEcho, IEchoSink_Event +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2.cs new file mode 100644 index 0000000..66f9424 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("002C8BAE-917E-4978-B223-B45B3E8B15E6")] +[CoClass(typeof(EchoFilter2Class))] +public interface EchoFilter2 : IEcho2, IEchoSink2_Event +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2Class.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2Class.cs new file mode 100644 index 0000000..27bd5d7 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilter2Class.cs @@ -0,0 +1,17 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.Filters.IEchoSink2\0\0")] +[Guid("34239EAD-6317-4C40-A405-193BA5232DD8")] +[TypeLibType(2)] +public class EchoFilter2Class : IEcho2, EchoFilter2, IEchoSink2_Event +{ + public virtual extern event IEchoSink2_EchoServerEventHandler EchoServer; + + public virtual extern event IEchoSink2_EchoClientEventHandler EchoClient; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilterClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilterClass.cs new file mode 100644 index 0000000..af11998 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EchoFilterClass.cs @@ -0,0 +1,15 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("8C2FA400-315D-41DE-B063-D6EF04F12E1F")] +[ComSourceInterfaces("Decal.Interop.Filters.IEchoSink\0\0")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +public class EchoFilterClass : IEcho, EchoFilter, IEchoSink_Event +{ + public virtual extern event IEchoSink_EchoMessageEventHandler EchoMessage; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Enchantment.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Enchantment.cs new file mode 100644 index 0000000..f941442 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Enchantment.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[CoClass(typeof(EnchantmentClass))] +[Guid("B83155F4-E298-4004-80C6-AA592F677430")] +public interface Enchantment : IEnchantment +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EnchantmentClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EnchantmentClass.cs new file mode 100644 index 0000000..55ba55f --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/EnchantmentClass.cs @@ -0,0 +1,76 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[SuppressUnmanagedCodeSecurity] +[Guid("5DCF056E-B7F5-4AEB-93A0-628617B28488")] +public class EnchantmentClass : IEnchantment, Enchantment +{ + [DispId(1)] + public virtual extern int SpellID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + } + + [DispId(2)] + public virtual extern int Layer + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int TimeRemaining + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern int Affected + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + public virtual extern int AffectedMask + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + public virtual extern int Family + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + public virtual extern double Adjustment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + public virtual extern double Duration + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAllegianceInfo.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAllegianceInfo.cs new file mode 100644 index 0000000..470b213 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAllegianceInfo.cs @@ -0,0 +1,109 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("C8A16199-B649-41F3-BFCA-A1BD6E2E1F2C")] +public interface IAllegianceInfo +{ + [DispId(1)] + string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(2)] + int GUID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + int TreeParent + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + int XP + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + int Loyalty + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + int Leadership + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + int Gender + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } + + [DispId(9)] + int Race + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + } + + [DispId(10)] + int Rank + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + } + + [DispId(11)] + double Unknown + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } + + [DispId(12)] + long XP_64 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAttributeInfo.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAttributeInfo.cs new file mode 100644 index 0000000..294587a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IAttributeInfo.cs @@ -0,0 +1,53 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("B6496852-E977-4DA2-884D-09AFEA3D7582")] +public interface IAttributeInfo +{ + [DispId(1)] + string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(2)] + int Creation + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + int Exp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + int Buffed + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + int Base + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStats.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStats.cs new file mode 100644 index 0000000..63460f6 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStats.cs @@ -0,0 +1,489 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("0CE57594-4E30-4446-956D-CE460C7355AF")] +public interface ICharacterStats +{ + [DispId(1)] + int Character + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + } + + [DispId(2)] + int Level + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + int Rank + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + int TotalExp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + int UnassignedExp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + int SkillPoints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + string Server + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(8)] + string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(9)] + string Race + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(10)] + string Gender + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(11)] + string ClassTemplate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(12)] + int AttributeCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } + + [DispId(13)] + int SkillCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + } + + [DispId(14)] + int VitalCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + } + + [DispId(15)] + AttributeInfo Attribute + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(16)] + SkillInfo Skill + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(17)] + SkillInfo Vital + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(18)] + int SpellLearned + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + get; + } + + [DispId(19)] + int TotalSpells + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + get; + } + + [DispId(20)] + int Health + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + get; + } + + [DispId(21)] + int Stamina + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + get; + } + + [DispId(22)] + int Mana + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + get; + } + + [DispId(23)] + int Birth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + get; + } + + [DispId(24)] + int Age + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + get; + } + + [DispId(25)] + int Deaths + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + get; + } + + [DispId(26)] + int VassalCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + get; + } + + [DispId(27)] + AllegianceInfo Monarch + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(28)] + AllegianceInfo Patron + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(29)] + AllegianceInfo MyAllegiance + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(30)] + AllegianceInfo Vassal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(31)] + int Followers + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(31)] + get; + } + + [DispId(32)] + int MonarchFollowers + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(32)] + get; + } + + [DispId(33)] + int EnchantmentCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(33)] + get; + } + + [DispId(34)] + Enchantment Enchantment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(34)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(35)] + int EffectiveAttribute + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(35)] + get; + } + + [DispId(36)] + int EffectiveSkill + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(36)] + get; + } + + [DispId(37)] + int EffectiveVital + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(37)] + get; + } + + [DispId(38)] + int Vitae + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(38)] + get; + } + + [DispId(39)] + int BurdenUnits + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(39)] + get; + } + + [DispId(40)] + int Burden + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(40)] + get; + } + + [DispId(41)] + long TotalXP_64 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(41)] + get; + } + + [DispId(42)] + long UnassignedXP_64 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(42)] + get; + } + + [DispId(43)] + int LoginStatus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(43)] + get; + } + + [DispId(44)] + int ServerPopulation + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(44)] + get; + } + + [DispId(45)] + string AccountName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(45)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(46)] + int AccountCharCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(46)] + get; + } + + [DispId(47)] + int AccountCharID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(47)] + get; + } + + [DispId(48)] + string AccountCharName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(48)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(49)] + int Quickslots + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(49)] + get; + } + + [DispId(50)] + int CharacterOptions + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(50)] + get; + } + + [DispId(51)] + uint XPToNextLevel + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(51)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(52)] + bool AugmentationExists([In] eAugmentations key, out int pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(53)] + int SpellBarCount([In] int barNumber); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(54)] + int SpellBar([In] int barNumber, [In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(55)] + int AugmentationCount(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(56)] + int Augmentation([In] int index); + + [DispId(57)] + int[] SpellbookArray + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(57)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] + get; + } + + [DispId(58)] + int[] AugmentationArray + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(58)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(59)] + [TypeLibFunc(64)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] + int[] SpellBarArray([In] int barNumber); + + [DispId(60)] + int CharacterOptionFlags + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(60)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents.cs new file mode 100644 index 0000000..f521628 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents.cs @@ -0,0 +1,93 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(4096)] +[InterfaceType(2)] +[Guid("0B60F187-13CD-4E35-B8A2-FE128F05CA6B")] +[SuppressUnmanagedCodeSecurity] +public interface ICharacterStatsEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Login(int Character); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void Spellbook_Add(int SpellAdded); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void Spellbook_Delete(int SpellDeleted); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void LoginComplete(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + void ActionComplete(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void StatusMessage(int lType, [MarshalAs(UnmanagedType.BStr)] string bstrText); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + void Death([MarshalAs(UnmanagedType.BStr)] string bstrText); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + void ChangePortalMode(PlayerPortalType Change); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + void ChangeEnchantments(PlayerAddRemoveType Change, [MarshalAs(UnmanagedType.Interface)] Enchantment Enchantment); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + void ChangePlayer(PlayerModifyType Change, int StatID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + void ChangeVital(PlayerVitalType Change, int Amount); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + void ChangeXPS(PlayerXPType Change, int Amount); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + void ChangeFellowship(PlayerFellowshipType Change, int Character); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + void Logoff(PlayerLogoffType Type); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + void CastSpell(PlayerCastType Type, int SpellID, int TargetID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + void ChangeShortcut(PlayerAddRemoveType Change, int Slot, int ObjectID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + void ChangeSpellbar(PlayerAddRemoveType Change, int Tab, int Slot, int SpellID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + void ChangeSettings(int Settings); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + void ChangeSettingFlags(int Settings); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + void ChangeOption(int key, int value); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ActionCompleteEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ActionCompleteEventHandler.cs new file mode 100644 index 0000000..9f0493c --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ActionCompleteEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ActionCompleteEventHandler(); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_CastSpellEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_CastSpellEventHandler.cs new file mode 100644 index 0000000..86c9b1a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_CastSpellEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_CastSpellEventHandler(PlayerCastType Type, int SpellID, int TargetID); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeEnchantmentsEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeEnchantmentsEventHandler.cs new file mode 100644 index 0000000..64394ed --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeEnchantmentsEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeEnchantmentsEventHandler(PlayerAddRemoveType Change, [MarshalAs(UnmanagedType.Interface)] Enchantment Enchantment); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeFellowshipEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeFellowshipEventHandler.cs new file mode 100644 index 0000000..9328d05 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeFellowshipEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeFellowshipEventHandler(PlayerFellowshipType Change, int Character); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeOptionEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeOptionEventHandler.cs new file mode 100644 index 0000000..1a03821 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeOptionEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeOptionEventHandler(int key, int value); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePlayerEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePlayerEventHandler.cs new file mode 100644 index 0000000..79150e0 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePlayerEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangePlayerEventHandler(PlayerModifyType Change, int StatID); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePortalModeEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePortalModeEventHandler.cs new file mode 100644 index 0000000..6302f6e --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangePortalModeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangePortalModeEventHandler(PlayerPortalType Change); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingFlagsEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingFlagsEventHandler.cs new file mode 100644 index 0000000..7c4cc63 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingFlagsEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeSettingFlagsEventHandler(int Settings); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingsEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingsEventHandler.cs new file mode 100644 index 0000000..63c6ce4 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSettingsEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeSettingsEventHandler(int Settings); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeShortcutEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeShortcutEventHandler.cs new file mode 100644 index 0000000..1d75bca --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeShortcutEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeShortcutEventHandler(PlayerAddRemoveType Change, int Slot, int ObjectID); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSpellbarEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSpellbarEventHandler.cs new file mode 100644 index 0000000..6a31a90 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeSpellbarEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeSpellbarEventHandler(PlayerAddRemoveType Change, int Tab, int Slot, int SpellID); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeVitalEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeVitalEventHandler.cs new file mode 100644 index 0000000..971666a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeVitalEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeVitalEventHandler(PlayerVitalType Change, int Amount); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeXPSEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeXPSEventHandler.cs new file mode 100644 index 0000000..8f5ef6a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_ChangeXPSEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_ChangeXPSEventHandler(PlayerXPType Change, int Amount); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_DeathEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_DeathEventHandler.cs new file mode 100644 index 0000000..618477f --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_DeathEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_DeathEventHandler([MarshalAs(UnmanagedType.BStr)] string bstrText); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Event.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Event.cs new file mode 100644 index 0000000..ad87372 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Event.cs @@ -0,0 +1,48 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[TypeLibType(16)] +[ComVisible(false)] +public interface ICharacterStatsEvents_Event +{ + event ICharacterStatsEvents_LoginEventHandler Login; + + event ICharacterStatsEvents_Spellbook_AddEventHandler Spellbook_Add; + + event ICharacterStatsEvents_Spellbook_DeleteEventHandler Spellbook_Delete; + + event ICharacterStatsEvents_LoginCompleteEventHandler LoginComplete; + + event ICharacterStatsEvents_ActionCompleteEventHandler ActionComplete; + + event ICharacterStatsEvents_StatusMessageEventHandler StatusMessage; + + event ICharacterStatsEvents_DeathEventHandler Death; + + event ICharacterStatsEvents_ChangePortalModeEventHandler ChangePortalMode; + + event ICharacterStatsEvents_ChangeEnchantmentsEventHandler ChangeEnchantments; + + event ICharacterStatsEvents_ChangePlayerEventHandler ChangePlayer; + + event ICharacterStatsEvents_ChangeVitalEventHandler ChangeVital; + + event ICharacterStatsEvents_ChangeXPSEventHandler ChangeXPS; + + event ICharacterStatsEvents_ChangeFellowshipEventHandler ChangeFellowship; + + event ICharacterStatsEvents_LogoffEventHandler Logoff; + + event ICharacterStatsEvents_CastSpellEventHandler CastSpell; + + event ICharacterStatsEvents_ChangeShortcutEventHandler ChangeShortcut; + + event ICharacterStatsEvents_ChangeSpellbarEventHandler ChangeSpellbar; + + event ICharacterStatsEvents_ChangeSettingsEventHandler ChangeSettings; + + event ICharacterStatsEvents_ChangeSettingFlagsEventHandler ChangeSettingFlags; + + event ICharacterStatsEvents_ChangeOptionEventHandler ChangeOption; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_EventProvider.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_EventProvider.cs new file mode 100644 index 0000000..184493a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_EventProvider.cs @@ -0,0 +1,1598 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Filters; + +internal sealed class ICharacterStatsEvents_EventProvider : ICharacterStatsEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 135, 241, 96, 11, 205, 19, 53, 78, 184, 162, + 254, 18, 143, 5, 202, 107 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event ICharacterStatsEvents_LoginEventHandler ICharacterStatsEvents_Event.Login + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_LoginDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_LoginDelegate != null && ((characterStatsEvents_SinkHelper.m_LoginDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_Spellbook_AddEventHandler ICharacterStatsEvents_Event.Spellbook_Add + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_Spellbook_AddDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_Spellbook_AddDelegate != null && ((characterStatsEvents_SinkHelper.m_Spellbook_AddDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_Spellbook_DeleteEventHandler ICharacterStatsEvents_Event.Spellbook_Delete + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_Spellbook_DeleteDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_Spellbook_DeleteDelegate != null && ((characterStatsEvents_SinkHelper.m_Spellbook_DeleteDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_LoginCompleteEventHandler ICharacterStatsEvents_Event.LoginComplete + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_LoginCompleteDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_LoginCompleteDelegate != null && ((characterStatsEvents_SinkHelper.m_LoginCompleteDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ActionCompleteEventHandler ICharacterStatsEvents_Event.ActionComplete + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ActionCompleteDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ActionCompleteDelegate != null && ((characterStatsEvents_SinkHelper.m_ActionCompleteDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_StatusMessageEventHandler ICharacterStatsEvents_Event.StatusMessage + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_StatusMessageDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_StatusMessageDelegate != null && ((characterStatsEvents_SinkHelper.m_StatusMessageDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_DeathEventHandler ICharacterStatsEvents_Event.Death + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_DeathDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_DeathDelegate != null && ((characterStatsEvents_SinkHelper.m_DeathDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangePortalModeEventHandler ICharacterStatsEvents_Event.ChangePortalMode + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangePortalModeDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangePortalModeDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangePortalModeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeEnchantmentsEventHandler ICharacterStatsEvents_Event.ChangeEnchantments + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeEnchantmentsDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeEnchantmentsDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeEnchantmentsDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangePlayerEventHandler ICharacterStatsEvents_Event.ChangePlayer + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangePlayerDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangePlayerDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangePlayerDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeVitalEventHandler ICharacterStatsEvents_Event.ChangeVital + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeVitalDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeVitalDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeVitalDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeXPSEventHandler ICharacterStatsEvents_Event.ChangeXPS + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeXPSDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeXPSDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeXPSDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeFellowshipEventHandler ICharacterStatsEvents_Event.ChangeFellowship + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeFellowshipDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeFellowshipDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeFellowshipDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_LogoffEventHandler ICharacterStatsEvents_Event.Logoff + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_LogoffDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_LogoffDelegate != null && ((characterStatsEvents_SinkHelper.m_LogoffDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_CastSpellEventHandler ICharacterStatsEvents_Event.CastSpell + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_CastSpellDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_CastSpellDelegate != null && ((characterStatsEvents_SinkHelper.m_CastSpellDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeShortcutEventHandler ICharacterStatsEvents_Event.ChangeShortcut + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeShortcutDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeShortcutDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeShortcutDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeSpellbarEventHandler ICharacterStatsEvents_Event.ChangeSpellbar + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeSpellbarDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeSpellbarDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeSpellbarDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeSettingsEventHandler ICharacterStatsEvents_Event.ChangeSettings + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeSettingsDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeSettingsDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeSettingsDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeSettingFlagsEventHandler ICharacterStatsEvents_Event.ChangeSettingFlags + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeSettingFlagsDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeSettingFlagsDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeSettingFlagsDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICharacterStatsEvents_ChangeOptionEventHandler ICharacterStatsEvents_Event.ChangeOption + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = new ICharacterStatsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(characterStatsEvents_SinkHelper, out pdwCookie); + characterStatsEvents_SinkHelper.m_dwCookie = pdwCookie; + characterStatsEvents_SinkHelper.m_ChangeOptionDelegate = value; + m_aEventSinkHelpers.Add(characterStatsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (characterStatsEvents_SinkHelper.m_ChangeOptionDelegate != null && ((characterStatsEvents_SinkHelper.m_ChangeOptionDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public ICharacterStatsEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + ICharacterStatsEvents_SinkHelper characterStatsEvents_SinkHelper = (ICharacterStatsEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(characterStatsEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginCompleteEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginCompleteEventHandler.cs new file mode 100644 index 0000000..0e4106c --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginCompleteEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_LoginCompleteEventHandler(); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginEventHandler.cs new file mode 100644 index 0000000..b4c44ad --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LoginEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_LoginEventHandler(int Character); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LogoffEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LogoffEventHandler.cs new file mode 100644 index 0000000..84011a4 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_LogoffEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_LogoffEventHandler(PlayerLogoffType Type); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_SinkHelper.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_SinkHelper.cs new file mode 100644 index 0000000..57e46c9 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_SinkHelper.cs @@ -0,0 +1,256 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class ICharacterStatsEvents_SinkHelper : ICharacterStatsEvents +{ + public ICharacterStatsEvents_LoginEventHandler m_LoginDelegate; + + public ICharacterStatsEvents_Spellbook_AddEventHandler m_Spellbook_AddDelegate; + + public ICharacterStatsEvents_Spellbook_DeleteEventHandler m_Spellbook_DeleteDelegate; + + public ICharacterStatsEvents_LoginCompleteEventHandler m_LoginCompleteDelegate; + + public ICharacterStatsEvents_ActionCompleteEventHandler m_ActionCompleteDelegate; + + public ICharacterStatsEvents_StatusMessageEventHandler m_StatusMessageDelegate; + + public ICharacterStatsEvents_DeathEventHandler m_DeathDelegate; + + public ICharacterStatsEvents_ChangePortalModeEventHandler m_ChangePortalModeDelegate; + + public ICharacterStatsEvents_ChangeEnchantmentsEventHandler m_ChangeEnchantmentsDelegate; + + public ICharacterStatsEvents_ChangePlayerEventHandler m_ChangePlayerDelegate; + + public ICharacterStatsEvents_ChangeVitalEventHandler m_ChangeVitalDelegate; + + public ICharacterStatsEvents_ChangeXPSEventHandler m_ChangeXPSDelegate; + + public ICharacterStatsEvents_ChangeFellowshipEventHandler m_ChangeFellowshipDelegate; + + public ICharacterStatsEvents_LogoffEventHandler m_LogoffDelegate; + + public ICharacterStatsEvents_CastSpellEventHandler m_CastSpellDelegate; + + public ICharacterStatsEvents_ChangeShortcutEventHandler m_ChangeShortcutDelegate; + + public ICharacterStatsEvents_ChangeSpellbarEventHandler m_ChangeSpellbarDelegate; + + public ICharacterStatsEvents_ChangeSettingsEventHandler m_ChangeSettingsDelegate; + + public ICharacterStatsEvents_ChangeSettingFlagsEventHandler m_ChangeSettingFlagsDelegate; + + public ICharacterStatsEvents_ChangeOptionEventHandler m_ChangeOptionDelegate; + + public int m_dwCookie; + + public void Login(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_LoginDelegate != null) + { + m_LoginDelegate(P_0); + } + } + + public void Spellbook_Add(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_Spellbook_AddDelegate != null) + { + m_Spellbook_AddDelegate(P_0); + } + } + + public void Spellbook_Delete(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_Spellbook_DeleteDelegate != null) + { + m_Spellbook_DeleteDelegate(P_0); + } + } + + public void LoginComplete() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_LoginCompleteDelegate != null) + { + m_LoginCompleteDelegate(); + } + } + + public void ActionComplete() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ActionCompleteDelegate != null) + { + m_ActionCompleteDelegate(); + } + } + + public void StatusMessage(int P_0, string P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_StatusMessageDelegate != null) + { + m_StatusMessageDelegate(P_0, P_1); + } + } + + public void Death(string P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DeathDelegate != null) + { + m_DeathDelegate(P_0); + } + } + + public void ChangePortalMode(PlayerPortalType P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangePortalModeDelegate != null) + { + m_ChangePortalModeDelegate(P_0); + } + } + + public void ChangeEnchantments(PlayerAddRemoveType P_0, Enchantment P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeEnchantmentsDelegate != null) + { + m_ChangeEnchantmentsDelegate(P_0, P_1); + } + } + + public void ChangePlayer(PlayerModifyType P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangePlayerDelegate != null) + { + m_ChangePlayerDelegate(P_0, P_1); + } + } + + public void ChangeVital(PlayerVitalType P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeVitalDelegate != null) + { + m_ChangeVitalDelegate(P_0, P_1); + } + } + + public void ChangeXPS(PlayerXPType P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeXPSDelegate != null) + { + m_ChangeXPSDelegate(P_0, P_1); + } + } + + public void ChangeFellowship(PlayerFellowshipType P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeFellowshipDelegate != null) + { + m_ChangeFellowshipDelegate(P_0, P_1); + } + } + + public void Logoff(PlayerLogoffType P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_LogoffDelegate != null) + { + m_LogoffDelegate(P_0); + } + } + + public void CastSpell(PlayerCastType P_0, int P_1, int P_2) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_CastSpellDelegate != null) + { + m_CastSpellDelegate(P_0, P_1, P_2); + } + } + + public void ChangeShortcut(PlayerAddRemoveType P_0, int P_1, int P_2) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeShortcutDelegate != null) + { + m_ChangeShortcutDelegate(P_0, P_1, P_2); + } + } + + public void ChangeSpellbar(PlayerAddRemoveType P_0, int P_1, int P_2, int P_3) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeSpellbarDelegate != null) + { + m_ChangeSpellbarDelegate(P_0, P_1, P_2, P_3); + } + } + + public void ChangeSettings(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeSettingsDelegate != null) + { + m_ChangeSettingsDelegate(P_0); + } + } + + public void ChangeSettingFlags(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeSettingFlagsDelegate != null) + { + m_ChangeSettingFlagsDelegate(P_0); + } + } + + public void ChangeOption(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeOptionDelegate != null) + { + m_ChangeOptionDelegate(P_0, P_1); + } + } + + internal ICharacterStatsEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_LoginDelegate = null; + m_Spellbook_AddDelegate = null; + m_Spellbook_DeleteDelegate = null; + m_LoginCompleteDelegate = null; + m_ActionCompleteDelegate = null; + m_StatusMessageDelegate = null; + m_DeathDelegate = null; + m_ChangePortalModeDelegate = null; + m_ChangeEnchantmentsDelegate = null; + m_ChangePlayerDelegate = null; + m_ChangeVitalDelegate = null; + m_ChangeXPSDelegate = null; + m_ChangeFellowshipDelegate = null; + m_LogoffDelegate = null; + m_CastSpellDelegate = null; + m_ChangeShortcutDelegate = null; + m_ChangeSpellbarDelegate = null; + m_ChangeSettingsDelegate = null; + m_ChangeSettingFlagsDelegate = null; + m_ChangeOptionDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_AddEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_AddEventHandler.cs new file mode 100644 index 0000000..83c0373 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_AddEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_Spellbook_AddEventHandler(int SpellAdded); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_DeleteEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_DeleteEventHandler.cs new file mode 100644 index 0000000..9c86ef1 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_Spellbook_DeleteEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_Spellbook_DeleteEventHandler(int SpellDeleted); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_StatusMessageEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_StatusMessageEventHandler.cs new file mode 100644 index 0000000..a92810d --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ICharacterStatsEvents_StatusMessageEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void ICharacterStatsEvents_StatusMessageEventHandler(int lType, [MarshalAs(UnmanagedType.BStr)] string bstrText); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho.cs new file mode 100644 index 0000000..0d71b20 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("7B7FEF07-DAE2-46F3-AC71-7E47F8EF3A44")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +public interface IEcho +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho2.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho2.cs new file mode 100644 index 0000000..2e805b3 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEcho2.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("002C8BAE-917E-4978-B223-B45B3E8B15E6")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IEcho2 +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink.cs new file mode 100644 index 0000000..fc10bd7 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("236B3F19-8F40-492B-A462-0EB4447A6296")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +[InterfaceType(2)] +public interface IEchoSink +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void EchoMessage([MarshalAs(UnmanagedType.Interface)] IMessage pMsg); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2.cs new file mode 100644 index 0000000..2c3712b --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2.cs @@ -0,0 +1,22 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ComImport] +[InterfaceType(2)] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +[Guid("6C9BCC85-BAD0-4706-9CC5-D491E43F81C4")] +public interface IEchoSink2 +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void EchoServer([MarshalAs(UnmanagedType.Interface)] IMessage2 pMsg); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void EchoClient([MarshalAs(UnmanagedType.Interface)] IMessage2 pMsg); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoClientEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoClientEventHandler.cs new file mode 100644 index 0000000..301ce51 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoClientEventHandler.cs @@ -0,0 +1,7 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IEchoSink2_EchoClientEventHandler([MarshalAs(UnmanagedType.Interface)] IMessage2 pMsg); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoServerEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoServerEventHandler.cs new file mode 100644 index 0000000..c9ea954 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EchoServerEventHandler.cs @@ -0,0 +1,7 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IEchoSink2_EchoServerEventHandler([MarshalAs(UnmanagedType.Interface)] IMessage2 pMsg); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_Event.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_Event.cs new file mode 100644 index 0000000..43b40dc --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IEchoSink2_Event +{ + event IEchoSink2_EchoServerEventHandler EchoServer; + + event IEchoSink2_EchoClientEventHandler EchoClient; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EventProvider.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EventProvider.cs new file mode 100644 index 0000000..28988f5 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Filters; + +internal sealed class IEchoSink2_EventProvider : IEchoSink2_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 133, 204, 155, 108, 208, 186, 6, 71, 156, 197, + 212, 145, 228, 63, 129, 196 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IEchoSink2_EchoServerEventHandler IEchoSink2_Event.EchoServer + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IEchoSink2_SinkHelper echoSink2_SinkHelper = new IEchoSink2_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(echoSink2_SinkHelper, out pdwCookie); + echoSink2_SinkHelper.m_dwCookie = pdwCookie; + echoSink2_SinkHelper.m_EchoServerDelegate = value; + m_aEventSinkHelpers.Add(echoSink2_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IEchoSink2_SinkHelper echoSink2_SinkHelper = (IEchoSink2_SinkHelper)m_aEventSinkHelpers[num]; + if (echoSink2_SinkHelper.m_EchoServerDelegate != null && ((echoSink2_SinkHelper.m_EchoServerDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(echoSink2_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IEchoSink2_EchoClientEventHandler IEchoSink2_Event.EchoClient + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IEchoSink2_SinkHelper echoSink2_SinkHelper = new IEchoSink2_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(echoSink2_SinkHelper, out pdwCookie); + echoSink2_SinkHelper.m_dwCookie = pdwCookie; + echoSink2_SinkHelper.m_EchoClientDelegate = value; + m_aEventSinkHelpers.Add(echoSink2_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IEchoSink2_SinkHelper echoSink2_SinkHelper = (IEchoSink2_SinkHelper)m_aEventSinkHelpers[num]; + if (echoSink2_SinkHelper.m_EchoClientDelegate != null && ((echoSink2_SinkHelper.m_EchoClientDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(echoSink2_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IEchoSink2_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IEchoSink2_SinkHelper echoSink2_SinkHelper = (IEchoSink2_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(echoSink2_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_SinkHelper.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_SinkHelper.cs new file mode 100644 index 0000000..ea80483 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink2_SinkHelper.cs @@ -0,0 +1,41 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class IEchoSink2_SinkHelper : IEchoSink2 +{ + public IEchoSink2_EchoServerEventHandler m_EchoServerDelegate; + + public IEchoSink2_EchoClientEventHandler m_EchoClientDelegate; + + public int m_dwCookie; + + public void EchoServer(IMessage2 P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EchoServerDelegate != null) + { + m_EchoServerDelegate(P_0); + } + } + + public void EchoClient(IMessage2 P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EchoClientDelegate != null) + { + m_EchoClientDelegate(P_0); + } + } + + internal IEchoSink2_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_EchoServerDelegate = null; + m_EchoClientDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EchoMessageEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EchoMessageEventHandler.cs new file mode 100644 index 0000000..1ffde8b --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EchoMessageEventHandler.cs @@ -0,0 +1,7 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IEchoSink_EchoMessageEventHandler([MarshalAs(UnmanagedType.Interface)] IMessage pMsg); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_Event.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_Event.cs new file mode 100644 index 0000000..63094a8 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_Event.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IEchoSink_Event +{ + event IEchoSink_EchoMessageEventHandler EchoMessage; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EventProvider.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EventProvider.cs new file mode 100644 index 0000000..d9120cb --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Filters; + +internal sealed class IEchoSink_EventProvider : IEchoSink_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 25, 63, 107, 35, 64, 143, 43, 73, 164, 98, + 14, 180, 68, 122, 98, 150 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IEchoSink_EchoMessageEventHandler IEchoSink_Event.EchoMessage + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IEchoSink_SinkHelper echoSink_SinkHelper = new IEchoSink_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(echoSink_SinkHelper, out pdwCookie); + echoSink_SinkHelper.m_dwCookie = pdwCookie; + echoSink_SinkHelper.m_EchoMessageDelegate = value; + m_aEventSinkHelpers.Add(echoSink_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IEchoSink_SinkHelper echoSink_SinkHelper = (IEchoSink_SinkHelper)m_aEventSinkHelpers[num]; + if (echoSink_SinkHelper.m_EchoMessageDelegate != null && ((echoSink_SinkHelper.m_EchoMessageDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(echoSink_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IEchoSink_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IEchoSink_SinkHelper echoSink_SinkHelper = (IEchoSink_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(echoSink_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_SinkHelper.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_SinkHelper.cs new file mode 100644 index 0000000..d7a1e50 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEchoSink_SinkHelper.cs @@ -0,0 +1,29 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IEchoSink_SinkHelper : IEchoSink +{ + public IEchoSink_EchoMessageEventHandler m_EchoMessageDelegate; + + public int m_dwCookie; + + public void EchoMessage(IMessage P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EchoMessageDelegate != null) + { + m_EchoMessageDelegate(P_0); + } + } + + internal IEchoSink_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_EchoMessageDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnchantment.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnchantment.cs new file mode 100644 index 0000000..c8cb6dd --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnchantment.cs @@ -0,0 +1,76 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("B83155F4-E298-4004-80C6-AA592F677430")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IEnchantment +{ + [DispId(1)] + int SpellID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + } + + [DispId(2)] + int Layer + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + int TimeRemaining + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + int Affected + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + int AffectedMask + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + int Family + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + double Adjustment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + double Duration + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnumVARIANT.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnumVARIANT.cs new file mode 100644 index 0000000..fafb7b5 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IEnumVARIANT.cs @@ -0,0 +1,23 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("00020404-0000-0000-C000-000000000046")] +[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] +public interface IEnumVARIANT +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Next([In] uint celt, [In][MarshalAs(UnmanagedType.Struct)] ref object rgvar, out uint pceltFetched); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Skip([In] uint celt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Clone([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] out IEnumerator ppenum); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IIdentifyQueue.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IIdentifyQueue.cs new file mode 100644 index 0000000..fe423ab --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IIdentifyQueue.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("6FD2E07C-7E9C-451B-8968-2FCB0226D0E8")] +[TypeLibType(4288)] +public interface IIdentifyQueue +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilter.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilter.cs new file mode 100644 index 0000000..11dcd0c --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilter.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("3C1CBEF8-E72A-4BDF-B92E-4F3307109766")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +public interface IPrefilter +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents.cs new file mode 100644 index 0000000..2ba1900 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ComImport] +[InterfaceType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("A67C748D-2427-4A13-A114-7ACC1D4C9433")] +[TypeLibType(4096)] +public interface IPrefilterEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Event(int ID, [MarshalAs(UnmanagedType.Interface)] IMessage Message); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_Event.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_Event.cs new file mode 100644 index 0000000..a7f9789 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_Event.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IPrefilterEvents_Event +{ + event IPrefilterEvents_EventEventHandler Event; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventEventHandler.cs new file mode 100644 index 0000000..eae0ffc --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventEventHandler.cs @@ -0,0 +1,7 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IPrefilterEvents_EventEventHandler(int ID, [MarshalAs(UnmanagedType.Interface)] IMessage Message); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventProvider.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventProvider.cs new file mode 100644 index 0000000..1efd909 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Filters; + +internal sealed class IPrefilterEvents_EventProvider : IPrefilterEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 141, 116, 124, 166, 39, 36, 19, 74, 161, 20, + 122, 204, 29, 76, 148, 51 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IPrefilterEvents_EventEventHandler IPrefilterEvents_Event.Event + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IPrefilterEvents_SinkHelper prefilterEvents_SinkHelper = new IPrefilterEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(prefilterEvents_SinkHelper, out pdwCookie); + prefilterEvents_SinkHelper.m_dwCookie = pdwCookie; + prefilterEvents_SinkHelper.m_EventDelegate = value; + m_aEventSinkHelpers.Add(prefilterEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IPrefilterEvents_SinkHelper prefilterEvents_SinkHelper = (IPrefilterEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (prefilterEvents_SinkHelper.m_EventDelegate != null && ((prefilterEvents_SinkHelper.m_EventDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(prefilterEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IPrefilterEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IPrefilterEvents_SinkHelper prefilterEvents_SinkHelper = (IPrefilterEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(prefilterEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_SinkHelper.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_SinkHelper.cs new file mode 100644 index 0000000..4669ed7 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IPrefilterEvents_SinkHelper.cs @@ -0,0 +1,29 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Net; + +namespace Decal.Interop.Filters; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class IPrefilterEvents_SinkHelper : IPrefilterEvents +{ + public IPrefilterEvents_EventEventHandler m_EventDelegate; + + public int m_dwCookie; + + public void Event(int P_0, IMessage P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EventDelegate != null) + { + m_EventDelegate(P_0, P_1); + } + } + + internal IPrefilterEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_EventDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ISkillInfo.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ISkillInfo.cs new file mode 100644 index 0000000..f50396d --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/ISkillInfo.cs @@ -0,0 +1,103 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("6FBA5326-F234-4AEC-B844-2136A0D50FD5")] +[TypeLibType(4160)] +public interface ISkillInfo +{ + [DispId(1)] + string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(2)] + string ShortName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(3)] + string Formula + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(4)] + int Base + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + int Current + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + int Exp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + eTrainingType Training + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + bool Known + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } + + [DispId(9)] + int Increment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + } + + [DispId(10)] + int Bonus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + } + + [DispId(11)] + int Buffed + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IVendor.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IVendor.cs new file mode 100644 index 0000000..fbd7281 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IVendor.cs @@ -0,0 +1,112 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("6AA27887-088A-42F8-B319-2AFBF8C3A5FD")] +[TypeLibType(4160)] +public interface IVendor : IEnumerable +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Reset(); + + [DispId(2)] + int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + bool Next([In][Out][MarshalAs(UnmanagedType.Interface)] ref WorldObject ppObject); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + void ByAll(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void ByName([MarshalAs(UnmanagedType.BStr)] string strName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + void ByNameSubstring([MarshalAs(UnmanagedType.BStr)] string strSubstring); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + void ByObjectClass(eObjectClass Class); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + void ByCategory(int nCategory); + + [DispId(10)] + int Quantity + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + } + + [DispId(11)] + int MerchantID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } + + [DispId(12)] + int BuyCategories + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } + + [DispId(13)] + int BuyValue + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + } + + [DispId(14)] + float BuyRate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + } + + [DispId(15)] + float SellRate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(-4)] + [TypeLibFunc(1)] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + new IEnumerator GetEnumerator(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [return: MarshalAs(UnmanagedType.Interface)] + WorldObject GetByID(int pObjectId); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorld.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorld.cs new file mode 100644 index 0000000..fadeb52 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorld.cs @@ -0,0 +1,128 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("C5F0FF7E-A043-4A28-8893-F6E43F4E9DED")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +public interface IWorld +{ + [DispId(0)] + WorldObject this[[In] int GUID] + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(256)] + [DispId(0)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(2)] + WorldIterator ByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(3)] + WorldIterator All + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(4)] + WorldIterator ByObjectClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(5)] + WorldIterator ByNameSubstring + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(6)] + WorldIterator ByContainer + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(7)] + WorldIterator Inventory + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + double Distance2D(int GUID1, int GUID2); + + [DispId(9)] + WorldIterator ByOwner + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(10)] + WorldIterator Landscape + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(11)] + int NumObjectClasses + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } + + [DispId(12)] + WorldIterator ByCategory + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + double Distance3D(int GUID1, int GUID2); + + [DispId(14)] + Vendor Vendor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents.cs new file mode 100644 index 0000000..acc18b9 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents.cs @@ -0,0 +1,69 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("175F99F1-B937-47C5-846E-CACBB986AFD9")] +[InterfaceType(2)] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +public interface IWorldEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void CreateObject([MarshalAs(UnmanagedType.Interface)] WorldObject pObject); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void ReleaseObject([MarshalAs(UnmanagedType.Interface)] WorldObject pObject); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void ChangeObject([MarshalAs(UnmanagedType.Interface)] WorldObject pObject, WorldChangeType Change); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void MoveObject([MarshalAs(UnmanagedType.Interface)] WorldObject pObject); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + void ReleaseDone(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void EnterTrade(int trader, int tradee); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + void EndTrade(int reason); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + void AddTradeItem(int Item, int side); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + void AcceptTrade(int trader); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + void DeclineTrade(int trader); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + void ResetTrade(int trader); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + void FailToAddTradeItem(int Item, int reason); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + void FailToCompleteTrade(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + void ApproachVendor(int merchant); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AcceptTradeEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AcceptTradeEventHandler.cs new file mode 100644 index 0000000..d7fcac8 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AcceptTradeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_AcceptTradeEventHandler(int trader); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AddTradeItemEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AddTradeItemEventHandler.cs new file mode 100644 index 0000000..b7abd8e --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_AddTradeItemEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_AddTradeItemEventHandler(int Item, int side); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ApproachVendorEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ApproachVendorEventHandler.cs new file mode 100644 index 0000000..78e897c --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ApproachVendorEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_ApproachVendorEventHandler(int merchant); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ChangeObjectEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ChangeObjectEventHandler.cs new file mode 100644 index 0000000..5e2c2b4 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ChangeObjectEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_ChangeObjectEventHandler([MarshalAs(UnmanagedType.Interface)] WorldObject pObject, WorldChangeType Change); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_CreateObjectEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_CreateObjectEventHandler.cs new file mode 100644 index 0000000..0ea8263 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_CreateObjectEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_CreateObjectEventHandler([MarshalAs(UnmanagedType.Interface)] WorldObject pObject); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_DeclineTradeEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_DeclineTradeEventHandler.cs new file mode 100644 index 0000000..01847ff --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_DeclineTradeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_DeclineTradeEventHandler(int trader); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EndTradeEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EndTradeEventHandler.cs new file mode 100644 index 0000000..cadcbd2 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EndTradeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_EndTradeEventHandler(int reason); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EnterTradeEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EnterTradeEventHandler.cs new file mode 100644 index 0000000..245a9aa --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EnterTradeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_EnterTradeEventHandler(int trader, int tradee); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_Event.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_Event.cs new file mode 100644 index 0000000..a293ea4 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_Event.cs @@ -0,0 +1,36 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IWorldEvents_Event +{ + event IWorldEvents_CreateObjectEventHandler CreateObject; + + event IWorldEvents_ReleaseObjectEventHandler ReleaseObject; + + event IWorldEvents_ChangeObjectEventHandler ChangeObject; + + event IWorldEvents_MoveObjectEventHandler MoveObject; + + event IWorldEvents_ReleaseDoneEventHandler ReleaseDone; + + event IWorldEvents_EnterTradeEventHandler EnterTrade; + + event IWorldEvents_EndTradeEventHandler EndTrade; + + event IWorldEvents_AddTradeItemEventHandler AddTradeItem; + + event IWorldEvents_AcceptTradeEventHandler AcceptTrade; + + event IWorldEvents_DeclineTradeEventHandler DeclineTrade; + + event IWorldEvents_ResetTradeEventHandler ResetTrade; + + event IWorldEvents_FailToAddTradeItemEventHandler FailToAddTradeItem; + + event IWorldEvents_FailToCompleteTradeEventHandler FailToCompleteTrade; + + event IWorldEvents_ApproachVendorEventHandler ApproachVendor; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EventProvider.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EventProvider.cs new file mode 100644 index 0000000..ef394a3 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_EventProvider.cs @@ -0,0 +1,1142 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Filters; + +internal sealed class IWorldEvents_EventProvider : IWorldEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 241, 153, 95, 23, 55, 185, 197, 71, 132, 110, + 202, 203, 185, 134, 175, 217 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IWorldEvents_CreateObjectEventHandler IWorldEvents_Event.CreateObject + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_CreateObjectDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_CreateObjectDelegate != null && ((worldEvents_SinkHelper.m_CreateObjectDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_ReleaseObjectEventHandler IWorldEvents_Event.ReleaseObject + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_ReleaseObjectDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_ReleaseObjectDelegate != null && ((worldEvents_SinkHelper.m_ReleaseObjectDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_ChangeObjectEventHandler IWorldEvents_Event.ChangeObject + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_ChangeObjectDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_ChangeObjectDelegate != null && ((worldEvents_SinkHelper.m_ChangeObjectDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_MoveObjectEventHandler IWorldEvents_Event.MoveObject + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_MoveObjectDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_MoveObjectDelegate != null && ((worldEvents_SinkHelper.m_MoveObjectDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_ReleaseDoneEventHandler IWorldEvents_Event.ReleaseDone + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_ReleaseDoneDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_ReleaseDoneDelegate != null && ((worldEvents_SinkHelper.m_ReleaseDoneDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_EnterTradeEventHandler IWorldEvents_Event.EnterTrade + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_EnterTradeDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_EnterTradeDelegate != null && ((worldEvents_SinkHelper.m_EnterTradeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_EndTradeEventHandler IWorldEvents_Event.EndTrade + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_EndTradeDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_EndTradeDelegate != null && ((worldEvents_SinkHelper.m_EndTradeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_AddTradeItemEventHandler IWorldEvents_Event.AddTradeItem + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_AddTradeItemDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_AddTradeItemDelegate != null && ((worldEvents_SinkHelper.m_AddTradeItemDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_AcceptTradeEventHandler IWorldEvents_Event.AcceptTrade + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_AcceptTradeDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_AcceptTradeDelegate != null && ((worldEvents_SinkHelper.m_AcceptTradeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_DeclineTradeEventHandler IWorldEvents_Event.DeclineTrade + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_DeclineTradeDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_DeclineTradeDelegate != null && ((worldEvents_SinkHelper.m_DeclineTradeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_ResetTradeEventHandler IWorldEvents_Event.ResetTrade + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_ResetTradeDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_ResetTradeDelegate != null && ((worldEvents_SinkHelper.m_ResetTradeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_FailToAddTradeItemEventHandler IWorldEvents_Event.FailToAddTradeItem + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_FailToAddTradeItemDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_FailToAddTradeItemDelegate != null && ((worldEvents_SinkHelper.m_FailToAddTradeItemDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_FailToCompleteTradeEventHandler IWorldEvents_Event.FailToCompleteTrade + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_FailToCompleteTradeDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_FailToCompleteTradeDelegate != null && ((worldEvents_SinkHelper.m_FailToCompleteTradeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWorldEvents_ApproachVendorEventHandler IWorldEvents_Event.ApproachVendor + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWorldEvents_SinkHelper worldEvents_SinkHelper = new IWorldEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(worldEvents_SinkHelper, out pdwCookie); + worldEvents_SinkHelper.m_dwCookie = pdwCookie; + worldEvents_SinkHelper.m_ApproachVendorDelegate = value; + m_aEventSinkHelpers.Add(worldEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (worldEvents_SinkHelper.m_ApproachVendorDelegate != null && ((worldEvents_SinkHelper.m_ApproachVendorDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IWorldEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IWorldEvents_SinkHelper worldEvents_SinkHelper = (IWorldEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(worldEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToAddTradeItemEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToAddTradeItemEventHandler.cs new file mode 100644 index 0000000..db33d46 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToAddTradeItemEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_FailToAddTradeItemEventHandler(int Item, int reason); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToCompleteTradeEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToCompleteTradeEventHandler.cs new file mode 100644 index 0000000..d65e1a8 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_FailToCompleteTradeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_FailToCompleteTradeEventHandler(); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_MoveObjectEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_MoveObjectEventHandler.cs new file mode 100644 index 0000000..ff53a44 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_MoveObjectEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_MoveObjectEventHandler([MarshalAs(UnmanagedType.Interface)] WorldObject pObject); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseDoneEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseDoneEventHandler.cs new file mode 100644 index 0000000..b053af0 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseDoneEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_ReleaseDoneEventHandler(); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseObjectEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseObjectEventHandler.cs new file mode 100644 index 0000000..4799712 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ReleaseObjectEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_ReleaseObjectEventHandler([MarshalAs(UnmanagedType.Interface)] WorldObject pObject); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ResetTradeEventHandler.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ResetTradeEventHandler.cs new file mode 100644 index 0000000..9d3541e --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_ResetTradeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComVisible(false)] +public delegate void IWorldEvents_ResetTradeEventHandler(int trader); diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_SinkHelper.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_SinkHelper.cs new file mode 100644 index 0000000..8906240 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldEvents_SinkHelper.cs @@ -0,0 +1,184 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IWorldEvents_SinkHelper : IWorldEvents +{ + public IWorldEvents_CreateObjectEventHandler m_CreateObjectDelegate; + + public IWorldEvents_ReleaseObjectEventHandler m_ReleaseObjectDelegate; + + public IWorldEvents_ChangeObjectEventHandler m_ChangeObjectDelegate; + + public IWorldEvents_MoveObjectEventHandler m_MoveObjectDelegate; + + public IWorldEvents_ReleaseDoneEventHandler m_ReleaseDoneDelegate; + + public IWorldEvents_EnterTradeEventHandler m_EnterTradeDelegate; + + public IWorldEvents_EndTradeEventHandler m_EndTradeDelegate; + + public IWorldEvents_AddTradeItemEventHandler m_AddTradeItemDelegate; + + public IWorldEvents_AcceptTradeEventHandler m_AcceptTradeDelegate; + + public IWorldEvents_DeclineTradeEventHandler m_DeclineTradeDelegate; + + public IWorldEvents_ResetTradeEventHandler m_ResetTradeDelegate; + + public IWorldEvents_FailToAddTradeItemEventHandler m_FailToAddTradeItemDelegate; + + public IWorldEvents_FailToCompleteTradeEventHandler m_FailToCompleteTradeDelegate; + + public IWorldEvents_ApproachVendorEventHandler m_ApproachVendorDelegate; + + public int m_dwCookie; + + public void CreateObject(WorldObject P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_CreateObjectDelegate != null) + { + m_CreateObjectDelegate(P_0); + } + } + + public void ReleaseObject(WorldObject P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ReleaseObjectDelegate != null) + { + m_ReleaseObjectDelegate(P_0); + } + } + + public void ChangeObject(WorldObject P_0, WorldChangeType P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeObjectDelegate != null) + { + m_ChangeObjectDelegate(P_0, P_1); + } + } + + public void MoveObject(WorldObject P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_MoveObjectDelegate != null) + { + m_MoveObjectDelegate(P_0); + } + } + + public void ReleaseDone() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ReleaseDoneDelegate != null) + { + m_ReleaseDoneDelegate(); + } + } + + public void EnterTrade(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EnterTradeDelegate != null) + { + m_EnterTradeDelegate(P_0, P_1); + } + } + + public void EndTrade(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EndTradeDelegate != null) + { + m_EndTradeDelegate(P_0); + } + } + + public void AddTradeItem(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_AddTradeItemDelegate != null) + { + m_AddTradeItemDelegate(P_0, P_1); + } + } + + public void AcceptTrade(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_AcceptTradeDelegate != null) + { + m_AcceptTradeDelegate(P_0); + } + } + + public void DeclineTrade(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DeclineTradeDelegate != null) + { + m_DeclineTradeDelegate(P_0); + } + } + + public void ResetTrade(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ResetTradeDelegate != null) + { + m_ResetTradeDelegate(P_0); + } + } + + public void FailToAddTradeItem(int P_0, int P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_FailToAddTradeItemDelegate != null) + { + m_FailToAddTradeItemDelegate(P_0, P_1); + } + } + + public void FailToCompleteTrade() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_FailToCompleteTradeDelegate != null) + { + m_FailToCompleteTradeDelegate(); + } + } + + public void ApproachVendor(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ApproachVendorDelegate != null) + { + m_ApproachVendorDelegate(P_0); + } + } + + internal IWorldEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_CreateObjectDelegate = null; + m_ReleaseObjectDelegate = null; + m_ChangeObjectDelegate = null; + m_MoveObjectDelegate = null; + m_ReleaseDoneDelegate = null; + m_EnterTradeDelegate = null; + m_EndTradeDelegate = null; + m_AddTradeItemDelegate = null; + m_AcceptTradeDelegate = null; + m_DeclineTradeDelegate = null; + m_ResetTradeDelegate = null; + m_FailToAddTradeItemDelegate = null; + m_FailToCompleteTradeDelegate = null; + m_ApproachVendorDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldIterator.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldIterator.cs new file mode 100644 index 0000000..49c4bb2 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldIterator.cs @@ -0,0 +1,93 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("6FC29250-9FB4-4A0C-AF16-329E35DF02F2")] +public interface IWorldIterator : IEnumerable +{ + [DispId(1)] + WorldObject Next_Old + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [TypeLibFunc(64)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void Reset(); + + [DispId(3)] + int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + bool Next([In][Out][MarshalAs(UnmanagedType.Interface)] ref WorldObject ppObject); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void ByName([MarshalAs(UnmanagedType.BStr)] string strName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + void ByNameSubstring([MarshalAs(UnmanagedType.BStr)] string strSubstring); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + void ByObjectClass(eObjectClass Class); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + void ByAll(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + void ByInventory(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + void ByContainer(int nContainer); + + [DispId(12)] + int Quantity + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + void ByOwner(int nOwner); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + void ByLandscape(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + void ByCategory(int nCategory); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(-4)] + [TypeLibFunc(1)] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + new IEnumerator GetEnumerator(); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldObject.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldObject.cs new file mode 100644 index 0000000..8e87ed0 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IWorldObject.cs @@ -0,0 +1,184 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("3DDD1391-FDDB-4C43-BA28-8F624E021F05")] +[DefaultMember("GUID")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IWorldObject +{ + [DispId(0)] + int GUID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(0)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + bool Offset(out double x, out double y, out double z); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + bool Coordinates([In][Out] ref double NorthSouth, [In][Out] ref double EastWest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + bool RawCoordinates([In][Out] ref double pX, [In][Out] ref double pY, ref double pZ); + + [DispId(4)] + eObjectClass ObjectClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + int Spell([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + bool Orientation(out double w, out double x, out double y, out double z); + + [DispId(7)] + bool HasIdData + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + int LastIdTime + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + int Longs([In] LongValueKey index, int defVal = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + double Doubles([In] DoubleValueKey index, double defVal = 0.0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + bool Bools([In] BoolValueKey index, bool defVal = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [return: MarshalAs(UnmanagedType.BStr)] + string Strings([In] StringValueKey index, [MarshalAs(UnmanagedType.BStr)] string defVal = ""); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + bool LongExists([In] LongValueKey index, out int pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + bool DoubleExists([In] DoubleValueKey index, out double pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + bool BoolExists([In] BoolValueKey index, out bool pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + bool StringExists([In] StringValueKey index, [MarshalAs(UnmanagedType.BStr)] out string pValue); + + [DispId(17)] + string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(18)] + int PhysicsDataFlags + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + get; + } + + [DispId(19)] + int GameDataFlags1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + get; + } + + [DispId(20)] + int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + get; + } + + [DispId(21)] + int Icon + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + get; + } + + [DispId(22)] + int Category + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + get; + } + + [DispId(23)] + int Behavior + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + int ActiveSpell([In] int index); + + [DispId(25)] + int Container + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + int EnumBoolKey([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + int EnumLongKey([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + int EnumDoubleKey([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + int EnumStringKey([In] int index); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueue.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueue.cs new file mode 100644 index 0000000..d3d46da --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueue.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("6FD2E07C-7E9C-451B-8968-2FCB0226D0E8")] +[CoClass(typeof(IdentifyQueueClass))] +public interface IdentifyQueue : IIdentifyQueue +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueueClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueueClass.cs new file mode 100644 index 0000000..98fb9b1 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/IdentifyQueueClass.cs @@ -0,0 +1,13 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +public class IdentifyQueueClass : IIdentifyQueue, IdentifyQueue +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/LongValueKey.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/LongValueKey.cs new file mode 100644 index 0000000..c3fc07d --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/LongValueKey.cs @@ -0,0 +1,108 @@ +namespace Decal.Interop.Filters; + +public enum LongValueKey +{ + keyType = 218103808, + keyIcon = 218103809, + keyContainer = 218103810, + keyLandblock = 218103811, + keyItemSlots = 218103812, + keyPackSlots = 218103813, + keyStackCount = 218103814, + keyStackMax = 218103815, + keyAssociatedSpell = 218103816, + keySlotLegacy = 218103817, + keyWielder = 218103818, + keyWieldingSlot = 218103819, + keyMonarch = 218103820, + keyCoverage = 218103821, + keyEquipableSlots = 218103822, + keyEquipType = 218103823, + keyIconOutline = 218103824, + keyMissileType = 218103825, + keyUsageMask = 218103826, + keyHouseOwner = 218103827, + keyHookMask = 218103828, + keyHookType = 218103829, + keyModel = 218103830, + keyFlags = 218103831, + keyCreateFlags1 = 218103832, + keyCreateFlags2 = 218103833, + keyCategory = 218103834, + keyBehavior = 218103835, + keyMagicDef = 218103836, + keySpecialProps = 218103837, + keySpellCount = 218103838, + keyWeapSpeed = 218103839, + keyEquipSkill = 218103840, + keyDamageType = 218103841, + keyMaxDamage = 218103842, + keyUnknown10 = 218103843, + keyUnknown100000 = 218103844, + keyUnknown800000 = 218103845, + keyUnknown8000000 = 218103846, + keyPhysicsDataFlags = 218103847, + keyActiveSpellCount = 218103848, + keyIconOverlay = 218103849, + keyIconUnderlay = 218103850, + keySpecies = 2, + keyBurden = 5, + keyEquippedSlots = 10, + keyRareID = 17, + keyValue = 19, + keyTotalValue = 20, + keySkillCreditsAvail = 24, + keyCreatureLevel = 25, + keyRestrictedToToD = 26, + keyArmorLevel = 28, + keyRank = 30, + keyBonded = 33, + keyNumberFollowers = 35, + keyUnenchantable = 36, + keyLockpickDifficulty = 38, + keyDeaths = 43, + keyWandElemDmgType = 45, + keyMinLevelRestrict = 86, + keyMaxLevelRestrict = 87, + keyLockpickSkillBonus = 88, + keyAffectsVitalID = 89, + keyAffectsVitalAmt = 90, + keyHealKitSkillBonus = 90, + keyUsesTotal = 91, + keyUsesRemaining = 92, + keyDateOfBirth = 98, + keyWorkmanship = 105, + keySpellcraft = 106, + keyCurrentMana = 107, + keyMaximumMana = 108, + keyLoreRequirement = 109, + keyRankRequirement = 110, + keyPortalRestrictions = 111, + keyGender = 113, + keyAttuned = 114, + keySkillLevelReq = 115, + keyManaCost = 117, + keyAge = 125, + keyXPForVPReduction = 129, + keyMaterial = 131, + keyWieldReqType = 158, + keyWieldReqAttribute = 159, + keyWieldReqValue = 160, + keySlayerSpecies = 166, + keyNumberItemsSalvagedFrom = 170, + keyNumberTimesTinkered = 171, + keyDescriptionFormat = 172, + keyPagesUsed = 174, + keyPagesTotal = 175, + keyActivationReqSkillID = 176, + keyGemSettingQty = 177, + keyGemSettingType = 178, + keyImbued = 179, + keyHeritage = 188, + keyFishingSkill = 192, + keyKeysHeld = 193, + keyElementalDmgBonus = 204, + keyCleaveType = 263, + keyArmorSet = 265, + keySlot = 231735296 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerAddRemoveType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerAddRemoveType.cs new file mode 100644 index 0000000..ad7a922 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerAddRemoveType.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Filters; + +public enum PlayerAddRemoveType +{ + pevtAdd, + pevtRemove +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerCastType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerCastType.cs new file mode 100644 index 0000000..8e5725d --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerCastType.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Filters; + +public enum PlayerCastType +{ + pevtTargetless, + pevtTargeted +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerFellowshipType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerFellowshipType.cs new file mode 100644 index 0000000..1134be7 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerFellowshipType.cs @@ -0,0 +1,10 @@ +namespace Decal.Interop.Filters; + +public enum PlayerFellowshipType +{ + pevtCreate, + pevtQuit, + pevtDismiss, + pevtRecruit, + pevtDisband +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerLogoffType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerLogoffType.cs new file mode 100644 index 0000000..54d3d35 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerLogoffType.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Filters; + +public enum PlayerLogoffType +{ + pevtRequested, + pevtAuthorized +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerModifyType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerModifyType.cs new file mode 100644 index 0000000..1d74bf7 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerModifyType.cs @@ -0,0 +1,11 @@ +namespace Decal.Interop.Filters; + +public enum PlayerModifyType +{ + pevtSkill, + pevtAttribute, + pevtVital, + pevtStatistic, + pevtAllegiance, + pevtAugmentation +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerPortalType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerPortalType.cs new file mode 100644 index 0000000..d328e79 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerPortalType.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Filters; + +public enum PlayerPortalType +{ + pevtEnterPortal, + pevtExitPortal +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerVitalType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerVitalType.cs new file mode 100644 index 0000000..81ab8e0 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerVitalType.cs @@ -0,0 +1,8 @@ +namespace Decal.Interop.Filters; + +public enum PlayerVitalType +{ + pevtHealth = 2, + pevtStamina = 4, + pevtMana = 6 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerXPType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerXPType.cs new file mode 100644 index 0000000..94e4b9f --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PlayerXPType.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Filters; + +public enum PlayerXPType +{ + pevtTotal, + pevtUnassigned +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Prefilter.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Prefilter.cs new file mode 100644 index 0000000..43d6d48 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Prefilter.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("3C1CBEF8-E72A-4BDF-B92E-4F3307109766")] +[CoClass(typeof(PrefilterClass))] +public interface Prefilter : IPrefilter, IPrefilterEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PrefilterClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PrefilterClass.cs new file mode 100644 index 0000000..f53f12e --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/PrefilterClass.cs @@ -0,0 +1,15 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.Filters.IPrefilterEvents\0\0")] +[Guid("443D4A68-5422-4E0C-9460-973F8FBDB190")] +[SuppressUnmanagedCodeSecurity] +public class PrefilterClass : IPrefilter, Prefilter, IPrefilterEvents_Event +{ + public virtual extern event IPrefilterEvents_EventEventHandler Event; +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfo.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfo.cs new file mode 100644 index 0000000..057a09e --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfo.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[CoClass(typeof(SkillInfoClass))] +[Guid("6FBA5326-F234-4AEC-B844-2136A0D50FD5")] +public interface SkillInfo : ISkillInfo +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfoClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfoClass.cs new file mode 100644 index 0000000..4ee5328 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/SkillInfoClass.cs @@ -0,0 +1,103 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("652DA384-AA3B-4F9D-9730-8CF753DA1A31")] +public class SkillInfoClass : ISkillInfo, SkillInfo +{ + [DispId(1)] + public virtual extern string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(2)] + public virtual extern string ShortName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(3)] + public virtual extern string Formula + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(4)] + public virtual extern int Base + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + public virtual extern int Current + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [DispId(6)] + public virtual extern int Exp + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + } + + [DispId(7)] + public virtual extern eTrainingType Training + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + public virtual extern bool Known + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } + + [DispId(9)] + public virtual extern int Increment + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + } + + [DispId(10)] + public virtual extern int Bonus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + } + + [DispId(11)] + public virtual extern int Buffed + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/StringValueKey.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/StringValueKey.cs new file mode 100644 index 0000000..554fe49 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/StringValueKey.cs @@ -0,0 +1,22 @@ +namespace Decal.Interop.Filters; + +public enum StringValueKey +{ + keySecondaryName = 184549376, + keyName = 1, + keyTitle = 5, + keyInscription = 7, + keyInscribedBy = 8, + keyFellowshipName = 10, + keyUsageInstructions = 14, + keySimpleDescription = 15, + keyFullDescription = 16, + keyMonarchName = 21, + keyOnlyActivatedBy = 25, + keyPatron = 35, + keyPortalDestination = 38, + keyLastTinkeredBy = 39, + keyImbuedBy = 40, + keyDateBorn = 43, + keyMonarchyTitle = 47 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Vendor.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Vendor.cs new file mode 100644 index 0000000..d31f83a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/Vendor.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[CoClass(typeof(VendorClass))] +[Guid("6AA27887-088A-42F8-B319-2AFBF8C3A5FD")] +public interface Vendor : IVendor +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorClass.cs new file mode 100644 index 0000000..a89f33e --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorClass.cs @@ -0,0 +1,113 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[Guid("AA14BA4C-862A-441A-AD44-542308596F54")] +[SuppressUnmanagedCodeSecurity] +public class VendorClass : IVendor, Vendor, IEnumerable +{ + [DispId(2)] + public virtual extern int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(10)] + public virtual extern int Quantity + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + } + + [DispId(11)] + public virtual extern int MerchantID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } + + [DispId(12)] + public virtual extern int BuyCategories + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } + + [DispId(13)] + public virtual extern int BuyValue + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + } + + [DispId(14)] + public virtual extern float BuyRate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + } + + [DispId(15)] + public virtual extern float SellRate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + public virtual extern bool Next([In][Out][MarshalAs(UnmanagedType.Interface)] ref WorldObject ppObject); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + public virtual extern void ByAll(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + public virtual extern void ByName([MarshalAs(UnmanagedType.BStr)] string strName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + public virtual extern void ByNameSubstring([MarshalAs(UnmanagedType.BStr)] string strSubstring); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + public virtual extern void ByObjectClass(eObjectClass Class); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + public virtual extern void ByCategory(int nCategory); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(1)] + [DispId(-4)] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public virtual extern IEnumerator GetEnumerator(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern WorldObject GetByID(int pObjectId); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnum.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnum.cs new file mode 100644 index 0000000..7105d6f --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnum.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[CoClass(typeof(VendorEnumClass))] +[Guid("00020404-0000-0000-C000-000000000046")] +public interface VendorEnum : IEnumVARIANT +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnumClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnumClass.cs new file mode 100644 index 0000000..58ba28c --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/VendorEnumClass.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("EE5DE01C-C38B-4908-92AC-F22290E4B3E7")] +[TypeLibType(18)] +public class VendorEnumClass : IEnumVARIANT, VendorEnum +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Next([In] uint celt, [In][MarshalAs(UnmanagedType.Struct)] ref object rgvar, out uint pceltFetched); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Skip([In] uint celt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Clone([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] out IEnumerator ppenum); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/World.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/World.cs new file mode 100644 index 0000000..bdfe5e0 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/World.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("C5F0FF7E-A043-4A28-8893-F6E43F4E9DED")] +[CoClass(typeof(WorldClass))] +public interface World : IWorld, IWorldEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldChangeType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldChangeType.cs new file mode 100644 index 0000000..878df40 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldChangeType.cs @@ -0,0 +1,10 @@ +namespace Decal.Interop.Filters; + +public enum WorldChangeType +{ + wevtSizeChange, + wevtStorageChange, + wevtIdentReceived, + wevtVendorIdentReceived, + wevtManaChange +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldClass.cs new file mode 100644 index 0000000..f22ef17 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldClass.cs @@ -0,0 +1,158 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[ComSourceInterfaces("Decal.Interop.Filters.IWorldEvents\0\0")] +[Guid("53092D1B-F0B0-46FF-BF11-8F031EC9B137")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class WorldClass : IWorld, World, IWorldEvents_Event +{ + [DispId(0)] + public virtual extern WorldObject this[[In] int GUID] + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(256)] + [DispId(0)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(2)] + public virtual extern WorldIterator ByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(3)] + public virtual extern WorldIterator All + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(4)] + public virtual extern WorldIterator ByObjectClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(5)] + public virtual extern WorldIterator ByNameSubstring + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(6)] + public virtual extern WorldIterator ByContainer + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(7)] + public virtual extern WorldIterator Inventory + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(9)] + public virtual extern WorldIterator ByOwner + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(10)] + public virtual extern WorldIterator Landscape + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(11)] + public virtual extern int NumObjectClasses + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + } + + [DispId(12)] + public virtual extern WorldIterator ByCategory + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(14)] + public virtual extern Vendor Vendor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IWorldEvents_CreateObjectEventHandler CreateObject; + + public virtual extern event IWorldEvents_ReleaseObjectEventHandler ReleaseObject; + + public virtual extern event IWorldEvents_ChangeObjectEventHandler ChangeObject; + + public virtual extern event IWorldEvents_MoveObjectEventHandler MoveObject; + + public virtual extern event IWorldEvents_ReleaseDoneEventHandler ReleaseDone; + + public virtual extern event IWorldEvents_EnterTradeEventHandler EnterTrade; + + public virtual extern event IWorldEvents_EndTradeEventHandler EndTrade; + + public virtual extern event IWorldEvents_AddTradeItemEventHandler AddTradeItem; + + public virtual extern event IWorldEvents_AcceptTradeEventHandler AcceptTrade; + + public virtual extern event IWorldEvents_DeclineTradeEventHandler DeclineTrade; + + public virtual extern event IWorldEvents_ResetTradeEventHandler ResetTrade; + + public virtual extern event IWorldEvents_FailToAddTradeItemEventHandler FailToAddTradeItem; + + public virtual extern event IWorldEvents_FailToCompleteTradeEventHandler FailToCompleteTrade; + + public virtual extern event IWorldEvents_ApproachVendorEventHandler ApproachVendor; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + public virtual extern double Distance2D(int GUID1, int GUID2); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + public virtual extern double Distance3D(int GUID1, int GUID2); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnum.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnum.cs new file mode 100644 index 0000000..1f01517 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnum.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[CoClass(typeof(WorldEnumClass))] +[Guid("00020404-0000-0000-C000-000000000046")] +public interface WorldEnum : IEnumVARIANT +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnumClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnumClass.cs new file mode 100644 index 0000000..037a440 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldEnumClass.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("87247FF4-5722-4010-BDBB-AF628BADA995")] +[TypeLibType(18)] +public class WorldEnumClass : IEnumVARIANT, WorldEnum +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Next([In] uint celt, [In][MarshalAs(UnmanagedType.Struct)] ref object rgvar, out uint pceltFetched); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Skip([In] uint celt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Clone([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] out IEnumerator ppenum); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIterator.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIterator.cs new file mode 100644 index 0000000..ff0201e --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIterator.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("6FC29250-9FB4-4A0C-AF16-329E35DF02F2")] +[CoClass(typeof(WorldIteratorClass))] +public interface WorldIterator : IWorldIterator +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIteratorClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIteratorClass.cs new file mode 100644 index 0000000..fe9a1ef --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldIteratorClass.cs @@ -0,0 +1,94 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[TypeLibType(2)] +[Guid("2681B113-294E-4ABF-B543-624194846BE1")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class WorldIteratorClass : IWorldIterator, WorldIterator, IEnumerable +{ + [DispId(1)] + public virtual extern WorldObject Next_Old + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(3)] + public virtual extern int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(12)] + public virtual extern int Quantity + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + public virtual extern bool Next([In][Out][MarshalAs(UnmanagedType.Interface)] ref WorldObject ppObject); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + public virtual extern void ByName([MarshalAs(UnmanagedType.BStr)] string strName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + public virtual extern void ByNameSubstring([MarshalAs(UnmanagedType.BStr)] string strSubstring); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + public virtual extern void ByObjectClass(eObjectClass Class); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + public virtual extern void ByAll(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + public virtual extern void ByInventory(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + public virtual extern void ByContainer(int nContainer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + public virtual extern void ByOwner(int nOwner); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + public virtual extern void ByLandscape(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + public virtual extern void ByCategory(int nCategory); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(1)] + [DispId(-4)] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public virtual extern IEnumerator GetEnumerator(); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObject.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObject.cs new file mode 100644 index 0000000..3eeeb2b --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObject.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("3DDD1391-FDDB-4C43-BA28-8F624E021F05")] +[CoClass(typeof(WorldObjectClass))] +public interface WorldObject : IWorldObject +{ +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObjectClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObjectClass.cs new file mode 100644 index 0000000..4c00475 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/WorldObjectClass.cs @@ -0,0 +1,185 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Filters; + +[ComImport] +[Guid("50A7E9EC-AB12-4484-9C28-C2A39274A636")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[DefaultMember("GUID")] +public class WorldObjectClass : IWorldObject, WorldObject +{ + [DispId(0)] + public virtual extern int GUID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(0)] + get; + } + + [DispId(4)] + public virtual extern eObjectClass ObjectClass + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(7)] + public virtual extern bool HasIdData + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + } + + [DispId(8)] + public virtual extern int LastIdTime + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + } + + [DispId(17)] + public virtual extern string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(18)] + public virtual extern int PhysicsDataFlags + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + get; + } + + [DispId(19)] + public virtual extern int GameDataFlags1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + get; + } + + [DispId(20)] + public virtual extern int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + get; + } + + [DispId(21)] + public virtual extern int Icon + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + get; + } + + [DispId(22)] + public virtual extern int Category + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + get; + } + + [DispId(23)] + public virtual extern int Behavior + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + get; + } + + [DispId(25)] + public virtual extern int Container + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern bool Offset(out double x, out double y, out double z); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + public virtual extern bool Coordinates([In][Out] ref double NorthSouth, [In][Out] ref double EastWest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + public virtual extern bool RawCoordinates([In][Out] ref double pX, [In][Out] ref double pY, ref double pZ); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + public virtual extern int Spell([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + public virtual extern bool Orientation(out double w, out double x, out double y, out double z); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + public virtual extern int Longs([In] LongValueKey index, int defVal = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + public virtual extern double Doubles([In] DoubleValueKey index, double defVal = 0.0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + public virtual extern bool Bools([In] BoolValueKey index, bool defVal = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [return: MarshalAs(UnmanagedType.BStr)] + public virtual extern string Strings([In] StringValueKey index, [MarshalAs(UnmanagedType.BStr)] string defVal = ""); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + public virtual extern bool LongExists([In] LongValueKey index, out int pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + public virtual extern bool DoubleExists([In] DoubleValueKey index, out double pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + public virtual extern bool BoolExists([In] BoolValueKey index, out bool pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + public virtual extern bool StringExists([In] StringValueKey index, [MarshalAs(UnmanagedType.BStr)] out string pValue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + public virtual extern int ActiveSpell([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + public virtual extern int EnumBoolKey([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + public virtual extern int EnumLongKey([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + public virtual extern int EnumDoubleKey([In] int index); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + public virtual extern int EnumStringKey([In] int index); +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAttributeID.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAttributeID.cs new file mode 100644 index 0000000..fbfc81d --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAttributeID.cs @@ -0,0 +1,12 @@ +namespace Decal.Interop.Filters; + +public enum eAttributeID +{ + eAttrStrength = 1, + eAttrEndurance = 2, + eAttrQuickness = 3, + eAttrCoordination = 4, + eAttrFocus = 5, + eAttrSelf = 6, + eAttrNULL = 255 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAugmentations.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAugmentations.cs new file mode 100644 index 0000000..b79c63a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eAugmentations.cs @@ -0,0 +1,66 @@ +namespace Decal.Interop.Filters; + +public enum eAugmentations +{ + eReinforcementLugians = 218, + eBleearghFortitude = 219, + eOswaldEnchancement = 220, + eSiraluunBlessing = 221, + eEnduringCalm = 222, + eSteadfastWill = 223, + eCiandraEssence = 224, + eYoshiEssence = 225, + eJibrilEssence = 226, + eCeldisethEssence = 227, + eKogaEssence = 228, + eShadowSeventhMule = 229, + eMightSeventhMule = 230, + eClutchMiser = 231, + eEnduringEnchantment = 232, + eCriticalProtection = 233, + eQuickLearner = 234, + eCiandraFortune = 235, + eCharmedSmith = 236, + eInnateRenewal = 237, + eArchmageEndurance = 238, + eBladeTurner = 240, + eArrowTurner = 241, + eMaceTurner = 242, + eCausticEnhancement = 243, + eFieryEnchancment = 244, + eIcyEnchancement = 245, + eLightningEnhancement = 246, + eInfusedCreature = 294, + eInfusedItem = 295, + eInfusedLife = 296, + eInfusedWar = 297, + eEyeRemorseless = 298, + eHandRemorseless = 299, + eMasterSteelCircle = 300, + eMasterFocusedEyed = 301, + eMasterFiveFoldPath = 302, + eFrenzySlayer = 309, + eIronSkinInvincible = 310, + eJackOfAllTrades = 326, + eInfusedVoid = 328, + eUnknownAug1 = 328, + eUnknownAug2 = 329, + eUnknownAug3 = 330, + eUnknownAug4 = 331, + eUnknownAug5 = 332, + eAuraValor = 333, + eAuraProtection = 334, + eAuraGlory = 335, + eAuraTemperance = 336, + eUnknownAug6 = 337, + eAuraAethericVision = 338, + eAuraManaFlow = 339, + eAuraManaInfusion = 340, + eUnknownAug7 = 340, + eAuraVitality = 341, + eUnknownAug8 = 341, + eAuraPurity = 342, + eAuraCraftsman = 343, + eAuraSpecialization = 344, + eAuraWorld = 365 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eObjectClass.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eObjectClass.cs new file mode 100644 index 0000000..a04980d --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eObjectClass.cs @@ -0,0 +1,49 @@ +namespace Decal.Interop.Filters; + +public enum eObjectClass +{ + eUnknown, + eMeleeWeapon, + eArmor, + eClothing, + eJewelry, + eMonster, + eFood, + eMoney, + eMisc, + eMissileWeapon, + eContainer, + eGem, + eSpellComponent, + eKey, + ePortal, + eTradeNote, + eManaStone, + ePlant, + eBaseCooking, + eBaseAlchemy, + eBaseFletching, + eCraftedCooking, + eCraftedAlchemy, + eCraftedFletching, + ePlayer, + eVendor, + eDoor, + eCorpse, + eLifestone, + eHealingKit, + eLockpick, + eWandStaffOrb, + eBundle, + eBook, + eJournal, + eSign, + eHousing, + eNPC, + eFoci, + eSalvage, + eUst, + eServices, + eScroll, + eNumObjectClasses +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eSkillID.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eSkillID.cs new file mode 100644 index 0000000..936839a --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eSkillID.cs @@ -0,0 +1,54 @@ +namespace Decal.Interop.Filters; + +public enum eSkillID +{ + eSkillAxe = 1, + eSkillBow = 2, + eSkillCrossbow = 3, + eSkillDagger = 4, + eSkillMace = 5, + eSkillMeleeDefense = 6, + eSkillMissileDefense = 7, + eSkillSpear = 9, + eSkillStaff = 10, + eSkillSword = 11, + eSkillThrownWeapons = 12, + eSkillUnarmed = 13, + eSkillArcaneLore = 14, + eSkillMagicDefense = 15, + eSkillManaConversion = 16, + eSkillItemTinkering = 18, + eSkillAssessPerson = 19, + eSkillDeception = 20, + eSkillHealing = 21, + eSkillJump = 22, + eSkillLockpick = 23, + eSkillRun = 24, + eSkillAssessCreature = 27, + eSkillWeaponTinkering = 28, + eSkillArmorTinkering = 29, + eSkillMagicItemTinkering = 30, + eSkillCreatureEnchantment = 31, + eSkillItemEnchantment = 32, + eSkillLifeMagic = 33, + eSkillWarMagic = 34, + eSkillLeadership = 35, + eSkillLoyalty = 36, + eSkillFletching = 37, + eSkillAlchemy = 38, + eSkillCooking = 39, + eSkillSalvaging = 40, + eSkillTwoHandedCombat = 41, + eSkillGearcraft = 42, + eSkillVoidMagic = 43, + eSkillHeavyWeapons = 44, + eSkillLightWeapons = 45, + eSkillFinesseWeapons = 46, + eSkillMissileWeapons = 47, + eSkillShield = 48, + eSkillDualWield = 49, + eSkillRecklessness = 50, + eSkillSneakAttack = 51, + eSkillDirtyFighting = 52, + eSkillSummoning = 54 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStatisticType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStatisticType.cs new file mode 100644 index 0000000..8f601a6 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStatisticType.cs @@ -0,0 +1,12 @@ +namespace Decal.Interop.Filters; + +public enum eStatisticType +{ + eStatBurden = 5, + eStatPyreal = 20, + eStatExperience = 21, + eStatUnassignedExp = 22, + eStatUnassignedSkillPoints = 24, + eStatLevel = 25, + eStatRank = 30 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStringType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStringType.cs new file mode 100644 index 0000000..c8f08e7 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eStringType.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Filters; + +public enum eStringType +{ + eStringName = 1, + eStringGender = 3, + eStringRace = 4, + eStringClass = 5 +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eTrainingType.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eTrainingType.cs new file mode 100644 index 0000000..dbca01f --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eTrainingType.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Filters; + +public enum eTrainingType +{ + eTrainUnusable, + eTrainUntrained, + eTrainTrained, + eTrainSpecialized +} diff --git a/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eVitalID.cs b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eVitalID.cs new file mode 100644 index 0000000..b55e042 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Decal.Interop.Filters/eVitalID.cs @@ -0,0 +1,8 @@ +namespace Decal.Interop.Filters; + +public enum eVitalID +{ + eHealth = 2, + eStamina = 4, + eMana = 6 +} diff --git a/Managed/Decal.Interop.Filters/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Filters/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5daa3c4 --- /dev/null +++ b/Managed/Decal.Interop.Filters/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: TypeLibVersion(2, 0)] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: Guid("da16daa9-7f16-45d9-a59f-8c45a7f2acb1")] +[assembly: ImportedFromTypeLib("DecalFilters")] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject.csproj b/Managed/Decal.Interop.Inject/Decal.Interop.Inject.csproj new file mode 100644 index 0000000..e1b6cb6 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject.csproj @@ -0,0 +1,8 @@ + + + Decal.Interop.Inject + + + + + diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImage.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImage.cs new file mode 100644 index 0000000..2f4d213 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImage.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("50CDFD25-4F3B-4412-96BE-947A6C7B93A2")] +[CoClass(typeof(BrushImageClass))] +public interface BrushImage : IBrushImage +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImageClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImageClass.cs new file mode 100644 index 0000000..76d5d43 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/BrushImageClass.cs @@ -0,0 +1,41 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("918C0333-5714-4C8D-A95C-2C137B76D364")] +public class BrushImageClass : IBrushImage, BrushImage, IImageCache +{ + [DispId(1610678272)] + public virtual extern int Color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + public virtual extern tagSIZE Size + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void PatBlt([MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagRECT prcDest, ref tagPOINT ptOrigin); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StretchBlt([MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagPOINT pptDest, int nWidth, int nStartStretch, int nEndStretch); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Blt(ref tagRECT rcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagPOINT pptDest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StretchBltArea(ref tagRECT prcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagRECT prcDest); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Button.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Button.cs new file mode 100644 index 0000000..0e6b031 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Button.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[CoClass(typeof(ButtonClass))] +[Guid("0F5765A4-9F83-4077-8884-6CBDDCE348F7")] +public interface Button : IButton, ICommandEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ButtonClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ButtonClass.cs new file mode 100644 index 0000000..721b55b --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ButtonClass.cs @@ -0,0 +1,95 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("C22BF2FC-F144-4D17-9C12-A344F980BB17")] +[TypeLibType(2)] +[ComSourceInterfaces("Decal.Interop.Inject.ICommandEvents\0\0")] +public class ButtonClass : IButton, Button, ICommandEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(102)] + public virtual extern int Matte + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event ICommandEvents_DestroyEventHandler Destroy; + + public virtual extern event ICommandEvents_HitEventHandler Hit; + + public virtual extern event ICommandEvents_UnhitEventHandler Unhit; + + public virtual extern event ICommandEvents_AcceptedEventHandler Accepted; + + public virtual extern event ICommandEvents_CanceledEventHandler Canceled; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + public virtual extern void SetImages(int nModule, int nReleased, int nPressed); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + public virtual extern void SetBackground(int nBackground); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Canvas.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Canvas.cs new file mode 100644 index 0000000..407025d --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Canvas.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("9241862D-BA71-4317-8166-3A3E61CE3E5F")] +[CoClass(typeof(CanvasClass))] +public interface Canvas : ICanvas +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/CanvasClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/CanvasClass.cs new file mode 100644 index 0000000..4300340 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/CanvasClass.cs @@ -0,0 +1,109 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("91892F16-31A3-4E23-9CFD-89A5A5174A59")] +[ComConversionLoss] +[ClassInterface(ClassInterfaceType.None)] +[SuppressUnmanagedCodeSecurity] +public class CanvasClass : ICanvas, Canvas +{ + [DispId(1610678280)] + public virtual extern bool WasLost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678281)] + public virtual extern tagSIZE Size + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678289)] + public virtual extern int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern bool PushClipRect(ref tagRECT prc); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void PopClipRect(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [return: ComAliasName("Decal.Interop.Inject.wireHDC")] + public virtual extern IntPtr GetDC(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void ReleaseDC(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object GetSurface(ref Guid riid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Fill(ref tagRECT prc, int nRGB); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Frame(ref tagRECT prc, int nRGB); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern ClipParams GetClipParams(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Blt(ref tagRECT prcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pSrc, ref tagPOINT pptDest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern bool HitTest(ref tagPOINT ppt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void ToClient([In][Out] ref tagPOINT pt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void ToScreen([In][Out] ref tagPOINT ppt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern bool OffsetOrg(ref tagPOINT ppt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern bool SetClipRect(ref tagRECT prcClip); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern ushort DownMixRGB(ushort wRed, ushort wGreen, ushort wBlue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + public virtual extern int GetDCLong(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void SetTransparentColor([In] int TransColor); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern int GetTransparentColor(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StretchBlt(ref tagRECT prcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pSrc, ref tagRECT prcDest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void UpdateInternalSurface([MarshalAs(UnmanagedType.IUnknown)] object pNew); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void PushUseColorKeyedBlt([In] bool newVal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void PopUseColorKeyedBlt(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ClipParams.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ClipParams.cs new file mode 100644 index 0000000..361d3a0 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ClipParams.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct ClipParams +{ + public tagRECT window; + + public tagPOINT org; + + public short visible; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBarManager.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBarManager.cs new file mode 100644 index 0000000..98b37d9 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBarManager.cs @@ -0,0 +1,42 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("E4CCDC92-8658-4CAA-8955-FB891D5BDCF7")] +public interface IBarManager +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void AddBar(int nViewID, [MarshalAs(UnmanagedType.BStr)] string Title, ref ViewParams pParams); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void RemoveBar(int nViewID); + + [DispId(1610678274)] + ViewParams Bar + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678276)] + string BarTitle + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Reformat(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBrushImage.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBrushImage.cs new file mode 100644 index 0000000..497709d --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IBrushImage.cs @@ -0,0 +1,22 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(1)] +[Guid("50CDFD25-4F3B-4412-96BE-947A6C7B93A2")] +[SuppressUnmanagedCodeSecurity] +public interface IBrushImage +{ + [DispId(1610678272)] + int Color + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IButton.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IButton.cs new file mode 100644 index 0000000..d310db1 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IButton.cs @@ -0,0 +1,61 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("0F5765A4-9F83-4077-8884-6CBDDCE348F7")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IButton : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(101)] + void SetImages(int nModule, int nReleased, int nPressed); + + [DispId(102)] + int Matte + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(102)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(103)] + void SetBackground(int nBackground); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICanvas.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICanvas.cs new file mode 100644 index 0000000..4fbb052 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICanvas.cs @@ -0,0 +1,109 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("9241862D-BA71-4317-8166-3A3E61CE3E5F")] +[InterfaceType(1)] +[ComConversionLoss] +public interface ICanvas +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool PushClipRect(ref tagRECT prc); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PopClipRect(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [return: ComAliasName("Decal.Interop.Inject.wireHDC")] + IntPtr GetDC(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ReleaseDC(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object GetSurface(ref Guid riid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Fill(ref tagRECT prc, int nRGB); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Frame(ref tagRECT prc, int nRGB); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + ClipParams GetClipParams(); + + [DispId(1610678280)] + bool WasLost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678281)] + tagSIZE Size + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Blt(ref tagRECT prcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pSrc, ref tagPOINT pptDest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool HitTest(ref tagPOINT ppt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ToClient([In][Out] ref tagPOINT pt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ToScreen([In][Out] ref tagPOINT ppt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool OffsetOrg(ref tagPOINT ppt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool SetClipRect(ref tagRECT prcClip); + + [DispId(1610678289)] + int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + ushort DownMixRGB(ushort wRed, ushort wGreen, ushort wBlue); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + int GetDCLong(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SetTransparentColor([In] int TransColor); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + int GetTransparentColor(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StretchBlt(ref tagRECT prcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pSrc, ref tagRECT prcDest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void UpdateInternalSurface([MarshalAs(UnmanagedType.IUnknown)] object pNew); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PushUseColorKeyedBlt([In] bool newVal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PopUseColorKeyedBlt(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents.cs new file mode 100644 index 0000000..a8d0bdb --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents.cs @@ -0,0 +1,33 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("F029D3A1-29AF-45EF-927E-729FEDD87403")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(2)] +[TypeLibType(4096)] +public interface ICommandEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void Hit(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void Unhit(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void Accepted(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + void Canceled(int nID); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_AcceptedEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_AcceptedEventHandler.cs new file mode 100644 index 0000000..5b51531 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_AcceptedEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void ICommandEvents_AcceptedEventHandler(int nID); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_CanceledEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_CanceledEventHandler.cs new file mode 100644 index 0000000..d4bac78 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_CanceledEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void ICommandEvents_CanceledEventHandler(int nID); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..fd8a94b --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void ICommandEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_Event.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_Event.cs new file mode 100644 index 0000000..f2cd497 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_Event.cs @@ -0,0 +1,18 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +[TypeLibType(16)] +public interface ICommandEvents_Event +{ + event ICommandEvents_DestroyEventHandler Destroy; + + event ICommandEvents_HitEventHandler Hit; + + event ICommandEvents_UnhitEventHandler Unhit; + + event ICommandEvents_AcceptedEventHandler Accepted; + + event ICommandEvents_CanceledEventHandler Canceled; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_EventProvider.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_EventProvider.cs new file mode 100644 index 0000000..03f68a2 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_EventProvider.cs @@ -0,0 +1,458 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Inject; + +internal sealed class ICommandEvents_EventProvider : ICommandEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 161, 211, 41, 240, 175, 41, 239, 69, 146, 126, + 114, 159, 237, 216, 116, 3 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event ICommandEvents_DestroyEventHandler ICommandEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_DestroyDelegate != null && ((commandEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_HitEventHandler ICommandEvents_Event.Hit + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_HitDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_HitDelegate != null && ((commandEvents_SinkHelper.m_HitDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_UnhitEventHandler ICommandEvents_Event.Unhit + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_UnhitDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_UnhitDelegate != null && ((commandEvents_SinkHelper.m_UnhitDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_AcceptedEventHandler ICommandEvents_Event.Accepted + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_AcceptedDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_AcceptedDelegate != null && ((commandEvents_SinkHelper.m_AcceptedDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event ICommandEvents_CanceledEventHandler ICommandEvents_Event.Canceled + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ICommandEvents_SinkHelper commandEvents_SinkHelper = new ICommandEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(commandEvents_SinkHelper, out pdwCookie); + commandEvents_SinkHelper.m_dwCookie = pdwCookie; + commandEvents_SinkHelper.m_CanceledDelegate = value; + m_aEventSinkHelpers.Add(commandEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (commandEvents_SinkHelper.m_CanceledDelegate != null && ((commandEvents_SinkHelper.m_CanceledDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public ICommandEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + ICommandEvents_SinkHelper commandEvents_SinkHelper = (ICommandEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(commandEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_HitEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_HitEventHandler.cs new file mode 100644 index 0000000..af7a847 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_HitEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void ICommandEvents_HitEventHandler(int nID); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_SinkHelper.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_SinkHelper.cs new file mode 100644 index 0000000..024c685 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_SinkHelper.cs @@ -0,0 +1,76 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class ICommandEvents_SinkHelper : ICommandEvents +{ + public ICommandEvents_DestroyEventHandler m_DestroyDelegate; + + public ICommandEvents_HitEventHandler m_HitDelegate; + + public ICommandEvents_UnhitEventHandler m_UnhitDelegate; + + public ICommandEvents_AcceptedEventHandler m_AcceptedDelegate; + + public ICommandEvents_CanceledEventHandler m_CanceledDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Hit(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_HitDelegate != null) + { + m_HitDelegate(P_0); + } + } + + public void Unhit(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_UnhitDelegate != null) + { + m_UnhitDelegate(P_0); + } + } + + public void Accepted(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_AcceptedDelegate != null) + { + m_AcceptedDelegate(P_0); + } + } + + public void Canceled(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_CanceledDelegate != null) + { + m_CanceledDelegate(P_0); + } + } + + internal ICommandEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_HitDelegate = null; + m_UnhitDelegate = null; + m_AcceptedDelegate = null; + m_CanceledDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_UnhitEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_UnhitEventHandler.cs new file mode 100644 index 0000000..737c7e8 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ICommandEvents_UnhitEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void ICommandEvents_UnhitEventHandler(int nID); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControl.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControl.cs new file mode 100644 index 0000000..691539b --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControl.cs @@ -0,0 +1,41 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("996B377C-1953-4DB1-AAC1-157F72592D3E")] +public interface IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControlEvents.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControlEvents.cs new file mode 100644 index 0000000..1195227 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IControlEvents.cs @@ -0,0 +1,17 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("2FEBCBC3-488C-444F-AD08-5D3097D2D1ED")] +[TypeLibType(4096)] +public interface IControlEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IFontCache.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IFontCache.cs new file mode 100644 index 0000000..286502d --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IFontCache.cs @@ -0,0 +1,24 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[TypeLibType(4096)] +[SuppressUnmanagedCodeSecurity] +[Guid("12ECCB0F-36A6-451C-B086-1306B74AAEC2")] +public interface IFontCache +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void DecalDrawText(ref tagPOINT pt, [MarshalAs(UnmanagedType.BStr)] string szText, int clr, [MarshalAs(UnmanagedType.Interface)] Canvas pTarget); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + tagSIZE MeasureText([MarshalAs(UnmanagedType.BStr)] string szText); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + int HitTest([MarshalAs(UnmanagedType.BStr)] string szText, int nPos); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void DecalDrawTextEx(ref tagPOINT pt, [MarshalAs(UnmanagedType.BStr)] string szText, int clr1, int clr2, int flags, [MarshalAs(UnmanagedType.Interface)] Canvas pTarget); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IIconCache.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IIconCache.cs new file mode 100644 index 0000000..1239b20 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IIconCache.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(1)] +[Guid("DEDCD5AA-F6CA-4DA5-A657-E82F126ABBCD")] +[SuppressUnmanagedCodeSecurity] +public interface IIconCache +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void DrawIcon(ref tagPOINT ppt, int nFile, int nModule, [MarshalAs(UnmanagedType.Interface)] Canvas pTarget); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void DrawIconEx(ref tagPOINT ppt, int nFile, int nModule, [MarshalAs(UnmanagedType.Interface)] Canvas pTarget, int lColor); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IImageCache.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IImageCache.cs new file mode 100644 index 0000000..df84603 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IImageCache.cs @@ -0,0 +1,32 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("BE566CEC-6881-481C-A146-9F5A32576BE6")] +[TypeLibType(4096)] +[SuppressUnmanagedCodeSecurity] +public interface IImageCache +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PatBlt([MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagRECT prcDest, ref tagPOINT ptOrigin); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StretchBlt([MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagPOINT pptDest, int nWidth, int nStartStretch, int nEndStretch); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Blt(ref tagRECT rcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagPOINT pptDest); + + [DispId(1610743811)] + tagSIZE Size + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StretchBltArea(ref tagRECT prcSrc, [MarshalAs(UnmanagedType.Interface)] Canvas pDest, ref tagRECT prcDest); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IInputNotify.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IInputNotify.cs new file mode 100644 index 0000000..7c1fba8 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IInputNotify.cs @@ -0,0 +1,28 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("E288C465-2DD6-4FCD-95E2-5BBC1A1D2D32")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +public interface IInputNotify +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void NotifyBegin(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void NotifyEnd(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void SetMousePos(int nX, int nY); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void NotifyPause(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayer.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayer.cs new file mode 100644 index 0000000..23f84e7 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayer.cs @@ -0,0 +1,33 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("0D63504F-DEEF-4A2D-9742-28DD1BADDA7C")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface ILayer +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void LayerCreate([MarshalAs(UnmanagedType.Interface)] Layer pSite); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void LayerDestroy(); + + [DispId(1610678274)] + tagRECT Position + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: Out] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Invalidate(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerKeyboard.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerKeyboard.cs new file mode 100644 index 0000000..01d7040 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerKeyboard.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("7500929F-4251-4373-B978-286A8A8BECED")] +[InterfaceType(1)] +[SuppressUnmanagedCodeSecurity] +public interface ILayerKeyboard +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void KeyboardChar(ref KeyState pKS); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void KeyboardEndCapture(bool bCancel); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void KeyboardEvent(int nMsg, int wParam, int lParam); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerMouse.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerMouse.cs new file mode 100644 index 0000000..2b98dd2 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerMouse.cs @@ -0,0 +1,33 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("5014E0B2-9156-412C-946D-9D4BAA9F4C51")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface ILayerMouse +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MouseEnter(ref MouseState pMouse); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MouseExit(ref MouseState pMouse); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MouseDown(ref MouseState pMouse); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MouseUp(ref MouseState pMouse); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MouseMove(ref MouseState pMouse); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MouseDblClk(ref MouseState pMouse); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MouseEvent(int nMsg, int wParam, int lParam); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerPopup.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerPopup.cs new file mode 100644 index 0000000..a674f2a --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerPopup.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("22072A97-E5E6-4D91-A344-807235BFA5D8")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface ILayerPopup +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool PopupCancel(ref MouseState pMouse); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerRender.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerRender.cs new file mode 100644 index 0000000..0267bd8 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerRender.cs @@ -0,0 +1,27 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("D1C71B85-62C2-42A3-AE2E-4BF5A6BE1784")] +public interface ILayerRender +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PreRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void render([MarshalAs(UnmanagedType.Interface)] Canvas pDest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Reformat(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool AdjustRenderArea([MarshalAs(UnmanagedType.Interface)] Canvas pDest); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool HitTest(ref tagPOINT pt); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSchema.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSchema.cs new file mode 100644 index 0000000..d3a3ac4 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSchema.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(1)] +[Guid("829E0FB2-D0B5-4814-BCF9-6ECFA06C9AED")] +[SuppressUnmanagedCodeSecurity] +public interface ILayerSchema +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SchemaLoad([MarshalAs(UnmanagedType.Interface)] View pView, [MarshalAs(UnmanagedType.IUnknown)] object pXMLSchema); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSite.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSite.cs new file mode 100644 index 0000000..94e6c48 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerSite.cs @@ -0,0 +1,119 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("5B7E9D99-BB3A-475D-842D-43EBEA8284EA")] +[InterfaceType(1)] +[SuppressUnmanagedCodeSecurity] +public interface ILayerSite +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Destroy(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CreateChild(ref LayerParams @params, [MarshalAs(UnmanagedType.Interface)] ILayer pSink); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void GetSink(ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] ref object ppvItf); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Invalidate(); + + [DispId(1610678276)] + PluginSite PluginSite + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Reformat(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void GetParentSink(ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] ref object ppvItf); + + [DispId(1610678279)] + tagRECT Position + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678281)] + int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678282)] + int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678283)] + Layer Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CaptureKeyboard(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool IsChild([MarshalAs(UnmanagedType.Interface)] Layer pSite, bool bTestUnclipped = false); + + [DispId(1610678286)] + bool Popup + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678287)] + tagRECT ScreenPosition + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StartTimer(int nID, int nInterval); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void EndTimer(int nID); + + [DispId(1610678290)] + bool Transparent + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678292)] + int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void moveToFront(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerTimer.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerTimer.cs new file mode 100644 index 0000000..5cca912 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ILayerTimer.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("5D6B8A1B-321A-479F-9347-55725BDA3DA9")] +[InterfaceType(1)] +[SuppressUnmanagedCodeSecurity] +public interface ILayerTimer +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool TimerTimeout(int nID, int nInterval, int nReps); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPager.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPager.cs new file mode 100644 index 0000000..c0c67fa --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPager.cs @@ -0,0 +1,66 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("BD9FC464-C0D8-4823-8255-E818F8836B08")] +[TypeLibType(4096)] +public interface IPager : IControl +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [DispId(2)] + new int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + new int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + new IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void FinishCommand(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ScrollTo(ref tagPOINT ppt); + + [DispId(1610809346)] + int Command + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610809348)] + tagPOINT Offset + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void CreateClient([MarshalAs(UnmanagedType.Interface)] ILayer pLayer); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents.cs new file mode 100644 index 0000000..668b28a --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents.cs @@ -0,0 +1,25 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[TypeLibType(4096)] +[InterfaceType(2)] +[Guid("7499EB61-6992-4E21-8A55-CF44D44C0A07")] +[SuppressUnmanagedCodeSecurity] +public interface IPagerEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Destroy(int nID); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Change(int nID, int nCommand, int nX, int nY); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + bool GetNextPosition(int nID, int nCommand, [In][Out] ref int nX, [In][Out] ref int nY); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_ChangeEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_ChangeEventHandler.cs new file mode 100644 index 0000000..83228c0 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_ChangeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void IPagerEvents_ChangeEventHandler(int nID, int nCommand, int nX, int nY); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_DestroyEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_DestroyEventHandler.cs new file mode 100644 index 0000000..fbcdf57 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_DestroyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void IPagerEvents_DestroyEventHandler(int nID); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_Event.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_Event.cs new file mode 100644 index 0000000..e1b6a8d --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_Event.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IPagerEvents_Event +{ + event IPagerEvents_DestroyEventHandler Destroy; + + event IPagerEvents_ChangeEventHandler Change; + + event IPagerEvents_GetNextPositionEventHandler GetNextPosition; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_EventProvider.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_EventProvider.cs new file mode 100644 index 0000000..7eea2f1 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_EventProvider.cs @@ -0,0 +1,306 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Inject; + +internal sealed class IPagerEvents_EventProvider : IPagerEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 97, 235, 153, 116, 146, 105, 33, 78, 138, 85, + 207, 68, 212, 76, 10, 7 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IPagerEvents_DestroyEventHandler IPagerEvents_Event.Destroy + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IPagerEvents_SinkHelper pagerEvents_SinkHelper = new IPagerEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(pagerEvents_SinkHelper, out pdwCookie); + pagerEvents_SinkHelper.m_dwCookie = pdwCookie; + pagerEvents_SinkHelper.m_DestroyDelegate = value; + m_aEventSinkHelpers.Add(pagerEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IPagerEvents_SinkHelper pagerEvents_SinkHelper = (IPagerEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (pagerEvents_SinkHelper.m_DestroyDelegate != null && ((pagerEvents_SinkHelper.m_DestroyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(pagerEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IPagerEvents_ChangeEventHandler IPagerEvents_Event.Change + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IPagerEvents_SinkHelper pagerEvents_SinkHelper = new IPagerEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(pagerEvents_SinkHelper, out pdwCookie); + pagerEvents_SinkHelper.m_dwCookie = pdwCookie; + pagerEvents_SinkHelper.m_ChangeDelegate = value; + m_aEventSinkHelpers.Add(pagerEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IPagerEvents_SinkHelper pagerEvents_SinkHelper = (IPagerEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (pagerEvents_SinkHelper.m_ChangeDelegate != null && ((pagerEvents_SinkHelper.m_ChangeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(pagerEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IPagerEvents_GetNextPositionEventHandler IPagerEvents_Event.GetNextPosition + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IPagerEvents_SinkHelper pagerEvents_SinkHelper = new IPagerEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(pagerEvents_SinkHelper, out pdwCookie); + pagerEvents_SinkHelper.m_dwCookie = pdwCookie; + pagerEvents_SinkHelper.m_GetNextPositionDelegate = value; + m_aEventSinkHelpers.Add(pagerEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IPagerEvents_SinkHelper pagerEvents_SinkHelper = (IPagerEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (pagerEvents_SinkHelper.m_GetNextPositionDelegate != null && ((pagerEvents_SinkHelper.m_GetNextPositionDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(pagerEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IPagerEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IPagerEvents_SinkHelper pagerEvents_SinkHelper = (IPagerEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(pagerEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_GetNextPositionEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_GetNextPositionEventHandler.cs new file mode 100644 index 0000000..66fc6ae --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_GetNextPositionEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate bool IPagerEvents_GetNextPositionEventHandler(int nID, int nCommand, [In][Out] ref int nX, [In][Out] ref int nY); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_SinkHelper.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_SinkHelper.cs new file mode 100644 index 0000000..2aba1f6 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPagerEvents_SinkHelper.cs @@ -0,0 +1,53 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IPagerEvents_SinkHelper : IPagerEvents +{ + public IPagerEvents_DestroyEventHandler m_DestroyDelegate; + + public IPagerEvents_ChangeEventHandler m_ChangeDelegate; + + public IPagerEvents_GetNextPositionEventHandler m_GetNextPositionDelegate; + + public int m_dwCookie; + + public void Destroy(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DestroyDelegate != null) + { + m_DestroyDelegate(P_0); + } + } + + public void Change(int P_0, int P_1, int P_2, int P_3) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_ChangeDelegate != null) + { + m_ChangeDelegate(P_0, P_1, P_2, P_3); + } + } + + public bool GetNextPosition(int P_0, int P_1, ref int P_2, ref int P_3) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_GetNextPositionDelegate != null) + { + return m_GetNextPositionDelegate(P_0, P_1, ref P_2, ref P_3); + } + return false; + } + + internal IPagerEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DestroyDelegate = null; + m_ChangeDelegate = null; + m_GetNextPositionDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanel.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanel.cs new file mode 100644 index 0000000..a4d6979 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanel.cs @@ -0,0 +1,66 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("2B52B5CB-9E10-4238-8F62-A501406E3EAB")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[ComConversionLoss] +public interface IPanel +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void AddView(int nViewID, [MarshalAs(UnmanagedType.Interface)] ILayer pLayer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ActivateView(int nViewID, ref ViewParams pParams, ref int pVal); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void RemoveView(int nViewID); + + [DispId(1610678275)] + int ActiveView + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void LoadView(int nViewID, [MarshalAs(UnmanagedType.Interface)] View pView, [MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Deactivate(); + + [DispId(1610678278)] + IPanelSink Sink + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void LoadViewEx(int nViewID, [MarshalAs(UnmanagedType.Interface)] View pView, [MarshalAs(UnmanagedType.IUnknown)] object pSchema, int lViewFlags); + + [DispId(1610678280)] + bool Transparent + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678282)] + IntPtr @params + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanelSink.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanelSink.cs new file mode 100644 index 0000000..5bca31a --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPanelSink.cs @@ -0,0 +1,15 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("85D70924-917D-41BB-995D-C40E6AB21C71")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IPanelSink +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PanelDeactivate(int nViewID); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPlugin.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPlugin.cs new file mode 100644 index 0000000..4d7211d --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPlugin.cs @@ -0,0 +1,26 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(1)] +[SuppressUnmanagedCodeSecurity] +[Guid("0B43A5E9-2ED4-4A0C-AED1-552B9E3A23B3")] +public interface IPlugin +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Initialize([MarshalAs(UnmanagedType.Interface)] PluginSite pSite, int nID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Terminate(); + + [DispId(1610678274)] + string FriendlyName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginAdapterV1.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginAdapterV1.cs new file mode 100644 index 0000000..fab48bf --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginAdapterV1.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("93D72C31-CBC3-4471-AE4B-395FBB4D3B45")] +[InterfaceType(1)] +public interface IPluginAdapterV1 +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginSite.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginSite.cs new file mode 100644 index 0000000..fc4e935 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IPluginSite.cs @@ -0,0 +1,151 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(1)] +[SuppressUnmanagedCodeSecurity] +[Guid("E9D10D39-63A9-478B-81FE-0045BA0593EF")] +public interface IPluginSite +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + void UnloadPlugin(int nID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + Canvas GetPrimarySurface(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object Get3DDevice(ref Guid ifaceid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IImageCache LoadBitmapFile([MarshalAs(UnmanagedType.BStr)] string strFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IIconCache GetIconCache(ref tagSIZE psz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IImageCache LoadBitmapPortal(int nFile); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IFontCache DecalCreateFont([MarshalAs(UnmanagedType.BStr)] string szFaceName, int nHeight, int dwFlags); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void GetScreenSize(ref tagSIZE sz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + Canvas CreateCanvas(ref tagSIZE psz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + View CreateView([MarshalAs(UnmanagedType.BStr)] string Title, ref ViewParams pParams, [MarshalAs(UnmanagedType.Interface)] ILayer pLayer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + View LoadView([MarshalAs(UnmanagedType.BStr)] string strSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IImageCache CreateBrushImage(int nColor); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IImageCache LoadImageSchema([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IFontCache CreateFontSchema(int nDefHeight, int nDefOptions, [MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + int LoadResourceModule([MarshalAs(UnmanagedType.BStr)] string strLibrary); + + [DispId(1610678287)] + string ResourcePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678288)] + object Plugin + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [DispId(1610678289)] + object NetworkFilter + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + View LoadViewObject([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [DispId(1610678291)] + int HWND + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678292)] + bool Focus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678293)] + int OldWndProc + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + int QueryKeyboardMap([In][MarshalAs(UnmanagedType.BStr)] string bstrName); + + [DispId(1610678295)] + DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678296)] + ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void RedrawBar(); + + [DispId(1610678298)] + string FontName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRender3DSink.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRender3DSink.cs new file mode 100644 index 0000000..c34221a --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRender3DSink.cs @@ -0,0 +1,24 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("E4FBF228-D2AA-4298-96EC-6D89A1960731")] +public interface IRender3DSink +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PreBeginScene([MarshalAs(UnmanagedType.IUnknown)] object pD3D); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PostBeginScene([MarshalAs(UnmanagedType.IUnknown)] object pD3D); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PreEndScene([MarshalAs(UnmanagedType.IUnknown)] object pD3D); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PostEndScene([MarshalAs(UnmanagedType.IUnknown)] object pD3D); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRootLayer.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRootLayer.cs new file mode 100644 index 0000000..73dd331 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IRootLayer.cs @@ -0,0 +1,27 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("D3006096-B293-47F5-9377-C12DEF5C1D34")] +public interface IRootLayer +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + View CreateView([MarshalAs(UnmanagedType.BStr)] string Title, ref ViewParams pParams, [MarshalAs(UnmanagedType.Interface)] ILayer pLayer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void SelectBar(int nID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + View LoadView([MarshalAs(UnmanagedType.BStr)] string strXML); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + View LoadViewObject([MarshalAs(UnmanagedType.IUnknown)] object pSchema); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ISimpleBar.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ISimpleBar.cs new file mode 100644 index 0000000..b77cfd5 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ISimpleBar.cs @@ -0,0 +1,41 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(1)] +[Guid("4A2D87CD-BFB4-4723-B959-FFF3FDD49278")] +[SuppressUnmanagedCodeSecurity] +public interface ISimpleBar +{ + [DispId(1610678272)] + int RenderWidth + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678273)] + ViewParams @params + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678275)] + string Title + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IView.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IView.cs new file mode 100644 index 0000000..d82a006 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IView.cs @@ -0,0 +1,103 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[TypeLibType(4096)] +[Guid("A2AE18B7-85C9-451C-8CC3-D0FFE6B86EEB")] +[SuppressUnmanagedCodeSecurity] +public interface IView : IViewDisp +{ + [DispId(1610743808)] + new IControl Control + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(1610743809)] + new object ControlEx + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610743811)] + new string Title + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void Alert(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void SetIcon(int icon, [Optional][MarshalAs(UnmanagedType.Struct)] object iconLibrary); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void Activate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + new void Deactivate(); + + [DispId(1610743817)] + new tagRECT Position + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: Out] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + int LoadControl([MarshalAs(UnmanagedType.Interface)] Layer pParent, int nID, [MarshalAs(UnmanagedType.IUnknown)] object pXMLSource); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void LoadSchema([MarshalAs(UnmanagedType.BStr)] string strXMLSchema); + + [DispId(1610809347)] + bool Activated + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610809349)] + bool Transparent + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610809346)] + int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewDisp.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewDisp.cs new file mode 100644 index 0000000..ed95c3f --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewDisp.cs @@ -0,0 +1,79 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("F3B54A0C-61B9-4B7A-9FD8-82B0477FB7D9")] +[TypeLibType(4160)] +public interface IViewDisp +{ + [DispId(1610743808)] + IControl Control + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(1610743809)] + object ControlEx + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610743811)] + string Title + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + void Alert(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + void SetIcon(int icon, [Optional][MarshalAs(UnmanagedType.Struct)] object iconLibrary); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + void Activate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + void Deactivate(); + + [DispId(1610743817)] + tagRECT Position + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + [param: In] + [param: Out] + set; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents.cs new file mode 100644 index 0000000..2d6ecb4 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents.cs @@ -0,0 +1,29 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("4B7B19D5-61A2-4AB0-8B1B-381A303A937F")] +[TypeLibType(4096)] +[InterfaceType(2)] +public interface IViewEvents +{ + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + void OnActivate(); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + void OnDeactivate(); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + bool Size(); + + [MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + void Sizing([In] int left, int top, int width, int height); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_Event.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_Event.cs new file mode 100644 index 0000000..333b042 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_Event.cs @@ -0,0 +1,16 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IViewEvents_Event +{ + event IViewEvents_OnActivateEventHandler OnActivate; + + event IViewEvents_OnDeactivateEventHandler OnDeactivate; + + event IViewEvents_SizeEventHandler Size; + + event IViewEvents_SizingEventHandler Sizing; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_EventProvider.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_EventProvider.cs new file mode 100644 index 0000000..eb893e1 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_EventProvider.cs @@ -0,0 +1,382 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Inject; + +internal sealed class IViewEvents_EventProvider : IViewEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 213, 25, 123, 75, 162, 97, 176, 74, 139, 27, + 56, 26, 48, 58, 147, 127 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IViewEvents_OnActivateEventHandler IViewEvents_Event.OnActivate + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IViewEvents_SinkHelper viewEvents_SinkHelper = new IViewEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(viewEvents_SinkHelper, out pdwCookie); + viewEvents_SinkHelper.m_dwCookie = pdwCookie; + viewEvents_SinkHelper.m_OnActivateDelegate = value; + m_aEventSinkHelpers.Add(viewEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IViewEvents_SinkHelper viewEvents_SinkHelper = (IViewEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (viewEvents_SinkHelper.m_OnActivateDelegate != null && ((viewEvents_SinkHelper.m_OnActivateDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(viewEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IViewEvents_OnDeactivateEventHandler IViewEvents_Event.OnDeactivate + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IViewEvents_SinkHelper viewEvents_SinkHelper = new IViewEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(viewEvents_SinkHelper, out pdwCookie); + viewEvents_SinkHelper.m_dwCookie = pdwCookie; + viewEvents_SinkHelper.m_OnDeactivateDelegate = value; + m_aEventSinkHelpers.Add(viewEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IViewEvents_SinkHelper viewEvents_SinkHelper = (IViewEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (viewEvents_SinkHelper.m_OnDeactivateDelegate != null && ((viewEvents_SinkHelper.m_OnDeactivateDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(viewEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IViewEvents_SizeEventHandler IViewEvents_Event.Size + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IViewEvents_SinkHelper viewEvents_SinkHelper = new IViewEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(viewEvents_SinkHelper, out pdwCookie); + viewEvents_SinkHelper.m_dwCookie = pdwCookie; + viewEvents_SinkHelper.m_SizeDelegate = value; + m_aEventSinkHelpers.Add(viewEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IViewEvents_SinkHelper viewEvents_SinkHelper = (IViewEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (viewEvents_SinkHelper.m_SizeDelegate != null && ((viewEvents_SinkHelper.m_SizeDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(viewEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IViewEvents_SizingEventHandler IViewEvents_Event.Sizing + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IViewEvents_SinkHelper viewEvents_SinkHelper = new IViewEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(viewEvents_SinkHelper, out pdwCookie); + viewEvents_SinkHelper.m_dwCookie = pdwCookie; + viewEvents_SinkHelper.m_SizingDelegate = value; + m_aEventSinkHelpers.Add(viewEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IViewEvents_SinkHelper viewEvents_SinkHelper = (IViewEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (viewEvents_SinkHelper.m_SizingDelegate != null && ((viewEvents_SinkHelper.m_SizingDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(viewEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IViewEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IViewEvents_SinkHelper viewEvents_SinkHelper = (IViewEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(viewEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnActivateEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnActivateEventHandler.cs new file mode 100644 index 0000000..366a001 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnActivateEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void IViewEvents_OnActivateEventHandler(); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnDeactivateEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnDeactivateEventHandler.cs new file mode 100644 index 0000000..c63ff34 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_OnDeactivateEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void IViewEvents_OnDeactivateEventHandler(); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SinkHelper.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SinkHelper.cs new file mode 100644 index 0000000..7bc0688 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SinkHelper.cs @@ -0,0 +1,65 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IViewEvents_SinkHelper : IViewEvents +{ + public IViewEvents_OnActivateEventHandler m_OnActivateDelegate; + + public IViewEvents_OnDeactivateEventHandler m_OnDeactivateDelegate; + + public IViewEvents_SizeEventHandler m_SizeDelegate; + + public IViewEvents_SizingEventHandler m_SizingDelegate; + + public int m_dwCookie; + + public void OnActivate() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_OnActivateDelegate != null) + { + m_OnActivateDelegate(); + } + } + + public void OnDeactivate() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_OnDeactivateDelegate != null) + { + m_OnDeactivateDelegate(); + } + } + + public bool Size() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_SizeDelegate != null) + { + return m_SizeDelegate(); + } + return false; + } + + public void Sizing(int P_0, int P_1, int P_2, int P_3) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_SizingDelegate != null) + { + m_SizingDelegate(P_0, P_1, P_2, P_3); + } + } + + internal IViewEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_OnActivateDelegate = null; + m_OnDeactivateDelegate = null; + m_SizeDelegate = null; + m_SizingDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizeEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizeEventHandler.cs new file mode 100644 index 0000000..7b8a4b7 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizeEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate bool IViewEvents_SizeEventHandler(); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizingEventHandler.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizingEventHandler.cs new file mode 100644 index 0000000..106a948 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IViewEvents_SizingEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComVisible(false)] +public delegate void IViewEvents_SizingEventHandler([In] int left, int top, int width, int height); diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IWindowsMessageSink.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IWindowsMessageSink.cs new file mode 100644 index 0000000..e1e8c2e --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/IWindowsMessageSink.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[InterfaceType(1)] +[Guid("A68BE455-C241-49C5-9F8A-070E4CBE430F")] +[SuppressUnmanagedCodeSecurity] +public interface IWindowsMessageSink +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + bool WindowMessage(int HWND, short uMsg, int wParam, int lParam); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void WindowMessageEnd(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectService.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectService.cs new file mode 100644 index 0000000..1672ecc --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectService.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("47761792-2520-4802-8548-5CA580697614")] +[CoClass(typeof(InjectServiceClass))] +public interface InjectService : IInjectService +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectServiceClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectServiceClass.cs new file mode 100644 index 0000000..4cd5e0b --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/InjectServiceClass.cs @@ -0,0 +1,25 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("FEFE5CAB-10E4-404F-AD4D-184BCB506099")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +public class InjectServiceClass : IInjectService, InjectService +{ + [DispId(1)] + public virtual extern object Site + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void InitPlugin([MarshalAs(UnmanagedType.IUnknown)] object pUnk); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/KeyState.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/KeyState.cs new file mode 100644 index 0000000..fd94d0c --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/KeyState.cs @@ -0,0 +1,13 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 2)] +public struct KeyState +{ + public short vkey; + + public short ctrl; + + public short shift; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Layer.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Layer.cs new file mode 100644 index 0000000..f839ffc --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Layer.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[CoClass(typeof(LayerClass))] +[Guid("5B7E9D99-BB3A-475D-842D-43EBEA8284EA")] +public interface Layer : ILayerSite +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerClass.cs new file mode 100644 index 0000000..b43ffec --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerClass.cs @@ -0,0 +1,119 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("6FEA2219-7438-4F76-8165-C47AA060D811")] +public class LayerClass : ILayerSite, Layer +{ + [DispId(1610678276)] + public virtual extern PluginSite PluginSite + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678279)] + public virtual extern tagRECT Position + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678281)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678282)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678283)] + public virtual extern Layer Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678286)] + public virtual extern bool Popup + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678287)] + public virtual extern tagRECT ScreenPosition + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678290)] + public virtual extern bool Transparent + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610678292)] + public virtual extern int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Destroy(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void CreateChild(ref LayerParams @params, [MarshalAs(UnmanagedType.Interface)] ILayer pSink); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void GetSink(ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] ref object ppvItf); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Invalidate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reformat(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void GetParentSink(ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] ref object ppvItf); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void CaptureKeyboard(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern bool IsChild([MarshalAs(UnmanagedType.Interface)] Layer pSite, bool bTestUnclipped = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void StartTimer(int nID, int nInterval); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void EndTimer(int nID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void moveToFront(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerParams.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerParams.cs new file mode 100644 index 0000000..77a00ac --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/LayerParams.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct LayerParams +{ + public int ID; + + public tagRECT pos; + + public int render; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/MouseState.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/MouseState.cs new file mode 100644 index 0000000..44aa4c7 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/MouseState.cs @@ -0,0 +1,18 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct MouseState +{ + [MarshalAs(UnmanagedType.Interface)] + public ILayer over; + + public tagPOINT screen; + + public tagPOINT client; + + public short ctrl; + + public short shift; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Pager.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Pager.cs new file mode 100644 index 0000000..5de4324 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/Pager.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[CoClass(typeof(PagerClass))] +[Guid("BD9FC464-C0D8-4823-8255-E818F8836B08")] +public interface Pager : IPager, IPagerEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PagerClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PagerClass.cs new file mode 100644 index 0000000..ee7ef87 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PagerClass.cs @@ -0,0 +1,96 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("C79E2F76-06F8-4CD0-A613-4829237D297D")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.Inject.IPagerEvents\0\0")] +[TypeLibType(2)] +public class PagerClass : IPager, Pager, IPagerEvents_Event, IControl +{ + [DispId(2)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(3)] + public virtual extern int ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(4)] + public virtual extern IControl Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610809346)] + public virtual extern int Command + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610809348)] + public virtual extern tagPOINT Offset + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + public virtual extern int IControl_ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern int IControl_ChildCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + public virtual extern IControl IControl_Child + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event IPagerEvents_DestroyEventHandler Destroy; + + public virtual extern event IPagerEvents_ChangeEventHandler Change; + + public virtual extern event IPagerEvents_GetNextPositionEventHandler GetNextPosition; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void FinishCommand(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void ScrollTo(ref tagPOINT ppt); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void CreateClient([MarshalAs(UnmanagedType.Interface)] ILayer pLayer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void IControl_DestroyChild(int nIndex, ePositionType posType = ePositionType.ePositionByIndex); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1.cs new file mode 100644 index 0000000..bade8b1 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[CoClass(typeof(PluginAdapterV1Class))] +[Guid("93D72C31-CBC3-4471-AE4B-395FBB4D3B45")] +public interface PluginAdapterV1 : IPluginAdapterV1 +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1Class.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1Class.cs new file mode 100644 index 0000000..20caace --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginAdapterV1Class.cs @@ -0,0 +1,13 @@ +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Inject; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("3D837F6E-B5CA-4604-885F-7AB45FCFA62A")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +public class PluginAdapterV1Class : IPluginAdapterV1, PluginAdapterV1 +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSite.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSite.cs new file mode 100644 index 0000000..177416d --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSite.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[CoClass(typeof(PluginSiteClass))] +[Guid("E9D10D39-63A9-478B-81FE-0045BA0593EF")] +public interface PluginSite : IPluginSite +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSiteClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSiteClass.cs new file mode 100644 index 0000000..57d3dd1 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/PluginSiteClass.cs @@ -0,0 +1,151 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("B2FBD583-B64C-4DFC-BAAA-34B8C21482F8")] +[SuppressUnmanagedCodeSecurity] +public class PluginSiteClass : IPluginSite, PluginSite +{ + [DispId(1610678287)] + public virtual extern string ResourcePath + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610678288)] + public virtual extern object Plugin + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [DispId(1610678289)] + public virtual extern object NetworkFilter + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [DispId(1610678291)] + public virtual extern int HWND + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678292)] + public virtual extern bool Focus + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678293)] + public virtual extern int OldWndProc + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [DispId(1610678295)] + public virtual extern DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678296)] + public virtual extern ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678298)] + public virtual extern string FontName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + public virtual extern void UnloadPlugin(int nID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern Canvas GetPrimarySurface(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object Get3DDevice(ref Guid ifaceid); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern IImageCache LoadBitmapFile([MarshalAs(UnmanagedType.BStr)] string strFilename); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern IIconCache GetIconCache(ref tagSIZE psz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern IImageCache LoadBitmapPortal(int nFile); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern IFontCache DecalCreateFont([MarshalAs(UnmanagedType.BStr)] string szFaceName, int nHeight, int dwFlags); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void GetScreenSize(ref tagSIZE sz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern Canvas CreateCanvas(ref tagSIZE psz); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern View CreateView([MarshalAs(UnmanagedType.BStr)] string Title, ref ViewParams pParams, [MarshalAs(UnmanagedType.Interface)] ILayer pLayer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern View LoadView([MarshalAs(UnmanagedType.BStr)] string strSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern IImageCache CreateBrushImage(int nColor); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern IImageCache LoadImageSchema([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern IFontCache CreateFontSchema(int nDefHeight, int nDefOptions, [MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern int LoadResourceModule([MarshalAs(UnmanagedType.BStr)] string strLibrary); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern View LoadViewObject([MarshalAs(UnmanagedType.IUnknown)] object pSchema); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern int QueryKeyboardMap([In][MarshalAs(UnmanagedType.BStr)] string bstrName); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void RedrawBar(); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/View.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/View.cs new file mode 100644 index 0000000..dd488b1 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/View.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[ComImport] +[Guid("A2AE18B7-85C9-451C-8CC3-D0FFE6B86EEB")] +[CoClass(typeof(ViewClass))] +public interface View : IView, IViewEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewClass.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewClass.cs new file mode 100644 index 0000000..dafd2dc --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewClass.cs @@ -0,0 +1,112 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Inject; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ComSourceInterfaces("Decal.Interop.Inject.IViewEvents\0\0")] +[ClassInterface(ClassInterfaceType.None)] +[Guid("19BF46E4-5CB8-4CFC-A17A-8E6673E60ABF")] +public class ViewClass : IView, View, IViewEvents_Event +{ + [DispId(1610743808)] + public virtual extern IControl Control + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.Interface)] + set; + } + + [DispId(1610743809)] + public virtual extern object ControlEx + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610743811)] + public virtual extern string Title + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(1610743817)] + public virtual extern tagRECT Position + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + [param: Out] + set; + } + + [DispId(1610809346)] + public virtual extern int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + set; + } + + [DispId(1610809347)] + public virtual extern bool Activated + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + [DispId(1610809349)] + public virtual extern bool Transparent + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [param: In] + set; + } + + public virtual extern event IViewEvents_OnActivateEventHandler OnActivate; + + public virtual extern event IViewEvents_OnDeactivateEventHandler OnDeactivate; + + public virtual extern event IViewEvents_SizeEventHandler Size; + + public virtual extern event IViewEvents_SizingEventHandler Sizing; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Alert(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void SetIcon(int icon, [Optional][MarshalAs(UnmanagedType.Struct)] object iconLibrary); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Activate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Deactivate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern int LoadControl([MarshalAs(UnmanagedType.Interface)] Layer pParent, int nID, [MarshalAs(UnmanagedType.IUnknown)] object pXMLSource); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void LoadSchema([MarshalAs(UnmanagedType.BStr)] string strXMLSchema); +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewParams.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewParams.cs new file mode 100644 index 0000000..fbed8f9 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ViewParams.cs @@ -0,0 +1,23 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct ViewParams +{ + public int icon; + + public int iconLibrary; + + public int left; + + public int top; + + public int width; + + public int height; + + public int Alpha; + + public int state; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/_RemotableHandle.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/_RemotableHandle.cs new file mode 100644 index 0000000..dff32e4 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/_RemotableHandle.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct _RemotableHandle +{ + public int fContext; + + public __MIDL_IWinTypes_0009 u; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/__MIDL_IWinTypes_0009.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/__MIDL_IWinTypes_0009.cs new file mode 100644 index 0000000..24f8d2a --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/__MIDL_IWinTypes_0009.cs @@ -0,0 +1,13 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Explicit, Pack = 4)] +public struct __MIDL_IWinTypes_0009 +{ + [FieldOffset(0)] + public int hInproc; + + [FieldOffset(0)] + public int hRemote; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eAlphaBlendOptions.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eAlphaBlendOptions.cs new file mode 100644 index 0000000..7ff69a8 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eAlphaBlendOptions.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Inject; + +public enum eAlphaBlendOptions +{ + eAlphaBlendSoftware = 1, + eAlphaBlendGDIPlus +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eCombatState.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eCombatState.cs new file mode 100644 index 0000000..b0def35 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eCombatState.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Inject; + +public enum eCombatState +{ + ePeace = 1, + eMelee = 2, + eMissile = 4, + eMagic = 8 +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDefaultControlType.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDefaultControlType.cs new file mode 100644 index 0000000..ecfe2b5 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDefaultControlType.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Inject; + +public enum eDefaultControlType +{ + eCtlButton, + eCtlPager +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDrawTextExFlags.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDrawTextExFlags.cs new file mode 100644 index 0000000..5682db0 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eDrawTextExFlags.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Inject; + +public enum eDrawTextExFlags +{ + eAA = 1, + eOutlined +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontJustify.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontJustify.cs new file mode 100644 index 0000000..f6ddd60 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontJustify.cs @@ -0,0 +1,8 @@ +namespace Decal.Interop.Inject; + +public enum eFontJustify +{ + eFontLeft, + eFontRight, + eFontCenter +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontOptions.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontOptions.cs new file mode 100644 index 0000000..a884a62 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eFontOptions.cs @@ -0,0 +1,8 @@ +namespace Decal.Interop.Inject; + +public enum eFontOptions +{ + eFontBold = 1, + eFontItalic = 2, + eFontUnderline = 4 +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eInputStatus.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eInputStatus.cs new file mode 100644 index 0000000..389d2d6 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eInputStatus.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Inject; + +public enum eInputStatus +{ + eInputIdle, + eInputWaiting, + eInputRunning, + eInputPaused +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eManagerSinkCaps.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eManagerSinkCaps.cs new file mode 100644 index 0000000..efffacd --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eManagerSinkCaps.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Inject; + +public enum eManagerSinkCaps +{ + eManagerSinkCapWindowMessage = 1, + eManagerSinkCapPlugin = 2, + eManagerSinkCapRender = 4, + eManagerSinkCapRender3D = 8 +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMinMaxState.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMinMaxState.cs new file mode 100644 index 0000000..8ec05e3 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMinMaxState.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Inject; + +public enum eMinMaxState +{ + eStateMax, + eStateMin +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMouseInput.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMouseInput.cs new file mode 100644 index 0000000..b653252 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eMouseInput.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Inject; + +public enum eMouseInput +{ + eMouseLeftClick, + eMouseRightClick, + eMouseLeftDoubleClick, + eMouseRightDoubleClick +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ePositionType.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ePositionType.cs new file mode 100644 index 0000000..d8a8480 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/ePositionType.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Inject; + +public enum ePositionType +{ + ePositionByIndex, + ePositionByID +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eRenderOptions.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eRenderOptions.cs new file mode 100644 index 0000000..437e650 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eRenderOptions.cs @@ -0,0 +1,9 @@ +namespace Decal.Interop.Inject; + +public enum eRenderOptions +{ + eRenderClipped = 1, + eRenderNext = 2, + eRenderTransparent = 8, + eRenderReformatNext = 0x20 +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eViewFlags.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eViewFlags.cs new file mode 100644 index 0000000..130cfea --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/eViewFlags.cs @@ -0,0 +1,6 @@ +namespace Decal.Interop.Inject; + +public enum eViewFlags +{ + eTransparent = 1 +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagPOINT.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagPOINT.cs new file mode 100644 index 0000000..70efd04 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagPOINT.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct tagPOINT +{ + public int x; + + public int y; +} diff --git a/Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagSIZE.cs b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagSIZE.cs new file mode 100644 index 0000000..1423a06 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Decal.Interop.Inject/tagSIZE.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Inject; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct tagSIZE +{ + public int cx; + + public int cy; +} diff --git a/Managed/Decal.Interop.Inject/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Inject/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..13947e7 --- /dev/null +++ b/Managed/Decal.Interop.Inject/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: TypeLibVersion(2, 0)] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: Guid("3559e08b-827e-4dfe-9d33-3567246849cc")] +[assembly: ImportedFromTypeLib("DecalPlugins")] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input.csproj b/Managed/Decal.Interop.Input/Decal.Interop.Input.csproj new file mode 100644 index 0000000..06db3b2 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input.csproj @@ -0,0 +1,8 @@ + + + Decal.Interop.Input + + + + + diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/DelayAction.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/DelayAction.cs new file mode 100644 index 0000000..631ec1c --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/DelayAction.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[CoClass(typeof(DelayActionClass))] +[Guid("C73A3F3D-8286-4250-BF97-155EE341E42F")] +public interface DelayAction : IInputAction +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/DelayActionClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/DelayActionClass.cs new file mode 100644 index 0000000..7f62b3b --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/DelayActionClass.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("324D76B8-D8C7-4A81-B867-E4E1F874E488")] +[TypeLibType(2)] +public class DelayActionClass : IInputAction, DelayAction +{ + [DispId(1610678274)] + public virtual extern bool Stackable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([MarshalAs(UnmanagedType.Interface)] IInputActionSite pSite, [MarshalAs(UnmanagedType.BStr)] string strData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Terminate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Push(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Execute(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/EventAction.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/EventAction.cs new file mode 100644 index 0000000..aac1bb5 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/EventAction.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[CoClass(typeof(EventActionClass))] +[Guid("C73A3F3D-8286-4250-BF97-155EE341E42F")] +public interface EventAction : IInputAction +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/EventActionClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/EventActionClass.cs new file mode 100644 index 0000000..9662644 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/EventActionClass.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("D6E4BD19-4900-4515-BCE2-A9EA4AAE2699")] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +public class EventActionClass : IInputAction, EventAction +{ + [DispId(1610678274)] + public virtual extern bool Stackable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([MarshalAs(UnmanagedType.Interface)] IInputActionSite pSite, [MarshalAs(UnmanagedType.BStr)] string strData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Terminate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Push(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Execute(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/Hotkey.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/Hotkey.cs new file mode 100644 index 0000000..341d87f --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/Hotkey.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("95AF8DF7-F2A0-476E-9D8C-B23493B1698D")] +[CoClass(typeof(HotkeyClass))] +public interface Hotkey : IHotkey, IHotkeyEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/HotkeyClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/HotkeyClass.cs new file mode 100644 index 0000000..52f8211 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/HotkeyClass.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("F183506A-3664-49D6-8CA4-CFD295F2811D")] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.Input.IHotkeyEvents\0\0")] +public class HotkeyClass : IHotkey, Hotkey, IHotkeyEvents_Event +{ + [DispId(1)] + public virtual extern object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(2)] + public virtual extern string Key + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + public virtual extern bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + set; + } + + public virtual extern event IHotkeyEvents_HotkeyEventHandler Hotkey; +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IDecalTimer.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IDecalTimer.cs new file mode 100644 index 0000000..5fd1b04 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IDecalTimer.cs @@ -0,0 +1,42 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("6CE124D7-534E-4BB6-AAF2-2BE22F69326D")] +public interface IDecalTimer +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Start(int Interval); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void Stop(); + + [DispId(3)] + object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(4)] + bool Running + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkey.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkey.cs new file mode 100644 index 0000000..5dedcac --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkey.cs @@ -0,0 +1,52 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(4160)] +[Guid("95AF8DF7-F2A0-476E-9D8C-B23493B1698D")] +[SuppressUnmanagedCodeSecurity] +public interface IHotkey +{ + [DispId(1)] + object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(2)] + string Key + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents.cs new file mode 100644 index 0000000..4a51b76 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents.cs @@ -0,0 +1,17 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(4096)] +[InterfaceType(2)] +[Guid("15EAEB82-6EC8-4A09-8FA3-2D691BBB732F")] +[SuppressUnmanagedCodeSecurity] +public interface IHotkeyEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Hotkey([MarshalAs(UnmanagedType.Interface)] Hotkey Source); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_Event.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_Event.cs new file mode 100644 index 0000000..c0d3ffd --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_Event.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +[TypeLibType(16)] +public interface IHotkeyEvents_Event +{ + event IHotkeyEvents_HotkeyEventHandler Hotkey; +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_EventProvider.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_EventProvider.cs new file mode 100644 index 0000000..af833e0 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Input; + +internal sealed class IHotkeyEvents_EventProvider : IHotkeyEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 130, 235, 234, 21, 200, 110, 9, 74, 143, 163, + 45, 105, 27, 187, 115, 47 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IHotkeyEvents_HotkeyEventHandler IHotkeyEvents_Event.Hotkey + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IHotkeyEvents_SinkHelper hotkeyEvents_SinkHelper = new IHotkeyEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(hotkeyEvents_SinkHelper, out pdwCookie); + hotkeyEvents_SinkHelper.m_dwCookie = pdwCookie; + hotkeyEvents_SinkHelper.m_HotkeyDelegate = value; + m_aEventSinkHelpers.Add(hotkeyEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IHotkeyEvents_SinkHelper hotkeyEvents_SinkHelper = (IHotkeyEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (hotkeyEvents_SinkHelper.m_HotkeyDelegate != null && ((hotkeyEvents_SinkHelper.m_HotkeyDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(hotkeyEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IHotkeyEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IHotkeyEvents_SinkHelper hotkeyEvents_SinkHelper = (IHotkeyEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(hotkeyEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_HotkeyEventHandler.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_HotkeyEventHandler.cs new file mode 100644 index 0000000..0ec900e --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_HotkeyEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +public delegate void IHotkeyEvents_HotkeyEventHandler([MarshalAs(UnmanagedType.Interface)] Hotkey Source); diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_SinkHelper.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_SinkHelper.cs new file mode 100644 index 0000000..f83e7f4 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IHotkeyEvents_SinkHelper.cs @@ -0,0 +1,28 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IHotkeyEvents_SinkHelper : IHotkeyEvents +{ + public IHotkeyEvents_HotkeyEventHandler m_HotkeyDelegate; + + public int m_dwCookie; + + public void Hotkey(Hotkey P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_HotkeyDelegate != null) + { + m_HotkeyDelegate(P_0); + } + } + + internal IHotkeyEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_HotkeyDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputAction.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputAction.cs new file mode 100644 index 0000000..a400aa8 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputAction.cs @@ -0,0 +1,37 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("C73A3F3D-8286-4250-BF97-155EE341E42F")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface IInputAction +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Initialize([MarshalAs(UnmanagedType.Interface)] IInputActionSite pSite, [MarshalAs(UnmanagedType.BStr)] string strData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Terminate(); + + [DispId(1610678274)] + bool Stackable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Push(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Execute(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputActionSite.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputActionSite.cs new file mode 100644 index 0000000..17b6c53 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputActionSite.cs @@ -0,0 +1,29 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +[Guid("1751F4E5-4E11-42F1-A00F-ED5B1D899C66")] +public interface IInputActionSite +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Delay(int Time, bool Advance); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void FireEvent(int nEventID, [MarshalAs(UnmanagedType.Struct)] object vParam); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void MoveMouse(int X, int Y); + + [DispId(1610678275)] + InputService Service + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBuffer.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBuffer.cs new file mode 100644 index 0000000..a09f95c --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBuffer.cs @@ -0,0 +1,54 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +[Guid("B772FDC3-36AD-4957-9143-5A10FBDA6D1D")] +public interface IInputBuffer +{ + [DispId(1)] + object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void Add([MarshalAs(UnmanagedType.BStr)] string Command); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void Push([MarshalAs(UnmanagedType.BStr)] string Command); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + void Pop(); + + [DispId(5)] + bool CanRun + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + void Run(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + void Stop(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents.cs new file mode 100644 index 0000000..aca1e98 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents.cs @@ -0,0 +1,25 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(4096)] +[InterfaceType(2)] +[Guid("04CD59E6-672E-45A6-AE0A-454B1F59377A")] +[SuppressUnmanagedCodeSecurity] +public interface IInputBufferEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Begin([MarshalAs(UnmanagedType.Interface)] InputBuffer Buffer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void End([MarshalAs(UnmanagedType.Interface)] InputBuffer Buffer); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void Event([MarshalAs(UnmanagedType.Interface)] InputBuffer Buffer, int EventID, [MarshalAs(UnmanagedType.Struct)] object Param); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_BeginEventHandler.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_BeginEventHandler.cs new file mode 100644 index 0000000..73a5cd2 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_BeginEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +public delegate void IInputBufferEvents_BeginEventHandler([MarshalAs(UnmanagedType.Interface)] InputBuffer Buffer); diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EndEventHandler.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EndEventHandler.cs new file mode 100644 index 0000000..ee45e83 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EndEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +public delegate void IInputBufferEvents_EndEventHandler([MarshalAs(UnmanagedType.Interface)] InputBuffer Buffer); diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_Event.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_Event.cs new file mode 100644 index 0000000..a9b0d9e --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_Event.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IInputBufferEvents_Event +{ + event IInputBufferEvents_BeginEventHandler Begin; + + event IInputBufferEvents_EndEventHandler End; + + event IInputBufferEvents_EventEventHandler Event; +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventEventHandler.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventEventHandler.cs new file mode 100644 index 0000000..727db6d --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +public delegate void IInputBufferEvents_EventEventHandler([MarshalAs(UnmanagedType.Interface)] InputBuffer Buffer, int EventID, [MarshalAs(UnmanagedType.Struct)] object Param); diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventProvider.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventProvider.cs new file mode 100644 index 0000000..7ea5c7e --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_EventProvider.cs @@ -0,0 +1,306 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Input; + +internal sealed class IInputBufferEvents_EventProvider : IInputBufferEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 230, 89, 205, 4, 46, 103, 166, 69, 174, 10, + 69, 75, 31, 89, 55, 122 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IInputBufferEvents_BeginEventHandler IInputBufferEvents_Event.Begin + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IInputBufferEvents_SinkHelper inputBufferEvents_SinkHelper = new IInputBufferEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(inputBufferEvents_SinkHelper, out pdwCookie); + inputBufferEvents_SinkHelper.m_dwCookie = pdwCookie; + inputBufferEvents_SinkHelper.m_BeginDelegate = value; + m_aEventSinkHelpers.Add(inputBufferEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IInputBufferEvents_SinkHelper inputBufferEvents_SinkHelper = (IInputBufferEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (inputBufferEvents_SinkHelper.m_BeginDelegate != null && ((inputBufferEvents_SinkHelper.m_BeginDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(inputBufferEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IInputBufferEvents_EndEventHandler IInputBufferEvents_Event.End + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IInputBufferEvents_SinkHelper inputBufferEvents_SinkHelper = new IInputBufferEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(inputBufferEvents_SinkHelper, out pdwCookie); + inputBufferEvents_SinkHelper.m_dwCookie = pdwCookie; + inputBufferEvents_SinkHelper.m_EndDelegate = value; + m_aEventSinkHelpers.Add(inputBufferEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IInputBufferEvents_SinkHelper inputBufferEvents_SinkHelper = (IInputBufferEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (inputBufferEvents_SinkHelper.m_EndDelegate != null && ((inputBufferEvents_SinkHelper.m_EndDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(inputBufferEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IInputBufferEvents_EventEventHandler IInputBufferEvents_Event.Event + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IInputBufferEvents_SinkHelper inputBufferEvents_SinkHelper = new IInputBufferEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(inputBufferEvents_SinkHelper, out pdwCookie); + inputBufferEvents_SinkHelper.m_dwCookie = pdwCookie; + inputBufferEvents_SinkHelper.m_EventDelegate = value; + m_aEventSinkHelpers.Add(inputBufferEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IInputBufferEvents_SinkHelper inputBufferEvents_SinkHelper = (IInputBufferEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (inputBufferEvents_SinkHelper.m_EventDelegate != null && ((inputBufferEvents_SinkHelper.m_EventDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(inputBufferEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IInputBufferEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IInputBufferEvents_SinkHelper inputBufferEvents_SinkHelper = (IInputBufferEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(inputBufferEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_SinkHelper.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_SinkHelper.cs new file mode 100644 index 0000000..ec19f83 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputBufferEvents_SinkHelper.cs @@ -0,0 +1,52 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IInputBufferEvents_SinkHelper : IInputBufferEvents +{ + public IInputBufferEvents_BeginEventHandler m_BeginDelegate; + + public IInputBufferEvents_EndEventHandler m_EndDelegate; + + public IInputBufferEvents_EventEventHandler m_EventDelegate; + + public int m_dwCookie; + + public void Begin(InputBuffer P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_BeginDelegate != null) + { + m_BeginDelegate(P_0); + } + } + + public void End(InputBuffer P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EndDelegate != null) + { + m_EndDelegate(P_0); + } + } + + public void Event(InputBuffer P_0, int P_1, object P_2) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EventDelegate != null) + { + m_EventDelegate(P_0, P_1, P_2); + } + } + + internal IInputBufferEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_BeginDelegate = null; + m_EndDelegate = null; + m_EventDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputService.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputService.cs new file mode 100644 index 0000000..5247bef --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IInputService.cs @@ -0,0 +1,30 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("27A63073-10D6-4282-85CF-77E4DEB8C6B8")] +public interface IInputService +{ + [DispId(1610743808)] + DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743809)] + int KeyByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + get; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents.cs new file mode 100644 index 0000000..a7e85cc --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents.cs @@ -0,0 +1,17 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[InterfaceType(2)] +[Guid("BBF25010-50FE-4398-BB78-BF8B9D392915")] +[TypeLibType(4096)] +[SuppressUnmanagedCodeSecurity] +public interface ITimerEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Timeout([MarshalAs(UnmanagedType.Interface)] Timer Source); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_Event.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_Event.cs new file mode 100644 index 0000000..3231550 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_Event.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[TypeLibType(16)] +[ComVisible(false)] +public interface ITimerEvents_Event +{ + event ITimerEvents_TimeoutEventHandler Timeout; +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_EventProvider.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_EventProvider.cs new file mode 100644 index 0000000..6708ca0 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Input; + +internal sealed class ITimerEvents_EventProvider : ITimerEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 16, 80, 242, 187, 254, 80, 152, 67, 187, 120, + 191, 139, 157, 57, 41, 21 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event ITimerEvents_TimeoutEventHandler ITimerEvents_Event.Timeout + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + ITimerEvents_SinkHelper timerEvents_SinkHelper = new ITimerEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(timerEvents_SinkHelper, out pdwCookie); + timerEvents_SinkHelper.m_dwCookie = pdwCookie; + timerEvents_SinkHelper.m_TimeoutDelegate = value; + m_aEventSinkHelpers.Add(timerEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + ITimerEvents_SinkHelper timerEvents_SinkHelper = (ITimerEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (timerEvents_SinkHelper.m_TimeoutDelegate != null && ((timerEvents_SinkHelper.m_TimeoutDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(timerEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public ITimerEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + ITimerEvents_SinkHelper timerEvents_SinkHelper = (ITimerEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(timerEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_SinkHelper.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_SinkHelper.cs new file mode 100644 index 0000000..6d9e7ab --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_SinkHelper.cs @@ -0,0 +1,28 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(TypeLibTypeFlags.FHidden)] +public sealed class ITimerEvents_SinkHelper : ITimerEvents +{ + public ITimerEvents_TimeoutEventHandler m_TimeoutDelegate; + + public int m_dwCookie; + + public void Timeout(Timer P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_TimeoutDelegate != null) + { + m_TimeoutDelegate(P_0); + } + } + + internal ITimerEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_TimeoutDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_TimeoutEventHandler.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_TimeoutEventHandler.cs new file mode 100644 index 0000000..55bca8c --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/ITimerEvents_TimeoutEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +public delegate void ITimerEvents_TimeoutEventHandler([MarshalAs(UnmanagedType.Interface)] Timer Source); diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHook.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHook.cs new file mode 100644 index 0000000..dab4c4e --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHook.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("F4E4EA59-0E47-4BAD-819A-722F5FFD506F")] +[TypeLibType(4160)] +public interface IWinMsgHook +{ + [DispId(1)] + object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(2)] + bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents.cs new file mode 100644 index 0000000..1aa36fa --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents.cs @@ -0,0 +1,17 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[InterfaceType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("7E3E2EE8-1E06-4CFD-87D9-E4AEAB4CFE31")] +[TypeLibType(4096)] +public interface IWinMsgHookEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Message([MarshalAs(UnmanagedType.Interface)] WinMsgHook Hook, [MarshalAs(UnmanagedType.Interface)] WndMsg Message); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_Event.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_Event.cs new file mode 100644 index 0000000..3d8dd0e --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_Event.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +[TypeLibType(16)] +public interface IWinMsgHookEvents_Event +{ + event IWinMsgHookEvents_MessageEventHandler Message; +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_EventProvider.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_EventProvider.cs new file mode 100644 index 0000000..8d73c51 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Input; + +internal sealed class IWinMsgHookEvents_EventProvider : IWinMsgHookEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 232, 46, 62, 126, 6, 30, 253, 76, 135, 217, + 228, 174, 171, 76, 254, 49 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IWinMsgHookEvents_MessageEventHandler IWinMsgHookEvents_Event.Message + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWinMsgHookEvents_SinkHelper winMsgHookEvents_SinkHelper = new IWinMsgHookEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(winMsgHookEvents_SinkHelper, out pdwCookie); + winMsgHookEvents_SinkHelper.m_dwCookie = pdwCookie; + winMsgHookEvents_SinkHelper.m_MessageDelegate = value; + m_aEventSinkHelpers.Add(winMsgHookEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWinMsgHookEvents_SinkHelper winMsgHookEvents_SinkHelper = (IWinMsgHookEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (winMsgHookEvents_SinkHelper.m_MessageDelegate != null && ((winMsgHookEvents_SinkHelper.m_MessageDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(winMsgHookEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IWinMsgHookEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IWinMsgHookEvents_SinkHelper winMsgHookEvents_SinkHelper = (IWinMsgHookEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(winMsgHookEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_MessageEventHandler.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_MessageEventHandler.cs new file mode 100644 index 0000000..8f03990 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_MessageEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComVisible(false)] +public delegate void IWinMsgHookEvents_MessageEventHandler([MarshalAs(UnmanagedType.Interface)] WinMsgHook Hook, [MarshalAs(UnmanagedType.Interface)] WndMsg Message); diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_SinkHelper.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_SinkHelper.cs new file mode 100644 index 0000000..3ae3c39 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWinMsgHookEvents_SinkHelper.cs @@ -0,0 +1,28 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IWinMsgHookEvents_SinkHelper : IWinMsgHookEvents +{ + public IWinMsgHookEvents_MessageEventHandler m_MessageDelegate; + + public int m_dwCookie; + + public void Message(WinMsgHook P_0, WndMsg P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_MessageDelegate != null) + { + m_MessageDelegate(P_0, P_1); + } + } + + internal IWinMsgHookEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_MessageDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/IWndMsg.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWndMsg.cs new file mode 100644 index 0000000..99c9151 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/IWndMsg.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(4160)] +[Guid("BDAD721B-7A00-440D-8964-70427167DD36")] +[SuppressUnmanagedCodeSecurity] +public interface IWndMsg +{ + [DispId(1)] + int HWND + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + } + + [DispId(2)] + int Message + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + int WParam + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + int LParam + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + bool Eat + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/InputBuffer.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputBuffer.cs new file mode 100644 index 0000000..6bc6b77 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputBuffer.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[CoClass(typeof(InputBufferClass))] +[Guid("B772FDC3-36AD-4957-9143-5A10FBDA6D1D")] +public interface InputBuffer : IInputBuffer, IInputBufferEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/InputBufferClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputBufferClass.cs new file mode 100644 index 0000000..683bfe4 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputBufferClass.cs @@ -0,0 +1,62 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(2)] +[ComSourceInterfaces("Decal.Interop.Input.IInputBufferEvents\0\0")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("F0A17A04-7F8F-4A17-A41D-8C297A1E929B")] +public class InputBufferClass : IInputBuffer, InputBuffer, IInputBufferEvents_Event +{ + [DispId(1)] + public virtual extern object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(5)] + public virtual extern bool CanRun + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + } + + public virtual extern event IInputBufferEvents_BeginEventHandler Begin; + + public virtual extern event IInputBufferEvents_EndEventHandler End; + + public virtual extern event IInputBufferEvents_EventEventHandler Event; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + public virtual extern void Add([MarshalAs(UnmanagedType.BStr)] string Command); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + public virtual extern void Push([MarshalAs(UnmanagedType.BStr)] string Command); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + public virtual extern void Run(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + public virtual extern void Stop(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/InputService.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputService.cs new file mode 100644 index 0000000..309f7f5 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputService.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[CoClass(typeof(InputServiceClass))] +[Guid("27A63073-10D6-4282-85CF-77E4DEB8C6B8")] +public interface InputService : IInputService +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/InputServiceClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputServiceClass.cs new file mode 100644 index 0000000..a86d024 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/InputServiceClass.cs @@ -0,0 +1,31 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("B33307BA-706D-474A-80B9-70BB8D13EF3E")] +[ClassInterface(ClassInterfaceType.None)] +public class InputServiceClass : IInputService, InputService +{ + [DispId(1610743808)] + public virtual extern DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743809)] + public virtual extern int KeyByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + get; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveAction.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveAction.cs new file mode 100644 index 0000000..5205312 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveAction.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("C73A3F3D-8286-4250-BF97-155EE341E42F")] +[CoClass(typeof(MouseMoveActionClass))] +public interface MouseMoveAction : IInputAction +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveActionClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveActionClass.cs new file mode 100644 index 0000000..63375ca --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/MouseMoveActionClass.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(2)] +[Guid("57D18578-0BF0-4DE5-A0A9-E7CB531C0429")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class MouseMoveActionClass : IInputAction, MouseMoveAction +{ + [DispId(1610678274)] + public virtual extern bool Stackable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([MarshalAs(UnmanagedType.Interface)] IInputActionSite pSite, [MarshalAs(UnmanagedType.BStr)] string strData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Terminate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Push(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Execute(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayAction.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayAction.cs new file mode 100644 index 0000000..98c849a --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayAction.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("C73A3F3D-8286-4250-BF97-155EE341E42F")] +[CoClass(typeof(PolledDelayActionClass))] +public interface PolledDelayAction : IInputAction +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayActionClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayActionClass.cs new file mode 100644 index 0000000..e9fbc71 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/PolledDelayActionClass.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("762335B2-2274-4BB4-8B1F-F7286C949FF7")] +[ClassInterface(ClassInterfaceType.None)] +public class PolledDelayActionClass : IInputAction, PolledDelayAction +{ + [DispId(1610678274)] + public virtual extern bool Stackable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([MarshalAs(UnmanagedType.Interface)] IInputActionSite pSite, [MarshalAs(UnmanagedType.BStr)] string strData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Terminate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Push(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Execute(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreAction.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreAction.cs new file mode 100644 index 0000000..46bc3cd --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreAction.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[CoClass(typeof(RestoreActionClass))] +[Guid("C73A3F3D-8286-4250-BF97-155EE341E42F")] +public interface RestoreAction : IInputAction +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreActionClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreActionClass.cs new file mode 100644 index 0000000..21aa126 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/RestoreActionClass.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[Guid("6EE2F682-7129-44BE-84B9-787BAE35EC1C")] +[SuppressUnmanagedCodeSecurity] +public class RestoreActionClass : IInputAction, RestoreAction +{ + [DispId(1610678274)] + public virtual extern bool Stackable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([MarshalAs(UnmanagedType.Interface)] IInputActionSite pSite, [MarshalAs(UnmanagedType.BStr)] string strData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Terminate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Push(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Execute(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/Timer.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/Timer.cs new file mode 100644 index 0000000..43425ed --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/Timer.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("6CE124D7-534E-4BB6-AAF2-2BE22F69326D")] +[CoClass(typeof(TimerClass))] +public interface Timer : IDecalTimer, ITimerEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/TimerClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/TimerClass.cs new file mode 100644 index 0000000..73e0b76 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/TimerClass.cs @@ -0,0 +1,46 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("79497C87-92E1-416B-AE5C-9D6C4C59133C")] +[ComSourceInterfaces("Decal.Interop.Input.ITimerEvents\0\0")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +public class TimerClass : IDecalTimer, Timer, ITimerEvents_Event +{ + [DispId(3)] + public virtual extern object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(4)] + public virtual extern bool Running + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + public virtual extern event ITimerEvents_TimeoutEventHandler Timeout; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + public virtual extern void Start(int Interval); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + public virtual extern void Stop(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/TypeAction.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/TypeAction.cs new file mode 100644 index 0000000..2c64ee1 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/TypeAction.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("C73A3F3D-8286-4250-BF97-155EE341E42F")] +[CoClass(typeof(TypeActionClass))] +public interface TypeAction : IInputAction +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/TypeActionClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/TypeActionClass.cs new file mode 100644 index 0000000..1112f31 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/TypeActionClass.cs @@ -0,0 +1,38 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("9CDCEEDC-F8AC-42D5-9A05-52B9346D00A4")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +public class TypeActionClass : IInputAction, TypeAction +{ + [DispId(1610678274)] + public virtual extern bool Stackable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Initialize([MarshalAs(UnmanagedType.Interface)] IInputActionSite pSite, [MarshalAs(UnmanagedType.BStr)] string strData); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Terminate(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Reset(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Push(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Pop(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public virtual extern void Execute(); +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHook.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHook.cs new file mode 100644 index 0000000..b54777e --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHook.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[CoClass(typeof(WinMsgHookClass))] +[Guid("F4E4EA59-0E47-4BAD-819A-722F5FFD506F")] +public interface WinMsgHook : IWinMsgHook, IWinMsgHookEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHookClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHookClass.cs new file mode 100644 index 0000000..e9cabfc --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/WinMsgHookClass.cs @@ -0,0 +1,42 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("F3170E85-517E-43A4-B7B4-6F006A7B1B85")] +[SuppressUnmanagedCodeSecurity] +[ComSourceInterfaces("Decal.Interop.Input.IWinMsgHookEvents\0\0")] +[TypeLibType(2)] +public class WinMsgHookClass : IWinMsgHook, WinMsgHook, IWinMsgHookEvents_Event +{ + [DispId(1)] + public virtual extern object Tag + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + [param: MarshalAs(UnmanagedType.Struct)] + set; + } + + [DispId(2)] + public virtual extern bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + set; + } + + public virtual extern event IWinMsgHookEvents_MessageEventHandler Message; +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsg.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsg.cs new file mode 100644 index 0000000..8379b71 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsg.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("BDAD721B-7A00-440D-8964-70427167DD36")] +[CoClass(typeof(WndMsgClass))] +public interface WndMsg : IWndMsg +{ +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsgClass.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsgClass.cs new file mode 100644 index 0000000..057df47 --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/WndMsgClass.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Input; + +[ComImport] +[Guid("85AB0296-124E-4E68-A6A8-FCF5721AC09B")] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class WndMsgClass : IWndMsg, WndMsg +{ + [DispId(1)] + public virtual extern int HWND + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + } + + [DispId(2)] + public virtual extern int Message + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + get; + } + + [DispId(3)] + public virtual extern int WParam + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern int LParam + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + public virtual extern bool Eat + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.Input/Decal.Interop.Input/eActionUse.cs b/Managed/Decal.Interop.Input/Decal.Interop.Input/eActionUse.cs new file mode 100644 index 0000000..dd8d9ff --- /dev/null +++ b/Managed/Decal.Interop.Input/Decal.Interop.Input/eActionUse.cs @@ -0,0 +1,7 @@ +namespace Decal.Interop.Input; + +public enum eActionUse +{ + eActionExecute, + eActionStack +} diff --git a/Managed/Decal.Interop.Input/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Input/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..544f164 --- /dev/null +++ b/Managed/Decal.Interop.Input/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: Guid("3a985f2b-bad5-43bf-9008-ed4ebbb45b6e")] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: ImportedFromTypeLib("DecalInput")] +[assembly: TypeLibVersion(2, 0)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net.csproj b/Managed/Decal.Interop.Net/Decal.Interop.Net.csproj new file mode 100644 index 0000000..cf8c10e --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net.csproj @@ -0,0 +1,8 @@ + + + Decal.Interop.Net + + + + + diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage.cs new file mode 100644 index 0000000..8834fc7 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage.cs @@ -0,0 +1,75 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[TypeLibType(4160)] +[Guid("23EE0804-EAC7-493B-BB9D-2298FD44FFA1")] +[SuppressUnmanagedCodeSecurity] +public interface IMessage +{ + [DispId(1610743808)] + int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [DispId(1610743809)] + byte[] RawData + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] + get; + } + + [DispId(1610743810)] + object Value + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [TypeLibFunc(256)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610743811)] + IMessageMember Struct + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [TypeLibFunc(256)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743812)] + byte[] RawValue + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] + get; + } + + [DispId(1610743813)] + string FieldName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610743814)] + int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + get; + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage2.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage2.cs new file mode 100644 index 0000000..e2e41a2 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessage2.cs @@ -0,0 +1,84 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[TypeLibType(4160)] +[Guid("38AFE740-9189-4F7C-8DE2-E61087DD9F19")] +[SuppressUnmanagedCodeSecurity] +public interface IMessage2 : IMessage +{ + [DispId(1610743808)] + new int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [DispId(1610743809)] + new byte[] RawData + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] + get; + } + + [DispId(1610743810)] + new object Value + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [TypeLibFunc(256)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610743811)] + new IMessageMember Struct + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(256)] + [DispId(1610743811)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743812)] + new byte[] RawValue + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] + get; + } + + [DispId(1610743813)] + new string FieldName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610743814)] + new int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + get; + } + + [DispId(1610809344)] + MessageRoot Begin + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809344)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageFactory.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageFactory.cs new file mode 100644 index 0000000..0797f81 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageFactory.cs @@ -0,0 +1,17 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("2D030423-5D22-4100-8C3A-6BF721C4DE50")] +public interface IMessageFactory +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.Interface)] + IMessage2 CreateMessage(int pData, int size, bool outgoing); +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageIterator.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageIterator.cs new file mode 100644 index 0000000..7323418 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageIterator.cs @@ -0,0 +1,111 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("853BFE61-6C14-4244-8B96-96F0C9647DE6")] +[TypeLibType(4160)] +public interface IMessageIterator +{ + [DispId(1610743808)] + object Next + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610743809)] + object Current + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610743810)] + string FieldName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610743811)] + int Index + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + } + + [DispId(1610743812)] + string NextString + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610743813)] + int NextInt + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + get; + } + + [DispId(1610743814)] + double NextFloat + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + get; + } + + [DispId(1610743815)] + MessageRoot NextObject + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743816)] + MessageRoot NextObjectIndex + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743817)] + IMessage Message + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + void Reset(); + + [DispId(1610743819)] + ulong NextQWord + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + get; + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageMember.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageMember.cs new file mode 100644 index 0000000..e2f4478 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IMessageMember.cs @@ -0,0 +1,74 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4160)] +[Guid("05D14E34-0A23-4A9F-95CF-9DB24B3CFB9F")] +public interface IMessageMember +{ + [DispId(1610743808)] + object Value + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [TypeLibFunc(256)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610743809)] + byte[] RawValue + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] + get; + } + + [DispId(1610743810)] + IMessageMember Struct + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(256)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743811)] + string FieldName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610743812)] + int Count + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + get; + } + + [DispId(1610743813)] + int BeginOffset + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + get; + } + + [DispId(1610743814)] + int EndOffset + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + get; + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/INetService.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/INetService.cs new file mode 100644 index 0000000..29ed869 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/INetService.cs @@ -0,0 +1,45 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Net; + +[ComImport] +[InterfaceType(1)] +[Guid("AA405035-E001-4CC3-B43A-156206843D64")] +[SuppressUnmanagedCodeSecurity] +public interface INetService +{ + [DispId(1610678272)] + DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678273)] + object Filter + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610678274)] + object FilterVB + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [DispId(1610678275)] + ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter.cs new file mode 100644 index 0000000..932d178 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter.cs @@ -0,0 +1,16 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("B04FC03E-504A-4711-AB82-6258149AB8E9")] +public interface INetworkFilter +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Dispatch([MarshalAs(UnmanagedType.Interface)] IMessage Message); +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter2.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter2.cs new file mode 100644 index 0000000..d167d99 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/INetworkFilter2.cs @@ -0,0 +1,24 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[Guid("07F65937-387A-4539-8745-5603A2E029B1")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(1)] +public interface INetworkFilter2 +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void DispatchServer([MarshalAs(UnmanagedType.Interface)] IMessage2 Message); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void DispatchClient([MarshalAs(UnmanagedType.Interface)] IMessage2 Message); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Initialize([MarshalAs(UnmanagedType.Interface)] NetService pService); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Terminate(); +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequest.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequest.cs new file mode 100644 index 0000000..8ef594f --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequest.cs @@ -0,0 +1,20 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[Guid("03F3E2D0-7026-4C11-988A-4B3C58C71917")] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +public interface IWebRequest +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + void Get([MarshalAs(UnmanagedType.BStr)] string strURL); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + void Post([MarshalAs(UnmanagedType.BStr)] string strURL, [MarshalAs(UnmanagedType.BStr)] string strPostData); +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents.cs new file mode 100644 index 0000000..7f17b7a --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents.cs @@ -0,0 +1,21 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[Guid("EEFA38DC-15B2-4232-B5BE-5A9ECB8E1A58")] +[InterfaceType(2)] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +public interface IWebRequestEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Begin(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void End(int nResultCode, [MarshalAs(UnmanagedType.BStr)] string strText); +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_BeginEventHandler.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_BeginEventHandler.cs new file mode 100644 index 0000000..99043d5 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_BeginEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Net; + +[ComVisible(false)] +public delegate void IWebRequestEvents_BeginEventHandler(); diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EndEventHandler.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EndEventHandler.cs new file mode 100644 index 0000000..5822e24 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EndEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Net; + +[ComVisible(false)] +public delegate void IWebRequestEvents_EndEventHandler(int nResultCode, [MarshalAs(UnmanagedType.BStr)] string strText); diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_Event.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_Event.cs new file mode 100644 index 0000000..e7c637c --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_Event.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Net; + +[ComVisible(false)] +[TypeLibType(16)] +public interface IWebRequestEvents_Event +{ + event IWebRequestEvents_BeginEventHandler Begin; + + event IWebRequestEvents_EndEventHandler End; +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EventProvider.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EventProvider.cs new file mode 100644 index 0000000..9eaa104 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_EventProvider.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Net; + +internal sealed class IWebRequestEvents_EventProvider : IWebRequestEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 220, 56, 250, 238, 178, 21, 50, 66, 181, 190, + 90, 158, 203, 142, 26, 88 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IWebRequestEvents_BeginEventHandler IWebRequestEvents_Event.Begin + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWebRequestEvents_SinkHelper webRequestEvents_SinkHelper = new IWebRequestEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(webRequestEvents_SinkHelper, out pdwCookie); + webRequestEvents_SinkHelper.m_dwCookie = pdwCookie; + webRequestEvents_SinkHelper.m_BeginDelegate = value; + m_aEventSinkHelpers.Add(webRequestEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWebRequestEvents_SinkHelper webRequestEvents_SinkHelper = (IWebRequestEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (webRequestEvents_SinkHelper.m_BeginDelegate != null && ((webRequestEvents_SinkHelper.m_BeginDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(webRequestEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event IWebRequestEvents_EndEventHandler IWebRequestEvents_Event.End + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IWebRequestEvents_SinkHelper webRequestEvents_SinkHelper = new IWebRequestEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(webRequestEvents_SinkHelper, out pdwCookie); + webRequestEvents_SinkHelper.m_dwCookie = pdwCookie; + webRequestEvents_SinkHelper.m_EndDelegate = value; + m_aEventSinkHelpers.Add(webRequestEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IWebRequestEvents_SinkHelper webRequestEvents_SinkHelper = (IWebRequestEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (webRequestEvents_SinkHelper.m_EndDelegate != null && ((webRequestEvents_SinkHelper.m_EndDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(webRequestEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IWebRequestEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IWebRequestEvents_SinkHelper webRequestEvents_SinkHelper = (IWebRequestEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(webRequestEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_SinkHelper.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_SinkHelper.cs new file mode 100644 index 0000000..36ecf6e --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/IWebRequestEvents_SinkHelper.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Net; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IWebRequestEvents_SinkHelper : IWebRequestEvents +{ + public IWebRequestEvents_BeginEventHandler m_BeginDelegate; + + public IWebRequestEvents_EndEventHandler m_EndDelegate; + + public int m_dwCookie; + + public void Begin() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_BeginDelegate != null) + { + m_BeginDelegate(); + } + } + + public void End(int P_0, string P_1) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_EndDelegate != null) + { + m_EndDelegate(P_0, P_1); + } + } + + internal IWebRequestEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_BeginDelegate = null; + m_EndDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRoot.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRoot.cs new file mode 100644 index 0000000..2129c26 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRoot.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Net; + +[ComImport] +[CoClass(typeof(MessageRootClass))] +[Guid("853BFE61-6C14-4244-8B96-96F0C9647DE6")] +public interface MessageRoot : IMessageIterator +{ +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRootClass.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRootClass.cs new file mode 100644 index 0000000..f44f697 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/MessageRootClass.cs @@ -0,0 +1,111 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("7A85E352-B133-4AB5-A9DA-85978005BF88")] +public class MessageRootClass : IMessageIterator, MessageRoot +{ + [DispId(1610743808)] + public virtual extern object Next + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610743809)] + public virtual extern object Current + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.Struct)] + get; + } + + [DispId(1610743810)] + public virtual extern string FieldName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610743811)] + public virtual extern int Index + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + } + + [DispId(1610743812)] + public virtual extern string NextString + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(1610743813)] + public virtual extern int NextInt + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + get; + } + + [DispId(1610743814)] + public virtual extern double NextFloat + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + get; + } + + [DispId(1610743815)] + public virtual extern MessageRoot NextObject + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743816)] + public virtual extern MessageRoot NextObjectIndex + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743817)] + public virtual extern IMessage Message + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610743819)] + public virtual extern ulong NextQWord + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + public virtual extern void Reset(); +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/NetService.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/NetService.cs new file mode 100644 index 0000000..1725acc --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/NetService.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Net; + +[ComImport] +[Guid("AA405035-E001-4CC3-B43A-156206843D64")] +[CoClass(typeof(NetServiceClass))] +public interface NetService : INetService +{ +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/NetServiceClass.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/NetServiceClass.cs new file mode 100644 index 0000000..72a44f5 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/NetServiceClass.cs @@ -0,0 +1,46 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Net; + +[ComImport] +[Guid("C8C406F8-BA2E-4964-8B04-FF38394A8E0E")] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +public class NetServiceClass : INetService, NetService +{ + [DispId(1610678272)] + public virtual extern DecalCore Decal + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(1610678273)] + public virtual extern object Filter + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [DispId(1610678274)] + public virtual extern object FilterVB + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + [DispId(1610678275)] + public virtual extern ACHooks Hooks + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequest.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequest.cs new file mode 100644 index 0000000..a4bc882 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequest.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Net; + +[ComImport] +[Guid("03F3E2D0-7026-4C11-988A-4B3C58C71917")] +[CoClass(typeof(WebRequestClass))] +public interface WebRequest : IWebRequest, IWebRequestEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequestClass.cs b/Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequestClass.cs new file mode 100644 index 0000000..7c7d722 --- /dev/null +++ b/Managed/Decal.Interop.Net/Decal.Interop.Net/WebRequestClass.cs @@ -0,0 +1,26 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Net; + +[ComImport] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.Net.IWebRequestEvents\0\0")] +[Guid("15631E36-55CB-4D16-ADE7-74D9F8A5F4B6")] +public class WebRequestClass : IWebRequest, WebRequest, IWebRequestEvents_Event +{ + public virtual extern event IWebRequestEvents_BeginEventHandler Begin; + + public virtual extern event IWebRequestEvents_EndEventHandler End; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + public virtual extern void Get([MarshalAs(UnmanagedType.BStr)] string strURL); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + public virtual extern void Post([MarshalAs(UnmanagedType.BStr)] string strURL, [MarshalAs(UnmanagedType.BStr)] string strPostData); +} diff --git a/Managed/Decal.Interop.Net/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Net/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b6b9e2d --- /dev/null +++ b/Managed/Decal.Interop.Net/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: ImportedFromTypeLib("DecalNet")] +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: Guid("572b87c4-93bd-46b3-a291-cd58181d25dc")] +[assembly: TypeLibVersion(2, 0)] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render.csproj b/Managed/Decal.Interop.Render/Decal.Interop.Render.csproj new file mode 100644 index 0000000..34489a5 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render.csproj @@ -0,0 +1,9 @@ + + + Decal.Interop.Render + + + + + + diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackground.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackground.cs new file mode 100644 index 0000000..eaebda7 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackground.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Render; + +[ComImport] +[CoClass(typeof(HUDBackgroundClass))] +[Guid("1B0AEBBF-D785-430F-B5B2-94FB0FABC2AF")] +public interface HUDBackground : IHUDBackground +{ +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackgroundClass.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackgroundClass.cs new file mode 100644 index 0000000..e98cfb1 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDBackgroundClass.cs @@ -0,0 +1,111 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Render; + +[ComImport] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[Guid("218432A3-8960-4D91-BBC6-8CDC105C191E")] +[ClassInterface(ClassInterfaceType.None)] +public class HUDBackgroundClass : IHUDBackground, HUDBackground +{ + [DispId(1610743808)] + public virtual extern bool Lost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [DispId(1610743811)] + public virtual extern tagRECT Region + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + set; + } + + [DispId(1610743825)] + public virtual extern tagRECT Constraints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743825)] + [TypeLibFunc(64)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610743809)] + public virtual extern void SetSurface([In][MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object GetSurface(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + public virtual extern void Fill([In] ref tagRECT FillArea, int Color = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + public virtual extern void Clear([In] ref tagRECT ClearArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + public virtual extern void BeginRender([In] bool bFilterTexture = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + public virtual extern void EndRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + public virtual extern void BeginText([In][MarshalAs(UnmanagedType.BStr)] string FontName, int lHeight, int lWeight, [In] bool bItalic = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + public virtual extern void EndText(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + public virtual extern void DrawPortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + public virtual extern void DrawPortalImageEx([In] int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743821)] + public virtual extern void DrawImage([In] int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + public virtual extern void WriteText([In] ref tagRECT Region, int lColor, int lFormat, [MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743823)] + public virtual extern void TilePortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + public virtual extern void TilePortalImageEx([In] int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern RenderTargetWrapper Constrain([In] ref tagRECT Region); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809344)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern HUDBackground Clone(); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDView.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDView.cs new file mode 100644 index 0000000..99c442f --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDView.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Render; + +[ComImport] +[CoClass(typeof(HUDViewClass))] +[Guid("89D2D46A-FA62-466E-9D29-1A7344C30BD1")] +public interface HUDView : IHUDView +{ +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDViewClass.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDViewClass.cs new file mode 100644 index 0000000..f2a60ed --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/HUDViewClass.cs @@ -0,0 +1,215 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Render; + +[ComImport] +[TypeLibType(2)] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("EF810EF1-C843-4563-A3DE-19CE8BEEEEC0")] +public class HUDViewClass : IHUDView, HUDView +{ + [DispId(1610743808)] + public virtual extern bool Lost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [DispId(1610743811)] + public virtual extern tagRECT Region + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + set; + } + + [DispId(1610743825)] + public virtual extern tagRECT Constraints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610743825)] + get; + } + + [DispId(1610809345)] + public virtual extern float ScaleFactor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809345)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809345)] + [param: In] + set; + } + + [DispId(1610809347)] + public virtual extern bool Scaling + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809347)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809347)] + [param: In] + set; + } + + [DispId(1610809349)] + public virtual extern tagRECT ScaleRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809349)] + get; + } + + [DispId(1610874880)] + public virtual extern int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874880)] + [TypeLibFunc(64)] + get; + } + + [DispId(1610874881)] + public virtual extern bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874881)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874881)] + [param: In] + set; + } + + [DispId(1610874884)] + public virtual extern float Angle + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874884)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874884)] + [param: In] + set; + } + + [DispId(1610874886)] + public virtual extern int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874886)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874886)] + [param: In] + set; + } + + [DispId(1610874891)] + public virtual extern bool IsClipped + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874891)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [TypeLibFunc(64)] + public virtual extern void SetSurface([In][MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object GetSurface(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + public virtual extern void Fill([In] ref tagRECT FillArea, int Color = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + public virtual extern void Clear([In] ref tagRECT ClearArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + public virtual extern void BeginRender([In] bool bFilterTexture = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + public virtual extern void EndRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + public virtual extern void BeginText([In][MarshalAs(UnmanagedType.BStr)] string FontName, int lHeight, int lWeight, [In] bool bItalic = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + public virtual extern void EndText(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + public virtual extern void DrawPortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + public virtual extern void DrawPortalImageEx([In] int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743821)] + public virtual extern void DrawImage([In] int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + public virtual extern void WriteText([In] ref tagRECT Region, int lColor, int lFormat, [MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743823)] + public virtual extern void TilePortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + public virtual extern void TilePortalImageEx([In] int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern RenderTargetWrapper Constrain([In] ref tagRECT Region); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809344)] + public virtual extern void ScaleTo([In] ref tagRECT pArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874883)] + public virtual extern void SetBackground([In][MarshalAs(UnmanagedType.Interface)] HUDBackground pBackground); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874888)] + public virtual extern void PushClipRegion([In] ref tagRECT Region); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874889)] + public virtual extern void PopClipRegion(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874890)] + public virtual extern void RemoveClipping(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874892)] + public virtual extern void MeasureText([In][MarshalAs(UnmanagedType.BStr)] string Text, out tagRECT pRet); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDBackground.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDBackground.cs new file mode 100644 index 0000000..fdb1545 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDBackground.cs @@ -0,0 +1,110 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Render; + +[ComImport] +[Guid("1B0AEBBF-D785-430F-B5B2-94FB0FABC2AF")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4288)] +public interface IHUDBackground : IRenderTarget +{ + [DispId(1610743808)] + new bool Lost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [TypeLibFunc(64)] + new void SetSurface([In][MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.IUnknown)] + new object GetSurface(); + + [DispId(1610743811)] + new tagRECT Region + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + new void Fill([In] ref tagRECT FillArea, int Color = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + new void Clear([In] ref tagRECT ClearArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + new void BeginRender([In] bool bFilterTexture = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + new void EndRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + new void BeginText([In][MarshalAs(UnmanagedType.BStr)] string FontName, int lHeight, int lWeight, [In] bool bItalic = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + new void EndText(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + new void DrawPortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + new void DrawPortalImageEx([In] int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743821)] + new void DrawImage([In] int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + new void WriteText([In] ref tagRECT Region, int lColor, int lFormat, [MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743823)] + new void TilePortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + new void TilePortalImageEx([In] int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea); + + [DispId(1610743825)] + new tagRECT Constraints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610743825)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + [return: MarshalAs(UnmanagedType.Interface)] + new RenderTargetWrapper Constrain([In] ref tagRECT Region); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809344)] + [return: MarshalAs(UnmanagedType.Interface)] + HUDBackground Clone(); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDView.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDView.cs new file mode 100644 index 0000000..5b9c9f0 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IHUDView.cs @@ -0,0 +1,214 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Render; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[Guid("89D2D46A-FA62-466E-9D29-1A7344C30BD1")] +[TypeLibType(4288)] +public interface IHUDView : IRenderScalable +{ + [DispId(1610743808)] + new bool Lost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [TypeLibFunc(64)] + new void SetSurface([In][MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.IUnknown)] + new object GetSurface(); + + [DispId(1610743811)] + new tagRECT Region + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + new void Fill([In] ref tagRECT FillArea, int Color = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + new void Clear([In] ref tagRECT ClearArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + new void BeginRender([In] bool bFilterTexture = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + new void EndRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + new void BeginText([In][MarshalAs(UnmanagedType.BStr)] string FontName, int lHeight, int lWeight, [In] bool bItalic = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + new void EndText(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + new void DrawPortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + new void DrawPortalImageEx([In] int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743821)] + new void DrawImage([In] int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + new void WriteText([In] ref tagRECT Region, int lColor, int lFormat, [MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743823)] + new void TilePortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + new void TilePortalImageEx([In] int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea); + + [DispId(1610743825)] + new tagRECT Constraints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743825)] + [TypeLibFunc(64)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + [return: MarshalAs(UnmanagedType.Interface)] + new RenderTargetWrapper Constrain([In] ref tagRECT Region); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809344)] + new void ScaleTo([In] ref tagRECT pArea); + + [DispId(1610809345)] + new float ScaleFactor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809345)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809345)] + [param: In] + set; + } + + [DispId(1610809347)] + new bool Scaling + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809347)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809347)] + [param: In] + set; + } + + [DispId(1610809349)] + new tagRECT ScaleRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809349)] + get; + } + + [DispId(1610874880)] + int ID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610874880)] + get; + } + + [DispId(1610874881)] + bool Enabled + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874881)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874881)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874883)] + void SetBackground([In][MarshalAs(UnmanagedType.Interface)] HUDBackground pBackground); + + [DispId(1610874884)] + float Angle + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874884)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874884)] + [param: In] + set; + } + + [DispId(1610874886)] + int Alpha + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874886)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874886)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874888)] + void PushClipRegion([In] ref tagRECT Region); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874889)] + void PopClipRegion(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874890)] + void RemoveClipping(); + + [DispId(1610874891)] + bool IsClipped + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874891)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610874892)] + void MeasureText([In][MarshalAs(UnmanagedType.BStr)] string Text, out tagRECT pRet); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderScalable.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderScalable.cs new file mode 100644 index 0000000..41b5261 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderScalable.cs @@ -0,0 +1,141 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Render; + +[ComImport] +[TypeLibType(4288)] +[Guid("66B36C61-0020-4FF8-A717-1B53F97556C7")] +[SuppressUnmanagedCodeSecurity] +public interface IRenderScalable : IRenderTarget +{ + [DispId(1610743808)] + new bool Lost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610743809)] + new void SetSurface([In][MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.IUnknown)] + new object GetSurface(); + + [DispId(1610743811)] + new tagRECT Region + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + new void Fill([In] ref tagRECT FillArea, int Color = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + new void Clear([In] ref tagRECT ClearArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + new void BeginRender([In] bool bFilterTexture = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + new void EndRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + new void BeginText([In][MarshalAs(UnmanagedType.BStr)] string FontName, int lHeight, int lWeight, [In] bool bItalic = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + new void EndText(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + new void DrawPortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + new void DrawPortalImageEx([In] int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743821)] + new void DrawImage([In] int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + new void WriteText([In] ref tagRECT Region, int lColor, int lFormat, [MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743823)] + new void TilePortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + new void TilePortalImageEx([In] int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea); + + [DispId(1610743825)] + new tagRECT Constraints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743825)] + [TypeLibFunc(64)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + [return: MarshalAs(UnmanagedType.Interface)] + new RenderTargetWrapper Constrain([In] ref tagRECT Region); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809344)] + void ScaleTo([In] ref tagRECT pArea); + + [DispId(1610809345)] + float ScaleFactor + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809345)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809345)] + [param: In] + set; + } + + [DispId(1610809347)] + bool Scaling + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809347)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809347)] + [param: In] + set; + } + + [DispId(1610809349)] + tagRECT ScaleRect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610809349)] + get; + } +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderService.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderService.cs new file mode 100644 index 0000000..7575a8f --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderService.cs @@ -0,0 +1,47 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.Interop.Render; + +[ComImport] +[TypeLibType(4288)] +[SuppressUnmanagedCodeSecurity] +[Guid("BB70ABAC-FF03-41FE-8714-C24692C10827")] +public interface IRenderService +{ + [DispId(1610743808)] + object Device + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.Interface)] + HUDView CreateHUD([In] ref tagRECT pRegion); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.Interface)] + HUDBackground CreateBackground([In] ref tagRECT pRegion); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [return: MarshalAs(UnmanagedType.Interface)] + HUDView EncapsulateHUD([In] ref tagPOINT Coords, [MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + [return: MarshalAs(UnmanagedType.Interface)] + HUDBackground EncapsulateBackground([In] ref tagPOINT Coords, [MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + void RemoveHUD([In][MarshalAs(UnmanagedType.Interface)] HUDView pHUD); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents.cs new file mode 100644 index 0000000..8f95cff --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents.cs @@ -0,0 +1,17 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.Render; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4096)] +[InterfaceType(2)] +[Guid("3C49F52D-55FF-42D8-99B0-BB185E9A684F")] +public interface IRenderServiceEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void DeviceLost(); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_DeviceLostEventHandler.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_DeviceLostEventHandler.cs new file mode 100644 index 0000000..ce8abbb --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_DeviceLostEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Render; + +[ComVisible(false)] +public delegate void IRenderServiceEvents_DeviceLostEventHandler(); diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_Event.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_Event.cs new file mode 100644 index 0000000..e547064 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_Event.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Render; + +[TypeLibType(16)] +[ComVisible(false)] +public interface IRenderServiceEvents_Event +{ + event IRenderServiceEvents_DeviceLostEventHandler DeviceLost; +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_EventProvider.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_EventProvider.cs new file mode 100644 index 0000000..f9473e6 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_EventProvider.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.Render; + +internal sealed class IRenderServiceEvents_EventProvider : IRenderServiceEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 45, 245, 73, 60, 255, 85, 216, 66, 153, 176, + 187, 24, 94, 154, 104, 79 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event IRenderServiceEvents_DeviceLostEventHandler IRenderServiceEvents_Event.DeviceLost + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + IRenderServiceEvents_SinkHelper renderServiceEvents_SinkHelper = new IRenderServiceEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(renderServiceEvents_SinkHelper, out pdwCookie); + renderServiceEvents_SinkHelper.m_dwCookie = pdwCookie; + renderServiceEvents_SinkHelper.m_DeviceLostDelegate = value; + m_aEventSinkHelpers.Add(renderServiceEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + IRenderServiceEvents_SinkHelper renderServiceEvents_SinkHelper = (IRenderServiceEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (renderServiceEvents_SinkHelper.m_DeviceLostDelegate != null && ((renderServiceEvents_SinkHelper.m_DeviceLostDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(renderServiceEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public IRenderServiceEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + IRenderServiceEvents_SinkHelper renderServiceEvents_SinkHelper = (IRenderServiceEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(renderServiceEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_SinkHelper.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_SinkHelper.cs new file mode 100644 index 0000000..a58cfb4 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderServiceEvents_SinkHelper.cs @@ -0,0 +1,28 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Render; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class IRenderServiceEvents_SinkHelper : IRenderServiceEvents +{ + public IRenderServiceEvents_DeviceLostEventHandler m_DeviceLostDelegate; + + public int m_dwCookie; + + public void DeviceLost() + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_DeviceLostDelegate != null) + { + m_DeviceLostDelegate(); + } + } + + internal IRenderServiceEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_DeviceLostDelegate = null; + } +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderTarget.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderTarget.cs new file mode 100644 index 0000000..b2802a2 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/IRenderTarget.cs @@ -0,0 +1,105 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Render; + +[ComImport] +[Guid("F229E8CB-6F85-46F5-9C8A-8399F60A37CB")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(4288)] +public interface IRenderTarget +{ + [DispId(1610743808)] + bool Lost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610743809)] + void SetSurface([In][MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.IUnknown)] + object GetSurface(); + + [DispId(1610743811)] + tagRECT Region + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + set; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + void Fill([In] ref tagRECT FillArea, int Color = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + void Clear([In] ref tagRECT ClearArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + void BeginRender([In] bool bFilterTexture = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + void EndRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + void BeginText([In][MarshalAs(UnmanagedType.BStr)] string FontName, int lHeight, int lWeight, [In] bool bItalic = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + void EndText(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + void DrawPortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + void DrawPortalImageEx([In] int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743821)] + void DrawImage([In] int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + void WriteText([In] ref tagRECT Region, int lColor, int lFormat, [MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743823)] + void TilePortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + void TilePortalImageEx([In] int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea); + + [DispId(1610743825)] + tagRECT Constraints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743825)] + [TypeLibFunc(64)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + [return: MarshalAs(UnmanagedType.Interface)] + RenderTargetWrapper Constrain([In] ref tagRECT Region); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderService.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderService.cs new file mode 100644 index 0000000..eef775f --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderService.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Render; + +[ComImport] +[CoClass(typeof(RenderServiceClass))] +[Guid("BB70ABAC-FF03-41FE-8714-C24692C10827")] +public interface RenderService : IRenderService, IRenderServiceEvents_Event +{ +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderServiceClass.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderServiceClass.cs new file mode 100644 index 0000000..9b3cf1c --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderServiceClass.cs @@ -0,0 +1,51 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; +using Decal.Interop.Inject; + +namespace Decal.Interop.Render; + +[ComImport] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[ComSourceInterfaces("Decal.Interop.Render.IRenderServiceEvents\0\0")] +[Guid("FB3C8286-88ED-4B4D-B413-94B40F346239")] +[SuppressUnmanagedCodeSecurity] +public class RenderServiceClass : IRenderService, RenderService, IRenderServiceEvents_Event +{ + [DispId(1610743808)] + public virtual extern object Device + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + [return: MarshalAs(UnmanagedType.IUnknown)] + get; + } + + public virtual extern event IRenderServiceEvents_DeviceLostEventHandler DeviceLost; + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743809)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern HUDView CreateHUD([In] ref tagRECT pRegion); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern HUDBackground CreateBackground([In] ref tagRECT pRegion); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern HUDView EncapsulateHUD([In] ref tagPOINT Coords, [MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743812)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern HUDBackground EncapsulateBackground([In] ref tagPOINT Coords, [MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + public virtual extern void RemoveHUD([In][MarshalAs(UnmanagedType.Interface)] HUDView pHUD); +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapper.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapper.cs new file mode 100644 index 0000000..45452be --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapper.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.Render; + +[ComImport] +[Guid("F229E8CB-6F85-46F5-9C8A-8399F60A37CB")] +[CoClass(typeof(RenderTargetWrapperClass))] +public interface RenderTargetWrapper : IRenderTarget +{ +} diff --git a/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapperClass.cs b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapperClass.cs new file mode 100644 index 0000000..8b488f0 --- /dev/null +++ b/Managed/Decal.Interop.Render/Decal.Interop.Render/RenderTargetWrapperClass.cs @@ -0,0 +1,106 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; +using Decal.Interop.Core; + +namespace Decal.Interop.Render; + +[ComImport] +[TypeLibType(2)] +[ClassInterface(ClassInterfaceType.None)] +[Guid("175D6713-E942-41C0-8BC9-90A565024F76")] +[SuppressUnmanagedCodeSecurity] +public class RenderTargetWrapperClass : IRenderTarget, RenderTargetWrapper +{ + [DispId(1610743808)] + public virtual extern bool Lost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743808)] + get; + } + + [DispId(1610743811)] + public virtual extern tagRECT Region + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743811)] + [param: In] + set; + } + + [DispId(1610743825)] + public virtual extern tagRECT Constraints + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743825)] + [TypeLibFunc(64)] + get; + } + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(1610743809)] + public virtual extern void SetSurface([In][MarshalAs(UnmanagedType.IUnknown)] object pSurface); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743810)] + [return: MarshalAs(UnmanagedType.IUnknown)] + public virtual extern object GetSurface(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743813)] + public virtual extern void Fill([In] ref tagRECT FillArea, int Color = 0); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743814)] + public virtual extern void Clear([In] ref tagRECT ClearArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743815)] + public virtual extern void BeginRender([In] bool bFilterTexture = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743816)] + public virtual extern void EndRender(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743817)] + public virtual extern void BeginText([In][MarshalAs(UnmanagedType.BStr)] string FontName, int lHeight, int lWeight, [In] bool bItalic = false); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743818)] + public virtual extern void EndText(); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743819)] + public virtual extern void DrawPortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743820)] + public virtual extern void DrawPortalImageEx([In] int lPortalFile, int lAlpha, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743821)] + public virtual extern void DrawImage([In] int pBuffer, int lSize, ref tagRECT DestRegion, int lColorKey); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743822)] + public virtual extern void WriteText([In] ref tagRECT Region, int lColor, int lFormat, [MarshalAs(UnmanagedType.BStr)] string Text); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743823)] + public virtual extern void TilePortalImage([In] int lPortalFile, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743824)] + public virtual extern void TilePortalImageEx([In] int lPortalFile, ref tagRECT SrcArea, ref tagRECT DestArea); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1610743826)] + [return: MarshalAs(UnmanagedType.Interface)] + public virtual extern RenderTargetWrapper Constrain([In] ref tagRECT Region); +} diff --git a/Managed/Decal.Interop.Render/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.Render/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5b81905 --- /dev/null +++ b/Managed/Decal.Interop.Render/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: Guid("7436015e-89c6-4864-b21e-ee9c9194efbb")] +[assembly: ImportedFromTypeLib("DecalRender")] +[assembly: TypeLibVersion(2, 0)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter.csproj b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter.csproj new file mode 100644 index 0000000..5663bfd --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter.csproj @@ -0,0 +1,5 @@ + + + Decal.Interop.SpellFilter + + diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Component.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Component.cs new file mode 100644 index 0000000..7e0f65d --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Component.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[CoClass(typeof(ComponentClass))] +[Guid("4818142F-B10C-4EC5-A794-8A87E1ABAF09")] +public interface Component : IComponent +{ +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ComponentClass.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ComponentClass.cs new file mode 100644 index 0000000..e87738a --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ComponentClass.cs @@ -0,0 +1,125 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[ClassInterface(ClassInterfaceType.None)] +[Guid("20425F2F-54FF-4EAE-9538-36699E3DFB56")] +[SuppressUnmanagedCodeSecurity] +[TypeLibType(2)] +public class ComponentClass : IComponent, Component +{ + [DispId(1)] + public virtual extern int ComponentID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + set; + } + + [DispId(2)] + public virtual extern string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + public virtual extern int Icon + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + set; + } + + [DispId(4)] + public virtual extern int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [param: In] + set; + } + + [DispId(5)] + public virtual extern int Animation + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } + + [DispId(6)] + public virtual extern float Charge + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [param: In] + set; + } + + [DispId(7)] + public virtual extern string PowerWord + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(8)] + public virtual extern int BurnRate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [param: In] + set; + } + + [DispId(9)] + public virtual extern int Dummy1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/IComponent.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/IComponent.cs new file mode 100644 index 0000000..4d0e2ec --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/IComponent.cs @@ -0,0 +1,124 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[TypeLibType(4160)] +[Guid("4818142F-B10C-4EC5-A794-8A87E1ABAF09")] +[SuppressUnmanagedCodeSecurity] +public interface IComponent +{ + [DispId(1)] + int ComponentID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + set; + } + + [DispId(2)] + string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + int Icon + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + set; + } + + [DispId(4)] + int Type + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [param: In] + set; + } + + [DispId(5)] + int Animation + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } + + [DispId(6)] + float Charge + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [param: In] + set; + } + + [DispId(7)] + string PowerWord + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(8)] + int BurnRate + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [param: In] + set; + } + + [DispId(9)] + int Dummy1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpell.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpell.cs new file mode 100644 index 0000000..5b76bcc --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpell.cs @@ -0,0 +1,463 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("B445A795-77B4-4069-9129-BB2A97651CFA")] +public interface ISpell +{ + [DispId(1)] + int SpellID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + set; + } + + [DispId(2)] + string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + string Description + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(4)] + int SpellSchool + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [param: In] + set; + } + + [DispId(5)] + int Icon + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } + + [DispId(6)] + int Effect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [param: In] + set; + } + + [DispId(7)] + int Flags + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [param: In] + set; + } + + [DispId(8)] + int ManaCost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [param: In] + set; + } + + [DispId(9)] + int Difficulty + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [param: In] + set; + } + + [DispId(10)] + float Economy + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [param: In] + set; + } + + [DispId(11)] + int SpellVersion + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [param: In] + set; + } + + [DispId(12)] + int SpellType + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [param: In] + set; + } + + [DispId(13)] + double Duration + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + [param: In] + set; + } + + [DispId(14)] + bool Researchable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [param: In] + set; + } + + [DispId(15)] + int Component + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(16)] + int Misc + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(16)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(17)] + float FUnknown1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [TypeLibFunc(64)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(18)] + float FUnknown2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(18)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(19)] + float FUnknown3 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(19)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(20)] + int LUnknown1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + [TypeLibFunc(64)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(20)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(21)] + int LUnknown2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + [param: In] + set; + } + + [DispId(22)] + int LUnknown3 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + [param: In] + set; + } + + [DispId(23)] + int ComponentCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + [param: In] + set; + } + + [DispId(24)] + int LUnknown4 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(24)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(25)] + int LUnknown5 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(25)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(26)] + int LUnknown6 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + [param: In] + set; + } + + [DispId(27)] + int TargetMask + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + [param: In] + set; + } + + [DispId(28)] + float RangeBase + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + [param: In] + set; + } + + [DispId(29)] + float RangeModifier + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + [param: In] + set; + } + + [DispId(30)] + float Speed + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + [param: In] + set; + } + + [DispId(31)] + int ID2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(31)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(31)] + [param: In] + set; + } + + [DispId(32)] + int SortOrder + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(32)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(32)] + [param: In] + set; + } + + [DispId(33)] + int Misc2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(33)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(33)] + [param: In] + set; + } + + [DispId(34)] + int EffectOnCaster + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(34)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(34)] + [param: In] + set; + } + + [DispId(35)] + int EffectOnTarget + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(35)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(35)] + [param: In] + set; + } + + [DispId(36)] + double DurationUnk + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(36)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(36)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpells.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpells.cs new file mode 100644 index 0000000..7154e20 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/ISpells.cs @@ -0,0 +1,73 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[TypeLibType(4160)] +[SuppressUnmanagedCodeSecurity] +[Guid("BCB57D92-7FCD-477C-B078-C45D205435AC")] +public interface ISpells +{ + [DispId(1)] + Spell SpellByID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(2)] + Spell SpellByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(3)] + bool SpellKnown + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + int LastSpellID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + string Server + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(6)] + Component ComponentByID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(7)] + Component ComponentByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spell.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spell.cs new file mode 100644 index 0000000..a9aa8ff --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spell.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[Guid("B445A795-77B4-4069-9129-BB2A97651CFA")] +[CoClass(typeof(SpellClass))] +public interface Spell : ISpell +{ +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellClass.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellClass.cs new file mode 100644 index 0000000..d524bde --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellClass.cs @@ -0,0 +1,464 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[Guid("3040368A-B77A-4FE1-B8CC-D77FA3F36A6D")] +[TypeLibType(2)] +public class SpellClass : ISpell, Spell +{ + [DispId(1)] + public virtual extern int SpellID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [param: In] + set; + } + + [DispId(2)] + public virtual extern string Name + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(3)] + public virtual extern string Description + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + [param: In] + [param: MarshalAs(UnmanagedType.BStr)] + set; + } + + [DispId(4)] + public virtual extern int SpellSchool + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + [param: In] + set; + } + + [DispId(5)] + public virtual extern int Icon + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [param: In] + set; + } + + [DispId(6)] + public virtual extern int Effect + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [param: In] + set; + } + + [DispId(7)] + public virtual extern int Flags + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [param: In] + set; + } + + [DispId(8)] + public virtual extern int ManaCost + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(8)] + [param: In] + set; + } + + [DispId(9)] + public virtual extern int Difficulty + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(9)] + [param: In] + set; + } + + [DispId(10)] + public virtual extern float Economy + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(10)] + [param: In] + set; + } + + [DispId(11)] + public virtual extern int SpellVersion + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(11)] + [param: In] + set; + } + + [DispId(12)] + public virtual extern int SpellType + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(12)] + [param: In] + set; + } + + [DispId(13)] + public virtual extern double Duration + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(13)] + [param: In] + set; + } + + [DispId(14)] + public virtual extern bool Researchable + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(14)] + [param: In] + set; + } + + [DispId(15)] + public virtual extern int Component + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(15)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(16)] + public virtual extern int Misc + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(16)] + [TypeLibFunc(64)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(16)] + [param: In] + set; + } + + [DispId(17)] + public virtual extern float FUnknown1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(17)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(17)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(18)] + public virtual extern float FUnknown2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(18)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(18)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(19)] + public virtual extern float FUnknown3 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(19)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(19)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(20)] + public virtual extern int LUnknown1 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(20)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(20)] + [param: In] + set; + } + + [DispId(21)] + public virtual extern int LUnknown2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(21)] + [param: In] + set; + } + + [DispId(22)] + public virtual extern int LUnknown3 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(22)] + [param: In] + set; + } + + [DispId(23)] + public virtual extern int ComponentCount + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(23)] + [param: In] + set; + } + + [DispId(24)] + public virtual extern int LUnknown4 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + [TypeLibFunc(64)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(24)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(25)] + public virtual extern int LUnknown5 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [TypeLibFunc(64)] + [DispId(25)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(25)] + [TypeLibFunc(64)] + [param: In] + set; + } + + [DispId(26)] + public virtual extern int LUnknown6 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(26)] + [param: In] + set; + } + + [DispId(27)] + public virtual extern int TargetMask + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(27)] + [param: In] + set; + } + + [DispId(28)] + public virtual extern float RangeBase + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(28)] + [param: In] + set; + } + + [DispId(29)] + public virtual extern float RangeModifier + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(29)] + [param: In] + set; + } + + [DispId(30)] + public virtual extern float Speed + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(30)] + [param: In] + set; + } + + [DispId(31)] + public virtual extern int ID2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(31)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(31)] + [param: In] + set; + } + + [DispId(32)] + public virtual extern int SortOrder + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(32)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(32)] + [param: In] + set; + } + + [DispId(33)] + public virtual extern int Misc2 + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(33)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(33)] + [param: In] + set; + } + + [DispId(34)] + public virtual extern int EffectOnCaster + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(34)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(34)] + [param: In] + set; + } + + [DispId(35)] + public virtual extern int EffectOnTarget + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(35)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(35)] + [param: In] + set; + } + + [DispId(36)] + public virtual extern double DurationUnk + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(36)] + get; + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(36)] + [param: In] + set; + } +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spells.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spells.cs new file mode 100644 index 0000000..b9fd87a --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/Spells.cs @@ -0,0 +1,10 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[Guid("BCB57D92-7FCD-477C-B078-C45D205435AC")] +[CoClass(typeof(SpellsClass))] +public interface Spells : ISpells, _ISpellsEvents_Event +{ +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellsClass.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellsClass.cs new file mode 100644 index 0000000..81370e1 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/SpellsClass.cs @@ -0,0 +1,81 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[SuppressUnmanagedCodeSecurity] +[ClassInterface(ClassInterfaceType.None)] +[TypeLibType(2)] +[ComSourceInterfaces("Decal.Interop.SpellFilter._ISpellsEvents\0\0")] +[Guid("C2D43735-BE7E-4829-AF73-F2E7E820EB16")] +public class SpellsClass : ISpells, Spells, _ISpellsEvents_Event +{ + [DispId(1)] + public virtual extern Spell SpellByID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(2)] + public virtual extern Spell SpellByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(3)] + public virtual extern bool SpellKnown + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + get; + } + + [DispId(4)] + public virtual extern int LastSpellID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(4)] + get; + } + + [DispId(5)] + public virtual extern string Server + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(5)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + [DispId(6)] + public virtual extern Component ComponentByID + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(6)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + [DispId(7)] + public virtual extern Component ComponentByName + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(7)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + public virtual extern event _ISpellsEvents_LoginEventHandler Login; + + public virtual extern event _ISpellsEvents_Spellbook_AddEventHandler Spellbook_Add; + + public virtual extern event _ISpellsEvents_Spellbook_DeleteEventHandler Spellbook_Delete; +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents.cs new file mode 100644 index 0000000..90c3893 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents.cs @@ -0,0 +1,25 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace Decal.Interop.SpellFilter; + +[ComImport] +[TypeLibType(4096)] +[Guid("76A6E2FA-30DA-4442-A75F-D3013B044E63")] +[SuppressUnmanagedCodeSecurity] +[InterfaceType(2)] +public interface _ISpellsEvents +{ + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(1)] + void Login([In] int CharacterID); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(2)] + void Spellbook_Add(int SpellAdded); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [DispId(3)] + void Spellbook_Delete(int SpellDeleted); +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Event.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Event.cs new file mode 100644 index 0000000..9a31f00 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Event.cs @@ -0,0 +1,14 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[TypeLibType(16)] +[ComVisible(false)] +public interface _ISpellsEvents_Event +{ + event _ISpellsEvents_LoginEventHandler Login; + + event _ISpellsEvents_Spellbook_AddEventHandler Spellbook_Add; + + event _ISpellsEvents_Spellbook_DeleteEventHandler Spellbook_Delete; +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_EventProvider.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_EventProvider.cs new file mode 100644 index 0000000..582325a --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_EventProvider.cs @@ -0,0 +1,306 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; + +namespace Decal.Interop.SpellFilter; + +internal sealed class _ISpellsEvents_EventProvider : _ISpellsEvents_Event, IDisposable +{ + private IConnectionPointContainer m_ConnectionPointContainer; + + private ArrayList m_aEventSinkHelpers; + + private IConnectionPoint m_ConnectionPoint; + + private void Init() + { + IConnectionPoint ppCP = null; + Guid riid = new Guid(new byte[16] + { + 250, 226, 166, 118, 218, 48, 66, 68, 167, 95, + 211, 1, 59, 4, 78, 99 + }); + m_ConnectionPointContainer.FindConnectionPoint(ref riid, out ppCP); + m_ConnectionPoint = ppCP; + m_aEventSinkHelpers = new ArrayList(); + } + + event _ISpellsEvents_LoginEventHandler _ISpellsEvents_Event.Login + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + _ISpellsEvents_SinkHelper iSpellsEvents_SinkHelper = new _ISpellsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iSpellsEvents_SinkHelper, out pdwCookie); + iSpellsEvents_SinkHelper.m_dwCookie = pdwCookie; + iSpellsEvents_SinkHelper.m_LoginDelegate = value; + m_aEventSinkHelpers.Add(iSpellsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + _ISpellsEvents_SinkHelper iSpellsEvents_SinkHelper = (_ISpellsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iSpellsEvents_SinkHelper.m_LoginDelegate != null && ((iSpellsEvents_SinkHelper.m_LoginDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iSpellsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event _ISpellsEvents_Spellbook_AddEventHandler _ISpellsEvents_Event.Spellbook_Add + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + _ISpellsEvents_SinkHelper iSpellsEvents_SinkHelper = new _ISpellsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iSpellsEvents_SinkHelper, out pdwCookie); + iSpellsEvents_SinkHelper.m_dwCookie = pdwCookie; + iSpellsEvents_SinkHelper.m_Spellbook_AddDelegate = value; + m_aEventSinkHelpers.Add(iSpellsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + _ISpellsEvents_SinkHelper iSpellsEvents_SinkHelper = (_ISpellsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iSpellsEvents_SinkHelper.m_Spellbook_AddDelegate != null && ((iSpellsEvents_SinkHelper.m_Spellbook_AddDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iSpellsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + event _ISpellsEvents_Spellbook_DeleteEventHandler _ISpellsEvents_Event.Spellbook_Delete + { + add + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + Init(); + } + _ISpellsEvents_SinkHelper iSpellsEvents_SinkHelper = new _ISpellsEvents_SinkHelper(); + int pdwCookie = 0; + m_ConnectionPoint.Advise(iSpellsEvents_SinkHelper, out pdwCookie); + iSpellsEvents_SinkHelper.m_dwCookie = pdwCookie; + iSpellsEvents_SinkHelper.m_Spellbook_DeleteDelegate = value; + m_aEventSinkHelpers.Add(iSpellsEvents_SinkHelper); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + remove + { + + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_aEventSinkHelpers == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 >= count) + { + return; + } + do + { + _ISpellsEvents_SinkHelper iSpellsEvents_SinkHelper = (_ISpellsEvents_SinkHelper)m_aEventSinkHelpers[num]; + if (iSpellsEvents_SinkHelper.m_Spellbook_DeleteDelegate != null && ((iSpellsEvents_SinkHelper.m_Spellbook_DeleteDelegate.Equals(value) ? 1u : 0u) & 0xFFu) != 0) + { + m_aEventSinkHelpers.RemoveAt(num); + m_ConnectionPoint.Unadvise(iSpellsEvents_SinkHelper.m_dwCookie); + if (count <= 1) + { + Marshal.ReleaseComObject(m_ConnectionPoint); + m_ConnectionPoint = null; + m_aEventSinkHelpers = null; + } + break; + } + num++; + } + while (num < count); + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + + } + } + + public _ISpellsEvents_EventProvider(object P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_ConnectionPointContainer = (IConnectionPointContainer)P_0; + } + + public void Finalize() + { + bool lockTaken = default(bool); + try + { + Monitor.Enter(this, ref lockTaken); + if (m_ConnectionPoint == null) + { + return; + } + int count = m_aEventSinkHelpers.Count; + int num = 0; + if (0 < count) + { + do + { + _ISpellsEvents_SinkHelper iSpellsEvents_SinkHelper = (_ISpellsEvents_SinkHelper)m_aEventSinkHelpers[num]; + m_ConnectionPoint.Unadvise(iSpellsEvents_SinkHelper.m_dwCookie); + num++; + } + while (num < count); + } + Marshal.ReleaseComObject(m_ConnectionPoint); + } + catch (Exception) + { + } + finally + { + if (lockTaken) + { + Monitor.Exit(this); + } + } + } + + public void Dispose() + { + //Error decoding local variables: Signature type sequence must have at least one element. + Finalize(); + GC.SuppressFinalize(this); + } +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_LoginEventHandler.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_LoginEventHandler.cs new file mode 100644 index 0000000..15b6544 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_LoginEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[ComVisible(false)] +public delegate void _ISpellsEvents_LoginEventHandler([In] int CharacterID); diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_SinkHelper.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_SinkHelper.cs new file mode 100644 index 0000000..9b257df --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_SinkHelper.cs @@ -0,0 +1,52 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[TypeLibType(TypeLibTypeFlags.FHidden)] +[ClassInterface(ClassInterfaceType.None)] +public sealed class _ISpellsEvents_SinkHelper : _ISpellsEvents +{ + public _ISpellsEvents_LoginEventHandler m_LoginDelegate; + + public _ISpellsEvents_Spellbook_AddEventHandler m_Spellbook_AddDelegate; + + public _ISpellsEvents_Spellbook_DeleteEventHandler m_Spellbook_DeleteDelegate; + + public int m_dwCookie; + + public void Login(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_LoginDelegate != null) + { + m_LoginDelegate(P_0); + } + } + + public void Spellbook_Add(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_Spellbook_AddDelegate != null) + { + m_Spellbook_AddDelegate(P_0); + } + } + + public void Spellbook_Delete(int P_0) + { + //Error decoding local variables: Signature type sequence must have at least one element. + if (m_Spellbook_DeleteDelegate != null) + { + m_Spellbook_DeleteDelegate(P_0); + } + } + + internal _ISpellsEvents_SinkHelper() + { + //Error decoding local variables: Signature type sequence must have at least one element. + m_dwCookie = 0; + m_LoginDelegate = null; + m_Spellbook_AddDelegate = null; + m_Spellbook_DeleteDelegate = null; + } +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_AddEventHandler.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_AddEventHandler.cs new file mode 100644 index 0000000..964dca1 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_AddEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[ComVisible(false)] +public delegate void _ISpellsEvents_Spellbook_AddEventHandler(int SpellAdded); diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_DeleteEventHandler.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_DeleteEventHandler.cs new file mode 100644 index 0000000..8532d62 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/_ISpellsEvents_Spellbook_DeleteEventHandler.cs @@ -0,0 +1,6 @@ +using System.Runtime.InteropServices; + +namespace Decal.Interop.SpellFilter; + +[ComVisible(false)] +public delegate void _ISpellsEvents_Spellbook_DeleteEventHandler(int SpellDeleted); diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponent.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponent.cs new file mode 100644 index 0000000..a644e51 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponent.cs @@ -0,0 +1,158 @@ +namespace Decal.Interop.SpellFilter; + +public enum eComponent +{ + eLeadScarab = 1, + eIronScarab = 2, + eCopperScarab = 3, + eSilverScarab = 4, + eGoldScarab = 5, + ePyrealScarab = 6, + eHyssop = 7, + eMandrake = 8, + eSaffron = 9, + eDamiana = 10, + eMugwort = 11, + eBistort = 12, + eWormwood = 13, + eGinseng = 14, + eHawthorn = 15, + eAmaranth = 16, + eVervain = 17, + eMyrrh = 18, + eEyebright = 19, + eFrankincense = 20, + eDragonsblood = 21, + eHenbane = 22, + eComfrey = 23, + eYarrow = 24, + ePowderedAgate = 25, + ePowderedAmber = 26, + ePowderedAzurite = 27, + ePowderedBloodstone = 28, + ePowderedCarnelian = 29, + ePowderedHematite = 30, + ePowderedLapisLazuli = 31, + ePowderedMalachite = 32, + ePowderedMoonstone = 33, + ePowderedOnyx = 34, + ePowderedQuartz = 35, + ePowderedTurquoise = 36, + eBrimstone = 37, + eCadmia = 38, + eCinnabar = 39, + eCobalt = 40, + eColcothar = 41, + eGypsum = 42, + eQuicksilver = 43, + eRealgar = 44, + eStibnite = 45, + eTurpeth = 46, + eVerdigris = 47, + eVitriol = 48, + ePoplarTalisman = 49, + eBlackthornTalisman = 50, + eYewTalisman = 51, + eHemlockTalisman = 52, + eAlderTalisman = 53, + eEbonyTalisman = 54, + eBirchTalisman = 55, + eOakTalisman = 56, + eAshwoodTalisman = 57, + eElderTalisman = 58, + eHazelTalisman = 59, + eRowanTalisman = 60, + eWillowTalisman = 61, + eCedarTalisman = 62, + eRedTaper = 63, + ePinkTaper = 64, + eOrangeTaper = 65, + eYellowTaper = 66, + eGreenTaper = 67, + eTurquoiseTaper = 68, + eBlueTaper = 69, + eIndigoTaper = 70, + eVioletTaper = 71, + eWhiteTaper = 72, + eBrownTaper = 73, + eGreyTaper = 74, + eDiamondScarab = 110, + eChorizite = 111, + ePlatinumScarab = 112, + eLeadScarabPea = 113, + eIronScarabPea = 114, + eCopperScarabPea = 115, + eSilverScarabPea = 116, + eGoldScarabPea = 117, + ePyrealScarabPea = 118, + eHyssopPea = 119, + eMandrakePea = 120, + eSaffronPea = 121, + eDamianaPea = 122, + eMugwortPea = 123, + eBistortPea = 124, + eWormwoodPea = 125, + eGinsengPea = 126, + eHawthornPea = 127, + eAmaranthPea = 128, + eVervainPea = 129, + eMyrrhPea = 130, + eEyebrightPea = 131, + eFrankincensePea = 132, + eDragonsbloodPea = 133, + eHenbanePea = 134, + eComfreyPea = 135, + eYarrowPea = 136, + ePowderedAgatePea = 137, + ePowderedAmberPea = 138, + ePowderedAzuritePea = 139, + ePowderedBloodstonePea = 140, + ePowderedCarnelianPea = 141, + ePowderedHematitePea = 142, + ePowderedLapisLazuliPea = 143, + ePowderedMalachitePea = 144, + ePowderedMoonstonePea = 145, + ePowderedOnyxPea = 146, + ePowderedQuartzPea = 147, + ePowderedTurquoisePea = 148, + eBrimstonePea = 149, + eCadmiaPea = 150, + eCinnabarPea = 151, + eCobaltPea = 152, + eColcotharPea = 153, + eGypsumPea = 154, + eQuicksilverPea = 155, + eRealgarPea = 156, + eStibnitePea = 157, + eTurpethPea = 158, + eVerdigrisPea = 159, + eVitriolPea = 160, + ePoplarTalismanPea = 161, + eBlackthornTalismanPea = 162, + eYewTalismanPea = 163, + eHemlockTalismanPea = 164, + eAlderTalismanPea = 165, + eEbonyTalismanPea = 166, + eBirchTalismanPea = 167, + eOakTalismanPea = 168, + eAshwoodTalismanPea = 169, + eElderTalismanPea = 170, + eHazelTalismanPea = 171, + eRowanTalismanPea = 172, + eWillowTalismanPea = 173, + eCedarTalismanPea = 174, + eRedTaperPea = 175, + ePinkTaperPea = 176, + eOrangeTaperPea = 177, + eYellowTaperPea = 178, + eGreenTaperPea = 179, + eTurquoiseTaperPea = 180, + eBlueTaperPea = 181, + eIndigoTaperPea = 182, + eVioletTaperPea = 183, + eWhiteTaperPea = 184, + eBrownTaperPea = 185, + eGreyTaperPea = 186, + eMooJuice = 187, + ePrismaticTaper = 188 +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponentType.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponentType.cs new file mode 100644 index 0000000..31e9021 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eComponentType.cs @@ -0,0 +1,12 @@ +namespace Decal.Interop.SpellFilter; + +public enum eComponentType +{ + eScarab, + eHerb, + ePowder, + ePotion, + eTalisman, + eTaper, + ePea +} diff --git a/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eSpellType.cs b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eSpellType.cs new file mode 100644 index 0000000..e6a3533 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Decal.Interop.SpellFilter/eSpellType.cs @@ -0,0 +1,19 @@ +namespace Decal.Interop.SpellFilter; + +public enum eSpellType +{ + eModifyAttribute = 1, + eWar, + eModifyVital, + eTransferVital, + eTie, + eRecall, + eSummon, + eSpecialRecall, + eDispel, + eLifebolt, + eFellowModifyVital, + eFellowModifyAttribute, + eFellowRecall, + eFellowDispell +} diff --git a/Managed/Decal.Interop.SpellFilter/Properties/AssemblyInfo.cs b/Managed/Decal.Interop.SpellFilter/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cc0e9e0 --- /dev/null +++ b/Managed/Decal.Interop.SpellFilter/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +[assembly: ImportedFromTypeLib("SpellFilter")] +[assembly: PrimaryInteropAssembly(2, 0)] +[assembly: SecurityRules(SecurityRuleSet.Level2)] +[assembly: Guid("8c94b9f9-e992-46e7-96d7-4564a08a21bb")] +[assembly: TypeLibVersion(2, 0)] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/Decal.SpellFilter/ComponentImpl.cs b/Managed/Decal.SpellFilter/ComponentImpl.cs new file mode 100644 index 0000000..0204a38 --- /dev/null +++ b/Managed/Decal.SpellFilter/ComponentImpl.cs @@ -0,0 +1,22 @@ +using System.Runtime.InteropServices; +using Decal.Interop.SpellFilter; + +namespace Decal.SpellFilter +{ + [ComVisible(true)] + [Guid("20425F2F-54FF-4EAE-9538-36699E3DFB56")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("SpellFilter.Component")] + public class ComponentImpl : IComponent + { + public int ComponentID { get; set; } + public string Name { get; set; } + public int Icon { get; set; } + public int Type { get; set; } + public int Animation { get; set; } + public float Charge { get; set; } + public string PowerWord { get; set; } + public int BurnRate { get; set; } + public int Dummy1 { get; set; } + } +} diff --git a/Managed/Decal.SpellFilter/Decal.SpellFilter.csproj b/Managed/Decal.SpellFilter/Decal.SpellFilter.csproj new file mode 100644 index 0000000..f6eb5f9 --- /dev/null +++ b/Managed/Decal.SpellFilter/Decal.SpellFilter.csproj @@ -0,0 +1,10 @@ + + + Decal.SpellFilter + Decal.SpellFilter + + + + + + diff --git a/Managed/Decal.SpellFilter/SpellImpl.cs b/Managed/Decal.SpellFilter/SpellImpl.cs new file mode 100644 index 0000000..eabf153 --- /dev/null +++ b/Managed/Decal.SpellFilter/SpellImpl.cs @@ -0,0 +1,49 @@ +using System.Runtime.InteropServices; +using Decal.Interop.SpellFilter; + +namespace Decal.SpellFilter +{ + [ComVisible(true)] + [Guid("3040368A-B77A-4FE1-B8CC-D77FA3F36A6D")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("SpellFilter.Spell")] + public class SpellImpl : ISpell + { + public int SpellID { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public int SpellSchool { get; set; } + public int Icon { get; set; } + public int Effect { get; set; } + public int Flags { get; set; } + public int ManaCost { get; set; } + public int Difficulty { get; set; } + public float Economy { get; set; } + public int SpellVersion { get; set; } + public int SpellType { get; set; } + public double Duration { get; set; } + public bool Researchable { get; set; } + public int Component { get; set; } + public int Misc { get; set; } + public float FUnknown1 { get; set; } + public float FUnknown2 { get; set; } + public float FUnknown3 { get; set; } + public int LUnknown1 { get; set; } + public int LUnknown2 { get; set; } + public int LUnknown3 { get; set; } + public int ComponentCount { get; set; } + public int LUnknown4 { get; set; } + public int LUnknown5 { get; set; } + public int LUnknown6 { get; set; } + public int TargetMask { get; set; } + public float RangeBase { get; set; } + public float RangeModifier { get; set; } + public float Speed { get; set; } + public int ID2 { get; set; } + public int SortOrder { get; set; } + public int Misc2 { get; set; } + public int EffectOnCaster { get; set; } + public int EffectOnTarget { get; set; } + public double DurationUnk { get; set; } + } +} diff --git a/Managed/Decal.SpellFilter/SpellsImpl.cs b/Managed/Decal.SpellFilter/SpellsImpl.cs new file mode 100644 index 0000000..608f099 --- /dev/null +++ b/Managed/Decal.SpellFilter/SpellsImpl.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Decal.Interop.Core; +using Decal.Interop.SpellFilter; + +namespace Decal.SpellFilter +{ + [ComVisible(true)] + [Guid("C2D43735-BE7E-4829-AF73-F2E7E820EB16")] + [ClassInterface(ClassInterfaceType.None)] + [ComSourceInterfaces(typeof(_ISpellsEvents))] + [ProgId("SpellFilter.Spells")] + public class SpellsImpl : ISpells, IDecalService + { + private readonly Dictionary _spellsById = new Dictionary(); + private readonly Dictionary _spellsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _componentsById = new Dictionary(); + private readonly Dictionary _componentsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly HashSet _knownSpells = new HashSet(); + private int _lastSpellId; + private string _server = string.Empty; + + // COM events + public event _ISpellsEvents_LoginEventHandler Login; + public event _ISpellsEvents_Spellbook_AddEventHandler Spellbook_Add; + public event _ISpellsEvents_Spellbook_DeleteEventHandler Spellbook_Delete; + + // ISpells parameterized properties - accessed via IDispatch + public Spell SpellByID => null; + public Spell SpellByName => null; + + public bool SpellKnown => false; + + public int LastSpellID => _lastSpellId; + + public string Server => _server; + + public Component ComponentByID => null; + public Component ComponentByName => null; + + // Internal accessors for parameterized property dispatch + internal SpellImpl GetSpellByID(int id) + { + _spellsById.TryGetValue(id, out var spell); + return spell; + } + + internal SpellImpl GetSpellByName(string name) + { + _spellsByName.TryGetValue(name, out var spell); + return spell; + } + + internal bool IsSpellKnown(int id) + { + return _knownSpells.Contains(id); + } + + internal ComponentImpl GetComponentByID(int id) + { + _componentsById.TryGetValue(id, out var comp); + return comp; + } + + internal ComponentImpl GetComponentByName(string name) + { + _componentsByName.TryGetValue(name, out var comp); + return comp; + } + + // Registration methods + internal void RegisterSpell(SpellImpl spell) + { + _spellsById[spell.SpellID] = spell; + if (!string.IsNullOrEmpty(spell.Name)) + _spellsByName[spell.Name] = spell; + if (spell.SpellID > _lastSpellId) + _lastSpellId = spell.SpellID; + } + + internal void RegisterComponent(ComponentImpl component) + { + _componentsById[component.ComponentID] = component; + if (!string.IsNullOrEmpty(component.Name)) + _componentsByName[component.Name] = component; + } + + internal void OnLogin(int characterId) + { + _knownSpells.Clear(); + Login?.Invoke(characterId); + } + + internal void OnSpellbookAdd(int spellId) + { + _knownSpells.Add(spellId); + Spellbook_Add?.Invoke(spellId); + } + + internal void OnSpellbookDelete(int spellId) + { + _knownSpells.Remove(spellId); + Spellbook_Delete?.Invoke(spellId); + } + + // IDecalService + public void Initialize(DecalCore pDecal) + { + // Spell data would be loaded from the portal.dat via the DatService + // The spell table is at file ID 0x0E00000E in portal.dat + } + + public void BeforePlugins() + { + } + + public void AfterPlugins() + { + } + + public void Terminate() + { + _spellsById.Clear(); + _spellsByName.Clear(); + _componentsById.Clear(); + _componentsByName.Clear(); + _knownSpells.Clear(); + } + } +} diff --git a/Managed/Decal.sln b/Managed/Decal.sln new file mode 100644 index 0000000..f9b8b4a --- /dev/null +++ b/Managed/Decal.sln @@ -0,0 +1,166 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Core", "Decal.Interop.Core\Decal.Interop.Core.csproj", "{A328E1A0-F70B-41B2-B6AF-217674EB91B2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.D3DService", "Decal.Interop.D3DService\Decal.Interop.D3DService.csproj", "{339862FE-4E9A-43EB-9ECF-07DB1B50C4EC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.DHS", "Decal.Interop.DHS\Decal.Interop.DHS.csproj", "{FBB3A799-6DDC-40B7-9768-D257BE6BF007}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Dat", "Decal.Interop.Dat\Decal.Interop.Dat.csproj", "{B646EBA1-B635-4CCB-9C84-1DFB6949DCCD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.SpellFilter", "Decal.Interop.SpellFilter\Decal.Interop.SpellFilter.csproj", "{1AC7A0E3-DF45-4DF6-9FB3-78C03E75AAFD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Net", "Decal.Interop.Net\Decal.Interop.Net.csproj", "{91035378-2CE7-4A67-90D2-A4097092D97E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Input", "Decal.Interop.Input\Decal.Interop.Input.csproj", "{C4E3BBC8-75E4-4C55-9E7B-1E5D544D3558}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Inject", "Decal.Interop.Inject\Decal.Interop.Inject.csproj", "{B45148C2-5EAD-4A3A-9455-83B89554A3F5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Filters", "Decal.Interop.Filters\Decal.Interop.Filters.csproj", "{A5283E36-8FBA-4595-9C9B-C24EE8D5E702}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Controls", "Decal.Interop.Controls\Decal.Interop.Controls.csproj", "{4A0EA6C5-BF88-4CF6-B786-48BE51742FFD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Interop.Render", "Decal.Interop.Render\Decal.Interop.Render.csproj", "{C55615C2-5CA1-41BB-9D68-4A42A79E13AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Adapter", "Decal.Adapter\Decal.Adapter.csproj", "{FB81134A-7AF8-44F4-BD09-A6C0EE32B003}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.FileService", "Decal.FileService\Decal.FileService.csproj", "{35C959E4-747A-464D-9290-5DB60D4C9614}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DecalUtil", "DecalUtil\DecalUtil.csproj", "{505E6EBA-25E0-4A85-A29C-1685BC96179D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DecalDat", "Decal.DecalDat\Decal.DecalDat.csproj", "{E53274E5-BC82-4E8B-973B-6D3A9BE1D3B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DHS", "Decal.DHS\Decal.DHS.csproj", "{7F72E603-3C1A-4DAC-9C8F-557822B8D26E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.SpellFilter", "Decal.SpellFilter\Decal.SpellFilter.csproj", "{054D5CE6-F24E-4A3C-ACEC-CA078479D888}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DecalInput", "Decal.DecalInput\Decal.DecalInput.csproj", "{A0EE045A-7D6A-4F24-9D9C-C8B7F7EFE568}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DecalNet", "Decal.DecalNet\Decal.DecalNet.csproj", "{BA0A302B-F57E-43C1-B22E-19F88A0D73C5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DecalFilters", "Decal.DecalFilters\Decal.DecalFilters.csproj", "{4EED1867-45CD-4FC2-98E5-CCC07BA19EBF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.Core", "Decal.Core\Decal.Core.csproj", "{D3A58F24-42F7-4C9E-A1D7-5E02A8E8B3F1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DecalControls", "Decal.DecalControls\Decal.DecalControls.csproj", "{C1F8B924-7D3E-4A5F-9C2B-3E8A6D4F1B72}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DecalRender", "Decal.DecalRender\Decal.DecalRender.csproj", "{2B9E4F3A-1C7D-48E5-A6B8-D9F0C3E2A571}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.D3DService", "Decal.D3DService\Decal.D3DService.csproj", "{8A5F2E1B-C4D6-49A3-B7E0-F1D2C3A4B5E6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Decal.DenAgent", "Decal.DenAgent\Decal.DenAgent.csproj", "{F7A12E3B-D4C6-49A3-B8E1-2D9F0C3E5A71}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A328E1A0-F70B-41B2-B6AF-217674EB91B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A328E1A0-F70B-41B2-B6AF-217674EB91B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A328E1A0-F70B-41B2-B6AF-217674EB91B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A328E1A0-F70B-41B2-B6AF-217674EB91B2}.Release|Any CPU.Build.0 = Release|Any CPU + {339862FE-4E9A-43EB-9ECF-07DB1B50C4EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {339862FE-4E9A-43EB-9ECF-07DB1B50C4EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {339862FE-4E9A-43EB-9ECF-07DB1B50C4EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {339862FE-4E9A-43EB-9ECF-07DB1B50C4EC}.Release|Any CPU.Build.0 = Release|Any CPU + {FBB3A799-6DDC-40B7-9768-D257BE6BF007}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBB3A799-6DDC-40B7-9768-D257BE6BF007}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBB3A799-6DDC-40B7-9768-D257BE6BF007}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBB3A799-6DDC-40B7-9768-D257BE6BF007}.Release|Any CPU.Build.0 = Release|Any CPU + {B646EBA1-B635-4CCB-9C84-1DFB6949DCCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B646EBA1-B635-4CCB-9C84-1DFB6949DCCD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B646EBA1-B635-4CCB-9C84-1DFB6949DCCD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B646EBA1-B635-4CCB-9C84-1DFB6949DCCD}.Release|Any CPU.Build.0 = Release|Any CPU + {1AC7A0E3-DF45-4DF6-9FB3-78C03E75AAFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AC7A0E3-DF45-4DF6-9FB3-78C03E75AAFD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AC7A0E3-DF45-4DF6-9FB3-78C03E75AAFD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1AC7A0E3-DF45-4DF6-9FB3-78C03E75AAFD}.Release|Any CPU.Build.0 = Release|Any CPU + {91035378-2CE7-4A67-90D2-A4097092D97E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91035378-2CE7-4A67-90D2-A4097092D97E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91035378-2CE7-4A67-90D2-A4097092D97E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91035378-2CE7-4A67-90D2-A4097092D97E}.Release|Any CPU.Build.0 = Release|Any CPU + {C4E3BBC8-75E4-4C55-9E7B-1E5D544D3558}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4E3BBC8-75E4-4C55-9E7B-1E5D544D3558}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4E3BBC8-75E4-4C55-9E7B-1E5D544D3558}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4E3BBC8-75E4-4C55-9E7B-1E5D544D3558}.Release|Any CPU.Build.0 = Release|Any CPU + {B45148C2-5EAD-4A3A-9455-83B89554A3F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B45148C2-5EAD-4A3A-9455-83B89554A3F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B45148C2-5EAD-4A3A-9455-83B89554A3F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B45148C2-5EAD-4A3A-9455-83B89554A3F5}.Release|Any CPU.Build.0 = Release|Any CPU + {A5283E36-8FBA-4595-9C9B-C24EE8D5E702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5283E36-8FBA-4595-9C9B-C24EE8D5E702}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5283E36-8FBA-4595-9C9B-C24EE8D5E702}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5283E36-8FBA-4595-9C9B-C24EE8D5E702}.Release|Any CPU.Build.0 = Release|Any CPU + {4A0EA6C5-BF88-4CF6-B786-48BE51742FFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A0EA6C5-BF88-4CF6-B786-48BE51742FFD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A0EA6C5-BF88-4CF6-B786-48BE51742FFD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A0EA6C5-BF88-4CF6-B786-48BE51742FFD}.Release|Any CPU.Build.0 = Release|Any CPU + {C55615C2-5CA1-41BB-9D68-4A42A79E13AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C55615C2-5CA1-41BB-9D68-4A42A79E13AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C55615C2-5CA1-41BB-9D68-4A42A79E13AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C55615C2-5CA1-41BB-9D68-4A42A79E13AF}.Release|Any CPU.Build.0 = Release|Any CPU + {FB81134A-7AF8-44F4-BD09-A6C0EE32B003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB81134A-7AF8-44F4-BD09-A6C0EE32B003}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB81134A-7AF8-44F4-BD09-A6C0EE32B003}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB81134A-7AF8-44F4-BD09-A6C0EE32B003}.Release|Any CPU.Build.0 = Release|Any CPU + {35C959E4-747A-464D-9290-5DB60D4C9614}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35C959E4-747A-464D-9290-5DB60D4C9614}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35C959E4-747A-464D-9290-5DB60D4C9614}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35C959E4-747A-464D-9290-5DB60D4C9614}.Release|Any CPU.Build.0 = Release|Any CPU + {505E6EBA-25E0-4A85-A29C-1685BC96179D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {505E6EBA-25E0-4A85-A29C-1685BC96179D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {505E6EBA-25E0-4A85-A29C-1685BC96179D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {505E6EBA-25E0-4A85-A29C-1685BC96179D}.Release|Any CPU.Build.0 = Release|Any CPU + {E53274E5-BC82-4E8B-973B-6D3A9BE1D3B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E53274E5-BC82-4E8B-973B-6D3A9BE1D3B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E53274E5-BC82-4E8B-973B-6D3A9BE1D3B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E53274E5-BC82-4E8B-973B-6D3A9BE1D3B7}.Release|Any CPU.Build.0 = Release|Any CPU + {7F72E603-3C1A-4DAC-9C8F-557822B8D26E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F72E603-3C1A-4DAC-9C8F-557822B8D26E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F72E603-3C1A-4DAC-9C8F-557822B8D26E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F72E603-3C1A-4DAC-9C8F-557822B8D26E}.Release|Any CPU.Build.0 = Release|Any CPU + {054D5CE6-F24E-4A3C-ACEC-CA078479D888}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {054D5CE6-F24E-4A3C-ACEC-CA078479D888}.Debug|Any CPU.Build.0 = Debug|Any CPU + {054D5CE6-F24E-4A3C-ACEC-CA078479D888}.Release|Any CPU.ActiveCfg = Release|Any CPU + {054D5CE6-F24E-4A3C-ACEC-CA078479D888}.Release|Any CPU.Build.0 = Release|Any CPU + {A0EE045A-7D6A-4F24-9D9C-C8B7F7EFE568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0EE045A-7D6A-4F24-9D9C-C8B7F7EFE568}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0EE045A-7D6A-4F24-9D9C-C8B7F7EFE568}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0EE045A-7D6A-4F24-9D9C-C8B7F7EFE568}.Release|Any CPU.Build.0 = Release|Any CPU + {BA0A302B-F57E-43C1-B22E-19F88A0D73C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA0A302B-F57E-43C1-B22E-19F88A0D73C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA0A302B-F57E-43C1-B22E-19F88A0D73C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA0A302B-F57E-43C1-B22E-19F88A0D73C5}.Release|Any CPU.Build.0 = Release|Any CPU + {4EED1867-45CD-4FC2-98E5-CCC07BA19EBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EED1867-45CD-4FC2-98E5-CCC07BA19EBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EED1867-45CD-4FC2-98E5-CCC07BA19EBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EED1867-45CD-4FC2-98E5-CCC07BA19EBF}.Release|Any CPU.Build.0 = Release|Any CPU + {D3A58F24-42F7-4C9E-A1D7-5E02A8E8B3F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3A58F24-42F7-4C9E-A1D7-5E02A8E8B3F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3A58F24-42F7-4C9E-A1D7-5E02A8E8B3F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3A58F24-42F7-4C9E-A1D7-5E02A8E8B3F1}.Release|Any CPU.Build.0 = Release|Any CPU + {C1F8B924-7D3E-4A5F-9C2B-3E8A6D4F1B72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1F8B924-7D3E-4A5F-9C2B-3E8A6D4F1B72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1F8B924-7D3E-4A5F-9C2B-3E8A6D4F1B72}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1F8B924-7D3E-4A5F-9C2B-3E8A6D4F1B72}.Release|Any CPU.Build.0 = Release|Any CPU + {2B9E4F3A-1C7D-48E5-A6B8-D9F0C3E2A571}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B9E4F3A-1C7D-48E5-A6B8-D9F0C3E2A571}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B9E4F3A-1C7D-48E5-A6B8-D9F0C3E2A571}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B9E4F3A-1C7D-48E5-A6B8-D9F0C3E2A571}.Release|Any CPU.Build.0 = Release|Any CPU + {8A5F2E1B-C4D6-49A3-B7E0-F1D2C3A4B5E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A5F2E1B-C4D6-49A3-B7E0-F1D2C3A4B5E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A5F2E1B-C4D6-49A3-B7E0-F1D2C3A4B5E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A5F2E1B-C4D6-49A3-B7E0-F1D2C3A4B5E6}.Release|Any CPU.Build.0 = Release|Any CPU + {F7A12E3B-D4C6-49A3-B8E1-2D9F0C3E5A71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7A12E3B-D4C6-49A3-B8E1-2D9F0C3E5A71}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7A12E3B-D4C6-49A3-B8E1-2D9F0C3E5A71}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7A12E3B-D4C6-49A3-B8E1-2D9F0C3E5A71}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Managed/DecalUtil/DecalUtil.DecalUtilMain.resx b/Managed/DecalUtil/DecalUtil.DecalUtilMain.resx new file mode 100644 index 0000000..f068cab --- /dev/null +++ b/Managed/DecalUtil/DecalUtil.DecalUtilMain.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBD +dWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0 +ZW0uRHJhd2luZy5JY29uAgAAAAhJY29uRGF0YQhJY29uU2l6ZQcEAhNTeXN0ZW0uRHJhd2luZy5T +aXplAgAAAAIAAAAJAwAAAAX8////E1N5c3RlbS5EcmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdo +dAAACAgCAAAAAAAAAAAAAAAPAwAAAF6GAQACAAABAAUAEBAAAAEACABoBQAAVgAAACAgAAABACAA +qBAAAL4FAACAgAAAAQAgACgIAQBmFgAAQEAAAAEAIAAoQgAAjh4BADAwAAABACAAqCUAALZgAQAo +AAAAEAAAACAAAAABAAgAAAAAAEABAAAAAAAAAAAAAAABAAAAAAAAAGaZAACZzAAAzP8AAP//AJn/ +/wCd2/8AZsz/ADOZ/wBLef8AADP/AAAAmQBmMzMAmTMAAMxmAADXgwAA/5kAAN6aPgD/zJkA/+K0 +AP//3gD/zP8A/8zMAP+ZmQDMZmYAzJmZAJlmZgAAZgAAAJkAADPMZgBm/5kAzP/MAAAAAACAgIAA +wMDAAAD//wAAAIAAAIAAAACAgACAAAAAgACAAICAAAAAAP8AAP8AAP8AAAD/AP8A//8AAP///wD3 +//8AEQAAAAQAAAASAAAAAQAAABIAAACIAgAAbwAAAAkAAAACAAAACgAAAAMAAAALAAAA9f//AAwA +AADy//8ADQAAACgAAAAOAAAAcQAAAA8AAABtAAAAEAAAACMAAAARAAAA8P//ABIAAAD2//8AEwAA +AAMAAAAUAAAAAQAAABQAAAD0AgAAbwAAAAsAAAABAAAADAAAAAMAAAANAAAA9v//AA4AAADw//8A +DwAAACMAAAAQAAAAbQAAABEAAABxAAAAEgAAACgAAAATAAAA8v//ABQAAAD1//8AFQAAAAMAAAAW +AAAAAgAAABYAAABgAwAAbwAAAA0AAAABAAAADgAAAAQAAAAPAAAA9///ABAAAADv//8AEQAAAB4A +AAASAAAAagAAABMAAAB0AAAAFAAAAC0AAAAVAAAA8///ABYAAAD0//8AFwAAAAMAAAAYAAAAAgAA +ABgAAADMAwAAbwAAAA8AAAABAAAAEAAAAAQAAAARAAAA+f//ABIAAADv//8AEwAAABkAAAAUAAAA +ZgAAABUAAAB2AAAAFgAAADMAAAAXAAAA9f//ABgAAADz//8AGQAAAAIAAAAaAAAAdBRUAJCv7wCQ +IAAAbwAAABEAAAABAAAAEgAAAAQAAAATAAAA+v//ABQAAADu//8AFQAAABQAAAAWAAAAYQAAABcA +AAB4AAAAGAAAADgAAAAZAAAA9///ABoAAADx//8AGwAAAAEAAAAcAAAAAwAAAB0AAACkBAAAbwAA +ABMAAAABAAAAFAAAAAQAAAAVAAAAdBRUAJCv7wAAIAAAFwAAAA8AAAAYAAAAXQAAABkAAAB6AAAA +GgAAAD4AAAAbAAAA+v//ABwAAADw//8AHQAAAAEAAAAeAAAAAwAAAB8AAAAQBQAAbwAAABYAAAAE +AAAAFwAAAPz//wAYAAAA7v//ABkAAAALAAAAGgAAAFgAAAAbAAAAewAAABwAAABDAAAAHQAAAP3/ +/wAeAAAA8P//AB8AAAADAAAAHwAAACkAAAAfAAAATgAAAB4AAAB8BQAAbwAAABgAAAAEAAAAGQAA +AP3//wAaAAAA7v//ABsAAAAHAAAAHAAAAFMAAAAdAAAAfAAAAB8fHx8fHwsLHx8fHx8fHx8fHx8f +Hx8LCwsLCx8fHx8fHx8fCx8LHx8fGCALHx8fHx8fCwsfHx8LCx8hIBkfHx8fHx8fCx8fCx8fHiEg +GR8fHx8fCx8fHx8fHwUGHwsfHwsfCx8fHx8GBgYEBAYGCwsfHx8fHx8fBQYGBAQGBCAfCx8fHx8f +Hx8fCwYCHx8fCwsfCx8fHx8fHx8GAR8fHwsfHwsLHxkLHx8fBgEfHx8fHwsfCwsLIAsLCwsfCx8L +Hx8fCx8ZGQsLCx8fHwsLHx8fHx8LHx8LCwsfCwsLHx8fHx8fHxgZCwsLCwsLHx8fHx8fHx8fHyEZ +CxkfHx8fHx/8PwAA8A8AAOMHAADOQwAAlMEAAInJAAAIAAAACAAAAAmMAAAJzAAAgMkAAIARAADA +cwAA4EcAAPAPAAD8PwAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAX2pqADA0NAAZGRYBAAAABXuIhwBkYFwAAAAAADpAPyR1enhfWVlU +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ +//8BzP//Bdz//xbk//8m4P//KtPv70C0ycmGlqalnG96eKVUWlisSEtIsEZIQ7FMTEaxUE9JsVJP +SbFQT0mxUE9JsVBPSbFPT0mxT09JsU9NSLFPTUmxTU1IsUhJRbFIS0iwTFJPrWBqZ6eBkZGfoLa2 +icXg4ELg//8q5P//Jtz//xb///8F////Av///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Ad///wjd//8P3f//F8Tf +3zmpwb5fn7Kyk4GPjsdZYFzZOzw56CgnJPclIx/7LCci/DQsJf03LSb+NSwl/jEpIv4wKCH+MCgh +/jAoIf4vKCH+LSYf/iskHv4pIx3+KiMd/ikiHf4pIx7+KiMe/iskHv4mIRz9HxwY/RgXFPsVFRT4 +IiUj6kBHRtxreXnKi56elp+0tGPC29tQ3Pn5LN///xDf//8I////AQAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///Av///wbi//8b3fv7TbXNzYB0gX+cWGBf +yUVHRe4xLir7Ih0Z/h4aFv8dGRX/Ix4a/y8nIP85Lyf/OjAn/zUsJf8zKyP/MSki/zAoIf8wKCH/ +Lycg/ywlHv8pIh3/KCEc/ychHP8oIRz/JyEc/ychHP8oIRz/JyAb/x4ZFv8WFBD/ExAN/xMQDf8R +Dgv/DgsJ/w0LCf4YGBb8MjUz8lNcWeBte3u1o7q4g9Xy8k/i//8k4v//Ev///wMAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAv///BOH//xHT8PA1uNDQU4yenppVX17ZNDYz8i8rJ/otJiH+ +KSIc/yYgG/8iHRn/HxoW/x8aFv8pIh3/MSkh/zcuJv84Lib/Niwl/zQrI/8xKSL/MCgh/y8oIP8s +JR7/KSMd/yghHP8nIBv/JiAb/ycgG/8nIRz/KCEc/ykiHP8kHxr/GRUS/xQRDv8VEg//FhMQ/xYT +EP8WEg//FRIP/xgVEf8fGhb/Ix4a/iIgHfwnKSfzQkpJ3oOVlba20dF7x+XlPOL//xLf//8If/// +AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA////BNb//xPP6+tBnrS0gmt5d8o6Pj3vHBkX/SUfGv8vJyD/KiMd/yIdGf8c +GBX/HBgU/xoWE/8ZFRL/IRwX/ywlHv8zKiL/Niwl/zcuJv82LCX/Mysj/zIqIv8vJyD/Lygg/y0l +H/8rJB7/KiMd/ychHP8nIRz/KSIc/ykjHf8oIRz/KCIc/yAbGP8VEg7/FBEO/xkWE/8bFxT/GxcU +/xwXFP8dGRX/Ih0Z/yYgG/8nIRz/JyAc/yAbF/8WExD/Dg0L/iouLfZXYmLRjaGhjsvo6Gfa//8q +2v//Dn///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAf///Atr//w7c+vo0rcTEelBaWMwnKyrxGxkX/R0YFf8eGhb/Ix0Z/yEcGP8cGBT/FxQR/xUS +D/8WExD/FhMQ/xgUEf8fGhb/Ix0Z/yMeGf8kHhr/JyEc/yskHv8pIx3/KiMd/yQeGf8rJB7/LiYf +/y0lH/8vJyD/JR8a/yYgG/8dGBT/FBEO/xAMCv8PDAr/CwkI/wgGBf8LCQf/FhMQ/x0YFf8jHRn/ +JR8a/ycgG/8oIhz/KSIc/ycgG/8iHRn/GxcT/xQRDv8OCwn/CQcF/wgIB/4bHx72SVNS5KO6uqjZ +9/dg4v//JMb//wn///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////BNz/ +/xbI4+NCj6KihUxVVNwTFBP7CggG/w8MCv8UEQ7/FRIP/xMQDf8SEA3/Eg8M/xEOC/8QDQv/Dw0L +/xIPDP8TEA3/FBEO/xYSD/8bFxP/IBsX/ywlHv80KyP/QDQr/1REN/9TRDf/X04//29bSv94Y1D/ +f2hU/5uBbP+WfWr/e2dY/zQqIv8vJh//PjIo/z80K/9ANiz/NSsi/yAaFf8RDgv/CAcG/wkIBv8Q +DQv/GRUS/yAbFv8lHxr/JR8a/x8aF/8VEg//DQsI/wcGBP8FBAP/AwMC/wMDAv8CAgH/CwwL/j9I +SPCTpqa2xuLibOD//yrM//8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOH//xHh//8zr8fH +gFVgYMkfIiLzBAMC/wcFBP8LCQf/CQcG/wsJB/8ODAr/DgsJ/w0LCf8LCQf/CwkH/w8NCv8UEg// +FxQR/xwYFP8iHRj/MCgh/0k7MP9iTj//c1xK/3tjT/+EaVT/kXRc/5F1Xf+Sd17/mX5m/5uAaf+d +gmv/s52M/7qml/+4pJX/dl9L/15NPf+AZVD/im5Y/5d9ZP+XfWf/i3Zi/3xrW/9tXE3/Sjsv/ycg +Gv8ODAn/BQQD/wcGBf8ODAr/Eg8M/xAOC/8LCQf/BgQD/wQDAv8DAwL/AwMC/wMCAv8CAgH/AQEB +/xgbGvpNWFjjm6+vl93//zXw//8Rf///AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN///wja//8cuNPTdHqJicYiJiXz +BgYG/QMCAv4DAwL/BAMC/wYEA/8FBAP/BQMD/wYFBP8IBgX/DAkH/xIPDP8ZFRL/GhYT/x8aFf8t +JR//Qzct/2JPP/9/ZVH/hmtV/4JnUv+BZlL/hWlU/4hsVv+Pclv/kHRb/5B0XP+Ud1//lXhg/5d9 +Zv+xnIr/t6OT/7ejkv90XEr/UkM2/3JbSf+BZ1L/k3lf/5t/af+gh3D/o4t1/6KKdP+jjHf/pI9+ +/5qFc/9zYFH/Qjkz/x0XE/8JBwb/AwIC/wQDAv8EBAP/BAMC/wMDAv8DAwL/AgIC/wICAf8CAgH/ +AQEB/wQEA/4SFBT3XGlpzqW8vIPj//842v//DgD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wHU//8M2PT0SJarqpM6QkHmDA0N/QIBAf8C +AgL/AwMC/wMDAv8DAwL/AwIC/wICAf8GBAT/Dw0L/xMQDf8UEQ7/GRUS/ysjHf85Lyb/Sjwx/1lI +Ov9mUkH/eWBM/35jT/97YU7/emFO/3tiTv9+Y1D/gWZR/4xxWf+Qc1v/kXRc/5N2X/+RdF3/mn5o +/7Sgjv+4pJT/r5iH/21YRv9TQzb/ZVJB/4NpVP+WemT/nIFr/6OKdP+ljXj/pY14/6ePfP+pkn7/ +q5WC/7qmlv+6p5j/nYh3/3NmW/86LiX/Eg8M/wMDAv8CAQH/AgIB/wMCAv8CAgL/AgIB/wICAf8C +AgH/AgIB/wEBAf8GBgb+LDIy84mcnLfH5ORY4f//Gsz//wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADU//8G3Pj4JbzY2FxndXTHHyMi9QQDA/4CAgH/AwIC/wMC +Av8EAwL/BAIC/wMCAv8GBQT/EA0L/xYSD/8PDAr/EA0L/yghG/9BNSv/SDsw/0s+Mv9OQDP/V0Y4 +/2hUQ/97YU3/f2RQ/3xiT/95YE3/eGBM/35jT/9+ZFD/iW5X/41xW/+Mb1n/kXZe/pJ2X/6gh3P+ +t6OS/7Sgkf+NdWP/LSUf/0g7L/9bSjv/gmhT/5yCbP+iiXP/p5B8/6uTgf+qlYL/r5uI/7GdjP+x +no3/taGR/7ejk/+5pZX/uqWW/7Kdjv+YhXX/T0I4/xoWE/8HBgT/AgIB/wICAf8CAgH/AgIB/wIC +Af8CAgH/AgIB/wEBAf8BAgH+ExYV+U5aWtq719eJ1vT0MtT//wYAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAA1P//BtP19TWht7eeSVJR5wkIB/8FBAP/BAMC/wMDAv8DAwL/AwMC +/wUEA/8KCAf/DwwK/xQRDv8QDQv/DQoJ/xwYFP8wKCH/OzEo/0Q3Lf9IOjD/Sjwx/05AM/9XRzj/ +aFRD/3tiTv99ZE//dFxK/2pURP9jUEL+ZlVH+2hcT/Z4bF/ydW1h8G9rYelybWDQd25fwJGIeeF+ +bmH9UEA0/zMqI/8LCQf/DwwK/zkwKf55bl/4k4d49JqJefmgjHr9rJaD/7Oejf+4pJT/t6OT/7aj +kv+3o5P/t6OT/7ejk/+3o5P/t6OT/7mklf+8p5f/n4l6/2FSR/8kHRf/CAcG/wEBAf8CAQH/AgIB +/wICAf8CAgH/AgIB/wICAf8BAQH/AQEB/zE3N/KClJSoyOXlPdL//xH///8CAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +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 +/XiFhNbM6udM1P//BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///wPf9/cg +maWiUy8vKqwgIB7TT1tZgJmysh7U//8MzP//Cv///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAA////A93//xfO7e1KgJCPtz5APfUlIBr/KSIc/xsYFP8LCQf/LiYf/3RfTf9NQzj7iZmXtM/s +7Ebf//8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzOXlHlFcXLwdICD/jqip +//3+/v/y////4f///9/////g////4f///+L////j////4v///97////W////w/7+/6T6/P+A1dz/ +Gy4v/wIDA/5pd3eT3///KbjHxIafkoP0uKOS/7ejk/+3o5P/t6OT/7mllf95Zlb/Eg8M/wQDAv8F +BAP/BwYE/wgGBf8HBQT/LC8v87HJyY7Z//8bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8DzOrq +MmVxcbMMDQz7AgIB/wICAf8BAQH/BAQD/xQSD/89Mij/ZFFA/1dHOf9RQjX/Qzct/yEdGf56iYfW +1fPzb9z//xYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wbb//krv9TQSFRUTosi +IR3eGx4et1pnZzvN6+sa////BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// +/wPY+fkuwdvbiWNubtkoJCD7KSMd/iUfGv8bFxP/CwkH/y8mH/9zXk3+TEM5+H6KibjW9fU44v// +CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADM5eUKRU1NkB4gIP6ElJX/ +/f7+//D////d////2////9z////d////3v///9/////g////4f///+H////V////tf7+/5Lw9P80 +WVz/AAAA/0pVVcDQ7+8h2fr6N77Py7ennI/2uKOU/7ejk/+3o5P/t6OT/7Sfj/9cTD//DQsI/wcF +BP8JBwb/CQcG/wkHBf8KCgn+UVta2cDc3FLM//8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3//xenv7+M +Jisq8AICAf8CAgH/AQEB/wMDAv8QDQv/HRgT/1BBNP9WRjj/Rjkv/zowJ/8iHRn+UVpZ5M7q6m/a +//8c////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADU//8G2vn0Ma/CvodTVlLJFhYU8iMn +J6aRp6c60P//C////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E3P// +JavCwpNSWlnqKSQg/iskHv8pIh3/HhkV/wwKCP8pIRv/X0w9/zkxKvxuenjEyeLiR9r//wcAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqqgM9Q0N9ICIi/YCMjf/8 +/v7/7////9r////X////2P///9n////a////2////9z////d////3v///9b///+4////lfX5/zdh +ZP8AAAD/TFhYwtLw8CLa//8O3f//U7PDv76mlYf8uaWV/7ejk/+3o5P/uKSU/6OOf/83Lib/BQQD +/wgGBf8KBwb/CQcG/wgGBf8XGRf6iJmZoeL//yT///8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa//8H2ff3RFtoaNkF +BQT+AgIB/wICAf8BAQH/DAoI/xUSDv85Lyb/Qzct/zowJ/82LSX/Ih0Y/jg+POaqwsB+4P//Gf// +/wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B1P//DMvn5zaRn52YKikl3AcGBfFFTU2ets/P +RuL//wn///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B3///CNLu7i6ar66R +Njk37yslIP4sJR7/KSMd/x8aFv8OCwn/HBcT/0I2LP8uKCH+ZXBu5M3q6HLi//8SAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///AkhUVHAiIyP8dn5+//r+ +/v/v////2P///9P////U////1v///9b////Y////2P///9n////b////0v///7X///+R9fj/LlRX +/wAAAP9da2u+2P//If///wHd//8P2PX1T6mqoM2wm4v8t6OT/7ejk/+3o5P/uqWW/4p1Y/8UEQ7/ +BwUE/wkHBf8JBwb/CAYF/wcFBP48QkHs0+/vdNj//xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT//x2huLiUFBcW+QIC +Af8CAgH/AgIB/wgHBv8UEg//IBsX/0I2LP84Lib/KyQe/xYTEP8hIyH6pru7nNv//yT///8BAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAA////A93//x7J5eNlcHp3tRoaGO4DAwPuRU5OrN78/GXZ//8b +////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Ad///xjd+/tUfo2Lry8wLvIq +Ix3+MSgh/ywlHv8fGhb/DgwJ/xUSD/8zKiP/JSAb/k5WU+rG4uKH4f//I6r//wMAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///8CTFhYbiMkJPxzfX3/+P7+ +/+v////W////z////9D////R////0v///9P////V////1f///9b////P////s////43z9v8lREf/ +AAAA/29+frnf//8gAAAAAAAAAADn//8Lw93aWpyXita3pJX+t6OT/7ejk/+3o5P/t6KT/1ZIPf8K +CAf/CQcF/wkHBv8IBgX/BgUE/wsLCv2ClJK/3vr6Pv///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8DzevrTlJbW9MEBQT+AgIB +/wICAf8GBQT/FxMQ/xMQDv8tJR//Licg/yMeGf8YFBH/Dw4N/XGAf87g//9L5f//CgAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAP///wHe9vYf1PHxc3J9etYWFRT5BAQD+EdQUKvJ5uZy2v//HKr//wMA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wHY//8U3Pz8ZperqcojIyD5LiYg/y8n +IP8sJR7/HhoV/w4LCf8MCgj/JR8a/x0YFP8tMS/xpry7ltv5+Su///8EAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///wJMWFhuJicn/Hd/f//5/v7/ +6f///9P////L////zP///87////O////0P///9H////S////0v///8n///+v////ivL1/x04Of8A +AQH+eYqKpuD//xkAAAAAAAAAAAAAAADa//8cv9PPjKOUhPi6ppb/t6OT/7ejk/+4pJT/nYh4/y4l +Hv8GBQP/CAYF/wcFBP8GBQT/BgUE/jxEQey409F76f//DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3//xeOoqKdGx4d+AMDAv8EAwL/ +BgUD/xYTEP8UEQ7/FRIO/yQeGf8VEg//CQcG/wYGBf5FTk7UutXVVsz//woAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAD///8D3f//HsDY14ZhaWfhDg0M/QoKCv1daWjU4f//Z+P//xz///8BAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///8C1v//GdTw8G2DkpHaICAe/CYfG/8xKSL/Lych +/xsXE/8PDAv/BQQD/w8MCv8ODAr/GRoZ/KC0tK/d//8u////AwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///Ak9YWG0pKir8foOD//z+/v/s +////z////8f////I////yf///8r////M////zP///87////N////w////6v///+D7PD/FCco/wME +BP5ufX1q2v//BwAAAAAAAAAAAAAAAP///wTi//8sq7StsquZifu4pJT/t6OT/7ejk/+4o5T/dGJV +/wwJCP8GBAP/BwUE/wYFBP8GBAP/DQ4N/XmLisva+Pgq////AQAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADU//8G2fr6PlhjY94HBgX+CAYF/woIBv8T +EA3/HxoW/wsJB/8KCQf/CgkH/wYFBP8DAgL/GR0b9pmurozW//8ZAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA////Ad729h/X8fFzXmZj4xoYFv0JCQf+RExK5LvV1YDd//8eqv//AwAAAAAAAAAAAAAA +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 +/gIEBP4CBAT+AgQE/gIEBP4CBQb+AwkJ/gYPD/8IFRb/DB8g/xEtL/8WOTv/HkxO/yNWWP8eTU// +DB4f/wECAv8BAQH/AQEA/wEBAf8CAgH/AQEB/x0hIPaMoZ5i////AwAAAAAAAAAAAAAAAAAAAAAA +AAAA1P//Bo2enmopKSf3KSId/ywlH/8sJR//HxoW/w4LCf8WExD/EA0K/wwKCP8UFBP8iZubqeH/ +/xoAAAAAAAAAAAAAAAAAAAAA6///Dc3o6GY/REPyAgIB/xYSEP8PDAn/Dg0M/WFsbMfY9vY8//// +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4v//Esfh34ExNTP1BAMC/wQDAv8DAwL/ +AwIB/wQDAv8aFRL/CwkH/xgUEf8XFBD/ExAN/xIPDP8ODQz9Xmpqv2t4eHAbHh7vDBwc/yaFhv8z +yMz/MM7S/y/Lz/8tvsL/LLe6/yimqf8kmJv/H4WJ/xx5fP8deXz/HXl8/x15fP8eeXz/Hnl8/x55 +fP8feXz/H3l8/x95fP8gen7/JIKF/y+doP9IztH/aPn5/3////+K////jv///4////+Q////kf// +/5L///+T////lP///5X///+W////l////5f///+O////ff7+/2T5+v9P19r/N52h/y6Eif8reX3/ +K3l8/yt5fP8se3//NIyQ/z2hpP9Itrn/TsTI/1PO0/9Y2N3/XuPn/2br7f9u8/T/bvX3/2Tq7/9H +srf/GD0//wACAv8AAAD/AQEA/wICAf8CAgH/BwgH/XSDgpXi//8SAAAAAAAAAAAAAAAAAAAAAAAA +AADo//8XgZGRoR8bGP0rJB7/LSYf/yokHf8ZFRL/EA4L/xMRDv8ODAn/CwkH/ycsK/OZrKxz2v// +BwAAAAAAAAAAAAAAAAAAAADb//8dprq5pBEQDv4IBwX/FhMQ/w0KCP8VFhX5hpmZm+D//xkAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa//8jfomIrBAQDvwKCAb/BwUE/wUDA/8D +AgL/CgkH/xYTEP8PDAr/HBgV/xcVEf8UEQ7/ExAN/xsdHPeAk5OHS1NTehQVFfguYGH/YvT1/2D/ +//9T////Tv///03///9N////S/7//0n9//9G+v3/Q/n8/0T5/P9F+fz/Rvn8/0b5/P9H+fz/SPn8 +/0n5/P9K+fz/S/r8/0z6/P9R/P7/Wf7//2j///91////gv///4j///+K////i////4z///+N//// +j////4////+R////kf///5L///+U////lf///5T///+M////ev///2////9k/P3/Yfr8/2L5/P9i ++fz/Y/n8/2X6/P9o+/7/b/7+/3b+//95////ev///33///+B////hf///4r///+K////fv7+/2jy +9v9CqK7/CRkZ/wAAAP8BAQD/AgIB/wICAf8CAgH/YG1sy9v//yT///8BAAAAAAAAAAAAAAAA//// +Ad7//ydnc3LPIRsW/i4mIP8sJR7/KiMd/xMQDf8UEQ7/Ew8N/w0LCf8LCQj+PkRE17rS0kr///8B +AAAAAAAAAAAAAAAA////BNf390BbZGHRDQsI/xkVEf8PDAr/CwkH/yYqKezB2tpo5///CwAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzP//BbPKyGI+Q0DkDQoI/hAOC/8OCwn/CgcG/wUE +A/8VEQ//Dw0K/xsXFP8cGBX/GBUS/xUSD/8RDgv+Mjk537jT01dWY2NkJCYm70p1dv6S+fr/jf// +/2////9l////ZP///2T///9i////X////13///9e////YP///2H///9i////Y////2T///9l//// +Zv///2f///9o////af///2v///9w////d////37///+C////hf///4b///+H////iP///4n///+K +////i////4z///+O////jv///4////+R////kf///5L///+N////hv///3////9+////gf///4L/ +//+D////hP///4b///+I////jP///5L///+U////l////5j///+a////mv///5v///+T////fP7+ +/1/q7v8pbXH/AgcI/wAAAP8BAQD/AgIB/wEBAf85Pz/e2vj4Kv///wEAAAAAAAAAAAAAAAD///8B +3///KUlOTdwmIBr/LSYf/yokHv8oIhz/DgwK/xUSD/8SDw3/DQsJ/w8ODP1UXl6t3fb2HgAAAAAA +AAAAAAAAAAAAAADn//8Lr8fFdzE0Mu8RDgz/GhYT/wsJB/8JBwX/SVNS09///zGq//8DAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp//8Yjp6dpxwcGvsQDQr/DQsJ/w0KCP8MCgj/CwkH +/xwXFP8PDQr/IBwX/xwYFP8ZFRL/FhMQ/w0LCv5YZWW43P//JVNiYjQtMTHVTmBg/qHm5v+m//// +ff///2z///9r////bP///23///9r////a////27///9u////cP///3D///9y////cv///3P///90 +////dv///3f///94////ef///3r///99////f////4D///+B////gv///4P///+E////hf///4b/ +//+H////if///4n///+K////i////4z///+O////j////5D///+Q////j////5D///+R////kv// +/5P///+U////lf///5f///+Y////m////5z///+d////n////6D///+h////ov///5////+J//// +bfv9/0O0uv8NJSb/AAAA/wEBAP8CAgH/AgIB/xseHerE3d09v///BAAAAAAAAAAAAAAAAP///wLQ +6uoxLS4s5iokHv8sJR//KiMd/yUfG/8LCQf/FRIP/xANCv8LCQf/EhIR+nyNjZfk//8TAAAAAAAA +AAAAAAAAAAAAAOT//x19i4mjIyIf+hwYFP8WEw//CQcG/wcGBf54ioi+2v//IwAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAA////Atr5+TFZYV/hEQ4M/hMQDf8PDAr/DAoI/wkHBv8RDgz/ +FRIP/xYTEP8gGxf/HRgU/xgWEv8VEw//DAwK/JGkpIrk//8Te4yMHUBHR7dASUr9kM/P/63+/v+H +////bP///2f///9o////af///2r///9r////bf///23///9v////b////3H///9x////cv///3T/ +//90////dv///3b///94////ef///3r///97////fP///33///9+////f////4D///+B////gv// +/4P///+F////hf///4f///+I////if///4r///+L////jP///43///+O////j////5D///+R//// +kv///5P///+U////lv///5f///+X////mf///5n///+a////nP///53///+e////nv///5P///95 +/v7/V+Pm/yNkZ/8AAgL/AAAA/wEBAf8CAgH/DxAP96O5t33u//8PAAAAAAAAAAAAAAAA0P//C6/I +xmMjIyDyLCUe/yokHf8pIh3/Ix0Z/wsJB/8UEQ7/DgsJ/woIBv8SFBLylqmpa9D//wsAAAAAAAAA +AAAAAAD///8ByOPjQl9paNooIh3+KCIc/xIPDP8HBgT/EBAP/JWrqYzY//8UAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAADr//8Nxd7eZiQkIvkWExD/FhMQ/xIPDP8PDAn/CggH/xsXE/8M +Cgj/GBQR/x0ZFf8cGBT/GRYS/xQRDv8fIiDzzOfnQcz//wW/2NgUZ3JynjU5Oft2oKD/rfr6/47/ +//9u////Y////2T///9l////Zv///2f///9o////af///2r///9r////bP///27///9u////cP// +/3D///9y////c////3T///91////dv///3f///94////ef///3r///97////fP///33///9+//// +f////4D///+B////g////4T///+F////hv///4f///+I////if///4r///+L////jP///43///+O +////j////5H///+R////k////5T///+V////lv///5f///+Y////mf///5r///+b////lf///4L+ +/v9j9/r/O6uw/wMLC/8AAAD/AgEB/wICAf8LDAv7iJqYndz//xYAAAAAAAAAAAAAAADl//8UnLCv +kyMhHfosJR7/KCIc/yghHP8cGRX/CwkI/xIQDf8LCQf/CAYF/xscHOaow8M4////AgAAAAAAAAAA +AAAAAP///wKwx8dOR0xJ7SojHf8kHhn/DAoJ/wUEA/8hJCP1n7OzWMz//wUAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAOL//xuQoJ6kEg8N/h4ZFf8XFBH/ExAN/xANC/8PDQr/HRgU/woJ +B/8YFRL/GRYT/xoWE/8ZFhL/EQ8M/0JLSubd//8u////Adrs7A6WqKh/Njg49F96ev+l7u7/m/// +/3X///9g////YP///2H///9i////Y////2T///9l////Zv///2j///9p////av///2r///9s//// +bf///27///9v////cP///3H///9y////c////3T///91////dv///3f///95////ef///3v///98 +////fP///37///9/////gP///4H///+C////g////4T///+F////hv///4f///+I////if///4r/ +//+M////jf///43///+P////kP///5H///+S////k////5T///+V////lv///5f///+W////if7/ +/239/v9O3uP/DCgp/wAAAP8CAQH/AgIB/wgJCfxqd3el3f//FwAAAAAAAAAAAAAAAN3//xeCkpKg +IyEd+ygiHP8mHxv/JyEc/xcTEP8MCgj/DwwK/wkHBv8GBQT/KzEw3dPy8in///8BAAAAAAAAAAAA +AAAA////BZeqql4tLCr4JyEc/yMdGP8KCAf/BAMC/zc+Pe6txMRO////AgAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAD///8D0/PzQVBYV9AZFRH+Ix4Z/xkWE/8VEg//EQ4L/xYSD/8VEg//DwwK +/xgVEv8YFRL/GBYS/xgVEv8PDgz+a3p60d///yj///8B////A7nV1TdGTEzWSU5O/5TPz/+p//// +gf///2P///9c////Xf///17///9f////YP///2H///9i////Y////2T///9l////Zv///2j///9p +////av///2v///9s////bf///27///9v////cP///3H///9y////c////3T///91////dv///3f/ +//95////ev///3v///98////ff///37///9/////gP///4H///+C////g////4T///+F////hv// +/4j///+I////iv///4r///+L////jf///47///+P////kP///5H///+S////k////5T///+O//// +dP///1j2+v8hZ2v/AAMD/wEBAP8CAgL/BgYF/UxTU6vd//8XAAAAAAAAAAAAAAAA3f//F216eKUj +IBz8JB4a/x8aFv8kHhr/FhIP/w0LCf8MCgj/BgUE/wUEA/9LVVTU3v//J////wEAAAAAAAAAAAAA +AADm//8VipmZlyAdGv4jHhn/HRgU/wcGBP8DAgL/Rk5O6LvS0kv///8CAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAANr//we1zs5vNzs57CMeGf4nIRz/HxsX/xcUEf8RDgz/GRUR/xANC/8VEg// +GRUS/xgVEv8YFRL/FxQR/xUUE/x7jY2f5f//FAAAAAAAAAAA1PDwEmNubpo8Pj78eZyc/6z9/f+N +////aP///1n///9Z////Wv///1v///9d////Xf///1////9g////Yf///2L///9j////ZP///2X/ +//9m////Z////2j///9p////av///2v///9s////bv///2////9w////cf///3L///9z////dP// +/3X///92////d////3j///95////ev///3v///99////ff///37///9/////gf///4L///+C//// +hP///4X///+G////h////4j///+J////iv///4v///+M////jf///47///+P////kP///4////96 +////Xf3+/zGfpP8FFBX/AAAA/wIBAf8EBAP+OkBArt3//xcAAAAAAAAAAAAAAADd//8XVl9dqSMf +G/0hHBj/HxoW/yMdGf8RDgz/DgsJ/wkHBv8FBAP/BQQD/19sas3d//8m////AQAAAAAAAAAAAP// +AeH//yNwennGFxQR/x8aFv8ZFRL/BQQD/wQEA/5LU1PPwN3dNf///wEAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA3///CIqcmn8pKij2LCUe/yokHv8oIhz/JR8a/x0ZFf8bFxT/DAoI/xYUEP8X +FBH/GBUR/xcUEf8VExD/ISMj9oiamnK///8EAAAAAAAAAAD///8CdYaGSkBEROdbaGj+oOjp/5r+ +/v9x////WP///1X///9W////V////1j///9a////W////1z///9d////Xv///1////9g////Yf// +/2L///9j////ZP///2X///9m////Z////2j///9p////av///2z///9t////bf///2////9w//// +cf///3L///9z////dP///3X///92////d////3j///95////ev///3v///99////ff///37///9/ +////gf///4L///+C////hP///4X///+G////h////4j///+J////iv///4v///+M////jf///37/ +//9j////PcfN/w80Nv8BAQH/BgQD/wUEBP4vNTOx3f//FwAAAAAAAAAAAAAAAN3//xdLU1GsHhoX +/RsXFP8aFhP/HxoX/w0LCf8MCQj/BgUE/wQDAv8FAwL/bn59veD//yEAAAAAAAAAAAAAAAAA//8B +4///JUpQTtMTEA7/HxoW/xUSD/8EAwL/BgcG/UVNTaTC2toVAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAADM5eUKYWxqiyEfHPsuJh//KiQe/ykiHf8oIRz/JB4a/x4aFf8OCwn/ExAN/xQR +Dv8VEg//FRIP/xMRDv8uMjHxn7W1a6r//wMAAAAAAAAAAAAAAACJnJwaTFRUs0NGRv2Kvb7/pf39 +/37///9c////Uv///1L///9U////Vf///1b///9X////WP///1n///9a////W////1z///9d//// +Xv///1////9g////Yf///2L///9j////Zf///2X///9m////aP///2n///9q////a////2z///9t +////bv///2////9w////cf///3L///9z////dP///3X///92////d////3n///95////e////3z/ +//99////fv///3////+A////gf///4L///+D////hP///4X///+G////iP///4n///+K////gf// +/2j///9E4eX/GFda/wEDA/8DAgL/BAMD/iwyMLHd//8XAAAAAAAAAAAAAAAA3f//F0RIR68fGxf+ +HBgV/xsXFP8hGxf/Dw0K/woHBv8FAwL/AwMC/wcGBv5ldHSK6f//DAAAAAAAAAAAAAAAAAD//wHH +5uYpNDg12hANC/8dGBT/EA4M/wMCAv8HCAf9R09OlsTr6w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAMzg4BlTWlmuIRwY/iwlHv8sJR7/KyQe/ykjHf8kHhn/GhYS/w4LCf8OCwn/EA0L +/xIPDP8TDw3/EQ4L/jg/PuqyzMxk////AgAAAAAAAAAAAAAAAMbi4glyf394PkBA8XGIif+n8fH/ +kv7+/2z///9X////UP///1D///9S////U////1T///9V////Vv///1j///9a////Xf///17///9g +////Yf///2L///9h////YP///2D///9g////Yv///2P///9k////Zf///2b///9n////Z////2n/ +//9q////a////2z///9t////bv///2////9x////cv///3T///93////ev///3v///98////fv// +/37///+A////gP///4L///+D////hP///4X///+G////iP///4n///+K////if///4f///+D//// +b////0vw8v8heHz/AQYG/wAAAP8CAgL+KzAwsd3//xcAAAAAAAAAAAAAAADd//8XPEE/sBkVE/4V +Eg//FhMQ/x0ZFf8NCwn/BwUE/wMCAv8DAwL/CwsK/V9ra2uq//8DAAAAAAAAAAAAAAAA////AY+i +nTcgHx3kEQ4L/x0YFP8ODAn/AgIB/wkJCfxLU1OVxOvrDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAD///8Bw9/aOE9WVeAfGxf/KSId/yojHv8sJR7/LCUf/yYgG/8ZFRL/DAkH/wkHBf8MCgj/ +DwwK/w8NCv8PDAr+O0ND0b3Y2EL///8BAAAAAAAAAAAAAAAAf///Ap63tzJPV1fJV1xc/5vGx/+u +/f3/i////2r///9b////WP///1n///9b////Xv///17///9j////ZP///2T///9p////bP///3T/ +//93////ef///3T///9v////Z////2D///9d////Xv///1////9h////Yf///2P///9j////Zf// +/2b///9n////aP///2n///9r////a////23///9x////ef///4H///+I////kP///5L///+U//// +lf///5b///+X////mP///5n///+a////nP///53///+e////of///6H///+c////lv///4////9+ +////WPr7/yydof8CDAz/AQAA/wMDAv4sMDCx3f//FwAAAAAAAAAAAAAAAN3//xc5PjywGRUS/hUS +D/8WEg//GxcU/wwKCP8FBAP/AwIC/wMDAv8MDAv8ZHBwZv///wIAAAAAAAAAAAAAAAD///8Emaqq +Sx8fHOoTEA3/GxcT/w0LCf8CAgH/CQoJ/E1XVpTE6+sNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAH///wK409NBQ0lH7SAbF/8nIBz/KSMd/yskHv8sJR//JiEb/xUSD/8IBgX/BQQD/wkHBf8M +Cgj/DAoI/w4MCv43Pj2zw93dHgAAAAAAAAAAAAAAAAAAAAAAAAAAxOvrDW57e3hJS0v3f4yN/rPt +7f+o/v7/iP7+/3D///9k////Y/7+/2n+/v9y/f3/b/39/3P8/P9v/Pz/a/z8/2r8/P9w/Pz/f/z8 +/4j8/P+U/f3/lf39/5D+/v99////a////17///9b////XP///13///9e////X////2D///9h//// +Yv///2P///9k////Zf///2b///9m////af///27///94/f3/gvz8/4v8/P+W/Pz/nfz8/5/8/P+g +/Pz/ofz8/6L8/P+k/Pz/pfz8/6b8/P+n/Pz/qfz8/6v8/P+0/Pz/uf39/7b9/f+u/f3/pPz9/5H9 +/f9k+fr/Lp2g/wIMDP8BAAD/BAMD/iwwMLHd//8XAAAAAAAAAAAAAAAA3f//Fzk9O7EZFxP+FxUR +/xcVEf8bFxT/CwoI/wQDAv8DAgL/AwMC/wwLCvxkcXFl////AgAAAAAAAAAAAAAAAN3//w+bsbGD +ISEe9g8MCv8cGBT/DgwK/wICAf8ICQj8SVNSlcTr6w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAf///ArXMzEI1NzbyFRIP/xsXE/8gHBf/JiAb/yojHf8nIBv/EQ8M/wUEA/8DAgL/BQQD/wgG +Bf8LCQf/DAsK/UBJSavH6OgXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk66uE1lgYKtQUVH6fIyM +/5XU1P+P5OT/deHh/17b2/9R09P/U8fI/1a3uP9WrKz/V6Gh/06Zmf9CkZH/OIyM/zmLi/9BkJD/ +U5eX/3Oqqv+Wycn/r+3t/6z+/v+P////aP///1v///9Y////WP///1n///9b////XP///13///9e +////X////2D///9g////Xv///1v///9Y/Pz/Uefo/0Spqv8/j4//P4uL/0SMjP9IjIz/SYyM/0mM +jP9KjIz/S4yM/0uMjP9LjIz/S4yM/0yMjP9OjY3/VJGR/2OYmP95pKT/f6io/3elpf9voqL/Zaam +/0OQkf8TODn/AAIC/wEBAf8EAwP+LjAwsd3//xcAAAAAAAAAAAAAAADd//8XOT08sRoXE/4YFhL/ +GRYS/xwYFP8LCQf/BAMC/wMCAv8DAwL/DAwL/GR0cWX///8CAAAAAAAAAAAAAAAA4v//EpKjo5Qe +Hhz5Eg8M/xwXFP8NCgj/AwIB/wgIB/1IUFCYyOzsDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAB///8CssnJQzc7N/IUEQ7/FBEO/xYTEP8bFxT/Ih0Y/yUfGv8PDAr/BAMC/wMCAv8DAgL/BQQD +/wcGBf8LCwn9SlNTqNDz8xYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqqqoDiZubSlpiYspFR0f8 +U15e/1ZsbP9FYWH/MU5O/yI+P/8hNzj/IjAw/yIrK/8iJib/HyAg/hgYGP4SEhL+EhMT/hgYGP4j +IyP+PT4+/mRqa/6WqKj/tODg/6r9/f94////X////1X///9V////Vv///1j///9Y////Wv///1v/ +//9c////Xf///1v///9V////S/7+/zfR0v8eYmP/ER8g/w4REf4QERH+EhMT/hMUFP4UFRX+FBUV +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqqqoD +PEREehkdHf07hIX/V/7+/0n///88////Of///zn///85////Of///zn///85////Of///zf///8q +////Efv8/wKkqP8BCAj+HiIiu1VVVQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAADf//8IgZKPfCAgHfknIRv/JyEc/yYgG/8cGBX/DQoJ/xoXE/8gGxf/JB4Z +/xIPDP8lKyrm0/HxOr///wQAAAAAAAAAAAAAAAAAAAAA3v//H3qFgr0xKSP+OC4m/zkvJ/86Lyf/ +Eg8M/w8MCv8TEA3/GRYT/xcUEf43Pj7prcXFYf///wIAAAAAAAAAAP///wG3z89AWF1Y3TQrJP47 +MCj/Myoj/wkIBv8DAwL/AgIB/zA1NO6qwMBy5///CwAAAAAAAAAAAAAAAAAAAAAAAAAA1P//Bqe7 +uGlHRkDrNy4m/jguJv84Lib/OS8n/zkvJ/85Lyf/FxMQ/wMCAv8BAQH/AgIB/wICAf8CAgH/AwIB +/x0fHvnG4uJ24f//EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzl5QpB +SkqQGh0e/kKLjP9a/v7/Sv///zv///85////Of///zn///85////Of///zn///85////N////yr+ +//8R+vz/AqKm/wEICP4eIiK7VVVVDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAANv//x1ygH25FxUS/icgG/8mIBv/Ix4a/xwYFf8LCQf/GhYT/x0ZFf8hHBf/ +DQsJ/0dSUdnf//8p////AQAAAAAAAAAAAAAAAAAAAADf//8IiJaUeDcxLPs6Lyf/OzAo/zovJ/8g +Gxb/Dw0K/xkWEv8eGhb/HRgU/x4hHveFlpZ42v//BwAAAAAAAAAAAAAAANLz8xdtdnKhNS8o/D0y +Kf9ANCv/FREO/wUEA/8CAgH/DQ0N/oOUlL7b//8k////AQAAAAAAAAAAAAAAAAAAAAD///8Bx93d +LlNVTsk3LSX+OjAo/zwxKP88Min/PDIp/0A0K/8nIRv/BAMC/wICAf8CAgH/AgIB/wICAf8DAgL/ +CAYF/nuLibDh//8jAP//AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzOXlHkZQ +UL8XHR3/QKCh/1n+/v9J////Ov///zn///85////Of///zn///85////Of///zn///83////Kv7/ +/xH5+/8Cn6T/AQcI/h4iIrtVVVUPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAC///8E3v//N1BWVOUZFRL/JB4a/yMdGf8fGhb/HRkV/wwKCP8ZFhL/GRYS/xoWE/8J +CAf+b35+xeL//yT///8BAAAAAAAAAAAAAAAAAAAAAKr//wObrq5fRkVA8zovJ/88MSn/OzAo/ywk +Hf8MCgj/HxoW/x8aFv8cGBT/EA8N/W17e7Hh//8aAAAAAAAAAAAAAAAA6f//DJqrqYZBPTb2PjIp +/0A0K/8mIBr/CAYF/wMCAv8DAgL/QUdH4+H//zzM//8FAAAAAAAAAAAAAAAAAAAAAAAAAADi//8b +fIaCsDcuJv49Min/PjMp/z4zKv9ANCv/RTgu/zkwJ/8IBgX/AwIB/wICAf8CAgH/AwIC/wQDAv8G +BQT+QEhH2cbi4lHM//8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC71tYmNTs7 +zhcgIP8+ubv/VP7+/0f///86////Of///zn///85////Of///zn///85////Of///zf///8q/v7/ +Eff6/wKdov8BBwf+HiIiu1VVVQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAN3//w/K5eNvJicl9x4ZFf8fGhf/HBgU/xoWE/8bFxP/DwwK/xkWEv8aFhP/GxcT/xER +EfyEmJiO4v//EgAAAAAAAAAAAAAAAAAAAAAAAAAA////Ar7X11NZXlvlOjAn/jswKP87MCj/Myoj +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 +/wYFBP8GBQT/CgoJ/mFvbs7M6upW4f//EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wK0zc0pS1FRuUpMTP6H +pqf/pvHx/5n+/v97////Zf///1X///9H////QP///zv///85////Of///zj///8t/v7/Eunt/wKc +oP8ACQn/HiIi9J23t0R///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wHi//8ko7e1 +pA4PDf4CAgH/AgIB/wICAf8CAgL/CwgH/wgHBf8FBAP/BwYE/wsJB/8JBwX/XWlpvN///yAA//8B +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADd//8PutLSc0JCP/U2LCX/OC4m/zctJf80 +KiP/Dw0L/w8MCf8TEA3/FBEO/xEPDP8aHBv6sszKf+X//xQAAAAAAAAAAAAAAADb//8dtMnFk0M9 +NfpgTT7/dV1L/0k8MP8ODAn/BQQD/wMCAf8JCQj+W2dm4Mnn51XG//8JAAAAAAAAAAAAAAAAqv// +A9v//yuaqqW6VEg9/YpwWf+Ha1b/fGFO/3BaR/91Xkv/fmRP/zsxJ/8HBgX/BwUE/wcGBP8GBQT/ +BgUE/wcGBP8IBgX/FBUU+nSEhMLT7+9SzP//CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrU1AZ8iopaT1RU6Vpd +Xv6HoqL/nNvb/5f6+v+H////df///2P///9X////Sv///0T///89////Of///y3+/v8T6O3/A5uf +/wAICf8cICD1nbS0RH///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3///CNj5+VdYYmHb +AgEB/wICAf8CAgH/AgIB/wQDAv8LCAb/BgUE/wcFBP8JCAb/DAkH/xISEfuSpKR83f//DwAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///wLM5eUyY25qxzApI/44Lib/NSwl/zUs +JP8lHhn/CAYF/xIPDP8TEA3/FBEO/woJB/5aZ2bO1fPzQ////wUAAAAAAAAAANT//wbd//89fYeD +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 +/0c6L/8+Myr/Nzo48LDHxovd//8XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wHd+PgmnKyrmDQwLPU+ +Myr/PzQq/z4zKv9ANSv/NCsj/wgGBf8BAQD/AgIB/wICAf8BAQH/AQEB/zY+PuWmv7951/X1Gv// +/wEAAAAAAAAAAL///wTf//8pxuDgZHuAespWST38hm5Y/p2Dbv+LcV3/QjYs/w8NC/8BAQH/AQEA +/wIBAf8FBQX+GBsb+HCAgNG0zs542fT0L9r//w7///8CAAAAAAAAAAD///8C5f//Ctz//xbJ5OQ5 +r8HBYKe2s5SWn5nJgYB43nhvZuuGdWT4nop3/a6Yif6MdmT/ZFNE/xwYE/83LST/ZFFA/oFnU/6O +c13+jXFb/oluV/2CZ1T9g2hU/XljUPx0YE77cF5O925hU+14cWbihYF23YSBdt2FgHTfhoBy4Glp +Yd87QD/YNz4+d////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AOn//wzI5eJQaXRzySYjIPspIx3/KSId/ykiHf8qIx3/Ix0Z/w8MCv8cFxP/VEQ3/1BCNf9PQDT/ +UkM1/zcxK/tzgICx0O/vMf///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL///wTf//8xdYB8wzEq +JP4/NCr/QDQq/0I2LP9DNy3/KiMc/wQDA/8BAQH/AgIB/wICAf8CAgH/AwMD/jQ8POmnvr574v// +G////wIAAAAAAAAAAP///wHi//8Jz+npRo+alrtbVEr3fGVS/52Fb/+ZgWz/ZlNE/yMdF/8FBAT/ +AgEB/wICAv8CAgH/BQUF/igtLfV0hIPAsMfHeNn19Tbf//8Q////A////wEAAAAAAAAAAP///wH/ +//8E5v//Fd7//yfh//8r1fLyPrzU1Iqisq7SQzw1/CYgG/8jHRn/CggH/wsIB/8gHhv8bGxk2357 +cbZ7eG6yfn10r3l+eKx8h4Somqeko6e5tZ22zct7yebiPtz5+Szb//8r2///K9v//yvb//8r4P// +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 +/yskHv9DNi3/VkY4/01AM/9OQDP/T0A0/1VEN/9eTT3/ZFFA/2paSfyFhHrpw9vZluH//yvM//8F +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E4f//Gsrk5FeQnpvATUpD+1JDNv9zW0n/ +dl5M/39lUf+QdV7/qJF+/7KdjP+hjHr/cV1M/0E0Kv8VEQ//BwYE/wYEA/8GBAP/EA0L/xUSD/8Q +DQv/Eg8M/xQRDv8ZFRL/HhoW/xgVEf8TEA3/GhYS/yAcF/8jHhn/Ih0Y/ychG/8lIRz9LCkk+jQx +LPk5NjD4ODUw+Dg0L/g2My74NzQu+DMuKfouKST8KiQe/iskHv8sJR//LCUf/ywlH/8pIx3/JiAb +/yIdGf8gGxf/IBsX/x0ZFf8ZFhL/FBEO/xMPDf8SDwz/Eg8M/xkUEf8aFhL/GxcT/ycgG/9DNyz/ +WEg6/1hHOf9QQTT/TT8z/1FCNf9SQjb/VUQ4/2dTQv9uYFD8lZyUycPd23ne//8v////BQAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8B1///Ddf390e2y8mobXFt4FBFOvtl +UUH/c1tJ/4FnUv+cg2z/sJ2M/7Wikv+2oZL/qJGA/4BqWf9NQDX/KSIc/xANC/8JBwb/CwgH/wwJ +CP8QDgv/FBEO/xkWEv8cFxT/FREP/xMQDf8YFRL/IRwY/yQeGv8pIhz/LiYg/ywlHv8wKCH/MCgh +/zEpIf8xKSH/MCkh/zAoIf8wKCH/MCgh/zIqIv80KyT/Mysj/zMrI/8yKSL/MCgh/yskHv8mIBv/ +IRwY/yAbF/8jHRn/HxoW/xsXE/8UEQ//EA0L/w0LCf8RDwz/GhYT/ywkHv9HOi//Yk8//19OPf9b +Sjv/WUg6/1NEN/9PQTT/UkM2/1xLPP9qWEj9dnJo5au9uqvU8PBI0v//Ef///wMAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3///CN7//yfT7u5ehY6LtVxY +UPFYSDr+eGBN/6GKdP+yno3/taGR/7aikv+4o5T/uKSU/66Yhv+Tf23/ZVRH/zkuJf8XFBD/Dw0K +/w4MCf8QDgv/FRIP/xcUEP8SDwz/Eg8M/xYTEP8dGBX/HhkW/ychG/8qIx3/KiMd/y8oIP8wKCH/ +MCgh/zEpIf8xKSH/MSki/zAoIf8wKCH/MSkh/zMrI/8xKSL/Miki/zAoIf8uJyD/KiMe/yQeGf8d +GBX/HhkW/yUfGv8mIBv/JB4Z/xoXE/8VEg//HRkV/zYtJP9XRjj/bVdF/2lVRP9eTT3/XUw8/1xL +PP9aSTv/Wkk6/1pKO/9eTT7+bGJW942VkNTF3t5u3///KN///wgAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AtD//wvS8PA0u9HN +jH2DftlaUEX4jXZi/raikv+3o5P/t6OT/7ejk/+3o5P/t6OT/7ijk/+1n4//qJSE/4ZxX/9bSz7/ +Miok/xkVEf8MCgj/CwkH/w4MCf8SDw3/FRIP/xoWE/8ZFhL/JB8a/yIeGf8lHxr/LSUf/zAoIf8w +KCH/MCgh/zAoIf8wKCH/MSki/zEpIv8yKiL/Mioi/zEpIv8xKSH/Lycg/ywlHv8lHxr/HBgU/xoW +Ev8aFhP/GRYS/xcUEP8aFRL/Jh8a/0I2LP94YU3/gGdS/3hgTP9sV0X/Y1BA/15NPf9eTT3/Xk09 +/15NPf9jUED+XVBD+nFzbd2rwL6W0u/vUeb//xX///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wPf//8Y +2Pf3SK6/vZV0d3DWfG9h+aKNfP66pJX/uKSU/7ejk/+3o5P/t6OT/7ejk/+4o5P/uqaX/7qmlv+v +mIf/j3pp/2VYTf9BNSz/JB0X/xEOC/8NCwj/DgwK/w4NC/8YFRH/FBAO/xgUEf8hGxf/KCEc/yoj +Hf8pIh3/KSId/yghHP8pIx3/KyQe/ykiHP8mHxr/IBsW/xwXE/8YFBH/ExAN/w4MCv8NCwn/Dw0K +/xsWEv81KyL/TT8z/2lVRP+IalX/h2xW/4puWP+EaVP/eGBM/2tWRP9hTz//Xk09/19NPf9aSTv/ +WE1C+mRkXtqUpaOZ1PDwSN///xjM//8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wHf +//8I3f//Hsrj4FOerKehhYR644l1Zv2wmYb/uqWW/7ijk/+3o5P/t6OT/7ejk/+3o5P/t6OT/7ik +lP+5pZb/uKWU/7Cbiv+fjX//hnVp/2ZURv8+Mij/HxkV/xIQDf8LCQf/BwYE/wYFA/8IBwX/CggH +/woIB/8JCAb/CAcG/wgHBv8JCAb/CQcG/wkHBf8LCQf/Dw0K/xMQDv8mHxr/PDEn/1dFN/9vW0n/ +eGFO/4VpVP+JbFb/hWlU/39kUP93YEz/e2JO/4BlUf95YU3/bVdF/2VRQf9bSTv/Sj0y/mBhW+eI +lpOkus/PVd3//x7f//8IAP//AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAv///BN///xje//8+s8fFmIiMg9OZi3nyq5iH/bejkv+5pZX/t6OT/7ejk/+3o5P/t6OT +/7ejk/+3o5P/t6OT/7aikv+0oI//sJqJ/6qUgf+ljHj/n4Vu/5F2YP98ZFD/aVVF/2RSQv9hT0D/ +XEo8/1ZGOP9URTf/VkU3/1hHOP9cSjv/YE4+/3NcSf+AZlH/h2xW/4puWf+RdF3/knVd/45xWv+D +aFP/fWNQ/3phTf94YEz/dF1K/25YRv9rVkT/bllG/2VRQf9SRDj+TUhC9mBnZNaZq6qc3v//Pt/0 +9Bi///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAP//AdT//wbe//8f1/X1Tq2/vYCgoZe3nJaK7KWSgv24oZL/u6eY/7ejk/+3o5P/ +t6OT/7ejk/+2opL/s6CP/6yXhP+mjnr/n4dw/5uAav+ZfWb/mX1m/5h8Y/+WemL/lXlh/5J2Xv+N +cFn/hWlT/4FmUf9+Y1D/dFxJ/3JcSf9vWUf/b1lH/3ZeS/98Yk7/gWVR/4puV/+OcVn/hWhT/31i +T/93X0v/c1tJ/3NbSf9wWUf/Y1BA/0o8Mf8/Ny7+UlJM8nWBftWcsLCZz+vrUN7//x/U//8GAP// +AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAP///wH///8F1///DdLr6yjK4OBcu8zHpZ2gl8ujloXusZ+S+LWik/23 +opL+uKSU/7Shkf+tmIb/pI14/6CIcP+bgGr/mHxl/5d6Yf+WemH/k3df/5J2X/+Tdl//kXRc/45x +Wf+IbFX/gGVR/3tiTv91Xkr/cltI/3BaR/9wWkj/eF9M/3xjT/+DZ1L/jG9Y/4ltVv99Y1D/dV1L +/2lUQ/9eSzz+TkE2/T44Mvg+PjvvX2lnzperqqi61NRh1PLuPNr19RzU//8G////AQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AeX//wrl//8e4f//NMrk4nWntbCPpaWYs6um +muGonY/yqpaF/KyTgv6qk4D/pI54/52Da/+YfGT/lXhg/5Z5YP+Tdl7/lHdf/5V4YP+SdV7/kHRb +/41xWf+Ha1X/f2VQ/3tiTv95YEz/dV1K/3hfTP9/ZFD/gmdS/4VqVP97Y1D/Z1JC/1BBNf5EOzL8 +RUM9805UUuNbZWS1gpOTkbnT03bh//805f//HuX//wr///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8D2v//DuH//xHY+PIoxdvb +ULrKxWG6xL2RrbOtxZyakNeRhXfhkoBr75yFb/mYgGn7mH9q/JZ9Z/2XfWf9lHlj/ZF2X/6PdV3+ +jHJa/ohtV/5+ZFH+eWFO/XxiT/1tWUj9ZlVF/FpMPvtMQzn5RT4370hHQeJZYFzZd4WDx4qampOZ +q6titc/PUM3s7Cnh//8R2v//Dv///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C +////BOX//xTd//8m3///Kdz5+SzC2tdUssbEjKKvrJ2PmJOigIN9p3t8c6p5dm2sdnBnr3NuYrBt +Z12xZmJbsGFgWK9bX1utXGNgq2Fraqh1g4GjiZqanqC2to20zMxV1vPzLN///ynd//8m5f//FP// +/wT///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAP///wH///8B////Af///wjY//8U3f//F93//xfd//8X3f//F93//xfd//8X3f//F93/ +/xfd//8X3f//F93//xfd//8X3f//F93//xfd//8X2P//FP///wj///8B////Af///wEAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////gAAAA////////////////AAAAAA/ +/////////////8AAAAAAB/////////////8AAAAAAAH////////////8AAAAAAAAP/////////// +8AAAAAAAAA///////////8AAAAAAAAAD//////////8AAAAAAAAAAf/////////+AAAAAAAAAAB/ +////////+AAAAAAAAAAAH////////+AAAAAAAAAAAA/////////AAAAAAAAAAAAH////////gAAA +AAAAAAAAAf///////gAAAAAAAAAAAAD///////wAAAAAAAAAAAAAf//////4AAAAAfgAAAAAAD// +////8AAAAH/4AAAAAAAP/////+AAAAH/+AHAAAAAD//////AAAAH//gBAAAAAAf/////gAAAH//4 +AAB4AAAD/////wAAAH//+AAAAAAAAf////4AAAP///gAAgAAAAD////+AAAH///4AAIAAAAAf/// +/AAAH///+AAMAAAAAH////gAAD////gAHAAAAAA////wAAB/4//gADwAAAAAH///8AAA/8H/wAB8 +AAAAAA///+AAAf8B/4AB/AAAAAAP///AAAf8Af4AA/wAAAAAB///wAAP8AH8AAf8AAAAAAf//4AA +H+AP+AAP/AAAAAAD//+AAB/AH/AAH/wAAAAAAf//AAA/AD/AAD/8AAAAAAH//wAAfgB/gAA//AAA +DAAA//4AAPwA/wAAf/wAAA4AAP/+AAH4Af4AAP/8AAAOAAB//AAD8AP+AAH//AAADwAAf/wAA+AH +/AAB//wAAA+AAD/4AAfgD/gAA//8AAAPgAA/+AAHwB/wAAf//AAAD8AAP/gAD4A/4AAP//wAAA/A +AB/wAA8AP+AAD//8AAAP4AAf8AAfAH/AAB///AAAD+AAH+AAHgB/gAAf//wAAB/wAA/gADwA/wAA +P//8AAAf8AAP4AA8Af8AAEP//AAAD/AAD+AAeAH+AAAAAAAAAAAAAAfAAHgB/gAAAAAAAAAAAAAH +wABwA/wAAAAAAAAAAAAAB8AA8AP8AAAAAAAAAAAAAAfAAPAH/AAAAAAAAAAAAAADgADgB/gAAAAA +AAAAAAAAA4AB4Af4AAAAAAAAAAAAAAOAAeAP8AAAAAAAAAAAAAADgAHAD/AAAAAAAAAAAAAAA4AB +wA/wAAAAAAAAAAAAAAOAAcAP4AAAAAAAAAAAAAADgAHAD+AABgAAAAAAAAAAA4ABgA/gAAYAAAAA +AAAAAAOAA4Af4AAHAAAAAAAAAAADgAOAH+AABwAAAAAAAAAAA4ADgB/AAAcAAAAAAAAAAAOAA4Af +wAAPgAAAAAAAAAADgAOAH8AAD8AAAAAAAAAAA4ADgB/AAA/AAAAAAAAAAAOAA4AfwAAP4AAAAAAA +AAADgAOAD8AAD/AAAAAAAAAAA4ADgA/AAA/+P/wAAA//AAOAAYAPwAAP///8AAAf/wADgAGAD8AA +D////AAAH/8AA4ABgA/AAAf///wAAB//AAOAAYAPwAAH///8AAAf/wADgAGAB8AAB////AAAH/8A +A4ABwAfgAAf///wAAB/+AAOAAcAH4AAD///8AAAf/gADgADAA+AAA////AAAH/4AA8AAwAPgAAP/ +//wAAB/+AAPAAOAB4AAB///8AAAf/AADwADgAfAAAf///AAAH/wAB8AAYAHwAAH///gAAB/8AAfA +AGAA8AAA///4AAAf+AAH4AAwAHAAAH//+AAAD/gAD+AAMAB4AAB///gAAA/wAA/gADgAOAAAP//4 +AAAP8AAP8AAYABwAAB//+AAAD+AAD/AAHAAcAAAP//wAAA/gAB/wAAwADgAAA//4AAAPwAAf+AAO +AAcAAAH/8AAAD8AAP/gABgADAAAAf+AAAA+AAD/4AAMAA4AAAB/gAAAfgAA//AADAADAAAADwAwA +HwAAP/wAAYAAYAAAAAAHAD4AAH/+AADAADAAAAAAA/j+AAD//wAA4AAIAAAAAAH//AAA//8AAHAA +BAAAAAAB//gAAf//AAA4AAEAAAAAAP/wAAH//4AAGAAAwAAAAAD/8AAD//+AAAwAADAAAAAA/+AA +A///wAAGAAAGAAAAAf/AAAf//+AAB4AAA8AAAAP/gAAH///gAAHAAAAYAf///wAAD///8AAA4AAA +AAH///wAAB////gAAHAAAAAB///4AAA////4AAAcAAAAAf//8AAAP////AAADgAAAAH//8AAAH// +//4AAAOAAAAB//+AAAD/////AAAB4AAAAf/+AAAA/////4AAAHgAAAH/+AAAAf////+AAAAeAAAB +/+AAAAP/////wAAAA8AAAf+AAAAH/////+AAAAB4AAH8AAAAD//////wAAAAD4AD4AAAAB////// +/AAAAAA/8AAAAAA///////4AAAAAAAAAAAAAf///////AAAAAAAAAAAAAf///////4AAAAAAAAAA +AAP////////AAAAAAAAAAAAH////////8AAAAAAAAAAAH/////////gAAAAAAAAAAD/////////+ +AAAAAAAAAAD//////////wAAAAAAAAAB///////////gAAAAAAAAD///////////8AAAAAAAAB// +//////////wAAAAAAAB/////////////gAAAAAAD//////////////AAAAAAH/////////////// +AAAAAf///////////////+AAAA////////8oAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT//wH8//8EAAAAAgAAAAB/j48AJSIeAAAAAAD/ +//8lrcrONnuOjjiJlpI5kZ2ZOY6dmDmRnpk4k5+cOYmYlTiKnp023fz9Nf///w0AAAAAAAAAAAAA +AAAAAAAASVNSBJR+eQP///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +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 +/W/4+v15///8hf//+4v///uS///+lv///3X9//8cT1L+AAAA+wAAAP44Pz61AAAAAAAAAARBR0cA +bHl4UC4qJf8pIRv9FRIP/QsIBf8jJSTr6P//J77V2AADBAMAYWtpmBkVEv8KCAb+U2BfnAAAAAAA +AAAAV15dAGVoaQAAAAAHRUpJxwwIBv4LCQf8Dw0K/hoWEv4bFhL8FBMR/3GDg2AwLy9mcpWV/p3/ +/vxo/f39bP///mz///5v///+cv///nP///51///+eP///nr///58///+ff7+/n////6B///+g/7+ +/4b+//+H////if///oz+/v+P///+kf///pT///6W///+mP///pv///6d/v3+n/39/qD5+f+S///+ +SsDE/wIHCPwAAAD/IiYk1Xl7exEBAAABAAAAAGFsan4oIhz+JiAb+xEODPwIBgT+IycmxQUGBgmb +srYAAAAADUtPS9MaFBD+DQ0M/m18fGQXGRkADhAPAZ2urQGqvbwAyODgOCcoJfgQDAj+DwwJ/RIP +DP4XFBH9FxIP/iIkIfrH6OgjZ21tQlhqav6d+Pj+af7+/mD9/f9k/v7/Zv7+/2j+/v9q/v7/bf7+ +/2/+/v9x/v7/c/7+/3X//v93/v7/ef7+/3v///99////gP7+/4L+/v+E////hf7+/4j+/v+K/v7/ +jf7+/4/+/v+R/v7/kv7+/5T9/v+X/v7/lf39/2v6/P4SPUD9AAAA/x4jIvHM5eQvAAAAAAAAAABX +X12aJB4a/yAaF/wNCwn7BwUE/zM6OawAAAAAAAAAAMrj5ig2NTLsEgwI/xcaGf+Km5tIbnt7AEBH +RwIPDg4BCQoJAG99fIAkIBz/GRUR/BMQDf4TDw3+FxQR/BIOC/80OjjdxdfXEz8oJw1KT0/UkczM +/nz+/vxW/f3+Xf7+/l7///9h/v7/Y/7+/2X+/v9n/v7/af7+/2v+/v9t////b/7+/3H+/v9z//// +dv///3j///96/v7/fP///37+/v+A/v7/gv7+/4X+/v+H/v7/if7+/4v+/v+N/v//j/7+/5P7+v98 +////KoeK/QAAAP8RExP0eYmJMoGSkgAAAAAAQERBnB4ZFv8bFhP8CggH/AQCAf9PWViiAAAAAI2e +nQCCkZBRJyYj/wsHBP8XGhnsn7OzK216egBIUFABAAAAAAAAAABFS0mhKCIc/ichG/sdGBT9EQ4L +/RYTD/sSEA3+QEdGuAECAgEzHx8AQkJCfHGQkP+Q///8Uf39/lP9/f9V/v7+V/39/1n9/f5b/f3+ +XP39/l79/f5h/v7+Zf7+/2f///5q////bP///27///9w/v7/cv///3T///51/v7/dv39/nj9/f55 +/f3+e/39/n39/f5//f3+gf39/oP9/f6I+vr+fvz8/z7Ex/4ABgb/CwoJ9V9wbzNgb20AAAAAADU3 +NJ8YFBH/GBQR/AYEA/wEBAP/PkZFdAkLCgAkJiMAR05MWhoXFP4JBwT+FBYW3KrAwBNvfHsASVJR +AQMCAgAAAAAJOz06yCcfGf4sJR/8IRsX/gwJB/4NCwj8EA4L/0xWVZ8BAQEAQEFBAGNwbytXYGDv +oevr/HL///tS///9Wf///V3///1h///8Zv///G3///tx///7Z////V3+/v9f/v7+Yv7+/mT+/v9m +/v//aP///2r+/v5r/v7/cv///oH///yM///7kf//+5P///uV///7mP//+5r///uc///8mf///4// +//5Y9ff9BCMl/wgCAfVhdHQzYW5uAAAAAAAvMi+gFRMP/xUSD/wDAgH8BQUE/zY8O2UnKyoAAAAA +AE9XVYAWExD+CAYE/xQYF9uuyMgTc4OCAHyNjQImLCwA////FzU3NeQcFxL/KSMd/R4ZFf8EAgL+ +BgQC/A4NC/8+RkZyAwMDABwgIANFPz8AXGBgh3qMjP+V5ub/Zenp/1fa2v9eysr/XL+//0e8vP9U +uLj/d8bG/5zr7P+H////Wv7+/1n+/v9c////Xv/+/2D+/v5h/f3/Yv///l719f5Zurr/Y7Oz/2y1 +tf9ttLT/b7S0/3K3t/9ztrb/gr29/5fMzP6Izs7/Ure5/gMYGf8KBQX1YnFyM2RubgAAAAAAMjQx +oBoXE/8YFBH8AgEB/AYFBf81OzpmNTw7AAAAAABbZGOeFxQR/wgFA/4XGRnlqcC/IHiIiAB5iIgC +rsrJAL/a2hgmJyTmEw8M/yMeGfwdGBP+AQAA/gEAAPwLCwn/SlRTbAwLCQBhbm0CNTQ0AB4iIg9W +W1uYSlZW5TBEROoiNTblKjQ03SIjI8Q9FBS2GhwcsCsuLrN+goLoquDg/27+/v1Q/f3+VP7+/1b+ +//9Y/f3/WP7+/j/x8v4WU1X/Ghsb0h0kJK0gJyexGB4esBgeHrAYHh6xGR8frSwyMcMhIiD+Hh4c +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 +r0EvLz8eDw5yBAAAVwYAAEgOAABGFAAAQTAuLkAfCwo5CAAAhFaIiP6q///7mPn5/p/7+/6k///6 +ULa4/gkGB7wYAwM+GgsKQBMAAEwJAABpOC8p3B4RC/4RCQb3AAAA/iwxMcUAAAAMAAAAAj1CQQA/ +RERdLikk/hsWEvcJBgT+NDk4wAwMDQhpe3oAVV9elQ4MC/86Pz6tAAAABHGCgABib24AOkNCGi0w +MOEAAAD+DQsI+hENCf4XFhT0SEtMsBtOTvQffH3/HW5w/RhjZPsXXV/7GWBi+hdiY/kZYWP5JnV3 +/nPl5f6S/v79kP39/pP9/P6Y/f39fPn5/jKMjf8jX2H5JWRm+ittbvs3e33/PIyP/UKWmf4RLTD7 +AAAA/hccHOOetLImAAAAAAAAAABLT0yLKyQe/xQQDPUPDQv/UFlYfwoMDACMnZwfLS8s3g4NC/5R +XFxoHCAgAD9HRgZZYV8AanRzbRIRD/8GAwL7FRMP+hQPC/8pLSzEOTEzgmqwsPt5///7YP///GH/ +//5h///+ZP///mb///9o////dv///oL///2D/v79hv7+/on+/f6M/v79kP///oj///2A///+hv// +/5D///2Z///7oP///aL///5SvsH8AAcH/A4NDfs+R0VHQ05KAAICAhJAQD2pJh4Y/g8MCvgQEA/5 +OUA/S0ZNSgBZYl9TJyQg/BQUE/BxhIQ2o7y7AGhzcgJFR0cFNjk3vg4KB/4OCwj5FhIP+BcUEP41 +PDqVeP//LnGNjfyJ/v7+X/r6/Wj7+/5s/Pz9bvz8/nL8/P51/Pz+dvz8/nb9/f55/f3+e/39/n7+ +/v+C/f3+hP39/on8/P6P/Pz+kfz8/pP7/P6V/Pv+l/v8/Zz6+v59/f79EUBD+QYCAv9JVFNwBQYF +AAAAAC45OzfBHxgU/wkGBfwWGBfvS1ZVNAoGBABYXVt/GRQR/xseHN4AAAAcAAAAAHuRkgCXsbEs +MzIu6BcTDv4TDw36Ew4M+BkYFf9ETUxzYt/dAFljY9CK5eX+Wf7+/Ff7+/5b/Pz+Xvv7/mD8/P5i ++/v+Z/39/2z+/v5u/f3/cf7+/3T+/v54/f3/ev7+/nr9/f57+/v+ffz8/4D8/P+D+/v/hfz9/4z5 ++f2G/v7+Lo2Q+QAAAP4zOzt8AAAAAAAAADEpKCXCGBMR/wQBAP4XGRjfe4uKJAAAAAA6PDmeDgsI +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 \ No newline at end of file diff --git a/Managed/DecalUtil/DecalUtil.Properties/Resources.cs b/Managed/DecalUtil/DecalUtil.Properties/Resources.cs new file mode 100644 index 0000000..526fd09 --- /dev/null +++ b/Managed/DecalUtil/DecalUtil.Properties/Resources.cs @@ -0,0 +1,48 @@ +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace DecalUtil.Properties; + +[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] +[DebuggerNonUserCode] +[CompilerGenerated] +internal class Resources +{ + private static ResourceManager resourceMan; + + private static CultureInfo resourceCulture; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (resourceMan == null) + { + resourceMan = new ResourceManager("DecalUtil.Properties.Resources", typeof(Resources).Assembly); + } + return resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + + internal Resources() + { + } +} diff --git a/Managed/DecalUtil/DecalUtil.Properties/Settings.cs b/Managed/DecalUtil/DecalUtil.Properties/Settings.cs new file mode 100644 index 0000000..23a99ff --- /dev/null +++ b/Managed/DecalUtil/DecalUtil.Properties/Settings.cs @@ -0,0 +1,14 @@ +using System.CodeDom.Compiler; +using System.Configuration; +using System.Runtime.CompilerServices; + +namespace DecalUtil.Properties; + +[CompilerGenerated] +[GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] +internal sealed class Settings : ApplicationSettingsBase +{ + private static Settings defaultInstance = (Settings)(object)SettingsBase.Synchronized((SettingsBase)(object)new Settings()); + + public static Settings Default => defaultInstance; +} diff --git a/Managed/DecalUtil/DecalUtil.csproj b/Managed/DecalUtil/DecalUtil.csproj new file mode 100644 index 0000000..fd1fef8 --- /dev/null +++ b/Managed/DecalUtil/DecalUtil.csproj @@ -0,0 +1,14 @@ + + + DecalUtil + WinExe + True + app.ico + app.manifest + + true + + + + + diff --git a/Managed/DecalUtil/DecalUtil/DecalUtilMain.cs b/Managed/DecalUtil/DecalUtil/DecalUtilMain.cs new file mode 100644 index 0000000..db78f34 --- /dev/null +++ b/Managed/DecalUtil/DecalUtil/DecalUtilMain.cs @@ -0,0 +1,441 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.IO; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace DecalUtil; + +public class DecalUtilMain : Form, IFormStatus +{ + private enum KEY_INFORMATION_CLASS + { + KeyBasicInformation, + KeyNodeInformation, + KeyFullInformation, + KeyNameInformation, + KeyCachedInformation, + KeyFlagsInformation, + KeyVirtualizationInformation, + MaxKeyInfoClass + } + + private enum CONTROL_FLAGS + { + RegKeyClearFlags = 0, + RegKeyDontVirtualize = 2, + RegKeyDontSilentFail = 4, + RegKeyRecurseFlag = 8 + } + + private enum KEY_SET_INFORMATION_CLASS + { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + MaxKeySetInfoClass + } + + private struct KEY_CONTROL_FLAGS_INFORMATION + { + public uint ControlFlags; + } + + private struct KEY_FLAGS_INFO + { + public uint _unk1; + + public uint _unk2; + + public uint _ControlFlags; + } + + private const int KEY_ALL_ACCESS = 983103; + + private const int KEY_CREATE_LINK = 32; + + private const int KEY_CREATE_SUB_KEY = 4; + + private const int KEY_ENUMERATE_SUB_KEYS = 8; + + private const int KEY_EXECUTE = 131097; + + private const int KEY_NOTIFY = 16; + + private const int KEY_QUERY_VALUE = 1; + + private const int KEY_READ = 131097; + + private const int KEY_SET_VALUE = 2; + + private const int KEY_WRITE = 131078; + + private UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)2147483650u; + + private IContainer components; + + private Button doUpdate; + + private StatusStrip statusStrip1; + + private ToolStripStatusLabel status; + + private TextBox history; + + private Button diagnostics; + + private CheckBox AdapterDebug; + + private ToolStripProgressBar downloadProgress; + + private Button RegVirt; + + private CheckBox crashDumpsEnable; + + public int Max + { + get + { + return downloadProgress.Maximum; + } + set + { + downloadProgress.Maximum = value; + } + } + + public int Current + { + get + { + return downloadProgress.Value; + } + set + { + downloadProgress.Value = value; + } + } + + public bool ProgressEnabled + { + get + { + return ((ToolStripItem)downloadProgress).Visible; + } + set + { + ((ToolStripItem)downloadProgress).Visible = value; + } + } + + [DllImport("advapi32.dll", CharSet = CharSet.Auto)] + private static extern int RegOpenKeyEx(UIntPtr hKey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult); + + [DllImport("advapi32.dll", SetLastError = true)] + public static extern int RegCloseKey(UIntPtr hKey); + + [DllImport("NTDLL.dll")] + private static extern uint NtQueryKey(UIntPtr KeyHandle, KEY_INFORMATION_CLASS KeyInformationClass, ref KEY_FLAGS_INFO KeyInformation, uint Length, out IntPtr ResultLength); + + [DllImport("NTDLL.dll")] + private static extern uint NtSetInformationKey(UIntPtr KeyHandle, KEY_SET_INFORMATION_CLASS InformationClass, ref KEY_CONTROL_FLAGS_INFORMATION KeyInformationData, uint DataLength); + + public DecalUtilMain() + { + InitializeComponent(); + ((ToolStripItem)status).Text = ""; + RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Decal\\Decal.Adapter"); + using (registryKey) + { + bool flag = false; + try + { + flag = (int)registryKey.GetValue("Tracing", 0) > 0; + } + catch + { + } + AdapterDebug.Checked = flag; + } + crashDumpsEnable.Checked = CrashDumpsEnabled(); + } + + private void doUpdate_Click(object sender, EventArgs e) + { + ((Control)doUpdate).Enabled = false; + UriBuilder uriBuilder = new UriBuilder((string)Registry.LocalMachine.OpenSubKey("SOFTWARE\\Decal\\Agent").GetValue("DecalDirectory", "http://update.decaldev.com")); + if (!uriBuilder.Path.EndsWith("/")) + { + uriBuilder.Path += "/"; + } + uriBuilder.Path += "updatelist.xml"; + ReportStatus($"Start Download at: {DateTime.Now:hh:mm:ss}"); + Update update = new Update(uriBuilder.ToString()); + if (!update.FetchUpdateList(this)) + { + ReportStatus($"Failed to download updatelist.xml"); + } + else + { + update.DownloadFiles(this); + } + ((Control)doUpdate).Enabled = true; + } + + private void status_Click(object sender, EventArgs e) + { + } + + public void ReportStatus(string statusData) + { + ((ToolStripItem)status).Text = statusData; + TextBox obj = history; + ((Control)obj).Text = ((Control)obj).Text + statusData + "\r\n"; + Application.DoEvents(); + } + + private void diagnostics_Click(object sender, EventArgs e) + { + } + + private void AdapterDebug_CheckedChanged(object sender, EventArgs e) + { + RegistryKey registryKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Decal\\Decal.Adapter"); + using (registryKey) + { + bool flag = false; + try + { + flag = (int)registryKey.GetValue("Tracing", 0) > 0; + } + catch + { + } + if (flag != AdapterDebug.Checked) + { + if (AdapterDebug.Checked) + { + registryKey.SetValue("Tracing", 1, RegistryValueKind.DWord); + } + else + { + registryKey.SetValue("Tracing", 0, RegistryValueKind.DWord); + } + } + } + } + + private void DecalUtilMain_Load(object sender, EventArgs e) + { + } + + private void RegVirt_Click(object sender, EventArgs e) + { + //IL_0017: Unknown result type (might be due to invalid IL or missing references) + if (Environment.OSVersion.Version.Major < 6) + { + MessageBox.Show("This only works on Vista and above."); + } + else if (Environment.OSVersion.Version.Major >= 6) + { + KEY_FLAGS_INFO KeyInformation = new KEY_FLAGS_INFO + { + _unk1 = 0u, + _unk2 = 0u, + _ControlFlags = 0u + }; + UIntPtr hkResult = UIntPtr.Zero; + int num = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Decal\\Plugins", 0, 983103, out hkResult); + IntPtr ResultLength = IntPtr.Zero; + uint num2 = NtQueryKey(hkResult, KEY_INFORMATION_CLASS.KeyFlagsInformation, ref KeyInformation, 12u, out ResultLength); + RegCloseKey(hkResult); + ReportStatus($"OpenKeyEx Return is {num}, NTQueryKey Return is {num2}, flags mask for HKLM\\Software\\Decal\\Plugins is {KeyInformation._ControlFlags}"); + } + } + + private bool CrashDumpsEnabled() + { + bool result = false; + try + { + RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting\\LocalDumps\\DenAgent.exe"); + if (registryKey != null) + { + registryKey.Close(); + result = true; + } + } + catch + { + } + return result; + } + + private void EnableCrashDumps(string appName) + { + string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); + folderPath = Path.Combine(folderPath, "Decal\\Dumps"); + Directory.CreateDirectory(folderPath); + using RegistryKey registryKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting\\LocalDumps\\" + appName); + registryKey.SetValue("DumpFolder", folderPath, RegistryValueKind.String); + registryKey.SetValue("DumpCount", 5, RegistryValueKind.DWord); + registryKey.SetValue("DumpType", 2, RegistryValueKind.DWord); + } + + private void DisableCrashDumps(string appName) + { + Registry.LocalMachine.DeleteSubKey("SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting\\LocalDumps\\" + appName); + } + + private void crashDumpsEnable_CheckedChanged(object sender, EventArgs e) + { + if (crashDumpsEnable.Checked) + { + EnableCrashDumps("DenAgent.exe"); + EnableCrashDumps("acclient.exe"); + EnableCrashDumps("aclauncher.exe"); + } + else + { + DisableCrashDumps("DenAgent.exe"); + DisableCrashDumps("acclient.exe"); + DisableCrashDumps("aclauncher.exe"); + } + } + + protected override void Dispose(bool disposing) + { + if (disposing && components != null) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + //IL_0011: Unknown result type (might be due to invalid IL or missing references) + //IL_001b: Expected O, but got Unknown + //IL_001c: Unknown result type (might be due to invalid IL or missing references) + //IL_0026: Expected O, but got Unknown + //IL_0027: Unknown result type (might be due to invalid IL or missing references) + //IL_0031: Expected O, but got Unknown + //IL_0032: Unknown result type (might be due to invalid IL or missing references) + //IL_003c: Expected O, but got Unknown + //IL_003d: Unknown result type (might be due to invalid IL or missing references) + //IL_0047: Expected O, but got Unknown + //IL_0048: Unknown result type (might be due to invalid IL or missing references) + //IL_0052: Expected O, but got Unknown + //IL_0053: Unknown result type (might be due to invalid IL or missing references) + //IL_005d: Expected O, but got Unknown + //IL_005e: Unknown result type (might be due to invalid IL or missing references) + //IL_0068: Expected O, but got Unknown + //IL_0069: Unknown result type (might be due to invalid IL or missing references) + //IL_0073: Expected O, but got Unknown + //IL_0545: Unknown result type (might be due to invalid IL or missing references) + //IL_054f: Expected O, but got Unknown + ComponentResourceManager componentResourceManager = new ComponentResourceManager(typeof(DecalUtilMain)); + doUpdate = new Button(); + statusStrip1 = new StatusStrip(); + status = new ToolStripStatusLabel(); + downloadProgress = new ToolStripProgressBar(); + history = new TextBox(); + diagnostics = new Button(); + AdapterDebug = new CheckBox(); + RegVirt = new Button(); + crashDumpsEnable = new CheckBox(); + ((Control)statusStrip1).SuspendLayout(); + ((Control)this).SuspendLayout(); + ((Control)doUpdate).Location = new Point(269, 12); + ((Control)doUpdate).Name = "doUpdate"; + ((Control)doUpdate).Size = new Size(92, 41); + ((Control)doUpdate).TabIndex = 0; + ((Control)doUpdate).Text = "Auto-Update (XML etc)"; + ((ButtonBase)doUpdate).UseVisualStyleBackColor = true; + ((Control)doUpdate).Click += doUpdate_Click; + ((ToolStrip)statusStrip1).Items.AddRange((ToolStripItem[])(object)new ToolStripItem[2] + { + (ToolStripItem)status, + (ToolStripItem)downloadProgress + }); + ((Control)statusStrip1).Location = new Point(0, 244); + ((Control)statusStrip1).Name = "statusStrip1"; + ((ToolStrip)statusStrip1).RenderMode = (ToolStripRenderMode)2; + ((Control)statusStrip1).Size = new Size(562, 22); + statusStrip1.SizingGrip = false; + ((Control)statusStrip1).TabIndex = 1; + ((ToolStripItem)status).Name = "status"; + ((ToolStripItem)status).Size = new Size(547, 17); + status.Spring = true; + ((ToolStripItem)status).Text = "status"; + ((ToolStripItem)status).Click += status_Click; + ((ToolStripItem)downloadProgress).Name = "downloadProgress"; + ((ToolStripItem)downloadProgress).Size = new Size(100, 16); + ((ToolStripItem)downloadProgress).Visible = false; + history.AcceptsReturn = true; + ((Control)history).Location = new Point(12, 110); + ((TextBoxBase)history).Multiline = true; + ((Control)history).Name = "history"; + ((TextBoxBase)history).ReadOnly = true; + history.ScrollBars = (ScrollBars)2; + ((Control)history).Size = new Size(446, 122); + ((Control)history).TabIndex = 2; + ((Control)diagnostics).Enabled = false; + ((Control)diagnostics).Location = new Point(367, 12); + ((Control)diagnostics).Name = "diagnostics"; + ((Control)diagnostics).Size = new Size(91, 41); + ((Control)diagnostics).TabIndex = 3; + ((Control)diagnostics).Text = "Decal.Adapter Diagnostics"; + ((ButtonBase)diagnostics).UseVisualStyleBackColor = true; + ((Control)diagnostics).Click += diagnostics_Click; + ((Control)AdapterDebug).AutoSize = true; + ((Control)AdapterDebug).Location = new Point(12, 24); + ((Control)AdapterDebug).Name = "AdapterDebug"; + ((Control)AdapterDebug).Size = new Size(198, 17); + ((Control)AdapterDebug).TabIndex = 4; + ((Control)AdapterDebug).Text = "Enable Decal.Adapter Debug output"; + ((ButtonBase)AdapterDebug).UseVisualStyleBackColor = true; + AdapterDebug.CheckedChanged += AdapterDebug_CheckedChanged; + ((Control)RegVirt).Location = new Point(464, 12); + ((Control)RegVirt).Name = "RegVirt"; + ((Control)RegVirt).Size = new Size(102, 41); + ((Control)RegVirt).TabIndex = 5; + ((Control)RegVirt).Text = "Registry Virt. Settings"; + ((ButtonBase)RegVirt).UseVisualStyleBackColor = true; + ((Control)RegVirt).Click += RegVirt_Click; + ((Control)crashDumpsEnable).AutoSize = true; + ((Control)crashDumpsEnable).Location = new Point(12, 47); + ((Control)crashDumpsEnable).Name = "crashDumpsEnable"; + ((Control)crashDumpsEnable).Size = new Size(125, 17); + ((Control)crashDumpsEnable).TabIndex = 6; + ((Control)crashDumpsEnable).Text = "Enable Crash Dumps"; + ((ButtonBase)crashDumpsEnable).UseVisualStyleBackColor = true; + crashDumpsEnable.CheckedChanged += crashDumpsEnable_CheckedChanged; + ((ContainerControl)this).AutoScaleDimensions = new SizeF(6f, 13f); + ((ContainerControl)this).AutoScaleMode = (AutoScaleMode)1; + ((Form)this).ClientSize = new Size(562, 266); + ((Control)this).Controls.Add((Control)(object)crashDumpsEnable); + ((Control)this).Controls.Add((Control)(object)RegVirt); + ((Control)this).Controls.Add((Control)(object)AdapterDebug); + ((Control)this).Controls.Add((Control)(object)diagnostics); + ((Control)this).Controls.Add((Control)(object)history); + ((Control)this).Controls.Add((Control)(object)statusStrip1); + ((Control)this).Controls.Add((Control)(object)doUpdate); + ((Form)this).Icon = (Icon)componentResourceManager.GetObject("$this.Icon"); + ((Form)this).MaximizeBox = false; + ((Control)this).MaximumSize = new Size(578, 304); + ((Control)this).MinimumSize = new Size(478, 304); + ((Control)this).Name = "DecalUtilMain"; + ((Form)this).SizeGripStyle = (SizeGripStyle)2; + ((Control)this).Text = "Decal 3.0 Utilities"; + ((Form)this).Load += DecalUtilMain_Load; + ((Control)statusStrip1).ResumeLayout(false); + ((Control)statusStrip1).PerformLayout(); + ((Control)this).ResumeLayout(false); + ((Control)this).PerformLayout(); + } +} diff --git a/Managed/DecalUtil/DecalUtil/IFormStatus.cs b/Managed/DecalUtil/DecalUtil/IFormStatus.cs new file mode 100644 index 0000000..734bb73 --- /dev/null +++ b/Managed/DecalUtil/DecalUtil/IFormStatus.cs @@ -0,0 +1,12 @@ +namespace DecalUtil; + +internal interface IFormStatus +{ + int Max { get; set; } + + int Current { get; set; } + + bool ProgressEnabled { get; set; } + + void ReportStatus(string statusData); +} diff --git a/Managed/DecalUtil/DecalUtil/Program.cs b/Managed/DecalUtil/DecalUtil/Program.cs new file mode 100644 index 0000000..b4e0b72 --- /dev/null +++ b/Managed/DecalUtil/DecalUtil/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Windows.Forms; + +namespace DecalUtil; + +internal static class Program +{ + [STAThread] + private static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run((Form)(object)new DecalUtilMain()); + } +} diff --git a/Managed/DecalUtil/DecalUtil/Update.cs b/Managed/DecalUtil/DecalUtil/Update.cs new file mode 100644 index 0000000..e4664d3 --- /dev/null +++ b/Managed/DecalUtil/DecalUtil/Update.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; +using System.Runtime.InteropServices; +using System.Xml; +using Microsoft.Win32; + +namespace DecalUtil; + +internal class Update +{ + private delegate int DllRegisterServerInvoker(); + + private string updateUrl; + + private Queue files; + + public Update(string UpdateUrl) + { + updateUrl = UpdateUrl; + files = new Queue(); + } + + public bool FetchUpdateList(IFormStatus status) + { + //IL_0000: Unknown result type (might be due to invalid IL or missing references) + //IL_0006: Expected O, but got Unknown + //IL_00ab: Unknown result type (might be due to invalid IL or missing references) + //IL_00b2: Expected O, but got Unknown + XmlDocument val = new XmlDocument(); + WebClient webClient = new WebClient(); + try + { + val.Load(webClient.OpenRead(updateUrl)); + status.ReportStatus($"Parsing update list"); + } + catch (WebException ex) + { + status.ReportStatus($"Error Occured: {ex.ToString()}"); + if (ex.Status == WebExceptionStatus.ProtocolError) + { + ex.Response.Close(); + } + return false; + } + catch (Exception ex2) + { + status.ReportStatus($"Unknown Error Occured {ex2.ToString()}"); + return false; + } + webClient.Dispose(); + foreach (XmlNode item2 in ((XmlNode)val).SelectNodes("updatelist/file")) + { + XmlNode val2 = item2; + string value = ((XmlNode)val2.Attributes["type"]).Value; + string value2 = ((XmlNode)val2.Attributes["localname"]).Value; + string value3 = ((XmlNode)val2.Attributes["remotename"]).Value; + UpdateFile item = new UpdateFile(value, value2, value3); + if (val2.Attributes["version"].Specified) + { + item.Version = ((XmlNode)val2.Attributes["version"]).Value; + } + files.Enqueue(item); + } + return true; + } + + public void DownloadFiles(IFormStatus status) + { + string text = (string)Registry.LocalMachine.OpenSubKey("SOFTWARE\\Decal\\Agent").GetValue("AgentPath"); + status.Max = files.Count; + status.Current = 0; + status.ProgressEnabled = true; + while (files.Count > 0) + { + UpdateFile updateFile = files.Dequeue(); + WebClient webClient = new WebClient(); + try + { + status.ReportStatus($"Fetching {updateFile.LocalName}"); + if (updateFile.Version == string.Empty || NewerVersion(updateFile.Version, updateFile.LocalName)) + { + webClient.DownloadFile(updateFile.RemoteName, text + updateFile.LocalName); + } + } + catch (WebException ex) + { + status.ReportStatus($"Failed to get file: {updateFile.LocalName}, {ex.ToString()}"); + if (ex.Status == WebExceptionStatus.ProtocolError) + { + ex.Response.Close(); + } + } + webClient.Dispose(); + status.Current++; + } + status.ReportStatus("Download Complete"); + status.ProgressEnabled = false; + } + + private bool NewerVersion(string newVersion, string localFile) + { + FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(localFile); + return string.Compare(newVersion, versionInfo.FileVersion, ignoreCase: true) > 0; + } + + [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)] + private static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + + [DllImport("kernel32.dll")] + private static extern IntPtr LoadLibrary(string lpFileName); + + private void RegisterDll(string fileName) + { + try + { + ((DllRegisterServerInvoker)Marshal.GetDelegateForFunctionPointer(GetProcAddress(LoadLibrary(fileName), "DllRegisterServer"), typeof(DllRegisterServerInvoker)))(); + } + catch (Exception ex) + { + Console.WriteLine("Error Registering {0} -- {1}", fileName, ex.Message); + } + } +} diff --git a/Managed/DecalUtil/DecalUtil/UpdateFile.cs b/Managed/DecalUtil/DecalUtil/UpdateFile.cs new file mode 100644 index 0000000..e93b9e7 --- /dev/null +++ b/Managed/DecalUtil/DecalUtil/UpdateFile.cs @@ -0,0 +1,20 @@ +namespace DecalUtil; + +internal struct UpdateFile +{ + public string Type; + + public string LocalName; + + public string RemoteName; + + public string Version; + + public UpdateFile(string Type, string Local, string Remote) + { + this.Type = Type; + LocalName = Local; + RemoteName = Remote; + Version = string.Empty; + } +} diff --git a/Managed/DecalUtil/Properties/AssemblyInfo.cs b/Managed/DecalUtil/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2291006 --- /dev/null +++ b/Managed/DecalUtil/Properties/AssemblyInfo.cs @@ -0,0 +1,17 @@ +using System.Diagnostics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +[assembly: AssemblyTitle("DecalUtil")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Insanity-Inc")] +[assembly: AssemblyProduct("DecalUtil")] +[assembly: AssemblyCopyright("Copyright © Insanity-Inc 2006")] +[assembly: AssemblyTrademark("")] +[assembly: ComVisible(false)] +[assembly: Guid("25dc2d7b-8af4-4cd2-9b6d-680cbb8fdf28")] +[assembly: AssemblyFileVersion("2.9.8.3")] +[assembly: AssemblyVersion("2.9.8.3")] diff --git a/Managed/DecalUtil/app.ico b/Managed/DecalUtil/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..84fa28b2db387c27d7ca6a138f6650aa04ecfb79 GIT binary patch literal 99934 zcmeEv2S8QFw)UplK#<;h?+7Yb04V}e1OWvrqGHFcSg|Yi-h1!H-eQR+w%8JrSfXM} zOpHnFQqTO~x8Zn?M2)$*|GV$L_ehp|pL6z}nLXcXvu4d~Nm7%vBz=7e$Es3SElFx2 zNs^r%Kif$g@%>SJH)>S*XSb?qQnraCg@sjo4wt0qHfoZeU&Zy#lC&>VO>#pSxD_Sv z`>OaC_o&H-@_&@)*^4A;(RoQaFC<9_X%T4I_d?3X=YT~*iW`FO13=OuDLWuQS`>gw zvnA>3SX_=+yEO86f|NCCJx8#kU8s1tvq z@Lz=!on^Bx zSoZHYvTPd=%kB&Y3h-DLEmOTi>vI9UYo6o~CStqY$9TuPgMyb-w9luL6?aH5vWwS1p&AM22G45g6 zzv0NTdCsysfLL}eh-C+XST_5CWk1Ey5=WM21>*BrgVv&8_94sWZ!C{>v20~~B)jsm z`RpvaEr?|g1+nZ95X)xUST^xx*({I!&bn+t`jA`J#rCoewzm}5vP?b?%Ou~h%ybaT z90p>U5g?XXhU-`+>tLD6vfXjc&xs)ZKD?qXmd(0YHt%KGtczt=0kP~95X&A8vX%d8 z)F?kH|EUw+M1f$+HVTg zl0R$OmH*0eYG|wT--_#Ts;$P)@>k|8QvS?u&@?-_edX8Iur)U?Z*4{C@;&lpxQl;g z{Js2=@-J-d&1+ONzBCkl3!v|#b1tIO=YA$h`DZ0rV^V8Yn+k%e8inshfkBV=m!vz< z<@fMj%B~$K3`Bj+zflyHkN9ify}RTW7$}*Wn~-(1hE19%b;@ib-&sE_)M?<*-1Zq6 zslD5@X_1rBDz#U;_N{v7jv1A5^!@|F`{qyA(i-SXQlC+yq!BY`zWM$`Cw7K4q>jRLtHJH{$0HF;QIfZqjsJDZozc9z1+$ws)@TL?#MQ(%nW@rnl5Y`S3 z4}v2idPXHDYxEvDQrddzlzMbZirlXsYC?KOa}8TZN2%Y?+`4sx>s`{WQblN~t0~M3 zYKo|O-Xf=6v-_jEXB_L=G-Sc30oi-&*Y;HO>Xd%!;QBeo4sTlc^QvhhMYlFdqPn)G zkkmCrgNX2beMXP63XhMMqLPx-Ev>Aix(({T)dT~5Y7|KdZ4#yK=jSCw#W#(vSJ&@p zH7#{vWumWeLtjTlN1pMIh-l;G<6{~WR98LF!(D0=6`oO3Pggkm280L4B#gX02LjjDEkQ16edMGJ2Lha8TXIrg2hSi*#)-Z*O%21B3b-Q2#k0 zO3x`2#ku?TD{2@TW<>_NN&C02+_p4-sL)VX7j+smn5(I!DH#|UY9?p2l==@J7VPKg zTv$y@Q{m$2dB6bt**3dVn2*0-VRT|*VC&AEq=0($w1dM!KS5iCrlzK%Xu8*&_}q6lI{2>}}hHW|b<5jpJgZDYK_KZJIm!*V=BjiW++Q zKZZs`n1tb(Je+MM$ksSJ3lpKQr>kg_ot>zuuCD3f?RCRHFklV(LuwQeE@fn8=2Wd# zRcLFdms#6dUr%q*qJfXQTO-&4FBc~#5BQRfkdC&)_U;uM@cf&FC~3264|P!wkOL?% zDXQTa7gIfjb`@)HWSZ3A2jOui?WEN%S$2_EP9%>dQEZ5OcQa2Q>(ex50+9gT6Wfl?yaR;z0}IW^hIn$c-K*9&OGTW zgrX}7$N}{M4FwIycO%Qn6k|b?aXuY11K%&eaSdoL`o$}=HATcJ?&Qz*n>oR0(+WANK}{5DA;O6K8Mf6)?AMP2<8>#AG7UKa~9 zqX$)?ug$D1JNnhFt7BqpPzoMg$=@GqscCw9xSV&iHd9p9(h%0RHfQ*K`;7GV!%m(Q zsdw&(luMUHi?6;Cxep(T?n0EcM!g+DXj57C?E*3M+BGra>Qyo3yYIxDJ9o-rSFaTs zT3Q!aPDprYS4SI*AF60;2@4zBPPn0{nY8V~eJ1i)uRky6HX+v+{R>Ub3r7b{p&wZ&dcXeA1xooAQr`NWY zv2klJFOO@6we&>|T^+gp-otV`2Ku<(uU17%*f=_}|EoLMS-mzhH~(5qU0toYo`$Bc zm)liK)Q{hUp^5S5Y8o19t-5uUGJEupLWT~LYPW4G`M_qnYHE5$@7g88(dUuqXUmP7 z1QbjV+gkp0l9!v)H-@^^gr$|mMSd?CSh$4-`+r*t-`UvNZo@Zf^=f-wGc?eD zoi}xwi?fBHT1arF4Myt+Q8VN01czU=vJTug*p>X$bJ))~qO>#7=CB;NE z-0xsvq;PPsz1KKAqDp#7+9BQDM6kaEUoOwv*+v-F(i0h39pYE6T~@!IkBb1-4`8zlI-NjYX z)6-LP^Y+@UuBN6i(63q6G^Ke$lf(q6b*B!}h)ELy8r1Q5RZFL;!pYU;xK`Dw((r!S zpSszYh@i+O8=VcSOXKqftQ^-ZMKtnteu+9oK>hkh!sD7cgf(p{Eje^hYV6}9wQkuW zy5EEeM{*7yew}{zp0HlNQb0duIygE>6BjOQpl4vf_AAUS%}28Ub!L zYH_gL zva!0?G%;aFqxfWpG4tltwRdv($*)eGQ8oq!o++(bkM@s>THxX5XKU;1tR4_t?}#?! zS4~Y4!HpxPRjFD{g00bviHXpTjg6Grck3D&TGzKsx2jgDnU(cpzxws9J7sr>%W0b+ zY|IRWTkXIlOHW-g?UmD|=O-&?eY0xj7}33TGf}^`hwyQ=FNuC0~1Fwm`5>fz?}Tf2-T`?gu_q)vVNsF`AX5f>e%7Fy3w zYSS)#b$xFqSxtzFx8dE=ZrcgP5sK4r|j z+MdoONim_DyR}UkHX=8t{ph}#%~M)s_(nuE)`*U6B4u{YYVGCjRP177T9^@2Ukn;H zFt=rsdQzLTIJI(b4rAty?W7iI&7`#SRI_#&$=}!ac2E#w7cZ~tgGP<;@bvby*t%lY zmZ3c}MNDXraB;Nz9Wu4j$=z*(hNf1DtFLc@EqKhq&0We{yh`fcH%H1D)K^Mx-Lg-B zpGS$Eg;7zHATKc>r_+JJ1`V`YHgBpnZ_5^`mR`Bv%li8b?5&p8JWlG;Gdr+zo8%`^ zb=(B~Mtx(GXF*|MJq=9Ft9S32UFYDIrSqnb8t|ZNn`F_dX(LhB+gUhycy_dNa)uAv zP&#z+qBMNc1iysjgdN^)j>6l~vM4s#OSDQ$_@;kuf6M*@dP@EKbyZvascc^Gn3B{j zr<>%6L3z7&E!D$<{iIGkyM<+CB;0S?G*~!U8q2<;t-akfI~V61kBFvDFlW{=O&a^1 zJ+?V+d~Wx)@#(GYqm$x{x)10R=j-pi0`?4iTT}SE+7xz6jSxfoWq&zl;%NKa!8y{v z{@vC3_U$U=FPtyet^6k;I#jZRvTRt}UA=kpc&U5dD3_j{TOS?Wt%c~{Ayv4*&(+hZ zE({Fx3(d_?wFYx3j=*!;pbvg8dc9rw2luEd4syG zhTQA>)%KNUEtsj+yH{sv)cBFgYTr86b+eZ0`#MVpFI`q2K5mrMXK-KbyrF$_cC46r zYwzk=V(PFQ(JC=Y)b?;hd(4EpgOzZ%w-g>22iA7A6|um$Q?pRfIWf8HFa=Xlh;XolLPk$tMn+PO#iY~upy((aYg zsCjdvRxX)3e^Gw!nHfVne>t>!#`&CXZ9mIs*J@n5zY1 zQp+DDsZ|?SK@)JC_~dCmXwuj_cX3U}&l^AKc*3sJ$@}_MCf=P;rOK1zBlQaX8rqiX z^$BGitV^yFb-ST$qu4(5k}^&qA(s3<@lPNQQ9)V{gfP4%gz3MUST5?&Qr7i9u^<1F zo{2b|2Oc+tFab6$cZBe`^84>$d(NJnFn|5JrM-vdu1jr|zBMK;=94Bd5j*4Ko9s+# z7Q3@Kh({$g!?{ceF*}#g7ib++X{sqg+1+sZyJ5TYvNT92~*c|k$&rq7PHU$JY~oY6C;pU%i^bG<>s;Gf)F zonAXT+Lm~^I+O-_IhWP*c2U&va#r}eJ1G3z?B9?t&b?i16`oEu3U^0qg$Kyp0pw_d za~t`47kjHRTPw3NGgG4yV`HO22WQ7eh%MagF=WWODa)77U$JLT#}nUwpLDaR$O~=L zXZzUB|HS_N@7m@(#0Al(+V_O8yj4Z=XGDhITrE4A5py z-TdF*KiLDvgwVVzM6D}Np42&T`EttC<;xeRwQqMlux`LJUr*O!Zx?&WtCes8PQYK- z0)G-Q^>?=y9A^iC>H_~j75shODzJB~z#jLr3|CSGAFx~}TMJ=sY#@x_?;9KF2@^y8 za>6-3n<0+C`oM1r2RrLhS9jOv;Z0+2kDWJf-@dQD8g}}J9~zPm3ZN76z{CG!H~g== z4RWLT9ek}zzx>j8`JO#vdJGwSu6{_P->u9|%bbA;Wf!_y#@x!xSXh}E2@4ZL87q4$ zQ(3M9JRD@)$pgfn@{f3gd@u3$cD5DJ`*JzNoFtEVDtN*T_}f{UF`gsiZ;tXA-yvCn zsAtG?GT-oiJ6>-p^G8kH8VU~|?^i9evc8(OYSr{FfBLD*4fqV8n*YZK?`LQB4g2V3 zadF_b&p#iU)GGbFtEb0POWrC2)Q$kb&kN=;KP{9h6cly$2 z?%xlev3m9R__WlUhDL@Z)e#3I4odw?`^y-Jfu4?RhxK)92t5!#^EX~+0=-NeD2uf3 z)caw9o+34}o=5?;PYe~kTQ?QC9g{>}*Hp1&bWbsVM0YW)OS%Z8egI#D)OHi0xF@Wx zm#E|EAnYuR<@%~t(Z*c3wqU)q3wD+!GB1!HY!TNdFY4B)Dym?uUEVJZ|2ux6eFp{XIDL9lT4v^16%F-=?V;*0Grw*DY1d8qh|} z8rW9M9^6hW8ksGYjOr$qjp-qFFPkb3tzRGxteqzYwT~0+5*mq7os-1moOH2ZL?=)e zF=bGe7~Z3`=+!1cG;QDudAC4&s>v90Zij6n4{{!j?a~JJd_^Ix zmWGDV20u_2b1sp6P5GnEw}oudmPa6eBMb4#yw1sDLXR{trb}}%I=i_T59}xPY$0a! zYb|CDAhi*52e%jVax;N#w%ECJve>_74rsO*0Dfs6QCIY99V+EU&#abU4c3F z*KN9WySVPtPsiRDB8YZR`d?rZX!pJmLg(6x7cuju;;$E_k6Ohul*>QyR}ysr z_+5b~kKm+n9P;6Xa{pvC`Wn*iLkZx$9he|qg&n=S(foVImzc&VwOpwnz*M5G|VoiLRK78P*{|}v~IrGwQRarIDVjL z79J$)Ci($Nyx(;s52zvk4D;?qiLF}QIDGYL{&z24)Mh{ZPqY4frYkRB)>*ZG|MJ-8 z$q$)RNZtOHorK)*yXyE&>Gu(H-Rjk3`_9-+1AjLW30)sk-%pl(8Gqyq%J@UxM|5f? z>+$ZXk)mT#xFS0(x}(v~27Av0^tcr>>yA*ayBTw;Qw_|Dc2L zBR<`*K&(JMR0qsuJ0XXXej~9~>V(R?AoBr!_pev)*_gR=H=g<7helt+FMzK6kB=Ep z-^=qc#l;Pw=hg%@40`5hYoVa;M)}~py=>!wdsU2?=;JZQMqi3P7O%5_zUTOj<9Eh$ z!r_-w{^KG4)YnOk0~JxhK8i*Go{Eql|Du*Hn?LT+r{}$4`7 z{_w#$uC9)S${2zYe`8aV!od?KPT9O~pYg0UYieHp{dfE8MMb^^MMeH6Z-3uz^{$=E z^7BWZo;7~J;}tW<6m3~Bk^CTN2M$!?heP;o->R8nK>KDGSGo&R*fQ8W;4i(?HjqD% zE2>Cp-TH?upMO4q{l~Wdr||&!_Iu<~eEH*#{krw-eK$D3yR0to^Kr40$LBiLtIEDS z{dtb_b@7?;7v$o}V|T`KIG$&GkK=3JN8%XI#?nmDBq9D`R`1@sCM;Pr0FrwG_j1KN8^&n< z(BF*7)x!8qi92mTt(rQ*1%4go;^f#IV{BH4uQHB9ycyHAFf~#*xj4N}Y1`)JyiJ=n ze17|Ov+GZuIQ$?)b<`*4>ircNp-ocaPaVS;0&P(_{-%Yw6DQ`Mxp9Nbt!RU(gGoGB z-@JLV#`zz9sDA7DbJO!b|J-E#kt4nKo;x>d;i{#_h79a+Z_eo6MVsc2S5W^e{e{hQ z$B5ZOI>~-Yo4AIe1$avG`L&IhFPNoeZqaKXNz4+ zr^-AqsBIi#Q?VjDC0sPF>nX>N$OEc+fP5$ud}8EIzrsAoVc4@4ocmU7(|@P)JoL@? zko)zA4&`Az#eKtCH5HU$#>t7TyQ7tC*BRGgEQc{W=9?*rb2OZ{p|59dVxVwvb|~!F zt7ie`0#;sl^eFwir%zoDUcOuddiZbK!*cu&&vA8gEc}Q3m+Sw^_!D!+XRa3(y01HY zI5;h{Z7bi}zI&~0tS|cp1Pq$Fe!b7NXU~jy9sLdR=c!w_TCLx;V?*AszCTXrpH;ej z$rRZpY=It_JEWr=Ul@-u=7^4oqIq~-;Rqc^|4_*T#GYd#`XnR|AD_ZS+qRtqkEP17 zqW@07qb+=P+9~wUsIbWJNBT8&;N#a2wur-XzJ+5qj^h~{!Q8n(&bMd;e~1+1<0|KR z)`5TEYHz8qx3?`$Zk2I&>&ed+gXhxmwx`a!_v*` zkLUL8^kVw3?h3{mcP*VFHq01?_;XJ&XK<#NHMoNqikL+p<{Ib^SBwSZaS?SS@u$2v zxw(`q*t+#3{G535*?$)n;PYR{Smnsos{>*ae|HPjD zCi_{5|By+OCSwd%`|N`UUGt_--41#GzGh9`=ZHuA*0g!j_6c+6)}!yicpciOehfZH z-sa8Pq($e?YwF;s9oMeI!s^eN96`_`17f%7Jeu`*tp5E>wwz!we${*1kNV;tVKU!Si}-@7*f zxO-B5{%TwP%JoY8-CUgumE(Ws%lXnlFJo%)5VBmA=GU%)_Z*R|EmTcL$ zs6dFM$BftG?-<6DQ&+F9AD5as$;QFqpoO*dQJ=uTbxCd7jOmb*6Q4JCuG1F}ADVD% z0&1|~!0z?K2X+5_?&v@Hj-l?O8c+M2OKN8dwc&jXTyek_WQqk zTmU^}dA+zer&CVPJ9gFCqy#p`YM9oj1mG zSOfNI#;TQ{!p65`dEo26?9cxd?0GHm-+1`&93}o1@Ke}M`e8L{R4=Prug)uLEAvw7 zW90cLnl*3s)3Q%?%t4=f`~th6l)V9yC!5s|58s5fOE0meN`d0|FN zm;Zxv+~EIF{)s>R5)H^d?EvFZ)LZrZJ<9qG8Sul|`}ap*Ei80JU%!dTQuY&Cw#>xZ zr|0@+W{ReL`ic0#Lxp!tQ(Dm1X36&oLvm|9x?8WA7=RqL)@N8~SG-t=@q zLANDqmVGgGc+bK;%Me#q;Q{Id`iUKzNB%<(RM-RA7NC8)HL5F;GScrJyK!R#>=3uK z_%HoKKWJSoD)JsTZ|+WCAI~D@)i5uIc^9;$%$MRgpK-cD?c!wYCu0t#cSf{`hTaeK z^C;`mC+FT5cW?Lpcjz(LPooWo56vb17;DHe2F4v3Z{~VPtd$X|F%3(m&Ygbq;!i*2 z!zMW%tE88XUAtz~I5u{JPR*K%^Z^6Ki5D-$uGfWPZoxe<@Zb^Aa>@)*FQc`v@bto3 z<*Hm4s?gKde{N%Me?Fl_i`82``z(LQu}_c8pE$U9$D&DM|Jr}dBgk`-_^x$a2=qXW z^08pWm_W$`MurAu-3Jf8di~X_5YDgsS1|yv*MLvsz30M(xjz2BFPVEw+&Ld_44Y3M zkHlP>F3rQmz_v~0dD$tzKL_~NMjUwTtQl9&KYW;5AcPspdm~eS_6)RlxL)&EB`p5z zKIQMYSB-k>T2YbDs(pJm+1OeaGX}viYFs0Kk&5{Q_$P|aEn|zO&YgJ}*k=HH2i*6E zG3SvRHyrCXZhRK9EfyX+EM8z;GR7<7G>-dA%fzPFMPk9vkHx4jFN>6klZAg$b75d@ ztI*W0qNrBAdWoy2=lxFo`mNh~_`s*L#^?UBd)ah_svaN@Y@I(|WWXPwPgvO>;Ji5V zq$V$0w(qD?c_Gbg^QNjMBtTTp7`^3+FuC}tS?}8Wy^C>tN zpOqLQ8U_UvO_)FDn*t%aam;`=|6%N;#H#X<*n{tEI7fQ^mtWj4uke?~K&*>-X17a9 znoV1^axKOxk82_?i@Kh->Hy7m-iZtmQ_Kp^+wb$CL; z+Le2DPg^{5%!5ysOvaq_KlA|S6t*uIFPb*0E%&X=1B?y9AD~}IUEuBS_jJpN6HDL= zIHS6c?$65o`!SzUewDAEJc-H~KKzt{L9J5yqa2rToXYla-qzX1Otg=0Bzm-nl;fS8 zqf5YCov(*;;fTo-cYgKDFRcpxg4}bQ^)+IxyDwd`>^gWrO3U_bM;`g^yCzo=i~pE5 z^BT%L_}1}6K|%N23FFTO1o*zjUN;I$=q&mxP2rCYZWpI$85deQd*zC~7a#u=g|QvC z5qs|+{4bY~=;-svSrcnN`%GYK0#S$#`Wf^i2>!l6y#jN&;tPe~-W6g~ajBU5=vUEu z?_m*;mM*H+)Kg&Jj%V0EX8GPzCnheRJ?`P&6*J%F0qB91`9nkltY=WpQ7Gd>%#EsE zt*QdKbN5db6trSry|=-C^9MYJI`o_C@?E>Om|0qu%K19VI3nAc5%9vsl2S48);$q7a*WWbhB)#h_+0x?JweR|_oHya_p5@cu<^kw|g<}WEIm}wv$3`jptVbC>Wy(qLcogbl ztn6R@$5;$Ic{RjT#W8%k#a6wYD7KS`?B2e_R18Fesw`kq!6klJDt#)=cSDLlX7`15EE*q4gL)pYNAM_ho2KdDE;;+9p9W`^t z{*bUn*x$-R&e^uaIE8wjdEf)uCy0cIppyJW3-(-k{J2TMNA@3L{Wi&M+I&j1OTeg3>RZSSA83-xG!FN!>meRDY`H8pXH zgT3`_?5VWBRhKReF8uO~1%LmuGWa{&OCRsE@4wGSZoqY{+b`i7Kh7m{PJ-CeKkeTx zK@lGjTsU%a{(DUw^ax(>gjIpdNa(@!6J4drOVv13zRJUyPMVoyJWV|;7uqk%je zd0w+gu&=!Cj^hHv@gH1#^hh4#;gLTmuhb1UieC8dIB|4hN{i-aO-ziQIl8*8pS58_ z{l5|iMm=0l;0&K=PV-h7kKCQ?xRz617e<{=Uz&Rx&_@aO_bAO7n)~_Ld-tM0M(3;c z7w3T+MMR9Sb8sjdHFcUO1)kU+Q?~h-JCJ=q$fEqYGC$B3901LGStROp=p^GGpPqgK zzLf*oQ4{^0visz*qwD8QET!Bl@#mOe&GbBZZ5w?*`d-y5c!1}o=BCA%FJ1*cc0%!g z7_+Fh|6|YDFUYTmMC{_a7WVN{#h-o2HB!vQWezsiTXNqH#QhaPAq{`reB$^>@Vz<{XRTPa(8JyNCi3c^LbjIgyL71uWs=wYS$la+0d)7*zy0R3c*pix z*yHbaPiH%Yyv`GIinf@0=DdUzc=S_0)WI!C|I%L`o(W2-kAtIQ z>7bD#MR5iG^!=}Zz|XR-C)WIqM1CMI&?nprn)R|!_@uU!@o(Fs$5C8kkFV8$zuvW% zFPm-Jyz;^)OQw`6@#m4brjwDc${1_84$zWy0P)9XMZ@sMkFgGZ0LuE8#D(C$Sg$&8 zV6Ks=Ns$tJ9+}rjz0a{f`;)m{lr#F%_VD-CA3nSk&q_XgFLwA%9@Cxu;eO{nLkI7* zurT{gLqp@YsKmsrw@XVq)0TbcekEYMrT}9KtPf5dIc>@gUq7E`T+i)~c}L17 z&P{N>fxdrYiKJ8u3bWF-&yLuPXvot#Shj~F2efj?ryGUk_Xgw7IQfrvHv zfjXZ=e&FxBLDQbU63&s)GXB`h@?Zhx43*DBzxCv;8?BZunEc)Twe#Nc2lua@BU;2X zl4I7)pQ8;>j>8zg9y53LvD?MPA*kZLa;L24Lr2`N0lS;nymjj<*w^ok?9=CDyv$I) zraZsLybZ3oW9(0_rfyl^QF#|3_i-Qc(NVVA?N_gCzj^w!f4>n!zcVp5DuORj7@d@~ z71jZT@iD|lxw_gFeahgQ&-XcGtbQ1-}mYIPY=(> z9G~a0e=?SoSAoBat83}tygX3^{5kd`)?b2PgT=)PQso8m!&%S{(Bx+?g>_J{z@AHr zA(JPsr><1RgMD!9%B87m=8h}mdIO~%pdDB?DOa9HXWmMM?8{>TV54Xl+4%8+D_;#m zd)~@nQ7!vp&T03juU@^((#E<_8FOHLlyT}G>VC$4DOcn{ZEY&C3rc=qT<9cd3ux@)C&I|pO>mwdXT*r^w6&`3z$Kcn zOVEQGN+=f5QXt4F_bUA(sw&SK|3-3*_-2&XJ=~He|}=FPW2sGXAt5RqIrq z(;vg!UPyY!j<;ct7349-dl=uNKBW&`y@FUTV-n`pmai6V-#(R?D9fpQWP2$0S0VT9 zvOC_lFf%EuR;`L6GQR19!{2^83b@#OtUl(L0y5Jnf6>CrwstmUT#HLRL_g2mq!z~a zIv6XL=a{pN7`rHXKQT9jW zV;-Ib@%v0?H@BjWefx@M75bkte+)#7KLecrQQpZ9N;-)1WuSgHZi;G#Mxv&^e$j*_ zOPc1r1Ao?wXSLaT>hrNHXODh*5dNQ12YkA5kr>n=SssIF0e8j)h(G5s>8p>MKZiaT zH-r7CK2<&=nx;nG(J`mzQR;TuP3CftC|lI^Z~C<&23WUYgXf=qdu0r4{(Jq-vrnHI z!avXH(yz~bbI3hxc2OXqCd_zCpBC+htueN6ts^#RkCE&bfi-mX;keSkIf6UU?E zRp!=`FG*}G*WO|byAby|@cER_`p+JT6>`us5&tb}(XE?!1pMJE%NQTV@l()I&@qrI zFOVm8f#xWnxXyklv~+canYHz+1>3eo<-G@gTuyuGvvk?K&v!1JqM+s0rT>5 z&%t@t2zMvTYdefpLWIk-cMZH?gbrF8~f*Q-wn?B$aS!9 zEBFn2>XwY0KJ64_JB)38SD#XkA@4qP(3rf>jSOokXh(Em_q+7(|24+FE$HvQ>%Pk0 z(KbNty_Rm@I@iY5<|W%etjlFxP1gB3STm-IJ#~H}YR@1F(not7$7%%tyQ4 zYmY1UFF$|#^r`c}@nb)6w6`hY+MDwHY~*ia&jZRn@h6ersCR-w8r?a1?OMkI;%bd$%Qe)nA-3_|rdhn+Eim)5cE^Evj87@OQ}d zn=uJ>9&p!jJBQGFUO8lDv|2x1RZ4<dj`8<_ zRQZ8?u?aLDbHu606VR+)U3dou{=W6|&l~4`0Ds(~cKyW*zvZhJeY$@3m{R5pa82Uw z<}eac=~$3z#bk7@~V!GPTAsZ+qU7p z`nd0-a=tjugI($y-#qD8Ej*htZ=UO^7>|(KSK$LGWucZqtrEn>s(H*l=My)SqS3=V!m8$He4!G1@;dP^ z--AV0j)M??>L%(b6T~d1uUt75JjQs!AI4UH+8-adfX_z#kNK&h*iN0qW#G@TKk?lN zqK=2J@&{fZKP(3g1O82bzb4lDIk>tW@0XYNUcXtj8I;e17ryMGI=&wj>!drcZegxzF5AJ^hg{yAUH zu{8UcYj?>5$d^@k`uaRwd-(7~-1mq0c^>+w05RFwYgf;-cXW7-7@UH(xd!H`+IH`D z1$@yQ?fFx^k89MxC-#TGzPu!$ZeSsv>5a|j^HC3(V*MufW}h=0{|sMJ?$?6WfvD#T`Jh2#*3;ZJ}|G*#b zXE@$AH}_+GAa$%OX)t@{_<|V&+bM=(-wWn0aUD?v;_!@fQ9ml>pXYW?j=%3ZcW%I+ z=|IRyO|IW^adm!9-S6Q9{9*qYD~`KaeNpg9ZZs$Zfl1{Ow&_Zq41Y*n}}eYbkY=1qgM(~3FQ&YW8Ai_s+5 z2YVA5$vTm;K|R1D^3#hkK3jGdd(0@?|E}XTtYhmjc<^F7TdQJ@^{Dq{-H$ve?!&>c zpHlzp>eMKkvvK|EciELZ^fT7X`^{XrVi$7UO7(TIKNiO2i1jGqQc~`~?#C2-gg=6A zQfJ=v^yQ1!;9XXf{WtcF=Zqb3T^Zy1hNL1<{25zm|u&> zcs)y|K7HcqgogUzJq(Tk4I0?gPfWDHzFekCLSBan;)I4hCQNuIbr>?lc;L8kfsLZ0 z59#XbE21&~vkv$Z+ZCXtpk*NHd6FtWkSFGV24egd_xTy2rHA!0#>Rz%CQRs)H*=;< z4%jj~T0P_Fy6=~q6#`toHq z<-9U4aV&rM>#zHTM1=ngJFK9L@;>aLTry$d!WBQmEFSOn$?oaGroQL6pJP9+-=^K?oDcKm;fp z+2^>goIlY%$Uoje^Bil?hhlxkcHms74*u8B(-#_uwQ3p|3UwVFp@wmn8gla0F!zG@ z9{quUiQ;p<`out)Ux2_oRkdEs~QYvKFlCED2Qe(jcMcmJWt{^eJZ^ZbR#dHGs&di1-9-nCztH44T1Db?ki0@ZO+ zm8wTw&w=&)vY*91clGjozG&;# z{?Pq@81o|rhCKiduC1kCQ^6P?`Gz_JalfJoixw@p^O3Pglrl2_FY{r92Ut~o{WaQODUw_^79pz|p4gl{S`-*y)?^+{9zulO_qj7!ArWB@z&i@^AALOLy3w{Vek`xm;(pw~pKJJN17M#NwS$8Tu&-##79Bfw za&mF`z3IR~irJ7c;=z9I4C+)tREF(AZ9(lov(-Oh(?QecLVhR^#KhA zjRX;YVle?U5ky|d2dVM{%y95P`$xYC_g;O4I@X+_Z(#$<_nM*&2o4Rs{jQt<+^SZ9+~e59gqz%trCj#$ z9$<|7Y5U9VYdQXUHFe5T+qK(v>(wip%GeRx9jCt->>pVBclwH46GrUmk7FO~E2zVN z^Ly-%YFYFTr!QZ&0WVA}q0J%RQHLnU9^8YS_}gLM46Zq)j*|5Z)TmJigSL>sUYG?>Q_PiaU1{|1R~zKAXPcc!{X#oq^7r=f`jLJgV?LC9XXMflKjKduc#d^H#lxpfTkzl= zb2j+Sdc>6cHI5Fp#pP>(%kzSmKax9n(oyPkRh-{-&bDwpTSkZWcfmvQJRx-mv1fdT ze8u(R*oMMv)si)~sq6Yufd2HBu&5_eTu z?vBsIpS(b#jv)1|Ao2n6SMmV)K$QoE;q!11d5iL!2dc~uw&RChL9Jefoghi;I}cF&64y#Mlgs44%#3w5bR0Q7r>it8ou^yl?S_Tg4h1`s7@r zps%l2I&aISsn;rEF{<}fKK}*&;}^GYXX9PfMZ}oIa_B>HjXvYhSLzNqW{8*(?KR#x{c^?b-RZ=oGTxOx-$Tyt%$3X6Voa}Kt_k;N zp${UD@1cVz@AUs@^SREPHim1sxds*QE&cIUd0wB|jmM8`&fmB(uWnG#i}pi@igmyJ zCif9>%dDXH*?Og&Coho53)Btd1?mR!1NFoE_<{C;q~rzahxh3Q+W7bJ!&Ll6ULbwQ zJ}CKt$9x6air7-(?fXIp>r7SgXPz0>jITos`OXI!oEunAz{o^?gL`ZUR$dyJ|$(#yYTOY_vJa-S(P&0 z!~9Mj8CzAx`-weeIW8^ro7)&Gpo+Kf|4|6z$%_^(;65KJOU2f*GP(aK-x(Fu3dhzU@&c(n=tI2lF5f|ED?UayRQ4Un3nV2! zkU#1FlRl&y$O}sSK+Ki;fk*OMTj&7)6>Ei-k?|WHAm_q_g>Ap}4*74$SGpM`-u;)XPp>}Upjv4R-L!* zQG%p$EWn(=W|I=-5;cyYgD zD!wi1Qy(~CLesFw$cLD#Q>^^yXR#Rek-9q_lm==6YFY7F$qRo)H&o^arLCa7_;>LG zd5Jo%(di39FR-p02jrZ%7Gj#dbpm$23;(#3a8#j#Ky5}7qxTdm0&+b#~ zZLLbUHkV@&`l0kisE?FuIg~L8)E#gyCcSkg7QZ^ZJ z`gPC&>>py>yn<43tjr744Jus-w4eDp=e(akj*U7kJbhE_y+&lRlkiYfS`8#*a@s9KD zoPVPHljOCV75=0JY(4c6iS=+?V2HRB<32&5A&+*QKi>(D{g#d4J|W1h$PEb#d)jwW zzS!{eshABNKslw{Csh!6AqAw$3)B(hfwrJ_AXU52q2e>YBV~aob8LW;7pNOZAL0k4 zA4!`%7)0Hz^b^RZB;rn@P52P*#D8MNHPk(EPo4?;+~Gn^Tf5u_AYanc@7?$}Y#jQD zxpDdaeH?RfY(@EJ+?6(*_;YPp`yM_1AY-UXZN}s*kLCspE-J#8=+~Ym0G7m5w!FROLrf~0Q#*>tODdRx!2New>BEC9u?OHg? zQDv$;@Wb-``)fCA+45}5Hf_X`Q>Vpt=m6SJ$|!9=ai+ZUoH&z|SQ1a-M}ARaMET@7 z`#{Giki)D0xs3Gx8Tq})=D>DSE$%>~T^DgFC}I9~)>3|b0W z23ihURYClY*U|?d-=r6p2rtYl$n#y$(!fxGdE0l&e{e`c;BO%B;YYtuX=`c2mH1;` zwX{>8K2&pW$rwIsF50{~&eqoIksO1^7@fQ$<6pg6X+p~ubN>wgJd}yJZR3d8=wBJv z;X4(Xe?Vw7;di=nd*$S}J;jdVsov`hfC4lR$Iv`#jK0Tu=Q>9LY1} zpTFWeup`M^97p7$yfG+y3TQrP8E6G)C1@3BHE1np9cVph185Uy3uq7MAnxA>B5$w7 zT*53IIk)74c`7CTvi^S`{*4;!G)K-K=Tb<-AA1eTHvA3#HL90(>f4v>{1*PV5KmgN zbLUuldz)7rn=vNCxH0jsTCHj+V!wYX|9L2L@A>oLb?Vi9Mw}VvVSJZz&v*jYc5#fa zy^BIWcM(PIAr(PHaX(Q?%)k+^7)2%j}e1mXJNDN{t_nKMPof(4@g=FMXM z*|TB?_-HG5fbvGUR_YQ}eey1TpuSM@OFFPie)yA!+_YJQ&X^%WQBNf5ivh(}P*WV^ zDp5Q>Ct~h7747S|aG@BocCEgIN}nl(g^+ z;xVdtR6ZyE*k?JSUW0ni7|SEk4v`PJu8U&;^46R7;F-t+%>TpwH)TyzQZ`Wm6dfaDmuC}rCmGGqGwML)uDs%M|{8`Bvjbf3la`~e!{`iQ#iP|2wUv! zVPvFFYmu^FT6+>)lt;KoPNz(wG{dw)@5j9q`>^;2gw+}n_J-h!)TM2x3|LE*H^fC zcnC+d-QLAj7?_$N{}=BVUyKReDK2g*t5qBKfS3Z?<3AR-u>j}jtp5k`s`?vO(x{Ey_7j4-x!^hLDkhYrh z$4dK89%z!7@H2e7cs`pd=Bnp>R+JHoHD|@t`LsVuQoe7S?fD1(|Ih=~s#Yy)n)YG+ zuUePNIr&jZDqsKk=`r}c*?s%wgoTHfbel5=arbikIi8FKH3bo8KC~)7kS8bzUbx=m zz+s_Qy}H87-~ZmmW5Px7i!kG{Sz>KQkUm-_boKUhd&1Z+ zWwm_#U!HpyfW3G&e}0@I@j?7o?AaOP@9SBF`9pdBfjlV3Bk@es0dIIp=ErjU$(M*r zlwq#-gZ|&!z4rG%vERE47?6qaR8j1ZA@aN{4I{CR0yP0egJM9c{6L-v1-ZaS*Wb8} zd58)}H@6f0r%ZXT@A9G6{(yB+%XaR}wzaW(N_kb>5<#8-d{Ar7cCFj%e4vTk= z|2p^Swb9Gfp^W!ZemUkM|Io)$#XqBSr^~l1#sBd*>Qh!M33G9Fcu4$duQ`S!ztHcr zMeZTyhEhMo-+3rw--WXgA)yVQQQo;nALEeZX^uzele`=M^0n?*f4=k3)vF)OZ~ss~ z{?*^uUatSQcXBGK3qP_ep*);Niu^QKK+?d|4R zO6sPU1notULyAs{AKEHo-=mK+&QIRP)kp@4DX@eRvG`B$Oo9aZp~7E zPnQzf4X*X)`FI`LQf+B|o5bG>s3?=rw6yoEpZb8(Go5_ye!gZGmU>339&J4L_I zqYoFT>~B@M%k$8m$FE*(+$=fqH`*VP9Q!9P<9Rq2$h<%DVP*Wu3w0XQ|9RUNCpw^A z@3k?N>-;;P*vTOfOJfzXM)CJDj`b^t!-zdhlJHp2#6mjsb~JXjJ64d}jb2{hj#W zdo{%G8n(@9f1kKB?kC6oD&l|CON{?2ZHlV=^W4eR^*P?x+3Q0#=I`KL`QAJ{N4sv_ zI+$Bp6}e*k-U9fyz(WvU;;%~N1?qhA0*`(mQ{Z3aUx5FaAAbyJk`Q;&24i>j8}XOt z?kjRPIF`1C?Ibam8vgsL%J`!>8VA3+5K=F|_i;J?PNJ@tv+PSyh7mWA`9RL&Ha04p zy>a7|yYTr{`vg9L?bw;q4&Xh1ia<{%+5e>fL3t%UHg>j;w|((N2iU9k?y-9Q?p?>M zZrMj*Llo3QB!733gRE1y{{;E*UGi^WWLP{TKYz@J%2#dg-#yO*{&;V9SF9x}amD)2 zX274meJDs3`^x7*_}vR+1pKxBCjKZ!eb0q+ZL!wkN5o3ydQ_3VJO0T73V|Oyf;R3?B}0#di2Yg72xAq%6%GT zlJ!w}c^R@doEtg{jE~| zCz_*HfV`=W-Md`nxPjPnKTqla$~^Tr%cBp87?T3~-krYk>#tO6Z~7VM>Kl)JniLh) z_!+Se#(wqAw&t?DQvQ(#puqaYFOVZj5qNW-DmZ9E)%5{PA8UVo&_)gUWMntIPU?xp=TAd^a(CtuH#@QQz2doU84>bSW&oZTcFtn7d25bX_z4|I!e67~!5mfN9h3)@3tP9pu$ zcj0esYg2?c^PtMMNm>5C^2l73#!Z{fw6L~Ogio0&S^@w6$KH3qRdsCr?gRGTD~biA zg9Vh{i-IT$N=HBiREh-=6$Mc&2r6PhMX~qZyCfztny87I7&W<)7>%ZxXjGJQ_Pqap z;~{9wO>S;^@4N3iKgZ4Nv(N0AS!>p;S=ASl!2SJom{+eW@RzZ9!na3f{pNoP{PvDVPrlJ1l5>k2wR_;bzj{7gQOIh1)0^cg(p#%=g{5LU0x1@70GyKG5%pC0BF zggfEKEB9QUA1PO4E_TZHJ9h5)EN9uWbkOow!iePLh=U3z{55NPg+_7!8n^W(n%y&rS17^RW{m2=J$D=g+}k7ENKJud{kR;9vVMo&UkZ zH@rIa zcN?;l1tqJuw`$&0!}U(yj6PZ|u|Lu#jy@ZNl@=e2EzBPwHt#TWu?k+*=K}XtjFC1b zb^K}D?j{;7{YP$I=;7%55BqD-60JW@o3?G99lv%hk$9+Whi%+}93ZD4e;@aLu35&0 zXI>!2XCn=u4Ju+pfBg2XTYX7$w7=C}(MApOaFJ1A-;suJ&G$vFQ0AA2^m9~V-7udx zbsFUP*rqlHwh{*!dqDpoL1l;`-uLzWN&Aj}_Iew8<*L1VV_+ljt+AUs{I{fO_#ob;dj0QX?#&Efe^;s0OSW+09e;=E@aMU0=G=uZ_N zNPWbiOCLmexY|7I^ky5 zL#^cH^Xela`#Xx!$SF1QYP zs4d;TJqP(op7aa}6~pe{Q|vn^=l|32|M?f8v!qB!u&Fie-u(__Y7`5;G8eyxr<8GQ zK5=Za6>Oe?^Rm_^f^$I_5muzxirg180B3e}SVF>X_(S|%8w|{Qox>L|M%da~-)All z^4qp3l;@D2q)v}*vH<63b9wKr&p(eR->&UzCUD{UPe1ian?B_;XKQoW*Qtl-Yj35* zrmJpC>g?rpA2Gm&zkU{FJM0JizsH6I5BfI1-A0ZuL%AchhD~|du5GsjEpIm zl{@>Wzgr)5DsqT2cl6BoK)~N0`Ncd$7;-hzA4p3B=$kV)TUqbG(q2w!HAM0POqpy&=UNnIn*fHP!{pC5E zw}{Q~D_DUuz*KxW5{34CJP){{RF?@*_+^3TnmzbI=oGJ2;NP)JmtR&NIpUf52kRd{ zRbj0eY&ddgVBS{gum+;)2HU+n+zLMHb8D!)6nOWDN1^Y0dVIN7`)>?cP0 zDS6)sFJ+$w{IN#m@c6j0^WS_k<@Ysne6y2M_)s z{BL9JfA;)&a7b*-t?KdJ2!GPm`q=liYk_h%u7AX9s93ylV+P^+CV0PoFB3Qj*+$Rd z$)nG8e<=&39F{U&L&y<1r=$T|9AHepu=u!3&>!&lQ{~@HT7!2wO`9|Gy0=3QITLY8 zr^XIc+F>7+{Th0udWhMPK5yQcTNM?3@tarZH2ECRfWhh0(msk9;Ht?@4iQ;#gG46E zyu@IUn-r|XKV{rgwn^SkyZ>wV1KPYbZPtu->mR@O<(EUt5Pt~$tfEz~kN?lqIkrWs zR<$0Rooxo4V^Cml@P40u{T_#ghs$H<%@eaq-x3SHx+8L*JrgqlYx;M@p@g7NN92Ti zdJi9oTHAIB39-l!o31>6{rbL{e{cQ2T>G%2*@QKR7`VU6KL~%qMO&!%=h|ni9#?O# zdq=KZA^QCxZ=oGKX=U!pq6Iy=n?EBDNcdAHMBM=Sc=}&yae!z0&V~k$iudiC^E$6Z zJ=2j7&d(nd;P+$902etAYk1@!H|T|$D)86h0r=>r>yIAY1$f)MJ_l^0^pj7rN5x0~ zm=x?S^2ddV1t<$qm{UAwbdVr_&=Yz>wx^|uT6q)kjORk+#8HRF#a#wJFdKWE75e&$ z>{2`SKe}QbRi8h9ZayYGZ2|Jp9(kv%EMoQEy?sWeq%83pJor9r!z=s;4U&gXOcRsV zZxGpUy)CjHJP^~KK1Iw=wc&ux2jdEXNXhm{rcFe_l5mE|Mk~H zLq`n1O**%enW934jyf z#WNk{34{w_2Kp^q+uJ={bMRp1XV^zL$J##PZ^{FD9(w=W+L*9GPclXhl9#4Oi-Ob$ zk()eJWXBIy+ME>KA2Lg0W&cyw#>@4g-~r|bR~f!28e12apNseJ-F)f6gCNK%{#=f+ zmz`n1ct&1(`0%9O4t75vE}?o<`lQPr{qRG`TV-XPSM1v57aS8a-QC-})WO;LzO$QK zg^!<~JUD8Y2uqzPhHuy);^2cCf>;FI&%P@fC6A?Vo@{7pdIx!xd5*3cw|4xzW?~*O z2c3&{?%3F}P3x-stJ<+u%00mEyo5XH0P(>b{MCkI$ELkbSF5-EroY(_(C%&vRu^xF zJ)uk;9O=In4;X)=5(nxiHim>{>$Yv4FWRu7fcztVUqx%kD6V4eu zM9fME6ti)iIVw=}gPgEA_NU+A0Odq@2j`_@=T6VDAKZj5Kn`e~8PD_8`~0Rk;XTqf z@G8**gNNLt%#AcwPrqY%F6N2z#eR}6n7MdyXUN(^Bje)M4GIbQ#KFbo7popUUUcu? zUDMOnR<>|)5qjNwhS12%l-a}ESzwA|EsS;?Hz0%lkRKzK;i=9%@SVR2YB9OArI!} z+waat-+h;Wxv1hbh)bNegXhmpjR+0=d8n7IOumggoF!~c*-j-6fM3JNacz`CBb4NRt>la@Uy?o1%vJKA#*jKrWaNA#wow>B9$#?6|=q5Bx#?_y{pPz)jJ6 z)9*pcCvna=C)~f7tGaFLmNL#oKOpb&(cS0Hjk@^54|a@chWFONdw(OBvI&AXX zITwr!I;&}yNLmZ}1=~a0M;|_Tkj}kI+h5|rJFrKEJjDaHkMZI0@zb3=J=gViaJXn{ zX?Y)cV}5|Y$(Nq}`!CKcEVQORS^L}SSMtF(E1r30FI{@JNz*13pML7{ci*{I$2qozdF`?D^oiYp1ALy2K+XcfEODrppiKvJ7ioP|;4dyCX75*s z-!y`BAhQ}R;rhZo%YE;@y)|*n$cOPkp1`F5F$1ulGiHb=oD?m#E}kw9tj-flrjHSU zUiP9bWY>!R8S94qrA-p`WVBPHtvhumR^2V0#f=+#WB%&Zn~r__@i^wY{TlQ3JSz}8iD@W=a;N`-^$8dO&uil>O2o~zS(Z*$l;gY|MJU$822k@433>JWI25EX6+?A zck0hvy3~Hc%$e@>6d75@{C%9WH?{p|?s3g+Ja#16-qG%RtsIE_AZ5bTHIw(?*hzah7r;N+ z(9Gm9=;|u)a_y^+t8)GP>{qmL^(h~m2PT3Sn3*sbYt>cJS5?wA(zZ%l5yaxYdf?*4 zM9^o-2CBxu@nBAz&)&MRX42Hu`yqZV@)VpaR?kWiTNh1Ja$+$*8gpdrUo~IMpF9R} z@y#mjMt}ocJB%YhTS={58FNLN8tBVb7N#$pJ>9>HNlyF_apX3X-n=>b=8G4$fPKWe zLx;9m+w^>@jg6!S+eo&hrCsgXw=18!YQ#ttFC@=3eF)MQ?aw)4Fz+Wjk z0pI|2b36lT&s^26vV*((1MaY zpk9!LytWnX0})$7dj=s5VyRubwq^|Ss$YBbD2VI6dVACloxA<{;K|b_Uk>uLmFHp4 zE=Y|OqafoW4v-F1k68+Tg@+LcA~7R|ptHZHt; z_JrYLSJ7;7VoQ-YiX5q0JRlC7KrZ!7i?hY#(b1y6OE1N?h4#_ZB?0D@_AOY~oLio2 zDc|D$ptVP*9SvhmGd4}Aj~#Mu*of{%`c=9uuEhZ%LqEOv{R7&$zERI!eJ+0QZ|RN1X5ADTK;0kIV)K5C$wJRfoa^79ji^@pEFTV*{F2b4Vlz8$UFwS7K(?AWtMu3n7xf=Ds6p{ z!$RXZV8GYVyE5*)R*qNICh>rHg<|o}=QpAk6fY~9GG+YxGt(1)$jwNpSUEdQ-n(+1 z0{cU27m2;Aa>X&^Q9rYzSlJsme?gvoM6kCV^b0;BA;?n%6UJEMK_0yoJ|!7?hlC&x z#SURue<$VMXgoJ*n4g#nS>$lYwurx-x^#XBU*d?r0)O(H$Wa>+936d~dpz-uMe%{b zUPXIu@>`@=PFRDqk6`{6+DP@WxBY4Fx%cLC9{vnm|MWA!N%8^3J9iXWcQ=2+chR;- zvCD#e4%Y?oQA@Xp16tVic6PqI`OKNg$Q9DA`g{-vZo?Mwy|S_qQ?sUA7~0QCJv%u> zUOh8e%pVu2*o~0CsoD>)FVqBIi+oGvW3#e8rX4f#AySUl2<=wk0skhw;T{ZmncbeZ z-in6YV9BzQ73XJUrT;BGCGNY~6GxP<$(^LxT{KV5OB*3Z1bV`DsyXCa24ch@S9wN! zpuAv0q?|u49Q#wSCObYzgZx^W$-@KGsnG)}#zqZzmK+oKL;AS5uX1LjeK89qCoA># z?5y!+a0$8X;Og=jY-A^)FK^`Qe{bHYr+okJR{^6^C!FurwNnM--_WOng?kXsEj)KI z&l_a3Zih&h{n4CyyREpS*T0cm4j|S3DeT)QZh4=2fdZ?bNZoIx%s?t?5(89iEz=ynp(%)IF1@ zr|-;|Gi&S0EgLs%Id*9E;fo(kJ%8^jXUc)8qpDtTRxrhw4E|A_Gy8w}+i!=YWK8|Q z#IUo5uvhpF_&+fY9{WkXD`n>)eeD!FL>(w|fB8Cg7r{{xWgq?cW8_D#@msIM@t>)) zk0-BOnKUTS{}Imtggf(2X>(7}-{W=olO~Xt_vr8UH=L(ZAj|qqF52smzg_+L$Nn1+ z?ms>(G~h*2Xg{$bZ<5%&aH^O-IvBDiLxs=Lw#{<_&xws-|IowE_WSYKGfp4}WfJDy zhI=RXtJlZ*5*JkDtw0+LcfVa)Y;0tp#4F+cPF{+-+5Ad*@&IE)%r%Hsm<)72NOaWcSRYk9p<(V`rt<=+VxHKErR~ z1(=7@*~jPZrc)=fFn{eR52@Y<&H?r<$I|PcteluW{_~MT`)Z12B#T4q76A`3#MsCI zg0{%CK_UEk_9iVuIoTki5yaDh3)qUr@eD>tY!0h~aXL%kZ z@4^7{iooMeyDghe(&qAhot9Z zpS3bGBJ35I6Yko=GbiON4zS1LS%dU`6zrcA8<@fFV%W&oPfBmy8cG`auZH#Swa0f| zdT=i&Au-{ei;cNVdrW_qo??J&FNI$wZ@{w?aiBULX!imeC#P?rLpy-=?uSyPE8zP$ zFMv}M*b{i}d+%()l&PtACypFivAG~y=K1Z=+5+G~vIy_*DhyyxL>&nCMf#i5*MK}T z<)bZO7Y!Ns3&e1Ggt+jZk4j7XAZO{))w!!y#cw%zGJ3V>R zo<8s2yZ*U90ng1&efsIh*o3%imZse*0B;PFq{v-}mD;5)x~@uD|$I%`}VY@VWzGIP)l27eL)*;o*4 zwrMY*Jr`ET1MQhkPhY=0aq84_Z~yIYk)-=P!&mPM-a*+@(=Wseo0A`XGy!?9-6*jq7R$#W&pQHH&gR84!6$|Z=oOSX#Q|DER%~^`ojjkN>W}xkf>IOc$?Sxy8-V`YGuX*FI%q^wkLKXJ3tX z|1}?>_Iya3s0sUreu07CY&vnGlofpLkrPms5^Fzlqr z&?q}6>`4oh{r_LQ{uQ1H{?+i8nVB|o#%H~{n^$nJ=eoB7?6rk*W$s^;_0s;{AM;80 zv-Gv^u9U$(PMVy>3qHS%5W}zUoz>^;KlL|p0QQ28nR92IwCic6Cj7bnBm5jhl)saL z1NK(k6o2H(b^oe-fcI*^CkW^HM_Gjhj4eNsd&}!M!13UoF2>#D){7T*r$4!xw(a1q zw+r&KzgsqIg8IPfd~p&o|KppNDTVyvrh;rSKON}B&G>`9X--{}PU7?6Z?oB+J9x8{HI|4`g_O^{!OhOmcMf8b!Xci8u9^J z8bE%Pd@IL5KQihGtM3KcvjOlxW}adXKfn8VYu6UTrmF8(&>_FRC-B{w7&m!m^7P0z z=yvR*%Q*`R=btQ`llIk?qIu7Dt(>m`{N|8ceY|2X)d8tt%4Lai~ zupO8VThh@(ycD?#_lkc7`~eqT^u5{jr%&y1E>DjepK{CG)JP5ay%MA4m9-BV!1F!z zOx*JaKra;z--amoI}P!&RcJsz$aexfY~=}4CVuhp_ur4>yx<+L@Jp}5F^ZA5wH!HIFYbQt zy}ZA@c;UkH+L<@-IGh8Nnw0M`CfSK=SHg?8tj{YhS$e8y$=v(P=4CuxH*b=>XVpAK z-oInX46$Y56tRBZ1hHmjl30~BS}dI$D+<%16da|kh{FH>#q&S=Lz;XWA$~r%e}7#1 z?AfQ?eLQ~X+_9aK%ZfhQlNUlC(P-uPud@aJu_~w8)&DaLO*#WKNaB7M;@1& zeD~BRpJagFdn0Z9Ps006@5%%Yuy2sBrsXbOe8b+_Lc=pb7;u38T0FB-e=-bvLNC~p zQP)N}(d)E8ix12j(aFHzDRMe}wC%08@?Zzv5A&*=-?0(=2KPDlX~uAZ9`s)0=* z=vE&M>^PoIm^owC>pIIfjahpS?^f13a>W^U#IZMl%>>{p^E^tOE%kSl z=g?rB?{g1O0rU0fP$BS|kwKdEaB>E|d<&Pe;>?Hf0yaDFrYAEEi$u~)xh z9(1^OBgg2t84Gf6IP~fMVvxJFg3rT%1M~x;t@arBandieEzaHKyI!ROknQ50)}Ev; z&TU4frq9CS;;t^;zIDL|_wM-u#+^`_P=<(iz7ZGL7vcl>iMC(jY=OBmIDF}X4Rqsi zE78u}rHhwLm^OLE$i(rFkGvbJ@Mtu1G_`hE5YM4GqACK z{+@6r9{6KF`O}{wG|?w_(kh zEr-giUq8>Ez2OH+9EgL=a(s9{#gCJ=`%~c4%RP>EB$OFy@ql)P^j##cPI(UE+bOmW zTsMeAAzSsddKNl7_BLX^?OlRAk8j<&HIQqZxc43SQO*|%VXl-vJ7?PGdCf!{w*haI zHrUrYesJfGE6%Co=dD=2CV5KQb_C zo;*HnDJjpRtwGE{XT`65TzFqG0rL_Y;3|&{8}Q4*6^l>ey)iFg|7N`YvxEA-^c>gZ zr%#{S?L2*ILvU!|W7>-FOi21qe?Z#q<|Yk=&33pL4_iRmX;K!arTyf`DZ`_DmTRao zE_h32?NrLe8zCn{E43kFKO#Q=&0(WP9Yt>1HHR->j)Rg81_(u!q==5Q0!~Ao^Ps(U% zOUQlR5b&o=hvz%$?nvtye~ath9Ch;Y10g4;yqxAOu{a8gu%kpVk!*jb2m;K|p{ zO%>@Q0u_C7E7;`Gu931i?hmxB;+44pIG421Z(`2kMH6xsFP@N%E6a=pd8t!#W~NWfnw~!~ zbNYv4C#T&G3LW~u!O{L_<8ED_cYr-;hjuL$yHL_@?&XZN!}uynA7DfHvLDL&CvV67 zpL;+1N?DUfZwm$9{(wF8B(&QY0$B;y18h#j=&*k3oLN&Iz^-{2_7^kG+v{`rKeY}V zuE9MMds*&+Vx2LZsrc6tsG%Mdws*sdKz;RgBR94%%9u!?p|(dgJNw} z-n*A&c^_-b@?MrEFDy+A)XagP)xT@?uspMouG99C@MPgW#Pv?NEAe)qn`eK>)AIe4 z-P5+1I`RZQd?&Y%6_)?~^!F<<{Ru&=^d?5C6y zL0;o?_=EFXlg1^L1$fz4knRx=W`Gwco|!220{({}(}#Q?_>d*CMnjhCYJ+o=o&t07 zg!FT706T!{v8|bNh`2&}%ymiKnR4F7@3$3Wsf;O$zrmwv@9|1MC+f5r1C@ok z7v3j65dLhFu;(65IzSjxo=9Az9zpSk2M<6xPrjbAuVDk66nPHMbAedzJQEZ5dA1)N z(pQr} zO%?ms7r}Mb)SqmG3LDdmw@;WhXMMgLpwFt^jn|! z_+s9)nbU8C1$dR`r^U*&&DPrNSHDurH!gj}k4K9O!~^rTp(U({d(xiSA@l0`vUw8#LQMnTUv0%z@*fvzIL*HJl-(N1M3 zN{Ejw?p5k4Xk*DZGnMN)RPj$+JTX#x?;!nVvgtbFTb?m`2I^l_pcik)&*sUm@|F&j11Uy=2X_&b<2+wFU$QN zzI&RZI2X{juR0yj!u|k!x^^y~B{naZB1-0rRrGr+ro{=CqKx5U*_2r5`(ngm==<{F zbCv^oJp*u_4tS;l=HpRlTg^f}4C4*Xz?#lQoS6mV@H}A;y)pfLcxGXt?3Q~yZM0na zSjvM3_kT2T#`I5$_wHQ*KllKSgX8(%_5P2chyWg-)a04*%6H!xUw}XHi4V_hTD^Ap z2OE~<{J5`VarvS3g&Np@$=nAH;>GBX~WFF*{T=$e)j)Hy$x>|XF zTW^iCZO?LNXNQNwM#W!RzGM4V*!aX;d-S8@%_mRv2zQR-9~=4qKK=R(a1JS(Md=7R zlJ$kJznZw^(B6fcHWeM%v3cc}TURf9w0&8QdS_v_yuC0>Y+R5oR?i%RH9tb}D_u4@ zTG8<@0S?g5bTMR2i&DcOcVtYtA&@^YHrW8^VEO~Tz6$KQuWMrqO$FTJv2O&p*~p#_ zJ=IOCTu`M`u^(u1?ShIiZC;I#UB|rZ<-2NSP%&ji;x{Wa3O+PDt zWc==}TLH%}yc=`;ol^z74(xijc;%w&1v!(xT%0xLVR25%^P;R#6-Ak&)yt;EYnG!d znLJ!mkTy(SI5ASr8y_aaZxb;@2FcLBYBFL6YLY_xYT|}?sl)m^SM>L=d+z1j=V4zT zx35B@BW_H}nRzaE<;p_jDUCgJ`EtO;@4q);KiD7k>)$cn|84W{&j8mNN)4>L7T~SB z-G;7*etB=-ydJdwy?64~@7cL}VNv1wteMlcOwE|EeR5jT&a|=ddnP2u?oEo1+!q%c zzBeX1WKa08@LdtZqj$uN8NGGl%o!UH*LDqj6!H&#_~8)RldxU3&-d_sDF3_0|2}B` z#Rzg z>dKGuc(ot=qcT&m62>nh(@*7^F{N*%97&$3*~FfjhURKiz{rK)-v>-thA?knG;UM6*9_mnyx z=0tG}{QhNKg}R6Gyz+fIyQ}@wE|p%dkFA`#$|vysPp{W2r?T>U-7KlBcDc4SfI3U{ zn|kAy_|K>Ced!<8%U)@(6l1D#gTe2!Uajk9VGgR?n{~6^PzOqATU5R;#T>u9p{R|j4aK2^`ZQpcQEub0-w_$r?VT4$+P2j24c ztV^Z3)$66dsh6p^M3m=&jHObU>Zf1pcvo~~9YEB_GC^J962l6V^oguecWEr}m~}22 z*3-3h1)ppsTjCqPNBt+M4VSLIQZHj&kM&A?E+a}d;5yM&zAxn~8cBeTO5mlKNSAWJ znv7#+8R}WA>vE7pbV(m|3_+4g(LiYftOV9oS?Dr8wIyf#47gp2F5;tG&SeSQFO%x9 zt}H>;$4ZLS2}F(aAffvzelMX5sApjSe1TF|=mVC$(x6c0xfC7bKRm0z3BbwXv|>nE z65xc%Mx_l}LeszljH^s}T7iHvuVX9g<>@ujSH6`B7e{ys+|y@;c>(m38HHl`l|k=qo>GM=L)rm30n8`BYY`UhuN{ z${ynZrMG-W>D$ZRvaa-4+dJOKVskHh!@BYVeg5_GgRiSv=dH4;){XI%D@qoMO6r9F z@o}%b{JZ}D8ho0%QWmQ0l9>w^N`_qkM10UW!(A6H^`5$5f$h9yi|qE?Hx7MzJhts_`lPp&@sr-&O`cd=8a?e{X85$biNTZZ zriM=~ObmW8F){ktyu0Of2RGM)qthp46(88|i}sqgY1>+wGcHkSe?oS)GQX@KCz^8a zKl$I$t5+q&&yZl>ErrL$De!Re@F0wv?0V;HV8rm4EuLO(-}JCR95LuH{ zue7~jya(gX?UZ=4`iRR$eLG{&GX_di=x16qfv%tSV0vvucPsM>H*e1?i0iv>&87`~ z@Q#{`H*Hde%X$94HU9FKcsOCk49V2gwBeN8dC^WDZtr(!UpbEUEt#*YfegC^HT0Bf z*fD8fTOjvP@+fze9eWzf^sjd6WeWSVmhdBKA;acKW^8xZyJ=cCZ>)wNfx0W~otibO zCmKLksc&HLIAr+n0|(!J+aF`E@q;W&r*GVlK3A)ybHIZW*RTKE(E$0WB*bV^E!nnB z>TF<81M=`lCr{7!5yO@TXHmCS4Gr{iYWRq25a&sTEe-NUca;&}M237-hU`^?*npaX ziBak;`RVfh;yfjX2;}W@PEv?wLhN8U#Meo-?_nZCH!q_d(p3$RjO39-n?B}pL_)&$ z8~5*9X$O4%?%jVIU4Uqd;fju!ri;lV~l^ro;}iypMI9s9X}T4;OhJ(WBcMQ8jc%! zSDCh)u$f_wZ?%t|rMkbP73^mE!0*9R42uaAiP3=%CMU;SnVz2bVRl;Fwpmk>?s(W* zi3Wgi$RMAeN(yIvwxc-j*(TV6>@A)zjzj+c*3MP(>8(ZTWwX-czE0MPKPTSFx!^pA zrY%~C;1R0)L{d0g^jbzu@7KNiQLn6YqzcohrF|R)5`p-o0rYi>{*!$ zAJ}E`+q;U@)5k=}UE8;WJ-v<=AJp`-LHw06#HRBod-_x=+PzyD^tH#2rLw;`2S+bo zmatb#g_}345Q|G0JMsvxu<41IV4d56M%7otuUe*^4(#xhakpq(UznL1iT;BJeU_9l zZSwN{hr6&Nu&-1WZq~}R(w4i=B?K6etigN+h6kT+(X=6bLgd~Kj)yV73hb_Z{f*N9 z%)-Ut`9(_?uUIz!;FcA+&vzEh6-U=D&`eJlqV{*{uGn(mK@GMc1s9NS?cS<=dt-1< z<>lieodRwADG{~OR7q+=W%oPGLACIbg6ugCh;0Ve89pEpNm>6Xo^p)t{5MryKstMaoHd)nn0 zacbmCksYiIiR4x5p}V!Udgs}9(l#DAAR%^^GN1qG93V!wv}W&K2{{fV#IUb3ZGP_Z zHn774d@Ep&scG4?p$yw7>|d71=iWuQd%8ZFJa=vmct5>oFY(RX!c1q}jI1h}{DzfS zD=;kNG~-G!=9ja#_sN|61qnT@dtK^b)9V*EZ?6;sQxj>}#8f>e2Rqj;J-T4WgX{27-vEX)-9U`Mj2XqF~=kSF3i=rDH%_Xyd_y4TZ{`}PkQ6cHiCrlcryfIMk` zY8t%!{UyY2k@^kvmnZ8Y!rG-hYz|i1Rq#O8N-KJgJ zM_s#g6rMhwKWsaG+~2FepM-qu`g&cve%h?7foR&c?axgbHh9Ov!hACFtOjq`wtoBO zB{|O-C*$#n)D4OZf2%e80bt+t+|r=E$e1?q<8P2!i$AJU zx31L9#AJf^kRjsKci&fJo;oA^r)3HQM`zKfS@Rz{cQx3RyJXQ(>=%y?!hZ1WU8^*c zMusr%iwt^Lp##sbL1AInf`<=p>l+d*%~-tnH+^~2jRou0NePpuNLR|fv~=t1bH8p) zaPty`eM+fSY1h@|81oK;PlJD+R3`OJca`Q40-e(Bh{nK~AJq4|sEoI-qUy_bEW z=s+^<*>hgntXUd7|Kdv_G*@v%-1kDGPCt1@bPpOT>NaZpATA|o%bv9b_c;ge>@L=f z3LBu^7b+NEF>Q9vmhQH8x?fa~L`o8J7AV)(|66zTsB&xXd+$kI%*=G7lalt*XA3vg z@YRuF=PZxG*xl`Wis_3BGu{09t5PyDq>$)XRl$noQpCt%QtP&D>-Y}zo9OA+FK5!6 z*?j`zM$}}ZKY%8jzV*2R_jQL3+YcX;@S%}GC()`&0}XAa7cQQ6%CWC+8@B-iIX9d~ z9Sg*srX8**4$B72+V_k{9bcXh>F4U7l`^zn%vs^*2$FJC5wJSOgZ_? zwj#|y4|`<}(2%Bm2R+T&Lx*CC*FFOWN{BbiF8$^M{!t?TfSire%H6v|nTTqk#NzO-)RCMjc1R{uVBHV4gn^~ltzRkI24 z*DYWG-=kW(Ws9`#^jp%JLx;zB`*?oa31^-bjq1PfKuk5*M!se3;@ZZnm$lTaRVxLD zdiLp~jK6cYZc!tUhZ1KE^$l5;Z)!C17r2(as1Tn+pt0=xhnhCV#v**g$bP5aKRa&6 z>V=Gntl3vQAMptEWHh3Nh)B5f_5RFn$dI<~py!EGrbwajaj%RYepM3J{@7{Lq`?u9 zEs^izDjuLeKh7YnWzRn5YQv6gMAWE+Qx-NhO=FUhr1N*b(%F0Lh!pDXP;cDysS{1j zO~3OW8ayi`I8?H=wN=IqP^qxzNysN!7x^`&+S}Qv4Lh^~kJ#vifnG}y6BqOKy3=QR z#7~+ejm^reT0j1wp~~N_J9hMo9x+0I_ayGiSCC%`win_$=HWW#VZm2l%k9lA#Q4eS zf!2L&q<7AjF59yzPn7OhrOBU~B-g85Q-gh>qCx$7BDZ)|e#g#TB;=@-dQ|qWY7XB0 z@=K|wot=c79a6!jO(_i;A=V-2C~QPEurpV;Y+PRkUffx}Ygf;{K|#{eZCi9c{PsR^ zwF&mdO`W=Q5~(>k`P<()TQ4GRq-592T7logXU~*p7Oh*m3329yQODNwDXeHvr>1Oc zZ~J7~uHF72QIXPA@CCh{ovQldH*~1-`;OhZ^&gp#ARYn!A7Z>0F#d}umo*x38FP|- z{f21XsZ;ra6-5sDt5!%o9UYqP+qLc-V`G=@Sg9WD?Wn8+G$!}5xBd28S!4Re<3|$Y zEUNsHlB)M1$B8s+=1j@Q$ET^2r^nS=HB@rz7LC;n8`PD-o2Z*KYbNKGtckaEah7Zx z>~*)7mP**`n@*XNv%OWz<{~yFd2?@j+eUWIj?$7H+f^Ulzb}1o3!nm4~+P_(@D>h(oZ+=yY)iXGeBcdS|TnEdjFg;|>B zpj~_?az={LlhY>|nixxVF3zf@+qPD{FF0nH%GKLjTDEmdP&b3l8skpwH1s`FQMw4; zdQe2zh2+T-8y)-jl8*nt{;E!fhSH1$`704;OaNy-KK#~OZAK-;Nx`wPDoMAQG->7x zor$UArP+mxXCv+?X=nw{^zeUFV}BMyhsPf7*tKh&?!9}f5CcIPmpQGfFZ?5R+&G=u zb?QiFJ$rf%2n!Q;F!s|Z$1(m>D5Vt@;yC6c>ezA7qD`ASfziWSoW6Ed3UhbWad)

    syH-z2?Av<(-gAD7c1-Dj;O&UgOT~W%#*N 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

    {?^8G`++AVp<<2)Pv$RN zB&e#b94<@@mC^Uqv4M8k^2`{Cot2pc`YZ6gL5~%_YiPBw)|RHMtDP0=iRS?E6u4~% z=nkDNQNvb=FEsqSjw13&t= z%>DoVPwfwfj|dAtDKUl=K>Kg=uAR}%tIH;i@9vVm_3}>km61(sf8$C?UXpmy!_j&Y zxW7s2rv$%fYA*Oc&<>&VtWy|!Ov3(2^bsYoB4^Z*Kxu7OIGY~h z9~)%P40f{H))lePpXTDKE=6qQOw4Ojd}49Dh;0ULuc;s!adgAjWyzuJlFZnzN>(h} z)qCKeOH!Z<85kWQ@2m;sM`UL4tkvd_b^Tob`A)T_KNy9$NQCz zygEjXbgia8tDL>|vER^v!HSLD8}?U}47Z$;~!k`9>Rh$K!`FfMe8V}-yag7kC5KPK!>J{hI_*)GDYp=EX-IKW86&9{V`PA)hSTW=A7l+3wEvcRU + + + + + + + + \ No newline at end of file diff --git a/Managed/Directory.Build.props b/Managed/Directory.Build.props new file mode 100644 index 0000000..49a15a5 --- /dev/null +++ b/Managed/Directory.Build.props @@ -0,0 +1,13 @@ + + + net472 + 12.0 + True + False + x86 + false + + + + + diff --git a/Native/CMakeLists.txt b/Native/CMakeLists.txt new file mode 100644 index 0000000..8abdfa6 --- /dev/null +++ b/Native/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.20) +project(DecalNative LANGUAGES CXX) + +# Both DLLs must be built as x86 (32-bit) +# Usage: cmake -G "Visual Studio 17 2022" -A Win32 .. + +add_subdirectory(InjectModern) +add_subdirectory(LauncherHookModern) diff --git a/Native/Decal.dsw b/Native/Decal.dsw new file mode 100644 index 0000000..8201049 --- /dev/null +++ b/Native/Decal.dsw @@ -0,0 +1,173 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Decal"=.\Decal\Decal.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "DecalControls"=.\DecalControls\DecalControls.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Inject + End Project Dependency +}}} + +############################################################################### + +Project: "DecalDat"=.\DecalDat\DecalDat.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Decal + End Project Dependency +}}} + +############################################################################### + +Project: "DecalFilters"=.\DecalFilters\DecalFilters.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name DecalNet + End Project Dependency + Begin Project Dependency + Project_Dep_Name DecalDat + End Project Dependency +}}} + +############################################################################### + +Project: "DecalInput"=.\DecalInput\DecalInput.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Decal + End Project Dependency +}}} + +############################################################################### + +Project: "DecalNet"=.\DecalNet\DecalNet.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Decal + End Project Dependency +}}} + +############################################################################### + +Project: "DenAgent"=.\DenAgent\DenAgent.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name DecalControls + End Project Dependency + Begin Project Dependency + Project_Dep_Name DecalFilters + End Project Dependency + Begin Project Dependency + Project_Dep_Name Inject + End Project Dependency + Begin Project Dependency + Project_Dep_Name Decal + End Project Dependency + Begin Project Dependency + Project_Dep_Name DecalDat + End Project Dependency + Begin Project Dependency + Project_Dep_Name DecalInput + End Project Dependency + Begin Project Dependency + Project_Dep_Name DecalNet + End Project Dependency + Begin Project Dependency + Project_Dep_Name PlainText + End Project Dependency +}}} + +############################################################################### + +Project: "Inject"=.\Inject\Inject.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Decal + End Project Dependency +}}} + +############################################################################### + +Project: "PlainText"=.\PlainText\PlainText.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Decal + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Native/Decal.sln b/Native/Decal.sln new file mode 100644 index 0000000..0df219a --- /dev/null +++ b/Native/Decal.sln @@ -0,0 +1,210 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Decal", "Decal\Decal.vcproj", "{FF9AA982-5BE3-460A-9AAE-913C02E9C184}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DecalControls", "DecalControls\DecalControls.vcproj", "{6B9C5380-3B50-4E72-B604-5089CB64B644}" + ProjectSection(ProjectDependencies) = postProject + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A} = {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DecalDat", "DecalDat\DecalDat.vcproj", "{B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}" + ProjectSection(ProjectDependencies) = postProject + {FF9AA982-5BE3-460A-9AAE-913C02E9C184} = {FF9AA982-5BE3-460A-9AAE-913C02E9C184} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DecalFilters", "DecalFilters\DecalFilters.vcproj", "{06884D36-8C17-46BF-8BA5-2466E97FB605}" + ProjectSection(ProjectDependencies) = postProject + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A} = {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A} + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790} = {C1CC01C2-D2C7-4862-A143-14BCF1BE9790} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DecalInput", "DecalInput\DecalInput.vcproj", "{85C9D7B0-AC89-4E79-B701-FDE85EE569CD}" + ProjectSection(ProjectDependencies) = postProject + {FF9AA982-5BE3-460A-9AAE-913C02E9C184} = {FF9AA982-5BE3-460A-9AAE-913C02E9C184} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DecalNet", "DecalNet\DecalNet.vcproj", "{C1CC01C2-D2C7-4862-A143-14BCF1BE9790}" + ProjectSection(ProjectDependencies) = postProject + {FF9AA982-5BE3-460A-9AAE-913C02E9C184} = {FF9AA982-5BE3-460A-9AAE-913C02E9C184} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DenAgent", "DenAgent\DenAgent.vcproj", "{1358ED95-22A0-41E2-A23C-6C46B0BC97DF}" + ProjectSection(ProjectDependencies) = postProject + {06884D36-8C17-46BF-8BA5-2466E97FB605} = {06884D36-8C17-46BF-8BA5-2466E97FB605} + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A} = {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A} + {6B9C5380-3B50-4E72-B604-5089CB64B644} = {6B9C5380-3B50-4E72-B604-5089CB64B644} + {FF9AA982-5BE3-460A-9AAE-913C02E9C184} = {FF9AA982-5BE3-460A-9AAE-913C02E9C184} + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A} = {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A} + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD} = {85C9D7B0-AC89-4E79-B701-FDE85EE569CD} + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790} = {C1CC01C2-D2C7-4862-A143-14BCF1BE9790} + {726381FF-93C0-4846-A72C-1B1BA6D08643} = {726381FF-93C0-4846-A72C-1B1BA6D08643} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Inject", "Inject\Inject.vcproj", "{ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}" + ProjectSection(ProjectDependencies) = postProject + {FF9AA982-5BE3-460A-9AAE-913C02E9C184} = {FF9AA982-5BE3-460A-9AAE-913C02E9C184} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlainText", "PlainText\PlainText.vcproj", "{726381FF-93C0-4846-A72C-1B1BA6D08643}" + ProjectSection(ProjectDependencies) = postProject + {6B9C5380-3B50-4E72-B604-5089CB64B644} = {6B9C5380-3B50-4E72-B604-5089CB64B644} + {FF9AA982-5BE3-460A-9AAE-913C02E9C184} = {FF9AA982-5BE3-460A-9AAE-913C02E9C184} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LobbyHook", "LobbyHook\LobbyHook.vcproj", "{47B0C7F7-102E-4EBD-83CD-B317D991FDE7}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "DecalInstaller", "DecalInstaller\DecalInstaller.vdproj", "{6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + Release MinDependency = Release MinDependency + Release MinSize = Release MinSize + Unicode Debug = Unicode Debug + Unicode Release MinSize = Unicode Release MinSize + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Debug.ActiveCfg = Debug|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Debug.Build.0 = Debug|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Release.ActiveCfg = Release MinSize|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Release.Build.0 = Release MinSize|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Release MinSize.ActiveCfg = Release MinSize|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Release MinSize.Build.0 = Release MinSize|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Unicode Debug.ActiveCfg = Unicode Debug|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Unicode Debug.Build.0 = Unicode Debug|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Unicode Release MinSize.ActiveCfg = Unicode Release MinSize|Win32 + {FF9AA982-5BE3-460A-9AAE-913C02E9C184}.Unicode Release MinSize.Build.0 = Unicode Release MinSize|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Debug.ActiveCfg = Debug|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Debug.Build.0 = Debug|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Release.ActiveCfg = Release MinDependency|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Release.Build.0 = Release MinDependency|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Release MinSize.ActiveCfg = Release MinDependency|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Release MinSize.Build.0 = Release MinDependency|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Unicode Debug.ActiveCfg = Debug|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Unicode Debug.Build.0 = Debug|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Unicode Release MinSize.ActiveCfg = Debug|Win32 + {6B9C5380-3B50-4E72-B604-5089CB64B644}.Unicode Release MinSize.Build.0 = Debug|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Debug.ActiveCfg = Debug|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Debug.Build.0 = Debug|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Release.ActiveCfg = Release MinSize|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Release.Build.0 = Release MinSize|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Release MinSize.ActiveCfg = Release MinSize|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Release MinSize.Build.0 = Release MinSize|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Unicode Debug.ActiveCfg = Unicode Debug|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Unicode Debug.Build.0 = Unicode Debug|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Unicode Release MinSize.ActiveCfg = Unicode Release MinSize|Win32 + {B6EAB7A5-BEB3-40B8-9150-9DA6A854628A}.Unicode Release MinSize.Build.0 = Unicode Release MinSize|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Debug.ActiveCfg = Debug|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Debug.Build.0 = Debug|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Release.ActiveCfg = Release MinDependency|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Release.Build.0 = Release MinDependency|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Release MinSize.ActiveCfg = Release MinDependency|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Release MinSize.Build.0 = Release MinDependency|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Unicode Debug.ActiveCfg = Debug|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Unicode Debug.Build.0 = Debug|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Unicode Release MinSize.ActiveCfg = Debug|Win32 + {06884D36-8C17-46BF-8BA5-2466E97FB605}.Unicode Release MinSize.Build.0 = Debug|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Debug.ActiveCfg = Debug|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Debug.Build.0 = Debug|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Release.ActiveCfg = Release MinSize|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Release.Build.0 = Release MinSize|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Release MinSize.ActiveCfg = Release MinSize|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Release MinSize.Build.0 = Release MinSize|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Unicode Debug.ActiveCfg = Unicode Debug|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Unicode Debug.Build.0 = Unicode Debug|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Unicode Release MinSize.ActiveCfg = Unicode Release MinSize|Win32 + {85C9D7B0-AC89-4E79-B701-FDE85EE569CD}.Unicode Release MinSize.Build.0 = Unicode Release MinSize|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Debug.ActiveCfg = Debug|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Debug.Build.0 = Debug|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Release.ActiveCfg = Release MinSize|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Release.Build.0 = Release MinSize|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Release MinSize.ActiveCfg = Release MinSize|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Release MinSize.Build.0 = Release MinSize|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Unicode Debug.ActiveCfg = Unicode Debug|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Unicode Debug.Build.0 = Unicode Debug|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Unicode Release MinSize.ActiveCfg = Unicode Release MinSize|Win32 + {C1CC01C2-D2C7-4862-A143-14BCF1BE9790}.Unicode Release MinSize.Build.0 = Unicode Release MinSize|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Debug.ActiveCfg = Debug|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Debug.Build.0 = Debug|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Release.ActiveCfg = Release|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Release.Build.0 = Release|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Release MinDependency.ActiveCfg = Release|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Release MinDependency.Build.0 = Release|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Release MinSize.ActiveCfg = Release|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Release MinSize.Build.0 = Release|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Unicode Debug.ActiveCfg = Debug|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Unicode Debug.Build.0 = Debug|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Unicode Release MinSize.ActiveCfg = Release|Win32 + {1358ED95-22A0-41E2-A23C-6C46B0BC97DF}.Unicode Release MinSize.Build.0 = Release|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Debug.ActiveCfg = Debug|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Debug.Build.0 = Debug|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Release.ActiveCfg = Release MinDependency|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Release.Build.0 = Release MinDependency|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Release MinSize.ActiveCfg = Release MinDependency|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Release MinSize.Build.0 = Release MinDependency|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Unicode Debug.ActiveCfg = Debug|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Unicode Debug.Build.0 = Debug|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Unicode Release MinSize.ActiveCfg = Release MinDependency|Win32 + {ECE3BC74-9DBA-48CD-998C-A1A8031E5F6A}.Unicode Release MinSize.Build.0 = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Debug.ActiveCfg = Debug|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Debug.Build.0 = Debug|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Release.ActiveCfg = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Release.Build.0 = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Release MinDependency.ActiveCfg = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Release MinDependency.Build.0 = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Release MinSize.ActiveCfg = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Release MinSize.Build.0 = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Unicode Debug.ActiveCfg = Debug|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Unicode Debug.Build.0 = Debug|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Unicode Release MinSize.ActiveCfg = Release MinDependency|Win32 + {726381FF-93C0-4846-A72C-1B1BA6D08643}.Unicode Release MinSize.Build.0 = Release MinDependency|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Debug.ActiveCfg = Debug|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Debug.Build.0 = Debug|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Release.ActiveCfg = Release|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Release.Build.0 = Release|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Release MinDependency.ActiveCfg = Release|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Release MinDependency.Build.0 = Release|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Release MinSize.ActiveCfg = Release|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Release MinSize.Build.0 = Release|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Unicode Debug.ActiveCfg = Debug|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Unicode Debug.Build.0 = Debug|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Unicode Release MinSize.ActiveCfg = Release|Win32 + {47B0C7F7-102E-4EBD-83CD-B317D991FDE7}.Unicode Release MinSize.Build.0 = Release|Win32 + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Debug.ActiveCfg = Debug + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Debug.Build.0 = Debug + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Release.ActiveCfg = Release + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Release.Build.0 = Release + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Release MinDependency.ActiveCfg = Release + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Release MinDependency.Build.0 = Release + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Release MinSize.ActiveCfg = Release + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Release MinSize.Build.0 = Release + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Unicode Debug.ActiveCfg = Debug + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Unicode Debug.Build.0 = Debug + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Unicode Release MinSize.ActiveCfg = Release + {6C9FEFC9-C572-4FAC-A863-88A0AAFADD7D}.Unicode Release MinSize.Build.0 = Release + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/Native/Decal/ACHooks.cpp b/Native/Decal/ACHooks.cpp new file mode 100644 index 0000000..ae2f60e --- /dev/null +++ b/Native/Decal/ACHooks.cpp @@ -0,0 +1,2618 @@ +// ACHooks.cpp : Implementation of CDecalApp and DLL registration. + +#include "stdafx.h" +#include "ACHooks.h" +#include +#include /* Heyus 23 March 2003 */ +#include ".\achooks.h" + +/* +I believe in VC6, the limit of unnamed variables (_bstr_t("foo")) has been reached, +which caused the following error: +F:\Decal\source\Decal\ACHooks.cpp(467) : fatal error C1001: INTERNAL COMPILER ERROR + (compiler file 'E:\8168\vc98\p2\src\P2\main.c', line 494) + Please choose the Technical Support command on the Visual C++ + Help menu, or open the Technical Support help file for more information +This macro allows us to use a single variable, while keeping more or less the same syntax. +A variable of type _bstr_t named _Unnamed must be declared in any procedure this is used. + +Note - This only works with inline strings -> L"Foo" +*/ +#define BSTRT(x) (_Unnamed = L##x, _Unnamed) + +///////////////////////////////////////////////////////////////////////////// +cACHooks* cACHooks::s_pACHooks = NULL; +long g_lObjectDestroyedProc = 0; +long g_lSelectItemHijackProc = 0; +long g_lIdentifyHijackProc = 0; +long g_lToolTextProc = 0; +long g_lToolText2Proc = 0; + +void (__fastcall *pfnOldChatMessage)(int _ecx, int _edx, char *, DWORD ) = NULL; +void (*pfnOldChatText)() = NULL; +void (*pfnUseItem)( DWORD, DWORD ) = NULL; +void (*pfnMoveItemEx)( DWORD, DWORD, DWORD ) = NULL; +void ( __fastcall *pfnInternalStringDestructor)( qString * ) = NULL; +long (*pfnSendMessageToID)( qString *, long ) = NULL; +long (*pfnSendMessageToName)( qString *, qString * ) = NULL; +long (*pfnSendMessageByMask)( long, qString * ) = NULL; +long (*pfnLocalChatText)( qString * ) = NULL; +long (*pfnLocalChatEmote)( qString * ) = NULL; +qString* ( __fastcall *pfnInternalStringConstructor)( qString *, long, char * ) = NULL; + +bool g_bTimestamp; +char *g_szTimestampFormat; +DWORD g_lTimestampColor; +char g_charBufferPreviousCall; + +extern void __fastcall OnChatMessage( int _ecx, int _edx, char* pText, long dwColor ); +extern void CatchToolText(); +extern void CatchToolTextAppend(); +extern void OnChatText(); + +extern void IdentifyShortcircuit(); +extern void SelectItemHook(); +extern void ObjectDestroyedHook(); +extern DWORD HookCall (DWORD dwCallAddress, DWORD dwReplacement); + +cACHooks::cACHooks() +{ + g_bTimestamp = false; + s_pACHooks = this; + m_bDecalRef = false; + m_bIdQueueRef = false; + m_bMismatch = true; + m_bPrevSelect = false; + m_bCurrentSelect = false; + m_bMouse = false; + m_bCastSpell = false; + m_bMoveItem = false; + m_bSelectItem = false; + m_bUseItem = false; + m_bAllYourBase = false; + m_bSetCombatState = false; + m_bCombatStateOffset = false; + m_bChatState = false; + m_bRequestID = false; + m_bStackCount = false; + m_bTestFormula = false; + m_bVendorID = false; + m_bBusyState = false; + m_bPointerState = false; + m_bMoveItemEx = false; + m_bFaceHeading = false; + m_bChatMessageAddy = false; + m_bSendMessageToID = false; + m_bSendMessageToName = false; + m_bSendMessageToMask = false; + m_bLocalChatText = false; + m_bLocalChatEmote = false; + m_bSetAutorun = false; + m_bGetVital = false; + m_bGetAttribute = false; + m_bGetSkill = false; + m_bLogout = false; + m_bSecureTrade_Add = false; + m_bSecureTrade_Add_Off1 = false; + m_bSecureTrade_Add_Off2 = false; + m_bGetSkillInfo = false; + m_bGetAttributeInfo = false; + m_bGetVitalInfo = false; + m_bSelectItemHook = false; + m_bUstAddItem_Useable = false; + m_bRequestShortcircuit = false; + m_bToolTextHook = false; + m_bToolText2Hook = false; + m_bIdleLoc = false; + + m_Hooks = 0; + memset(m_HooksEx, 0, sizeof(m_HooksEx)); + m_HookCount = 0; + + + USES_CONVERSION; + _bstr_t _Unnamed; + + + char szPath[ MAX_PATH ]; + DWORD dwCount = MAX_PATH; + + + g_charBufferPreviousCall = '\n'; + DWORD dwTimestamp = 0; + char szTimestampFormat[ MAX_PATH ]; + DWORD lTimestampFormatLength = MAX_PATH; + + RegKey key; + if( key.Open( HKEY_LOCAL_MACHINE, "SOFTWARE\\Decal", KEY_READ ) == ERROR_SUCCESS ) + { + if( key.QueryDWORDValue( _T("Timestamp"), dwTimestamp ) != ERROR_SUCCESS ) + dwTimestamp = 0; + + if( key.QueryStringValue( _T("TimestampFormat"), szTimestampFormat, &lTimestampFormatLength ) != ERROR_SUCCESS ) /* Heyus 21 March 2003 */ + memset( szTimestampFormat, 0, sizeof(szTimestampFormat) ), strncpy( szTimestampFormat, "[%H:%M]", sizeof( szTimestampFormat ) ); + + if( key.QueryDWORDValue( _T("TimestampColor"), g_lTimestampColor ) != ERROR_SUCCESS ) + g_lTimestampColor = 12; // Grey + + key.Close(); + } + + int iStrLen = strlen( szTimestampFormat ) + 2; + g_szTimestampFormat = new char[ iStrLen ]; + memset( g_szTimestampFormat, 0, iStrLen ); + _snprintf( g_szTimestampFormat, iStrLen, "%s ", szTimestampFormat ); + + // 0xFFFFFFFF = same color as chat text, for those that want time stamps but don't + // want to infringe upon their 300 max chat window items + + if( g_lTimestampColor < 0 || g_lTimestampColor > 22 && g_lTimestampColor != 0xFFFFFFFF ) + g_lTimestampColor = 12; // Grey + + g_bTimestamp = dwTimestamp ? true : false ; + + + + + TCHAR szFilename[ MAX_PATH ]; + ::GetModuleFileName( NULL, szFilename, MAX_PATH ); + LPTSTR strProcessName = ::_tcsrchr( szFilename, _T( '\\' ) ); + + strProcessName[ 7 ] = _T( '\0' ); + + if( ::_tcsicmp( strProcessName + 1, _T( "client" ) ) != 0 ) + return; + + + + + key.Open( HKEY_LOCAL_MACHINE, "SOFTWARE\\Decal\\Agent", KEY_READ ); + key.QueryStringValue( _T("AgentPath"), szPath, &dwCount ); + + strncat( szPath, "\\memlocs.xml", MAX_PATH ); + + MSXML::IXMLDOMDocumentPtr pMemLocDoc; + + pMemLocDoc.CreateInstance( __uuidof( MSXML::DOMDocument ) ); + pMemLocDoc->async = false; + + VARIANT_BOOL bSuccess = pMemLocDoc->load( szPath ); + if( ! bSuccess ) + { + std::string szXML; + DecryptXML( szPath, szXML ); + + if( szXML != "" ) + bSuccess = pMemLocDoc->loadXML( _bstr_t( szXML.c_str() ) ); + } + + if( bSuccess ) + { + MSXML::IXMLDOMElementPtr pNode = pMemLocDoc->selectSingleNode( BSTRT( "locations" ) ); + + long lVerMajor = 0, lVerMinor = 0, lVerRelease = 0; + _variant_t vVersion = pNode->getAttribute( BSTRT( "version" ) ); + + char *szTemp, *szVersion = OLE2A( vVersion.bstrVal ); + + // I'm tired and sscanf is crashing - this works even if it's lame + lVerMajor = atol( szVersion ); + szTemp = strstr( szVersion, "." ) + 1; + lVerMinor = atol( szTemp ); + szTemp = strstr( szTemp, "." ) + 1; + lVerRelease = atol( szTemp ); + + RegKey rk; + if( rk.Open( HKEY_LOCAL_MACHINE, _T( "Software\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00" ) ) == ERROR_SUCCESS ) + { + TCHAR szClientPath[ MAX_PATH ]; + DWORD dwPathLength = MAX_PATH; + if( rk.QueryStringValue ( _T( "path" ), szClientPath, &dwPathLength ) == ERROR_SUCCESS ) + { + ::_tcscpy( szClientPath + ( dwPathLength - 1 ), _T( "\\client.exe" ) ); + + DWORD dwDummy, + dwVerSize = ::GetFileVersionInfoSize( const_cast< LPTSTR > ( szClientPath ), &dwDummy ); + if( dwVerSize != 0 ) + { + BYTE *pbVersionInfo = reinterpret_cast< BYTE * >( ::_alloca( dwVerSize ) ); + + ::GetFileVersionInfo( const_cast< LPTSTR > ( szClientPath ), 0, dwVerSize, pbVersionInfo ); + + VS_FIXEDFILEINFO *vffi; + UINT nLength = sizeof( VS_FIXEDFILEINFO ); + if( ::VerQueryValue( pbVersionInfo, _T( "\\" ), reinterpret_cast< LPVOID * >( &vffi ), &nLength ) ) + { + if( (static_cast< long >( HIWORD( vffi->dwFileVersionMS ) ) == lVerMajor) && + (static_cast< long >( LOWORD( vffi->dwFileVersionMS ) ) == lVerMinor) && + (static_cast< long >( HIWORD( vffi->dwFileVersionLS ) ) == lVerRelease) ) + { + m_bMismatch = false; + } + } + } + } + } + + MSXML::IXMLDOMNodeListPtr pNodes = pMemLocDoc->selectNodes( BSTRT( "/locations/memloc" ) ); + + for( pNode = pNodes->nextNode(); pNode.GetInterfacePtr() != NULL; pNode = pNodes->nextNode() ) + { + _variant_t vName = pNode->getAttribute( _T( "name" ) ), vValue = pNode->getAttribute( _T( "value" ) ); + + sMemoryLocation loc; + + loc.Name = OLE2A( vName.bstrVal ); + loc.Location = wcstoul( vValue.bstrVal, 0, 16 ); + + m_mLocationList[ loc.Name ] = loc; + } + } + + long Val; + if( QueryMemLoc( BSTRT( "PrevItem1" ), &Val ) == S_OK ) + m_lPrevSelect[0] = Val; + if( QueryMemLoc( BSTRT( "PrevItem2" ), &Val ) == S_OK ) + { + m_lPrevSelect[1] = Val; + m_bPrevSelect = true; + m_Hooks |= ePrevSelect ; + } + + if( QueryMemLoc( BSTRT( "CurrentItem1" ), &Val ) == S_OK ) + m_lCurrentSelect[0] = Val; + if( QueryMemLoc( BSTRT( "CurrentItem2" ), &Val ) == S_OK ) + { + m_lCurrentSelect[1] = Val; + m_bCurrentSelect = true; + m_Hooks |= eCurrentSelect ; + } + + if( QueryMemLoc( BSTRT( "ChatMessage" ), &Val ) == S_OK ) + pfnOldChatMessage = reinterpret_cast< void (__fastcall*)( int, int, char *, DWORD ) >( Val ); + if( QueryMemLoc( BSTRT( "ChatMessageAddy" ), &Val ) == S_OK ) + { + m_lChatMessageAddy = Val; + m_bChatMessageAddy = true; + } + if( QueryMemLoc( BSTRT( "ChatText" ), &Val ) == S_OK ) + pfnOldChatText = reinterpret_cast< void (*)() >( Val ); + + + if( QueryMemLoc( BSTRT( "Mouse1X" ), &Val ) == S_OK ) + m_lMouse[0] = Val; + if( QueryMemLoc( BSTRT( "Mouse2X" ), &Val ) == S_OK ) + m_lMouse[1] = Val; + if( QueryMemLoc( BSTRT( "Mouse3X" ), &Val ) == S_OK ) + m_lMouse[2] = Val; + if( QueryMemLoc( BSTRT( "Mouse4X" ), &Val ) == S_OK ) + { + m_bMouse = true; + m_lMouse[3] = Val; + m_Hooks |= eMouse ; + } + + if( QueryMemLoc( BSTRT( "CastSpell" ), &Val ) == S_OK ) + { + m_bCastSpell = true; + m_Hooks |= eCastSpell ; + m_lCastSpell = Val; + } + + if( QueryMemLoc( BSTRT( "MoveItem" ), &Val ) == S_OK ) + { + m_bMoveItem = true; + m_Hooks |= eMoveItem ; + m_lMoveItem = Val; + } + + if( QueryMemLoc( BSTRT( "SelectItem" ), &Val ) == S_OK ) + { + m_bSelectItem = true; + m_Hooks |= eSelectItem ; + m_lSelectItem = Val; + } + + if( QueryMemLoc( BSTRT( "UseItem" ), &Val ) == S_OK ) + { + m_bUseItem = true; + m_Hooks |= eUseItem ; + SetHookEx( eUseItemRaw ); + SetHookEx( eUseFociSpell ); + m_lUseItem = Val; + pfnUseItem = reinterpret_cast< void (*)( DWORD, DWORD ) >( Val ); + } + + if( QueryMemLoc( BSTRT( "AllYourBase" ), &Val ) == S_OK ) + { + // The memloc formerly known as CombatState + m_bAllYourBase = true; + m_Hooks |= eCombatState ; + m_lAllYourBase = Val; + } + + if( QueryMemLoc( BSTRT( "SetCombatState" ), &Val ) == S_OK ) + { + m_bSetCombatState = true; + m_Hooks |= eSetCombatState ; + m_lSetCombatState = Val; + } + + if( QueryMemLoc( BSTRT( "CombatStateOffset" ), &Val ) == S_OK ) + { + m_bCombatStateOffset = true; + m_Hooks |= eCombatState ; + m_lCombatStateOffset = Val; + } + + if( QueryMemLoc( BSTRT( "ChatState" ), &Val ) == S_OK ) + { + m_bChatState = true; + m_Hooks |= eChatState ; + m_lChatState = Val; + } + + if( QueryMemLoc( BSTRT( "GetFellowStats" ), &Val ) == S_OK ) + { + m_bRequestID = true; + m_lRequestID = Val; + m_Hooks |= eGetFellowStats; + SetHookEx( eRequestID ); + } + + if( QueryMemLoc( BSTRT( "RequestID" ), &Val ) == S_OK ) + { + m_bRequestID = true; + m_lRequestID = Val; + m_Hooks |= eGetFellowStats; + SetHookEx( eRequestID ); + } + + if( QueryMemLoc( BSTRT( "NumStackItemsSelected" ), &Val ) == S_OK ) + { + m_bStackCount = true; + m_Hooks |= eStackCount ; + m_lStackCount = Val; + } + + if( QueryMemLoc( BSTRT( "TestFormula" ), &Val ) == S_OK ) + m_lTestFormula = Val; + if( QueryMemLoc( BSTRT( "TestFormulavtp" ), &Val ) == S_OK ) + { + m_bTestFormula = true; + m_Hooks |= eTestFormula ; + m_lTestFormulaVTable = Val; + } + + if( QueryMemLoc( BSTRT( "VendorID" ), &Val ) == S_OK ) + { + m_bVendorID = true; + m_Hooks |= eVendorID ; + m_lVendorID = Val; + } + + if( QueryMemLoc( BSTRT( "ItemBusyState" ), &Val ) == S_OK ) + { + m_bBusyState = true; + m_Hooks |= eBusyState ; + m_lBusyState = Val; + } + if( QueryMemLoc( BSTRT( "ItemBusyGUID" ), &Val ) == S_OK ) + { + m_bBusyStateID = true; + m_Hooks |= eBusyStateID ; + m_lBusyStateID = Val; + } + + if( QueryMemLoc( BSTRT( "PointerState" ), &Val ) == S_OK ) + { + m_bPointerState = true; + m_Hooks |= ePointerState ; + m_lPointerState = Val; + } + + if( QueryMemLoc( BSTRT( "MoveItemEx" ), &Val ) == S_OK ) + { + m_bMoveItemEx = true; + m_Hooks |= eMoveItemEx ; + m_lMoveItemEx = Val; + pfnMoveItemEx = reinterpret_cast< void (*)(DWORD, DWORD, DWORD) >( Val ); + } + + if( QueryMemLoc( BSTRT( "3DAreaWidth" ), &Val ) == S_OK ) + { + m_bArea3DWidth = true; + m_Hooks |= eArea3DWidth ; + m_lpArea3DWidth = reinterpret_cast< long * >( Val ); + } + + if( QueryMemLoc( BSTRT( "3DAreaHeight" ), &Val ) == S_OK ) + { + m_bArea3DHeight = true; + m_Hooks |= eArea3DHeight ; + m_lpArea3DHeight = reinterpret_cast< long * >( Val ); + } + + if( QueryMemLoc( BSTRT( "ObjectFromGUID" ), &Val ) == S_OK ) { + m_lObjectFromGuid = Val; + SetHookEx( eObjectFromGUID ); + if( QueryMemLoc( BSTRT( "ObjectFromGUIDClass" ), &Val ) == S_OK ) + { + m_lObjectFromGuidClass = Val; + SetHookEx( eObjectFromGUIDClass ); + m_bObjectFromGuid = true; + } + } + m_lMovementThingyParent = m_lMovementThingyOffset = m_lFaceHeading = 0; + + if( QueryMemLoc( BSTRT( "MovementThingyParent" ), &Val ) == S_OK) + { + m_lMovementThingyParent = Val; + } + + if( QueryMemLoc( BSTRT( "MovementThingyOffset" ), &Val ) == S_OK) + { + m_lMovementThingyOffset = Val; + } + + if( QueryMemLoc( BSTRT( "FaceHeading" ), &Val ) == S_OK) + { + m_lFaceHeading = Val; + } + + if( QueryMemLoc( BSTRT( "SetAutorun" ), &Val ) == S_OK) + { + m_lSetAutorun = Val; + } + + if (m_lMovementThingyParent && m_lMovementThingyOffset && m_lFaceHeading) + { + m_bFaceHeading = true; + + m_Hooks |= eFaceHeading; + } + + if (m_lMovementThingyParent && m_lMovementThingyOffset && m_lSetAutorun) + { + m_bSetAutorun = true; + + m_Hooks |= eSetAutorun; + } + + /* + // While the address of ObjectDestroyed is interesting, it isn't actually needed. + // We can't assume that the calls we're hooking call to this address, as they + // might have already been hooked! + if( QueryMemLoc( BSTRT( "ObjectDestroyed"), &Val ) == S_OK ) + { + } + */ + + long lCall1 = 0, lCall2 = 0; + if( QueryMemLoc( BSTRT( "ObjectDestroyed_Call1"), &Val ) == S_OK ) + { + lCall1 = Val; + } + + if( QueryMemLoc( BSTRT( "ObjectDestroyed_Call2"), &Val ) == S_OK ) + { + lCall2 = Val; + } + + if (lCall1 && lCall2) + { + DWORD dwFunc1 = HookCall (lCall1, (DWORD) ObjectDestroyedHook); + DWORD dwFunc2 = HookCall (lCall2, (DWORD) ObjectDestroyedHook); + + _ASSERTE (dwFunc1 && (dwFunc1 == dwFunc2)); + + if (dwFunc1 && (dwFunc1 != dwFunc2)) + { + // Doh, okay put them back, something's wrong. + HookCall (lCall1, dwFunc1); + HookCall (lCall2, dwFunc2); + } + else + { + m_Hooks |= eObjectDestroyed; + g_lObjectDestroyedProc = dwFunc1; + } + } + + if( QueryMemLoc( BSTRT( "InternalStringConstructor" ), &Val ) == S_OK) + { + m_bInternalStringConstructor = true; + m_lInternalStringConstructor = Val; + + pfnInternalStringConstructor = reinterpret_cast< qString *(__fastcall*)(qString *, long, char *) >( Val ); + } + + if( QueryMemLoc( BSTRT( "InternalStringDestructor" ), &Val ) == S_OK) + { + m_bInternalStringDestructor = true; + m_lInternalStringDestructor = Val; + + pfnInternalStringDestructor = reinterpret_cast< void(__fastcall *)(qString *) >( Val ); + } + + if( QueryMemLoc( BSTRT( "SendMessageToID" ), &Val ) == S_OK) + { + m_bSendMessageToID = true; + m_lSendMessageToID = Val; + + pfnSendMessageToID = reinterpret_cast< long(*)(qString *, long) >( Val ); + } + + if( QueryMemLoc( BSTRT( "SendMessageToName" ), &Val ) == S_OK) + { + m_bSendMessageToName = true; + m_lSendMessageToName = Val; + + pfnSendMessageToName = reinterpret_cast< long(*)(qString *, qString *) >( Val ); + } + + if( QueryMemLoc( BSTRT( "SendMessageToMask" ), &Val ) == S_OK) + { + m_bSendMessageToMask = true; + m_lSendMessageToMask = Val; + + pfnSendMessageByMask = reinterpret_cast< long(*)( long, qString * ) >( Val ); + } + + if( QueryMemLoc( BSTRT( "LocalChatText" ), &Val ) == S_OK) + { + m_bLocalChatText = true; + m_lLocalChatText = Val; + + pfnLocalChatText = reinterpret_cast< long(*)(qString *) >( Val ); + } + + if( QueryMemLoc( BSTRT( "LocalChatEmote" ), &Val ) == S_OK) + { + m_bLocalChatEmote = true; + m_lLocalChatEmote = Val; + + pfnLocalChatEmote = reinterpret_cast< long(*)(qString *) >( Val ); + } + + if( m_bInternalStringConstructor && m_bInternalStringDestructor && m_bSendMessageToID ) + m_Hooks |= eSendTell; + + if( m_bInternalStringConstructor && m_bInternalStringDestructor && m_bSendMessageToName ) + m_Hooks |= eSendTellEx; + + if( m_bInternalStringConstructor && m_bInternalStringDestructor && m_bLocalChatText ) + m_Hooks |= eLocalChatText; + + if( m_bInternalStringConstructor && m_bInternalStringDestructor && m_bLocalChatEmote ) + m_Hooks |= eLocalChatEmote; + + if( m_bInternalStringConstructor && m_bInternalStringDestructor && m_bSendMessageToMask ) + SetHookEx( eSendMessageByMask ); + + if( QueryMemLoc( BSTRT( "VitalBase" ), &Val ) == S_OK ) + { + m_lVitalBase = Val; + } + + if( QueryMemLoc( BSTRT( "GetVital" ), &Val ) == S_OK ) + { + m_lGetVital = Val; + m_bGetVital = true; + } + + if( QueryMemLoc( BSTRT( "GetAttribute" ), &Val ) == S_OK ) + { + m_lGetAttribute = Val; + m_bGetAttribute = true; + } + + if( QueryMemLoc( BSTRT( "GetSkill" ), &Val ) == S_OK ) + { + m_lGetSkill = Val; + m_bGetSkill = true; + } + + if( m_lVitalBase ) + { + if( m_bGetVital ) + m_Hooks |= eGetVital; + + if( m_bGetAttribute ) + m_Hooks |= eGetAttribute; + + if( m_bGetSkill ) + m_Hooks |= eGetSkill; + } + + if( QueryMemLoc( BSTRT( "Logout" ), &Val ) == S_OK ) + { + m_lLogout = Val; + m_bLogout = true; + SetHookEx(eLogout); + } + + if (QueryMemLoc(BSTRT( "SecureTrade_Add" ), &Val) == S_OK) + { + m_lSecureTrade_Add = Val; + m_bSecureTrade_Add = true; + } + + if (QueryMemLoc(BSTRT( "SecureTrade_Add_Off1" ), &Val) == S_OK) + { + m_lSecureTrade_Add_Off1 = Val; + m_bSecureTrade_Add_Off1 = true; + } + + if (QueryMemLoc(BSTRT( "SecureTrade_Add_Off2" ), &Val) == S_OK) + { + m_lSecureTrade_Add_Off2 = Val; + m_bSecureTrade_Add_Off2 = true; + } + + if (m_bSecureTrade_Add && m_bSecureTrade_Add_Off1 && m_bSecureTrade_Add_Off2 && m_bAllYourBase) + { + SetHookEx(eSecureTrade_Add); + } + + + if (QueryMemLoc(BSTRT( "GetSkillInfo" ), &Val) == S_OK) + { + m_lGetSkillInfo = Val; + m_bGetSkillInfo = true; + } + + if (QueryMemLoc(BSTRT( "GetVitalInfo" ), &Val) == S_OK) + { + m_lGetVitalInfo = Val; + m_bGetVitalInfo = true; + } + + if (QueryMemLoc(BSTRT( "GetAttributeInfo" ), &Val) == S_OK) + { + m_lGetAttributeInfo = Val; + m_bGetAttributeInfo = true; + } + + + /* I don't believe the vTable is used for any of these, however, if it becomes necessary + the functionality is here to a) detect the problem (crash at 0xFF......), and fix it + without requiring a complete update to Decal */ + if (QueryMemLoc(BSTRT( "GetSkillInfo_vT" ), &Val) == S_OK) + { + m_lGetSkillInfo_vT = Val; + } + else + { + m_lGetSkillInfo_vT = 0xFF111111; + } + + if (QueryMemLoc(BSTRT( "GetVitalInfo_vT" ), &Val) == S_OK) + { + m_lGetVitalInfo_vT = Val; + } + else + { + m_lGetVitalInfo_vT = 0xFF222222; + } + + if (QueryMemLoc(BSTRT( "GetAttributeInfo_vT" ), &Val) == S_OK) + { + m_lGetAttributeInfo_vT = Val; + } + else + { + m_lGetAttributeInfo_vT = 0xFF333333; + } + + if (m_lVitalBase) { + if (m_bGetSkillInfo) { + SetHookEx(eSkillInfo); + } + if (m_bGetVitalInfo) { + SetHookEx(eVitalInfo); + } + if (m_bGetAttributeInfo) { + SetHookEx(eAttributeInfo); + } + } + + if (QueryMemLoc(BSTRT( "ToolTextHJ" ), &Val) == S_OK) + { + m_lToolTextHJ = Val; + + g_lToolTextProc = HookCall( m_lToolTextHJ, (DWORD)CatchToolText ); + + SetHookEx( eToolText ); + m_bToolTextHook = true; + } + + if (QueryMemLoc(BSTRT( "ToolText2HJ" ), &Val) == S_OK) + { + m_lToolText2HJ = Val; + + g_lToolText2Proc = HookCall( m_lToolText2HJ, (DWORD)CatchToolTextAppend ); + + SetHookEx( eToolText2 ); + m_bToolText2Hook = true; + } + + DWORD dwOldProtect; + if( QueryMemLoc( BSTRT( "OnChatText" ), &Val ) == S_OK ) + { + VirtualProtect( reinterpret_cast< void * >( Val ), 4, PAGE_EXECUTE_READWRITE, &dwOldProtect ); + *reinterpret_cast< long * >( Val ) = ( reinterpret_cast< long >( OnChatText ) - ( Val + 0x4 ) ); + } + + if( QueryMemLoc( BSTRT( "OnChatMessage" ), &Val ) == S_OK ) + { + VirtualProtect( reinterpret_cast< void * >( Val ), 4, PAGE_EXECUTE_READWRITE, &dwOldProtect ); + *reinterpret_cast< long * >( Val ) = ( reinterpret_cast< long >( OnChatMessage ) - ( Val + 0x4 ) ); + } + + m_Hooks |= eHooksAvailEx; + + if( QueryMemLoc( BSTRT( "SelectItemHook" ), &Val ) == S_OK ) + { + m_lSelectItemHook = Val; + m_bSelectItemHook = true; + g_lSelectItemHijackProc = HookCall( m_lSelectItemHook, (DWORD) SelectItemHook ); + SetHookEx( eOnSelectItemEvent ); + } + + + bool m_bUstAddItem = false; + bool m_bUstAddItem_Off1 = false; + bool m_bUstAddItem_Off2 = false; + if (QueryMemLoc(BSTRT( "UstAddItem" ), &Val) == S_OK) + { + m_lUstAddItem = Val; + m_bUstAddItem = true; + } + + if (QueryMemLoc(BSTRT( "UstAddItem_Off1" ), &Val) == S_OK) + { + m_lUstAddItem_Off1 = Val; + m_bUstAddItem_Off1 = true; + } + + if (QueryMemLoc(BSTRT( "UstAddItem_Off2" ), &Val) == S_OK) + { + m_lUstAddItem_Off2 = Val; + m_bUstAddItem_Off2 = true; + } + + if (m_bUstAddItem && m_bUstAddItem_Off1 && m_bUstAddItem_Off2 && m_bChatMessageAddy) + { + SetHookEx(eUstAddItem); + m_bUstAddItem_Useable = true; + } + + m_lRequestShortcircuit1 = 0; + m_lRequestShortcircuit2 = 0; + m_lRequestShortcircuit3 = 0; + + if( QueryMemLoc( BSTRT( "RequestShortcircuit1" ), &Val ) == S_OK ) + m_lRequestShortcircuit1 = Val; + if( QueryMemLoc( BSTRT( "RequestShortcircuit2" ), &Val ) == S_OK ) + m_lRequestShortcircuit2 = Val; + if( QueryMemLoc( BSTRT( "RequestShortcircuit3" ), &Val ) == S_OK ) + m_lRequestShortcircuit3 = Val; + + if( m_lRequestShortcircuit1 && m_lRequestShortcircuit2 && m_lRequestShortcircuit3 ) + { + DWORD dwHook1 = HookCall( m_lRequestShortcircuit1, (DWORD) IdentifyShortcircuit ); + DWORD dwHook2 = HookCall( m_lRequestShortcircuit2, (DWORD) IdentifyShortcircuit ); + DWORD dwHook3 = HookCall( m_lRequestShortcircuit3, (DWORD) IdentifyShortcircuit ); + + if( dwHook1 && dwHook2 && dwHook3 && (dwHook1 == dwHook2) && (dwHook2 == dwHook3) ) + { + m_bRequestShortcircuit = true; + g_lIdentifyHijackProc = dwHook1; + } + + else + { + // Something's wrong. + HookCall( m_lRequestShortcircuit1, dwHook1 ); + HookCall( m_lRequestShortcircuit2, dwHook2 ); + HookCall( m_lRequestShortcircuit3, dwHook3 ); + } + } + + if( QueryMemLoc( BSTRT( "IdleTime" ), &Val ) == S_OK ) + { + m_lIdleLoc = Val; + m_bIdleLoc = true; + SetHookEx( eSetIdleTime ); + } + + if( QueryMemLoc( BSTRT( "SlashDay" ), &Val ) == S_OK ) + { + m_lSlashDay = Val; + m_bSlashDay = true; + SetHookEx( eSetDay ); + } +} + +cACHooks::~cACHooks() +{ + _bstr_t _Unnamed; + + delete [] g_szTimestampFormat; + + long Val, lCall1 = 0, lCall2 = 0; + if( QueryMemLoc( BSTRT( "ObjectDestroyed_Call1"), &Val ) == S_OK ) + { + lCall1 = Val; + } + + if( QueryMemLoc( BSTRT( "ObjectDestroyed_Call2"), &Val ) == S_OK ) + { + lCall2 = Val; + } + + if (lCall1 && lCall2) + { + HookCall( lCall1, g_lObjectDestroyedProc ); + HookCall( lCall2, g_lObjectDestroyedProc ); + } + + if( m_bRequestShortcircuit ) + { + HookCall( m_lRequestShortcircuit1, g_lIdentifyHijackProc ); + HookCall( m_lRequestShortcircuit2, g_lIdentifyHijackProc ); + HookCall( m_lRequestShortcircuit3, g_lIdentifyHijackProc ); + } + + if( m_bToolTextHook ) + { + HookCall( m_lToolTextHJ, g_lToolTextProc ); + } + + if( m_bToolText2Hook ) + { + HookCall( m_lToolText2HJ, g_lToolText2Proc ); + } + + s_pACHooks = NULL; + g_lObjectDestroyedProc = 0; + + if( m_bDecalRef ) + m_pDecal.Release(); + + if( m_bIdQueueRef ) + m_pIdQueue.Release(); +} + +void cACHooks::DecryptXML( const char *szPath, std::string &szXML ) +{ + if( szPath == NULL ) + { + szXML = ""; + return; + } + + FILE *f = fopen( szPath, "rb" ); + if( f == NULL ) + { + szXML = ""; + return; + } + + szXML.clear(); + unsigned char szBuffer[1025]; + + try + { + CCryptProv crypt; + if( crypt.Initialize( PROV_RSA_FULL, "Decal_Memlocs", MS_DEF_PROV ) == NTE_BAD_KEYSET ) + crypt.Initialize( PROV_RSA_FULL, "Decal_Memlocs", MS_DEF_PROV, CRYPT_NEWKEYSET ); + + CCryptMD5Hash hash; + hash.Initialize( crypt ); + hash.AddString( DECAL_KEY ); + + CCryptDerivedKey key; + key.Initialize( crypt, hash ); + + DWORD dwDecLen = 0; + + while( ! feof(f) ) + { + memset( szBuffer, 0, sizeof( szBuffer ) ); + dwDecLen = fread( szBuffer, 1, 1024, f ); + key.Decrypt( feof(f), (BYTE *) szBuffer, &dwDecLen ); + szXML += (char *)szBuffer; + } + + key.Destroy(); + hash.Destroy(); + crypt.Release(); + } + + catch( ... ) + { + // crap... + szXML = ""; + } + + fclose( f ); +} + +STDMETHODIMP cACHooks::SetDecal( IUnknown *pDecal ) +{ + if( m_bDecalRef ) + { + m_pDecal.Release(); + m_bDecalRef = false; + } + + if( pDecal->QueryInterface( __uuidof( IDecal ), reinterpret_cast< void ** >( &m_pDecal ) ) == S_OK ) + m_bDecalRef = true; + + return S_OK; +} + +STDMETHODIMP cACHooks::QueryMemLoc(BSTR bstrName, long *pVal) +{ + USES_CONVERSION; + + if( m_bMismatch ) + { + *pVal = NULL; + return S_FALSE; + } + + std::string queryName = OLE2A( bstrName ); + + LocMap::iterator i = m_mLocationList.find( queryName ); + if( i != m_mLocationList.end() ) + { + *pVal = i->second.Location; + return S_OK; + } + + return S_FALSE; +} + +STDMETHODIMP cACHooks::get_CurrentSelection( long *pVal ) +{ + if( !m_bCurrentSelect ) + return S_FALSE; + + *pVal = *( reinterpret_cast< long * >( m_lCurrentSelect[0] ) ); + + return S_OK; +} + +STDMETHODIMP cACHooks::put_CurrentSelection(long newVal) +{ + if( !m_bCurrentSelect ) + return S_FALSE; + + *( reinterpret_cast< long * >( m_lCurrentSelect[0] ) ) = newVal; + *( reinterpret_cast< long * >( m_lCurrentSelect[1] ) ) = newVal; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_PreviousSelection(long *pVal) +{ + if( !m_bPrevSelect ) + return S_FALSE; + + *pVal = *( reinterpret_cast< long * >( m_lPrevSelect[0] ) ); + + return S_OK; +} + +STDMETHODIMP cACHooks::put_PreviousSelection(long newVal) +{ + if( !m_bPrevSelect ) + return S_FALSE; + + *( reinterpret_cast< long * >( m_lPrevSelect[0] ) ) = newVal; + *( reinterpret_cast< long * >( m_lPrevSelect[1] ) ) = newVal; + + return S_OK; +} + +/* Heyus - 23 March 2003 */ +// Should be the method by which all functions write text to the chat window +// Writes raw text (does not append \n). chatMessageArg1 and 2 are the first two +// arguments you normally pass to pfnOldChatMessage. THIS SHOULD NOT BE CALLED BY +// PLUGINS/FILTERS UNLESS ABSOLUTELY NECESSARY. +// Will implement IKitchenSink later +void InternalRawWriteToChat( char* pText, long lColor, int chatMessageArg1, int chatMessageArg2 ) +{ + if( pText == NULL ) + return; + + if( g_bTimestamp ) + { + bool bDoTimeStamp = (g_charBufferPreviousCall == '\n') ? true : false; + int iStrLen = strlen( pText ); + + char *szTimeStamp = new char[ iStrLen + 2 ]; + memset( szTimeStamp, 0, iStrLen + 2 ); + + // Copy into a larger buffer to accomodate a possible \n + // If i were more awake, I'd see if this could just be replaced with + // g_charBufferPreviousCall = pText[strlen(pText)] + int iOffset = 0; + char *szTemp = pText; + while( *szTemp != 0 ) + { + szTimeStamp[ iOffset++ ] = *szTemp; + g_charBufferPreviousCall = *szTemp; + szTemp++; + } + + // Format a time stamp + char szFormattedTimestamp[ MAX_PATH ]; + memset( szFormattedTimestamp, 0, MAX_PATH ); + + time_t stTmpTime; + time( &stTmpTime ); + + tm *tmTime = localtime( &stTmpTime ); + long lFormattedStampLength = (long) strftime( szFormattedTimestamp, MAX_PATH, g_szTimestampFormat, tmTime ); + + while( *szTimeStamp != NULL && *szTimeStamp == '\n' ) + { + pfnOldChatMessage( chatMessageArg1, chatMessageArg2, "\n", lColor ); + g_charBufferPreviousCall = '\n'; + *szTimeStamp++; + } + + char* szToken = strtok( szTimeStamp, _T( "\n" ) ); + + char* toWrite; + + if( g_lTimestampColor != 0xFFFFFFFF ) + lFormattedStampLength = 0; + + while( szToken != NULL ) + { + int len = strlen( szToken ) + lFormattedStampLength + 3; + toWrite = new char[ len ]; + memset( toWrite, 0, len ); + + if( bDoTimeStamp ) + { + if( g_lTimestampColor == 0xFFFFFFFF ) + toWrite = strcat( toWrite, szFormattedTimestamp ); + else + pfnOldChatMessage( chatMessageArg1, chatMessageArg2, szFormattedTimestamp, g_lTimestampColor ); + } + + toWrite = strcat( toWrite, szToken ); + + char* nextToken = strtok( NULL, "\n" ); + if( nextToken != NULL || pText[strlen(pText)-1] == '\n' ) + toWrite = strcat( toWrite, "\n" ); + + pfnOldChatMessage( chatMessageArg1, chatMessageArg2, toWrite, lColor ); + szToken = nextToken; + + delete[] toWrite; + } + + delete[] szTimeStamp; + } + + else + pfnOldChatMessage( chatMessageArg1, chatMessageArg2, pText, lColor ); + + return; +} + +STDMETHODIMP cACHooks::ChatOut(BSTR szText, long lColor) +{ + if( pfnOldChatMessage == NULL ) + return S_FALSE; + + DWORD *Addy = reinterpret_cast< DWORD * > ( m_lChatMessageAddy ); + if( *Addy == NULL ) + return S_FALSE; + + USES_CONVERSION; + + char *strText = OLE2A( szText ); + + if( strText == NULL ) + return S_FALSE; + + int iStrLen = strlen( strText ); + + int iOffset = 0; + char* szTemp = new char[iStrLen + 2]; + memset( szTemp, 0, iStrLen+2 ); + strncpy( szTemp, strText, iStrLen + 2 ); + strncat( szTemp, "\n", iStrLen + 2 ); + InternalRawWriteToChat( szTemp, lColor, *Addy, 0 ); + + return S_OK; +} + +/* Heyus - 23 Mar 2003 - Fixed to point to the new universal function */ +STDMETHODIMP cACHooks::RawChatOut(BSTR szText, long lColor) +{ + if( pfnOldChatMessage == NULL ) + return S_FALSE; + + DWORD *Addy = reinterpret_cast< DWORD * > ( m_lChatMessageAddy ); + if( *Addy == NULL ) + return S_FALSE; + + USES_CONVERSION; + + char *strText = OLE2A( szText ); + + InternalRawWriteToChat( strText, lColor, *Addy, 0 ); + return S_OK; +} + +STDMETHODIMP cACHooks::SetCursorPosition(long lX, long lY) +{ + if( !m_bMouse ) + return S_FALSE; + + for( int i = 0; i < 4; i++ ) + { + *(reinterpret_cast< long * >( m_lMouse[i] ) ) = lX; + *(reinterpret_cast< long * >( m_lMouse[i] + 4 ) ) = lY; + } + + SetCursorPos( lX, lY ); + + for( i = 0; i < 4; i++ ) + { + *(reinterpret_cast< long * >( m_lMouse[i] ) ) = lX; + *(reinterpret_cast< long * >( m_lMouse[i] + 4 ) ) = lY; + } + + return S_OK; +} + +STDMETHODIMP cACHooks::CastSpell(long lSpellID, long lObjectID) +{ + if( !m_bCastSpell ) + return S_FALSE; + + long lCombatState = 4; + if( get_CombatState( &lCombatState ) == S_OK ) + { + if( lCombatState != 4 ) //Must be in MAGIC MODE + return S_FALSE; + } + + long lCurrentSelect; + get_CurrentSelection( &lCurrentSelect ); + put_CurrentSelection( lObjectID ); + + typedef void(*CastPtr)( long ); + CastPtr pCast = reinterpret_cast< CastPtr >( m_lCastSpell ); + pCast( lSpellID ); + + put_CurrentSelection( lCurrentSelect ); + + return S_OK; +} + +STDMETHODIMP cACHooks::MoveItem(long lObjectID, long lPackID, long lSlot, VARIANT_BOOL bStack) +{ + if( !m_bMoveItem ) + return S_FALSE; + + long lStack = 0; + if( bStack == VARIANT_TRUE ) + lStack = 1; + + typedef void(*MovePtr)( long, long, long, long ); + MovePtr pMove = reinterpret_cast< MovePtr >( m_lMoveItem ); + pMove( lObjectID, lPackID, lSlot, lStack ); + + return S_OK; +} + +STDMETHODIMP cACHooks::SelectItem(long lObjectID) +{ + if( !m_bSelectItem ) + return S_FALSE; + + typedef void(*SelectPtr)( long ); + SelectPtr pSelect = reinterpret_cast< SelectPtr >( m_lSelectItem ); + pSelect( lObjectID ); + + return S_OK; +} + +STDMETHODIMP cACHooks::UseItem(long lObjectID, long lUseState) +{ + if( !m_bUseItem ) + return S_FALSE; + + __asm + { + push 0x0 + push lUseState + push lObjectID + call pfnUseItem + add esp, 0x0C + } + + return S_OK; +} + +STDMETHODIMP cACHooks::UseItemRaw(long lObjectID, long lUseState, long lUseMethod) +{ + if( !m_bUseItem ) + return S_FALSE; + + __asm + { + push lUseMethod + push lUseState + push lObjectID + call pfnUseItem + add esp, 0x0C + } + + return S_OK; +} + +STDMETHODIMP cACHooks::UseFociSpell(long UseThis, long OnThis) +{ + if( !m_bUseItem ) + return S_FALSE; + + long lCurrentSelected; + get_CurrentSelection( &lCurrentSelected ); + put_CurrentSelection( OnThis ); + + __asm + { + push 0x1 + push 0x1 + push UseThis + call pfnUseItem + add esp, 0x0C + } + + put_CurrentSelection( lCurrentSelected ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_CombatState(long *pVal) +{ + if( !m_bAllYourBase ) + return S_FALSE; + + if( !m_bCombatStateOffset ) + return S_FALSE; + + *pVal = *(reinterpret_cast< long * >( (*reinterpret_cast< char ** >( m_lAllYourBase )) + m_lCombatStateOffset )); + + return S_OK; +} + +STDMETHODIMP cACHooks::SetCombatState(long pVal) +{ + if( !m_bSetCombatState ) + return S_FALSE; + + if( (pVal < 1) || (pVal > 4) ) + return E_INVALIDARG; + + typedef void(__fastcall *SetCombatStatePtr)( long, long, long, long ); + SetCombatStatePtr pSetCState = reinterpret_cast< SetCombatStatePtr >( m_lSetCombatState ); + pSetCState( *( reinterpret_cast< long * >( m_lAllYourBase ) ), 0, pVal, 1 ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_ChatState(VARIANT_BOOL *pVal) +{ + if( !m_bChatState ) + return S_FALSE; + + long *pChatState = reinterpret_cast< long * >( m_lChatState ); + if( m_bDecalRef ) + { + CComPtr< IPSite > pSite; + if( m_pDecal->get_Object( _bstr_t( "services\\DecalPlugins.InjectService\\site" ), __uuidof( IPSite ), reinterpret_cast< void ** >( &pSite ) ) == S_OK ) + { + if( pSite->get_Focus( pVal ) != S_OK ) + *pVal = *pChatState ? VARIANT_TRUE : VARIANT_FALSE; + else + *pVal = (*pChatState || (*pVal == VARIANT_TRUE) ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; + } + + else + *pVal = *pChatState ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; + } + + *pVal = *pChatState ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cACHooks::UseItemEx(long UseThis, long OnThis) +{ + if( !m_bUseItem ) + return S_FALSE; + + long lCurrentSelected; + get_CurrentSelection( &lCurrentSelected ); + put_CurrentSelection( OnThis ); + + UseItem( UseThis, 1 ); + + put_CurrentSelection( lCurrentSelected ); + + return S_OK; +} + +STDMETHODIMP cACHooks::GetFellowStats(long lCharID) +{ + return IDQueueAdd( lCharID ); +} + +STDMETHODIMP cACHooks::get_SelectedStackCount(long lStackCount, long *pVal) +{ + if( !m_bStackCount ) + return S_FALSE; + + *pVal = *( reinterpret_cast< long * >( m_lStackCount ) ); + + return S_OK; +} + +STDMETHODIMP cACHooks::put_SelectedStackCount(long lStackCount, long newVal) +{ + if( !m_bStackCount ) + return S_FALSE; + + *( reinterpret_cast< long * >( m_lStackCount ) ) = newVal; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_VendorID(long *pVal) +{ + if( !m_bVendorID ) + return S_FALSE; + + *pVal = *( reinterpret_cast< long * >( m_lVendorID ) ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_BusyState(long *pVal) +{ + if( !m_bBusyState ) + return S_FALSE; + + *pVal = *( reinterpret_cast< long * >( m_lBusyState ) ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_BusyStateID(long *pVal) +{ + if( !m_bBusyStateID ) + return S_FALSE; + + *pVal = *( reinterpret_cast< long * >( m_lBusyStateID ) ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_PointerState(long *pVal) +{ + if( !m_bPointerState ) + return S_FALSE; + + *pVal = *( reinterpret_cast< long * >( m_lPointerState ) ); + + return S_OK; +} + +STDMETHODIMP cACHooks::MoveItemEx(long lObjectID, long lDestinationID) +{ + if( !m_bMoveItemEx ) + return S_FALSE; + + __asm + { + push 0x0 + push lDestinationID + push lObjectID + call pfnMoveItemEx + add esp, 0x0C + } + + return S_OK; +} + +long* cACHooks::GetCs(long offs) +{ + if (!m_bAllYourBase) { + return NULL ; + } + // follow multiple indirection from m_lCombatState to the + long *rv = reinterpret_cast< long * >( m_lAllYourBase ); + if (*rv) rv = reinterpret_cast< long * >( *rv + 0xE4 ); + if (*rv) rv = reinterpret_cast< long * >( *rv + 0x160 ); + if (*rv) rv = reinterpret_cast< long * >( *rv + offs); + return rv ; +} + +STDMETHODIMP cACHooks::get_Heading(double *pVal) +{ + HRESULT rv = S_OK ; + if (!m_bAllYourBase) { + *pVal = 0.0 ; + return S_FALSE ; + } + long* pX = GetCs(0x6C) ; + long* pY = GetCs(0x70) ; + float fHeadingX(0) ; + float fHeadingY(0) ; + if (pX) { + fHeadingX = *(reinterpret_cast< float * >(pX)) ; + } else { + rv = S_FALSE ; + } + if (pY) { + fHeadingY = *(reinterpret_cast< float * >(pY)) ; + } else { + rv = S_FALSE ; + } + + long lCardinal = 0; + + if( (fHeadingX > 0) && (fHeadingY > 0) ) + lCardinal = 90; + if( (fHeadingX < 0) && (fHeadingY < 0) ) + lCardinal = 270; + if( (fHeadingX < 0) && (fHeadingY > 0) ) + lCardinal = 270; + if( (fHeadingX > 0) && (fHeadingY < 0) ) + lCardinal = 450; + + *pVal = fabs( atan( fHeadingY / fHeadingX ) * 180 / 3.14159265358979323846 - 450 + lCardinal ); + + return rv; +} + +STDMETHODIMP cACHooks::get_Landblock(long *pVal) +{ + HRESULT rv = S_OK ; + *pVal = 0 ; + if (!m_bAllYourBase) { + return S_FALSE ; + } + long *cs = GetCs(0x4C) ; + + if (cs) { + *pVal = *cs ; + } else { + *pVal = rv ; + } + + return rv; +} + +STDMETHODIMP cACHooks::get_LocationX(double *pVal) +{ + HRESULT rv = S_OK ; + if (!m_bAllYourBase) { + *pVal = 0 ; + return S_FALSE ; + } + long* cs = GetCs(0x50) ; + float val(0) ; + + if (cs) { + val = *(reinterpret_cast< float * >(cs)); + } else { + rv = S_FALSE ; + } + *pVal = double(val) ; + + return rv; +} + +STDMETHODIMP cACHooks::get_LocationY(double *pVal) +{ + HRESULT rv = S_OK ; + if (!m_bAllYourBase) { + *pVal = 0 ; + return S_FALSE ; + } + long* cs = GetCs(0x54) ; + float val(0) ; + + if (cs) { + val = *(reinterpret_cast< float * >(cs)); + } else { + rv = S_FALSE ; + } + *pVal = double(val) ; + + return rv; +} + +STDMETHODIMP cACHooks::get_LocationZ(double *pVal) +{ + HRESULT rv = S_OK ; + if (!m_bAllYourBase) { + *pVal = 0 ; + return S_FALSE ; + } + long* cs = GetCs(0x58) ; + float val(0) ; + + if (cs) { + val = *(reinterpret_cast< float * >(cs)); + } else { + rv = S_FALSE ; + } + *pVal = double(val) ; + + return rv ; +} + +STDMETHODIMP cACHooks::get_HooksAvail(long *pVal) { + *pVal = m_Hooks ; + return S_OK ; +} + +STDMETHODIMP cACHooks::DropItem(long lObjectID) +{ + if( !m_bMoveItemEx ) + return S_FALSE; + + __asm + { + push 0x1 + push 0x0 + push lObjectID + call pfnMoveItemEx + add esp, 0x0C + } + + return S_OK; +} + +// Turn to a particular heading, discovered by Madar on 8/25/2002 +STDMETHODIMP cACHooks::FaceHeading (float fHeading, VARIANT_BOOL bUnknown, VARIANT_BOOL *pRetval) +{ + if (!m_bFaceHeading) + { + *pRetval = VARIANT_FALSE; + return S_FALSE; + } + + DWORD dwTemp = m_lFaceHeading; + + DWORD ** pTemp = (DWORD **) m_lMovementThingyParent; + + DWORD dwMovementThingy = pTemp[0][m_lMovementThingyOffset]; + long lResult = 0; + + DWORD dwSecondArg = (bUnknown == VARIANT_TRUE) ? 1 : 0; + + __asm + { + mov ecx,dwMovementThingy + push dwSecondArg + push fHeading + call dwTemp + mov lResult, eax + } + + *pRetval = lResult ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +// Set auto-run, discovered by Madar on 9/16/2002 +STDMETHODIMP cACHooks::SetAutorun (VARIANT_BOOL bOnOff) +{ + if (!m_bSetAutorun) + { + return S_FALSE; + } + + DWORD dwTemp = m_lSetAutorun; + + DWORD ** pTemp = (DWORD **) m_lMovementThingyParent; + + DWORD dwMovementThingy = pTemp[0][m_lMovementThingyOffset]; + + long lFirstArg = (bOnOff == VARIANT_TRUE) ? 1 : 0; + long lUnknown = 1; + + __asm + { + mov ecx,dwMovementThingy + push lUnknown + push lFirstArg + call dwTemp + } + + return S_OK; +} + +STDMETHODIMP cACHooks::ItemIsKnown(long lGUID, VARIANT_BOOL* pRetval) +{ + if (!m_bObjectFromGuid) + { + *pRetval = VARIANT_FALSE; + return S_FALSE; + } + + DWORD dwTemp = m_lObjectFromGuid ; + DWORD dwClass = *((DWORD*) m_lObjectFromGuidClass); + + long lResult = 0; + + __asm + { + mov ecx,dwClass + push lGUID + call dwTemp + mov lResult, eax + } + + *pRetval = lResult ? VARIANT_TRUE : VARIANT_FALSE; + return S_OK; +} + + + +STDMETHODIMP cACHooks::get_Area3DWidth(long *pVal) +{ + if( !m_bArea3DWidth ) + return S_FALSE; + + *pVal = *m_lpArea3DWidth; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_Area3DHeight(long *pVal) +{ + if( !m_bArea3DHeight ) + return S_FALSE; + + *pVal = *m_lpArea3DHeight; + + return S_OK; +} + +STDMETHODIMP cACHooks::SendTell( long lPlayerID, BSTR Message ) +{ + if( !(m_bInternalStringConstructor && m_bInternalStringDestructor && m_bSendMessageToID) ) + return S_FALSE; + + USES_CONVERSION; + char *szText = OLE2A( Message ); + + long retval; + qString Msg; + pfnInternalStringConstructor( &Msg, 0, szText ); + retval = pfnSendMessageToID( &Msg, lPlayerID ); + pfnInternalStringDestructor( &Msg ); + + return S_OK; +} + +STDMETHODIMP cACHooks::SendTellEx( BSTR Name, BSTR Message ) +{ + if( !(m_bInternalStringConstructor && m_bInternalStringDestructor && m_bSendMessageToName) ) + return S_FALSE; + + USES_CONVERSION; + char *szName = OLE2A( Name ); + char *szText = OLE2A( Message ); + + long retval; + qString qSName; + qString qSMsg; + pfnInternalStringConstructor( &qSMsg, 0, szText ); + pfnInternalStringConstructor( &qSName, 0, szName ); + retval = pfnSendMessageToName( &qSMsg, &qSName ); + pfnInternalStringDestructor( &qSMsg ); + pfnInternalStringDestructor( &qSName ); + + return S_OK; +} + +STDMETHODIMP cACHooks::LocalChatText(BSTR Text) +{ + if( !(m_bInternalStringConstructor && m_bInternalStringDestructor && m_bLocalChatText) ) + return S_FALSE; + + USES_CONVERSION; + char *szText = OLE2A( Text ); + + qString qSText; + + pfnInternalStringConstructor( &qSText, 0, szText ); + pfnLocalChatText( &qSText ); + pfnInternalStringDestructor( &qSText ); + + return S_OK; +} + +STDMETHODIMP cACHooks::LocalChatEmote(BSTR EmoteText) +{ + if( !(m_bInternalStringConstructor && m_bInternalStringDestructor && m_bLocalChatEmote) ) + return S_FALSE; + + USES_CONVERSION; + char *szText = OLE2A( EmoteText ); + + qString qSText; + + pfnInternalStringConstructor( &qSText, 0, szText ); + pfnLocalChatEmote( &qSText ); + pfnInternalStringDestructor( &qSText ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_Vital(long Vital, long* pVal) +{ + if( !(m_bGetVital && m_lVitalBase) ) + return S_FALSE; + + if( (Vital < 1) || (Vital > 9) ) + return E_INVALIDARG; + + long lBaseOrBuffed = (Vital > 6) ? 1 : 0; + if( lBaseOrBuffed ) + { + if( Vital == 7 ) // health + Vital = 2; + else if( Vital == 8 ) // stamina + Vital = 4; + else if( Vital == 9 ) // mana + Vital = 6; + } + + long ( __fastcall *Internal_GetStat )( qPointerList *, long, long, long *, long ) = reinterpret_cast< long ( __fastcall * )( qPointerList *, long, long, long *, long ) >( m_lGetVital ); + + qPointerList *p = reinterpret_cast< qPointerList * >( m_lVitalBase ); + p = p->dd[0]; + + Internal_GetStat( p, 0, Vital, pVal, lBaseOrBuffed ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_Attribute(long Attribute, long* pVal) +{ + if( !(m_bGetAttribute && m_lVitalBase) ) + return S_FALSE; + + if( (Attribute < 1) || (Attribute > 12) ) + return E_INVALIDARG; + + long lBaseOrBuffed = (Attribute > 6) ? 1 : 0; + if( lBaseOrBuffed ) + Attribute -= 6; + + qPointerList *p = reinterpret_cast< qPointerList * >( m_lVitalBase ); + p = p->dd[0]; + + long ( __fastcall *Internal_GetAttribute )( qPointerList *, long, long, long *, long ) = reinterpret_cast< long ( __fastcall * )( qPointerList *, long, long, long *, long ) >( m_lGetAttribute ); + + Internal_GetAttribute( p, 0, Attribute, pVal, lBaseOrBuffed ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_Skill(long Skill, long* pVal) +{ + if( !(m_bGetSkill && m_lVitalBase) ) + return S_FALSE; + + // error on out of range, the unused range for added skills, and other skill ids that Turbine skips + if((Skill < 1) || (Skill > 89) || ((Skill > 39) && (Skill < 50)) || (Skill == 8 ) || (Skill == 58) || (Skill == 17) || (Skill == 67) || (Skill == 25) || (Skill == 75) || (Skill == 26) || (Skill == 76)) + return E_INVALIDARG; + + long lBaseOrBuffed = (Skill > 50) ? 1 : 0; + if( lBaseOrBuffed ) + Skill -= 50; + + qPointerList *p = reinterpret_cast< qPointerList * >( m_lVitalBase ); + p = p->dd[0]; + + long ( __fastcall *Internal_GetSkill )( qPointerList *, long, long, long *, long ) = reinterpret_cast< long ( __fastcall * )( qPointerList *, long, long, long *, long ) >( m_lGetSkill ); + + Internal_GetSkill( p, 0, Skill, pVal, lBaseOrBuffed ); + + return S_OK; +} + +STDMETHODIMP cACHooks::get_HooksAvailEx(eAvailableHooksEx HookID, VARIANT_BOOL *pVal) +{ + unsigned int ID; + unsigned int Index, Offset; + + // Default to not being valid + *pVal = VARIANT_FALSE; + + // Convert the enum to an integer so we can do maths on it + ID = static_cast< unsigned int >( HookID ); + + // Ensure the value is within range + if( ID > m_HookCount ) + { + return S_OK; + } + + // Extract the index and bit offset + Index = ID >> 5; // 32 -> 5 bits + Offset = ID & 0x1F; // 1F -> 5 bits worth of 1s + + if( m_HooksEx[Index] & (1 << Offset) ) + { + *pVal = VARIANT_TRUE; + } + + return S_OK; +} + +STDMETHODIMP cACHooks::Logout() +{ + if( m_bLogout ) + { + long ( __cdecl *Internal_Logout )( long ); + Internal_Logout = reinterpret_cast< long ( __cdecl * )( long ) >( m_lLogout ); + Internal_Logout(0); + return S_OK; + } + + return S_FALSE; +} + +STDMETHODIMP cACHooks::ToolText(BSTR Text, VARIANT_BOOL bError) +{ + /* + Moputu - 09012003: Added to allow plugins to display text + in the upper left hand corner as either white text w/o sound or + as yellow text with the busy/error sound. + + Either CombatState or ObjectBase can be used as the starting + memloc as both always seems to have the same value and the + function is called using one or the other in the client.exe. + You can only find the function address after the player is logged in. + */ + + if( !m_bAllYourBase ) //the combat state memloc is necessary + return S_FALSE; + + USES_CONVERSION; + char *szText = OLE2A( Text ); //pointer to the text being passed + DWORD cstate = *((long *)m_lAllYourBase); + + long lErr; + if (bError) + lErr = 1; // display text as yellow w/sound + else + lErr = 0; // display text as white w/o sound + + __asm + { + mov ecx, cstate + + push lErr + push szText + + mov edx, dword ptr [ecx] + call dword ptr [edx+114h] + add esp, 8 + } + + return S_OK; +} + +STDMETHODIMP cACHooks::ToolTextAppend(BSTR Text, VARIANT_BOOL bError) +{ + if( !m_bAllYourBase ) //the combat state memloc is necessary + return S_FALSE; + + USES_CONVERSION; + char *szText = OLE2A( Text ); //pointer to the text being passed + DWORD cstate = *((long *)m_lAllYourBase); + + long lErr; + if (bError) + lErr = 1; // display text as yellow w/sound + else + lErr = 0; // display text as white w/o sound + + __asm + { + mov ecx, cstate + + push lErr + push szText + + mov edx, dword ptr [ecx] + call dword ptr [edx+118h] + } + + return S_OK; +} + +STDMETHODIMP cACHooks::SecureTrade_Add(long ItemID, VARIANT_BOOL *pVal) +{ + void ( __fastcall *Internal_SecureTrade_Add )( struct qPointerList *, int, long ); + struct qPointerList *p; + VARIANT_BOOL ItemExists; + + if (pVal) /* Should probably return an error code. Tough. */ + { + *pVal = VARIANT_FALSE; + } + + else + return E_FAIL; + + if ( m_bSecureTrade_Add && m_bSecureTrade_Add_Off1 && m_bSecureTrade_Add_Off2 && m_bAllYourBase ) + { + if( ItemIsKnown(ItemID, &ItemExists) != S_OK ) + return E_FAIL; + + if (ItemExists == VARIANT_FALSE) + { + return S_FALSE; + } + + p = (qPointerList *)m_lAllYourBase; + if (!p) + { + return S_FALSE; + } + + p = p->dd[0]; + if (!p) + { + return S_FALSE; + } + + p = p->dd[m_lSecureTrade_Add_Off1 >> 2]; + if (!p) + { + return S_FALSE; + } + + p = p->dd[m_lSecureTrade_Add_Off2 >> 2]; + if (!p) + { + return S_FALSE; + } + + Internal_SecureTrade_Add = reinterpret_cast< void ( __fastcall *)( struct qPointerList *, int, long ) >( m_lSecureTrade_Add ); + Internal_SecureTrade_Add(p, 0, ItemID); + if (pVal) + { + *pVal = VARIANT_TRUE; + } + return S_OK; + } + return S_FALSE; +} + +HRESULT cACHooks::GetSkillInfo(eSkill SkillID, struct qSkill *Skill) { + int ( __fastcall *Internal_GetSkillInfo )( void *, int, int, struct qSkill * ); + + if (!m_bGetSkillInfo) { + return E_FAIL; + } + + if (SkillID > 50) { + SkillID = (eSkill)(SkillID - 50); + } + if ((SkillID < 1) || (SkillID > 50)) { + return E_INVALIDARG; + } + + + Skill->vTable = m_lGetSkillInfo_vT; + + Internal_GetSkillInfo = reinterpret_cast< int (__fastcall*)(void *, int, int, struct qSkill *) >(m_lGetSkillInfo); + if (Internal_GetSkillInfo(*(void **)m_lVitalBase, 0, SkillID, Skill)) { + return S_OK; + } + return E_FAIL; +} + +HRESULT cACHooks::GetAttributeInfo(eAttribute AttributeID, struct qAttribute *Attribute) { + int (__fastcall *Internal_GetAttributeInfo)(void *, int, int, struct qAttribute *); + + if (!m_bGetAttributeInfo) { + return E_FAIL; + } + + if (AttributeID > 6) { + AttributeID = (eAttribute)(AttributeID - 6); + } + if ((AttributeID < 1) || (AttributeID > 6)) { + return E_INVALIDARG; + } + + Attribute->vTable = m_lGetAttributeInfo_vT; + + Internal_GetAttributeInfo = reinterpret_cast< int (__fastcall*)(void *, int, int, struct qAttribute *) >(m_lGetAttributeInfo); + if (Internal_GetAttributeInfo(*(void **)m_lVitalBase, 0, AttributeID, Attribute)) { + return S_OK; + } + return E_FAIL; +} + +HRESULT cACHooks::GetVitalInfo(eVital VitalID, struct qVital *Vital) { + int (__fastcall *Internal_GetVitalInfo)(void *, int, int, struct qVital *); + + if (!m_bGetVitalInfo) { + return E_FAIL; + } + + switch (VitalID) { + case eCurrentHealth: + case eMaximumHealth: + case eBaseHealth: + VitalID = eCurrentHealth; + break; + case eCurrentStamina: + case eMaximumStamina: + case eBaseStamina: + VitalID = eCurrentStamina; + break; + case eCurrentMana: + case eMaximumMana: + case eBaseMana: + VitalID = eCurrentMana; + break; + default: + return E_INVALIDARG; + } + + + Vital->vTable = m_lGetVitalInfo_vT; + + Internal_GetVitalInfo = reinterpret_cast< int (__fastcall*)(void *, int, int, struct qVital *) >(m_lGetVitalInfo); + if (Internal_GetVitalInfo(*(void **)m_lVitalBase, 0, VitalID, Vital)) { + return S_OK; + } + return E_FAIL; +} + +STDMETHODIMP cACHooks::get_SkillTrainLevel( eSkill SkillID, eTrainLevel *pVal ) +{ + struct qSkill Skill; + HRESULT hr; + hr = GetSkillInfo(SkillID, &Skill); + if (FAILED(hr)) { + return hr; + } + + *pVal = Skill.Trained; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_SkillTotalXP( eSkill SkillID, int *pVal ) +{ + struct qSkill Skill; + HRESULT hr; + hr = GetSkillInfo(SkillID, &Skill); + if (FAILED(hr)) { + return hr; + } + + *pVal = Skill.TotalXP; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_SkillFreePoints( eSkill SkillID, int *pVal ) +{ + struct qSkill Skill; + HRESULT hr; + hr = GetSkillInfo(SkillID, &Skill); + if (FAILED(hr)) { + return hr; + } + + *pVal = Skill.FreePoints; + + return S_OK; +} + + +STDMETHODIMP cACHooks::get_SkillClicks( eSkill SkillID, int *pVal ) +{ + struct qSkill Skill; + HRESULT hr; + hr = GetSkillInfo(SkillID, &Skill); + if (FAILED(hr)) { + return hr; + } + + *pVal = Skill.Clicks; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_AttributeClicks( eAttribute AttributeID, int *pVal ) +{ + struct qAttribute Attribute; + HRESULT hr; + hr = GetAttributeInfo(AttributeID, &Attribute); + if (FAILED(hr)) { + return hr; + } + + *pVal = Attribute.Clicks; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_AttributeTotalXP( eAttribute AttributeID, int *pVal ) +{ + struct qAttribute Attribute; + HRESULT hr; + hr = GetAttributeInfo(AttributeID, &Attribute); + if (FAILED(hr)) { + return hr; + } + + *pVal = Attribute.TotalXP; + + return S_OK; +} + + +STDMETHODIMP cACHooks::get_AttributeStart( eAttribute AttributeID, int *pVal ) +{ + struct qAttribute Attribute; + HRESULT hr; + hr = GetAttributeInfo(AttributeID, &Attribute); + if (FAILED(hr)) { + return hr; + } + + *pVal = Attribute.Start; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_VitalClicks( eVital VitalID, int *pVal ) +{ + struct qVital Vital; + HRESULT hr; + hr = GetVitalInfo(VitalID, &Vital); + if (FAILED(hr)) { + return hr; + } + + *pVal = Vital.Clicks; + + return S_OK; +} + +STDMETHODIMP cACHooks::get_VitalTotalXP( eVital VitalID, int *pVal ) +{ + struct qVital Vital; + HRESULT hr; + hr = GetVitalInfo(VitalID, &Vital); + if (FAILED(hr)) { + return hr; + } + + *pVal = Vital.TotalXP; + + return S_OK; +} + +void cACHooks::SetHookEx( eAvailableHooksEx HookID ) +{ + unsigned int ID; + unsigned int Index, Offset; + + ID = static_cast< unsigned int >( HookID ); + + Index = ID >> 5; + Offset = ID & 0x1F; + + _ASSERTE( Index < (sizeof(m_HooksEx) / sizeof(m_HooksEx[0])) ); + + m_HooksEx[Index] |= (1 << Offset); + + if( ID > m_HookCount ) + m_HookCount = ID; + + return; +} + +STDMETHODIMP cACHooks::SetIdleTime( double dIdleTimeout ) +{ + if( !m_bIdleLoc ) + return S_FALSE; + + DWORD dwOldProtect = 0; + DWORD dwNewProtect = PAGE_READWRITE; + VirtualProtect( reinterpret_cast< void * >( m_lIdleLoc ), 8 /* sizeof double */, dwNewProtect, &dwOldProtect ); + *( reinterpret_cast< double * >( m_lIdleLoc ) ) = dIdleTimeout; + VirtualProtect( reinterpret_cast< void * >( m_lIdleLoc ), 8 /* sizeof double */, dwOldProtect, &dwNewProtect ); + + return S_OK; +} + +void cACHooks::InternalObjectDestroyed (DWORD dwGuid) +{ + Fire_ObjectDestroyed( dwGuid ); +} + +void cACHooks::InternalSelectItem( DWORD dwID ) +{ + Fire_OnSelectItem( dwID ); +} + +void cACHooks::InternalShortcircuit( DWORD dwID ) +{ + if( m_bIdQueueRef ) + m_pIdQueue->ShortcircuitID( dwID ); +} + +void OnObjectDestroyed (DWORD dwGuid) +{ + if( cACHooks::s_pACHooks ) + cACHooks::s_pACHooks->InternalObjectDestroyed( dwGuid ); +} + +void OnSelectItem( DWORD dwID ) +{ + if( cACHooks::s_pACHooks ) + cACHooks::s_pACHooks->InternalSelectItem( dwID ); +} + +void Shortcircuit( DWORD dwID ) +{ + if( cACHooks::s_pACHooks ) + cACHooks::s_pACHooks->InternalShortcircuit( dwID ); +} + +void __declspec(naked) SelectItemHook() +{ + _asm + { + push eax + call OnSelectItem + add esp,4 + + jmp g_lSelectItemHijackProc + } +} + +void __declspec(naked) ObjectDestroyedHook() +{ + _asm + { + mov eax,[esp+8] + push eax + push ecx + + push eax + call OnObjectDestroyed + + add esp,4 + pop ecx + pop eax + mov [esp+8],eax + + jmp g_lObjectDestroyedProc + } +} + +void __declspec(naked) IdentifyShortcircuit() +{ + __asm + { + mov eax,[esp+4] + push eax + push ecx + + push eax + call Shortcircuit + add esp, 4 + + pop ecx + pop eax + mov [esp+4], eax + + jmp g_lIdentifyHijackProc + } +} + +// Returns the function which previously was being called, after replacing it with the new call. +DWORD HookCall (DWORD dwCallAddress, DWORD dwReplacement) +{ + DWORD* pTemp = (DWORD *) (dwCallAddress + 1); + + HANDLE hProcess = OpenProcess + ( + PROCESS_VM_WRITE | PROCESS_VM_OPERATION, + FALSE, + GetCurrentProcessId () + ); + + DWORD dwOriginal = 0; + + if (hProcess) + { + dwOriginal = (*pTemp) + dwCallAddress + 5; + + DWORD dwTemp = dwReplacement - (dwCallAddress + 5); + if (WriteProcessMemory + ( + hProcess, + pTemp, + &dwTemp, + sizeof (DWORD), + NULL + )) + { + } + else + { + dwOriginal = 0; + } + + CloseHandle (hProcess); + } + + return dwOriginal; +} + +bool cACHooks::InternalChatMessage( char *szText, long lColor ) +{ + return Fire_OnChatBoxMessage( _bstr_t( szText ), lColor ) == VARIANT_TRUE ? true : false; +} + +bool cACHooks::InternalChatText( char *szText ) +{ + return Fire_OnCommandLineText( _bstr_t( szText ) ) == VARIANT_TRUE ? true : false; +} + +bool DispatchChatMessage( char *pText, long pdwColor ) +{ + if( cACHooks::s_pACHooks ) + return cACHooks::s_pACHooks->InternalChatMessage( pText, pdwColor ); + + return false; +} + +bool DispatchChatText( char *pText ) +{ + if( cACHooks::s_pACHooks ) + return cACHooks::s_pACHooks->InternalChatText( pText ); + + return false; +} + +/* Heyus - 23 Mar 2003 - Fixed to point to the new universal function */ +void __fastcall OnChatMessage( int _ecx, int _edx, char* pText, long lColor ) +{ + if( !DispatchChatMessage( pText, lColor ) ) + InternalRawWriteToChat( pText, lColor, _ecx, _edx ); + + return; +} + +void __declspec(naked) OnChatText() +{ + __asm + { + push ebp + mov ebp, esp + sub esp, 0xC + + call pfnOldChatText + + mov [ebp-4], ecx + mov [ebp-8], eax + + push eax + + call DispatchChatText + + mov edx, eax + mov ecx, [ebp-4] + mov eax, [ebp-8] + + test dl, dl + jz dont_eat_chat_text + + mov byte ptr [eax], 0 + +dont_eat_chat_text: + mov esp, ebp + pop ebp + ret + } +} + +void cACHooks::InternalToolText( char *szText, VARIANT_BOOL bError ) +{ + USES_CONVERSION; + Fire_OnToolText( T2BSTR( szText ), bError ); +} + +void OnToolText( char *szText, long lError ) +{ + VARIANT_BOOL bError = lError; + + if( cACHooks::s_pACHooks ) + cACHooks::s_pACHooks->InternalToolText( szText, bError ); +} + +void __declspec(naked) CatchToolText() +{ + __asm + { + push ecx + push edx + push edi + push eax + call OnToolText + pop eax + pop edi + pop edx + pop ecx + jmp g_lToolTextProc + } +} + +void cACHooks::InternalToolTextAppend( char *szText, VARIANT_BOOL bError ) +{ + USES_CONVERSION; + Fire_OnToolTextAppend( T2BSTR( szText ), bError ); +} + +void OnToolTextAppend( char *szText, long lError ) +{ + VARIANT_BOOL bError = lError; + + if( cACHooks::s_pACHooks ) + cACHooks::s_pACHooks->InternalToolTextAppend( szText, bError ); +} + +void __declspec(naked) CatchToolTextAppend() +{ + __asm + { + push ecx + push edx + push edi + push eax + call OnToolTextAppend + pop eax + pop edi + pop edx + pop ecx + jmp g_lToolText2Proc + } +} + +STDMETHODIMP cACHooks::RequestID(long lObjectID) +{ + if( !m_bRequestID ) + return S_FALSE; + + if( m_bIdQueueRef ) + return m_pIdQueue->AddToQueue( lObjectID ); + + typedef void(*RequestPtr)( long ); + RequestPtr pRequest = reinterpret_cast< RequestPtr >( m_lRequestID ); + pRequest( lObjectID ); + + return S_OK; +} + +STDMETHODIMP cACHooks::IDQueueAdd(long lObjectID) +{ + if( !m_bIdQueueRef ) + return RequestID( lObjectID ); + + return m_pIdQueue->AddToQueue( lObjectID ); +} + +STDMETHODIMP cACHooks::SetIDFilter(IKitchenSink* pIDFilter) +{ + if( !m_bIdQueueRef ) + { + m_bIdQueueRef = true; + m_pIdQueue = pIDFilter; + SetHookEx( eIDQueueAdd ); + } + + return S_OK; +} + +STDMETHODIMP cACHooks::UstAddItem(long lObjectID) +{ + VARIANT_BOOL ItemExists; + + if ( !m_bUstAddItem_Useable ) + return S_FALSE; + + if( ItemIsKnown( lObjectID, &ItemExists ) != S_OK ) + return E_FAIL; + + if( ItemExists == VARIANT_FALSE ) + return S_FALSE; + + //Calculate the THIS pointer + //DWORD thisPtr = *((long *)(*((long *)(*((long *)0x77A618) + 0x324)) + 0xE0)); + //DWORD tmp; + //DWORD func = 0x005556C0; + + DWORD thisPtr = *((long *)(*((long *)(*((long *)m_lChatMessageAddy) + m_lUstAddItem_Off1)) + m_lUstAddItem_Off2)); + DWORD tmp; + DWORD func = (DWORD)m_lUstAddItem; + + __asm + { + mov tmp, ecx + mov ecx, thisPtr + push lObjectID + + call func + + mov ecx, tmp + } + + return S_OK; +} + +STDMETHODIMP cACHooks::SendMessageByMask( long lMask, BSTR szMessage ) +{ + if( !(m_bInternalStringConstructor && m_bInternalStringDestructor && m_bSendMessageToMask) ) + return S_FALSE; + + USES_CONVERSION; + char *szText = OLE2A( szMessage ); + + long retval; + qString Msg; + pfnInternalStringConstructor( &Msg, 0, szText ); + retval = pfnSendMessageByMask( lMask, &Msg ); + pfnInternalStringDestructor( &Msg ); + + return S_OK; +} + +STDMETHODIMP cACHooks::SetDay( VARIANT_BOOL bDay ) +{ + if( !m_bSlashDay ) + return S_FALSE; + + *reinterpret_cast< long * >( m_lSlashDay ) = bDay == VARIANT_TRUE ? 1 : 0; + + return S_OK; +} diff --git a/Native/Decal/ACHooks.h b/Native/Decal/ACHooks.h new file mode 100644 index 0000000..61e3147 --- /dev/null +++ b/Native/Decal/ACHooks.h @@ -0,0 +1,355 @@ +// ACHooks.h: Definition of the ACHooks class + +#ifndef __ACHOOKS_H_ +#define __ACHOOKS_H_ + + +#include "resource.h" // main symbols +#include "Decal.h" +#include "DecalManager.h" +#include "DecalCP.h" + +// the public key to unencrypt xmls +#include "..\include\DecalKey.h" + +// .NET vs VC6.0 Compiler Config +#if _MSC_VER > 1200 // .NET +#import "..\Include\Inject.tlb" +#define IPSite DecalPlugins::IPluginSite +#else // Not .Net +#include "..\inject\Inject.h" +#define IPSite IPluginSite +#endif + +struct sMemoryLocation +{ + std::string Name; + long Location; +}; + +// qString struct for internal client strings - this is all cynica_l's work +struct qString +{ + void **vTable; + char *Data; + long MaximumLength; +}; + +struct qSkill { + long vTable; + enum eTrainLevel Trained; + int TotalXP; + int FreePoints; + int Clicks; + int unk1; + int unk2; /* float? percent of total? */ + float unk3; +}; + +struct qVital { + long vTable; + int Clicks; + int unk1; + int TotalXP; + int unk2; +}; + +struct qAttribute { + long vTable; + int Clicks; + int Start; + int TotalXP; +}; + +struct qPointerList +{ + qPointerList *dd[1]; +}; + +extern "C" bool DispatchChatMessage( char *pText, long *pdwColor ); +extern "C" bool DispatchChatText( char *pText ); + +///////////////////////////////////////////////////////////////////////////// +// ACHooks +class ATL_NO_VTABLE cACHooks : + public CComObjectRoot, + public CComCoClass, + public IConnectionPointContainerImpl, + public IDispatchImpl, + public CProxyIACHooksEvents< cACHooks > +{ +public: + cACHooks(); + ~cACHooks(); + +DECLARE_REGISTRY_RESOURCEID(IDR_ACHooks) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cACHooks) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IACHooks) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cACHooks) + CONNECTION_POINT_ENTRY(DIID_IACHooksEvents) +END_CONNECTION_POINT_MAP() + +private: + long* GetCs(long offs=0) ; + void DecryptXML( const char *szPath, std::string &szXML ); + + long m_Hooks ; + typedef std::map< std::string, sMemoryLocation > LocMap; + LocMap m_mLocationList; + + bool m_bDecalRef; + bool m_bIdQueueRef; + + bool m_bMismatch; + + bool m_bPrevSelect; + long m_lPrevSelect[2]; + + bool m_bCurrentSelect; + long m_lCurrentSelect[2]; + + bool m_bChatMessageAddy; + long m_lChatMessageAddy; + + bool m_bMouse; + long m_lMouse[4]; + + bool m_bCastSpell; + long m_lCastSpell; + + bool m_bMoveItem; + long m_lMoveItem; + + bool m_bSelectItem; + long m_lSelectItem; + + bool m_bUseItem; + long m_lUseItem; + + bool m_bAllYourBase; + long m_lAllYourBase; + bool m_bSetCombatState; + long m_lSetCombatState; + bool m_bCombatStateOffset; + long m_lCombatStateOffset; + + bool m_bChatState; + long m_lChatState; + + bool m_bRequestID; + long m_lRequestID; + + bool m_bStackCount; + long m_lStackCount; + + bool m_bTestFormula; + long m_lTestFormula; + long m_lTestFormulaVTable; + + bool m_bVendorID; + long m_lVendorID; + + bool m_bBusyState; + long m_lBusyState; + bool m_bBusyStateID; + long m_lBusyStateID; + + bool m_bPointerState; + long m_lPointerState; + + bool m_bMoveItemEx; + long m_lMoveItemEx; + + bool m_bArea3DWidth; + long *m_lpArea3DWidth; + + bool m_bArea3DHeight; + long *m_lpArea3DHeight; + + bool m_bObjectFromGuid; + long m_lObjectFromGuid; + long m_lObjectFromGuidClass; + + bool m_bFaceHeading; + + long m_lMovementThingyParent; + long m_lMovementThingyOffset; + long m_lFaceHeading; + + bool m_bSetAutorun; + long m_lSetAutorun; + + bool m_bInternalStringConstructor; + bool m_bInternalStringDestructor; + bool m_bSendMessageToID; + bool m_bSendMessageToName; + bool m_bSendMessageToMask; + bool m_bLocalChatText; + bool m_bLocalChatEmote; + + long m_lInternalStringConstructor; + long m_lInternalStringDestructor; + long m_lSendMessageToID; + long m_lSendMessageToName; + long m_lSendMessageToMask; + long m_lLocalChatText; + long m_lLocalChatEmote; + + long m_lVitalBase; + + bool m_bGetVital; + long m_lGetVital; + + bool m_bGetAttribute; + long m_lGetAttribute; + + bool m_bGetSkill; + long m_lGetSkill; + + bool m_bLogout; + long m_lLogout; + + bool m_bSecureTrade_Add; + long m_lSecureTrade_Add; + bool m_bSecureTrade_Add_Off1; + long m_lSecureTrade_Add_Off1; + bool m_bSecureTrade_Add_Off2; + long m_lSecureTrade_Add_Off2; + + bool m_bGetSkillInfo; + long m_lGetSkillInfo, m_lGetSkillInfo_vT; + bool m_bGetAttributeInfo; + long m_lGetAttributeInfo, m_lGetAttributeInfo_vT; + bool m_bGetVitalInfo; + long m_lGetVitalInfo, m_lGetVitalInfo_vT; + + bool m_bChatColor; + long m_lChatColor; + + bool m_bSelectItemHook; + long m_lSelectItemHook; + + bool m_bUstAddItem_Useable; + long m_lUstAddItem; + long m_lUstAddItem_Off1; + long m_lUstAddItem_Off2; + + bool m_bRequestShortcircuit; + long m_lRequestShortcircuit1; + long m_lRequestShortcircuit2; + long m_lRequestShortcircuit3; + + bool m_bToolTextHook; + long m_lToolTextHJ; + bool m_bToolText2Hook; + long m_lToolText2HJ; + + long m_lIdleLoc; + bool m_bIdleLoc; + + long m_lSlashDay; + bool m_bSlashDay; + + unsigned int m_HooksEx[1]; + unsigned int m_HookCount; + + CComPtr< IDecal > m_pDecal; + +public: + static cACHooks* s_pACHooks; + void InternalObjectDestroyed( DWORD dwGuid ); + void InternalSelectItem( DWORD dwID ); + void InternalShortcircuit( DWORD dwID ); + bool InternalChatText( char *szText ); + bool InternalChatMessage( char *szText, long lColor ); + void InternalToolText( char *szText, VARIANT_BOOL bError ); + void InternalToolTextAppend( char *szText, VARIANT_BOOL bError ); + + void SetHookEx(enum eAvailableHooksEx HookID); + CComPtr< IKitchenSink > m_pIdQueue; + + STDMETHOD(MoveItemEx)(long lObjectID, long lDestinationID); + STDMETHOD(get_PointerState)(long *pVal); + STDMETHOD(get_BusyStateID)(long *pVal); + STDMETHOD(get_BusyState)(long *pVal); + STDMETHOD(get_VendorID)(long *pVal); + STDMETHOD(get_SelectedStackCount)(long lStackCount, long *pVal); + STDMETHOD(put_SelectedStackCount)(long lStackCount, long newVal); + STDMETHOD(GetFellowStats)(long lCharID); + STDMETHOD(UseItemEx)(long UseThis, long OnThis); + STDMETHOD(get_ChatState)(VARIANT_BOOL *pVal); + STDMETHOD(get_CombatState)(long *pVal); + STDMETHOD(SetCombatState)(long pVal); + STDMETHOD(UseItem)(long lObjectID, long lUseState); + STDMETHOD(UseItemRaw)(long lObjectID, long lUseState, long lUseMethod); + STDMETHOD(UseFociSpell)(long UseThis, long OnThis); + STDMETHOD(SelectItem)(long lObjectID); + STDMETHOD(MoveItem)(long lObjectID, long lPackID, long lSlot, VARIANT_BOOL bStack); + STDMETHOD(CastSpell)(long lSpellID, long lObjectID); + STDMETHOD(SetCursorPosition)(long lX, long lY); + STDMETHOD(RawChatOut)(BSTR szText, long lColor); + STDMETHOD(ChatOut)(BSTR szText, long lColor); + STDMETHOD(get_PreviousSelection)(long *pVal); + STDMETHOD(put_PreviousSelection)(long newVal); + STDMETHOD(get_CurrentSelection)(long *pVal); + STDMETHOD(put_CurrentSelection)(long newVal); + STDMETHOD(QueryMemLoc)(BSTR bstrName, long *pVal); + STDMETHOD(get_Heading)(double *pVal); + STDMETHOD(get_Landblock)(long *pVal); + STDMETHOD(get_LocationX)(double *pVal); + STDMETHOD(get_LocationY)(double *pVal); + STDMETHOD(get_LocationZ)(double *pVal); + STDMETHOD(DropItem)(long lObjectID); + STDMETHOD(get_HooksAvail)(long *pVal) ; + STDMETHOD(FaceHeading)(float fHeading, VARIANT_BOOL bUnknown, VARIANT_BOOL *pRetval); + STDMETHOD(get_Area3DWidth)(long *pVal); + STDMETHOD(get_Area3DHeight)(long *pVal); + STDMETHOD(ItemIsKnown)(long lGUID, VARIANT_BOOL* pRetval) ; + STDMETHOD(SendTell)(long lPlayerID, BSTR Message); + STDMETHOD(SendTellEx)(BSTR Name, BSTR Message); + STDMETHOD(SetAutorun)(VARIANT_BOOL bOnOff) ; + STDMETHOD(get_Vital)(long Vital, long* pVal); + STDMETHOD(get_Attribute)(long Attribute, long* pVal); + STDMETHOD(get_Skill)(long Skill, long* pVal); + STDMETHOD(LocalChatText)(BSTR Text); + STDMETHOD(LocalChatEmote)(BSTR EmoteText); + STDMETHOD(get_HooksAvailEx)(enum eAvailableHooksEx HookID, VARIANT_BOOL* pVal); + STDMETHOD(Logout)(); + STDMETHOD(ToolText)(BSTR Text, VARIANT_BOOL bError); + STDMETHOD(ToolTextAppend)(BSTR Text, VARIANT_BOOL bError); + STDMETHOD(SetIdleTime)( double dIdleTimeout ); + STDMETHOD(SetDecal)(IUnknown *pDecal); + + STDMETHOD(SecureTrade_Add)(long ItemID, VARIANT_BOOL *pVal); + + STDMETHOD(get_SkillTrainLevel)( eSkill SkillID, eTrainLevel *pVal ); + STDMETHOD(get_SkillTotalXP)( eSkill SkillID, int *pVal ); + STDMETHOD(get_SkillFreePoints)( eSkill SkillID, int *pVal ); + STDMETHOD(get_SkillClicks)( eSkill SkillID, int *pVal ); + + STDMETHOD(get_AttributeClicks)( eAttribute AttributeID, int *pVal ); + STDMETHOD(get_AttributeTotalXP)( eAttribute AttributeID, int *pVal ); + STDMETHOD(get_AttributeStart)( eAttribute AttributeID, int *pVal ); + + STDMETHOD(get_VitalClicks)( eVital VitalID, int *pVal ); + STDMETHOD(get_VitalTotalXP)( eVital VitalID, int *pVal ); + + HRESULT GetSkillInfo(eSkill SkillID, struct qSkill *Skill); + HRESULT GetAttributeInfo(eAttribute AttributeID, struct qAttribute *Attribute); + HRESULT GetVitalInfo(eVital VitalID, struct qVital *Vital); + STDMETHOD(RequestID)(long lObjectID); + STDMETHOD(IDQueueAdd)(long lObjectID); + STDMETHOD(SetIDFilter)(IKitchenSink* pIDFilter); + STDMETHOD(UstAddItem)(long lObjectID); + STDMETHOD(SendMessageByMask)(LONG lMask, BSTR szMessage); + STDMETHOD(SetDay)(VARIANT_BOOL bDay); +}; + +#endif // __ACHOOKS_H_ diff --git a/Native/Decal/ACHooks.rgs b/Native/Decal/ACHooks.rgs new file mode 100644 index 0000000..275fedf --- /dev/null +++ b/Native/Decal/ACHooks.rgs @@ -0,0 +1,23 @@ +HKCR +{ + Decal.ACHooks.1 = s 'ACHooks Class' + { + CLSID = s '{CB8875CD-ABC2-42AD-8175-8908706EED37}' + } + Decal.ACHooks = s 'ACHooks Class' + { + CLSID = s '{CB8875CD-ABC2-42AD-8175-8908706EED37}' + } + NoRemove CLSID + { + ForceRemove {CB8875CD-ABC2-42AD-8175-8908706EED37} = s 'ACHooks Class' + { + ProgID = s 'Decal.ACHooks.1' + VersionIndependentProgID = s 'Decal.ACHooks' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Native/Decal/ActiveXSurrogate.cpp b/Native/Decal/ActiveXSurrogate.cpp new file mode 100644 index 0000000..1d73ddd --- /dev/null +++ b/Native/Decal/ActiveXSurrogate.cpp @@ -0,0 +1,194 @@ +// ActiveXSurrogate.cpp : Implementation of cActiveXSurrogate +#include "stdafx.h" +#include "Decal.h" +#include "ActiveXSurrogate.h" + +// Duplicated from Inject.h to prevent circular dependency +class IPluginSite; + +class __declspec(uuid("{BA3E677F-8E44-4829-982E-58BBBC5C5F9B}")) IPlugin +: public IUnknown +{ +public: + STDMETHOD(Initialize)(IPluginSite *pSite, long) = 0; + STDMETHOD(Terminate)() = 0; + STDMETHOD(get_FriendlyName)(BSTR *pstrName) = 0; +}; + +///////////////////////////////////////////////////////////////////////////// +// cActiveXSurrogate + +typedef HRESULT (__stdcall *pfnDllRegisterServer)(); +typedef HRESULT (__stdcall *pfnDllUnregisterServer)(); + +STDMETHODIMP cActiveXSurrogate::Register(BSTR strFilename) +{ + USES_CONVERSION; + LPCTSTR szFilename = OLE2T( strFilename ); + + // First, register the library + HMODULE hLib = ::LoadLibrary( szFilename ); + if( hLib == NULL ) + return E_FAIL; + + pfnDllRegisterServer pfnReg = reinterpret_cast< pfnDllRegisterServer >( ::GetProcAddress( hLib, _T( "DllRegisterServer" ) ) ); + HRESULT hRes = E_FAIL; + if( pfnReg != NULL ) + hRes = pfnReg(); + + ::FreeLibrary( hLib ); + + if( FAILED( hRes ) ) + return hRes; + + // Next open up the type library and look for suitable classes, they have + // to be creatable - then we make one and see if it implements IPlugin2 + CComPtr< ITypeLib > pTypeLib; + hRes = ::LoadTypeLib( strFilename, &pTypeLib ); + + if( FAILED( hRes ) ) + return hRes; + + UINT nTypeInfoCount = pTypeLib->GetTypeInfoCount(); + int nFound = 0; + + for( UINT i = 0; i < nTypeInfoCount; ++ i ) + { + TYPEKIND tk; + pTypeLib->GetTypeInfoType( i, &tk ); + + if( tk != TKIND_COCLASS ) + // Only coclasses + continue; + + CComPtr< ITypeInfo > pClass1; + pTypeLib->GetTypeInfo( i, &pClass1 ); + + TYPEATTR *pta; + pClass1->GetTypeAttr( &pta ); + + if( pta->wTypeFlags & TYPEFLAG_FCANCREATE ) + { + // Create an instance of the plugin and see if it implements IPlugin + CComPtr< IUnknown > pUnkPlugin; + HRESULT hRes = pClass1->CreateInstance ( NULL, IID_IUnknown, reinterpret_cast< LPVOID * > ( &pUnkPlugin ) ); + if ( SUCCEEDED ( hRes ) ) + { + // Check for the IPlugin2 interface + CComPtr< IPlugin2 > pPlugin2; + if ( SUCCEEDED ( pUnkPlugin->QueryInterface ( &pPlugin2 ) ) ) + { + // This is a plugin (anything that implements IPlugin2 is a plugin afterall, make the registry key + LPCSTR szCLSID; + LPOLESTR strCLSID; + ::StringFromCLSID( pta->guid, &strCLSID ); + szCLSID = OLE2T( strCLSID ); + ::CoTaskMemFree( strCLSID ); + + TCHAR szRegKey[ 255 ]; + ::_tcscat ( ::_tcscpy ( szRegKey, _T( "Software\\Decal\\Plugins\\" ) ), szCLSID ); + + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, szRegKey ); + + CComBSTR strDescription; + pClass1->GetDocumentation( MEMBERID_NIL, NULL, &strDescription, NULL, NULL ); + + key.SetStringValue( NULL, OLE2T( strDescription ) ); + key.SetStringValue( _T("File"), szFilename ); + key.SetDWORDValue( _T( "Enabled" ), 1 ); + key.SetStringValue( _T("Uninstall"), _T( "{7559F22F-C56F-4621-AE08-9C354D799D4B}" ) ); + + ++ nFound; + } + else + { + CComPtr< IPlugin > pPlugin; + if ( SUCCEEDED( pUnkPlugin->QueryInterface ( &pPlugin ) ) ) + { + // This is a V1 plugin - same registration, but use a surrogate + LPCSTR szCLSID; + LPOLESTR strCLSID; + ::StringFromCLSID( pta->guid, &strCLSID ); + szCLSID = OLE2T( strCLSID ); + ::CoTaskMemFree( strCLSID ); + + TCHAR szRegKey[ 255 ]; + ::_tcscat ( ::_tcscpy ( szRegKey, _T( "Software\\Decal\\Plugins\\" ) ), szCLSID ); + + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, szRegKey ); + + CComBSTR strDescription; + pPlugin->get_FriendlyName( &strDescription ); + + // Friendly name + key.SetStringValue( NULL, OLE2T( strDescription ) ); + // File for uninstalling + key.SetStringValue( _T( "File" ), szFilename ); + // Enabled by default + key.SetDWORDValue( _T( "Enabled" ), 1 ); + // This object uninstalls + key.SetStringValue( _T("Uninstall"), _T( "{7559F22F-C56F-4621-AE08-9C354D799D4B}" )); + // The V1 surrogate + key.SetStringValue( _T( "Surrogate" ), _T( "{3D837F6E-B5CA-4604-885F-7AB45FCFA62A}" ) ); + + ++ nFound; + } + } + } + } + + pClass1->ReleaseTypeAttr( pta ); + } + + return ( nFound > 0 ) ? S_OK : E_FAIL; +} + +STDMETHODIMP cActiveXSurrogate::Uninstall() +{ + USES_CONVERSION; + TCHAR szParent[ 255 ]; + ::_tcscat ( ::_tcscpy ( szParent, _T( "Software\\Decal\\Plugins\\" ) ), OLE2T( m_strGroup ) ); + + RegKey rk; + if( rk.Open( HKEY_LOCAL_MACHINE, szParent ) != ERROR_SUCCESS ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + LPOLESTR strCLSID; + ::StringFromCLSID( m_clsid, &strCLSID ); + + LPTSTR szCLSID = OLE2T( strCLSID ); + + ::CoTaskMemFree( strCLSID ); + + if( rk.RecurseDeleteKey( szCLSID ) != ERROR_SUCCESS ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + // Load the library and call DLL unreg server + LPCTSTR szFilename = OLE2T( m_strFile ); + + // First, register the library + HMODULE hLib = ::LoadLibrary( szFilename ); + if( hLib == NULL ) + return E_FAIL; + + pfnDllUnregisterServer pfnReg = reinterpret_cast< pfnDllUnregisterServer >( ::GetProcAddress( hLib, _T( "DllUnregisterServer" ) ) ); + HRESULT hRes = E_FAIL; + if( pfnReg != NULL ) + hRes = pfnReg(); + + ::FreeLibrary( hLib ); + + // Just call this to make sure the library isn't locked so the user + // can delete it after this point. + ::CoFreeUnusedLibraries(); + + return hRes; +} diff --git a/Native/Decal/ActiveXSurrogate.h b/Native/Decal/ActiveXSurrogate.h new file mode 100644 index 0000000..ccbfe43 --- /dev/null +++ b/Native/Decal/ActiveXSurrogate.h @@ -0,0 +1,84 @@ +// ActiveXSurrogate.h : Declaration of the cActiveXSurrogate + +#ifndef __ACTIVEXSURROGATE_H_ +#define __ACTIVEXSURROGATE_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cActiveXSurrogate +class ATL_NO_VTABLE cActiveXSurrogate : + public CComObjectRootEx, + public CComCoClass, + public IDecalFileSurrogate, + public IDecalUninstall +{ +public: + cActiveXSurrogate() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_ACTIVEXSURROGATE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cActiveXSurrogate) + COM_INTERFACE_ENTRY(IDecalFileSurrogate) + COM_INTERFACE_ENTRY(IDecalUninstall) +END_COM_MAP() + + CComBSTR m_strFile; + CComBSTR m_strGroup; + CLSID m_clsid; + +public: + // IDecalFileSurrogate + STDMETHOD(get_Extension)( BSTR *pVal ) + { + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = T2BSTR( _T( "dll" ) ); + return S_OK; + } + + STDMETHOD(get_Description)( BSTR *pVal ) + { + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = T2BSTR( _T( "ActiveX Plugin" ) ); + return S_OK; + } + + STDMETHOD(Register)(BSTR strFilename); + + // IDecalUninstall + STDMETHOD(Prepare)( IDecalEnum *pEnum ) + { + // Get the class + pEnum->get_ComClass( &m_clsid ); + + // Get the file + static _bstr_t _strFile( _T( "File" ) ); + + CComVariant vFile; + pEnum->get_Property( _strFile, &vFile ); + m_strFile = vFile.bstrVal; + + // Get the group + pEnum->get_Group( &m_strGroup ); + + return S_OK; + } + + STDMETHOD(Uninstall)(); +}; + +#endif //__ACTIVEXSURROGATE_H_ diff --git a/Native/Decal/ActiveXSurrogate.rgs b/Native/Decal/ActiveXSurrogate.rgs new file mode 100644 index 0000000..8eaa0c3 --- /dev/null +++ b/Native/Decal/ActiveXSurrogate.rgs @@ -0,0 +1,44 @@ +HKCR +{ + Decal.ActiveXSurrogate.1 = s 'ActiveXSurrogate Class' + { + CLSID = s '{7559F22F-C56F-4621-AE08-9C354D799D4B}' + } + Decal.ActiveXSurrogate = s 'ActiveXSurrogate Class' + { + CLSID = s '{7559F22F-C56F-4621-AE08-9C354D799D4B}' + CurVer = s 'Decal.ActiveXSurrogate.1' + } + NoRemove CLSID + { + ForceRemove {7559F22F-C56F-4621-AE08-9C354D799D4B} = s 'ActiveXSurrogate Class' + { + ProgID = s 'Decal.ActiveXSurrogate.1' + VersionIndependentProgID = s 'Decal.ActiveXSurrogate' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{FF7F5F6D-34E0-4B6F-B3BB-8141DE2EF732}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Surrogates + { + ForceRemove {7559F22F-C56F-4621-AE08-9C354D799D4B} = s 'ActiveX Plugin Surrogate' + { + val Enabled = d '1' + val Extension = s 'dll' + val Description = s 'ActiveX Surrogate' + } + } + } + } +} diff --git a/Native/Decal/Decal.cpp b/Native/Decal/Decal.cpp new file mode 100644 index 0000000..65c89ae --- /dev/null +++ b/Native/Decal/Decal.cpp @@ -0,0 +1,79 @@ +// Decal.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f Decalps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include + +#include +#include "DecalManager.h" +#include "SurrogateRemove.h" +#include "ActiveXSurrogate.h" +#include "DecalRes.h" +#include "ACHooks.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_Decal, cDecal) +OBJECT_ENTRY(CLSID_SurrogateRemove, cSurrogateRemove) +OBJECT_ENTRY(CLSID_ActiveXSurrogate, cActiveXSurrogate) +OBJECT_ENTRY(CLSID_DecalRes, cDecalRes) +OBJECT_ENTRY(CLSID_ACHooks, cACHooks) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_Decal); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + { + _Module.Term(); + } + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} diff --git a/Native/Decal/Decal.def b/Native/Decal/Decal.def new file mode 100644 index 0000000..24b9fc4 --- /dev/null +++ b/Native/Decal/Decal.def @@ -0,0 +1,9 @@ +; Decal.def : Declares the module parameters. + +LIBRARY "Decal.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Native/Decal/Decal.dsp b/Native/Decal/Decal.dsp new file mode 100644 index 0000000..cba7957 --- /dev/null +++ b/Native/Decal/Decal.dsp @@ -0,0 +1,263 @@ +# Microsoft Developer Studio Project File - Name="Decal" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=Decal - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Decal.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Decal.mak" CFG="Decal - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Decal - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "Decal - Win32 Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Decal - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib version.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\Decal\source\Debug\Decal.dll +InputPath=\Decal\source\Debug\Decal.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "Decal - Win32 Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinSize" +# PROP BASE Intermediate_Dir "ReleaseMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "_MBCS" /D "_ATL_DLL" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib version.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libcmt.lib" /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\Decal\source\Release\Decal.dll +InputPath=\Decal\source\Release\Decal.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "Decal - Win32 Debug" +# Name "Decal - Win32 Release MinSize" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\ACHooks.cpp +# End Source File +# Begin Source File + +SOURCE=.\ActiveXSurrogate.cpp +# End Source File +# Begin Source File + +SOURCE=.\Decal.cpp +# End Source File +# Begin Source File + +SOURCE=.\Decal.def +# End Source File +# Begin Source File + +SOURCE=..\Include\Decal.idl + +!IF "$(CFG)" == "Decal - Win32 Debug" + +# ADD MTL /nologo /tlb "Decal.tlb" /h "..\Include\Decal.h" /iid "..\Include\Decal_i.c" /Oicf + +!ELSEIF "$(CFG)" == "Decal - Win32 Release MinSize" + +# ADD MTL /tlb "Decal.tlb" /h "..\Include\Decal.h" /iid "..\Include\Decal_i.c" /Oicf + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\Decal.rc +# End Source File +# Begin Source File + +SOURCE=.\DecalEnum.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalManager.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalRes.cpp +# End Source File +# Begin Source File + +SOURCE=.\PluginSite.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\SurrogateRemove.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ACHooks.h +# End Source File +# Begin Source File + +SOURCE=.\ActiveXSurrogate.h +# End Source File +# Begin Source File + +SOURCE=..\Include\ApiHook.h +# End Source File +# Begin Source File + +SOURCE=.\DecalCP.h +# End Source File +# Begin Source File + +SOURCE=.\DecalEnum.h +# End Source File +# Begin Source File + +SOURCE=..\Include\DecalImpl.h +# End Source File +# Begin Source File + +SOURCE=.\DecalManager.h +# End Source File +# Begin Source File + +SOURCE=.\DecalRes.h +# End Source File +# Begin Source File + +SOURCE=.\DecalVersion.h +# End Source File +# Begin Source File + +SOURCE=.\PluginSite.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\SurrogateRemove.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\ACHooks.rgs +# End Source File +# Begin Source File + +SOURCE=.\ActiveXSurrogate.rgs +# End Source File +# Begin Source File + +SOURCE=.\Decal.rgs +# End Source File +# Begin Source File + +SOURCE=.\DecalNode.rgs +# End Source File +# Begin Source File + +SOURCE=.\DecalRes.rgs +# End Source File +# Begin Source File + +SOURCE=.\PluginAdapterV1.rgs +# End Source File +# Begin Source File + +SOURCE=.\SurrogateRemove.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/Decal/Decal.rc b/Native/Decal/Decal.rc new file mode 100644 index 0000000..0a02cc6 --- /dev/null +++ b/Native/Decal/Decal.rc @@ -0,0 +1,157 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""Decal.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "Decal Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "Decal" + VALUE "LegalCopyright", "Copyright 2001-2002" + VALUE "OriginalFilename", "Decal.DLL" + VALUE "ProductName", "Decal Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_ACHooks REGISTRY "ACHooks.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "Decal" + IDS_ACHOOKS_DESC "ACHooks Class" +END + +STRINGTABLE +BEGIN + IDE_INDEXOUTOFRANGE "The provided index is below 0 or greater than the number of items in the list." + IDE_BADINDEXTYPE "Index type must be an integer or a string." + IDE_CLASSNOTFOUND "The CLSID could not be found in the registry" + IDE_CLASSKEYNOTFOUND "The requested class key could not be found in the registry." + IDE_GROUPKEYNOTOPEN "Could not open group registry key." + IDE_INVALIDSUBKEYS "Could not count the number of subkeys." + IDE_BADITERATOR "The enumeration is before the beginning or after the end." + IDE_MOVEUPTOP "Cannot move up the top entry." + IDE_MOVEDOWNBOTTOM "Cannot move bottom item down." + IDE_SURROGATEDISABLED "The surrogate for this object is disabled, the object cannot be created." +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_DECAL REGISTRY "Decal.rgs" +IDR_SURROGATEREMOVE REGISTRY "SurrogateRemove.rgs" +IDR_ACTIVEXSURROGATE REGISTRY "ActiveXSurrogate.rgs" +IDR_DECALRES REGISTRY "DecalRes.rgs" +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "Decal.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/Decal/Decal.rgs b/Native/Decal/Decal.rgs new file mode 100644 index 0000000..eb0fe66 --- /dev/null +++ b/Native/Decal/Decal.rgs @@ -0,0 +1,25 @@ +HKCR +{ + Decal.Decal.1 = s 'Decal Class' + { + CLSID = s '{4557D5A1-00DB-48F6-ACB3-4FEF30E2F358}' + } + Decal.Decal = s 'Decal Class' + { + CLSID = s '{4557D5A1-00DB-48F6-ACB3-4FEF30E2F358}' + CurVer = s 'Decal.Decal.1' + } + NoRemove CLSID + { + ForceRemove {4557D5A1-00DB-48F6-ACB3-4FEF30E2F358} = s 'Decal Class' + { + ProgID = s 'Decal.Decal.1' + VersionIndependentProgID = s 'Decal.Decal' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{FF7F5F6D-34E0-4B6F-B3BB-8141DE2EF732}' + } + } +} diff --git a/Native/Decal/Decal.vcproj b/Native/Decal/Decal.vcproj new file mode 100644 index 0000000..fa58a2f --- /dev/null +++ b/Native/Decal/Decal.vcproj @@ -0,0 +1,987 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/Decal/DecalCP.h b/Native/Decal/DecalCP.h new file mode 100644 index 0000000..cc280c3 --- /dev/null +++ b/Native/Decal/DecalCP.h @@ -0,0 +1,202 @@ +#ifndef _DECALCP_H_ +#define _DECALCP_H_ + +template +class CProxyIACHooksEvents : public IConnectionPointImpl +{ +public: + HRESULT Fire_ObjectDestroyed(LONG guid) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = guid; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + + VARIANT_BOOL Fire_OnChatBoxMessage(BSTR bstrText, LONG lColor) + { + VARIANT_BOOL bEatProc = VARIANT_FALSE; + VARIANT_BOOL bEatLocal = VARIANT_FALSE; + HRESULT hr = S_OK; + T * pThis = static_cast(this); + int cConnections = m_vec.GetSize(); + + for (int iConnection = 0; iConnection < cConnections; iConnection++) + { + pThis->Lock(); + CComPtr punkConnection = m_vec.GetAt(iConnection); + pThis->Unlock(); + + IDispatch * pConnection = reinterpret_cast(punkConnection.p); + + if (pConnection) + { + // operator= doesn't accept VARIANT_BOOL * + VARIANT vt; + ::VariantInit(&vt); + vt.vt = VT_BYREF | VT_BOOL; + vt.pboolVal = &bEatLocal; + + CComVariant avarParams[3]; + avarParams[2] = bstrText; + avarParams[1] = lColor; + avarParams[0] = vt; + CComVariant varResult; + + DISPPARAMS params = { avarParams, NULL, 3, 0 }; + hr = pConnection->Invoke(2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL); + + if( bEatLocal == VARIANT_TRUE ) + bEatProc = VARIANT_TRUE; + } + } + + return bEatProc; + } + + VARIANT_BOOL Fire_OnCommandLineText( BSTR bstrText ) + { + VARIANT_BOOL bEatProc = VARIANT_FALSE; + VARIANT_BOOL bEatLocal = VARIANT_FALSE; + HRESULT hr = S_OK; + T * pThis = static_cast(this); + int cConnections = m_vec.GetSize(); + + for (int iConnection = 0; iConnection < cConnections; iConnection++) + { + pThis->Lock(); + CComPtr punkConnection = m_vec.GetAt(iConnection); + pThis->Unlock(); + + IDispatch * pConnection = reinterpret_cast(punkConnection.p); + + if (pConnection) + { + // operator= doesn't accept VARIANT_BOOL * + VARIANT vt; + ::VariantInit(&vt); + vt.vt = VT_BYREF | VT_BOOL; + vt.pboolVal = &bEatLocal; + + CComVariant avarParams[2]; + avarParams[1] = bstrText; + avarParams[0] = vt; + CComVariant varResult; + + DISPPARAMS params = { avarParams, NULL, 2, 0 }; + hr = pConnection->Invoke(3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL); + + if( bEatLocal == VARIANT_TRUE ) + bEatProc = VARIANT_TRUE; + } + } + + return bEatProc; + } + + HRESULT Fire_OnSelectItem(LONG guid) + { + + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = guid; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x4, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + + void Fire_OnToolText(BSTR bstrText, VARIANT_BOOL bError) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + // operator= doesn't accept VARIANT_BOOL * + VARIANT vt; + ::VariantInit(&vt); + vt.vt = VT_BYREF | VT_BOOL; + vt.pboolVal = &bError; + + pvars[1] = bstrText; + pvars[0] = vt; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(5, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + + void Fire_OnToolTextAppend(BSTR bstrText, VARIANT_BOOL bError) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + // operator= doesn't accept VARIANT_BOOL * + VARIANT vt; + ::VariantInit(&vt); + vt.vt = VT_BYREF | VT_BOOL; + vt.pboolVal = &bError; + + pvars[1] = bstrText; + pvars[0] = vt; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } +}; +#endif \ No newline at end of file diff --git a/Native/Decal/DecalEnum.cpp b/Native/Decal/DecalEnum.cpp new file mode 100644 index 0000000..26e3cd6 --- /dev/null +++ b/Native/Decal/DecalEnum.cpp @@ -0,0 +1,519 @@ +// DecalEnum.cpp : Implementation of cDecalEnum +#include "stdafx.h" +#include "Decal.h" +#include "DecalEnum.h" + +///////////////////////////////////////////////////////////////////////////// +// cDecalEnum + +cDecalEnum::~cDecalEnum() +{ + // Write out the order if there were changes + if ( !m_bOrderChanged ) + return; + + USES_CONVERSION; + + std::string strOrder; + strOrder.reserve ( m_keys.size () ); + + for ( cKeyList::iterator i = m_keys.begin (); i != m_keys.end(); ++ i ) + strOrder += i->m_letter; + + // Compile the new order from the + RegKey hkGroup; + if( hkGroup.Create( HKEY_LOCAL_MACHINE, m_strGroupKey.c_str() ) != ERROR_SUCCESS ) + { + _ASSERTE ( FALSE ); + return; + } + + hkGroup.SetStringValue (_T("Order"), strOrder.c_str ()); +} + +bool cDecalEnum::Initialize( IDecal *pDecal, BSTR strKey ) +{ + _ASSERTE( pDecal != NULL ); + + USES_CONVERSION; + m_strGroupKey = "SOFTWARE\\Decal\\"; + m_strGroupKey += OLE2A( strKey ); + m_strGroup = strKey; + m_pDecal = pDecal; + m_nIndex = -1; + m_bOrderChanged = false; + + return true; +} + +HRESULT cDecalEnum::Advance( REFCLSID clsid ) +{ + // Assign a dummy letter + cKeyEntry ke; + ke.m_clsid = clsid; + ke.m_letter = _T( 'A' ); + m_keys.reserve ( 1 ); + m_keys.push_back ( ke ); + + return openKeyAt ( 0 ); +} + +HRESULT cDecalEnum::Begin() +{ + USES_CONVERSION; + + // Load and sort the list + RegKey hkGroup; + if( hkGroup.Create( HKEY_LOCAL_MACHINE, m_strGroupKey.c_str() ) != ERROR_SUCCESS ) + return Error ( IDE_GROUPKEYNOTOPEN ); + + // Load the order string and prepare a new item string + std::string strIdentifiers( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,./;'[]-=`<>?:{}|_+`!@#$%^&*()" ); + DWORD nMaxOrder = strIdentifiers.length (); + LPTSTR szOrder = reinterpret_cast< LPTSTR > ( _alloca ( sizeof ( TCHAR ) * nMaxOrder ) ); + + // Count the number of subkeys + DWORD dwSubkeys; + if ( ::RegQueryInfoKey ( hkGroup, NULL, NULL, NULL, &dwSubkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) != ERROR_SUCCESS ) + return Error ( IDE_INVALIDSUBKEYS ); + m_keys.reserve ( dwSubkeys ); + + LPTSTR szEndOrder; + + // Load an existing order + if ( hkGroup.QueryStringValue (_T("Order"), szOrder, &nMaxOrder) == ERROR_SUCCESS ) + { + szEndOrder = szOrder + ( nMaxOrder - 1 ); + + // Sort and merge the differences + std::string strOrder ( szOrder, szEndOrder ); + std::sort ( strOrder.begin (), strOrder.end () ); + std::string strMerged; + strMerged.reserve ( strIdentifiers.length () - ( nMaxOrder - 1 ) ); + std::set_difference ( strIdentifiers.begin (), strIdentifiers.end (), strOrder.begin (), strOrder.end (), std::inserter ( strMerged, strMerged.end() ) ); + + // Reset the identifiers to exclude the currently used ones + strIdentifiers.swap ( strMerged ); + } + else + { + szOrder[ 0 ] = _T( '\0' ); + szEndOrder = szOrder; + } + + std::string::iterator iNextID = strIdentifiers.begin (); + + // Now we walk through the subkeys and insert in order + TCHAR szCLSID[ 64 ]; + + for ( int i = 0; ::RegEnumKey ( hkGroup, i, szCLSID, sizeof ( szCLSID ) ) == ERROR_SUCCESS; ++ i ) + { + CLSID clsid; + HRESULT hRes = ::CLSIDFromString ( T2OLE ( szCLSID ), &clsid ); + if ( FAILED ( hRes ) ) + // Skip non-CLSID keys + continue; + + RegKey hkItem; + if ( hkItem.Open ( hkGroup, szCLSID ) != ERROR_SUCCESS ) + continue; + + // Attempt to read the sequence indicator + TCHAR szSequence[ 4 ]; + DWORD dwSequence = sizeof ( szSequence ); + cKeyEntry ke; + ke.m_clsid = clsid; + + if ( hkItem.QueryStringValue ( _T( "Order" ), szSequence, &dwSequence ) == ERROR_SUCCESS ) + { + _ASSERTE ( szSequence[ 1 ] == _T( '\0' ) ); + + ke.m_letter = *szSequence; + insertKey ( ke, szOrder, szEndOrder ); + continue; + } + + // There's no sequence current, add on to the end + _ASSERTE ( iNextID != strIdentifiers.end () ); + ke.m_letter = *( iNextID ++ ); + m_keys.push_back ( ke ); + TCHAR szVal[ 2 ] = { ke.m_letter, _T( '\0' ) }; + hkItem.SetStringValue ( _T( "Order" ), szVal ); + + // The sequence is changed by adding items + m_bOrderChanged = true; + } + + return S_OK; +} + +void cDecalEnum::insertKey ( cKeyEntry &ke, TCHAR *szOrder, TCHAR *szEndOrder ) +{ + // Insert the item in the correct order into the list - first + // find the sequence number in the list + for ( TCHAR *szOrderIndex = szOrder; szOrderIndex != szEndOrder; ++ szOrderIndex ) + if ( *szOrderIndex == ke.m_letter ) + break; + + if ( szOrderIndex == szEndOrder ) + { + // This item is last, don't search for anything after + m_keys.push_back ( ke ); + return; + } + + // We have an insert, search for the member to insert before + for ( szOrderIndex = szOrderIndex + 1; szOrderIndex != szEndOrder; ++ szOrderIndex ) + { + // Search for a matchinf item in the array + for ( cKeyList::iterator j = m_keys.begin(); j != m_keys.end(); ++ j ) + { + if ( j->m_letter == *szOrderIndex ) + { + m_keys.insert ( j, ke ); + return; + } + } + } + + // The next entry most likely hasn't been loaded yet - just append + m_keys.push_back ( ke ); +} + +HRESULT cDecalEnum::openKeyAt ( int nIndex ) +{ + USES_CONVERSION; + + if ( m_key.m_hKey != NULL ) + m_key.Close (); + + LPOLESTR strClsid; + ::StringFromCLSID( m_keys[ nIndex ].m_clsid, &strClsid ); + LPCTSTR szClsid = OLE2T( strClsid ); + ::CoTaskMemFree( strClsid ); + + std::string strItemKey = m_strGroupKey + _T( "\\" ); + strItemKey += szClsid; + if ( m_key.Open ( HKEY_LOCAL_MACHINE, strItemKey.c_str () ) != ERROR_SUCCESS ) + return Error ( IDE_CLASSKEYNOTFOUND ); + + m_nIndex = nIndex; + return S_OK; +} + +STDMETHODIMP cDecalEnum::get_FriendlyName(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + USES_CONVERSION; + + TCHAR szName[ MAX_PATH ]; + DWORD dwSize = MAX_PATH; + if( m_key.QueryStringValue( NULL, szName, &dwSize ) != ERROR_SUCCESS ) + return E_FAIL; + + *pVal = T2BSTR( szName ); + + return S_OK; +} + +STDMETHODIMP cDecalEnum::get_ComClass(CLSID *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + USES_CONVERSION; + + *pVal = m_keys[ m_nIndex ].m_clsid; + + return S_OK; +} + +STDMETHODIMP cDecalEnum::get_Enabled(VARIANT_BOOL *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + DWORD dwEnabled; + if( m_key.QueryDWORDValue( _T("Enabled"), dwEnabled ) != ERROR_SUCCESS ) + // Plugins are enabled when this value is ommitted + dwEnabled = TRUE; + + *pVal = ( dwEnabled ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cDecalEnum::put_Enabled(VARIANT_BOOL newVal) +{ + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + if( m_key.SetDWORDValue( _T( "Enabled" ), ( ( newVal ) ? 1 : 0 ) ) != ERROR_SUCCESS ) + return E_FAIL; + + return S_OK; +} + +STDMETHODIMP cDecalEnum::CreateInstance(REFIID iid, LPVOID *ppvItf) +{ + CLSID clsidSurrogate; + if( FAILED( get_SurrogateClass( &clsidSurrogate ) ) ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + if( clsidSurrogate == GUID_NULL ) + { + // Create the object without a surrogate + CLSID clsidObject; + HRESULT hRes = get_ComClass( &clsidObject ); + if( FAILED( hRes ) ) + return hRes; + + return ::CoCreateInstance( clsidObject, NULL, CLSCTX_INPROC_SERVER, iid, ppvItf ); + } + + // Create the surrogate object + CComPtr< IDecalEnum > pEnum; + static _bstr_t _strSurrogates ( _T( "Surrogates" ) ); + + HRESULT hRes = m_pDecal->get_Configuration ( _strSurrogates, clsidSurrogate, &pEnum ); + if ( !SUCCEEDED ( hRes ) ) + return hRes; + + VARIANT_BOOL bEnabled; + hRes = pEnum->get_Enabled ( &bEnabled ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + + if ( !bEnabled ) + return Error ( IDE_SURROGATEDISABLED ); + + CComPtr< IDecalSurrogate > pSurrogate; + hRes = pEnum->CreateInstance ( IID_IDecalSurrogate, reinterpret_cast< LPVOID * > ( &pSurrogate ) ); + + if( FAILED( hRes ) ) + return hRes; + + return pSurrogate->CreateInstance( this, iid, ppvItf ); +} + +STDMETHODIMP cDecalEnum::Next() +{ + if ( m_nIndex == m_keys.size () - 1 ) + { + // End of iteration + if ( m_key.m_hKey != NULL ) + m_key.Close (); + + return S_FALSE; + } + + return openKeyAt ( m_nIndex + 1 ); +} + +STDMETHODIMP cDecalEnum::get_SurrogateClass(CLSID *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + USES_CONVERSION; + + TCHAR szName[ MAX_PATH + 1 ]; + DWORD dwSize = MAX_PATH + 1; + + if( m_key.QueryStringValue( _T("Surrogate"), szName, &dwSize ) != ERROR_SUCCESS ) + { + // If the surrogate is not found, return the NULL guid + *pVal = GUID_NULL; + return S_OK; + } + + return ::CLSIDFromString( T2OLE( szName ), pVal ); +} + +STDMETHODIMP cDecalEnum::get_ResourcePath(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + USES_CONVERSION; + + TCHAR szName[ MAX_PATH ]; + DWORD dwSize = MAX_PATH; + if( m_key.QueryStringValue( NULL, szName, &dwSize ) != ERROR_SUCCESS ) + return E_FAIL; + + *pVal = T2BSTR( szName ); + + return S_OK; +} + +STDMETHODIMP cDecalEnum::get_Property(BSTR Name, VARIANT *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + USES_CONVERSION; + + LPCTSTR szValueName = OLE2T( Name ); + + // Get some info about the property + DWORD dwDataType; + if( ::RegQueryValueEx( m_key.m_hKey, szValueName, NULL, &dwDataType, NULL, NULL ) != ERROR_SUCCESS ) + // We'll assume there's no value + return E_INVALIDARG; + + switch( dwDataType ) + { + case REG_DWORD: + { + DWORD dwValue; + if( m_key.QueryDWORDValue( szValueName, dwValue ) != ERROR_SUCCESS ) + return E_FAIL; + + pVal->vt = VT_I4; + pVal->lVal = dwValue; + return S_OK; + } + break; + + case REG_EXPAND_SZ: + case REG_SZ: + { + TCHAR szValue[ MAX_PATH ]; + DWORD dwSize = MAX_PATH; + if( m_key.QueryStringValue( szValueName, szValue, &dwSize ) != ERROR_SUCCESS ) + return E_FAIL; + + pVal->vt = VT_BSTR; + pVal->bstrVal = T2BSTR( szValue ); + return S_OK; + } + break; + } + + return E_INVALIDARG; +} + +STDMETHODIMP cDecalEnum::get_Group(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = OLE2BSTR( m_strGroup ); + + return S_OK; +} + +STDMETHODIMP cDecalEnum::Skip (REFCLSID clsid) +{ + // Search our loaded list for the clsid + for ( cKeyList::iterator i = m_keys.begin (); i != m_keys.end(); ++ i ) + { + if ( clsid == i->m_clsid ) + return openKeyAt ( i - m_keys.begin() ); + } + + return Error ( IDE_CLASSNOTFOUND ); +} + +STDMETHODIMP cDecalEnum::MoveBefore(REFCLSID clsidBefore) +{ + if( m_key.m_hKey == NULL ) + { + _ASSERT( FALSE ); + return Error ( IDE_BADITERATOR ); + } + + // Find the entry we're inserting before + for ( cKeyList::iterator i = m_keys.begin (); i != m_keys.end(); ++ i ) + { + if ( i->m_clsid == clsidBefore ) + break; + } + + if ( i == m_keys.end () ) + return Error ( IDE_CLASSNOTFOUND ); + + int nFoundIndex = i - m_keys.begin (); + if ( nFoundIndex == m_nIndex ) + // No op + return S_FALSE; + + if ( nFoundIndex > m_nIndex ) + -- nFoundIndex; + + cKeyEntry eRemoved = m_keys[ m_nIndex ]; + m_keys.erase ( m_keys.begin () + m_nIndex ); + + m_keys.insert ( m_keys.begin () + nFoundIndex, eRemoved ); + + // Reset so we're still on the same item + m_nIndex = nFoundIndex; + m_bOrderChanged = true; + + return S_OK; +} diff --git a/Native/Decal/DecalEnum.h b/Native/Decal/DecalEnum.h new file mode 100644 index 0000000..b8a4e59 --- /dev/null +++ b/Native/Decal/DecalEnum.h @@ -0,0 +1,76 @@ +// DecalEnum.h : Declaration of the cDecalEnum + +#ifndef __DECALENUM_H_ +#define __DECALENUM_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cDecalEnum +class ATL_NO_VTABLE cDecalEnum : + public CComObjectRootEx, + public CComCoClass, + public IDecalEnum +{ +public: + cDecalEnum() + : m_nIndex( -1 ) + { + } + + ~cDecalEnum(); + +DECLARE_REGISTRY_RESOURCEID(IDR_DECALENUM) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDecalEnum) + COM_INTERFACE_ENTRY(IDecalEnum) +END_COM_MAP() + + bool Initialize( IDecal *pDecal, BSTR strKey ); + + // Skip to a single key - next will terminate iteration + HRESULT Advance( REFCLSID clsid ); + // Load an ordered list of keys + HRESULT Begin(); + + struct cKeyEntry + { + CLSID m_clsid; + TCHAR m_letter; + }; + + void insertKey ( cKeyEntry &ke, TCHAR *szOrder, TCHAR *szEndOrder ); + HRESULT openKeyAt ( int nIndex ); + + typedef std::vector< cKeyEntry > cKeyList; + cKeyList m_keys; + + int m_nIndex; + _bstr_t m_strGroup; + std::string m_strGroupKey; + RegKey m_key; + bool m_bOrderChanged; + + // This member is purely for holdinga reference to the main decal object + // and keep this object from being orphaned + CComPtr< IDecal > m_pDecal; + +// IDecalEnum +public: + STDMETHOD(MoveBefore)(REFCLSID clsidBefore); + STDMETHOD(get_Group)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Property)(BSTR Name, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(get_ResourcePath)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_SurrogateClass)(/*[out, retval]*/ CLSID *pVal); + STDMETHOD(Next)(); + STDMETHOD(CreateInstance)(REFIID iid, /*[out, retval, iid_is(iid)]*/ LPVOID *ppvItf); + STDMETHOD(get_Enabled)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Enabled)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_ComClass)(/*[out, retval]*/ CLSID *pVal); + STDMETHOD(get_FriendlyName)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(Skip)(REFCLSID clsid); +}; + +#endif //__DECALENUM_H_ diff --git a/Native/Decal/DecalManager.cpp b/Native/Decal/DecalManager.cpp new file mode 100644 index 0000000..64bd503 --- /dev/null +++ b/Native/Decal/DecalManager.cpp @@ -0,0 +1,636 @@ +// DecalManager.cpp : Implementation of cDecal +#include "stdafx.h" +#include "Decal.h" +#include "DecalManager.h" + +#include "DecalEnum.h" +#include "PluginSite.h" + +///////////////////////////////////////////////////////////////////////////// +// cDecal + +HRESULT cDecal::convertToken( std::string &strToken, std::string &strOut ) +{ + USES_CONVERSION; + + struct cPathRegistry + { + LPCTSTR szToken, + szKey, + szValue; + }; + + static cPathRegistry _paths[] = { + { _T( "ac" ), _T( "SOFTWARE\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00" ), _T( "Portal Dat" ) }, + { _T( "decal" ), _T( "SOFTWARE\\Decal\\Agent" ), _T( "AgentPath" ) } }, + *_end_paths = _paths + sizeof( _paths ) / sizeof( cPathRegistry ); + + // There are two types of tokens, ones that contain a colon (object relative) + // and the other kind, which just gets looked up in the registry + int nColon = strToken.find_first_of( _T( ':' ) ); + if( nColon == std::string::npos ) + { + // Take the whole token string and look it up + for( cPathRegistry *pPath = _paths; pPath != _end_paths; ++ pPath ) + { + if( strToken.compare( pPath->szToken ) != 0 ) + continue; + + // Found the path now look it up in the registry + DWORD dwCount = MAX_PATH; + TCHAR szBuffer[ MAX_PATH ]; + RegKey key; + key.Open( HKEY_LOCAL_MACHINE, pPath->szKey ); + key.QueryStringValue (pPath->szValue, szBuffer, &dwCount); + + strOut += T2A( szBuffer ); + return S_OK; + } + + // Token not found + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + // Attempt to convert the CLSID + LPOLESTR strCLSID = A2OLE( strToken.substr( nColon + 1 ).c_str() ); + HRESULT hRes; + CLSID clsid; + + if( strCLSID[ 0 ] == OLESTR( '{' ) ) + hRes = ::CLSIDFromString( strCLSID, &clsid ); + else + hRes = ::CLSIDFromProgID( strCLSID, &clsid ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + CComPtr< IDecalEnum > pEnum; + if( get_Configuration( _bstr_t( strToken.substr( 0, nColon ).c_str() ), clsid, &pEnum ) != S_OK ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + CComBSTR strResourcePath; + if( FAILED( pEnum->get_ResourcePath( &strResourcePath ) ) ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + strOut += OLE2A( strResourcePath ); + return S_OK; +} + +STDMETHODIMP cDecal::InitGraphics( IUnknown *pDirectDraw, IUnknown *pD3DDevice ) +{ + m_pD = static_cast< IDirectDraw4 * >( pDirectDraw ); + m_pD3D = static_cast< IDirect3DDevice3 * >( pD3DDevice ); + + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + { + if( !( i->m_dwCaps & eServiceRender ) ) + continue; + + CComPtr< IDecalRender > pRender; + HRESULT hRes = i->m_p->QueryInterface( &pRender ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pRender->ChangeDirectX(); + } + + return S_OK; +} + +STDMETHODIMP cDecal::get_DirectDraw(REFIID iid, VOID * * ppvItf) +{ + return m_pD->QueryInterface( iid, ppvItf ); +} + +STDMETHODIMP cDecal::get_D3DDevice(REFIID iid, VOID * * ppvItf) +{ + return m_pD3D->QueryInterface( iid, ppvItf ); +} + +STDMETHODIMP cDecal::get_HWND(LONG * pVal) +{ + if (pVal == NULL) + return E_POINTER; + + *pVal = reinterpret_cast< long >( m_hWnd ); + return S_OK; +} + +STDMETHODIMP cDecal::put_HWND( LONG newVal ) +{ + HWND newWnd = reinterpret_cast< HWND >( newVal ); + + if( newWnd != m_hWnd ) + { + m_hWnd = newWnd; + + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + { + if( !( i->m_dwCaps & eServiceRender ) ) + continue; + + CComPtr< IDecalRender > pRender; + HRESULT hRes = i->m_p->QueryInterface( &pRender ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pRender->ChangeHWND(); + } + } + + return S_OK; +} + +STDMETHODIMP cDecal::get_Focus(VARIANT_BOOL * pVal) +{ + if (pVal == NULL) + return E_POINTER; + + *pVal = m_bFocus; + + return S_OK; +} + +STDMETHODIMP cDecal::put_Focus( VARIANT_BOOL newVal ) +{ + m_bFocus = newVal; + + return S_OK; +} + +STDMETHODIMP cDecal::get_ScreenSize(long *pWidth, long *pHeight) +{ + if (pWidth == NULL || pHeight == NULL) + return E_POINTER; + + RECT rc; + ::GetClientRect( m_hWnd, &rc ); + + *pWidth = rc.right - rc.left; + *pHeight = rc.bottom - rc.top; + + return S_OK; +} + +STDMETHODIMP cDecal::MapPath(BSTR pPath, BSTR * pMapped) +{ + USES_CONVERSION; + + if (pMapped == NULL) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + std::string str( OLE2A( pPath ) ), + strOut; + + // If the base implementation, iterate over the %% pairs and make substitutions + // where appropriate + int nIterate = 0; + for( ;; ) + { + int nStart = str.find_first_of( _T( '%' ), nIterate ); + + if( nStart == std::string::npos ) + { + strOut += str.substr( nIterate ); + break; + } + + int nEnd = str.find_first_of( _T( '%' ), nStart + 1 ); + + HRESULT hRes = convertToken( str.substr( nStart + 1, nEnd - ( nStart + 1 ) ), strOut ); + if( FAILED( hRes ) ) + return hRes; + + if( nEnd == std::string::npos ) + { + // Unterminated '%' + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + nIterate = nEnd + 1; + if( nIterate == str.length() ) + { + // The string ended in a token, break now + break; + } + } + + // We're done - convert the string + *pMapped = A2BSTR( strOut.c_str() ); + + return S_OK; +} + +STDMETHODIMP cDecal::StartPlugins() +{ + if( !m_bServicesStarted ) + { + HRESULT hRes = StartServices(); + if( FAILED( hRes ) ) + return hRes; + } + + if( m_bPluginsStarted ) + return S_FALSE; + + // Walk through the list of services and send the plugin start notification + { + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + i->m_p->BeforePlugins(); + } + + CComPtr< IDecalEnum > pEnumPlugins; + get_Configuration( _bstr_t( "Plugins" ), GUID_NULL, &pEnumPlugins ); + + while( pEnumPlugins->Next() == S_OK ) + { + VARIANT_BOOL bEnabled; + pEnumPlugins->get_Enabled( &bEnabled ); + + if( !bEnabled ) + continue; + + cPlugin plugin; + pEnumPlugins->get_ComClass( &plugin.m_clsid ); + + // Attempt to make an instance of the plugin + CComPtr< IPlugin2 > pPlugin; + HRESULT hRes = pEnumPlugins->CreateInstance( __uuidof( IPlugin2 ), reinterpret_cast< void ** >( &pPlugin ) ); + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + continue; + } + + CComObject< cPluginSite > *pSite; + CComObject< cPluginSite >::CreateInstance( &pSite ); + + CComPtr< IPluginSite2 > pSiteRef = pSite; + + pSite->m_pPlugin = pPlugin; + pSite->m_pDecal = this; + + hRes = pSite->m_pPlugin->Initialize( pSiteRef ); + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + continue; + } + + plugin.m_pSite = pSite; + m_plugins.push_back( plugin ); + + // NOTE: If the plugin has not stored the IPluginSite2 interface pointer, it + // will immediately terminate + } + + m_bPluginsStarted = true; + + return S_OK; +} + +STDMETHODIMP cDecal::StopPlugins() +{ + if( !m_bPluginsStarted ) + return S_FALSE; + + IPluginSite2 **pSites = reinterpret_cast< IPluginSite2 ** > ( _alloca ( sizeof ( IPluginSite2 * ) * m_plugins.size () ) ); + + { + IPluginSite2 **i2 = pSites; + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++ i, ++ i2 ) + *i2 = i->m_pSite; + } + + { + IPluginSite2 **end_sites = pSites + m_plugins.size (); + for ( IPluginSite2 **i = pSites; i != end_sites; ++ i ) + ( *i )->Unload (); + } + + _ASSERTE ( m_plugins.empty () ); + m_bPluginsStarted = false; + + // Walk through the list of services and send the plugin start notification + { + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + i->m_p->AfterPlugins(); + } + + return S_OK; +} + +STDMETHODIMP cDecal::get_Object(BSTR strPath, REFIID iid, LPVOID *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + USES_CONVERSION; + + std::string str = OLE2A( strPath ); + + // OK, strPath is formated as such, {plugin|service}\{{clsid|progid}[\text] + int nOffset = str.find_first_of( _T( '\\' ) ); + if( nOffset == std::string::npos ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + // Find the next backslash + int nclsid = str.find_first_of( _T( '\\' ), nOffset + 1 ); + + // Attempt to convert it to a CLSID + std::string strCLSID = str.substr( nOffset + 1, nclsid - ( nOffset + 1 ) ); + CLSID clsid; + HRESULT hRes; + + if( strCLSID[ 0 ] == _T( '{' ) ) + hRes = ::CLSIDFromString( A2OLE( strCLSID.c_str() ), &clsid ); + else + hRes = ::CLSIDFromProgID( A2OLE( strCLSID.c_str() ), &clsid ); + + if( FAILED( hRes ) ) + { + // The substring could not be converted to a proper CLSID + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + std::string collection = str.substr( 0, nOffset ); + + CComPtr< IUnknown > pObject; + + if( collection.compare( "plugins" ) == 0 ) + { + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++ i ) + { + if( i->m_clsid == clsid ) + { + pObject = i->m_pSite->m_pPlugin; + break; + } + } + } + else if( collection.compare( "services" ) == 0 ) + { + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + { + if( i->m_clsid == clsid ) + { + pObject = i->m_p; + break; + } + } + } + else + { + // Invalid prefix + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + if( pObject == NULL ) + { + // Could not find a match for that clsid + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + while( nclsid != std::string::npos ) + { + CComPtr< IDecalDirectory > pDir; + HRESULT hRes = pObject->QueryInterface( &pDir ); + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + int nEndclsid = str.find_first_of( _T( '\\' ), nclsid + 1 ); + pObject.Release(); + hRes = pDir->Lookup( _bstr_t( str.substr( nclsid + 1, nEndclsid - ( nclsid + 1 ) ).c_str() ), &pObject ); + if( FAILED( hRes ) ) + return hRes; + + nclsid = nEndclsid; + } + + return pObject->QueryInterface( iid, pVal ); +} + +struct cItfCaps +{ + const IID *iid; + DWORD m_dwMask; +}; + +STDMETHODIMP cDecal::StartServices() +{ + static cItfCaps _service_caps[] = { + { &IID_IDecalRender, eServiceRender } }, + *_end_service_caps = _service_caps + sizeof( _service_caps ) / sizeof( cItfCaps ); + + if( m_bServicesStarted ) + // They've already been started + return S_FALSE; + + m_pHooks.CoCreateInstance( _bstr_t( "Decal.ACHooks" ), NULL, CLSCTX_INPROC_SERVER ); + m_pHooks->SetDecal( reinterpret_cast< IUnknown * >( this ) ); + + CComPtr< IDecalEnum > pEnumServices; + get_Configuration( _bstr_t( "Services" ), GUID_NULL, &pEnumServices ); + + while( pEnumServices->Next() == S_OK ) + { + VARIANT_BOOL bEnabled; + HRESULT hRes = pEnumServices->get_Enabled ( &bEnabled ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + + if ( !bEnabled ) + continue; + + cService service; + pEnumServices->get_ComClass( &service.m_clsid ); + hRes = pEnumServices->CreateInstance( __uuidof( IDecalService ), reinterpret_cast< void ** >( &service.m_p ) ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + // Unlike plugins, all services must initialize correctly + return hRes; + } + + hRes = service.m_p->Initialize( this ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + // The service could not initialize for some reason + return hRes; + } + + service.m_dwCaps = 0; + CComPtr< IUnknown > pUnkCaps; + for( cItfCaps *i_caps = _service_caps; i_caps != _end_service_caps; ++ i_caps ) + { + HRESULT hRes = service.m_p->QueryInterface( *i_caps->iid, reinterpret_cast< void ** >( &pUnkCaps ) ); + if( SUCCEEDED( hRes ) ) + { + service.m_dwCaps |= i_caps->m_dwMask; + pUnkCaps.Release(); + } + } + + m_services.push_back( service ); + } + + m_bServicesStarted = true; + + return S_OK; +} + +STDMETHODIMP cDecal::get_Configuration(BSTR strType, REFCLSID clsidAdvance, IDecalEnum **pVal) +{ + if (pVal == NULL) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + CComObject< cDecalEnum > *pEnum; + HRESULT hRes = CComObject< cDecalEnum >::CreateInstance( &pEnum ); + + if( FAILED( hRes ) ) + return hRes; + + CComPtr< IUnknown > pUnk = pEnum; + + if( !pEnum->Initialize( this, strType ) ) + return E_FAIL; + + if( clsidAdvance != GUID_NULL ) + { + HRESULT hRes = pEnum->Advance( clsidAdvance ); + if ( FAILED ( hRes ) ) + return hRes; + } + else + { + HRESULT hRes = pEnum->Begin(); + if ( FAILED ( hRes ) ) + return hRes; + } + + return pUnk->QueryInterface( pVal ); +} + +STDMETHODIMP cDecal::StopServices() +{ + if( m_bPluginsStarted ) + StopPlugins( ); + + if( !m_bServicesStarted ) + return S_FALSE; + + try + { + while( !m_services.empty() ) + { + cServiceList::iterator i = ( m_services.end() - 1 ); + + i->m_p->Terminate(); + + m_services.erase( i ); + } + } + + catch( ... ) + { + } + + if( m_pHooks.p ) + m_pHooks.Release( ); + + return S_OK; +} + +STDMETHODIMP cDecal::get_Plugin(REFCLSID clsid, REFIID iid, LPVOID *pVal) +{ + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++ i ) + { + if( i->m_clsid == clsid ) + return i->m_pSite->m_pPlugin->QueryInterface( iid, pVal ); + } + + return E_INVALIDARG; +} + +STDMETHODIMP cDecal::get_Service(REFCLSID clsid, REFIID iid, LPVOID *pVal) +{ + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + { + if( i->m_clsid == clsid ) + return i->m_p->QueryInterface( iid, pVal ); + } + + return E_INVALIDARG; +} + +STDMETHODIMP cDecal::Render2D() +{ + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + { + if( !( i->m_dwCaps & eServiceRender ) ) + continue; + + CComPtr< IDecalRender > pRender; + HRESULT hRes = i->m_p->QueryInterface( &pRender ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pRender->Render2D(); + } + + return S_OK; +} + +STDMETHODIMP cDecal::Render3D() +{ + for( cServiceList::iterator i = m_services.begin(); i != m_services.end(); ++ i ) + { + if( !( i->m_dwCaps & eServiceRender ) ) + continue; + + CComPtr< IDecalRender > pRender; + HRESULT hRes = i->m_p->QueryInterface( &pRender ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pRender->Render3D(); + } + + return S_OK; +} + +STDMETHODIMP cDecal::get_Hooks(IACHooks** pVal) +{ + if( m_pHooks == NULL ) + return E_FAIL; + + m_pHooks->QueryInterface( pVal ); + return S_OK; +} \ No newline at end of file diff --git a/Native/Decal/DecalManager.h b/Native/Decal/DecalManager.h new file mode 100644 index 0000000..b30960b --- /dev/null +++ b/Native/Decal/DecalManager.h @@ -0,0 +1,99 @@ +// DecalManager.h : Declaration of the cDecal + +#ifndef __DECAL_H_ +#define __DECAL_H_ + +#include "resource.h" // main symbols + +class cPluginSite; + +///////////////////////////////////////////////////////////////////////////// +// cDecal +class ATL_NO_VTABLE cDecal : + public CComObjectRootEx, + public CComCoClass, + public IDecal +{ +public: + cDecal() + : m_pD( NULL ), + m_pD3D( NULL ), + m_hWnd( NULL ), + m_bFocus( VARIANT_FALSE ), + m_bServicesStarted( false ), + m_bPluginsStarted( false ) + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_DECAL) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDecal) +COM_INTERFACE_ENTRY(IDecal) +END_COM_MAP() + + struct cService + { + CLSID m_clsid; + DWORD m_dwCaps; + CComPtr< IDecalService > m_p; + }; + + enum eServiceCaps + { + eServiceRender = 0x01 + }; + + typedef std::vector< cService > cServiceList; + cServiceList m_services; + + struct cPlugin + { + CLSID m_clsid; + cPluginSite *m_pSite; + }; + + typedef std::vector< cPlugin > cPluginList; + cPluginList m_plugins; + + bool m_bServicesStarted, + m_bPluginsStarted; + + IDirectDraw4 *m_pD; + IDirect3DDevice3 *m_pD3D; + HWND m_hWnd; + VARIANT_BOOL m_bFocus; + CComPtr< IACHooks > m_pHooks; + + HRESULT convertToken( std::string &strToken, std::string &strOut ); + +public: +// IDecal + STDMETHOD(InitGraphics)( IUnknown *pDirectDraw, IUnknown *pD3DDevice ); + STDMETHOD(get_DirectDraw)(REFIID iid, VOID * * ppvItf); + STDMETHOD(get_D3DDevice)(REFIID iid, VOID * * ppvItf); + STDMETHOD(Render3D)(); + STDMETHOD(Render2D)(); + + STDMETHOD(get_HWND)(LONG * pVal); + STDMETHOD(put_HWND)(LONG newVal); + + STDMETHOD(get_Focus)(VARIANT_BOOL *pVal); + STDMETHOD(put_Focus)(VARIANT_BOOL newVal); + + STDMETHOD(get_ScreenSize)(long *pWidth, long *pHeight); + STDMETHOD(get_Object)(BSTR strPath, REFIID iid, /*[out, retval]*/ LPVOID *pVal); + STDMETHOD(MapPath)(BSTR pPath, BSTR * pMapped); + + STDMETHOD(StartServices)(); + STDMETHOD(StopServices)(); + STDMETHOD(StartPlugins)(); + STDMETHOD(StopPlugins)(); + STDMETHOD(get_Configuration)(BSTR strType, /*[default(GUID_NULL)]*/ REFCLSID clsidAdvance, /*[out, retval]*/ IDecalEnum * *pVal); + STDMETHOD(get_Service)(REFCLSID clsid, REFIID iid, /*[out, retval]*/ LPVOID *pVal); + STDMETHOD(get_Plugin)(REFCLSID clsid, REFIID iid, /*[out, retval]*/ LPVOID *pVal); + STDMETHOD(get_Hooks)(IACHooks** pVal); +}; + +#endif //__DECAL_H_ diff --git a/Native/Decal/DecalRes.cpp b/Native/Decal/DecalRes.cpp new file mode 100644 index 0000000..d4257c4 --- /dev/null +++ b/Native/Decal/DecalRes.cpp @@ -0,0 +1,152 @@ +// DecalRes.cpp : Implementation of cDecalRes +#include "stdafx.h" +#include "Decal.h" +#include "DecalRes.h" + +///////////////////////////////////////////////////////////////////////////// +// cDecalRes + +HRESULT cDecalRes::getLibID( MSXML::IXMLDOMDocumentPtr &pdoc, GUID *pGUID ) +{ + _variant_t vlib = pdoc->selectSingleNode( _T( "/*/@lib" ) )->text; + if( vlib.vt == VT_NULL ) + { + // lib is a required field + _ASSERT( FALSE ); + return E_FAIL; + } + + return ::CLSIDFromString( vlib.bstrVal, pGUID ); +} + +bool cDecalRes::getTypelibFilename( MSXML::IXMLDOMDocumentPtr &pdoc, BSTR *pbstrFilename ) +{ + USES_CONVERSION; + + GUID libid; + HRESULT hRes = getLibID( pdoc, &libid ); + + if( FAILED( hRes ) ) + return SUCCEEDED ( hRes ); + + // Look up the path of the typelib in the registry + hRes = ::QueryPathOfRegTypeLib( libid, 1, 0, 0, pbstrFilename ); + + if( SUCCEEDED( hRes ) ) + return true; + + // Otherwise, manufacture a type library filename + RegKey key; + key.Open( HKEY_LOCAL_MACHINE, _T( "Software\\Decal\\Agent" ) ); + + TCHAR szPath[ MAX_PATH ]; + DWORD dwPath = MAX_PATH; + key.QueryStringValue (_T("PluginPath"), szPath, &dwPath); + + if( szPath[ ::_tcslen( szPath ) - 1 ] != _T( '\\' ) ) + ::_tcscat( szPath, _T( "\\" ) ); + + _variant_t vName = pdoc->selectSingleNode( _T( "/*/@name" ) )->text; + + if( vName.vt == VT_NULL ) + ::_tcscat( szPath, _T( "ErrorUnnamedTypelib.tlb" ) ); + else + { + ::_tcscat( szPath, OLE2T( vName.bstrVal ) ); + ::_tcscat( szPath, _T( ".tlb" ) ); + } + + *pbstrFilename = T2BSTR( szPath ); + + return false; +} + +HRESULT cDecalRes::initTypelib( MSXML::IXMLDOMDocumentPtr &pdoc, BSTR strFilename ) +{ + HRESULT hRes = ::CreateTypeLib2( SYS_WIN32, strFilename, &m_pLib ); + + if( FAILED( hRes ) ) + return hRes; + + GUID libid; + hRes = getLibID( pdoc, &libid ); + if( FAILED( hRes ) ) + return hRes; + + m_pLib->SetGuid( libid ); + + _variant_t vName = pdoc->selectSingleNode( _T( "/*/@name" ) )->text; + + if( vName.vt == VT_NULL ) + { + // Name is a required field + _ASSERT( FALSE ); + return E_FAIL; + } + + m_pLib->SetName( vName.bstrVal ); + m_pLib->SetVersion( 1, 0 ); + + // One initialized typelib + return S_OK; +} + +HRESULT cDecalRes::scanTemplate( MSXML::IXMLDOMElementPtr &ptemp, ITypeInfo **ppCoClass, ITypeInfo **ppSource ) +{ + // Get the IDs for the coclass, default interface and default source interface + _variant_t vIDCoClass = ptemp->getAttribute( _T( "class" ) ), + vIDEvent = ptemp->getAttribute( _T( "event" ) ), + vName = ptemp->getAttribute( _T( "name" ) ); + + if( vIDCoClass.vt == VT_NULL || vIDEvent.vt == VT_NULL || vName.vt == VT_NULL ) + { + // Both of these are required + _ASSERT( FALSE ); + return E_FAIL; + } + + // Next convert them to GUIDs + CLSID idClass; + IID idEvent; + if( FAILED( ::CLSIDFromString( vIDCoClass.bstrVal, &idClass ) ) || + FAILED( ::CLSIDFromString( vIDEvent.bstrVal, &idEvent ) ) ) + { + // They must be converted to guids + _ASSERT( FALSE ); + return E_FAIL; + } + + // Now we make the coclass typeinfo, default source typeinfo, get the default interface typeinfo + // and slap them all together + CComPtr< ICreateTypeInfo > pCoClass; + + m_pLib->CreateTypeInfo( vName.bstrVal, TKIND_COCLASS, &pCoClass ); + pCoClass->SetGuid( idClass ); + pCoClass->QueryInterface( ppCoClass ); + + CComPtr< ITypeInfo > pDefaultItf; + GetTypeInfo( 0, 0, &pDefaultItf ); + + HREFTYPE hrefDefaultItf; + pCoClass->AddRefTypeInfo( pDefaultItf, &hrefDefaultItf ); + pCoClass->AddImplType( 0, hrefDefaultItf ); + pCoClass->SetImplTypeFlags( 0, IMPLTYPEFLAG_FDEFAULT ); + + CComPtr< ICreateTypeInfo > pSourceItf; + + _bstr_t strEvent( _T( "_" ) ); + strEvent += vName.bstrVal; + strEvent += _T( "Events" ); + + m_pLib->CreateTypeInfo( strEvent, TKIND_DISPATCH, &pSourceItf ); + pSourceItf->SetGuid( idEvent ); + + HREFTYPE hrefSourceItf; + pSourceItf->QueryInterface( ppSource ); + pCoClass->AddRefTypeInfo( *ppSource, &hrefSourceItf ); + pCoClass->AddImplType( 1, hrefSourceItf ); + pCoClass->SetImplTypeFlags( 1, IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE ); + + // Still incomplete + return S_OK; +} diff --git a/Native/Decal/DecalRes.h b/Native/Decal/DecalRes.h new file mode 100644 index 0000000..73a74b7 --- /dev/null +++ b/Native/Decal/DecalRes.h @@ -0,0 +1,337 @@ +// DecalRes.h : Declaration of the cDecalRes + +#ifndef __DECALRES_H_ +#define __DECALRES_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cDecalRes +class ATL_NO_VTABLE cDecalRes : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl, + public IConnectionPoint, + public IConnectionPointContainer, + public IProvideClassInfo2 +{ +public: + cDecalRes() + : m_dwNextCookie( 1 ) + { + } + + // This object iterates over our one connection + // point. + class cEnumRes + : public CComObjectRootEx, + public IEnumConnectionPoints + { + public: + BEGIN_COM_MAP(cEnumRes) + COM_INTERFACE_ENTRY(IEnumConnectionPoints) + END_COM_MAP() + + bool m_bEnd; + CComPtr< IConnectionPoint > m_pCP; + + void init( IConnectionPoint *pCP ) + { + m_pCP = pCP; + m_bEnd = false; + } + + public: + // IEnumConnectionPoints + STDMETHOD(Next)( ULONG cConnections, IConnectionPoint **rgpcn, ULONG *pcFetched ) + { + if( m_bEnd ) + { + *pcFetched = 0; + return S_FALSE; + } + + if( cConnections == 0 ) + { + *pcFetched = 0; + return S_OK; + } + + m_bEnd = true; + *pcFetched = 1; + return m_pCP->QueryInterface( rgpcn ); + } + + STDMETHOD(Skip)( ULONG cConnections ) + { + if( cConnections == 0 ) + return S_OK; + + m_bEnd = true; + return S_OK; + } + + STDMETHOD(Reset)() + { + m_bEnd = false; + return S_OK; + } + + STDMETHOD(Clone)(IEnumConnectionPoints **ppNew ) + { + CComObject< cEnumRes > *pEnum; + CComObject< cEnumRes >::CreateInstance( &pEnum ); + + pEnum->m_pCP = m_pCP; + pEnum->m_bEnd = m_bEnd; + + return pEnum->QueryInterface( IID_IEnumConnectionPoints, reinterpret_cast< void ** >( ppNew ) ); + } + }; + + // This object implements the event object - Fire resolves + // to dispatching an event to our parent. This object is added + // into the namespace of the resource. + class cResEvent + : public CComObjectRootEx, + public IDispatch + { + public: + BEGIN_COM_MAP(cResEvent) + COM_INTERFACE_ENTRY(IDispatch) + END_COM_MAP() + + CComPtr< ITypeInfo > m_pItf; + cDecalRes *m_pRes; + DISPID m_dispid; + + HRESULT load( MSXML::IXMLDOMElementPtr &pElement ) + { + // TODO: load the dispid and Fire paramters and create the temporary typeinfo + } + + public: + // IDispatch + STDMETHOD(GetTypeInfoCount)( UINT *pctinfo ) + { + if( pctinfo == NULL ) + return E_POINTER; + + *pctinfo = 1; + return S_OK; + } + + STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID, ITypeInfo **ppTI ) + { + if( iTInfo != 0 ) + return E_INVALIDARG; + + if( ppTI == NULL ) + return E_POINTER; + + return m_pItf->QueryInterface( ppTI ); + } + + STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID, DISPID *rgDispID) + { + if( rgDispID == NULL || rgszNames == NULL ) + // By spec + return E_POINTER; + + if( !::InlineIsEqualGUID( riid, IID_NULL ) ) + // By spec + return DISP_E_UNKNOWNINTERFACE; + + static LPOLESTR _szFire = OLESTR( "Fire" ); + + for( UINT i = 0; i < cNames; ++ i ) + { + if( ::wcscmp( _szFire, rgszNames[ i ] ) == 0 ) + rgDispID[ i ] = 1; + else + rgDispID[ i ] = -1; + } + + return S_OK; + } + + STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *pArgError ) + { + // Do all the checks in here + if( dispIdMember != 1 ) + return DISP_E_MEMBERNOTFOUND; + + if( !::InlineIsEqualGUID( riid, IID_NULL ) ) + return DISP_E_UNKNOWNINTERFACE; + + if( wFlags != DISPATCH_METHOD ) + return DISP_E_MEMBERNOTFOUND; + + return m_pRes->dispatchEvent( m_dispid, pDispParams, pVarResult, pExcepInfo, pArgError ); + } + }; + + // Generated TypeInfo + CComPtr< ICreateTypeLib2 > m_pLib; + CComPtr< ITypeInfo > m_pCoClass; + CComPtr< ICreateTypeInfo > m_pSource; + + HRESULT GetSourceIID( IID *pIID ) + { + if( !m_pSource.p ) + // Not yet initialized - bad + return E_FAIL; + + CComPtr< ITypeInfo > pTI; + HRESULT hRes = m_pSource->QueryInterface( &pTI ); + if( FAILED( hRes ) ) + return hRes; + + TYPEATTR *pTA; + pTI->GetTypeAttr( &pTA ); + + *pIID = pTA->guid; + pTI->ReleaseTypeAttr( pTA ); + + return S_OK; + } + + // Connection point members + typedef std::deque< std::pair< DWORD, CComPtr< IDispatch > > > cCPList; + DWORD m_dwNextCookie; + cCPList m_cp; + + HRESULT dispatchEvent( DISPID nID, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr ) + { + // We simply pass the invoke on, the event object calling us + // will correctly remap the ID. + for( cCPList::iterator i = m_cp.begin(); i != m_cp.end(); ++ i ) + i->second->Invoke( nID, IID_NULL, 0, DISPATCH_METHOD, pDispParams, pVarResult, pExcepInfo, puArgErr ); + + return S_OK; + } + + // Series of methods to create the type library + HRESULT getLibID( MSXML::IXMLDOMDocumentPtr &pdoc, GUID *pGUID ); + bool getTypelibFilename( MSXML::IXMLDOMDocumentPtr &pdoc, BSTR *pbstrFilename ); + HRESULT initTypelib( MSXML::IXMLDOMDocumentPtr &pdoc, BSTR strFilename ); + HRESULT scanTemplate( MSXML::IXMLDOMElementPtr &ptemp, ITypeInfo **ppCoClass, ITypeInfo **ppSource ); + +DECLARE_REGISTRY_RESOURCEID(IDR_DECALRES) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDecalRes) + COM_INTERFACE_ENTRY(IDecalRes) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IConnectionPoint) + COM_INTERFACE_ENTRY(IConnectionPointContainer) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) +END_COM_MAP() + +// IDecalRes +public: + // IConnectionPointContainer + STDMETHOD(EnumConnectionPoints)( IEnumConnectionPoints **ppEnum ) + { + CComObject< cEnumRes > *pEnum; + CComObject< cEnumRes >::CreateInstance( &pEnum ); + + pEnum->init( this ); + + return pEnum->QueryInterface( IID_IEnumConnectionPoints, reinterpret_cast< void ** >( ppEnum ) ); + } + + STDMETHOD(FindConnectionPoint)( REFIID iid, IConnectionPoint **ppCP ) + { + if( ppCP == NULL ) + return E_POINTER; + + IID iidSource; + HRESULT hRes = GetSourceIID( &iidSource ); + if( FAILED( hRes ) ) + return hRes; + + if( ::InlineIsEqualGUID( iid, GUID_NULL ) || + ::InlineIsEqualGUID( iid, iidSource ) ) + { + // Return the connection point + return static_cast< IConnectionPoint * >( this )->QueryInterface( ppCP ); + } + + // Not found (duh, it's not the only connection) + return CONNECT_E_NOCONNECTION; + } + + // IConnectionPoint + STDMETHOD(GetConnectionInterface)( IID *piid ) + { + if( piid == NULL ) + return E_POINTER; + return GetSourceIID( piid ); + } + + STDMETHOD(GetConnectionPointContainer)( IConnectionPointContainer **ppCPC ) + { + return static_cast< IConnectionPoint * >( this )->QueryInterface( ppCPC ); + } + + STDMETHOD(Advise)(IUnknown *pUnk, DWORD *pdwCookie) + { + if( pdwCookie == NULL || pUnk == NULL ) + return E_POINTER; + + CComPtr< IDispatch > pDisp; + HRESULT hRes = pUnk->QueryInterface( &pDisp ); + if( FAILED( hRes ) ) + return hRes; + + m_cp.push_back( cCPList::value_type( m_dwNextCookie, pDisp ) ); + *pdwCookie = ( m_dwNextCookie ++ ); + + return S_OK; + } + + STDMETHOD(Unadvise)( DWORD dwCookie ) + { + // Find the matching cookie + for( cCPList::iterator i = m_cp.begin(); i != m_cp.end(); ++ i ) + { + if( i->first == dwCookie ) + { + m_cp.erase( i ); + return S_OK; + } + } + + return CONNECT_E_NOCONNECTION; + } + + STDMETHOD(EnumConnections)(IEnumConnections **) + { + // We don't support enum'ing connections + return E_NOTIMPL; + } + + // IProvideClassInfo + STDMETHOD(GetClassInfo)(ITypeInfo **ppTI) + { + return m_pCoClass->QueryInterface( ppTI ); + } + + // IProvideClassInfo2 + STDMETHOD(GetGUID)(DWORD dwGuidKind, GUID *pGUID) + { + if( dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID ) + return E_INVALIDARG; + + if( pGUID == NULL ) + return E_POINTER; + + return GetSourceIID( pGUID ); + } +}; + +#endif //__DECALRES_H_ diff --git a/Native/Decal/DecalRes.rgs b/Native/Decal/DecalRes.rgs new file mode 100644 index 0000000..f711dd7 --- /dev/null +++ b/Native/Decal/DecalRes.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Decal.DecalRes.1 = s 'DecalRes Class' + { + CLSID = s '{EA7BE91B-C98A-4138-8985-E22364BE8207}' + } + Decal.DecalRes = s 'DecalRes Class' + { + CLSID = s '{EA7BE91B-C98A-4138-8985-E22364BE8207}' + CurVer = s 'Decal.DecalRes.1' + } + NoRemove CLSID + { + ForceRemove {EA7BE91B-C98A-4138-8985-E22364BE8207} = s 'DecalRes Class' + { + ProgID = s 'Decal.DecalRes.1' + VersionIndependentProgID = s 'Decal.DecalRes' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{FF7F5F6D-34E0-4B6F-B3BB-8141DE2EF732}' + } + } +} diff --git a/Native/Decal/Decalps.def b/Native/Decal/Decalps.def new file mode 100644 index 0000000..37b5c1c --- /dev/null +++ b/Native/Decal/Decalps.def @@ -0,0 +1,11 @@ + +LIBRARY "DecalPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/Decal/Decalps.mk b/Native/Decal/Decalps.mk new file mode 100644 index 0000000..c3efe05 --- /dev/null +++ b/Native/Decal/Decalps.mk @@ -0,0 +1,16 @@ + +Decalps.dll: dlldata.obj Decal_p.obj Decal_i.obj + link /dll /out:Decalps.dll /def:Decalps.def /entry:DllMain dlldata.obj Decal_p.obj Decal_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del Decalps.dll + @del Decalps.lib + @del Decalps.exp + @del dlldata.obj + @del Decal_p.obj + @del Decal_i.obj diff --git a/Native/Decal/PluginSite.cpp b/Native/Decal/PluginSite.cpp new file mode 100644 index 0000000..bc31bdb --- /dev/null +++ b/Native/Decal/PluginSite.cpp @@ -0,0 +1,49 @@ +// PluginSite.cpp : Implementation of cPluginSite +#include "stdafx.h" +#include "Decal.h" +#include "PluginSite.h" + +#include "DecalManager.h" + +///////////////////////////////////////////////////////////////////////////// +// cPluginSite + +void cPluginSite::FinalRelease() +{ + _ASSERTE( m_pDecal != NULL ); + + for( cDecal::cPluginList::iterator i = m_pDecal->m_plugins.begin(); i != m_pDecal->m_plugins.end(); ++ i ) + { + if( i->m_pSite == this ) + { + m_pDecal->m_plugins.erase( i ); + return; + } + } + + // Could not find ourself in the list (bad initialization?) + _ASSERT( FALSE ); +} + +STDMETHODIMP cPluginSite::Unload() +{ + // Hold a reference to ourself, to keep everything 'together' until + // the method returns + CComPtr< IUnknown > pThis( this ); + + m_pPlugin->Terminate(); + + m_pPlugin.Release(); + + return S_OK; +} + +STDMETHODIMP cPluginSite::get_Decal(IDecal **pVal) +{ + return m_pDecal->QueryInterface( IID_IDecal, reinterpret_cast< void ** >( pVal ) ); +} + +STDMETHODIMP cPluginSite::get_Object(BSTR Path, LPDISPATCH *pVal) +{ + return m_pDecal->get_Object( Path, IID_IDispatch, reinterpret_cast< void ** >( pVal ) ); +} diff --git a/Native/Decal/PluginSite.h b/Native/Decal/PluginSite.h new file mode 100644 index 0000000..b8f15eb --- /dev/null +++ b/Native/Decal/PluginSite.h @@ -0,0 +1,42 @@ +// PluginSite.h : Declaration of the cPluginSite + +#ifndef __PLUGINSITE_H_ +#define __PLUGINSITE_H_ + +#include "resource.h" // main symbols + +class cDecal; + +///////////////////////////////////////////////////////////////////////////// +// cPluginSite +class ATL_NO_VTABLE cPluginSite : + public CComObjectRootEx, + public CComCoClass, + public IPluginSite2 +{ +public: + cPluginSite() + { + } + + void FinalRelease(); + +DECLARE_REGISTRY_RESOURCEID(IDR_PLUGINSITE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cPluginSite) + COM_INTERFACE_ENTRY(IPluginSite2) +END_COM_MAP() + + CComPtr< IPlugin2 > m_pPlugin; + cDecal *m_pDecal; + +// IPluginSite2 +public: + STDMETHOD(get_Object)(BSTR Path, /*[out, retval]*/ LPDISPATCH *pVal); + STDMETHOD(get_Decal)(/*[out, retval]*/ IDecal * *pVal); + STDMETHOD(Unload)(); +}; + +#endif //__PLUGINSITE_H_ diff --git a/Native/Decal/StdAfx.cpp b/Native/Decal/StdAfx.cpp new file mode 100644 index 0000000..07f7b46 --- /dev/null +++ b/Native/Decal/StdAfx.cpp @@ -0,0 +1,5 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" diff --git a/Native/Decal/StdAfx.h b/Native/Decal/StdAfx.h new file mode 100644 index 0000000..2f62889 --- /dev/null +++ b/Native/Decal/StdAfx.h @@ -0,0 +1,51 @@ +// 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__C8B6D65E_6F24_4AE7_A4BF_AFEF8775700C__INCLUDED_) +#define AFX_STDAFX_H__C8B6D65E_6F24_4AE7_A4BF_AFEF8775700C__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _ATL_APARTMENT_THREADED +#define DIRECTINPUT_VERSION 0x600 + +#pragma warning(disable:4530) + +#ifdef NDEBUG + #ifdef _ATL_DLL + #undef _ATL_DLL + #endif +#endif +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#import + +#include "../include/Helpers.h" + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__C8B6D65E_6F24_4AE7_A4BF_AFEF8775700C__INCLUDED) diff --git a/Native/Decal/SurrogateRemove.cpp b/Native/Decal/SurrogateRemove.cpp new file mode 100644 index 0000000..fa438a8 --- /dev/null +++ b/Native/Decal/SurrogateRemove.cpp @@ -0,0 +1,8 @@ +// SurrogateRemove.cpp : Implementation of cSurrogateRemove +#include "stdafx.h" +#include "Decal.h" +#include "SurrogateRemove.h" + +///////////////////////////////////////////////////////////////////////////// +// cSurrogateRemove + diff --git a/Native/Decal/SurrogateRemove.h b/Native/Decal/SurrogateRemove.h new file mode 100644 index 0000000..73cfc31 --- /dev/null +++ b/Native/Decal/SurrogateRemove.h @@ -0,0 +1,87 @@ +// SurrogateRemove.h : Declaration of the cSurrogateRemove + +#ifndef __SURROGATEREMOVE_H_ +#define __SURROGATEREMOVE_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cSurrogateRemove +class ATL_NO_VTABLE cSurrogateRemove : + public CComObjectRootEx, + public CComCoClass, + public IDecalUninstall +{ +public: + cSurrogateRemove() + { + } + + CComBSTR m_strGroup; + CLSID m_clsid; + _bstr_t m_strProgID; + +DECLARE_REGISTRY_RESOURCEID(IDR_SURROGATEREMOVE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cSurrogateRemove) + COM_INTERFACE_ENTRY(IDecalUninstall) +END_COM_MAP() + +// ISurrogateRemove +public: + + // IDecalUninstall + STDMETHOD(Prepare)(IDecalEnum *pEnum) + { + pEnum->get_Group( &m_strGroup ); + pEnum->get_ComClass( &m_clsid ); + + CComVariant vProgID; + pEnum->get_Property( _bstr_t( _T( "ProgID" ) ), &vProgID ); + if( vProgID.vt == VT_BSTR ) + m_strProgID = vProgID.bstrVal; + + return S_OK; + } + + STDMETHOD(Uninstall)() + { + USES_CONVERSION; + TCHAR szParent[ 255 ]; + ::_tcscat ( ::_tcscpy ( szParent, _T( "Software\\Decal\\" ) ), OLE2T( m_strGroup ) ); + + RegKey rk; + if( rk.Open( HKEY_LOCAL_MACHINE, szParent ) != ERROR_SUCCESS ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + LPOLESTR strCLSID; + ::StringFromCLSID( m_clsid, &strCLSID ); + + LPTSTR szCLSID = OLE2T( strCLSID ); + + ::CoTaskMemFree( strCLSID ); + + if( rk.RecurseDeleteKey( szCLSID ) != ERROR_SUCCESS ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + if( m_strProgID.length() > 0 ) + { + LPTSTR szProgID = OLE2T( m_strProgID ); + RegKey rkcls; + rkcls.Open( HKEY_CLASSES_ROOT, NULL ); + rkcls.RecurseDeleteKey( szProgID ); + } + + return S_OK; + } +}; + +#endif //__SURROGATEREMOVE_H_ diff --git a/Native/Decal/SurrogateRemove.rgs b/Native/Decal/SurrogateRemove.rgs new file mode 100644 index 0000000..c7db0e1 --- /dev/null +++ b/Native/Decal/SurrogateRemove.rgs @@ -0,0 +1,25 @@ +HKCR +{ + Decal.SurrogateRemove.1 = s 'SurrogateRemove Class' + { + CLSID = s '{144FBF76-E7FB-4B41-AE19-6B5AB0E0A89B}' + } + Decal.SurrogateRemove = s 'SurrogateRemove Class' + { + CLSID = s '{144FBF76-E7FB-4B41-AE19-6B5AB0E0A89B}' + CurVer = s 'Decal.SurrogateRemove.1' + } + NoRemove CLSID + { + ForceRemove {144FBF76-E7FB-4B41-AE19-6B5AB0E0A89B} = s 'SurrogateRemove Class' + { + ProgID = s 'Decal.SurrogateRemove.1' + VersionIndependentProgID = s 'Decal.SurrogateRemove' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{FF7F5F6D-34E0-4B6F-B3BB-8141DE2EF732}' + } + } +} diff --git a/Native/Decal/resource.h b/Native/Decal/resource.h new file mode 100644 index 0000000..48546a3 --- /dev/null +++ b/Native/Decal/resource.h @@ -0,0 +1,36 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Decal.rc +// +#define IDS_PROJNAME 100 +#define IDR_DECAL 101 +#define IDR_PLUGINSITE 102 +#define IDR_DECALENUM 103 +#define IDR_SURROGATEREMOVE 104 +#define IDR_ACTIVEXSURROGATE 105 +#define IDR_DECALRES 106 +#define IDR_DECALNODE 107 +#define IDS_ACHOOKS_DESC 111 +#define IDR_ACHooks 112 +#define IDE_INDEXOUTOFRANGE2 512 +#define IDE_INDEXOUTOFRANGE 513 +#define IDE_BADINDEXTYPE 514 +#define IDE_CLASSNOTFOUND 515 +#define IDE_CLASSKEYNOTFOUND 516 +#define IDE_GROUPKEYNOTOPEN 517 +#define IDE_INVALIDSUBKEYS 518 +#define IDE_BADITERATOR 519 +#define IDE_MOVEUPTOP 520 +#define IDE_MOVEDOWNBOTTOM 521 +#define IDE_SURROGATEDISABLED 522 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 113 +#endif +#endif diff --git a/Native/DecalControls/Attic/DecalControls.aps b/Native/DecalControls/Attic/DecalControls.aps new file mode 100644 index 0000000000000000000000000000000000000000..a6cf7c5a58103fb0e31386e0f55a90ceb7a6abc2 GIT binary patch literal 5038 zcmbVQ$#UC95N+D>zR7l+Qx@9sAwF2k|NUW2|W@}-e&W6d!Qsga{g0b-fLmO6R5tdO$fR)lMnHl4b}m*|SZYo%2Yq6NAdpmlGpT=#v) zhVE0krclo>`KAG+NY@o&tO?^;+1UWLOgALvHSieWuT@Jm+=jo=>uC#is!G3l7 zCBQ|xr9fY7_=aQEt2X5@qJ|}3GK7=nJ)G=tK!5un_r^OiB49*ckN>=1YQHFb+555T+eju zhH0-jl*QOnX2oa(FXPL{*+=wX5C5c#He+pt64hJbl)R z>A=c^<~B|_8>i335wyqeMy`O@Gc109MTN)T!V~tXiYL9)Y;1VXsNa7-u|K49GHt`E zSKwY*`Vc!rM{`rre28WXFpO{FgrTH}{*FejScMyOH{p`991b)Onvi%mPMl+6%?T$Y z-is6GnV9`}LdyL(>eMs1vLB_w_o zCob}21X)5t(q5c&nMuQ}FClF|MvG)nzPNFEn2>kCyajs7-dDdwGU**%GW}lq*#a$3 z6HZBSzn`Y3VUkUrM6ZBGW6l%g`9zudaV>DR!E2QQ3{aKq^|p`FEA39Jzg2BFd)GHxd1& zhP~4wmnNGCKAKF69~v490h%P{#Wl&KBMyZTU#g)IcNpT+JX$E6>XbC;gkRBQ6Rts% zMRvD_$2RC#GO@>ao1Coi4->V*!o>T(k4=hFD=RD0ctQg(1$+)FM#(mWMLDTvR!Z>3 zKIK&dbs^H0Mb$7@ZO0X~q*|N8qk_7%9c*AWHY~>zR8);MVb!oBSr99W0j5yuh2c-W zKgO;xrj^HxURUV2M8@)-2psaovGz@tX`VluDJaP;B^kSJSt_&5JWI54nbF&fhR#!# z%#7awKDBIS={>d@`$kzhv*4~)tj3GUU_@GGD3e7tyP%n&$c~k$fuWZ9 z!V;XZON@oNmn_2>zsz`;Jjqg=@hgn$*-!3dHm|ZsPYdM6Vyhckm#38F=<~R2pH`Oh zpu&pzF|S~fA2qNR;ki%)Z{TW@jhfG*I#qy-zXR#MS@XK`YrzbAwv=Agkdv4VSf{51FXzw#}pQ;ta9pCfz_<719nK_mE+UmjB68=&@V hqYm67S;fi<+(c^^wHwhNtdqeEX0WT}{|j7+{sRoGuQ&hz literal 0 HcmV?d00001 diff --git a/Native/DecalControls/Attic/Image.cpp b/Native/DecalControls/Attic/Image.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Native/DecalControls/Attic/Image.h b/Native/DecalControls/Attic/Image.h new file mode 100644 index 0000000..e69de29 diff --git a/Native/DecalControls/Attic/Image.rgs b/Native/DecalControls/Attic/Image.rgs new file mode 100644 index 0000000..e69de29 diff --git a/Native/DecalControls/Attic/ImageControl.cpp b/Native/DecalControls/Attic/ImageControl.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Native/DecalControls/Attic/ImageControl.h b/Native/DecalControls/Attic/ImageControl.h new file mode 100644 index 0000000..e69de29 diff --git a/Native/DecalControls/BorderLayout.cpp b/Native/DecalControls/BorderLayout.cpp new file mode 100644 index 0000000..5a07c39 --- /dev/null +++ b/Native/DecalControls/BorderLayout.cpp @@ -0,0 +1,197 @@ +// BorderLayout.cpp : Implementation of cBorderLayout +#include "stdafx.h" +#include "DecalControls.h" +#include "BorderLayout.h" + +///////////////////////////////////////////////////////////////////////////// +// cBorderLayout + +void cBorderLayout::onSchemaLoad( IView *pView, MSXML::IXMLDOMElementPtr &pElement ) +{ + static _bstr_t _strEdge = _T( "border" ), + _strCenter = _T( "center" ); + static _variant_t + _strLeft = _T( "left" ), + _strRight = _T( "right" ), + _strTop = _T( "top" ), + _strBottom = _T( "bottom" ); + + // Walk through the list of children - select all elements + MSXML::IXMLDOMElementPtr pChild; + for( MSXML::IXMLDOMNodeListPtr pChildren = pElement->selectNodes( _T( "*" ) ); + ( pChild = pChildren->nextNode() ).GetInterfacePtr() != NULL; ) + { + if( pChild->tagName == _strEdge ) + { + // Attempt to extract the edge indicator and the size indicator + _variant_t vEdge = pChild->getAttribute( _T( "edge" ) ), + vSize = pChild->getAttribute( _T( "size" ) ); + + _ASSERTE( vEdge.vt != VT_NULL ); + _ASSERTE( vSize.vt != VT_NULL ); + + // Got values, check if they're good + eBorderEdge eEdge; + + if( _strLeft == vEdge ) + eEdge = eEdgeLeft; + else if( vEdge == _strRight ) + eEdge = eEdgeRight; + else if( vEdge == _strTop ) + eEdge = eEdgeTop; + else if( vEdge == _strBottom ) + eEdge = eEdgeBottom; +#ifdef _DEBUG + else + // Invalid value here + _ASSERTE( FALSE ); +#endif + + // Convert the size + try + { + long nSize = vSize; + + // Cannot have a 0 or negative edge size + _ASSERTE( nSize > 0 ); + + cEdgePlacement ep = { eEdge, nSize, loadChildControl( pView, pChild->selectSingleNode( _T( "control" ) ) ) }; + m_edges.push_back( ep ); + } + catch( ... ) + { + // The size could no be converted to a long value + _ASSERTE( FALSE ); + } + } + else if( pChild->tagName == _strCenter ) + { + // Make sure there isn't a center already created + _ASSERTE( m_nCenterID == -1 ); + + m_nCenterID = loadChildControl( pView, pChild->selectSingleNode( _T( "control" ) ) ); + } +#ifdef _DEBUG + else + // This is an invalid child element type + _ASSERTE( FALSE ); +#endif + } +} + +void cBorderLayout::onChildDestroy( long nID ) +{ + // Check if this is the center + if( nID == m_nCenterID ) + { + m_nCenterID = -1; + m_pSite->Reformat(); + return; + } + + // Check if it on an edge + for( cEdgePlacementList::iterator i = m_edges.begin(); i != m_edges.end(); ++ i ) + { + if( i->m_nID == nID ) + { + m_edges.erase( i ); + m_pSite->Reformat(); + + break; + } + } +} + +STDMETHODIMP cBorderLayout::CreateEdge(eBorderEdge eEdge, long nSize, ILayer *pSink) +{ + _ASSERTE( nSize > 0 ); + _ASSERTE( pSink != NULL ); + + LayerParams lp = { dispenseID(), { 0, 0, 0, 0 }, eRenderClipped }; + m_pSite->CreateChild( &lp, pSink ); + + cEdgePlacement ep = { eEdge, nSize, lp.ID }; + m_edges.push_back( ep ); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cBorderLayout::CreateCenter(ILayer *pSink) +{ + _ASSERTE( m_nCenterID == -1 ); + + LayerParams lp = { dispenseID(), { 0, 0, 0, 0 }, eRenderClipped }; + m_pSite->CreateChild( &lp, pSink ); + + m_nCenterID = lp.ID; + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cBorderLayout::Reformat() +{ + // Walk through the list of edges in order and + // set their positions + + RECT rcLayer; + m_pSite->get_Position( &rcLayer ); + + RECT rcClient = { 0, 0, rcLayer.right - rcLayer.left, rcLayer.bottom - rcLayer.top }; + + for( cEdgePlacementList::iterator i = m_edges.begin(); i != m_edges.end(); ++ i ) + { + RECT rcPosition = rcClient; + + switch( i->m_edge ) + { + case eEdgeLeft: + rcPosition.right = rcPosition.left + i->m_nSize; + rcClient.left += i->m_nSize; + break; + + case eEdgeTop: + rcPosition.bottom = rcPosition.top + i->m_nSize; + rcClient.top += i->m_nSize; + break; + + case eEdgeRight: + rcPosition.left = rcPosition.right - i->m_nSize; + rcClient.right -= i->m_nSize; + break; + + case eEdgeBottom: + rcPosition.top = rcPosition.bottom - i->m_nSize; + rcClient.bottom -= i->m_nSize; + break; + + default: + // Invalid edge value + _ASSERTE( FALSE ); + } + + // Sanity checks to make sure we haven't overrun our area + //_ASSERTE( rcClient.bottom > rcClient.top ); + _ASSERTE( rcClient.right > rcClient.left ); + _ASSERTE( rcPosition.bottom > rcPosition.top ); + _ASSERTE( rcPosition.right > rcPosition.left ); + + CComPtr< ILayerSite > pChild; + HRESULT hRes = m_pSite->get_Child( i->m_nID, ePositionByID, &pChild ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pChild->put_Position( &rcPosition ); + } + + if( m_nCenterID != -1 ) + { + CComPtr< ILayerSite > pChild; + HRESULT hRes = m_pSite->get_Child( m_nCenterID, ePositionByID, &pChild ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pChild->put_Position( &rcClient ); + } + + return S_OK; +} diff --git a/Native/DecalControls/BorderLayout.h b/Native/DecalControls/BorderLayout.h new file mode 100644 index 0000000..eed5a52 --- /dev/null +++ b/Native/DecalControls/BorderLayout.h @@ -0,0 +1,73 @@ +// BorderLayout.h : Declaration of the cBorderLayout + +#ifndef __BORDERLAYOUT_H_ +#define __BORDERLAYOUT_H_ + +#include "resource.h" // main symbols +#include "DecalControlsCP.h" + +#include "ControlImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cBorderLayout +class ATL_NO_VTABLE cBorderLayout : + public CComObjectRootEx, + public CComCoClass, + public ILayerImpl< cBorderLayout >, + public ILayoutImpl< cBorderLayout, IBorderLayout, &IID_ILayout, &LIBID_DecalControls >, + public IProvideClassInfo2Impl< &CLSID_BorderLayout, &DIID_IControlEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyIControlEvents< cBorderLayout > +{ +public: + cBorderLayout() + : m_nCenterID( -1 ) + { + } + + // Data members + struct cEdgePlacement + { + eBorderEdge m_edge; + long m_nSize; + long m_nID; + }; + + typedef std::list< cEdgePlacement > cEdgePlacementList; + cEdgePlacementList m_edges; + long m_nCenterID; + + void onChildDestroy( long nID ); + void onSchemaLoad( IView *pView, MSXML::IXMLDOMElementPtr &pElement ); + +DECLARE_REGISTRY_RESOURCEID(IDR_BORDERLAYOUT) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cBorderLayout) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(ILayout) + COM_INTERFACE_ENTRY(IBorderLayout) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cBorderLayout) +CONNECTION_POINT_ENTRY(DIID_IControlEvents) +END_CONNECTION_POINT_MAP() + +public: + // IBorderLayout Methods + STDMETHOD(CreateCenter)(ILayer *pSink); + STDMETHOD(CreateEdge)(eBorderEdge eEdge, long nSize, ILayer *pSink); + + // ILayerRender Methods + STDMETHOD(Reformat)(); +}; + +#endif //__BORDERLAYOUT_H_ diff --git a/Native/DecalControls/BorderLayout.rgs b/Native/DecalControls/BorderLayout.rgs new file mode 100644 index 0000000..3e747df --- /dev/null +++ b/Native/DecalControls/BorderLayout.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.BorderLayout.1 = s 'BorderLayout Class' + { + CLSID = s '{CA121762-31BB-4073-8597-33BAB4BDCAA3}' + } + DecalControls.BorderLayout = s 'BorderLayout Class' + { + CLSID = s '{CA121762-31BB-4073-8597-33BAB4BDCAA3}' + CurVer = s 'DecalControls.BorderLayout.1' + } + NoRemove CLSID + { + ForceRemove {CA121762-31BB-4073-8597-33BAB4BDCAA3} = s 'BorderLayout Class' + { + ProgID = s 'DecalControls.BorderLayout.1' + VersionIndependentProgID = s 'DecalControls.BorderLayout' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/CheckColumn.cpp b/Native/DecalControls/CheckColumn.cpp new file mode 100644 index 0000000..b46bfd7 --- /dev/null +++ b/Native/DecalControls/CheckColumn.cpp @@ -0,0 +1,114 @@ +// CheckColumn.cpp : Implementation of cCheckColumn +#include "stdafx.h" +#include "DecalControls.h" +#include "CheckColumn.h" + +///////////////////////////////////////////////////////////////////////////// +// cCheckColumn + +STDMETHODIMP cCheckColumn::get_FixedWidth(VARIANT_BOOL *pVal) +{ + *pVal = VARIANT_TRUE; + + return S_OK; +} + +STDMETHODIMP cCheckColumn::get_Width(long *pVal) +{ + *pVal = 20; + + return S_OK; +} + +STDMETHODIMP cCheckColumn::put_Width(long newVal) +{ +// m_Width = newVal; + + return S_OK; +} + +STDMETHODIMP cCheckColumn::Render(ICanvas *pCanvas, LPPOINT ptCell, long nColor) +{ + _variant_t vCheck, vHidden; + bool bHidden, bCheck; + + m_pList->get_Data( ptCell->x, ptCell->y, 0, &vCheck ); + bCheck = vCheck.vt == VT_NULL ? false : static_cast(vCheck); + + m_pList->get_Data( ptCell->x, ptCell->y, 1, &vHidden ); + bHidden = vHidden.vt == VT_NULL ? false : static_cast(vHidden); + + // Converted nicely now ... + // Find our checked and unchecked images + CComPtr< IIconCache > pIcons; + + SIZE sz = { 13, 13 }; + m_pSite->GetIconCache( &sz, &pIcons ); + + POINT pt = { 3, 3 }; + if( !bHidden ) + pIcons->DrawIcon( &pt, bCheck ? 0x0600128B : 0x0600128D, 0, pCanvas ); + + return S_OK; +} + +STDMETHODIMP cCheckColumn::get_DataColumns(long *pVal) +{ + *pVal = 2; + + return S_OK; +} + +STDMETHODIMP cCheckColumn::Initialize(IList *newVal, IPluginSite *pSite) +{ + m_pList = newVal; + m_pSite = pSite; + + return S_OK; +} + +STDMETHODIMP cCheckColumn::SchemaLoad(IUnknown *pSchema) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cCheckColumn::get_Height(long *pVal) +{ + *pVal = 20; + + return S_OK; +} + +STDMETHODIMP cCheckColumn::Activate(LPPOINT ptCell) +{ + _variant_t vCheck, vHidden; + + bool bHidden, bCheck; + + m_pList->get_Data( ptCell->x, ptCell->y, 0, &vCheck ); + bCheck = vCheck.vt == VT_NULL ? false : static_cast(vCheck); + + m_pList->get_Data( ptCell->x, ptCell->y, 1, &vHidden ); + bHidden = vHidden.vt == VT_NULL ? false : static_cast(vHidden); + + if( !bHidden ) + m_pList->put_Data( ptCell->x, ptCell->y, 0, &_variant_t( !bCheck ) ); + + return S_OK; +} + +STDMETHODIMP cCheckColumn::get_Color(long nRow, long *pVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cCheckColumn::put_Color(long nRow, long newVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} diff --git a/Native/DecalControls/CheckColumn.h b/Native/DecalControls/CheckColumn.h new file mode 100644 index 0000000..82e2302 --- /dev/null +++ b/Native/DecalControls/CheckColumn.h @@ -0,0 +1,46 @@ +// CheckColumn.h : Declaration of the cCheckColumn + +#ifndef __CHECKCOLUMN_H_ +#define __CHECKCOLUMN_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cCheckColumn +class ATL_NO_VTABLE cCheckColumn : + public CComObjectRootEx, + public CComCoClass, + public IListColumn +{ +public: + cCheckColumn() + { + } + + CComPtr< IList > m_pList; + CComPtr< IPluginSite > m_pSite; + +DECLARE_REGISTRY_RESOURCEID(IDR_CHECKCOLUMN) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cCheckColumn) + COM_INTERFACE_ENTRY(IListColumn) +END_COM_MAP() + +// IListColumn +public: + STDMETHOD(get_Color)(long nRow, /*[out, retval]*/ long *pVal); + STDMETHOD(put_Color)(long nRow, /*[in]*/ long newVal); + STDMETHOD(Activate)(LPPOINT ptCell); + STDMETHOD(get_Height)(/*[out, retval]*/ long *pVal); + STDMETHOD(SchemaLoad)(IUnknown *pSchema); + STDMETHOD(Initialize)(/*[in]*/ IList * newVal, IPluginSite *pSite); + STDMETHOD(get_DataColumns)(/*[out, retval]*/ long *pVal); + STDMETHOD(Render)(ICanvas *, LPPOINT ptCell, long nColor); + STDMETHOD(get_Width)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_FixedWidth)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Width)(/*[in]*/ long newVal); +}; + +#endif //__CHECKCOLUMN_H_ diff --git a/Native/DecalControls/CheckColumn.rgs b/Native/DecalControls/CheckColumn.rgs new file mode 100644 index 0000000..bb51f28 --- /dev/null +++ b/Native/DecalControls/CheckColumn.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.CheckColumn.1 = s 'DecalControls CheckColumn' + { + CLSID = s '{48E444F1-8E30-4E4C-B203-4C87FC901586}' + } + DecalControls.CheckColumn = s 'DecalControls CheckColumn' + { + CLSID = s '{48E444F1-8E30-4E4C-B203-4C87FC901586}' + CurVer = s 'DecalControls.CheckColumn.1' + } + NoRemove CLSID + { + ForceRemove {48E444F1-8E30-4E4C-B203-4C87FC901586} = s 'DecalControls CheckColumn' + { + ProgID = s 'DecalControls.CheckColumn.1' + VersionIndependentProgID = s 'DecalControls.CheckColumn' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/DecalControls/Checkbox.cpp b/Native/DecalControls/Checkbox.cpp new file mode 100644 index 0000000..c9ebe93 --- /dev/null +++ b/Native/DecalControls/Checkbox.cpp @@ -0,0 +1,349 @@ +// Checkbox.cpp : Implementation of cCheckbox +#include "stdafx.h" +#include "DecalControls.h" +#include "Checkbox.h" + +///////////////////////////////////////////////////////////////////////////// +// cCheckbox + +cCheckbox::cCheckbox() +: m_bChecked( VARIANT_FALSE ), +m_bRightToLeft( VARIANT_FALSE ), +m_nTextColor( RGB( 0, 0, 0 ) ), +m_bPressed( VARIANT_FALSE ), +m_bMouseIn( VARIANT_FALSE ) +{ +} + +STDMETHODIMP cCheckbox::get_Font(IFontCacheDisp **pVal) +{ + _ASSERTE( pVal != NULL ); + + if( m_pFont.p == NULL ) + *pVal = NULL; + else + m_pFont->QueryInterface( pVal ); + + return S_OK; +} + +STDMETHODIMP cCheckbox::putref_Font(IFontCacheDisp *newVal) +{ + _ASSERTE( newVal != NULL ); + + if( m_pFont.p ) + m_pFont.Release(); + + HRESULT hRes = newVal->QueryInterface( &m_pFont ); + + _ASSERTE( SUCCEEDED( hRes ) ); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cCheckbox::get_Text(BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = OLE2BSTR( m_strText ); + + return S_OK; +} + +STDMETHODIMP cCheckbox::put_Text(BSTR newVal) +{ + _ASSERTE( newVal != NULL ); + + m_strText = newVal; + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cCheckbox::get_TextColor(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nTextColor; + + return S_OK; +} + +STDMETHODIMP cCheckbox::put_TextColor(long newVal) +{ + _ASSERTE( ( newVal & 0xFF000000L ) == 0 ); + + m_nTextColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cCheckbox::get_Checked(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + *pVal = m_bChecked; + + return S_OK; +} + +STDMETHODIMP cCheckbox::put_Checked(VARIANT_BOOL newVal) +{ + if( m_bChecked == newVal ) + return S_OK; + + m_bChecked = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cCheckbox::get_RightToLeft(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_bRightToLeft; + + return S_OK; +} + +STDMETHODIMP cCheckbox::put_RightToLeft(VARIANT_BOOL newVal) +{ + m_bRightToLeft = newVal; + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cCheckbox::SchemaLoad(IView *pView, IUnknown *pSchema) +{ + // First attempt to load the font + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->CreateFontSchema( 14, 0, pSchema, &m_pFont ); + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vText = pElement->getAttribute( _T( "text" ) ), + vTextColor = pElement->getAttribute( _T( "textcolor" ) ), + vRightToLeft = pElement->getAttribute( _T( "righttoleft" ) ), + vChecked = pElement->getAttribute( _T( "checked" ) ), + vOutline = pElement->getAttribute( _T( "outlinecolor" ) ), + vAntialias = pElement->getAttribute( _T( "aa" ) ); + + // Text must exist + _ASSERTE( vText.vt == VT_BSTR ); + m_strText = vText.bstrVal; + + if( vTextColor.vt != VT_NULL ) + { + try + { + m_nTextColor = static_cast< long >( vTextColor ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vRightToLeft.vt != VT_NULL ) + { + try + { + m_bRightToLeft = ( static_cast< bool >( vRightToLeft ) ) ? VARIANT_TRUE : VARIANT_FALSE; + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vChecked.vt != VT_NULL ) + { + try + { + m_bChecked = ( static_cast< bool >( vChecked ) ) ? VARIANT_TRUE : VARIANT_FALSE; + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + m_nOutlineColor = 0; + m_bOutline = false; + if( vOutline.vt != VT_NULL ) + { + try + { + m_bOutline = true; + m_nOutlineColor = static_cast< long >( vOutline ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + m_bAA = true; + if( vAntialias.vt != VT_NULL ) + { + try + { + m_bAA = static_cast< bool >( vAntialias ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + return S_OK; +} + +#define CHECK_SIZE 13 +#define TEXT_OFFSET 4 + +STDMETHODIMP cCheckbox::Reformat() +{ + if( m_pFont.p == NULL ) + { + // No font was specified, create the default font + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + } + + RECT rc; + m_pSite->get_Position( &rc ); + + SIZE szText; + m_pFont->MeasureText( m_strText, &szText ); + + if( szText.cy >= CHECK_SIZE ) + { + m_ptCheck.y = ( szText.cy - CHECK_SIZE ) / 2; + m_ptText.y = 0; + } + else + { + m_ptCheck.y = 0; + m_ptText.y = ( CHECK_SIZE - szText.cy ) / 2; + } + + if( m_bRightToLeft ) + { + m_ptText.x = ( rc.right - rc.left ) - ( CHECK_SIZE + TEXT_OFFSET ) - szText.cx; + m_ptCheck.x = ( rc.right - rc.left ) - CHECK_SIZE; + } + else + { + m_ptText.x = CHECK_SIZE + TEXT_OFFSET; + m_ptCheck.x = 0; + } + + return S_OK; +} + +STDMETHODIMP cCheckbox::Render( ICanvas *pCanvas ) +{ + bool bChecked = ( m_bPressed && m_bMouseIn ) ? !m_bChecked : !!m_bChecked; + + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + CComPtr< IIconCache > pIcon; + SIZE szIcon = { CHECK_SIZE, CHECK_SIZE }; + pPlugin->GetIconCache( &szIcon, &pIcon ); + + pIcon->DrawIcon( &m_ptCheck, ( bChecked ) ? 0x0600128B : 0x0600128D, 0, pCanvas ); + + long lFlags = 0; + + if( m_bAA ) + lFlags |= eAA; + + if( m_bOutline ) + lFlags |= eOutlined; + + m_pFont->DrawTextEx( &m_ptText, m_strText, m_nTextColor, m_nOutlineColor, lFlags, pCanvas ); + + return S_OK; +} + +STDMETHODIMP cCheckbox::MouseEnter(struct MouseState *) +{ + _ASSERTE( !m_bMouseIn ); + + m_bMouseIn = VARIANT_TRUE; + + if( m_bPressed ) + { + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cCheckbox::MouseExit(struct MouseState *) +{ + _ASSERTE( m_bMouseIn ); + + m_bMouseIn = VARIANT_FALSE; + + if( m_bPressed ) + { + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cCheckbox::MouseDown(struct MouseState *) +{ + _ASSERTE( m_pSite != NULL ); + + m_bPressed = VARIANT_TRUE; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cCheckbox::MouseUp(struct MouseState *) +{ + m_bPressed = VARIANT_FALSE; + + long nID; + m_pSite->get_ID( &nID ); + + if( m_bMouseIn ) + { + _ASSERTE( m_pSite.p != NULL ); + + m_bChecked = ( m_bChecked ) ? VARIANT_FALSE : VARIANT_TRUE; + m_pSite->Invalidate(); + + // NOTE: The command may destroy the control synchronously + // so we make a stack copy of the target in case our instance is destroyed + // for the purpose of completing the command + Fire_Change( nID, m_bChecked ); + } + + return S_OK; +} + diff --git a/Native/DecalControls/Checkbox.h b/Native/DecalControls/Checkbox.h new file mode 100644 index 0000000..2e0d6b9 --- /dev/null +++ b/Native/DecalControls/Checkbox.h @@ -0,0 +1,91 @@ +// Checkbox.h : Declaration of the cCheckbox + +#ifndef __CHECKBOX_H_ +#define __CHECKBOX_H_ + +#include "resource.h" // main symbols +#include "DecalControlsCP.h" + +#include "SinkImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cCheckbox +class ATL_NO_VTABLE cCheckbox : + public CComObjectRootEx, + public CComCoClass, + public IControlImpl< cCheckbox, ICheckbox, &IID_ICheckbox, &LIBID_DecalControls >, + public ILayerMouseImpl, + public ILayerRenderImpl, + public ILayerImpl< cCheckbox >, + public ILayerSchema, + public IProvideClassInfo2Impl< &CLSID_Checkbox, &DIID_ICheckboxEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyICheckboxEvents< cCheckbox > +{ +public: + cCheckbox(); + + _bstr_t m_strText; + CComPtr< IFontCache > m_pFont; + + VARIANT_BOOL m_bChecked, + m_bRightToLeft; + + long m_nTextColor, m_nOutlineColor; + bool m_bAA, m_bOutline; + + POINT m_ptText, + m_ptCheck; + + VARIANT_BOOL m_bPressed, + m_bMouseIn; + +DECLARE_REGISTRY_RESOURCEID(IDR_CHECKBOX) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cCheckbox) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ICheckbox) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cCheckbox) +CONNECTION_POINT_ENTRY(DIID_ICheckboxEvents) +END_CONNECTION_POINT_MAP() + +public: + // ICheckbox Methods + STDMETHOD(get_RightToLeft)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_RightToLeft)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_Checked)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Checked)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_TextColor)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_TextColor)(/*[in]*/ long newVal); + STDMETHOD(get_Text)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Text)(/*[in]*/ BSTR newVal); + STDMETHOD(get_Font)(/*[out, retval]*/ IFontCacheDisp * *pVal); + STDMETHOD(putref_Font)(/*[in]*/ IFontCacheDisp * newVal); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pSchema); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerMouse Methods + STDMETHOD(MouseEnter)(struct MouseState *); + STDMETHOD(MouseExit)(struct MouseState *); + STDMETHOD(MouseDown)(struct MouseState *); + STDMETHOD(MouseUp)(struct MouseState *); +}; + +#endif //__CHECKBOX_H_ diff --git a/Native/DecalControls/Checkbox.rgs b/Native/DecalControls/Checkbox.rgs new file mode 100644 index 0000000..8d44414 --- /dev/null +++ b/Native/DecalControls/Checkbox.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Checkbox.1 = s 'Checkbox Class' + { + CLSID = s '{5AE37451-F79C-478A-834E-EDCF95F01B0E}' + } + DecalControls.Checkbox = s 'Checkbox Class' + { + CLSID = s '{5AE37451-F79C-478A-834E-EDCF95F01B0E}' + CurVer = s 'DecalControls.Checkbox.1' + } + NoRemove CLSID + { + ForceRemove {5AE37451-F79C-478A-834E-EDCF95F01B0E} = s 'Checkbox Class' + { + ProgID = s 'DecalControls.Checkbox.1' + VersionIndependentProgID = s 'DecalControls.Checkbox' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/Choice.cpp b/Native/DecalControls/Choice.cpp new file mode 100644 index 0000000..f05237e --- /dev/null +++ b/Native/DecalControls/Choice.cpp @@ -0,0 +1,426 @@ +// Choice.cpp : Implementation of cChoice +#include "stdafx.h" +#include "DecalControls.h" +#include "Choice.h" + +#include "ChoicePopup.h" +#include "ChoiceDropDown.h" + +///////////////////////////////////////////////////////////////////////////// +// cChoice + +cChoice::cChoice() +: m_nSelected( -1 ), +m_nHotSelect( -1 ), +m_nDropLines( 8 ), +m_bPopup( false ), +m_bMouseDown( false ), +m_bMouseOver( false ) +{ +} + +void cChoice::setPopup( bool bPopup ) +{ + // Always reset hot select + m_bPopup = bPopup; + m_nHotSelect = -1; + + if( bPopup ) + { + long nID; + m_pSite->get_ID( &nID ); + Fire_DropDown( nID ); + m_pPopup->put_Popup( VARIANT_TRUE ); + } + + // Redraw everything + m_pSite->Reformat(); + m_pSite->Invalidate(); +} + +void cChoice::onCreate() +{ + CComPtr< IPluginSite > pPluginSite; + m_pSite->get_PluginSite( &pPluginSite ); + + // Create the image info + pPluginSite->LoadBitmapPortal( 0x06001276, &m_pInactive ); + BSTR bstrFontName; + pPluginSite->get_FontName(&bstrFontName); + pPluginSite->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + + // Create the dropdown + CComObject< cChoiceDropDown > *pDropDown; + CComObject< cChoiceDropDown >::CreateInstance( &pDropDown ); + + pDropDown->m_pChoice = this; + + LayerParams lp = { 0, { -1, -1, 0, 0 }, 0 }; + m_pSite->CreateChild( &lp, pDropDown ); + + m_pPopup = pDropDown->m_pSite; + + // Create the scroller + CComPtr< ILayer > pScrollerLayer; + HRESULT hRes = ::CoCreateInstance( CLSID_Scroller, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pScrollerLayer ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + pScrollerLayer->QueryInterface( &m_pScroller ); + + // Create the scroller object + LayerParams lpScroller = { 0, { 0, 0, 0, 0 }, eRenderClipped }; + m_pPopup->CreateChild( &lpScroller, pScrollerLayer ); + + // Configure the scroller + SIZE szLine = { 18, 1 }; + m_pScroller->put_Increments( &szLine ); + + // Create the popup window + CComObject< cChoicePopup > *pPopup; + CComObject< cChoicePopup >::CreateInstance( &pPopup ); + + pPopup->m_pChoice = this; + m_pScroller->CreateClient( pPopup ); + + m_pPopup->put_Transparent( VARIANT_FALSE ); + m_pSite->put_Transparent( VARIANT_FALSE ); +} + +void cChoice::onDestroy() +{ + m_pPopup.Release(); + + m_pFont.Release(); + m_pInactive.Release(); +} + +STDMETHODIMP cChoice::MouseUp(MouseState *) +{ + m_bMouseDown = false; + + if( m_bMouseOver ) + { + setPopup( !m_bPopup ); + + if( !m_bPopup ) + m_pPopup->put_Popup( VARIANT_FALSE ); + } + + return S_OK; +} + +#define RENDER_LEFTSTRETCH 10 +#define RENDER_RIGHTSTRETCH 7 +#define ROW_HEIGHT 18 + +#define ICON_WIDTH 20 +#define ICON_HEIGHT 19 + +STDMETHODIMP cChoice::Render(ICanvas *pCanvas) +{ + // First draw the background + RECT rcPos; + m_pSite->get_Position( &rcPos ); + + SIZE szImage; + m_pInactive->get_Size( &szImage ); + + static POINT ptBack = { 0, 0 }; + m_pInactive->StretchBlt( pCanvas, &ptBack, rcPos.right - rcPos.left, RENDER_LEFTSTRETCH, szImage.cx - RENDER_RIGHTSTRETCH ); + + if( m_nSelected != -1 ) + { + // Draw the selected text + static POINT ptText = { 12, 2 }; + m_pFont->DrawTextEx( &ptText, m_options[ m_nSelected ].m_strText, 0, 0, eAA, pCanvas ); + } + + // Draw the up/down icon + CComPtr< IPluginSite > pPluginSite; + m_pSite->get_PluginSite( &pPluginSite ); + + SIZE szIcon = { ICON_WIDTH, ICON_HEIGHT }; + CComPtr< IIconCache > pIconCache; + pPluginSite->GetIconCache( &szIcon, &pIconCache ); + + POINT ptIcon = { rcPos.right - rcPos.left - ICON_WIDTH, 0 }; + pIconCache->DrawIcon( &ptIcon, ( ( m_bMouseDown && m_bMouseOver ) ? !m_bPopup : m_bPopup ) ? 0x06001275 : 0x06001274, 0, pCanvas ); + + return S_OK; +} + +STDMETHODIMP cChoice::Reformat() +{ + if( !m_bPopup || m_options.size() == 0 ) + { + // If it's hidden great, hide it well + static RECT rcHidden = { -1, -1, 0, 0 }; + m_pPopup->put_Position( &rcHidden ); + + return S_OK; + } + + // Calculate the correct position + RECT rc; + m_pSite->get_ScreenPosition( &rc ); + + // Two modes, with scroll bar and without + if( m_options.size() > m_nDropLines ) + { + // With a scroller + RECT rcPopup = { rc.left, rc.bottom, rc.right - ICON_WIDTH + 16, rc.bottom + + ROW_HEIGHT * m_nDropLines }; + m_pPopup->put_Position( &rcPopup ); + + m_pScroller->put_VerticalEnabled( VARIANT_TRUE ); + + SIZE szArea = { rc.right - ICON_WIDTH, ROW_HEIGHT * m_options.size() }; + m_pScroller->put_Area( &szArea ); + } + else + { + RECT rcPopup = { rc.left, rc.bottom, rc.right - ICON_WIDTH, rc.bottom + + ROW_HEIGHT * m_options.size() }; + m_pPopup->put_Position( &rcPopup ); + + POINT ptOffset = { 0, 0 }; + m_pScroller->put_Offset( &ptOffset ); + m_pScroller->put_VerticalEnabled( VARIANT_FALSE ); + + SIZE szArea = { rc.right - ICON_WIDTH, ROW_HEIGHT * m_options.size() }; + m_pScroller->put_Area( &szArea ); + } + + return S_OK; +} + +STDMETHODIMP cChoice::SchemaLoad(IView *pView, IUnknown *pSchema) +{ + // Load the data from the schema + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + MSXML::IXMLDOMElementPtr pRow; + for( MSXML::IXMLDOMNodeListPtr pRows = pElement->selectNodes( _T( "option" ) ); + ( pRow = pRows->nextNode() ).GetInterfacePtr() != NULL; ) + { + _variant_t vRow = pRow->getAttribute( _T( "text" ) ), + vData = pRow->getAttribute( _T( "data" ) ); + _ASSERTE( vRow.vt == VT_BSTR ); + + cOption o; + o.m_strText = vRow; + o.m_value = vData; + + m_options.push_back( o ); + } + + _variant_t vDropRows = pElement->getAttribute( "droplines" ), + vSelected = pElement->getAttribute( "selected" ); + + if( vDropRows.vt != VT_NULL ) + { + try + { + m_nDropLines = static_cast< long >( vDropRows ); + _ASSERTE( m_nDropLines > 0 ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vSelected.vt != VT_NULL ) + { + try + { + m_nSelected = static_cast< long >( vSelected ); + _ASSERTE( m_nSelected >= 0 ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + return S_OK; +} + +STDMETHODIMP cChoice::AddChoice(BSTR strDisplay, VARIANT vData) +{ + cOption o; + o.m_strText = strDisplay; + o.m_value = vData; + + m_options.push_back( o ); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cChoice::get_ChoiceCount(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_options.size(); + + return S_OK; +} + +STDMETHODIMP cChoice::get_Data(long nIndex, VARIANT *pVal) +{ + if( pVal == NULL ) + return E_POINTER; + + if( nIndex < 0 || nIndex > m_options.size() ) + { + pVal->lVal = -1; + pVal->vt = VT_I4; + } + + else + ::VariantCopy( pVal, &m_options[ nIndex ].m_value ); + + return S_OK; +} + +STDMETHODIMP cChoice::put_Data(long nIndex, VARIANT newVal) +{ + _ASSERTE( nIndex >= 0 ); + _ASSERTE( nIndex < m_options.size() ); + + ::VariantCopy( &m_options[ nIndex ].m_value, &newVal ); + + return S_OK; +} + +STDMETHODIMP cChoice::get_Text(long nIndex, BSTR *pVal) +{ + USES_CONVERSION; + + _ASSERTE( nIndex >= 0 ); + _ASSERTE( nIndex < m_options.size() ); + _ASSERTE( pVal != NULL ); + + *pVal = OLE2BSTR( m_options[ nIndex ].m_strText ); + + return S_OK; +} + +STDMETHODIMP cChoice::put_Text(long nIndex, BSTR newVal) +{ + _ASSERTE( nIndex >= 0 ); + _ASSERTE( nIndex < m_options.size() ); + _ASSERTE( newVal != NULL ); + + m_options[ nIndex ].m_strText = newVal; + m_pPopup->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cChoice::RemoveChoice(long nIndex) +{ + _ASSERTE( nIndex >= 0 ); + _ASSERTE( nIndex < m_options.size() ); + + m_options.erase( m_options.begin() + nIndex ); + + if( m_nSelected >= m_options.size() ) + m_nSelected = m_options.size() - 1; + + long nID; + m_pSite->get_ID( &nID ); + Fire_Change( nID, m_nSelected ); + + // Redraw the concerned + m_pSite->Reformat(); + m_pPopup->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cChoice::get_Dropped(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = ( m_bPopup ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cChoice::put_Dropped(VARIANT_BOOL newVal) +{ + if( !!newVal != m_bPopup ) + setPopup( !!newVal ); + + return S_OK; +} + +STDMETHODIMP cChoice::get_Selected(long *pVal) +{ + _ASSERTE( pVal != NULL ); + *pVal = m_nSelected; + + return S_OK; +} + +STDMETHODIMP cChoice::put_Selected(long newVal) +{ + _ASSERTE( newVal >= -1 ); + //_ASSERTE( newVal < m_options.size() ); + //back out if out of bounds, don't error to prevent breaking vb plugs + //this should fix the crash on display bug + if (newVal >= m_options.size()) + return S_OK; + + if( newVal == m_nSelected ) + return S_OK; + + m_nSelected = newVal; + + long nID; + m_pSite->get_ID( &nID ); + Fire_Change( nID, m_nSelected ); + + // Redraw the concerned + m_pSite->Invalidate(); + m_pPopup->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cChoice::get_DropLines(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nDropLines; + + return S_OK; +} + +STDMETHODIMP cChoice::put_DropLines(long newVal) +{ + _ASSERTE( newVal > 0 ); + + m_nDropLines = newVal; + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cChoice::Clear() +{ + m_options.clear(); + m_nSelected = -1; + + long nID; + m_pSite->get_ID( &nID ); + Fire_Change( nID, m_nSelected ); + + m_pSite->Reformat(); + + return S_OK; +} diff --git a/Native/DecalControls/Choice.h b/Native/DecalControls/Choice.h new file mode 100644 index 0000000..86351c1 --- /dev/null +++ b/Native/DecalControls/Choice.h @@ -0,0 +1,128 @@ +// Choice.h : Declaration of the cChoice + +#ifndef __CHOICE_H_ +#define __CHOICE_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cChoice +class ATL_NO_VTABLE cChoice : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public ILayerImpl< cChoice >, + public ILayerRenderImpl, + public ILayerMouseImpl, + public ILayerSchema, + public IControlImpl< cChoice, IChoice, &IID_IChoice, &LIBID_DecalControls >, + public IProvideClassInfo2Impl< &CLSID_Choice, &DIID_IChoiceEvents, &LIBID_DecalControls >, + public CProxyIChoiceEvents< cChoice > +{ +public: + cChoice(); + + long m_nSelected; + long m_nHotSelect; + long m_nDropLines; + + struct cOption + { + _variant_t m_value; + _bstr_t m_strText; + }; + + typedef std::deque< cOption > cOptionList; + cOptionList m_options; + + CComPtr< IImageCache > m_pInactive; + CComPtr< IFontCache > m_pFont; + CComPtr< ILayerSite > m_pPopup; + CComPtr< IScroller > m_pScroller; + + bool m_bMouseDown; + bool m_bMouseOver; + bool m_bPopup; + + void setPopup( bool bPopup ); + + void onCreate(); + void onDestroy(); + +DECLARE_REGISTRY_RESOURCEID(IDR_CHOICE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cChoice) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IChoice) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cChoice) +CONNECTION_POINT_ENTRY(DIID_IChoiceEvents) +END_CONNECTION_POINT_MAP() + +public: + STDMETHOD(Clear)(); + // IChoice Methods + STDMETHOD(get_Selected)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Selected)(/*[in]*/ long newVal); + STDMETHOD(get_Dropped)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Dropped)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(RemoveChoice)(long nIndex); + STDMETHOD(get_Text)(long nIndex, /*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Text)(long nIndex, /*[in]*/ BSTR newVal); + STDMETHOD(get_Data)(long nIndex, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(put_Data)(long nIndex, /*[in]*/ VARIANT newVal); + STDMETHOD(get_ChoiceCount)(/*[out, retval]*/ long *pVal); + STDMETHOD(AddChoice)(BSTR strDisplay, /*[optional]*/ VARIANT vData); + STDMETHOD(get_DropLines)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_DropLines)(/*[in]*/ long newVal); + + // ILayerMouse Methods + STDMETHOD(MouseDown)(MouseState *) + { + m_bMouseDown = true; + m_pSite->Invalidate(); + + return S_OK; + } + + STDMETHOD(MouseEnter)(MouseState *pMS) + { + m_bMouseOver = true; + m_pSite->Invalidate(); + + return S_OK; + } + + STDMETHOD(MouseExit)(MouseState *pMS) + { + m_bMouseOver = false; + m_pSite->Invalidate(); + + return S_OK; + } + + STDMETHOD(MouseUp)(MouseState *pMS); + + // ILayerRender Methods + STDMETHOD(Render)(ICanvas *pCanvas); + STDMETHOD(Reformat)(); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pSchema); +}; + +#endif //__CHOICE_H_ diff --git a/Native/DecalControls/Choice.rgs b/Native/DecalControls/Choice.rgs new file mode 100644 index 0000000..3be5215 --- /dev/null +++ b/Native/DecalControls/Choice.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Choice.1 = s 'DecalControls Choice' + { + CLSID = s '{E099DC60-0F19-4690-AB7C-8B5834DA286E}' + } + DecalControls.Choice = s 'DecalControls Choice' + { + CLSID = s '{E099DC60-0F19-4690-AB7C-8B5834DA286E}' + CurVer = s 'DecalControls.Choice.1' + } + NoRemove CLSID + { + ForceRemove {E099DC60-0F19-4690-AB7C-8B5834DA286E} = s 'DecalControls Choice' + { + ProgID = s 'DecalControls.Choice.1' + VersionIndependentProgID = s 'DecalControls.Choice' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/ChoiceDropDown.cpp b/Native/DecalControls/ChoiceDropDown.cpp new file mode 100644 index 0000000..2a0e6fd --- /dev/null +++ b/Native/DecalControls/ChoiceDropDown.cpp @@ -0,0 +1,46 @@ +// ChoiceDropDown.cpp : Implementation of cChoiceDropDown +#include "stdafx.h" +#include "DecalControls.h" +#include "ChoiceDropDown.h" + +#include "Choice.h" + +///////////////////////////////////////////////////////////////////////////// +// cChoiceDropDown + +STDMETHODIMP cChoiceDropDown::Reformat() +{ + RECT rcLayer; + m_pSite->get_Position( &rcLayer ); + + // Move our only child to cover the entire client + CComPtr< ILayerSite > pChild; + m_pSite->get_Child( 0, ePositionByIndex, &pChild ); + + if( ( rcLayer.right - rcLayer.left ) < 16 || ( rcLayer.bottom - rcLayer.top ) < 16 ) + { + RECT rcClient = { 0, 0, 0, 0 }; + pChild->put_Position( &rcClient ); + } + else + { + RECT rcClient = { 0, 0, rcLayer.right - rcLayer.left, rcLayer.bottom - rcLayer.top }; + pChild->put_Position( &rcClient ); + } + + return S_OK; +} + +STDMETHODIMP cChoiceDropDown::PopupCancel(MouseState *pMS, VARIANT_BOOL *pbContinue) +{ + // Allow clicks in the parent object + *pbContinue = ( pMS->over == m_pChoice ) ? VARIANT_TRUE : VARIANT_FALSE; + + if( !( *pbContinue ) ) + { + m_pChoice->m_nHotSelect = -1; + m_pChoice->setPopup( false ); + } + + return S_OK; +} \ No newline at end of file diff --git a/Native/DecalControls/ChoiceDropDown.h b/Native/DecalControls/ChoiceDropDown.h new file mode 100644 index 0000000..fe8630c --- /dev/null +++ b/Native/DecalControls/ChoiceDropDown.h @@ -0,0 +1,49 @@ +// ChoiceDropDown.h : Declaration of the cChoiceDropDown + +#ifndef __CHOICEDROPDOWN_H_ +#define __CHOICEDROPDOWN_H_ + +#include "resource.h" // main symbols + +#include + +class cChoice; + +///////////////////////////////////////////////////////////////////////////// +// cChoiceDropDown +class ATL_NO_VTABLE cChoiceDropDown : + public CComObjectRootEx, + public ILayerImpl< cChoiceDropDown >, + public ILayerRenderImpl, + public ILayerPopup, + public cNoEventsImpl, + public IChoiceDropDown +{ +public: + cChoiceDropDown() + : m_pChoice( NULL ) + { + } + + cChoice *m_pChoice; + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cChoiceDropDown) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerPopup) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IChoiceDropDown) +END_COM_MAP() + +// IChoiceDropDown +public: + + // ILayerRender Methods + STDMETHOD(Reformat)(); + + // ILayerPopup Methods + STDMETHOD(PopupCancel)(MouseState *pMS, VARIANT_BOOL *pbContinue); +}; + +#endif //__CHOICEDROPDOWN_H_ diff --git a/Native/DecalControls/ChoiceDropDown.rgs b/Native/DecalControls/ChoiceDropDown.rgs new file mode 100644 index 0000000..8e67dc2 --- /dev/null +++ b/Native/DecalControls/ChoiceDropDown.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.ChoiceDropDown.1 = s 'ChoiceDropDown Class' + { + CLSID = s '{DF7D18FA-A3AE-4AED-BEE3-7936F25EC95A}' + } + DecalControls.ChoiceDropDown = s 'ChoiceDropDown Class' + { + CLSID = s '{DF7D18FA-A3AE-4AED-BEE3-7936F25EC95A}' + CurVer = s 'DecalControls.ChoiceDropDown.1' + } + NoRemove CLSID + { + ForceRemove {DF7D18FA-A3AE-4AED-BEE3-7936F25EC95A} = s 'ChoiceDropDown Class' + { + ProgID = s 'DecalControls.ChoiceDropDown.1' + VersionIndependentProgID = s 'DecalControls.ChoiceDropDown' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/ChoicePopup.cpp b/Native/DecalControls/ChoicePopup.cpp new file mode 100644 index 0000000..3fc2cdb --- /dev/null +++ b/Native/DecalControls/ChoicePopup.cpp @@ -0,0 +1,97 @@ +// ChoicePopup.cpp : Implementation of cChoicePopup +#include "stdafx.h" +#include "DecalControls.h" +#include "ChoicePopup.h" + +#include "Choice.h" + +///////////////////////////////////////////////////////////////////////////// +// cChoicePopup + +#define ROW_HEIGHT 18 + +void cChoicePopup::hotSelect( MouseState *pMS ) +{ + if( pMS->over != this ) + m_pChoice->m_nHotSelect = -1; + else + { + m_pChoice->m_nHotSelect = pMS->client.y / ROW_HEIGHT; + + if( m_pChoice->m_nHotSelect >= m_pChoice->m_options.size() ) + // If we went over the edge, kill the selection + m_pChoice->m_nHotSelect = -1; + } + + m_pSite->Invalidate(); +} + +void cChoicePopup::onCreate() +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->LoadBitmapPortal( 0x0600127A, &m_pActive ); + + m_pSite->put_Transparent( VARIANT_FALSE ); +} + +void cChoicePopup::onDestroy() +{ + m_pActive.Release(); +} + +#define RENDER_LEFTSTRETCH 10 +#define RENDER_RIGHTSTRETCH 7 + +STDMETHODIMP cChoicePopup::Render(ICanvas *pCanvas) +{ + int nHighlight = ( m_pChoice->m_nHotSelect == -1 ) ? m_pChoice->m_nSelected : m_pChoice->m_nHotSelect; + + RECT rc; + m_pSite->get_Position( &rc ); + + long nWidth = rc.right - rc.left; + + SIZE szImage; + m_pActive->get_Size( &szImage ); + + long nRightStretch = szImage.cx - RENDER_RIGHTSTRETCH; + + for( cChoice::cOptionList::iterator i = m_pChoice->m_options.begin(); i != m_pChoice->m_options.end(); ++ i ) + { + int nRow = i - m_pChoice->m_options.begin(); + bool bHighlight = ( nRow == nHighlight ); + POINT ptDest = { 0, nRow * ROW_HEIGHT }; + + // Draw the background image + ( ( bHighlight ) ? m_pActive : m_pChoice->m_pInactive )->StretchBlt( pCanvas, &ptDest, nWidth, RENDER_LEFTSTRETCH, nRightStretch ); + + // Draw the text + POINT ptText = { 12, nRow * ROW_HEIGHT + 2 }; + m_pChoice->m_pFont->DrawTextEx( &ptText, i->m_strText, 0, 0, eAA, pCanvas ); + } + + return S_OK; +} + +STDMETHODIMP cChoicePopup::MouseUp(MouseState *pMS) +{ + // Set the selection + m_bMouseDown = false; + hotSelect( pMS ); + + if( m_pChoice->m_nHotSelect != -1 ) + m_pChoice->put_Selected( m_pChoice->m_nHotSelect ); + + m_pChoice->m_pSite->Invalidate(); + + // Hide the popup + m_pChoice->setPopup( false ); + m_pChoice->m_pPopup->put_Popup( VARIANT_FALSE ); + + // Clear the selection + m_pSite->Invalidate(); + + return S_OK; +} diff --git a/Native/DecalControls/ChoicePopup.h b/Native/DecalControls/ChoicePopup.h new file mode 100644 index 0000000..a5ebf66 --- /dev/null +++ b/Native/DecalControls/ChoicePopup.h @@ -0,0 +1,87 @@ +// ChoicePopup.h : Declaration of the cChoicePopup + +#ifndef __CHOICEPOPUP_H_ +#define __CHOICEPOPUP_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" + +class cChoice; + +///////////////////////////////////////////////////////////////////////////// +// cChoicePopup +class ATL_NO_VTABLE cChoicePopup : + public CComObjectRootEx, + public ILayerImpl< cChoicePopup >, + public ILayerRenderImpl, + public ILayerMouseImpl, + public cNoEventsImpl, + public IChoicePopup +{ +public: + cChoicePopup() + : m_pChoice( NULL ), + m_bMouseDown( false ) + { + } + + cChoice *m_pChoice; + CComPtr< IImageCache > m_pActive; + bool m_bMouseDown; + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cChoicePopup) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IChoicePopup) +END_COM_MAP() + + void hotSelect( MouseState *pMS ); + +public: + // IChoicePopup Methods + + // ILayerRender Methods + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerMouse Methods + STDMETHOD(MouseDown)(MouseState *pMS) + { + m_bMouseDown = true; + hotSelect( pMS ); + + return S_OK; + } + + STDMETHOD(MouseEnter)(MouseState *pMS) + { + if( m_bMouseDown ) + hotSelect( pMS ); + + return S_OK; + } + + STDMETHOD(MouseExit)(MouseState *pMS) + { + if( m_bMouseDown ) + hotSelect( pMS ); + + return S_OK; + } + + STDMETHOD(MouseMove)(MouseState *pMS) + { + if( m_bMouseDown ) + hotSelect( pMS ); + + return S_OK; + } + + STDMETHOD(MouseUp)(MouseState *pMS); +}; + +#endif //__CHOICEPOPUP_H_ diff --git a/Native/DecalControls/Client.cpp b/Native/DecalControls/Client.cpp new file mode 100644 index 0000000..bab7191 --- /dev/null +++ b/Native/DecalControls/Client.cpp @@ -0,0 +1,37 @@ +// Client.cpp : Implementation of cClient +#include "stdafx.h" +#include "DecalControls.h" +#include "Client.h" + +///////////////////////////////////////////////////////////////////////////// +// cClient + +STDMETHODIMP cClient::LayerCreate( ILayerSite *pSite ) +{ + m_pSite = pSite; + + return S_OK; +} + +STDMETHODIMP cClient::LayerDestroy() +{ + m_pSite.Release(); + + return S_OK; +} + +STDMETHODIMP cClient::SchemaLoad(IView *pView, IUnknown *pXMLSchema) +{ + MSXML::IXMLDOMElementPtr pElement = pXMLSchema; + + long nID = 1000; + + // Create all child controls from schema and let them be + // placed wherever they like + MSXML::IXMLDOMElementPtr pChild; + for( MSXML::IXMLDOMNodeListPtr pChildren = pElement->selectNodes( _T( "control" ) ); + ( pChild = pChildren->nextNode() ).GetInterfacePtr() != NULL; ) + pView->LoadControl( m_pSite, nID ++, pChild ); + + return S_OK; +} diff --git a/Native/DecalControls/Client.h b/Native/DecalControls/Client.h new file mode 100644 index 0000000..b437217 --- /dev/null +++ b/Native/DecalControls/Client.h @@ -0,0 +1,50 @@ +// Client.h : Declaration of the cClient + +#ifndef __CLIENT_H_ +#define __CLIENT_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cClient +class ATL_NO_VTABLE cClient : + public CComObjectRootEx, + public CComCoClass, + public ILayerImpl, + public ILayerSchema, + public IClient +{ +public: + cClient() + { + } + + CComPtr< ILayerSite > m_pSite; + + // TODO: Add support for background image and possibly + // scrolling + +DECLARE_REGISTRY_RESOURCEID(IDR_CLIENT) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cClient) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IClient) +END_COM_MAP() + +public: + // IClient Methods + + // ILayer Methods + STDMETHOD(LayerCreate)(ILayerSite *pSite); + STDMETHOD(LayerDestroy)(); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pXMLSchema); +}; + +#endif //__CLIENT_H_ diff --git a/Native/DecalControls/Client.rgs b/Native/DecalControls/Client.rgs new file mode 100644 index 0000000..db55ffd --- /dev/null +++ b/Native/DecalControls/Client.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Client.1 = s 'DecalControls Client' + { + CLSID = s '{CD6556CD-F8D9-4CB0-AB7C-7C33058294E4}' + } + DecalControls.Client = s 'DecalControls Client' + { + CLSID = s '{CD6556CD-F8D9-4CB0-AB7C-7C33058294E4}' + CurVer = s 'DecalControls.Client.1' + } + NoRemove CLSID + { + ForceRemove {CD6556CD-F8D9-4CB0-AB7C-7C33058294E4} = s 'DecalControls Client' + { + ProgID = s 'DecalControls.Client.1' + VersionIndependentProgID = s 'DecalControls.Client' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/ControlImpl.h b/Native/DecalControls/ControlImpl.h new file mode 100644 index 0000000..4e539b4 --- /dev/null +++ b/Native/DecalControls/ControlImpl.h @@ -0,0 +1,155 @@ +// ControlImpl.h +// Default interface Implementations for controls + +#ifndef __CONTROLIMPL_H +#define __CONTROLIMPL_H + +#include "..\Inject\SinkImpl.h" + +template< class cImpl, class ILayoutItf, const IID *pDispIID, const GUID *pLib > +class ATL_NO_VTABLE ILayoutImpl +: public IControlImpl< cImpl, ILayoutItf, pDispIID, pLib >, +public ILayerRenderImpl, +public ILayerSchema +{ +public: + ILayoutImpl() + // Initialize in the static range + : m_nNextControlID( 1000 ) + { + } + + long m_nNextControlID; + + // Override this function for custom schema fun + void onSchemaLoad( IView *, MSXML::IXMLDOMElementPtr & ) + { + } + + long loadChildControl( IView *pView, const MSXML::IXMLDOMElementPtr &pChild ) + { + _ASSERTE( pView != NULL ); + _ASSERTE( pChild.GetInterfacePtr() != NULL ); + + long nAssigned; + pView->LoadControl( static_cast< cImpl * >( this )->m_pSite, ++ m_nNextControlID, pChild, &nAssigned ); + + return nAssigned; + } + + long dispenseID() + { + return ++ m_nNextControlID; + } + + CComPtr< IImageCache > m_pBackground; + + // ILayout Methods + STDMETHOD(get_Background)( IImageCacheDisp **ppVal ) + { + _ASSERTE( ppVal != NULL ); + + if( m_pBackground.p == NULL ) + *ppVal = NULL; + else + m_pBackground->QueryInterface( ppVal ); + + return S_OK; + } + + STDMETHOD(putref_Background)( IImageCacheDisp *pCache ) + { + if( m_pBackground.p ) + m_pBackground.Release(); + + if( pCache != NULL ) + pCache->QueryInterface( &m_pBackground ); + + static_cast< cImpl * >( this )->m_pSite->Invalidate(); + + return S_OK; + } + + // ILayerRender Methods + STDMETHOD(Render)( ICanvas *pCanvas ) + { + if( m_pBackground.p == NULL ) + // No background means no drawing + return S_OK; + + // Tile the background into the clipping area + ClipParams cp; + pCanvas->GetClipParams( &cp ); + + RECT rc = { cp.org.x, cp.org.y, cp.org.x + ( cp.window.right - cp.window.left ), + cp.org.y + ( cp.window.bottom - cp.window.top ) }; + + m_pBackground->PatBlt( pCanvas, &rc, &cp.org ); + + return S_OK; + } + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pXMLSchema ) + { + MSXML::IXMLDOMElementPtr pElement = pXMLSchema; + CComPtr< IPluginSite > pPluginSite; + static_cast< cImpl * >( this )->m_pSite->get_PluginSite( &pPluginSite ); + + HRESULT hRes = pPluginSite->LoadImageSchema( pXMLSchema, &m_pBackground ); + _ASSERTE( SUCCEEDED( hRes ) ); + + static_cast< cImpl * >( this )->onSchemaLoad( pView, pElement ); + + return S_OK; + } +}; + +template< UINT nID, class cImpl > +class IScrollerEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IScrollerEvents, &LIBID_DecalControls > +{ +}; + +template< UINT nID, class cImpl > +class IListEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IListEvents, &LIBID_DecalControls > +{ +}; + +template< UINT nID, class cImpl > +class INotebookEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_INotebookEvents, &LIBID_DecalControls > +{ +}; + +#define DISPID_BEGIN 10 +#define DISPID_END 11 + +template< UINT nID, class cImpl > +class IEditEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IEditEvents, &LIBID_DecalControls > +{ +}; + +#define DISPID_DROPDOWN 12 + +template< UINT nID, class cImpl > +class IChoiceEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IChoiceEvents, &LIBID_DecalControls > +{ +}; + +template< UINT nID, class cImpl > +class ICheckboxEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_ICheckboxEvents, &LIBID_DecalControls > +{ +}; + +template< UINT nID, class cImpl > +class ISliderEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_ISliderEvents, &LIBID_DecalControls > +{ +}; + +#endif diff --git a/Native/DecalControls/DecalControls.clw b/Native/DecalControls/DecalControls.clw new file mode 100644 index 0000000..01b4866 --- /dev/null +++ b/Native/DecalControls/DecalControls.clw @@ -0,0 +1,14 @@ +; CLW file contains information for the MFC ClassWizard + +[General Info] +Version=1 +LastClass= +LastTemplate=CDialog +NewFileInclude1=#include "stdafx.h" +NewFileInclude2=#include "decalcontrols.h" +LastPage=0 + +ClassCount=0 + +ResourceCount=0 + diff --git a/Native/DecalControls/DecalControls.cpp b/Native/DecalControls/DecalControls.cpp new file mode 100644 index 0000000..d84660e --- /dev/null +++ b/Native/DecalControls/DecalControls.cpp @@ -0,0 +1,105 @@ +// DecalControls.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f DecalControlsps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "DecalControls.h" + +#include "Scroller.h" +#include "List.h" + +#include "TextColumn.h" +#include "IconColumn.h" +#include "CheckColumn.h" +#include "Notebook.h" + +#include "DecalControls_i.c" +#include "Edit.h" +#include "Choice.h" +#include "FixedLayout.h" +#include "BorderLayout.h" +#include "PageLayout.h" +#include "PushButton.h" +#include "Static.h" +#include "Checkbox.h" +#include "DerethMap.h" +#include "Slider.h" +#include "Progress.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) + OBJECT_ENTRY(CLSID_Scroller, cScroller) + OBJECT_ENTRY(CLSID_List, cList) + OBJECT_ENTRY(CLSID_TextColumn, cTextColumn) + OBJECT_ENTRY(CLSID_IconColumn, cIconColumn) + OBJECT_ENTRY(CLSID_CheckColumn, cCheckColumn) + OBJECT_ENTRY(CLSID_Notebook, cNotebook) + OBJECT_ENTRY(CLSID_Edit, cEdit) + OBJECT_ENTRY(CLSID_Choice, cChoice) + OBJECT_ENTRY(CLSID_FixedLayout, cFixedLayout) + OBJECT_ENTRY(CLSID_BorderLayout, cBorderLayout) + OBJECT_ENTRY(CLSID_PageLayout, cPageLayout) + OBJECT_ENTRY(CLSID_PushButton, cPushButton) + OBJECT_ENTRY(CLSID_StaticText, cStatic) + OBJECT_ENTRY(CLSID_Checkbox, cCheckbox) + OBJECT_ENTRY(CLSID_DerethMap, cDerethMap) + OBJECT_ENTRY(CLSID_Slider, cSlider) + OBJECT_ENTRY(CLSID_Progress, cProgress) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_DecalControls); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + + diff --git a/Native/DecalControls/DecalControls.def b/Native/DecalControls/DecalControls.def new file mode 100644 index 0000000..1b40410 --- /dev/null +++ b/Native/DecalControls/DecalControls.def @@ -0,0 +1,9 @@ +; DecalControls.def : Declares the module parameters. + +LIBRARY "DecalControls.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Native/DecalControls/DecalControls.dsp b/Native/DecalControls/DecalControls.dsp new file mode 100644 index 0000000..be76c72 --- /dev/null +++ b/Native/DecalControls/DecalControls.dsp @@ -0,0 +1,402 @@ +# Microsoft Developer Studio Project File - Name="DecalControls" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=DecalControls - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "DecalControls.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "DecalControls.mak" CFG="DecalControls - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "DecalControls - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalControls - Win32 Release MinDependency" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "DecalControls - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\Inject" /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\Decal\source\Debug\DecalControls.dll +InputPath=\Decal\source\Debug\DecalControls.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalControls - Win32 Release MinDependency" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinDependency" +# PROP BASE Intermediate_Dir "ReleaseMinDependency" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinDependency" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Inject" /I "..\Include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\Decal\source\Release\DecalControls.dll +InputPath=\Decal\source\Release\DecalControls.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "DecalControls - Win32 Debug" +# Name "DecalControls - Win32 Release MinDependency" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\BorderLayout.cpp +# End Source File +# Begin Source File + +SOURCE=.\Checkbox.cpp +# End Source File +# Begin Source File + +SOURCE=.\CheckColumn.cpp +# End Source File +# Begin Source File + +SOURCE=.\Choice.cpp +# End Source File +# Begin Source File + +SOURCE=.\ChoiceDropDown.cpp +# End Source File +# Begin Source File + +SOURCE=.\ChoicePopup.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalControls.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalControls.def +# End Source File +# Begin Source File + +SOURCE=.\DecalControls.idl +# ADD MTL /tlb ".\DecalControls.tlb" /h "DecalControls.h" /iid "DecalControls_i.c" /Oicf +# End Source File +# Begin Source File + +SOURCE=.\DecalControls.rc +# End Source File +# Begin Source File + +SOURCE=.\DerethMap.cpp +# End Source File +# Begin Source File + +SOURCE=.\Edit.cpp +# End Source File +# Begin Source File + +SOURCE=.\FixedLayout.cpp +# End Source File +# Begin Source File + +SOURCE=.\IconColumn.cpp +# End Source File +# Begin Source File + +SOURCE=..\Inject\Inject_i.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\List.cpp +# End Source File +# Begin Source File + +SOURCE=.\ListView.cpp +# End Source File +# Begin Source File + +SOURCE=.\Notebook.cpp +# End Source File +# Begin Source File + +SOURCE=.\PageLayout.cpp +# End Source File +# Begin Source File + +SOURCE=.\Progress.cpp +# End Source File +# Begin Source File + +SOURCE=.\PushButton.cpp +# End Source File +# Begin Source File + +SOURCE=.\Scroller.cpp +# End Source File +# Begin Source File + +SOURCE=.\Slider.cpp +# End Source File +# Begin Source File + +SOURCE=.\Static.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\TextColumn.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\BorderLayout.h +# End Source File +# Begin Source File + +SOURCE=.\Checkbox.h +# End Source File +# Begin Source File + +SOURCE=.\CheckColumn.h +# End Source File +# Begin Source File + +SOURCE=.\Choice.h +# End Source File +# Begin Source File + +SOURCE=.\ChoiceDropDown.h +# End Source File +# Begin Source File + +SOURCE=.\ChoicePopup.h +# End Source File +# Begin Source File + +SOURCE=.\ControlImpl.h +# End Source File +# Begin Source File + +SOURCE=.\DecalControlsCP.h +# End Source File +# Begin Source File + +SOURCE=.\DerethMap.h +# End Source File +# Begin Source File + +SOURCE=.\Edit.h +# End Source File +# Begin Source File + +SOURCE=.\FixedLayout.h +# End Source File +# Begin Source File + +SOURCE=.\IconColumn.h +# End Source File +# Begin Source File + +SOURCE=.\List.h +# End Source File +# Begin Source File + +SOURCE=.\ListView.h +# End Source File +# Begin Source File + +SOURCE=.\Notebook.h +# End Source File +# Begin Source File + +SOURCE=.\PageLayout.h +# End Source File +# Begin Source File + +SOURCE=.\Progress.h +# End Source File +# Begin Source File + +SOURCE=.\PushButton.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\Scroller.h +# End Source File +# Begin Source File + +SOURCE=.\Slider.h +# End Source File +# Begin Source File + +SOURCE=.\Static.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\TextColumn.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\BorderLayout.rgs +# End Source File +# Begin Source File + +SOURCE=.\Checkbox.rgs +# End Source File +# Begin Source File + +SOURCE=.\CheckColumn.rgs +# End Source File +# Begin Source File + +SOURCE=.\Choice.rgs +# End Source File +# Begin Source File + +SOURCE=.\ChoiceDropDown.rgs +# End Source File +# Begin Source File + +SOURCE=.\Client.rgs +# End Source File +# Begin Source File + +SOURCE=.\DerethMap.rgs +# End Source File +# Begin Source File + +SOURCE=.\Edit.rgs +# End Source File +# Begin Source File + +SOURCE=.\FixedLayout.rgs +# End Source File +# Begin Source File + +SOURCE=.\IconColumn.rgs +# End Source File +# Begin Source File + +SOURCE=.\List.rgs +# End Source File +# Begin Source File + +SOURCE=.\Notebook.rgs +# End Source File +# Begin Source File + +SOURCE=.\PageLayout.rgs +# End Source File +# Begin Source File + +SOURCE=.\Progress.rgs +# End Source File +# Begin Source File + +SOURCE=.\PushButton.rgs +# End Source File +# Begin Source File + +SOURCE=.\Scroller.rgs +# End Source File +# Begin Source File + +SOURCE=.\Slider.rgs +# End Source File +# Begin Source File + +SOURCE=.\Static.rgs +# End Source File +# Begin Source File + +SOURCE=.\TextColumn.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/DecalControls/DecalControls.idl b/Native/DecalControls/DecalControls.idl new file mode 100644 index 0000000..c48bc8f --- /dev/null +++ b/Native/DecalControls/DecalControls.idl @@ -0,0 +1,663 @@ +// DecalControls.idl : IDL source for DecalControls.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (DecalControls.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; + +import "..\Inject\Inject.idl"; + +interface IListColumn; + +enum eBorderEdge +{ + eEdgeLeft, + eEdgeTop, + eEdgeRight, + eEdgeBottom +}; + + [ + object, + uuid(24CFCE12-88A0-437A-89E6-31982EA92899), + helpstring("IScroller Interface"), + pointer_default(unique) + ] + interface IScroller : IControl + { + [propget, helpstring("property Viewport")] HRESULT Viewport([out, retval] LPSIZE pVal); + [propget, helpstring("property Area")] HRESULT Area([out, retval] LPSIZE pVal); + [propput, helpstring("property Area")] HRESULT Area([in] LPSIZE newVal); + [propget, helpstring("property HorizontalEnabled")] HRESULT HorizontalEnabled([out, retval] VARIANT_BOOL *pVal); + [propput, helpstring("property HorizontalEnabled")] HRESULT HorizontalEnabled([in] VARIANT_BOOL newVal); + [propget, helpstring("property VerticalEnabled")] HRESULT VerticalEnabled([out, retval] VARIANT_BOOL *pVal); + [propput, helpstring("property VerticalEnabled")] HRESULT VerticalEnabled([in] VARIANT_BOOL newVal); + [helpstring("method CreateClient")] HRESULT CreateClient(ILayer *pChild); + [propget, helpstring("property Offset")] HRESULT Offset([out, retval] LPPOINT pVal); + [propput, helpstring("property Offset")] HRESULT Offset([in] LPPOINT newVal); + [helpstring("method ScrollTo")] HRESULT ScrollTo(LPPOINT ptOffset); + [propget, helpstring("property Increments")] HRESULT Increments([out, retval] LPSIZE pVal); + [propput, helpstring("property Increments")] HRESULT Increments([in] LPSIZE newVal); + [helpstring("method ResetScroller")] HRESULT ResetScroller(); + }; + + [ + uuid(DEE67370-16C9-4f81-80CC-1F1B61112299), + helpstring("IScrollerEvents Interface") + ] + dispinterface IScrollerEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object.")] void Destroy(long nID); + [id(6), helpstring("method ScrollChange")] HRESULT Change(long nID, long nX, long nY); + }; + + [ + object, + uuid(A54D70F6-8CFE-4259-9F16-AF0111541278), + dual, + helpstring("IList Interface"), + pointer_default(unique) + ] + interface IListDisp : IControl + { + [id(101), helpstring("method AddRow")] HRESULT AddRow([out, retval] long *pnNewIndex); + [id(102), helpstring("method DeleteRow")] HRESULT DeleteRow(long nIndex); + [id(103), propget, helpstring("property Data")] HRESULT Data(long nX, long nY, [defaultvalue(0)] long nSubValue, [out, retval] VARIANT* pVal); + [id(103), propput, helpstring("property Data")] HRESULT Data(long nX, long nY, [defaultvalue(0)] long nSubValue, [in] VARIANT* newVal); + [id(104), propput, helpstring("property RowEstimate")] HRESULT RowEstimate([in] long newVal); + [propget, id(105), helpstring("property Count")] HRESULT Count([out, retval] long *pVal); + [id(106), helpstring("method Clear")] HRESULT Clear(); + [id(107), helpstring("method InsertRow")] HRESULT InsertRow(long lIndex); + [id(108), propget, helpstring("method GetColumnWidth")] HRESULT ColumnWidth(long nColumn, [out, retval] long *nWidth); + [id(108), propput, helpstring("method SetColumnWidth")] HRESULT ColumnWidth(long nColumn, long nWidth); + [propget, id(109), helpstring("property Color")] HRESULT Color(long nX, long nY, [out, retval] long *pVal); + [propput, id(109), helpstring("property Color")] HRESULT Color(long nX, long nY, [in] long newVal); + [propget, id(110), helpstring("property AutoScroll")] HRESULT AutoScroll([out, retval] VARIANT_BOOL *pVal); + [propput, id(110), helpstring("property AutoScroll")] HRESULT AutoScroll([in] VARIANT_BOOL newVal); + [propget, id(111), helpstring("property ScrollPosition")] HRESULT ScrollPosition([out, retval] long *pVal); + [propput, id(111), helpstring("property ScrollPosition")] HRESULT ScrollPosition([in] long newVal); + [id(112), helpstring("method JumpToPosition")] HRESULT JumpToPosition(long newVal); + [propget, id(113), helpstring("property CountCols")] HRESULT CountCols([out, retval] long *pVal); + }; + + [ + object, + uuid(D648F00A-FE27-4E88-895B-72F58AF50C0C), + helpstring("IList Interface"), + pointer_default(unique) + ] + interface IList : IListDisp + { + [helpstring("method AddColumn")] HRESULT AddColumn(IListColumn *pNewColumn, [out, retval] long *nIndex); + [propget, helpstring("property CellRect")] HRESULT CellRect(LPPOINT pt, [out, retval] LPRECT pVal); + }; + + [ + uuid(88456660-8132-433b-A4CD-E252BDF147C5), + helpstring("IListEvents Interface") + ] + dispinterface IListEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object.")] void Destroy(long nID); + [id(6), helpstring("method ListDataChange")] void Change(long nID, long nX, long nY); + }; + + [ + object, + uuid(E28573F0-36FC-4D64-B8E1-60A2D475A2A8), + helpstring("IListColumn Interface"), + pointer_default(unique) + ] + interface IListColumn : IUnknown + { + [propget, helpstring("property FixedWidth")] HRESULT FixedWidth([out, retval] VARIANT_BOOL *pVal); + [propget, helpstring("property Width")] HRESULT Width([out, retval] long *pVal); + [helpstring("method Render")] HRESULT Render(ICanvas *, LPPOINT ptCell, long nColor); + [propget, helpstring("property DataColumns")] HRESULT DataColumns([out, retval] long *pVal); + [helpstring("property List")] HRESULT Initialize([in] IList * newVal, [in] IPluginSite *pSite); + [helpstring("method SchemaLoad")] HRESULT SchemaLoad(IUnknown *pSchema); + [propget, helpstring("property Height")] HRESULT Height([out, retval] long *pVal); + [helpstring("method Activate")] HRESULT Activate(LPPOINT ptCell); + [propput, helpstring("property Width")] HRESULT Width(long newVal); + }; + + [ + object, + uuid(1A11BEA0-A0ED-41C1-9057-46084DE9AEDC), + helpstring("IListView Interface"), + pointer_default(unique) + ] + interface IListView : IUnknown + { + [propput, helpstring("property Area")] HRESULT Area([in] LPSIZE newVal); + [helpstring("method SetCacheInfo")] HRESULT SetCacheInfo(long nRowHeight, long nRowsToCache); + [helpstring("method InvalidateFrom")] HRESULT InvalidateFrom(long nRow); + [propget, helpstring("property Color")] HRESULT Color(long nCol, long nRow, [out, retval] long *pVal); + [propput, helpstring("property Color")] HRESULT Color(long nCol, long nRow, [in] long newVal); + }; + + [ + object, + uuid(78B62B0F-B3A4-47FF-A9A4-C68CA3FA80B6), + dual, + helpstring("INotebook Interface"), + pointer_default(unique) + ] + interface INotebook : IControl + { + [id(101), helpstring("method AddPage")] HRESULT AddPage(BSTR strText, IControl *pClient); + [id(102), propget, helpstring("property ActiveTab")] HRESULT ActiveTab([out, retval] long *pVal); + [id(102), propput, helpstring("property ActiveTab")] HRESULT ActiveTab([in] long newVal); + [id(103), propget, helpstring("property PageText")] HRESULT PageText(long nIndex, [out, retval] BSTR *pVal); + [id(103), propput, helpstring("property PageText")] HRESULT PageText(long nIndex, [in] BSTR newVal); + }; + + [ + uuid(C964E99A-7C1C-46e9-AEA6-09FF5D1BFDD0), + helpstring("INotebookEvents Interface") + ] + dispinterface INotebookEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object.")] void Destroy(long nID); + [id(6), helpstring("method NotebookPageChange")] HRESULT Change(long nID, long nNewPage); + }; + + [ + object, + uuid(D7EA9129-E36A-4317-BF24-76DA5967DA75), + dual, + helpstring("IEdit Interface"), + pointer_default(unique) + ] + interface IEdit : IControl + { + [id(101), propget, helpstring("property Text")] HRESULT Text([out, retval] BSTR *pVal); + [id(101), propput, helpstring("property Text")] HRESULT Text([in] BSTR newVal); + [id(102), propget, helpstring("property Caret")] HRESULT Caret([out, retval] long *pVal); + [id(102), propput, helpstring("property Caret")] HRESULT Caret([in] long newVal); + [id(103), helpstring("method Select")] HRESULT Select(long nStart, long nEnd); + [id(104), propget, helpstring("property SelectedText")] HRESULT SelectedText([out, retval] BSTR *pVal); + [id(104), propput, helpstring("property SelectedText")] HRESULT SelectedText([in] BSTR newVal); + [id(105), propget, helpstring("property Background")] HRESULT Background([out, retval] IImageCacheDisp * *pVal); + [id(105), propputref, helpstring("property Background")] HRESULT Background([in] IImageCacheDisp * newVal); + [id(106), propget, helpstring("property Font")] HRESULT Font([out, retval] IFontCacheDisp * *pVal); + [id(106), propputref, helpstring("property Font")] HRESULT Font([in] IFontCacheDisp * newVal); + [id(107), propget, helpstring("property TextColor")] HRESULT TextColor([out, retval] long *pVal); + [id(107), propput, helpstring("property TextColor")] HRESULT TextColor([in] long newVal); + [id(108), helpstring("property Margins")] HRESULT SetMargins(long nX, long nY); + [id(109), helpstring("method Capture")] HRESULT Capture(); + }; + + [ + uuid(4A3E384D-39A5-4bc2-A548-66634C8FACCE), + helpstring("IEditEvents Interface") + ] + dispinterface IEditEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object")] void Destroy(long nID); + [id(10), helpstring("method EditBegin")] void Begin(long nID); + [id(6), helpstring("method EditChange")] void Change(long nID, BSTR strText); + [id(11), helpstring("method EditEnd")] void End(long nID, VARIANT_BOOL bSuccess); + }; + + [ + object, + uuid(6450E486-03E6-493c-9D3B-9B36A5F50E65), + dual, + helpstring("Base interface for layout classes"), + pointer_default(unique) + ] + interface ILayout : IControl + { + [id(101), propget, helpstring("property Background")] HRESULT Background([out, retval] IImageCacheDisp * *pVal); + [id(101), propputref, helpstring("property Background")] HRESULT Background([in] IImageCacheDisp * newVal); + }; + + [ + object, + uuid(58CBF550-DFBE-433C-88EC-3FED4A5E09F1), + helpstring("IClient Interface"), + pointer_default(unique) + ] + interface IFixedLayout : ILayout + { + [helpstring("method CreateChild")] HRESULT CreateChild(struct LayerParams *params, ILayer *pSink); + [helpstring("method PositionChild")] HRESULT PositionChild(long nID, LPRECT prcNew); + }; + + [ + object, + uuid(BD2B37B8-80DE-4F50-ACF8-ED2525B27336), + dual, + helpstring("IChoice Interface"), + pointer_default(unique) + ] + interface IChoice : IControl + { + [id(101), helpstring("method AddChoice")] HRESULT AddChoice(BSTR strDisplay, [optional] VARIANT vData); + [id(102), propget, helpstring("property ChoiceCount")] HRESULT ChoiceCount([out, retval] long *pVal); + [id(103), propget, helpstring("property Data")] HRESULT Data(long nIndex, [out, retval] VARIANT *pVal); + [id(103), propput, helpstring("property Data")] HRESULT Data(long nIndex, [in] VARIANT newVal); + [id(104), propget, helpstring("property Text")] HRESULT Text(long nIndex, [out, retval] BSTR *pVal); + [id(104), propput, helpstring("property Text")] HRESULT Text(long nIndex, [in] BSTR newVal); + [id(105), helpstring("method RemoveChoice")] HRESULT RemoveChoice(long nIndex); + [id(106), propget, helpstring("property Dropped")] HRESULT Dropped([out, retval] VARIANT_BOOL *pVal); + [id(106), propput, helpstring("property Dropped")] HRESULT Dropped([in] VARIANT_BOOL newVal); + [id(107), propget, helpstring("property Selected")] HRESULT Selected([out, retval] long *pVal); + [id(107), propput, helpstring("property Selected")] HRESULT Selected([in] long newVal); + [id(108), propget, helpstring("property DropLines")] HRESULT DropLines([out, retval] long *pVal); + [id(108), propput, helpstring("property DropLines")] HRESULT DropLines([in] long newVal); + [id(109), helpstring("method Clear")] HRESULT Clear(); + }; + + [ + uuid(763E36A3-389C-42eb-A5F3-C208D028F9AB), + helpstring("IChoiceEvents Interface") + ] + dispinterface IChoiceEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object")] void Destroy(long nID); + [id(6), helpstring("Sent when the user changes the selection")] void Change(long nID, long nIndex); + [id(12), helpstring("Sent before drop down - you can add items at this point")] void DropDown(long nID); + }; + + [ + object, + uuid(B40F3CEA-5DAD-413A-B779-D6FCB0663B7D), + helpstring("IChoicePopup Interface"), + pointer_default(unique) + ] + interface IChoicePopup : IUnknown + { + }; + + [ + object, + uuid(CF0438EB-8299-48E8-B766-9E9BDDA50203), + helpstring("IBorderLayout Interface"), + pointer_default(unique) + ] + interface IBorderLayout : ILayout + { + [helpstring("method CreateEdge")] HRESULT CreateEdge(enum eBorderEdge eEdge, long nSize, ILayer *pSink); + [helpstring("method CreateCenter")] HRESULT CreateCenter(ILayer *pSink); + }; + + [ + object, + uuid(1E39FB9E-2C07-4287-B2D7-58EE0BFC9BBB), + dual, + helpstring("IPageLayout Interface"), + pointer_default(unique) + ] + interface IPageLayoutDisp : ILayout + { + [id(201), propget, helpstring("property Active")] HRESULT Active([out, retval] long *pVal); + [id(201), propput, helpstring("property Active")] HRESULT Active([in] long newVal); + [id(202), propget, helpstring("property Count")] HRESULT Count([out, retval] long *pVal); + }; + + [ + object, + uuid(2DF39739-2EFC-4F67-B3AC-712D774B57A9), + helpstring("IPageLayout Interface"), + pointer_default(unique) + ] + interface IPageLayout : IPageLayoutDisp + { + [helpstring("method CreatePage")] HRESULT CreatePage(ILayer *pChild); + }; + + [ + object, + uuid(AAAB9EEA-06E8-4F0A-A926-3A9AB45939FF), + dual, + helpstring("IPushButton Interface"), + pointer_default(unique) + ] + interface IPushButton : IControl + { + [id(101), propget, helpstring("property Image")] HRESULT Image([out, retval] IImageCacheDisp * *pVal); + [id(101), propputref, helpstring("property Image")] HRESULT Image([in] IImageCacheDisp * newVal); + [id(102), propget, helpstring("property Font")] HRESULT Font([out, retval] IFontCacheDisp * *pVal); + [id(102), propputref, helpstring("property Font")] HRESULT Font([in] IFontCacheDisp * newVal); + [id(103), propget, helpstring("property Text")] HRESULT Text([out, retval] BSTR *pVal); + [id(103), propput, helpstring("property Text")] HRESULT Text([in] BSTR newVal); + [id(104), propget, helpstring("property FaceColor")] HRESULT FaceColor([out, retval] long *pVal); + [id(104), propput, helpstring("property FaceColor")] HRESULT FaceColor([in] long newVal); + [id(105), propget, helpstring("property TextColor")] HRESULT TextColor([out, retval] long *pVal); + [id(105), propput, helpstring("property TextColor")] HRESULT TextColor([in] long newVal); + }; + + [ + object, + uuid(93C28CFF-DCF4-4B63-AB00-A89453940CFE), + dual, + helpstring("IStatic Interface"), + pointer_default(unique) + ] + interface IStatic : IControl + { + [id(101), propget, helpstring("property Font")] HRESULT Font([out, retval] IFontCacheDisp * *pVal); + [id(101), propputref, helpstring("property Font")] HRESULT Font([in] IFontCacheDisp * newVal); + [id(102), propget, helpstring("property Text")] HRESULT Text([out, retval] BSTR *pVal); + [id(102), propput, helpstring("property Text")] HRESULT Text([in] BSTR newVal); + [id(103), propget, helpstring("property TextColor")] HRESULT TextColor([out, retval] long *pVal); + [id(103), propput, helpstring("property TextColor")] HRESULT TextColor([in] long newVal); + }; + + [ + object, + uuid(63D0BB56-1552-4F8C-99CC-52006DD47E9E), + dual, + helpstring("ICheckbox Interface"), + pointer_default(unique) + ] + interface ICheckbox : IControl + { + [id(101), propget, helpstring("property Font")] HRESULT Font([out, retval] IFontCacheDisp * *pVal); + [id(101), propputref, helpstring("property Font")] HRESULT Font([in] IFontCacheDisp * newVal); + [id(102), propget, helpstring("property Text")] HRESULT Text([out, retval] BSTR *pVal); + [id(102), propput, helpstring("property Text")] HRESULT Text([in] BSTR newVal); + [id(103), propget, helpstring("property TextColor")] HRESULT TextColor([out, retval] long *pVal); + [id(103), propput, helpstring("property TextColor")] HRESULT TextColor([in] long newVal); + [id(104), propget, helpstring("property Checked")] HRESULT Checked([out, retval] VARIANT_BOOL *pVal); + [id(104), propput, helpstring("property Checked")] HRESULT Checked([in] VARIANT_BOOL newVal); + [id(105), propget, helpstring("property RightToLeft")] HRESULT RightToLeft([out, retval] VARIANT_BOOL *pVal); + [id(105), propput, helpstring("property RightToLeft")] HRESULT RightToLeft([in] VARIANT_BOOL newVal); + }; + + [ + uuid(D56CB28A-9BAD-40b1-A011-70F466DC8F05), + helpstring("ICheckboxEvents Interface") + ] + dispinterface ICheckboxEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object")] void Destroy(long nID); + [id(6), helpstring("method CheckboxToggle")] void Change(long nID, VARIANT_BOOL bChecked); + }; + + [ + object, + uuid(10D12549-8F59-4f06-83FB-D08FB76337F3), + dual, + helpstring("ISlider Interface"), + pointer_default(unique) + ] + interface ISlider : IControl + { + [id(101), propget, helpstring("property Font")] HRESULT Font([out, retval] IFontCacheDisp * *pVal); + [id(101), propputref, helpstring("property Font")] HRESULT Font([in] IFontCacheDisp * newVal); + [id(103), propget, helpstring("property TextColor")] HRESULT TextColor([out, retval] long *pVal); + [id(103), propput, helpstring("property TextColor")] HRESULT TextColor([in] long newVal); + [id(104), propget, helpstring("property SliderPosition")] HRESULT SliderPosition([out, retval] long *pVal); + [id(104), propput, helpstring("property SliderPosition")] HRESULT SliderPosition([in] long newVal); + [id(105), propget, helpstring("property Minimum")] HRESULT Minimum([out, retval] long *pVal); + [id(105), propput, helpstring("property Minimum")] HRESULT Minimum([in] long newVal); + [id(106), propget, helpstring("property Maximum")] HRESULT Maximum([out, retval] long *pVal); + [id(106), propput, helpstring("property Maximum")] HRESULT Maximum([in] long newVal); + }; + + [ + uuid(F881B44D-67FA-4770-B10A-05DA14409E8F), + helpstring("ISliderEvents Interface") + ] + dispinterface ISliderEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object")] void Destroy(long nID); + [id(6), helpstring("method Change")] void Change(long nID, long lValue); + }; + + [ + object, + uuid(5BAD2CC0-6F03-4EA9-8D7E-1DFD9D134648), + + helpstring("IChoiceDropDown Interface"), + pointer_default(unique) + ] + interface IChoiceDropDown : IUnknown + { + }; + + [ + object, + uuid(D4FBCA22-45B4-4775-A181-1D4EEC3BFEA1), + helpstring("IDerethMap Interface"), + pointer_default(unique) + ] + interface IDerethMap : IControl + { + }; + + [ + object, + uuid(2EC89916-3E65-422B-977C-9277BA693E82), + dual, + helpstring("IProgress Interface"), + pointer_default(unique) + ] + interface IProgress : IControl + { + [propget, id(101), helpstring("property Value")] HRESULT Value([out, retval] long *pVal); + [propput, id(101), helpstring("property Value")] HRESULT Value([in] long newVal); + [propput, id(102), helpstring("property FaceColor")] HRESULT FaceColor([in] long newVal); + [propput, id(103), helpstring("property FillColor")] HRESULT FillColor([in] long newVal); + [propput, id(104), helpstring("property TextColor")] HRESULT TextColor([in] long newVal); + [propput, id(105), helpstring("property MaxValue")] HRESULT MaxValue([in] long newVal); + [propput, id(106), helpstring("property PostText")] HRESULT PostText([in] BSTR newVal); + [propput, id(107), helpstring("property Alignment")] HRESULT Alignment([in] BSTR newVal); + [propput, id(108), helpstring("property DrawText")] HRESULT DrawText([in] VARIANT_BOOL newVal); + [propput, id(109), helpstring("property PreText")] HRESULT PreText([in] BSTR newVal); + [propput, id(110), helpstring("property BorderWidth")] HRESULT BorderWidth([in] long newVal); + [propput, id(111), helpstring("property BorderColor")] HRESULT BorderColor([in] long newVal); + }; + +[ + uuid(1C4B007A-04DD-4DF8-BA29-2CFBD0220B89), + version(1.0), + helpstring("Decal Controls Type Library") +] +library DecalControls +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + interface ILayout; + interface IListView; + interface IChoicePopup; + + dispinterface IListEvents; + dispinterface IChoiceEvents; + dispinterface IScrollerEvents; + dispinterface INotebookEvents; + dispinterface IEditEvents; + dispinterface IChoiceEvents; + dispinterface ICheckboxEvents; + dispinterface ISliderEvents; + + interface IListDisp; + interface IPageLayoutDisp; + + [ + uuid(8FC80D21-1731-4816-9AD3-B0364D5F2C27), + helpstring("Scroller Class") + ] + coclass Scroller + { + [default] interface IControl; + [default, source] interface IScrollerEvents; + }; + + [ + uuid(3839008F-AF5B-43FC-9F6A-3376B99E3DAF), + helpstring("List Class") + ] + coclass List + { + [default] interface IListDisp; + [default, source] interface IListEvents; + }; + + [ + uuid(864DEABF-D079-4B61-A8CF-081418179239), + helpstring("TextColumn Class") + ] + coclass TextColumn + { + [default] interface IListColumn; + }; + + [ + uuid(F12A2C4C-3B78-46EB-8722-68B27A75AE55), + helpstring("IconColumn Class") + ] + coclass IconColumn + { + [default] interface IListColumn; + }; + + [ + uuid(48E444F1-8E30-4E4C-B203-4C87FC901586), + helpstring("CheckColumn Class") + ] + coclass CheckColumn + { + [default] interface IListColumn; + }; + + [ + uuid(ED14E7C5-11BE-4DFD-9829-873AB6BE3CFC), + helpstring("Notebook Class") + ] + coclass Notebook + { + [default] interface INotebook; + [default, source] interface INotebookEvents; + }; + + [ + uuid(8E8F88D2-AA47-474E-9DB7-912D49C8BE9D), + helpstring("Edit Class") + ] + coclass Edit + { + [default] interface IEdit; + [default, source] interface IEditEvents; + }; + + [ + uuid(E099DC60-0F19-4690-AB7C-8B5834DA286E), + helpstring("Choice Class") + ] + coclass Choice + { + [default] interface IChoice; + [default, source] interface IChoiceEvents; + }; + + [ + uuid(CD6556CD-F8D9-4CB0-AB7C-7C33058294E4), + helpstring("FixedLayout Class") + ] + coclass FixedLayout + { + [default] interface ILayout; + [default, source] interface IControlEvents; + }; + + [ + uuid(CA121762-31BB-4073-8597-33BAB4BDCAA3), + helpstring("BorderLayout Class") + ] + coclass BorderLayout + { + [default] interface ILayout; + [default, source] interface IControlEvents; + }; + + [ + uuid(5AD04D45-D4BF-4729-8A2E-5D37CF726CAA), + helpstring("PageLayout Class") + ] + coclass PageLayout + { + [default] interface IPageLayoutDisp; + [default, source] interface IControlEvents; + }; + + [ + uuid(AE4525BE-81D1-40FB-9170-77172077EB49), + helpstring("PushButton Class") + ] + coclass PushButton + { + [default] interface IPushButton; + [default, source] interface ICommandEvents; + }; + + [ + uuid(4887101C-A9F9-495B-921B-EF22822CFB97), + helpstring("Static Class") + ] + coclass StaticText + { + [default] interface IStatic; + [default, source] interface IControlEvents; + }; + + [ + uuid(5AE37451-F79C-478A-834E-EDCF95F01B0E), + helpstring("Checkbox Class") + ] + coclass Checkbox + { + [default] interface ICheckbox; + [default, source] interface ICheckboxEvents; + }; + + [ + uuid(5D14557A-1268-43c6-A283-3B5B271359AA), + helpstring("Slider Class") + ] + coclass Slider + { + [default] interface ISlider; + [default, source] interface ISliderEvents; + }; + + [ + uuid(3035299A-C5FB-4CC7-A63C-66400B80DCA4), + helpstring("DerethMap Class") + ] + coclass DerethMap + { + [default] interface IDerethMap; + [default, source] interface ICommandEvents; + }; + + [ + uuid(FE361225-6BB7-4AE0-A10C-8A6420621680), + helpstring("Progress Class") + ] + coclass Progress + { + [default] interface IProgress; + [default, source] interface IControlEvents; + }; +}; diff --git a/Native/DecalControls/DecalControls.rc b/Native/DecalControls/DecalControls.rc new file mode 100644 index 0000000..659d6d0 --- /dev/null +++ b/Native/DecalControls/DecalControls.rc @@ -0,0 +1,142 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""DecalControls.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "DecalControls is a group of control objects that give plug-in developers a basic group of UI elements to work with" + VALUE "FileDescription", "DecalControls Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "DecalControls" + VALUE "LegalCopyright", "Copyright 2001" + VALUE "OriginalFilename", "DecalControls.DLL" + VALUE "ProductName", "DecalControls Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_TEXTCOLUMN REGISTRY "TextColumn.rgs" +IDR_ICONCOLUMN REGISTRY "IconColumn.rgs" +IDR_LIST REGISTRY "List.rgs" +IDR_NOTEBOOK REGISTRY "Notebook.rgs" +IDR_SCROLLER REGISTRY "Scroller.rgs" +IDR_CHECKCOLUMN REGISTRY "CheckColumn.rgs" +IDR_EDIT REGISTRY "Edit.rgs" +IDR_CHOICE REGISTRY "Choice.rgs" +IDR_FIXEDLAYOUT REGISTRY "FixedLayout.rgs" +IDR_BORDERLAYOUT REGISTRY "BorderLayout.rgs" +IDR_PAGELAYOUT REGISTRY "PageLayout.rgs" +IDR_PUSHBUTTON REGISTRY "PushButton.rgs" +IDR_STATIC REGISTRY "Static.rgs" +IDR_CHECKBOX REGISTRY "Checkbox.rgs" +IDR_DerethMap REGISTRY "DerethMap.rgs" +IDR_SLIDER REGISTRY "Slider.rgs" +IDR_PROGRESS REGISTRY "Progress.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "DecalControls" +END + +STRINGTABLE +BEGIN + IDS_DERETHMAP_DESC "DerethMap Class" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "DecalControls.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/DecalControls/DecalControls.vcproj b/Native/DecalControls/DecalControls.vcproj new file mode 100644 index 0000000..977e1b5 --- /dev/null +++ b/Native/DecalControls/DecalControls.vcproj @@ -0,0 +1,788 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/DecalControls/DecalControlsCP.h b/Native/DecalControls/DecalControlsCP.h new file mode 100644 index 0000000..6b56b69 --- /dev/null +++ b/Native/DecalControls/DecalControlsCP.h @@ -0,0 +1,821 @@ +#ifndef _DECALCONTROLSCP_H_ +#define _DECALCONTROLSCP_H_ + +template +class CProxyISliderEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Destroy(LONG nID) + { + try + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + + // Return failure + return E_FAIL; + } + } + + HRESULT Fire_Change(LONG nID, LONG nValue) + { + try + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = nID; + pvars[0] = nValue; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + + // Return failure + return E_FAIL; + } + } +}; + + +template +class CProxyICheckboxEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Destroy(LONG nID) + { + try + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + + // Return failure + return E_FAIL; + } + } + + HRESULT Fire_Change(LONG nID, VARIANT_BOOL bChecked) + { + try + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = nID; + pvars[0] = bChecked; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + + // Return failure + return E_FAIL; + } + } +}; + + +template +class CProxyIChoiceEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Change(LONG nID, LONG nIndex) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[1] = nID; + pvars[0] = nIndex; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_DropDown(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0xc, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } +}; + + + +template +class CProxyIListEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Change(LONG nID, LONG nX, LONG nY) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[2] = nID; + pvars[1] = nX; + pvars[0] = nY; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } +}; + +template +class CProxyINotebookEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + HRESULT Fire_Change(LONG nID, LONG nNewPage) + { + try + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = nID; + pvars[0] = nNewPage; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + + // Return failure + return E_FAIL; + } + } +}; + + +template +class CProxyICommandEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Hit(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Unhit(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Accepted(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x4, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Canceled(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x5, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } +}; + +template +class CProxyIScrollerEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + HRESULT Fire_Change(LONG nID, LONG nX, LONG nY) + { + try + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = nID; + pvars[1] = nX; + pvars[0] = nY; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + + // Return failure + return E_FAIL; + } + } +}; + +template +class CProxyIControlEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } +}; + +template +class CProxyIEditEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Begin(LONG nID) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0xa, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_Change(LONG nID, BSTR strText) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[1] = nID; + pvars[0] = strText; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } + + VOID Fire_End(LONG nID, VARIANT_BOOL bSuccess) + { + try + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[1] = nID; + pvars[0] = bSuccess; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0xb, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } + catch (...) + { + // In debug mode warn the user + _ASSERTE( FALSE ); + } + } +}; +#endif \ No newline at end of file diff --git a/Native/DecalControls/DecalControlsps.def b/Native/DecalControls/DecalControlsps.def new file mode 100644 index 0000000..b9a772c --- /dev/null +++ b/Native/DecalControls/DecalControlsps.def @@ -0,0 +1,11 @@ + +LIBRARY "DecalControlsPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/DecalControls/DecalControlsps.mk b/Native/DecalControls/DecalControlsps.mk new file mode 100644 index 0000000..0720e06 --- /dev/null +++ b/Native/DecalControls/DecalControlsps.mk @@ -0,0 +1,16 @@ + +DecalControlsps.dll: dlldata.obj DecalControls_p.obj DecalControls_i.obj + link /dll /out:DecalControlsps.dll /def:DecalControlsps.def /entry:DllMain dlldata.obj DecalControls_p.obj DecalControls_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del DecalControlsps.dll + @del DecalControlsps.lib + @del DecalControlsps.exp + @del dlldata.obj + @del DecalControls_p.obj + @del DecalControls_i.obj diff --git a/Native/DecalControls/DerethMap.cpp b/Native/DecalControls/DerethMap.cpp new file mode 100644 index 0000000..89649af --- /dev/null +++ b/Native/DecalControls/DerethMap.cpp @@ -0,0 +1,120 @@ +// DerethMap.cpp : Implementation of CDecalControlsApp and DLL registration. + +#include "stdafx.h" +#include "DecalControls.h" +#include "DerethMap.h" + +///////////////////////////////////////////////////////////////////////////// +// +cDerethMap::cDerethMap() +{ + m_rcMapSrc.left = m_rcMapSrc.top = 100; + m_rcMapSrc.right = m_rcMapSrc.bottom = 200; +} + +cDerethMap::~cDerethMap() +{ +} + +void cDerethMap::onCreate() +{ + CComPtr< IButton > pRollup; + + HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_IButton, reinterpret_cast< void ** >( &pRollup ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + CComPtr< ILayer > pBtnLayer; + pRollup->QueryInterface( &pBtnLayer ); + + LayerParams lp = { 1, { 180 - 22, 0, 180, 31 }, eRenderTransparent }; + m_pSite->CreateChild( &lp, pBtnLayer ); + + pRollup->put_Matte( RGB( 0, 0, 0 ) ); + pRollup->SetImages( 0, 0x06001127, 0x06001128 ); +} + +void cDerethMap::onDestroy() +{ + +} + +STDMETHODIMP cDerethMap::SchemaLoad( IView *pView, IUnknown *pSchema ) +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + pPlugin->LoadImageSchema( pSchema, &m_pBackground ); + + pPlugin->LoadBitmapFile( _bstr_t( "MapObject.bmp" ), &m_pObjectImage ); + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + + return S_OK; +} + +void cDerethMap::checkFont() +{ + if( m_pFont.p == NULL ) + { + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + } +} + +STDMETHODIMP cDerethMap::MouseEnter(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP cDerethMap::MouseExit(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP cDerethMap::MouseDown(struct MouseState *pms) +{ + m_rcMapSrc.left += 5; + m_rcMapSrc.right = 600; + m_pSite->Invalidate( ); + return S_OK; +} + +STDMETHODIMP cDerethMap::MouseUp(struct MouseState *) +{ + m_rcMapSrc.left += 5; + m_rcMapSrc.right = 600; + m_pSite->Invalidate( ); + return S_OK; +} + +STDMETHODIMP cDerethMap::Reformat() +{ + return S_OK; +} + +STDMETHODIMP cDerethMap::Render( ICanvas *pCanvas ) +{ + _ASSERTE( pCanvas != NULL ); + _ASSERTE( m_pSite.p != NULL ); + + static POINT ptOff = { 0, 0 }; + + RECT rcPos; + m_pSite->get_Position( &rcPos ); + + RECT rcClient = { 0, 12, rcPos.right - rcPos.left, rcPos.bottom - rcPos.top + 12 }; + + RECT rcDest = { 0, 12, rcPos.right - rcPos.left, rcPos.bottom - rcPos.top + 12 }; + + if( m_pBackground.p != NULL ) + m_pBackground->StretchBltArea( &m_rcMapSrc, pCanvas, &rcDest ); + + checkFont( ); + + return S_OK; +} diff --git a/Native/DecalControls/DerethMap.h b/Native/DecalControls/DerethMap.h new file mode 100644 index 0000000..d688cb0 --- /dev/null +++ b/Native/DecalControls/DerethMap.h @@ -0,0 +1,92 @@ +// DerethMap.h: Definition of the cDerethMap class +// +////////////////////////////////////////////////////////////////////// +#ifndef __DERETHMAP_H_ +#define __DERETHMAP_H_ + +#if !defined(AFX_DERETHMAP_H__D110354A_8D4A_485A_9379_961C3A6E445D__INCLUDED_) +#define AFX_DERETHMAP_H__D110354A_8D4A_485A_9379_961C3A6E445D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +#define MAPSIZE_X 245 +#define MAPSIZE_Y 245 +#define MAPBORDER_X 6 +#define MAPBORDER_Y 11 + +///////////////////////////////////////////////////////////////////////////// +// cDerethMap + +class ATL_NO_VTABLE cDerethMap : + public CComObjectRootEx, + public CComCoClass, + public IControlImpl< cDerethMap, IDerethMap, &IID_IDerethMap, &LIBID_DecalControls >, + public ILayerImpl< cDerethMap >, + public ILayerRenderImpl, + public ILayerSchema, + public ILayerMouseImpl, + public IProvideClassInfo2Impl< &CLSID_DerethMap, &DIID_ICommandEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyICommandEvents< cDerethMap > +{ +public: + cDerethMap(); + ~cDerethMap(); + + CComPtr< IImageCache > m_pBackground; + CComPtr< IImageCache > m_pObjectImage; + CComPtr< IFontCache > m_pFont; + + RECT m_rcMapSrc; + +DECLARE_REGISTRY_RESOURCEID(IDR_DerethMap) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDerethMap) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IDerethMap) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cDerethMap) + CONNECTION_POINT_ENTRY(DIID_ICommandEvents) +END_CONNECTION_POINT_MAP() + + + void onCreate(); + void onDestroy(); + void checkFont(); + +public: + + // ILayerMouse Methods + STDMETHOD(MouseEnter)(struct MouseState *); + STDMETHOD(MouseExit)(struct MouseState *); + STDMETHOD(MouseDown)(struct MouseState *); + STDMETHOD(MouseUp)(struct MouseState *); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)( IView *pView, IUnknown *pSchema ); +}; + +#endif // !defined(AFX_DERETHMAP_H__D110354A_8D4A_485A_9379_961C3A6E445D__INCLUDED_) +#endif diff --git a/Native/DecalControls/DerethMap.rgs b/Native/DecalControls/DerethMap.rgs new file mode 100644 index 0000000..6095f12 --- /dev/null +++ b/Native/DecalControls/DerethMap.rgs @@ -0,0 +1,23 @@ +HKCR +{ + DecalControls.DerethMap.1 = s 'DerethMap Class' + { + CLSID = s '{3035299A-C5FB-4CC7-A63C-66400B80DCA4}' + } + DecalControls.DerethMap = s 'DerethMap Class' + { + CLSID = s '{3035299A-C5FB-4CC7-A63C-66400B80DCA4}' + } + NoRemove CLSID + { + ForceRemove {3035299A-C5FB-4CC7-A63C-66400B80DCA4} = s 'DerethMap Class' + { + ProgID = s 'DecalControls.DerethMap.1' + VersionIndependentProgID = s 'DecalControls.DerethMap' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Native/DecalControls/Edit.cpp b/Native/DecalControls/Edit.cpp new file mode 100644 index 0000000..d5802ea --- /dev/null +++ b/Native/DecalControls/Edit.cpp @@ -0,0 +1,990 @@ +// Edit.cpp : Implementation of cEdit +#include "stdafx.h" +#include "DecalControls.h" +#include "Edit.h" + +///////////////////////////////////////////////////////////////////////////// +// cEdit + +#define TIMER_CARET 1 +#define TIMER_REPEAT 2 + +#define END -1 + +#ifndef MIN +#define MIN(x,y) (((x) < (y)) ? (x) : (y)) +#endif +#ifndef MAX +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) +#endif + + +cEdit::cEdit() +: m_bAllowCapture( true ), // cyn -- 15/10/2002 +m_bCapture( false ), +m_bDrawCaret( false ), +m_bSelecting( false ), +m_nSelStartChar( 0 ), +m_nSelStart( 0 ), +m_nCaretChar( 0 ), +m_nCaret( 0 ), +m_nOffset( 0 ), +m_nTextColor( 0 ), +m_nCaretHeight( 0 ) +{ + m_szMargin.cx = 3; + m_szMargin.cy = 1; +} + +void cEdit::checkFont() +{ + if( m_pFont.p == NULL ) + { + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + } +} + +void cEdit::sendTextChange() +{ + long nID; + m_pSite->get_ID( &nID ); + + Fire_Change( nID, _bstr_t( m_strText.c_str() ) ); +} + +void cEdit::Delete() { + if (m_nCaretChar == m_nSelStartChar) { + return; + } + m_strText.assign( m_strText.substr(0, MIN(m_nCaretChar, m_nSelStartChar)) + m_strText.substr(MAX(m_nCaretChar, m_nSelStartChar), m_strText.length()) ); + if (m_bPassword) { /* This is bad, someone fix it */ + m_strPass.assign( m_strPass.substr(0, MIN(m_nCaretChar, m_nSelStartChar)) + m_strPass.substr(MAX(m_nCaretChar, m_nSelStartChar), m_strPass.length()) ); + } + m_nSelStartChar = MIN(m_nCaretChar, m_nSelStartChar); + put_Caret( m_nSelStartChar ); +} + +void cEdit::Copy() { + HGLOBAL hMem; + HRESULT hr; + long hWnd; + IPluginSite *Plug; + char *lpMem; + int Start, Length; + + if (m_bPassword) { + return; + } + + hr = m_pSite->get_PluginSite(&Plug); + if (FAILED(hr)) { + return; + } + hr = Plug->get_HWND(&hWnd); + Plug->Release(); + Plug = NULL; + if (FAILED(hr)) { + return; + } + + if (m_nCaretChar < m_nSelStartChar) { + Start = m_nCaretChar; + Length = m_nSelStartChar - Start; + } else { + Start = m_nSelStartChar; + Length = m_nCaretChar - Start; + } + + hMem = GlobalAlloc(GMEM_MOVEABLE, Length+1); + if (!hMem) { + return; + } + + + lpMem = (char *)GlobalLock(hMem); + if (!lpMem) { + GlobalFree(hMem); + return; + } + + /* This is gauranteed to nul-terminate */ + lstrcpyn( lpMem, m_strText.c_str() + Start, Length + 1); + + GlobalUnlock(hMem); + + if (!OpenClipboard((HWND)hWnd)) { + GlobalFree(hMem); + return; + } + + EmptyClipboard(); + GetLastError(); + SetClipboardData(CF_TEXT, hMem); + GetLastError(); + CloseClipboard(); +} + + +void cEdit::Cut() { + if (!m_bPassword) { + Copy(); + Delete(); + } +} + +// OK, this paste code isn't pretty, but it's functional for now. Look for a full rewrite later! +// cyn, 22/10/2002 +void cEdit::Paste() { + HANDLE hClipboardData; + char *sData; + int Count, Length; + + Delete(); + + if (!OpenClipboard(NULL)) { + return; + } + + hClipboardData = GetClipboardData(CF_TEXT); + + if (hClipboardData) { + sData = (char *)GlobalLock(hClipboardData); + + if (sData) { + Length = lstrlen(sData); + for (Count=0;Count Length) { + return Length; + } + return Offset; +} + +STDMETHODIMP cEdit::Reformat() +{ + // Just a typical post-resize type of behavior, make sure everythign is still visible as + // the user likes. + if( m_nCaretChar > m_strText.length() ) + put_Caret( m_strText.length() ); + else + // Force a recalculation for scrolling + put_Caret( m_nCaretChar ); + + //put_Caret( m_nCaretChar ); + + return S_OK; +} + +STDMETHODIMP cEdit::Render( ICanvas *pCanvas ) +{ + HDC RenderDC; + HRESULT hr; + + checkFont(); + + // Draw the background + RECT rcPos; + m_pSite->get_Position( &rcPos ); + + RECT rcClient = { 0, 0, rcPos.right - rcPos.left, rcPos.bottom - rcPos.top }; + + if( m_pBackground.p != NULL ) + { + static POINT ptOff = { 0, 0 }; + m_pBackground->PatBlt( pCanvas, &rcClient, &ptOff ); + } + + RECT rcText = { m_szMargin.cx, m_szMargin.cy, rcClient.right - m_szMargin.cx, rcClient.bottom - m_szMargin.cy }; + VARIANT_BOOL bVisible; + pCanvas->SetClipRect( &rcText, &bVisible ); + + if( !bVisible ) + // Nothing to draw huzzah! + return S_OK; + + long lFlags = 0; + + if( m_bAA ) + lFlags |= eAA; + + if( m_bOutline ) + lFlags |= eOutlined; + + // Draw the text + POINT ptText = { -m_nOffset, 0 }; + if( m_strText.length() > 0 ) + if (m_bPassword) { + m_pFont->DrawTextEx( &ptText, _bstr_t( m_strPass.c_str() ), m_nTextColor, m_nOutlineColor, lFlags, pCanvas ); + } else { + m_pFont->DrawTextEx( &ptText, _bstr_t( m_strText.c_str() ), m_nTextColor, m_nOutlineColor, lFlags, pCanvas ); + } + + if( m_bCapture && m_bDrawCaret ) + { + // Draw the caret + RECT rcCaret = { m_nCaret - m_nOffset, m_szMargin.cy, m_nCaret - m_nOffset + 1, m_szMargin.cy + m_nCaretHeight }; + pCanvas->Fill( &rcCaret, m_nTextColor ); + } + + if( m_bCapture ) // - Haz, fix for the annoying multiple edit selection ghosts + { + if (m_nCaretChar != m_nSelStartChar) { + hr = pCanvas->GetDC(&RenderDC); + if (SUCCEEDED(hr)) { + RECT rcSelect; + rcSelect.top = m_szMargin.cy; + rcSelect.bottom = m_szMargin.cy + m_nCaretHeight; + rcSelect.left = m_nSelStart - m_nOffset; + rcSelect.right = m_nCaret - m_nOffset; + if (rcSelect.right < rcSelect.left) { + int t; + t = rcSelect.left; + rcSelect.left = rcSelect.right; + rcSelect.right = t; + } + + + InvertRect(RenderDC, &rcSelect); + pCanvas->ReleaseDC(); + + + + } + } + } + + return S_OK; +} + +STDMETHODIMP cEdit::MouseDown( MouseState *pMS ) +{ + if( !m_bCapture ) + Capture(); + else + { + _ASSERTE(!m_bSelecting); + checkFont(); + + // Hit test the character and move to that position + long nHitChar; + if(m_bPassword) + m_pFont->HitTest( _bstr_t( m_strPass.c_str() ), pMS->client.x + m_nOffset - m_szMargin.cx, &nHitChar ); + else + m_pFont->HitTest( _bstr_t( m_strText.c_str() ), pMS->client.x + m_nOffset - m_szMargin.cx, &nHitChar ); + + // Reset the timer + put_Caret( nHitChar ); + + m_bSelecting = true; + } + + return S_OK; +} + +STDMETHODIMP cEdit::MouseUp(MouseState *pMS) { + /* I assume it's possible to trigger a mouse up without a mousedown */ + m_bSelecting = false; + return S_OK; +} + +STDMETHODIMP cEdit::MouseMove(MouseState *pMS) { + long nHitChar; + + if (!m_bCapture) { + _ASSERTE(!m_bSelecting); + return S_OK; + } + + if (!m_bSelecting) { + return S_OK; + } + + checkFont(); + if (m_bPassword) { + m_pFont->HitTest( _bstr_t( m_strPass.c_str() ), pMS->client.x + m_nOffset - m_szMargin.cx, &nHitChar ); + } else { + m_pFont->HitTest( _bstr_t( m_strText.c_str() ), pMS->client.x + m_nOffset - m_szMargin.cx, &nHitChar ); + } + + put_Caret(nHitChar); + + return S_OK; +} + + +STDMETHODIMP cEdit::KeyboardChar( KeyState *pKS ) +{ + if (pKS->ctrl && pKS->vkey == 22) { + Paste(); + } else if (pKS->ctrl && pKS->vkey == 3) { + Copy(); + } else if (pKS->ctrl && pKS->vkey == 24) { + Cut(); + } else { + // Look for special characters + switch( pKS->vkey ) + { + case VK_BACK: + if (m_nCaretChar != m_nSelStartChar) { + Delete(); + } else { + if( m_nCaretChar > 0 ) + { + // Decrease the caret position + put_Caret( m_nCaretChar - 1 ); + + // Remove the character + m_strText.erase( m_strText.begin() + m_nCaretChar, m_strText.begin() + m_nCaretChar + 1 ); + + if(m_bPassword) + m_strPass.erase( m_strPass.begin() + m_nCaretChar, m_strPass.begin() + m_nCaretChar + 1 ); + } + } + break; + default: + // Assume every other character is being added + if (m_nCaretChar != m_nSelStartChar) { + Delete(); + } + char wc[ 2 ] = { pKS->vkey, L'\0' }; + m_strText.insert( m_strText.begin() + m_nCaretChar, wc, wc + 1 ); + if(m_bPassword) + { + wc[0] = L'*'; + m_strPass.insert( m_strPass.begin() + m_nCaretChar, wc, wc + 1 ); + } + put_Caret( m_nCaretChar + 1 ); + } + } + + m_pSite->Invalidate(); + sendTextChange(); + + return S_OK; +} + +STDMETHODIMP cEdit::KeyboardEndCapture( VARIANT_BOOL bCancel ) +{ + if (bCancel) { // cyn, 15/10/2002 + m_bAllowCapture = false; + } + m_bCapture = false; + m_pSite->EndTimer( TIMER_CARET ); + m_pSite->Invalidate(); + + long nID; + m_pSite->get_ID( &nID ); + Fire_End( nID, ( bCancel ) ? VARIANT_FALSE : VARIANT_TRUE ); + m_bAllowCapture = true; // cyn, 15/10/2002 + + return S_OK; +} + +STDMETHODIMP cEdit::KeyboardEvent( long nMsg, long wParam, long lParam ) +{ + const char *Start; + int Search; + bool Shift, OldSelecting; + int Length; + + if( nMsg != WM_KEYDOWN ) + // Only looking for keydown messages + return S_OK; + + Shift = (GetAsyncKeyState(VK_SHIFT) < 0); + OldSelecting = m_bSelecting; + m_bSelecting |= Shift; /* Hrrmm.. */ + + // Look for special characters + switch( wParam ) + { + case VK_DELETE: + if (GetAsyncKeyState( VK_SHIFT ) < 0) { + Cut(); + } else { + if (m_nCaretChar != m_nSelStartChar) { + Delete(); + } else { + if( m_nCaretChar < m_strText.length() ) { + // Remove the character + m_strText.erase( m_strText.begin() + m_nCaretChar, m_strText.begin() + m_nCaretChar + 1 ); + if(m_bPassword) + m_strPass.erase( m_strPass.begin() + m_nCaretChar, m_strPass.begin() + m_nCaretChar + 1 ); + } + } + } + break; + + case VK_HOME: + put_Caret( 0 ); + break; + + case VK_END: + put_Caret( END ); + break; + + case VK_INSERT: // cyn, 22/10/2002 + if (Shift) { + m_bSelecting = false; + Paste(); + } else if (GetAsyncKeyState( VK_CONTROL) < 0 ) { + Copy(); + } + break; + + case VK_LEFT: + if( m_nCaretChar > 0 ) { + if (GetAsyncKeyState( VK_CONTROL ) < 0) { + if (m_bPassword) { + Start = m_strPass.c_str(); + } else { + Start = m_strText.c_str(); + } + + /* Loop until we find a non-space */ + for (Search=m_nCaretChar-1;Search>0;Search--) { + if (Start[Search] != ' ') { + break; + } + } + + /* Loop until we find a space */ + for (;Search>0;Search--) { + if (Start[Search] == ' ') { + Search++; + break; + } + } + + if (Search < 0) { + _ASSERTE( false ); + Search = 0; + } + + put_Caret( Search ); + } else { + put_Caret( m_nCaretChar - 1 ); + } + } + break; + + + case VK_RIGHT: + Length = m_strText.length(); + if( m_nCaretChar < Length ) { + if (GetAsyncKeyState( VK_CONTROL ) < 0) { + /* Possible change this, AC edit box is slightly different */ + if (m_bPassword) { + Start = m_strPass.c_str(); + } else { + Start = m_strText.c_str(); + } + + /* Loop until we find a non-space */ + for (Search=m_nCaretChar+1;Search Length) { + _ASSERTE( false ); + Search = END; + } + + put_Caret( Search ); + } else { + put_Caret( m_nCaretChar + 1 ); + } + } + break; + + default: + // No processing + m_bSelecting = OldSelecting; + return S_OK; + } + + m_bSelecting = OldSelecting; + m_pSite->Invalidate(); + sendTextChange(); + + return S_OK; +} + +STDMETHODIMP cEdit::get_Text(BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = T2BSTR( m_strText.c_str() ); + + return S_OK; +} + +STDMETHODIMP cEdit::put_Text(BSTR newVal) +{ + USES_CONVERSION; + + m_strText = OLE2T( newVal ); + + m_strPass.assign(""); + + if(m_bPassword) { + m_strPass.append(m_strText.length(), '*'); + } + + m_nSelStartChar = m_nCaretChar = 0; + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cEdit::get_Caret(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nCaretChar; + + return S_OK; +} + +// Only scroll within 10 pixels of the edge +#define EDIT_HYSTERESIS 18 + +STDMETHODIMP cEdit::put_Caret(long newVal) +{ + std::string strSample; + + checkFont(); + + m_nCaretChar = Normalize(newVal); + + if(m_bPassword) { + _ASSERTE( m_strPass.length() == m_strText.length() ); + strSample.assign(m_strPass.begin(), m_strPass.begin() + m_nCaretChar); + } else { + strSample.assign(m_strText.begin(), m_strText.begin() + m_nCaretChar); + } + + + // Calculate the actual character position + SIZE szText; + + if (!SUCCEEDED (m_pFont->MeasureText( _bstr_t( strSample.c_str() ), &szText ))) + { + return E_FAIL; + } + + m_nCaretHeight = szText.cy; + m_nCaret = szText.cx; + + + RECT rcPosition; + m_pSite->get_Position( &rcPosition ); + long nWidth = ( rcPosition.right - rcPosition.left ) - m_szMargin.cx * 2 - 2; + + // Check for offset updates + if( m_nCaret < ( m_nOffset + EDIT_HYSTERESIS ) ) + { + // The caret has moved in front of the scroll region + m_nOffset = m_nCaret - EDIT_HYSTERESIS; + if( m_nOffset < 0 ) + // The offset is less thant the beginning, correct it + m_nOffset = 0; + } + else if( m_nCaret > nWidth + m_nOffset ) + // The caret has moved off the end of the visible region + // NOTE: the +1 is to account for the 1 pixel width of the caret + m_nOffset = m_nCaret - nWidth; + + if( m_bCapture ) + { + // Force the caret on for a half second to make sure the user sees the new position + m_pSite->EndTimer( TIMER_CARET ); + m_pSite->StartTimer( TIMER_CARET, 500 ); + m_bDrawCaret = true; + } + + if (m_bSelecting) { + if(m_bPassword) { + strSample.assign(m_strPass.begin(), m_strPass.begin() + m_nSelStartChar); + } else { + strSample.assign(m_strText.begin(), m_strText.begin() + m_nSelStartChar); + } + + + if (!SUCCEEDED (m_pFont->MeasureText( _bstr_t( strSample.c_str() ), &szText))) { + return E_FAIL; + } + + m_nSelStart = szText.cx; + + + } else { + m_nSelStartChar = m_nCaretChar; + m_nSelStart = m_nCaret; + } + + m_pSite->Invalidate(); + + return S_OK; +} + +/* +nEnd < nStart is a valid condition + */ +STDMETHODIMP cEdit::Select(long nStart, long nEnd) +{ + bool OldSelection; + OldSelection = m_bSelecting; + m_bSelecting = false; + put_Caret(Normalize(nStart)); + m_bSelecting = true; + put_Caret(Normalize(nEnd)); + m_bSelecting = OldSelection; + + return S_OK; +} + +/* I think this is done */ +STDMETHODIMP cEdit::get_SelectedText(BSTR *pVal) { + int Start, Len; + + _ASSERTE(pVal); + + if (m_bPassword) { + return S_FALSE; + } + + if (m_nCaretChar < m_nSelStartChar) { + Start = m_nCaretChar; + Len = m_nSelStartChar - Start; + } else { + Start = m_nSelStartChar; + Len = m_nCaretChar - Start; + } + *pVal = T2BSTR( m_strText.substr(Start, Len).c_str() ); + + return S_OK; +} + +STDMETHODIMP cEdit::put_SelectedText(BSTR newVal) { + USES_CONVERSION; + std::string strInsert; + int Length; + + if (m_nCaretChar != m_nSelStartChar) { + Delete(); + } + + strInsert = OLE2T(newVal); + Length = strInsert.length(); + + m_strText.insert(m_strText.begin() + m_nCaretChar, strInsert.begin(), strInsert.begin() + Length); + if (m_bPassword) { + m_strPass.insert(m_strPass.begin(), Length, '*'); + } + + put_Caret( m_nCaretChar + Length ); + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cEdit::TimerTimeout(long nID, long, long, VARIANT_BOOL *pbContinue) +{ + if( nID == TIMER_CARET ) + { + m_bDrawCaret = !m_bDrawCaret; + m_pSite->Invalidate(); + + *pbContinue = VARIANT_TRUE; + } + + return S_OK; +} + +STDMETHODIMP cEdit::SchemaLoad(IView *pView, IUnknown *pSchema) +{ + USES_CONVERSION; + + // Load the font and background image + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->CreateFontSchema( 14, 0, pSchema, &m_pFont ); + pPlugin->LoadImageSchema( pSchema, &m_pBackground ); + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vText = pElement->getAttribute( _T( "text" ) ), + vTextColor = pElement->getAttribute( _T( "textcolor" ) ), + vMarginX = pElement->getAttribute( _T( "marginx" ) ), + vMarginY = pElement->getAttribute( _T( "marginy" ) ), + vPassword = pElement->getAttribute( _T( "password" ) ), + vOutline = pElement->getAttribute( _T( "outlinecolor" ) ), + vAntialias = pElement->getAttribute( _T( "aa" ) ); + + if( vText.vt != VT_NULL ) + { + _ASSERTE( vText.vt == VT_BSTR ); + m_strText = OLE2T( vText.bstrVal ); + } + + if( vTextColor.vt != VT_NULL ) + { + try + { + m_nTextColor = static_cast< long >( vTextColor ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vMarginX.vt != VT_NULL ) + { + try + { + m_szMargin.cx = static_cast< long >( vMarginX ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vMarginY.vt != VT_NULL ) + { + try + { + m_szMargin.cy = static_cast< long >( vMarginY ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vPassword.vt != VT_NULL) + { + try + { + m_bPassword = static_cast< bool >( vPassword ); + } + catch( ... ) + { + _ASSERTE( FALSE ); + } + } + else + m_bPassword = false; + + if( vText.vt != VT_NULL ) + { + _ASSERTE( vText.vt == VT_BSTR ); + m_strText = OLE2T( vText.bstrVal ); + + if(m_bPassword) + for(int i=0; i( vOutline ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + m_bAA = true; + if( vAntialias.vt != VT_NULL ) + { + try + { + m_bAA = static_cast< bool >( vAntialias ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + return S_OK; +} + +STDMETHODIMP cEdit::get_Background(IImageCacheDisp **pVal) +{ + _ASSERTE( pVal != NULL ); + + if( m_pBackground.p == NULL ) + *pVal = NULL; + else + m_pBackground->QueryInterface( pVal ); + + return S_OK; +} + +STDMETHODIMP cEdit::putref_Background(IImageCacheDisp *newVal) +{ + if( m_pBackground.p ) + m_pBackground.Release(); + + if( newVal != NULL ) + { + HRESULT hRes = newVal->QueryInterface( &m_pBackground ); + _ASSERTE( SUCCEEDED( hRes ) ); + } + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cEdit::get_Font(IFontCacheDisp **pVal) +{ + _ASSERTE( pVal != NULL ); + + if( m_pFont.p == NULL ) + *pVal = NULL; + else + m_pFont->QueryInterface( pVal ); + + return S_OK; +} + +STDMETHODIMP cEdit::putref_Font(IFontCacheDisp *newVal) +{ + _ASSERTE( newVal != NULL ); + + if( m_pFont.p ) + m_pFont.Release(); + + HRESULT hRes = newVal->QueryInterface( &m_pFont ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + // Reformat + put_Caret( m_nCaretChar ); + + return S_OK; +} + +STDMETHODIMP cEdit::get_TextColor(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nTextColor; + + return S_OK; +} + +STDMETHODIMP cEdit::put_TextColor(long newVal) +{ + _ASSERTE( ( newVal & 0xFF000000 ) == 0 ); + + m_nTextColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cEdit::SetMargins(long nX, long nY) +{ + _ASSERTE( nX >= 0 && nY >= 0 ); + + m_szMargin.cx = nX; + m_szMargin.cy = nY; + put_Caret( m_nCaretChar ); + + return S_OK; +} + +STDMETHODIMP cEdit::Capture() +{ + _ASSERTE( !m_bCapture ); + + if ( m_bAllowCapture ) { + m_pSite->CaptureKeyboard(); + + /* Until we actually capture the keyboard, other code can still execute */ + /* If that other code calls put_Caret (eg, put_SelectedText), the timer is set */ + /* If that timer is set, and we then try to set it again, it has an error */ + m_bCapture = true; + m_bDrawCaret = true; + + m_pSite->Invalidate(); + m_pSite->StartTimer( TIMER_CARET, 500 ); + + if (m_nCaretChar == m_nSelStartChar) { + Select(0, END); + } + + long nID; + m_pSite->get_ID( &nID ); + Fire_Begin( nID ); + + return S_OK; + } else { + return S_FALSE; + } +} + diff --git a/Native/DecalControls/Edit.h b/Native/DecalControls/Edit.h new file mode 100644 index 0000000..49bdf33 --- /dev/null +++ b/Native/DecalControls/Edit.h @@ -0,0 +1,122 @@ +// Edit.h : Declaration of the cEdit + +#ifndef __EDIT_H_ +#define __EDIT_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cEdit +class ATL_NO_VTABLE cEdit : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public ILayerImpl< cEdit >, + public ILayerRenderImpl, + public ILayerMouseImpl, + public ILayerKeyboard, + public ILayerTimer, + public ILayerSchema, + public IControlImpl< cEdit, IEdit, &IID_IEdit, &LIBID_DecalControls >, + public IProvideClassInfo2Impl< &CLSID_Edit, &DIID_IEditEvents, &LIBID_DecalControls >, + public CProxyIEditEvents< cEdit > +{ +public: + cEdit(); + + CComPtr< IImageCache > m_pBackground; + CComPtr< IFontCache > m_pFont; + SIZE m_szMargin; + + bool m_bAllowCapture; // cyn, 15/10/2002 + bool m_bCapture; + bool m_bDrawCaret; + bool m_bPassword; + bool m_bSelecting; + bool m_bOutline; + bool m_bAA; + + long m_nCaretChar, m_nCaret, m_nOffset, + m_nCaretHeight, + m_nSelStart, m_nSelStartChar, + m_nTextColor, m_nOutlineColor; + + + + std::string m_strText; + std::string m_strPass; + + void checkFont(); + void sendTextChange(); + void Delete(); + void Copy(); + void Cut(); + void Paste(); + int Normalize(int Offset); + +DECLARE_REGISTRY_RESOURCEID(IDR_EDIT) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cEdit) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayerKeyboard) + COM_INTERFACE_ENTRY(ILayerTimer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IEdit) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cEdit) +CONNECTION_POINT_ENTRY(DIID_IEditEvents) +END_CONNECTION_POINT_MAP() + +public: + // IEdit Methods + STDMETHOD(get_SelectedText)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_SelectedText)(/*[in]*/ BSTR newVal); + STDMETHOD(Select)(long nStart, long nEnd); + STDMETHOD(get_Caret)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Caret)(/*[in]*/ long newVal); + STDMETHOD(get_Text)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Text)(/*[in]*/ BSTR newVal); + STDMETHOD(SetMargins)(long nX, long nY); + STDMETHOD(get_TextColor)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_TextColor)(/*[in]*/ long newVal); + STDMETHOD(get_Font)(/*[out, retval]*/ IFontCacheDisp * *pVal); + STDMETHOD(putref_Font)(/*[in]*/ IFontCacheDisp * newVal); + STDMETHOD(get_Background)(/*[out, retval]*/ IImageCacheDisp * *pVal); + STDMETHOD(putref_Background)(/*[in]*/ IImageCacheDisp * newVal); + STDMETHOD(Capture)(); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerMouse Methods + STDMETHOD(MouseDown)(MouseState *pMS); + STDMETHOD(MouseUp)(MouseState *pMS); + STDMETHOD(MouseMove)(MouseState *pMS); + + // ILayerKeyboard Methods + STDMETHOD(KeyboardChar)(KeyState *pKS); + STDMETHOD(KeyboardEndCapture)(VARIANT_BOOL bCancel); + STDMETHOD(KeyboardEvent)( long uMsg, long wParam, long lParam ); + + // ILayerTimer Methods + STDMETHOD(TimerTimeout)(long nID, long nInterval, long nReps, VARIANT_BOOL *pbContinue); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pSchema); +}; + +#endif //__EDIT_H_ diff --git a/Native/DecalControls/Edit.rgs b/Native/DecalControls/Edit.rgs new file mode 100644 index 0000000..076481a --- /dev/null +++ b/Native/DecalControls/Edit.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Edit.1 = s 'DecalControls Edit' + { + CLSID = s '{8E8F88D2-AA47-474E-9DB7-912D49C8BE9D}' + } + DecalControls.Edit = s 'DecalControls Edit' + { + CLSID = s '{8E8F88D2-AA47-474E-9DB7-912D49C8BE9D}' + CurVer = s 'DecalControls.Edit.1' + } + NoRemove CLSID + { + ForceRemove {8E8F88D2-AA47-474E-9DB7-912D49C8BE9D} = s 'DecalControls Edit' + { + ProgID = s 'DecalControls.Edit.1' + VersionIndependentProgID = s 'DecalControls.Edit' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/FixedLayout.cpp b/Native/DecalControls/FixedLayout.cpp new file mode 100644 index 0000000..6c90593 --- /dev/null +++ b/Native/DecalControls/FixedLayout.cpp @@ -0,0 +1,36 @@ +// Client.cpp : Implementation of cClient +#include "stdafx.h" +#include "DecalControls.h" +#include "FixedLayout.h" + +///////////////////////////////////////////////////////////////////////////// +// cClient + +void cFixedLayout::onSchemaLoad( IView *pView, MSXML::IXMLDOMElementPtr &pElement ) +{ + // Create all child controls from schema and let them be + // placed wherever they like + MSXML::IXMLDOMElementPtr pChild; + for( MSXML::IXMLDOMNodeListPtr pChildren = pElement->selectNodes( _T( "control" ) ); + ( pChild = pChildren->nextNode() ).GetInterfacePtr() != NULL; ) + loadChildControl( pView, pChild ); +} + +STDMETHODIMP cFixedLayout::CreateChild(LayerParams *params, ILayer *pSink) +{ + m_pSite->CreateChild( params, pSink ); + + return S_OK; +} + +STDMETHODIMP cFixedLayout::PositionChild(long nID, LPRECT prcNew) +{ + CComPtr< ILayerSite > pChildSite; + HRESULT hRes = m_pSite->get_Child( nID, ePositionByID, &pChildSite ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + pChildSite->put_Position( prcNew ); + + return S_OK; +} diff --git a/Native/DecalControls/FixedLayout.h b/Native/DecalControls/FixedLayout.h new file mode 100644 index 0000000..2328e15 --- /dev/null +++ b/Native/DecalControls/FixedLayout.h @@ -0,0 +1,57 @@ +// Client.h : Declaration of the cClient + +#ifndef __FIXEDLAYOUT_H_ +#define __FIXEDLAYOUT_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "ControlImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cClient +class ATL_NO_VTABLE cFixedLayout : + public CComObjectRootEx, + public CComCoClass, + public ILayerImpl< cFixedLayout >, + public ILayoutImpl< cFixedLayout, IFixedLayout, &IID_ILayout, &LIBID_DecalControls >, + public IProvideClassInfo2Impl< &CLSID_FixedLayout, &DIID_IControlEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyIControlEvents< cFixedLayout > +{ +public: + cFixedLayout() + { + } + + void onSchemaLoad( IView *pView, MSXML::IXMLDOMElementPtr &pElement ); + +DECLARE_REGISTRY_RESOURCEID(IDR_FIXEDLAYOUT) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cFixedLayout) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(ILayout) + COM_INTERFACE_ENTRY(IFixedLayout) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cFixedLayout) +CONNECTION_POINT_ENTRY(DIID_IControlEvents) +END_CONNECTION_POINT_MAP() + +public: + // IFixedLayout Methods + STDMETHOD(CreateChild)(struct LayerParams *params, ILayer *pSink); + STDMETHOD(PositionChild)(long nID, LPRECT prcNew); +}; + +#endif //__CLIENT_H_ diff --git a/Native/DecalControls/FixedLayout.rgs b/Native/DecalControls/FixedLayout.rgs new file mode 100644 index 0000000..475cebe --- /dev/null +++ b/Native/DecalControls/FixedLayout.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.FixedLayout.1 = s 'DecalControls FixedLayout' + { + CLSID = s '{CD6556CD-F8D9-4CB0-AB7C-7C33058294E4}' + } + DecalControls.FixedLayout = s 'DecalControls FixedLayout' + { + CLSID = s '{CD6556CD-F8D9-4CB0-AB7C-7C33058294E4}' + CurVer = s 'DecalControls.FixedLayout.1' + } + NoRemove CLSID + { + ForceRemove {CD6556CD-F8D9-4CB0-AB7C-7C33058294E4} = s 'DecalControls FixedLayout' + { + ProgID = s 'DecalControls.FixedLayout.1' + VersionIndependentProgID = s 'DecalControls.FixedLayout' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/IconColumn.cpp b/Native/DecalControls/IconColumn.cpp new file mode 100644 index 0000000..c131d24 --- /dev/null +++ b/Native/DecalControls/IconColumn.cpp @@ -0,0 +1,95 @@ +// IconColumn.cpp : Implementation of cIconColumn +#include "stdafx.h" +#include "DecalControls.h" +#include "IconColumn.h" + +///////////////////////////////////////////////////////////////////////////// +// cIconColumn + + +STDMETHODIMP cIconColumn::get_FixedWidth(VARIANT_BOOL *pVal) +{ + *pVal = VARIANT_TRUE; + + return S_OK; +} + +STDMETHODIMP cIconColumn::get_Width(long *pVal) +{ + *pVal = 20; + + return S_OK; +} + + +STDMETHODIMP cIconColumn::put_Width(long newVal) +{ + //m_Width = newVal; + + return S_OK; +} + +STDMETHODIMP cIconColumn::Render(ICanvas *pCanvas, LPPOINT ptCell, long nColor) +{ + _variant_t vIconLib, vIcon; + + m_pList->get_Data( ptCell->x, ptCell->y, 0, &vIconLib ); + m_pList->get_Data( ptCell->x, ptCell->y, 1, &vIcon ); + + // Converted nicely now ... + // Find our checked and unchecked images + CComPtr< IIconCache > pIcons; + + SIZE sz = { 16, 16 }; + m_pSite->GetIconCache( &sz, &pIcons ); + + POINT pt = { 2, 2 }; + pIcons->DrawIcon( &pt, static_cast< long >( vIcon ), static_cast< long >( vIconLib ), pCanvas ); + + return S_OK; +} + +STDMETHODIMP cIconColumn::get_DataColumns(long *pVal) +{ + *pVal = 2; + + return S_OK; +} + +STDMETHODIMP cIconColumn::Initialize(IList *newVal, IPluginSite *pSite) +{ + m_pList = newVal; + m_pSite = pSite; + + return S_OK; +} + +STDMETHODIMP cIconColumn::SchemaLoad(IUnknown *pSchema) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cIconColumn::get_Height(long *pVal) +{ + *pVal = 20; + + return S_OK; +} + +STDMETHODIMP cIconColumn::Activate(LPPOINT ptCell) +{ + // TODO: Add your implementation code here + return S_OK; +} + +STDMETHODIMP cIconColumn::get_Color(long nRow, long *pVal) +{ + return S_OK; +} + +STDMETHODIMP cIconColumn::put_Color(long nRow, long newVal) +{ + return S_OK; +} diff --git a/Native/DecalControls/IconColumn.h b/Native/DecalControls/IconColumn.h new file mode 100644 index 0000000..f26ca9e --- /dev/null +++ b/Native/DecalControls/IconColumn.h @@ -0,0 +1,46 @@ +// IconColumn.h : Declaration of the cIconColumn + +#ifndef __ICONCOLUMN_H_ +#define __ICONCOLUMN_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cIconColumn +class ATL_NO_VTABLE cIconColumn : + public CComObjectRootEx, + public CComCoClass, + public IListColumn +{ +public: + cIconColumn() + { + } + + CComPtr< IList > m_pList; + CComPtr< IPluginSite > m_pSite; + +DECLARE_REGISTRY_RESOURCEID(IDR_ICONCOLUMN) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cIconColumn) + COM_INTERFACE_ENTRY(IListColumn) +END_COM_MAP() + +// IListColumn +public: + STDMETHOD(get_Color)(long nRow, /*[out, retval]*/ long *pVal); + STDMETHOD(put_Color)(long nRow, /*[in]*/ long newVal); + STDMETHOD(Activate)(LPPOINT ptCell); + STDMETHOD(get_Height)(/*[out, retval]*/ long *pVal); + STDMETHOD(SchemaLoad)(IUnknown *pSchema); + STDMETHOD(Initialize)(/*[in]*/ IList * newVal, IPluginSite *pSite); + STDMETHOD(get_DataColumns)(/*[out, retval]*/ long *pVal); + STDMETHOD(Render)(ICanvas *, LPPOINT ptCell, long nColor); + STDMETHOD(get_Width)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_FixedWidth)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Width)(/*[in]*/ long newVal); +}; + +#endif //__ICONCOLUMN_H_ diff --git a/Native/DecalControls/IconColumn.rgs b/Native/DecalControls/IconColumn.rgs new file mode 100644 index 0000000..862df70 --- /dev/null +++ b/Native/DecalControls/IconColumn.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.IconColumn.1 = s 'DecalControls IconColumn' + { + CLSID = s '{F12A2C4C-3B78-46EB-8722-68B27A75AE55}' + } + DecalControls.IconColumn = s 'DecalControls IconColumn' + { + CLSID = s '{F12A2C4C-3B78-46EB-8722-68B27A75AE55}' + CurVer = s 'DecalControls.IconColumn.1' + } + NoRemove CLSID + { + ForceRemove {F12A2C4C-3B78-46EB-8722-68B27A75AE55} = s 'DecalControls IconColumn' + { + ProgID = s 'DecalControls.IconColumn.1' + VersionIndependentProgID = s 'DecalControls.IconColumn' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/DecalControls/List.cpp b/Native/DecalControls/List.cpp new file mode 100644 index 0000000..bb635f4 --- /dev/null +++ b/Native/DecalControls/List.cpp @@ -0,0 +1,656 @@ +// List.cpp : Implementation of cList +#include "stdafx.h" +#include "DecalControls.h" +#include "List.h" + +#include "ListView.h" + +enum eListChild +{ + eListScroller = 1, + eListView = 1000 +}; + +///////////////////////////////////////////////////////////////////////////// +// cList + +cList::cRow::cRow( long nDataWidth ) +: m_pData( new VARIANT[ nDataWidth ] ), +m_pEndData( m_pData + nDataWidth ), +m_bInvalid( true ), +m_colors( NULL ) /* cyn - 07/08/2002 */ +{ + for( VARIANT *i_var = m_pData; i_var != m_pEndData; ++ i_var ) + ::VariantInit( i_var ); + +} + +cList::cRow::cRow( const cRow &row ) +: m_pData( row.m_pData ), +m_pEndData( row.m_pEndData ), +m_bInvalid( row.m_bInvalid ), +m_colors( row.m_colors ) /* cyn - 07/08/2002 -- This is the real fix, the rest of */ + /* the changes just make it faster */ +{ + _ASSERTE( _CrtIsValidHeapPointer( m_pData ) ); + row.m_pData = NULL; + row.m_colors = NULL; +} + +cList::cRow::~cRow() +{ + if( m_pData != NULL ) + { + _ASSERTE( _CrtIsValidHeapPointer( m_pData ) ); + for( VARIANT *i_var = m_pData; i_var != m_pEndData; ++ i_var ) + { + HRESULT hRes = ::VariantClear( i_var ); + _ASSERTE( SUCCEEDED( hRes ) ); + } + + delete[] m_pData; + } + + if (m_colors) { /* cyn - 07/08/2002 */ + delete[] m_colors; + } +} + +cList::cRow &cList::cRow::operator =( const cRow &row ) +{ + + + // Clear out our current data - if any + if( m_pData != NULL ) + { + _ASSERTE( _CrtIsValidHeapPointer( m_pData ) ); + for( VARIANT *i_var = m_pData; i_var != m_pEndData; ++ i_var ) + { + HRESULT hRes = ::VariantClear( i_var ); + _ASSERTE( SUCCEEDED( hRes ) ); + } + + delete[] m_pData; + m_pData = NULL; + } + + _ASSERTE( _CrtIsValidHeapPointer( row.m_pData ) ); + + m_pData = row.m_pData; + m_pEndData = row.m_pEndData; + m_bInvalid = row.m_bInvalid; + + if (m_colors) { /* cyn - 07/08/2002 */ + delete[] m_colors; + } + m_colors = row.m_colors; + row.m_colors = NULL; + + row.m_pData = NULL; + + _ASSERTMEM( _CrtCheckMemory() ); + + return *this; +} + +STDMETHODIMP cList::AddColumn(IListColumn *pNewColumn, long *nIndex) +{ + _ASSERTE( pNewColumn != NULL ); + _ASSERTE( nIndex != NULL ); + + // We can only add columns before there are data rows + _ASSERTE( m_rows.size() == 0 ); + + // Looking good, make up the record + cColumn c; + c.m_pColumn = pNewColumn; + c.m_nDataLeft = ( m_cols.size() == 0 ) ? 0 : m_cols.back().m_nDataRight; + + CComPtr< IPluginSite > pPluginSite; + m_pSite->get_PluginSite( &pPluginSite ); + + long nDataSize; + pNewColumn->get_DataColumns( &nDataSize ); + c.m_nDataRight = c.m_nDataLeft + nDataSize; + + pNewColumn->Initialize( this, pPluginSite ); + + CComPtr< ILayerMouse > pMouse; + c.m_bSupportsMouse = !!SUCCEEDED( pNewColumn->QueryInterface( &pMouse ) ); + + m_cols.push_back( c ); + + // Reformat will fill in column lefts and rights + m_pSite->Reformat(); + + *nIndex = ( m_cols.size() - 1 ); + return S_OK; +} + +STDMETHODIMP cList::AddRow(long *pnNewIndex) +{ + _ASSERTE( pnNewIndex != NULL ); + + // There must be at least one column defined + _ASSERTE( m_cols.size() > 0 ); + + m_rows.push_back( cRow( m_cols.back().m_nDataRight ) ); + long nSize = m_rows.size(); + + Reformat(); + m_pSite->Reformat(); + + if( m_bAutoScroll == true ) + { + POINT ptCurrent; + m_pScroller->get_Offset( &ptCurrent ); + + ptCurrent.y = m_rows.size(); + + m_pScroller->ScrollTo( &ptCurrent ); + + Reformat(); + m_pSite->Reformat(); + } + + *pnNewIndex = ( nSize - 1 ); + + return S_OK; +} + +STDMETHODIMP cList::DeleteRow(long nIndex) +{ + _ASSERTE( nIndex >= 0 ); + _ASSERTE( nIndex < m_rows.size() ); + + m_rows.erase( m_rows.begin() + nIndex ); + + // Start at that index and invalidate all rows below that point + m_pView->InvalidateFrom( nIndex ); + for( cRowList::iterator i_row = m_rows.begin() + nIndex; i_row != m_rows.end(); ++ i_row ) + i_row->m_bInvalid = true; + + m_pSite->Invalidate(); + m_pSite->Reformat(); + + POINT offset; + ::memset (&offset, 0, sizeof (offset)); + + m_pScroller->get_Offset (&offset); + + if (offset.y > nIndex ) + { + // TODO: This isn't perfect, if items are removed from the bottom of the list when + // you're scrolled to the middle, this will cause it to scroll up a line. It does + // solve the problem of lists 'losing' items when the thumb goes away though. + + // Note by Haz - I changed the above from if( offset.y > 0 ) - seems to fix problem :) + offset.y--; + m_pScroller->ScrollTo (&offset); + } + + return S_OK; +} + +STDMETHODIMP cList::get_Data(long nX, long nY, long nSubValue, VARIANT *pVal) +{ + _ASSERTE( m_cols.size() > 0 ); + _ASSERTE( nX >= 0 ); + _ASSERTE( nX < m_cols.back().m_nDataRight ); + _ASSERTE( nSubValue >= 0 ); + _ASSERTE( nSubValue < ( m_cols[ nX ].m_nDataRight - m_cols[ nX ].m_nDataLeft ) ); + _ASSERTE( nY >= 0 ); + _ASSERTE( nY < m_rows.size() ); + _ASSERTE( pVal != NULL ); + + cRow &rowData = m_rows[ nY ]; + HRESULT hRes = ::VariantCopy( pVal, rowData.m_pData + ( m_cols[ nX ].m_nDataLeft + nSubValue ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + + return S_OK; +} + +STDMETHODIMP cList::put_Data(long nX, long nY, long nSubValue, VARIANT *newVal) +{ + _ASSERTE( m_cols.size() > 0 ); + _ASSERTE( nX >= 0 ); + _ASSERTE( nX < m_cols.back().m_nDataRight ); + _ASSERTE( nSubValue >= 0 ); + _ASSERTE( nSubValue < ( m_cols[ nX ].m_nDataRight - m_cols[ nX ].m_nDataLeft ) ); + _ASSERTE( nY >= 0 ); + _ASSERTE( nY < m_rows.size() ); + _ASSERTE( newVal != NULL ); + + if( nY >= m_rows.size() ) + return E_FAIL; + + cRow &rowData = m_rows[ nY ]; + + long lDataColumns = 0; + m_cols[ nX ].m_pColumn->get_DataColumns( &lDataColumns ); + + if( nSubValue > lDataColumns ) + return E_FAIL; + + HRESULT hRes = ::VariantCopy( rowData.m_pData + ( m_cols[ nX ].m_nDataLeft + nSubValue ), newVal ); + _ASSERTE( SUCCEEDED( hRes ) ); + rowData.m_bInvalid = true; + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cList::get_CellRect(LPPOINT pt, LPRECT pVal) +{ + _ASSERTE( pt != NULL ); + _ASSERTE( m_cols.size() > 0 ); + _ASSERTE( pt->x >= 0 ); + _ASSERTE( pt->x < m_cols.back().m_nDataRight ); + _ASSERTE( pt->y >= 0 ); + _ASSERTE( pt->y < m_rows.size() ); + _ASSERTE( pVal != NULL ); + + pVal->top = pt->y * m_nRowHeight; + pVal->bottom = ( pt->y + 1 ) * m_nRowHeight; + pVal->left = m_cols[ pt->x ].m_nLeft; + pVal->right = m_cols[ pt->y ].m_nRight; + + return S_OK; +} + +void cList::onCreate() +{ + // Create the scoller and the scroller client object + CComPtr< ILayer > pScrollerLayer; + + HRESULT hRes = ::CoCreateInstance( CLSID_Scroller, NULL, CLSCTX_INPROC_SERVER, + __uuidof( ILayer ), reinterpret_cast< void ** >( &pScrollerLayer ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + // Will reposition on reformat + LayerParams p = { eListScroller, { 0, 0, 0, 0 }, eRenderClipped }; + + m_pSite->CreateChild( &p, pScrollerLayer ); + pScrollerLayer->QueryInterface( &m_pScroller ); + + CComObject< cListView > *pView; + CComObject< cListView >::CreateInstance( &pView ); + + m_pScroller->CreateClient( pView ); + m_pView = pView; + + // Configure the scroller + + SIZE szIncrement = { 100, 20 }; + m_pScroller->put_Increments( &szIncrement ); + m_pScroller->put_HorizontalEnabled( VARIANT_FALSE ); + m_pScroller->put_VerticalEnabled( VARIANT_TRUE ); + + pView->m_pList = this; + + m_pSite->put_Transparent( VARIANT_FALSE ); +} + +void cList::onDestroy() +{ + // Release all of our references + m_pView.Release(); + m_pScroller.Release(); + + // Kill the data + m_cols.clear(); + m_rows.clear(); +} + +STDMETHODIMP cList::Reformat() +{ + // Recalculate the column widths and reposition the child control + RECT rc; + m_pSite->get_Position( &rc ); + + RECT rcScroller = { 0, 0, rc.right - rc.left, rc.bottom - rc.top }; + CComPtr< ILayerSite > pScrollerSite; + HRESULT hRes = m_pSite->get_Child( eListScroller, ePositionByID, &pScrollerSite ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pScrollerSite->put_Position( &rcScroller ); + + SIZE szClient; + m_pScroller->get_Viewport( &szClient ); + + // Ok, setup the list view objects (note there is cache for a partial row at the top and bottom) + m_pView->SetCacheInfo( m_nRowHeight, ( szClient.cy / m_nRowHeight ) + 2 ); + + szClient.cy = m_nRowHeight * m_rows.size(); + + m_pScroller->put_Area( &szClient ); + + // Last, calculate the column widths + long nFixedWidthsTotal = 0, + nVariableCount = 0; + + // First pass adds up the fixed widths + { + for( cColumnList::iterator i = m_cols.begin(); i != m_cols.end(); ++ i ) + { + VARIANT_BOOL bFixed; + i->m_pColumn->get_FixedWidth( &bFixed ); + + if( bFixed ) + { + long nWidth; + i->m_pColumn->get_Width( &nWidth ); + + nFixedWidthsTotal += nWidth; + } + else + ++ nVariableCount; + } + } + + // Next pass sets the widths + //_ASSERTE( nFixedWidthsTotal < szClient.cx ); + + long nPosition = 0; + + for( cColumnList::iterator i = m_cols.begin(); i != m_cols.end(); ++ i ) + { + VARIANT_BOOL bFixed; + i->m_pColumn->get_FixedWidth( &bFixed ); + + i->m_nLeft = nPosition; + + if( bFixed ) + { + long nWidth; + i->m_pColumn->get_Width( &nWidth ); + i->m_nRight = i->m_nLeft + nWidth; + } + else + i->m_nRight = i->m_nLeft + ( szClient.cx - nFixedWidthsTotal ) / nVariableCount; + + nPosition = i->m_nRight; + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + _ASSERT(0==0); + return S_OK; +} + +STDMETHODIMP cList::put_RowEstimate(long newVal) +{ + m_rows.reserve( newVal ); + + return S_OK; +} + +STDMETHODIMP cList::SchemaLoad(IView *, IUnknown *pSchema) +{ + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vRowHeight = pElement->getAttribute( _T( "rowheight" ) ); + + if( vRowHeight.vt != VT_NULL ) + { + try + { + m_nRowHeight = static_cast< long >( vRowHeight ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + else + m_nRowHeight = 20; + + _variant_t vAutoScroll = pElement->getAttribute( _T( "autoscroll" ) ); + if( vAutoScroll.vt != VT_NULL ) + { + try + { + m_bAutoScroll = static_cast< bool >( vAutoScroll ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + + // Walk the list of columns under this element + MSXML::IXMLDOMElementPtr pColumn; + for( MSXML::IXMLDOMNodeListPtr pColumns = pElement->selectNodes( _T( "column" ) ); ( pColumn = pColumns->nextNode() ).GetInterfacePtr() != NULL; ) + { + _variant_t vProgID = pColumn->getAttribute( _T( "progid" ) ); + + _ASSERTE( vProgID.vt == VT_BSTR ); + + CLSID clsid; + HRESULT hRes = ::CLSIDFromProgID( vProgID.bstrVal, &clsid ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + // Looking good, create the column object + CComPtr< IListColumn > pColumnInst; + + hRes = ::CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_IListColumn, + reinterpret_cast< void ** >( &pColumnInst ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + // Have the column load any special internal values + pColumnInst->SchemaLoad( pColumn ); + + long nIndex; + AddColumn( pColumnInst, &nIndex ); + } + + SIZE szIncrement = { 100, m_nRowHeight }; + m_pScroller->put_Increments( &szIncrement ); + + return S_OK; +} + +STDMETHODIMP cList::get_Count( long *pnCount ) +{ + _ASSERTE( pnCount != NULL ); + + *pnCount = m_rows.size(); + + return S_OK; +} + +STDMETHODIMP cList::get_CountCols( long *pnCount ) +{ + _ASSERTE( pnCount != NULL ); + + *pnCount = m_cols.size(); + + return S_OK; +} + +STDMETHODIMP cList::Clear() +{ + m_rows.clear(); + m_pView->InvalidateFrom( 0 ); + + m_pScroller->ResetScroller(); + + m_pSite->Reformat(); + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cList::InsertRow(long lIndex) +{ + _ASSERTE (lIndex >= 0); + // There must be at least one column defined + _ASSERTE( m_cols.size() > 0 ); + + cRowList::iterator it = m_rows.begin (); + + if (lIndex > 0) + { + it += lIndex; + } + + m_rows.insert( it, cRow( m_cols.back().m_nDataRight ) ); + + // Start at that index and invalidate all rows below that point + m_pView->InvalidateFrom( lIndex ); + for( cRowList::iterator i_row = m_rows.begin() + lIndex; i_row != m_rows.end(); ++ i_row ) + { + i_row->m_bInvalid = true; + } + + m_pSite->Invalidate(); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cList::put_ColumnWidth(long nColumn, long nWidth) +{ + m_cols[ nColumn ].m_pColumn->put_Width(nWidth); + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cList::get_ColumnWidth(long nColumn, long *nWidth) +{ + m_cols[ nColumn ].m_pColumn->get_Width(nWidth); + + return S_OK; +} + +STDMETHODIMP cList::get_Color(long nX, long nY, long *pVal) +{ + + if (!pVal) { /* cyn - 07/08/2002 */ + return E_FAIL; + } + + *pVal = 0x00FFFFFF; + cRow &rowData = m_rows[nY]; + + if (nX >= m_cols.size()) { + return E_FAIL; + } + + if (rowData.m_colors) { + if (rowData.m_colors[nX]) { + *pVal = rowData.m_colors[nX]; + } + } + + return S_OK; +} + +STDMETHODIMP cList::put_Color(long nX, long nY, long newVal) +{ + int i; + + if (nX >= m_cols.size()) { /* cyn - 07/08/2002 */ + return E_FAIL; + } + + cRow &rowData = m_rows[nY]; + + if (!rowData.m_colors) { + i = m_cols.size(); + rowData.m_colors = new long[ i ]; + if (!rowData.m_colors) { + return E_OUTOFMEMORY; + } + + // Madar 9/8/2002: Initialize colors to white. + for (long loop = 0; loop < m_cols.size(); ++loop) { + rowData.m_colors[loop] = 0x00ffffff; + } + } + + rowData.m_colors[nX] = newVal; + + m_pSite->Invalidate(); + rowData.m_bInvalid = true; + + return S_OK; +} + +STDMETHODIMP cList::get_AutoScroll(VARIANT_BOOL *pVal) +{ + if( m_bAutoScroll == true ) + *pVal = VARIANT_TRUE; + + else if( m_bAutoScroll == false ) + *pVal = VARIANT_FALSE; + + else + return E_FAIL; + + return S_OK; +} + +STDMETHODIMP cList::put_AutoScroll(VARIANT_BOOL newVal) +{ + if( newVal == VARIANT_TRUE ) + m_bAutoScroll = true; + + else if( newVal == VARIANT_FALSE ) + m_bAutoScroll = false; + + else + return E_FAIL; + + return S_OK; +} + +STDMETHODIMP cList::get_ScrollPosition(long *pVal) +{ + tagPOINT tpOffset; + tagSIZE tsSize; + m_pScroller->get_Offset( &tpOffset ); + m_pScroller->get_Increments( &tsSize ); + + *pVal = tpOffset.y; + + return S_OK; +} + +STDMETHODIMP cList::put_ScrollPosition(long newVal) +{ + tagPOINT tpOffset; + tagSIZE tsSize; + m_pScroller->get_Offset( &tpOffset ); + m_pScroller->get_Increments( &tsSize ); + + tpOffset.y = newVal; + + m_pScroller->ScrollTo( &tpOffset ); + + return S_OK; +} + +STDMETHODIMP cList::JumpToPosition(long newVal) +{ + _ASSERTE( newVal >= 0 ); + _ASSERTE( newVal < m_rows.size() ); + + tagPOINT tpOffset; + m_pScroller->get_Offset( &tpOffset ); + + tpOffset.y = newVal; + + m_pScroller->put_Offset( &tpOffset ); + m_pScroller->ScrollTo( &tpOffset ); // ensures the thumb gets updated + + return S_OK; +} diff --git a/Native/DecalControls/List.h b/Native/DecalControls/List.h new file mode 100644 index 0000000..d26239c --- /dev/null +++ b/Native/DecalControls/List.h @@ -0,0 +1,122 @@ +// List.h : Declaration of the cList + +#ifndef __LIST_H_ +#define __LIST_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cList +class ATL_NO_VTABLE cList : + public CComObjectRootEx, + public CComCoClass, + public IControlImpl< cList, IList, &IID_IListDisp, &LIBID_DecalControls >, + public ILayerImpl< cList >, + public ILayerRenderImpl, + public ILayerSchema, + public IProvideClassInfo2Impl< &CLSID_List, &DIID_IListEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyIListEvents< cList > +{ +public: + cList() + { + m_bAutoScroll = false; + } + + class cColumn + { + public: + CComPtr< IListColumn > m_pColumn; + long m_nLeft, m_nRight; + long m_nDataLeft, m_nDataRight; + + bool m_bSupportsMouse; + }; + + typedef std::deque< cColumn > cColumnList; + + class cRow + { + public: + mutable VARIANT *m_pData, + *m_pEndData; + bool m_bInvalid; + mutable long *m_colors; /* cyn - 07/08/2002 */ + + explicit cRow( long nDataWidth ); + cRow( const cRow &row ); + ~cRow(); + + cRow &operator=( const cRow & ); + }; + + typedef std::vector< cRow > cRowList; + + CComPtr< IScroller > m_pScroller; + CComPtr< IListView > m_pView; + + cColumnList m_cols; + cRowList m_rows; + + long m_nRowHeight; + bool m_bAutoScroll; + + void onCreate(); + void onDestroy(); + +DECLARE_REGISTRY_RESOURCEID(IDR_LIST) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cList) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IList) + COM_INTERFACE_ENTRY(IListDisp) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cList) +CONNECTION_POINT_ENTRY(DIID_IListEvents) +END_CONNECTION_POINT_MAP() + +public: + STDMETHOD(JumpToPosition)(long newVal); + STDMETHOD(get_ScrollPosition)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_ScrollPosition)(/*[in]*/ long newVal); + STDMETHOD(get_AutoScroll)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_AutoScroll)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_Color)(long nX, long nY, /*[out, retval]*/ long *pVal); + STDMETHOD(put_Color)(long nX, long nY, /*[in]*/ long newVal); + STDMETHOD(InsertRow)(long lIndex); + // IList Methods + STDMETHOD(get_CellRect)(LPPOINT pt, /*[out, retval]*/ LPRECT pVal); + STDMETHOD(get_Data)(long nX, long nY, /*[optional, defaultvalue(0)]*/ long nSubValue, /*[out, retval]*/ VARIANT* pVal); + STDMETHOD(put_Data)(long nX, long nY, /*[optional, defaultvalue(0)]*/ long nSubValue, /*[in]*/ VARIANT* newVal); + STDMETHOD(DeleteRow)(long nIndex); + STDMETHOD(AddRow)(/*[out, retval]*/ long *pnNewIndex); + STDMETHOD(AddColumn)(IListColumn *pNewColumn, /*[out, retval]*/ long *nIndex); + STDMETHOD(put_RowEstimate)(/*[in]*/ long newVal); + STDMETHOD(get_Count)(long *pnCount); + STDMETHOD(get_CountCols)(long *pnCount); + STDMETHOD(Clear)(); + STDMETHOD(put_ColumnWidth)(long nColumn, long nWidth); + STDMETHOD(get_ColumnWidth)(long nColumn, long *nWidth); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *, IUnknown *pSchema); +}; + +#endif //__LIST_H_ diff --git a/Native/DecalControls/List.rgs b/Native/DecalControls/List.rgs new file mode 100644 index 0000000..ead3b20 --- /dev/null +++ b/Native/DecalControls/List.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.List.1 = s 'DecalControls List' + { + CLSID = s '{3839008F-AF5B-43FC-9F6A-3376B99E3DAF}' + } + DecalControls.List = s 'DecalControls List' + { + CLSID = s '{3839008F-AF5B-43FC-9F6A-3376B99E3DAF}' + CurVer = s 'DecalControls.List.1' + } + NoRemove CLSID + { + ForceRemove {3839008F-AF5B-43FC-9F6A-3376B99E3DAF} = s 'DecalControls List' + { + ProgID = s 'DecalControls.List.1' + VersionIndependentProgID = s 'DecalControls.List' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/DecalControls/ListView.cpp b/Native/DecalControls/ListView.cpp new file mode 100644 index 0000000..5e93102 --- /dev/null +++ b/Native/DecalControls/ListView.cpp @@ -0,0 +1,220 @@ +// ListView.cpp : Implementation of cListView +#include "stdafx.h" +#include "DecalControls.h" +#include "ListView.h" + +#include "List.h" + +///////////////////////////////////////////////////////////////////////////// +// cListView + +cListView::cListView() +: m_nRowHeight( 20 ), +m_nRowCache( 0 ), +m_nValidFrom( 0 ), +m_nValidTo( 0 ) +{ +} + +STDMETHODIMP cListView::put_Area(LPSIZE newVal) +{ + RECT rc = { 0, 0, newVal->cx, newVal->cy }; + m_pSite->put_Position( &rc ); + + return S_OK; +} + +STDMETHODIMP cListView::SetCacheInfo(long nRowHeight, long nRowsToCache) +{ + m_nRowHeight = nRowHeight; + m_nRowCache = nRowsToCache; + + m_pSite->Reformat(); + + return S_OK; +} + +void cListView::onCreate() +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->LoadBitmapPortal( 0x0600128A, &m_pBackground ); + + m_pSite->put_Transparent( VARIANT_FALSE ); +} + +void cListView::onDestroy() +{ + m_pBackground.Release(); + + if( m_pCache.p != NULL ) + m_pCache.Release(); +} + +STDMETHODIMP cListView::Reformat() +{ + RECT rcPos; + m_pSite->get_Position( &rcPos ); + + SIZE szCache = { rcPos.right - rcPos.left, m_nRowHeight * m_nRowCache }; + + if( m_pCache.p != NULL ) + m_pCache->put_Size( &szCache ); + else + { + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->CreateCanvas( &szCache, &m_pCache ); + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cListView::Render(ICanvas *pCanvas) +{ + _ASSERTMEM( _CrtCheckMemory( ) ); + + // First, draw the Background pattern + VARIANT_BOOL bLost; + m_pCache->get_WasLost( &bLost ); + + if( bLost ) + // There is no valid range - we must redraw + // the entire rowset + m_nValidFrom = m_nValidTo; + + ClipParams cp; + pCanvas->GetClipParams( &cp ); + + SIZE szCache; + m_pCache->get_Size( &szCache ); + + // We have the clipping rectangle now - calculate the range + // of rows we want to draw + long nDrawFrom = cp.org.y / m_nRowHeight, + nDrawTo = nDrawFrom + m_nRowCache, + nRowCount = m_pList->m_rows.size(); + + // Ok, now draw all of the rows either out of range + // or invalid + for( long nDraw = nDrawFrom; nDraw < nDrawTo; ++ nDraw ) + { + // Determine how much we need to draw + bool bHasData = ( nDraw >= 0 && nDraw < nRowCount ); + + if( nDraw < m_nValidFrom || nDraw >= m_nValidTo || ( bHasData && m_pList->m_rows[ nDraw ].m_bInvalid ) ) + { + // Redraw this row + long nRowPos = nDraw % m_nRowCache; + RECT rcRow = { 0, nRowPos * m_nRowHeight, szCache.cx, ( nRowPos + 1 ) * m_nRowHeight }; + + // Fill the background with the background image + POINT ptBackgroundOrg = { 0, nDraw * m_nRowHeight }; + m_pBackground->PatBlt( m_pCache, &rcRow, &ptBackgroundOrg ); + + if( bHasData ) + { + // This row is visible and there's data - so use the + // column objects to render the data + for( cList::cColumnList::iterator i_col = m_pList->m_cols.begin(); i_col != m_pList->m_cols.end(); ++ i_col ) + { + RECT rcCell = { i_col->m_nLeft, rcRow.top, i_col->m_nRight, rcRow.bottom }; + VARIANT_BOOL bVisible; + m_pCache->PushClipRect( &rcCell, &bVisible ); + + // All our clippings should be completely visible + _ASSERTE( bVisible ); + + long nColor; + POINT ptCell = { i_col - m_pList->m_cols.begin(), nDraw }; + + get_Color(ptCell.x, ptCell.y, &nColor); + i_col->m_pColumn->Render( m_pCache, &ptCell, nColor); + m_pCache->PopClipRect(); + + _ASSERTMEM( _CrtCheckMemory( ) ); + } + + m_pList->m_rows[ nDraw ].m_bInvalid = false; + } + } + } + + // Now that our cache is updated, we can tranfer it to the surface + m_nValidFrom = nDrawFrom; + m_nValidTo = nDrawTo; + + long nBltFrom = nDrawFrom % m_nRowCache; + + RECT rcTop = { 0, nBltFrom * m_nRowHeight, szCache.cx, m_nRowHeight * m_nRowCache }; + POINT ptDest = { 0, nDrawFrom * m_nRowHeight }; + pCanvas->Blt( &rcTop, m_pCache, &ptDest ); + + if( nBltFrom != 0 ) + { + // Transfer the bottom part + RECT rcBottom = { 0, 0, szCache.cx, nBltFrom * m_nRowHeight }; + POINT ptDestBottom = { 0, ( nDrawFrom + m_nRowCache - nBltFrom ) * m_nRowHeight }; + + pCanvas->Blt( &rcBottom, m_pCache, &ptDestBottom ); + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cListView::MouseDown( MouseState *pMS ) +{ + // Hit test to find what cell + POINT ptHit = { 0, pMS->client.y / m_nRowHeight }; + if( ptHit.y >= m_pList->m_rows.size() ) + // We did not hit any rows + return S_OK; + + for( cList::cColumnList::iterator i_col = m_pList->m_cols.begin(); i_col != m_pList->m_cols.end(); ++ i_col ) + { + if( pMS->client.x >= i_col->m_nLeft && pMS->client.x < i_col->m_nRight ) + { + ptHit.x = ( i_col - m_pList->m_cols.begin() ); + + i_col->m_pColumn->Activate( &ptHit ); + + long nID; + m_pList->m_pSite->get_ID( &nID ); + + m_pList->Fire_Change( nID, ptHit.x, ptHit.y ); + + break; + } + } + + return S_OK; +} + +STDMETHODIMP cListView::InvalidateFrom(long nRow) +{ + if( nRow < m_nValidTo ) + m_nValidTo = nRow; + + if( nRow < m_nValidFrom ) + m_nValidFrom = nRow; + + return S_OK; +} + +STDMETHODIMP cListView::get_Color(long nCol, long nRow, long *pVal) +{ + m_pList->get_Color(nCol, nRow, pVal); + return S_OK; +} + +STDMETHODIMP cListView::put_Color(long nCol, long nRow, long newVal) +{ + m_pList->put_Color(nCol, nRow, newVal); + return S_OK; +} diff --git a/Native/DecalControls/ListView.h b/Native/DecalControls/ListView.h new file mode 100644 index 0000000..290ad54 --- /dev/null +++ b/Native/DecalControls/ListView.h @@ -0,0 +1,65 @@ +// ListView.h : Declaration of the cListView + +#ifndef __LISTVIEW_H_ +#define __LISTVIEW_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" + +class cList; + +///////////////////////////////////////////////////////////////////////////// +// cListView +class ATL_NO_VTABLE cListView : + public CComObjectRootEx, + public ILayerImpl< cListView >, + public ILayerRenderImpl, + public ILayerMouseImpl, + public cNoEventsImpl, + public IListView +{ +public: + cListView(); + + CComPtr< ICanvas > m_pCache; + + CComPtr< IImageCache > m_pBackground; + + typedef std::map< std::pair< long, long >, long > cCellMap; + cCellMap m_cells; + + long m_nRowHeight, + m_nRowCache, + m_nValidFrom, + m_nValidTo; + + cList *m_pList; + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cListView) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IListView) +END_COM_MAP() + +public: + STDMETHOD(get_Color)(long nCol, long nRow, /*[out, retval]*/ long *pVal); + STDMETHOD(put_Color)(long nCol, long nRow, /*[in]*/ long newVal); + // IListView Methods + STDMETHOD(put_Area)(/*[in]*/ LPSIZE newVal); + STDMETHOD(SetCacheInfo)(long nRowHeight, long nRowsToCache); + STDMETHOD(InvalidateFrom)(long nRow); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerMouse Methods + STDMETHOD(MouseDown)(MouseState *pMS); +}; + +#endif //__LISTVIEW_H_ diff --git a/Native/DecalControls/Notebook.cpp b/Native/DecalControls/Notebook.cpp new file mode 100644 index 0000000..3496446 --- /dev/null +++ b/Native/DecalControls/Notebook.cpp @@ -0,0 +1,281 @@ +// Notebook.cpp : Implementation of cNotebook +#include "stdafx.h" +#include "DecalControls.h" +#include "Notebook.h" + +///////////////////////////////////////////////////////////////////////////// +// cNotebook + +cNotebook::cNotebook(): +m_nNextPageID( 1001 ), +m_nActiveTab( -1 ), +m_nCaptureTab( -1 ), +m_bHitCapture( false ) +{ +} + +long cNotebook::hitTest( MouseState *pMS ) +{ + if( pMS->over != this ) + // Not hitting us, therefore not hitting a tab + return -1; + + // Yes for y boundaries + if( pMS->client.y < 0 || pMS->client.y >= 16 ) + return -1; + + // Walk through the list of tabs + for( cPageList::iterator i = m_pages.begin(); i != m_pages.end(); ++ i ) + { + if( pMS->client.x >= i->m_nLeft && pMS->client.x < i->m_nRight ) + // Hit a tab! + return ( i - m_pages.begin() ); + } + + // No tabs hit + return -1; +} + +void cNotebook::positionActiveTab() +{ + if( m_nActiveTab == -1 ) + return; + + RECT rcClient; + m_pSite->get_Position( &rcClient ); + + CComPtr< ILayerSite > pChild; + m_pSite->get_Child( m_pages[ m_nActiveTab ].m_nPageID, ePositionByID, &pChild ); + + RECT rcChild = { 0, 16, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top }; + pChild->put_Position( &rcChild ); +} + +STDMETHODIMP cNotebook::AddPage(BSTR strText, IControl *pClient) +{ + cPage p; + p.m_strName = strText; + p.m_nPageID = m_nNextPageID ++; + + CComPtr< ILayer > pClientLayer; + pClient->QueryInterface( &pClientLayer ); + + LayerParams lp = { p.m_nPageID, { 0, 0, 0, 0 }, eRenderClipped }; + m_pSite->CreateChild( &lp, pClientLayer ); + + m_pages.push_back( p ); + + if( m_nActiveTab == -1 ) + // Activate the page if it's the first one + m_nActiveTab = 0; + + m_pSite->Reformat(); + + return S_OK; +} + +void cNotebook::onCreate() +{ + // Load the images + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->LoadBitmapFile( _bstr_t( _T( "Tab-Active.bmp" ) ), &m_pActive ); + pPlugin->LoadBitmapFile( _bstr_t( _T( "Tab-Inactive.bmp" ) ), &m_pInactive ); + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); +} + +void cNotebook::onDestroy() +{ + m_pActive.Release(); + m_pInactive.Release(); +} + +#define TEXT_LR_MARGIN 5 + +STDMETHODIMP cNotebook::Reformat() +{ + // Walk through the tabs and position the graphics + long nTabPos = 0; + for( cPageList::iterator i = m_pages.begin(); i != m_pages.end(); ++ i ) + { + // Calculate the text length + SIZE sz; + m_pFont->MeasureText( i->m_strName, &sz ); + + long nWidth = sz.cx + TEXT_LR_MARGIN * 2; + + i->m_nLeft = nTabPos; + i->m_nRight = nTabPos + nWidth; + nTabPos += nWidth; + } + + if( m_nActiveTab != -1 ) + positionActiveTab(); + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cNotebook::Render( ICanvas *pCanvas ) +{ + for( cPageList::iterator i = m_pages.begin(); i != m_pages.end(); ++ i ) + { + POINT ptTab = { i->m_nLeft, 0 }; + long nWidth = i->m_nRight - i->m_nLeft; + long nIndex = i - m_pages.begin(); + + bool bActive = ( ( nIndex == m_nActiveTab ) || ( m_nCaptureTab != -1 && m_bHitCapture && nIndex == m_nCaptureTab ) ); + if( bActive ) + m_pActive->StretchBlt( pCanvas, &ptTab, nWidth, 7, 90 ); + else + m_pInactive->StretchBlt( pCanvas, &ptTab, nWidth, 7, 90 ); + + // Draw the text + POINT ptText = { i->m_nLeft + TEXT_LR_MARGIN, 2 }; + m_pFont->DrawText( &ptText, i->m_strName, ( bActive ) ? RGB( 0, 0, 0 ) : RGB( 192, 192, 192 ), pCanvas ); + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cNotebook::MouseDown( MouseState *pMS ) +{ + m_nCaptureTab = hitTest( pMS ); + + if( m_nCaptureTab != -1 ) + { + m_bHitCapture = true; + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cNotebook::MouseUp( MouseState *pMS ) +{ + _ASSERTMEM( _CrtCheckMemory( ) ); + + if( m_nCaptureTab == -1 ) + return S_OK; + + if( hitTest( pMS ) == m_nCaptureTab ) + put_ActiveTab( m_nCaptureTab ); + + _ASSERTMEM( _CrtCheckMemory( ) ); + + m_nCaptureTab = -1; + + return S_OK; +} + +STDMETHODIMP cNotebook::MouseMove( MouseState *pMS ) +{ + if( m_nCaptureTab == -1 ) + // We are hitting in progress + return S_OK; + + // Check for a hit + bool bHitCapture = ( hitTest( pMS ) == m_nCaptureTab ); + if( bHitCapture != m_bHitCapture ) + { + m_bHitCapture = bHitCapture; + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cNotebook::get_ActiveTab(long *pVal) +{ + *pVal = m_nActiveTab; + + return S_OK; +} + +STDMETHODIMP cNotebook::put_ActiveTab(long newVal) +{ + if( m_nActiveTab != -1 ) + { + // Hide the current active view + static RECT rcHide = { 0, 0, 0, 0 }; + CComPtr< ILayerSite > pChild; + m_pSite->get_Child( m_pages[ m_nActiveTab ].m_nPageID, ePositionByID, &pChild ); + + pChild->put_Position( &rcHide ); + } + + m_nActiveTab = newVal; + + if( m_nActiveTab != -1 ) + positionActiveTab(); + + long nID; + m_pSite->get_ID( &nID ); + Fire_Change( nID, m_nActiveTab ); + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cNotebook::SchemaLoad(IView *pView, IUnknown *pSchema) +{ + MSXML::IXMLDOMElementPtr pElement = pSchema; + + MSXML::IXMLDOMElementPtr pPage; + for( MSXML::IXMLDOMNodeListPtr pPages = pElement->selectNodes( _T( "page" ) ); ( pPage = pPages->nextNode() ).GetInterfacePtr() != NULL; ) + { + // We have the page, get the text, then recurse and generate the control + _variant_t vText = pPage->getAttribute( _T( "label" ) ); + + _ASSERTE( vText.vt == VT_BSTR ); + + cPage p; + p.m_strName = vText.bstrVal; + p.m_nPageID = m_nNextPageID ++; + + m_pages.push_back( p ); + + MSXML::IXMLDOMElementPtr pControl = pPage->selectSingleNode( _T( "control" ) ); + + _ASSERTE( pControl.GetInterfacePtr() != NULL ); + + long nAssigned; + pView->LoadControl( m_pSite, p.m_nPageID, pControl, &nAssigned ); + } + + if( m_nActiveTab == -1 && m_pages.size() > 0 ) + // Activate the page if it's the first one + m_nActiveTab = 0; + + return S_OK; +} + +STDMETHODIMP cNotebook::get_PageText(long nIndex, BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + _ASSERTE( nIndex >= 0 ); + _ASSERTE( nIndex < m_pages.size() ); + + *pVal = OLE2BSTR( m_pages[ nIndex ].m_strName ); + + return S_OK; +} + +STDMETHODIMP cNotebook::put_PageText(long nIndex, BSTR newVal) +{ + _ASSERTE( newVal != NULL ); + _ASSERTE( nIndex >= 0 ); + _ASSERTE( nIndex < m_pages.size() ); + + m_pages[ nIndex ].m_strName = newVal; + m_pSite->Reformat(); + + return S_OK; +} diff --git a/Native/DecalControls/Notebook.h b/Native/DecalControls/Notebook.h new file mode 100644 index 0000000..cb82934 --- /dev/null +++ b/Native/DecalControls/Notebook.h @@ -0,0 +1,97 @@ +// Notebook.h : Declaration of the cNotebook + +#ifndef __NOTEBOOK_H_ +#define __NOTEBOOK_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cNotebook +class ATL_NO_VTABLE cNotebook : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public ILayerImpl< cNotebook >, + public ILayerRenderImpl, + public ILayerMouseImpl, + public ILayerSchema, + public IProvideClassInfo2Impl< &CLSID_Notebook, &DIID_INotebookEvents, &LIBID_DecalControls >, + public IControlImpl< cNotebook, INotebook, &IID_INotebook, &LIBID_DecalControls >, + public CProxyINotebookEvents< cNotebook > +{ +public: + cNotebook(); + + class cPage + { + public: + _bstr_t m_strName; + long m_nPageID; + + long m_nLeft, m_nRight; + }; + + typedef std::vector< cPage > cPageList; + cPageList m_pages; + + CComPtr< IImageCache > m_pActive; + CComPtr< IImageCache > m_pInactive; + CComPtr< IFontCache > m_pFont; + + long m_nNextPageID, + m_nActiveTab, + m_nCaptureTab; + bool m_bHitCapture; + + long hitTest( MouseState *pMS ); + void positionActiveTab(); + + void onCreate(); + void onDestroy(); + +DECLARE_REGISTRY_RESOURCEID(IDR_NOTEBOOK) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cNotebook) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(INotebook) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cNotebook) +CONNECTION_POINT_ENTRY(DIID_INotebookEvents) +END_CONNECTION_POINT_MAP() + +public: + // INotebook Methods + STDMETHOD(AddPage)(BSTR strText, IControl *pClient); + STDMETHOD(get_ActiveTab)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_ActiveTab)(/*[in]*/ long newVal); + STDMETHOD(get_PageText)(long nIndex, /*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_PageText)(long nIndex, /*[in]*/ BSTR newVal); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)( ICanvas *pCanvas ); + + // ILayerMouse Methods + STDMETHOD(MouseDown)( MouseState *pMS ); + STDMETHOD(MouseUp)( MouseState *pMS ); + STDMETHOD(MouseMove)( MouseState *pMS ); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *, IUnknown *pSchema); +}; + +#endif //__NOTEBOOK_H_ diff --git a/Native/DecalControls/Notebook.rgs b/Native/DecalControls/Notebook.rgs new file mode 100644 index 0000000..a46e183 --- /dev/null +++ b/Native/DecalControls/Notebook.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Notebook.1 = s 'DecalControls Notebook' + { + CLSID = s '{ED14E7C5-11BE-4DFD-9829-873AB6BE3CFC}' + } + DecalControls.Notebook = s 'DecalControls Notebook' + { + CLSID = s '{ED14E7C5-11BE-4DFD-9829-873AB6BE3CFC}' + CurVer = s 'DecalControls.Notebook.1' + } + NoRemove CLSID + { + ForceRemove {ED14E7C5-11BE-4DFD-9829-873AB6BE3CFC} = s 'DecalControls Notebook' + { + ProgID = s 'DecalControls.Notebook.1' + VersionIndependentProgID = s 'DecalControls.Notebook' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/DecalControls/PageLayout.cpp b/Native/DecalControls/PageLayout.cpp new file mode 100644 index 0000000..1ce4b96 --- /dev/null +++ b/Native/DecalControls/PageLayout.cpp @@ -0,0 +1,110 @@ +// PageLayout.cpp : Implementation of cPageLayout +#include "stdafx.h" +#include "DecalControls.h" +#include "PageLayout.h" + +///////////////////////////////////////////////////////////////////////////// +// cPageLayout + +void cPageLayout::onChildDestroy( long nID ) +{ + if( m_nActive != -1 ) + { + if( nID == m_pages[ m_nActive ] ) + // The active page is being deleted, now we show no pages + m_nActive = -1; + } + + // Walk through the list of pages and remove he who does + // not exist + for( cChildIDList::iterator i = m_pages.begin(); i != m_pages.end(); ++ i ) + { + if( *i == nID ) + { + m_pages.erase( i ); + break; + } + } +} + +void cPageLayout::onSchemaLoad( IView *pView, MSXML::IXMLDOMElementPtr &pElement ) +{ + // Each control child is a page + MSXML::IXMLDOMElementPtr pChild; + for( MSXML::IXMLDOMNodeListPtr pChildren = pElement->selectNodes( _T( "control" ) ); + ( pChild = pChildren->nextNode() ).GetInterfacePtr() != NULL; ) + m_pages.push_back( loadChildControl( pView, pChild ) ); +} + +STDMETHODIMP cPageLayout::get_Active(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nActive; + + return S_OK; +} + +STDMETHODIMP cPageLayout::put_Active(long newVal) +{ + _ASSERTE( newVal >= 0 ); + _ASSERTE( newVal < m_pages.size() ); + + if( m_nActive != -1 ) + { + // Hide the active page + CComPtr< ILayerSite > pChildSite; + HRESULT hRes = m_pSite->get_Child( m_pages[ m_nActive ], ePositionByID, &pChildSite ); + _ASSERTE( SUCCEEDED( hRes ) ); + + static RECT rcHide = { 0, 0, 0, 0 }; + pChildSite->put_Position( &rcHide ); + } + + m_nActive = newVal; + + // The reformat next cycle will reposition the child + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cPageLayout::CreatePage(ILayer *pChild) +{ + _ASSERTE( pChild != NULL ); + + LayerParams lp = { dispenseID(), { 0, 0, 0, 0 }, eRenderClipped }; + m_pSite->CreateChild( &lp, pChild ); + + m_pages.push_back( lp.ID ); + + return S_OK; +} + +STDMETHODIMP cPageLayout::get_Count(long *pVal) +{ + _ASSERTE( pVal != NULL ); + *pVal = m_pages.size(); + + return S_OK; +} + +STDMETHODIMP cPageLayout::Reformat() +{ + if( m_nActive == -1 ) + return S_OK; + + // Get the active page and set it to fill our entire client area + RECT rcThis; + m_pSite->get_Position( &rcThis ); + + RECT rcClient = { 0, 0, rcThis.right - rcThis.left, rcThis.bottom - rcThis.top }; + + CComPtr< ILayerSite > pChild; + HRESULT hRes = m_pSite->get_Child( m_pages[ m_nActive ], ePositionByID, &pChild ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pChild->put_Position( &rcClient ); + + return S_OK; +} diff --git a/Native/DecalControls/PageLayout.h b/Native/DecalControls/PageLayout.h new file mode 100644 index 0000000..eb6a451 --- /dev/null +++ b/Native/DecalControls/PageLayout.h @@ -0,0 +1,70 @@ +// PageLayout.h : Declaration of the cPageLayout + +#ifndef __PAGELAYOUT_H_ +#define __PAGELAYOUT_H_ + +#include "resource.h" // main symbols + +#include "ControlImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cPageLayout +class ATL_NO_VTABLE cPageLayout : + public CComObjectRootEx, + public CComCoClass, + public ILayoutImpl< cPageLayout, IPageLayout, &IID_IPageLayoutDisp, &LIBID_DecalControls >, + public ILayerImpl< cPageLayout >, + public IProvideClassInfo2Impl< &CLSID_PageLayout, &DIID_IControlEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyIControlEvents< cPageLayout > +{ +public: + cPageLayout() + : m_nActive( -1 ) + { + } + + // Override functions + void onChildDestroy( long nID ); + void onSchemaLoad( IView *pView, MSXML::IXMLDOMElementPtr &pElement ); + + typedef std::deque< long > cChildIDList; + cChildIDList m_pages; + + long m_nActive; + +DECLARE_REGISTRY_RESOURCEID(IDR_PAGELAYOUT) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cPageLayout) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IPageLayout) + COM_INTERFACE_ENTRY(IPageLayoutDisp) + COM_INTERFACE_ENTRY(ILayout) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cPageLayout) +CONNECTION_POINT_ENTRY(DIID_IControlEvents) +END_CONNECTION_POINT_MAP() + +public: + // IPageLayout Methods + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(CreatePage)(ILayer *pChild); + STDMETHOD(get_Active)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Active)(/*[in]*/ long newVal); + + // ILayerRender Methods + STDMETHOD(Reformat)(); +}; + +#endif //__PAGELAYOUT_H_ diff --git a/Native/DecalControls/PageLayout.rgs b/Native/DecalControls/PageLayout.rgs new file mode 100644 index 0000000..c414c9d --- /dev/null +++ b/Native/DecalControls/PageLayout.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.PageLayout.1 = s 'PageLayout Class' + { + CLSID = s '{5AD04D45-D4BF-4729-8A2E-5D37CF726CAA}' + } + DecalControls.PageLayout = s 'PageLayout Class' + { + CLSID = s '{5AD04D45-D4BF-4729-8A2E-5D37CF726CAA}' + CurVer = s 'DecalControls.PageLayout.1' + } + NoRemove CLSID + { + ForceRemove {5AD04D45-D4BF-4729-8A2E-5D37CF726CAA} = s 'PageLayout Class' + { + ProgID = s 'DecalControls.PageLayout.1' + VersionIndependentProgID = s 'DecalControls.PageLayout' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/Progress.cpp b/Native/DecalControls/Progress.cpp new file mode 100644 index 0000000..80482a4 --- /dev/null +++ b/Native/DecalControls/Progress.cpp @@ -0,0 +1,323 @@ +// Progress.cpp : Implementation of cProgress +#include "stdafx.h" +#include "DecalControls.h" +#include "Progress.h" +#include + +///////////////////////////////////////////////////////////////////////////// +// cProgress + + +STDMETHODIMP cProgress::get_Value(long *pVal) +{ + _ASSERTE( pVal ); + *pVal = m_nProgress; + + return S_OK; +} + +STDMETHODIMP cProgress::put_Value(long newVal) +{ + _ASSERTE( newVal <= m_nMaxProgress ); + m_nProgress = newVal; + m_pSite->Invalidate(); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cProgress::SchemaLoad(IView *pView, IUnknown *pSchema) +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite(&pPlugin); + + pPlugin->CreateFontSchema(14, 0, pSchema, &m_pFont); + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vValue = pElement->getAttribute(_T("value")); + _variant_t vMaxValue = pElement->getAttribute(_T("max")); + _variant_t vFaceColor = pElement->getAttribute(_T("facecolor")); + _variant_t vFillColor = pElement->getAttribute(_T("fillcolor")); + _variant_t vTextColor = pElement->getAttribute(_T("textcolor")); + _variant_t vBorderColor = pElement->getAttribute(_T("bordercolor")); + _variant_t vPreText = pElement->getAttribute(_T("pretext")); + _variant_t vPostText = pElement->getAttribute(_T("posttext")); + _variant_t vAlignment = pElement->getAttribute(_T("align")); + _variant_t vDrawText = pElement->getAttribute(_T("drawtext")); + _variant_t vBorderWidth = pElement->getAttribute(_T("border")); + + // This is a required element + _ASSERTE( vValue.vt == VT_I4 || vValue.vt == VT_I2 ); + m_nProgress = vValue; + + if( vMaxValue.vt != VT_NULL ) + { + try + { + m_nMaxProgress = static_cast< long >(vMaxValue); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vFaceColor.vt != VT_NULL ) + { + try + { + m_nFaceColor = static_cast< long >(vFaceColor); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vFillColor.vt != VT_NULL ) + { + try + { + m_nFillColor = static_cast< long >(vFillColor); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vTextColor.vt != VT_NULL ) + { + try + { + m_nTextColor = static_cast< long >(vTextColor); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vBorderColor.vt != VT_NULL ) + { + try + { + m_nBorderColor = static_cast< long >(vBorderColor); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if (vPreText.vt == VT_BSTR) + put_PreText(vPreText.bstrVal); + + if (vPostText.vt == VT_BSTR) + put_PostText(vPostText.bstrVal); + + if (vAlignment.vt == VT_BSTR) + put_Alignment(vAlignment.bstrVal); + + if( vDrawText.vt != VT_NULL ) + { + try + { + m_nDrawText = static_cast< long >(vDrawText); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vBorderWidth.vt != VT_NULL ) + { + try + { + m_nBorderWidth = static_cast< long >(vBorderWidth); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + return S_OK; +} + +STDMETHODIMP cProgress::Reformat() +{ + if (!m_pFont.p) + { + // No font was specified, create the default font + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite(&pPlugin); + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont(bstrFontName /*_bstr_t(_T( "Times New Roman" ))*/, 14, 0, &m_pFont); + } + + // build string + std::stringstream strText; + strText << m_strPre << m_nProgress << m_strPost; + m_bstrText = strText.str().c_str(); + + RECT rc; + m_pSite->get_Position(&rc); + + SIZE szText; + m_pFont->MeasureText(m_bstrText, &szText); + + // align vertically center + m_ptText.y = ((rc.bottom - rc.top) - szText.cy) / 2; + + // align left + if (m_nAlignment == 0) + m_ptText.x = m_nBorderWidth + 1; + + // align center + if (m_nAlignment == 1) + m_ptText.x = ((rc.right - rc.left) - szText.cx) / 2; + + // align right + if (m_nAlignment == 2) + m_ptText.x = ((rc.right - szText.cx) - m_nBorderWidth) - 6; + + return S_OK; +} + +STDMETHODIMP cProgress::Render(ICanvas *pCanvas) +{ + _ASSERTE( pCanvas != NULL ); + _ASSERTE( m_pSite.p != NULL ); + + RECT rcPos; + m_pSite->get_Position(&rcPos); + + RECT rcClient = { 0, 0, rcPos.right - rcPos.left, rcPos.bottom - rcPos.top }; + RECT rcCenter = { m_nBorderWidth, m_nBorderWidth, + (rcPos.right - rcPos.left) - m_nBorderWidth, + (rcPos.bottom - rcPos.top) - m_nBorderWidth }; + + pCanvas->Fill(&rcClient, m_nBorderColor); // draw border + pCanvas->Fill(&rcCenter, m_nFaceColor); // fill background + + // calculate fill width + long nPixelWidth = ((float)rcCenter.right / (float)m_nMaxProgress) * (float)m_nProgress; + + RECT rcProgress = { m_nBorderWidth, m_nBorderWidth, + nPixelWidth - m_nBorderWidth, + rcCenter.bottom }; + + pCanvas->Fill(&rcProgress, m_nFillColor); // fill progress + + // draw text + if (m_nDrawText) + m_pFont->DrawText(&m_ptText, m_bstrText, m_nTextColor, pCanvas); + + return S_OK; +} + +STDMETHODIMP cProgress::put_FaceColor(long newVal) +{ + m_nFaceColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cProgress::put_FillColor(long newVal) +{ + m_nFillColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cProgress::put_TextColor(long newVal) +{ + m_nTextColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cProgress::put_MaxValue(long newVal) +{ + m_nMaxProgress = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + + +STDMETHODIMP cProgress::put_PreText(BSTR newVal) +{ + USES_CONVERSION; + m_strPre = OLE2A(newVal); + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cProgress::put_PostText(BSTR newVal) +{ + USES_CONVERSION; + m_strPost = OLE2A(newVal); + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cProgress::put_Alignment(BSTR newVal) +{ + USES_CONVERSION; + std::string val = OLE2A(newVal); + + if (!val.compare("left")) + m_nAlignment = 0; + if (!val.compare("center")) + m_nAlignment = 1; + if (!val.compare("right")) + m_nAlignment = 2; + + m_pSite->Invalidate(); + return S_OK; +} + +STDMETHODIMP cProgress::put_DrawText(VARIANT_BOOL newVal) +{ + if (newVal == VARIANT_TRUE) + m_nDrawText = true; + else + m_nDrawText = false; + + m_pSite->Invalidate(); + return S_OK; +} + + +STDMETHODIMP cProgress::put_BorderWidth(long newVal) +{ + m_nBorderWidth = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cProgress::put_BorderColor(long newVal) +{ + m_nBorderColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} diff --git a/Native/DecalControls/Progress.h b/Native/DecalControls/Progress.h new file mode 100644 index 0000000..ad28bd6 --- /dev/null +++ b/Native/DecalControls/Progress.h @@ -0,0 +1,88 @@ +// Progress.h : Declaration of the cProgress + +#ifndef __PROGRESS_H_ +#define __PROGRESS_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cProgress +class ATL_NO_VTABLE cProgress : + public CComObjectRootEx< CComSingleThreadModel >, + public CComCoClass< cProgress, &CLSID_Progress >, + public IConnectionPointContainerImpl< cProgress >, + public IControlImpl< cProgress, IProgress, &IID_IProgress, &LIBID_DecalControls >, + public ILayerImpl< cProgress >, + public ILayerRenderImpl, + public ILayerSchema, + public IProvideClassInfo2Impl< &CLSID_Progress, &DIID_IControlEvents, &LIBID_DecalControls >, + public CProxyIControlEvents< cProgress > +{ +public: + cProgress() + { + m_nFaceColor = RGB(140, 80, 30); + m_nFillColor = RGB(220, 140, 60); + m_nProgress = 50; + m_nTextColor = RGB(240, 240, 120); + m_nBorderColor = RGB(240, 240, 120); + m_nBorderWidth = 1; + m_nMaxProgress = 100; + m_strPost = "%"; + m_nDrawText = true; + m_nAlignment = 1; // center + } + +DECLARE_REGISTRY_RESOURCEID(IDR_PROGRESS) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cProgress) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProgress) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cProgress) + CONNECTION_POINT_ENTRY(DIID_IControlEvents) +END_CONNECTION_POINT_MAP() + +public: + STDMETHOD(put_BorderColor)(/*[in]*/ long newVal); + STDMETHOD(put_BorderWidth)(/*[in]*/ long newVal); + STDMETHOD(put_PreText)(/*[in]*/ BSTR newVal); + STDMETHOD(put_DrawText)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(put_Alignment)(/*[in]*/ BSTR newVal); + STDMETHOD(put_PostText)(/*[in]*/ BSTR newVal); + STDMETHOD(put_MaxValue)(/*[in]*/ long newVal); + STDMETHOD(put_TextColor)(/*[in]*/ long newVal); + STDMETHOD(put_FillColor)(/*[in]*/ long newVal); + STDMETHOD(put_FaceColor)(/*[in]*/ long newVal); + STDMETHOD(get_Value)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Value)(/*[in]*/ long newVal); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pSchema); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)(ICanvas *pCanvas); + + long m_nProgress, m_nFaceColor, m_nTextColor, m_nFillColor, + m_nMaxProgress, m_nBorderColor, m_nBorderWidth, m_nDrawText; + std::string m_strPost, m_strPre; + POINT m_ptText; + _bstr_t m_bstrText; + int m_nAlignment; // 0 = left, 1 = center, 2 = right + CComPtr< IFontCache > m_pFont; +}; + +#endif //__PROGRESS_H_ diff --git a/Native/DecalControls/PushButton.cpp b/Native/DecalControls/PushButton.cpp new file mode 100644 index 0000000..5d5d884 --- /dev/null +++ b/Native/DecalControls/PushButton.cpp @@ -0,0 +1,382 @@ +// PushButton.cpp : Implementation of cPushButton +#include "stdafx.h" +#include "DecalControls.h" +#include "PushButton.h" + +///////////////////////////////////////////////////////////////////////////// +// cPushButton + +cPushButton::cPushButton() +: m_bPressed( VARIANT_FALSE ), +m_bMouseIn( VARIANT_FALSE ), +m_nFaceColor( RGB( 140, 80, 30 ) ), +m_nTextColor( RGB( 240, 240, 120 ) ), +m_UseFaceColor(false) // GKusnick: Render 3D outline. +{ +} + +void cPushButton::onCreate() +{ + // This control draws over it's entire area + m_pSite->put_Transparent( VARIANT_FALSE ); +} + +STDMETHODIMP cPushButton::get_Image(IImageCacheDisp **pVal) +{ + _ASSERTE( pVal != NULL ); + + if( m_pBackground.p == NULL ) + *pVal = NULL; + else + m_pBackground->QueryInterface( pVal ); + + return S_OK; +} + +STDMETHODIMP cPushButton::putref_Image(IImageCacheDisp *newVal) +{ + if( m_pBackground.p ) + m_pBackground.Release(); + + if( newVal != NULL ) + { + HRESULT hRes = newVal->QueryInterface( &m_pBackground ); + _ASSERTE( SUCCEEDED( hRes ) ); + } + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cPushButton::get_Font(IFontCacheDisp **pVal) +{ + _ASSERTE( pVal != NULL ); + + if( m_pFont.p == NULL ) + *pVal = NULL; + else + m_pFont->QueryInterface( pVal ); + + return S_OK; +} + +STDMETHODIMP cPushButton::putref_Font(IFontCacheDisp *newVal) +{ + _ASSERTE( newVal != NULL ); + + if( m_pFont.p ) + m_pFont.Release(); + + HRESULT hRes = newVal->QueryInterface( &m_pFont ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cPushButton::get_Text(BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = OLE2BSTR( m_strText ); + + return S_OK; +} + +STDMETHODIMP cPushButton::put_Text(BSTR newVal) +{ + _ASSERTE( newVal != NULL ); + + m_strText = newVal; + m_pSite->Reformat(); + m_pSite->Invalidate(); + return S_OK; +} + +STDMETHODIMP cPushButton::get_FaceColor(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nFaceColor; + + return S_OK; +} + +STDMETHODIMP cPushButton::put_FaceColor(long newVal) +{ + _ASSERTE( ( newVal & 0xFF000000L ) == 0 ); + + m_nFaceColor = newVal; + m_UseFaceColor = true; // GKusnick: Render 3D outline. + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cPushButton::get_TextColor(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nTextColor; + + return S_OK; +} + +STDMETHODIMP cPushButton::put_TextColor(long newVal) +{ + _ASSERTE( ( newVal & 0xFF000000L ) == 0 ); + + m_nTextColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cPushButton::SchemaLoad( IView *pView, IUnknown *pSchema ) +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + // Load some defaults + pPlugin->CreateFontSchema( 14, 0, pSchema, &m_pFont ); + pPlugin->LoadImageSchema( pSchema, &m_pBackground ); + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vFaceColor = pElement->getAttribute( _T( "facecolor" ) ), + vTextColor = pElement->getAttribute( _T( "textcolor" ) ), + vText = pElement->getAttribute( _T( "text" ) ), + vAntialias = pElement->getAttribute( _T( "aa" ) ); + + if( vFaceColor.vt != VT_NULL ) + { + try + { + m_nFaceColor = static_cast< long >( vFaceColor ); + m_UseFaceColor = true; // GKusnick: Render 3D outline. + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vTextColor.vt != VT_NULL ) + { + try + { + m_nTextColor = static_cast< long >( vTextColor ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vText.vt != VT_NULL ) + { + _ASSERTE( vText.vt == VT_BSTR ); + m_strText = vText.bstrVal; + } + + m_bAA = true; + if( vAntialias.vt != VT_NULL ) + { + try + { + m_bAA = static_cast< bool >( vAntialias ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + return S_OK; +} + +STDMETHODIMP cPushButton::MouseEnter(struct MouseState *) +{ + _ASSERTE( !m_bMouseIn ); + + m_bMouseIn = VARIANT_TRUE; + + if( m_bPressed ) + { + long nID; + m_pSite->get_ID( &nID ); + Fire_Hit( nID ); + + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cPushButton::MouseExit(struct MouseState *) +{ + _ASSERTE( m_bMouseIn ); + + m_bMouseIn = VARIANT_FALSE; + + if( m_bPressed ) + { + long nID; + m_pSite->get_ID( &nID ); + Fire_Unhit( nID ); + + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cPushButton::MouseDown(struct MouseState *) +{ + _ASSERTE( m_pSite != NULL ); + + long nID; + m_pSite->get_ID( &nID ); + Fire_Hit( nID ); + + m_bPressed = VARIANT_TRUE; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cPushButton::MouseUp(struct MouseState *) +{ + m_bPressed = VARIANT_FALSE; + + long nID; + m_pSite->get_ID( &nID ); + + if( m_bMouseIn ) + { + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + + // NOTE: The command may destroy the control synchronously + // so we make a stack copy of the target in case our instance is destroyed + // for the purpose of completing the command + Fire_Accepted( nID ); + Fire_Unhit( nID ); + } + else + Fire_Canceled( nID ); + + return S_OK; +} + +STDMETHODIMP cPushButton::Reformat() +{ + // Everything looks good, calculate the offset of the text + if( m_pFont.p == NULL ) + { + // No font was specified, create the default font + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + } + + RECT rc; + m_pSite->get_Position( &rc ); + + SIZE szText; + m_pFont->MeasureText( m_strText, &szText ); + + m_ptText.x = ( ( rc.right - rc.left ) - szText.cx ) / 2; + m_ptText.y = ( ( rc.bottom - rc.top ) - szText.cy ) / 2; + + return S_OK; +} + +STDMETHODIMP cPushButton::Render( ICanvas *pCanvas ) +{ + _ASSERTE( pCanvas != NULL ); + _ASSERTE( m_pSite.p != NULL ); + + RECT rcPos; + m_pSite->get_Position( &rcPos ); + + RECT rcClient = { 0, 0, rcPos.right - rcPos.left, rcPos.bottom - rcPos.top }; + bool bPressed = ( m_bPressed && m_bMouseIn ); + + // First draw the background + if( m_pBackground.p == NULL ) + pCanvas->Fill( &rcClient, m_nFaceColor ); + else + { + POINT ptOrg = { ( bPressed ) ? 1 : 0, ( bPressed ) ? 1 : 0 }; + m_pBackground->PatBlt( pCanvas, &rcClient, &ptOrg ); + } + + // Next, draw the text + POINT ptText = { ( !bPressed ) ? m_ptText.x : m_ptText.x + 1, ( !bPressed ) ? m_ptText.y : m_ptText.y + 1 }; + m_pFont->DrawTextEx( &ptText, m_strText, m_nTextColor, 0, m_bAA ? eAA : 0, pCanvas ); + + // Nerfgolem 2001.10.11 + // Do not render the 3D outline if there's a background image. + // GKusnick: Do render it if there's an explicit face color. + if( m_pBackground.p == NULL || m_UseFaceColor ) + { + // Last, draw the '3D' border - colors are generated relative to the face color + // and the design is taken from the windows button + long nBrightest = RGB( ( 255 - GetRValue( m_nFaceColor ) ) / 2 + GetRValue( m_nFaceColor ), + ( 255 - GetGValue( m_nFaceColor ) ) / 2 + GetGValue( m_nFaceColor ), + ( 255 - GetBValue( m_nFaceColor ) ) / 2 + GetBValue( m_nFaceColor ) ), + nDarkShadow = RGB( GetRValue( m_nFaceColor ) / 4, GetGValue( m_nFaceColor ) / 4, GetBValue( m_nFaceColor ) / 4 ), + nShadow = RGB( GetRValue( m_nFaceColor ) / 2, GetGValue( m_nFaceColor ) / 2, GetBValue( m_nFaceColor ) / 2 ); + + RECT rcOuterLeft = { 0, 0, 1, rcClient.bottom - 1 }, + rcInnerLeft = { 1, 1, 2, rcClient.bottom - 2 }, + rcOuterTop = { 0, 0, rcClient.right - 1, 1 }, + rcInnerTop = { 1, 1, rcClient.right - 2, 2 }, + rcOuterRight = { rcClient.right - 1, 0, rcClient.right, rcClient.bottom }, + rcInnerRight = { rcClient.right - 2, 1, rcClient.right - 1, rcClient.bottom - 1 }, + rcOuterBottom = { 0, rcClient.bottom - 1, rcClient.right, rcClient.bottom }, + rcInnerBottom = { 1, rcClient.bottom - 2, rcClient.right - 1, rcClient.bottom - 1 }; + + if( bPressed ) + { + pCanvas->Fill( &rcOuterLeft, nDarkShadow ); + pCanvas->Fill( &rcOuterTop, nDarkShadow ); + pCanvas->Fill( &rcOuterRight, nBrightest ); + pCanvas->Fill( &rcOuterBottom, nBrightest ); + + pCanvas->Fill( &rcInnerLeft, nShadow ); + pCanvas->Fill( &rcInnerTop, nShadow ); + pCanvas->Fill( &rcInnerRight, m_nFaceColor ); + pCanvas->Fill( &rcInnerBottom, m_nFaceColor ); + } + else + { + pCanvas->Fill( &rcOuterLeft, nBrightest ); + pCanvas->Fill( &rcOuterTop, nBrightest ); + pCanvas->Fill( &rcOuterRight, nDarkShadow ); + pCanvas->Fill( &rcOuterBottom, nDarkShadow ); + + pCanvas->Fill( &rcInnerLeft, m_nFaceColor ); + pCanvas->Fill( &rcInnerTop, m_nFaceColor ); + pCanvas->Fill( &rcInnerRight, nShadow ); + pCanvas->Fill( &rcInnerBottom, nShadow ); + } + } + + return S_OK; +} diff --git a/Native/DecalControls/PushButton.h b/Native/DecalControls/PushButton.h new file mode 100644 index 0000000..0347c47 --- /dev/null +++ b/Native/DecalControls/PushButton.h @@ -0,0 +1,91 @@ +// PushButton.h : Declaration of the cPushButton + +#ifndef __PUSHBUTTON_H_ +#define __PUSHBUTTON_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cPushButton +class ATL_NO_VTABLE cPushButton : + public CComObjectRootEx, + public CComCoClass, + public IControlImpl< cPushButton, IPushButton, &IID_IPushButton, &LIBID_DecalControls >, + public ILayerImpl< cPushButton >, + public ILayerRenderImpl, + public ILayerSchema, + public ILayerMouseImpl, + public IProvideClassInfo2Impl< &CLSID_PushButton, &DIID_ICommandEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyICommandEvents< cPushButton > +{ +public: + cPushButton(); + + VARIANT_BOOL m_bPressed, + m_bMouseIn; + + _bstr_t m_strText; + CComPtr< IFontCache > m_pFont; + CComPtr< IImageCache > m_pBackground; + POINT m_ptText; + + long m_nFaceColor, + m_nTextColor; + BOOL m_UseFaceColor; // GKusnick: Render 3D outline. + bool m_bAA; + + void onCreate(); + +DECLARE_REGISTRY_RESOURCEID(IDR_PUSHBUTTON) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cPushButton) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IPushButton) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cPushButton) +CONNECTION_POINT_ENTRY(DIID_ICommandEvents) +END_CONNECTION_POINT_MAP() + +public: + // IPushButton Methods + STDMETHOD(get_TextColor)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_TextColor)(/*[in]*/ long newVal); + STDMETHOD(get_FaceColor)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_FaceColor)(/*[in]*/ long newVal); + STDMETHOD(get_Text)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Text)(/*[in]*/ BSTR newVal); + STDMETHOD(get_Font)(/*[out, retval]*/ IFontCacheDisp * *pVal); + STDMETHOD(putref_Font)(/*[in]*/ IFontCacheDisp * newVal); + STDMETHOD(get_Image)(/*[out, retval]*/ IImageCacheDisp * *pVal); + STDMETHOD(putref_Image)(/*[in]*/ IImageCacheDisp * newVal); + + // ILayerMouse Methods + STDMETHOD(MouseEnter)(struct MouseState *); + STDMETHOD(MouseExit)(struct MouseState *); + STDMETHOD(MouseDown)(struct MouseState *); + STDMETHOD(MouseUp)(struct MouseState *); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)( IView *pView, IUnknown *pSchema ); +}; + +#endif //__PUSHBUTTON_H_ diff --git a/Native/DecalControls/PushButton.rgs b/Native/DecalControls/PushButton.rgs new file mode 100644 index 0000000..ccac292 --- /dev/null +++ b/Native/DecalControls/PushButton.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.PushButton.1 = s 'PushButton Class' + { + CLSID = s '{AE4525BE-81D1-40FB-9170-77172077EB49}' + } + DecalControls.PushButton = s 'PushButton Class' + { + CLSID = s '{AE4525BE-81D1-40FB-9170-77172077EB49}' + CurVer = s 'DecalControls.PushButton.1' + } + NoRemove CLSID + { + ForceRemove {AE4525BE-81D1-40FB-9170-77172077EB49} = s 'PushButton Class' + { + ProgID = s 'DecalControls.PushButton.1' + VersionIndependentProgID = s 'DecalControls.PushButton' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/Scroller.cpp b/Native/DecalControls/Scroller.cpp new file mode 100644 index 0000000..2a4329e --- /dev/null +++ b/Native/DecalControls/Scroller.cpp @@ -0,0 +1,863 @@ +// Scroller.cpp : Implementation of cScroller +#include "stdafx.h" +#include "DecalControls.h" +#include "Scroller.h" + +enum eScrollChildren +{ + eScrollerUp = 1, + eScrollerDown = 2, + eScrollerRight = 3, + eScrollerLeft = 4, + eScrollerPager = 5, + eScrollerPageUp = 6, + eScrollerPageDown = 7, + eScrollerPageLeft = 8, + eScrollerPageRight = 9, + eScrollerClient = 10, + eScrollerHThumb = 11, + eScrollerVThumb = 12 +}; + +///////////////////////////////////////////////////////////////////////////// +// cScroller + +void cScroller::onCreate() +{ + // Initialize our layout options + m_szArea.cx = 0; + m_szArea.cy = 0; + + m_szIncrement.cx = 100; + m_szIncrement.cy = 20; + + m_ptThumb.x = 0; + m_ptThumb.y = 0; + + m_bHScroll = VARIANT_FALSE; + m_bVScroll = VARIANT_FALSE; + + CComPtr< ILayer > pLayerPager; + HRESULT hRes = ::CoCreateInstance( __uuidof( Pager ), NULL, CLSCTX_INPROC_SERVER, __uuidof( ILayer ), + reinterpret_cast< void ** >( &pLayerPager ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + + LayerParams p = { eScrollerPager, { 0, 0, 0, 0 }, eRenderClipped }; + + m_pSite->CreateChild( &p, pLayerPager ); + pLayerPager->QueryInterface( &m_pPager ); + IPagerEventsImpl< PAGER_CLIENT, cScroller >::advise( m_pPager ); + + CComPtr< ILayer > pLayerUp; + hRes = ::CoCreateInstance( __uuidof( Button ), NULL, CLSCTX_INPROC_SERVER, __uuidof( ILayer ), + reinterpret_cast< void ** >( &pLayerUp ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + + p.ID = eScrollerUp; + + CComPtr< IButton > pUp; + m_pSite->CreateChild( &p, pLayerUp ); + pLayerUp->QueryInterface( &pUp); + ICommandEventsImpl< BUTTON_UP, cScroller >::advise( pUp ); + pUp->SetImages( 0, 0x06001261, 0x06001262 ); + pUp->put_Matte( RGB( 0, 0, 0 ) ); + + CComPtr< ILayer > pLayerDown; + hRes = ::CoCreateInstance( __uuidof( Button ), NULL, CLSCTX_INPROC_SERVER, __uuidof( ILayer ), + reinterpret_cast< void ** >( &pLayerDown ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + + p.ID = eScrollerDown; + + CComPtr< IButton > pDown; + m_pSite->CreateChild( &p, pLayerDown ); + pLayerDown->QueryInterface( &pDown ); + ICommandEventsImpl< BUTTON_DOWN, cScroller >::advise( pDown ); + pDown->SetImages( 0, 0x0600125E, 0x0600125F ); + pDown->put_Matte( RGB( 0, 0, 0 ) ); + + CComPtr< ILayer > pLayerLeft; + hRes = ::CoCreateInstance( __uuidof( Button ), NULL, CLSCTX_INPROC_SERVER, __uuidof( ILayer ), + reinterpret_cast< void ** >( &pLayerLeft ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + + p.ID = eScrollerLeft; + + CComPtr< IButton > pLeft; + m_pSite->CreateChild( &p, pLayerLeft ); + pLayerLeft->QueryInterface( &pLeft ); + ICommandEventsImpl< BUTTON_LEFT, cScroller >::advise( pLeft ); + pLeft->SetImages( 0, 0x06001295, 0x06001296 ); + pLeft->put_Matte( RGB( 0, 0, 0 ) ); + + CComPtr< ILayer > pLayerRight; + hRes = ::CoCreateInstance( __uuidof( Button ), NULL, CLSCTX_INPROC_SERVER, __uuidof( ILayer ), + reinterpret_cast< void ** >( &pLayerRight ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + + p.ID = eScrollerRight; + + CComPtr< IButton > pRight; + m_pSite->CreateChild( &p, pLayerRight ); + pLayerRight->QueryInterface( &pRight ); + ICommandEventsImpl< BUTTON_RIGHT, cScroller >::advise( pRight ); + pRight->SetImages( 0, 0x06001298, 0x06001299 ); + pRight->put_Matte( RGB( 0, 0, 0 ) ); + + // Positioning will occur during Reformat + + // Load the images + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->LoadBitmapPortal( 0x06001260, &m_pVScrollBack ); + pPlugin->LoadBitmapPortal( 0x06001297, &m_pHScrollBack ); +} + +void cScroller::onDestroy() +{ + m_pPager.Release(); +} + +void cScroller::constrainOffset( LPPOINT ppt ) +{ + // First check for overflow, furthest scroll should be allowed is less a + // page size + POINT ptMax = { m_szArea.cx, m_szArea.cy }; + + SIZE szViewport; + get_Viewport( &szViewport ); + + if((szViewport.cx % m_szIncrement.cx)==0) + ptMax.x -= szViewport.cx; + else + ptMax.x -= ( szViewport.cx / m_szIncrement.cx + 1) * m_szIncrement.cx; + + if((szViewport.cy % m_szIncrement.cy)==0) + ptMax.y -= szViewport.cy; + else + ptMax.y -= ( szViewport.cy / m_szIncrement.cy + 1) * m_szIncrement.cy; + + // substract the viewport (rounded up a notch) from the max scroll area + // ptMax.x -= ( szViewport.cx / m_szIncrement.cx + 1) * m_szIncrement.cx; + // ptMax.y -= ( szViewport.cy / m_szIncrement.cy + 1) * m_szIncrement.cy; + + if( ppt->x > ptMax.x ) + ppt->x = ptMax.x; + if( ppt->y > ptMax.y ) + ppt->y = ptMax.y; + + // Check for underflow (either because it was assigned too low + // or or max is too low) + if( ppt->x < 0 ) + ppt->x = 0; + if( ppt->y < 0 ) + ppt->y = 0; + +} + +#define BTN_SIZE 16 + +long cScroller::hitTest( MouseState *pMS ) +{ + if( pMS->over != this ) + return -1; + + SIZE szViewport; + + get_Viewport( &szViewport ); + + RECT rcScroll = { BTN_SIZE, BTN_SIZE, szViewport.cx - BTN_SIZE, szViewport.cy - BTN_SIZE }; + + // Check if it's on the horizontal bar + if( m_bHScroll ) + { + if( pMS->client.x > rcScroll.left && pMS->client.x < rcScroll.right && pMS->client.y > szViewport.cy ) + { + if( m_szArea.cx == szViewport.cx ) + // Special case, no scrolling if the area is the minimum size + return -1; + + // We hit the horizontal bar + if( pMS->client.x < ( m_ptThumb.x + BTN_SIZE ) ) + // Hit before the thumb + return eScrollerPageLeft; + else if( pMS->client.x > ( m_ptThumb.x + BTN_SIZE * 2 ) ) + // Hit after the thumb + return eScrollerPageRight; + + // Hit the thumb + return eScrollerHThumb; + } + } + + // Check if it's on the vertical bar + if( m_bVScroll ) + { + if( pMS->client.y > rcScroll.top && pMS->client.y < rcScroll.bottom && pMS->client.x > szViewport.cx ) + { + if( m_szArea.cy == szViewport.cy ) + // Special case, no scrolling if the area is the minimum size + return -1; + + // We hit the vertical bar + if( pMS->client.y < ( m_ptThumb.y + BTN_SIZE ) ) + // Hit above the thumb + return eScrollerPageUp; + else if( pMS->client.y > ( m_ptThumb.y + BTN_SIZE * 2 ) ) + // Hit below thumb + return eScrollerPageDown; + + // Hit the v thumb + return eScrollerVThumb; + } + } + + return -1; +} + +STDMETHODIMP cScroller::Render(ICanvas *pCanvas) +{ + SIZE szViewport; + get_Viewport( &szViewport ); + + // Fill in the scrollbars as neccessary + static POINT ptOff = { 0, 0 }; + + CComPtr< IPluginSite > pPluginSite; + m_pSite->get_PluginSite( &pPluginSite ); + + SIZE szIcon = { BTN_SIZE, BTN_SIZE }; + CComPtr< IIconCache > pIconCache; + pPluginSite->GetIconCache( &szIcon, &pIconCache ); + + if( m_bHScroll ) + { + RECT rcHScroll = { BTN_SIZE, szViewport.cy, szViewport.cx - BTN_SIZE, szViewport.cy + BTN_SIZE }; + m_pHScrollBack->PatBlt( pCanvas, &rcHScroll, &ptOff ); + + if( m_szArea.cx != szViewport.cx ) + { + // Draw the H thumb + POINT ptHThumb = { BTN_SIZE + m_ptThumb.x, szViewport.cy }; + RECT rcThumb = { ptHThumb.x, ptHThumb.y, ptHThumb.x + BTN_SIZE, ptHThumb.y + BTN_SIZE }; + pCanvas->Fill( &rcThumb, RGB( 0, 0, 0 ) ); + pIconCache->DrawIcon( &ptHThumb, ( m_nCurrentCommand == eScrollerHThumb ) ? 0x06001264 : 0x06001263, 0, pCanvas ); + } + } + + if( m_bVScroll ) + { + RECT rcVScroll = { szViewport.cx, BTN_SIZE, szViewport.cx + BTN_SIZE, szViewport.cy - BTN_SIZE }; + m_pVScrollBack->PatBlt( pCanvas, &rcVScroll, &ptOff ); + + if( m_szArea.cy != szViewport.cy ) + { + // Draw the V thumb + POINT ptVThumb = { szViewport.cx, BTN_SIZE + m_ptThumb.y }; + RECT rcThumb = { ptVThumb.x, ptVThumb.y, ptVThumb.x + BTN_SIZE, ptVThumb.y + BTN_SIZE }; + pCanvas->Fill( &rcThumb, RGB( 0, 0, 0 ) ); + pIconCache->DrawIcon( &ptVThumb, ( m_nCurrentCommand == eScrollerVThumb ) ? 0x06001264 : 0x06001263, 0, pCanvas ); + } + } + + if( m_bHScroll && m_bVScroll ) + { + // Draw the little corner piece + RECT rcCorner = { szViewport.cx, szViewport.cy, szViewport.cx + BTN_SIZE, szViewport.cy + BTN_SIZE }; + pCanvas->Fill( &rcCorner, RGB( 130, 100, 80 ) ); + } + + return S_OK; +} + +STDMETHODIMP cScroller::Reformat() +{ + SIZE szViewport; + get_Viewport( &szViewport ); + + CComPtr< ILayerSite > pPagerSite; + HRESULT hRes = m_pSite->get_Child( eScrollerPager, ePositionByID, &pPagerSite ); + + RECT rcPager = { 0, 0, szViewport.cx, szViewport.cy }; + pPagerSite->put_Position( &rcPager ); + + CComPtr< ILayerSite > pClientSite; + pPagerSite->get_Child( eScrollerClient, ePositionByID, &pClientSite ); + + RECT rcClient = { 0, 0, m_szArea.cx, m_szArea.cy }; + pClientSite->put_Position( &rcClient ); + + CComPtr< ILayerSite > pUp, pDown, pLeft, pRight; + + m_pSite->get_Child( eScrollerUp, ePositionByID, &pUp ); + m_pSite->get_Child( eScrollerDown, ePositionByID, &pDown ); + m_pSite->get_Child( eScrollerLeft, ePositionByID, &pLeft ); + m_pSite->get_Child( eScrollerRight, ePositionByID, &pRight ); + + static RECT rcHidden = { 0, 0, 0, 0 }; + + if( m_bHScroll ) + { + RECT rcLeft = { 0, szViewport.cy, BTN_SIZE, szViewport.cy + BTN_SIZE }, + rcRight = { szViewport.cx - BTN_SIZE, szViewport.cy, szViewport.cx, szViewport.cy + BTN_SIZE }; + + pLeft->put_Position( &rcLeft ); + pRight->put_Position( &rcRight ); + } + else + { + pLeft->put_Position( &rcHidden ); + pRight->put_Position( &rcHidden ); + } + + if( m_bVScroll ) + { + RECT rcUp = { szViewport.cx, 0, szViewport.cx + BTN_SIZE, BTN_SIZE }, + rcDown = { szViewport.cx, szViewport.cy - BTN_SIZE, szViewport.cx + BTN_SIZE, szViewport.cy }; + + pUp->put_Position( &rcUp ); + pDown->put_Position( &rcDown ); + } + else + { + pUp->put_Position( &rcHidden ); + pDown->put_Position( &rcHidden ); + } + + // Calculate the size of the page increments + m_szPage.cx = ( szViewport.cx / m_szIncrement.cx ) * m_szIncrement.cx; + m_szPage.cy = ( szViewport.cy / m_szIncrement.cy ) * m_szIncrement.cy; + + return S_OK; +} + +void cScroller::onButtonHit(long nID) +{ + m_pPager->put_Command( nID ); +} + +void cScroller::onButtonUnhit(long) +{ + m_pPager->FinishCommand(); +} + +VARIANT_BOOL cScroller::onClientGetNextPosition(long nID, long nCommand, long *pnX, long *pnY) +{ + POINT ptDest; + m_pPager->get_Offset( &ptDest ); + + POINT ptOriginal = ptDest; + + switch( nCommand ) + { + case eScrollerUp: + ptDest.y -= m_szIncrement.cy; + break; + + case eScrollerDown: + ptDest.y += m_szIncrement.cy; + break; + + case eScrollerPageUp: + ptDest.y -= m_szPage.cy; + break; + + case eScrollerPageDown: + ptDest.y += m_szPage.cy; + break; + + case eScrollerLeft: + ptDest.x -= m_szIncrement.cx; + break; + + case eScrollerRight: + ptDest.x += m_szIncrement.cx; + break; + + case eScrollerPageLeft: + ptDest.x -= m_szPage.cx; + break; + + case eScrollerPageRight: + ptDest.x += m_szPage.cx; + break; + + default: + // Unknown scrolling command + _ASSERTE( FALSE ); + } + + constrainOffset( &ptDest ); + + if( ptDest.x == ptOriginal.x && ptDest.y == ptOriginal.y ) + // We didn't move this cycle - do not continue + return VARIANT_FALSE; + + *pnX = ptDest.x; + *pnY = ptDest.y; + + return VARIANT_TRUE; +} + +void cScroller::onClientChange( long nID, long, long nX, long nY ) +{ + _ASSERTE( nID == eScrollerPager ); + + // Convert these values to a thumb-like position + SIZE szViewport; + get_Viewport( &szViewport ); + + SIZE szScroll = szViewport; + szScroll.cx -= BTN_SIZE * 3; + szScroll.cy -= BTN_SIZE * 3; + + // The viewport is now the size of the thumb ranges + m_ptThumb.x = static_cast< long >( ( ( m_szArea.cx - szViewport.cx ) != 0 ) ? static_cast< double >( nX * szScroll.cx ) / static_cast< double >( m_szArea.cx - szViewport.cx ) : 0.0 ); + m_ptThumb.y = static_cast< long >( ( ( m_szArea.cy - szViewport.cy ) != 0 ) ? static_cast< double >( nY * szScroll.cy ) / static_cast< double >( m_szArea.cy - szViewport.cy ) : 0.0 ); + + if( m_ptThumb.x > szScroll.cx || nX >= ( m_szArea.cx - szViewport.cx - m_szIncrement.cy ) ) + m_ptThumb.x = szScroll.cx; + if( m_ptThumb.y > szScroll.cy || nY >= ( m_szArea.cy - szViewport.cy - m_szIncrement.cy ) ) + m_ptThumb.y = szScroll.cy; + + if( m_ptThumb.x < 0 ) + m_ptThumb.x = 0; + if( m_ptThumb.y < 0 ) + m_ptThumb.y = 0; + + // Check if the thumb moving has canceled a mouse action + switch( m_nCurrentCommand ) + { + case eScrollerPageUp: + case eScrollerPageDown: + case eScrollerPageLeft: + case eScrollerPageRight: + { + MouseState ms = { this, { 0, 0 }, { m_ptMouseLast.x, m_ptMouseLast.y }, VARIANT_FALSE, VARIANT_FALSE }; + if( hitTest( &ms ) != m_nCurrentCommand ) + m_pPager->FinishCommand(); + } + break; + } + + // Draw next frame + m_pSite->Invalidate(); + + long nIDThis; + m_pSite->get_ID( &nIDThis ); + Fire_Change( nIDThis, nX, nY ); +} + +STDMETHODIMP cScroller::get_Viewport(LPSIZE pVal) +{ + _ASSERTE( pVal != NULL ); + + RECT rc; + m_pSite->get_Position( &rc ); + + pVal->cx = ( rc.right - rc.left ) - ( ( m_bVScroll ) ? BTN_SIZE : 0 ); + pVal->cy = ( rc.bottom - rc.top ) - ( ( m_bHScroll ) ? BTN_SIZE : 0 ); + + return S_OK; +} + +STDMETHODIMP cScroller::get_Area(LPSIZE pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_szArea; + + return S_OK; +} + +STDMETHODIMP cScroller::put_Area(LPSIZE newVal) +{ + _ASSERTE( newVal != NULL ); + //_ASSERTE( newVal->cx >= 0 && newVal->cy >= 0 ); + + // Now this area will have to be rounded up to an increment or + // a page size + SIZE szViewport; + get_Viewport( &szViewport ); + + if( newVal->cx < szViewport.cx ) + // This view is thinner than the viewport, set it to the minimum + newVal->cx = szViewport.cx; + else if( m_bHScroll ) + if((szViewport.cx % m_szIncrement.cx)!=0) + newVal->cx += m_szIncrement.cx - ( newVal->cx % m_szIncrement.cx ); // Make sure there is an extra line so we don't scroll off the edge + + // Repeat for y-scoord + if( newVal->cy < szViewport.cy ) + newVal->cy = szViewport.cy; + else if( m_bVScroll ) + if((szViewport.cy % m_szIncrement.cy)!=0) + newVal->cy += m_szIncrement.cy - ( newVal->cy % m_szIncrement.cy ); + + m_szArea = *newVal; + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cScroller::get_HorizontalEnabled(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_bHScroll; + + return S_OK; +} + +STDMETHODIMP cScroller::put_HorizontalEnabled(VARIANT_BOOL newVal) +{ + if( newVal != m_bHScroll ) + { + m_bHScroll = newVal; + m_pSite->Reformat(); + } + + return S_OK; +} + +STDMETHODIMP cScroller::get_VerticalEnabled(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_bVScroll; + + return S_OK; +} + +STDMETHODIMP cScroller::put_VerticalEnabled(VARIANT_BOOL newVal) +{ + if( newVal != m_bVScroll ) + { + m_bVScroll = newVal; + m_pSite->Reformat(); + } + + return S_OK; +} + +STDMETHODIMP cScroller::CreateClient(ILayer *pChild) +{ + CComPtr< ILayerSite > pPagerSite; + HRESULT hRes = m_pSite->get_Child( eScrollerPager, ePositionByID, &pPagerSite ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + LayerParams lp = { eScrollerClient, { 0, 0, 0, 0 }, eRenderClipped }; + + return pPagerSite->CreateChild( &lp, pChild ); +} + +STDMETHODIMP cScroller::get_Offset(LPPOINT pVal) +{ + _ASSERTE( pVal != NULL ); + + POINT ptTrueOff; + m_pPager->get_Offset( &ptTrueOff ); + + pVal->x = ptTrueOff.x / m_szIncrement.cx; + pVal->y = ptTrueOff.y / m_szIncrement.cy; + + return S_OK; +} + +STDMETHODIMP cScroller::put_Offset(LPPOINT newVal) +{ + _ASSERTE( newVal != NULL ); + _ASSERTE( newVal->x >= 0 && newVal->y >= 0 ); + + POINT ptTrueOff = { newVal->x * m_szIncrement.cx, newVal->y * m_szIncrement.cy }; + + constrainOffset( &ptTrueOff ); + m_pPager->put_Offset( &ptTrueOff ); + + return S_OK; +} + +STDMETHODIMP cScroller::ScrollTo(LPPOINT ptOffset) +{ + _ASSERTE( ptOffset != NULL ); + _ASSERTE( ptOffset->x >= 0 && ptOffset->y >= 0 ); + + POINT ptTrueOff = { ptOffset->x * m_szIncrement.cx, ptOffset->y * m_szIncrement.cy }; + + constrainOffset( &ptTrueOff ); + m_pPager->ScrollTo( &ptTrueOff ); + + return S_OK; +} + +STDMETHODIMP cScroller::get_Increments(LPSIZE pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_szIncrement; + + return S_OK; +} + +STDMETHODIMP cScroller::put_Increments(LPSIZE newVal) +{ + _ASSERTE( newVal != NULL ); + _ASSERTE( newVal->cx > 0 && newVal->cy > 0 ); + + // Assign the new increments + m_szIncrement = *newVal; + + // Align the current position to the new position + POINT ptCurrent; + m_pPager->get_Offset( &ptCurrent ); + + ptCurrent.x = ( ptCurrent.x / newVal->cx ) * newVal->cx; + ptCurrent.y = ( ptCurrent.y / newVal->cy ) * newVal->cy; + + constrainOffset( &ptCurrent ); + m_pPager->put_Offset( &ptCurrent ); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cScroller::MouseDown( MouseState *pMS ) +{ + m_nCurrentCommand = hitTest( pMS ); + + if( m_nCurrentCommand == -1 ) + return S_OK; + + switch( m_nCurrentCommand ) + { + case eScrollerHThumb: + m_nScreenStart = pMS->screen.x; + m_nThumbStart = m_ptThumb.x; + break; + + case eScrollerVThumb: + m_nScreenStart = pMS->screen.y; + m_nThumbStart = m_ptThumb.y; + break; + + case eScrollerPageUp: + case eScrollerPageDown: + case eScrollerPageLeft: + case eScrollerPageRight: + m_ptMouseLast = pMS->client; + m_pPager->put_Command( m_nCurrentCommand ); + break; + } + + m_pSite->Invalidate(); + return S_OK; +} + +STDMETHODIMP cScroller::MouseUp( MouseState *pMS ) +{ + m_nCurrentCommand = -1; + + // Make sure there are no more commands in the pager + m_pPager->FinishCommand(); + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cScroller::MouseMove( MouseState *pMS ) +{ + if( m_nCurrentCommand == -1 ) + // No command, so nothgin to do + return S_OK; + + SIZE szViewport; + get_Viewport( &szViewport ); + SIZE szScroller = { szViewport.cx - BTN_SIZE * 3, szViewport.cy - BTN_SIZE * 3 }; + + POINT ptOffset; + m_pPager->get_Offset( &ptOffset ); + + switch( m_nCurrentCommand ) + { + case eScrollerPageUp: + case eScrollerPageDown: + case eScrollerPageLeft: + case eScrollerPageRight: + { + if( hitTest( pMS ) == m_nCurrentCommand ) + m_pPager->put_Command( m_nCurrentCommand ); + else + m_pPager->FinishCommand(); + m_ptMouseLast = pMS->client; + } + break; + + case eScrollerHThumb: + { + long nPos = m_nThumbStart + ( pMS->screen.x - m_nScreenStart ); + + // Make sure it's bigger than 0 + if( nPos < 0 ) + nPos = 0; + + // Convert this to an actual position + ptOffset.x = nPos * ( m_szArea.cx - szViewport.cx ) / szScroller.cx; + + // Align to the nearest line + ptOffset.x -= ptOffset.x % m_szIncrement.cx; + + // Set the position, pager callback will set the thumb position + constrainOffset( &ptOffset ); + m_pPager->put_Offset( &ptOffset ); + } + break; + + case eScrollerVThumb: + { + long nPos = m_nThumbStart + ( pMS->screen.y - m_nScreenStart ); + + // Make sure it's bigger than 0 + if( nPos < 0 ) + nPos = 0; + + // Convert this to an actual position + ptOffset.y = nPos * ( m_szArea.cy - szViewport.cy ) / szScroller.cy; + + // Align to the nearest line + ptOffset.y -= ptOffset.y % m_szIncrement.cy; + + // Set the position, pager callback will set the thumb position + constrainOffset( &ptOffset ); + m_pPager->put_Offset( &ptOffset ); + } + break; + } + + return S_OK; +} + +HRESULT cScroller::SchemaLoad( IView *pView, IUnknown *pXMLElement ) +{ + MSXML::IXMLDOMElementPtr pElement = pXMLElement; + + _variant_t vHScroll = pElement->getAttribute( _T( "hscroll" ) ), + vVScroll = pElement->getAttribute( _T( "vscroll" ) ), + vAreaWidth = pElement->getAttribute( _T( "areawidth" ) ), + vAreaHeight = pElement->getAttribute( _T( "areaheight" ) ), + vIncrementX = pElement->getAttribute( _T( "incrementx" ) ), + vIncrementY = pElement->getAttribute( _T( "incrementy" ) ); + + // Do the client + MSXML::IXMLDOMElementPtr pClient = pElement->selectSingleNode( _T( "control" ) ); + if( pClient.GetInterfacePtr() != NULL ) + { + // Recurse and load the client + CComPtr< ILayerSite > pPager; + m_pSite->get_Child( eScrollerPager, ePositionByID, &pPager ); + long nAssigned; + pView->LoadControl( pPager, eScrollerClient, pClient, &nAssigned ); + } + + // First enable the scroll bars + if( vHScroll.vt != VT_NULL ) + { + try + { + m_bHScroll = static_cast< bool >( vHScroll ) ? VARIANT_TRUE : VARIANT_FALSE; + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vVScroll.vt != VT_NULL ) + { + try + { + m_bVScroll = static_cast< bool >( vVScroll ) ? VARIANT_TRUE : VARIANT_FALSE; + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + // Next set the increment sizes + if( vIncrementX.vt != VT_NULL ) + { + try + { + m_szIncrement.cx = static_cast< long >( vIncrementX ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vIncrementY.vt != VT_NULL ) + { + try + { + m_szIncrement.cy = static_cast< long >( vIncrementY ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + // Last, set the area + SIZE szArea = m_szArea; + if( vAreaWidth.vt != VT_NULL ) + { + try + { + szArea.cx = static_cast< long >( vAreaWidth ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vAreaHeight.vt != VT_NULL ) + { + try + { + szArea.cy = static_cast< long >( vAreaHeight ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + put_Area( &szArea ); + + return S_OK; +} + +STDMETHODIMP cScroller::ResetScroller() +{ + + POINT ptCurrent; + ptCurrent.x = 0; + ptCurrent.y = 0; + constrainOffset( &ptCurrent ); + m_pPager->put_Offset( &ptCurrent ); + m_ptThumb.x =0; + m_ptThumb.y =0; + + return S_OK; +} diff --git a/Native/DecalControls/Scroller.h b/Native/DecalControls/Scroller.h new file mode 100644 index 0000000..3cf201e --- /dev/null +++ b/Native/DecalControls/Scroller.h @@ -0,0 +1,139 @@ +// Scroller.h : Declaration of the cScroller + +#ifndef __SCROLLER_H_ +#define __SCROLLER_H_ + +#include "resource.h" // main symbols +#include "SinkImpl.h" +#include "DecalControlsCP.h" + +#define PAGER_CLIENT 1 +#define BUTTON_LEFT 2 +#define BUTTON_RIGHT 3 +#define BUTTON_UP 4 +#define BUTTON_DOWN 5 + +///////////////////////////////////////////////////////////////////////////// +// cScroller +class ATL_NO_VTABLE cScroller : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public ILayerImpl< cScroller >, + public ILayerRenderImpl, + public ILayerMouseImpl, + public IProvideClassInfo2Impl< &CLSID_Scroller, &DIID_IScrollerEvents, &LIBID_DecalControls >, + public IControlImpl< cScroller, IScroller, &IID_IControl, &LIBID_DecalPlugins >, + public ICommandEventsImpl< BUTTON_LEFT, cScroller >, + public ICommandEventsImpl< BUTTON_RIGHT, cScroller >, + public ICommandEventsImpl< BUTTON_UP, cScroller >, + public ICommandEventsImpl< BUTTON_DOWN, cScroller >, + public IPagerEventsImpl< PAGER_CLIENT, cScroller >, + public ILayerSchema, + public CProxyIScrollerEvents< cScroller > +{ +public: + cScroller() + : m_nCurrentCommand( -1 ) + { + } + + CComPtr< IPager > m_pPager; + + CComPtr< IImageCache > m_pHScrollBack; + CComPtr< IImageCache > m_pVScrollBack; + + SIZE m_szArea; + SIZE m_szIncrement; + SIZE m_szPage; + POINT m_ptThumb; + + // Members for live dragging of the thumbs + long m_nCurrentCommand, + m_nScreenStart, + m_nThumbStart; + POINT m_ptMouseLast; + + VARIANT_BOOL m_bHScroll, + m_bVScroll; + + void onCreate(); + void onDestroy(); + + // Helper functions + long hitTest( MouseState *pMS ); + void constrainOffset( LPPOINT ppt ); + +DECLARE_REGISTRY_RESOURCEID(IDR_SCROLLER) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cScroller) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IScroller) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cScroller) +CONNECTION_POINT_ENTRY(DIID_IScrollerEvents) +END_CONNECTION_POINT_MAP() + +BEGIN_SINK_MAP(cScroller) + SINK_ENTRY_EX( PAGER_CLIENT, DIID_IPagerEvents, DISPID_CHANGE, onClientChange ) + SINK_ENTRY_EX( PAGER_CLIENT, DIID_IPagerEvents, DISPID_GETNEXTPOSITION, onClientGetNextPosition ) + SINK_ENTRY_EX( BUTTON_UP, DIID_ICommandEvents, DISPID_HIT, onButtonHit ) + SINK_ENTRY_EX( BUTTON_UP, DIID_ICommandEvents, DISPID_UNHIT, onButtonUnhit ) + SINK_ENTRY_EX( BUTTON_DOWN, DIID_ICommandEvents, DISPID_HIT, onButtonHit ) + SINK_ENTRY_EX( BUTTON_DOWN, DIID_ICommandEvents, DISPID_UNHIT, onButtonUnhit ) + SINK_ENTRY_EX( BUTTON_LEFT, DIID_ICommandEvents, DISPID_HIT, onButtonHit ) + SINK_ENTRY_EX( BUTTON_LEFT, DIID_ICommandEvents, DISPID_UNHIT, onButtonUnhit ) + SINK_ENTRY_EX( BUTTON_RIGHT, DIID_ICommandEvents, DISPID_HIT, onButtonHit ) + SINK_ENTRY_EX( BUTTON_RIGHT, DIID_ICommandEvents, DISPID_UNHIT, onButtonUnhit ) +END_SINK_MAP() + +public: + STDMETHOD(ResetScroller)(); + // IScroller Methods + STDMETHOD(get_Viewport)(/*[out, retval]*/ LPSIZE pVal); + STDMETHOD(get_Area)(/*[out, retval]*/ LPSIZE pVal); + STDMETHOD(put_Area)(/*[in]*/ LPSIZE newVal); + STDMETHOD(get_HorizontalEnabled)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_HorizontalEnabled)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_VerticalEnabled)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_VerticalEnabled)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(CreateClient)(ILayer *pChild); + STDMETHOD(get_Offset)(/*[out, retval]*/ LPPOINT pVal); + STDMETHOD(put_Offset)(/*[in]*/ LPPOINT newVal); + STDMETHOD(ScrollTo)(LPPOINT ptOffset); + STDMETHOD(get_Increments)(/*[out, retval]*/ LPSIZE pVal); + STDMETHOD(put_Increments)(/*[in]*/ LPSIZE newVal); + + // ILayerRender Methods + STDMETHOD(Render)(ICanvas *pCanvas); + STDMETHOD(Reformat)(); + + // ICommandEvents Methods + void __stdcall onButtonHit( long nID ); + void __stdcall onButtonUnhit( long nID ); + + // IPagerEvents Methods + void __stdcall onClientChange( long nID, long nCommand, long nX, long nY ); + VARIANT_BOOL __stdcall onClientGetNextPosition( long nID, long nCommand, long *pnX, long *pnY ); + + // ILayerMouse Methods + STDMETHOD(MouseDown)(MouseState *pMS); + STDMETHOD(MouseUp)(MouseState *pMS); + STDMETHOD(MouseMove)(MouseState *pMS); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pXMLElement); +}; + +#endif //__SCROLLER_H_ diff --git a/Native/DecalControls/Scroller.rgs b/Native/DecalControls/Scroller.rgs new file mode 100644 index 0000000..fa79900 --- /dev/null +++ b/Native/DecalControls/Scroller.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Scroller.1 = s 'DecalControls Scroller' + { + CLSID = s '{8FC80D21-1731-4816-9AD3-B0364D5F2C27}' + } + DecalControls.Scroller = s 'DecalControls Scroller' + { + CLSID = s '{8FC80D21-1731-4816-9AD3-B0364D5F2C27}' + CurVer = s 'DecalControls.Scroller.1' + } + NoRemove CLSID + { + ForceRemove {8FC80D21-1731-4816-9AD3-B0364D5F2C27} = s 'DecalControls Scroller' + { + ProgID = s 'DecalControls.Scroller.1' + VersionIndependentProgID = s 'DecalControls.Scroller' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/DecalControls/Slider.cpp b/Native/DecalControls/Slider.cpp new file mode 100644 index 0000000..bb27da6 --- /dev/null +++ b/Native/DecalControls/Slider.cpp @@ -0,0 +1,515 @@ +#include "stdafx.h"// Slider.cpp : Implementation of cSlider +#include +#include "DecalControls.h" +#include "Slider.h" + +///////////////////////////////////////////////////////////////////////////// +// cSlider + +cSlider::cSlider() : m_nTextColor(RGB(0, 0, 0)), + m_bMouseIn(VARIANT_FALSE), + m_bGrappled(VARIANT_FALSE), + m_nMinimum(0), + m_nMaximum(100), + m_nMinSliderColor( RGB(200,0,0) ), + m_nMaxSliderColor( RGB(0,200,0) ), + m_nSliderPos(0), + m_strTextLeft(NULL), + m_strTextRight(NULL), + m_bVertical(VARIANT_FALSE) { +} + +cSlider::~cSlider() { + if (m_strTextLeft) + free(m_strTextLeft); + + if (m_strTextRight) + free(m_strTextRight); +} + +STDMETHODIMP cSlider::get_Font(IFontCacheDisp **pVal) { + _ASSERTE(pVal != NULL); + + if (m_pFont.p == NULL) + *pVal = NULL; + else + m_pFont->QueryInterface(pVal); + + return S_OK; +} + +STDMETHODIMP cSlider::putref_Font(IFontCacheDisp *newVal) { + _ASSERTE(newVal != NULL); + + if (m_pFont.p) + m_pFont.Release(); + + HRESULT hRes = newVal->QueryInterface(&m_pFont); + + _ASSERTE(SUCCEEDED(hRes)); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cSlider::get_TextColor(long *pVal) { + _ASSERTE(pVal != NULL); + + *pVal = m_nTextColor; + + return S_OK; +} + +STDMETHODIMP cSlider::put_TextColor(long newVal) { + _ASSERTE((newVal & 0xFF000000L) == 0); + + m_nTextColor = newVal; + m_pSite->Invalidate(); + Reformat(); + + return S_OK; +} + + +STDMETHODIMP cSlider::get_SliderPosition(long *pVal) { + _ASSERTE(pVal != NULL); + + *pVal = m_nSliderPos; + + return S_OK; +} + +STDMETHODIMP cSlider::put_SliderPosition(long newVal) { + if (m_nSliderPos == newVal) + return S_OK; + + if (newVal < m_nMinimum || newVal > m_nMaximum) + return S_FALSE; + + m_nSliderPos = newVal; + Reformat(); + m_pSite->Invalidate(); + + + return S_OK; +} + +STDMETHODIMP cSlider::get_Minimum(long *pVal) { + _ASSERTE(pVal != NULL); + + *pVal = m_nMinimum; + + return S_OK; +} + +STDMETHODIMP cSlider::put_Minimum(long newVal) { + if (m_nMinimum == newVal) + return S_OK; + + m_nMinimum = newVal; + Reformat(); + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cSlider::get_Maximum(long *pVal) { + _ASSERTE(pVal != NULL); + + *pVal = m_nMaximum; + + return S_OK; +} + +STDMETHODIMP cSlider::put_Maximum(long newVal) { + if (m_nMaximum == newVal) + return S_OK; + + m_nMaximum = newVal; + Reformat(); + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cSlider::SchemaLoad(IView *pView, IUnknown *pSchema) +{ + // First attempt to load the font + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->CreateFontSchema(14, 0, pSchema, &m_pFont); + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vTextColor = pElement->getAttribute(_T("textcolor")), + vMinSliderColor = pElement->getAttribute(_T("mincolor")), + vMaxSliderColor = pElement->getAttribute(_T("maxcolor")), + vVertical = pElement->getAttribute(_T("vertical")), + vDefault = pElement->getAttribute(_T("default")), + vMaximum = pElement->getAttribute(_T("maximum")), + vMinimum = pElement->getAttribute(_T("minimum")), + vName = pElement->getAttribute(_T("name")); + + // Maximum must exist + _ASSERTE(vMaximum.vt == VT_INT); + + if (vTextColor.vt != VT_NULL) { + try { + m_nTextColor = static_cast(vTextColor); + } catch(...) { + // Type conversion error + _ASSERTE(FALSE); + } + } + + if (vMinSliderColor.vt != VT_NULL) { + try { + _bstr_t szWhat = vMinSliderColor.bstrVal; + m_nMinSliderColor = wcstoul( szWhat, 0, 16 ); + } catch( ... ) { + // Type conversion error + _ASSERTE(FALSE); + } + } + + if (vMaxSliderColor.vt != VT_NULL) { + try { + _bstr_t szWhat = vMaxSliderColor.bstrVal; + m_nMaxSliderColor = wcstoul( szWhat, 0, 16 ); + } catch( ... ) { + // Type conversion error + _ASSERTE(FALSE); + } + } + + if (vVertical.vt != VT_NULL) { + try { + m_bVertical = (static_cast(vVertical)) ? VARIANT_TRUE : VARIANT_FALSE; + } catch( ... ) { + // Type conversion error + _ASSERTE(FALSE); + } + } + + if (vMaximum.vt != VT_NULL) { + try { + m_nMaximum = static_cast(vMaximum); + } catch( ... ) { + // Type conversion error + _ASSERTE(FALSE); + } + } + + if (vMinimum.vt != VT_NULL) { + try { + m_nMinimum = static_cast(vMinimum); + } catch( ... ) { + // Type conversion error + _ASSERTE(FALSE); + } + } + + if (vDefault.vt != VT_NULL) { + try { + m_nSliderPos = static_cast(vDefault); + } catch( ... ) { + m_nSliderPos = m_nMinimum; + } + } + +/* fprintf( f, "name - %s\n", OLE2A(vName.bstrVal) ); + fprintf( f, "textcolor - %08X\n", m_nTextColor ); + fprintf( f, "mincolor - %08X\n", m_nMinSliderColor ); + fprintf( f, "maxcolor - %08X\n", m_nMaxSliderColor ); + fprintf( f, "vertical - %X\n", m_bVertical ); + fprintf( f, "maximum - %08X\n", m_nMaximum ); + fprintf( f, "minimum - %08X\n\n", m_nMinimum ); */ + +/* // it's a pain in the ass that we need set the min and max for them to work, aye? let's fix it + RECT rc; + m_pSite->get_Position(&rc); + + long siteHHalf = (rc.bottom - rc.top) / 2; + + // The background bar + m_rcBackground.left = 0; + m_rcBackground.top = siteHHalf - 4; + m_rcBackground.bottom = siteHHalf + 6; + m_rcBackground.right = rc.right - rc.left; + + // The middle bar + m_rcBar.top = siteHHalf; + m_rcBar.left = 0; + m_rcBar.bottom = siteHHalf + 3; + m_rcBar.right = rc.right - rc.left; + + // Ensure sane slider position + if (m_nSliderPos < m_nMinimum) + m_nSliderPos = m_nMinimum; + + if (m_nSliderPos > m_nMaximum) + m_nSliderPos = m_nMaximum; + + long siteDiff = abs(m_rcBar.right - m_rcBar.left); + long extentDiff = abs(m_nMaximum - m_nMinimum); + long valDiff = m_nSliderPos - m_nMinimum; + + if (valDiff == 0) { + m_ptSlider.x = m_rcBar.left; + + } else { + long diff = (long)(((float)valDiff / (float)extentDiff) * (float)siteDiff); + + m_ptSlider.x = m_rcBar.left + diff; + + if (m_ptSlider.x >= m_rcBar.right - 6) + m_ptSlider.x = m_rcBar.right - 6; + } + + m_ptSlider.y = siteHHalf - 5; +*/ + +// fclose( f ); + return S_OK; +} + +STDMETHODIMP cSlider::Reformat() { + USES_CONVERSION; + + char strTemp[16]; + + if (m_strTextLeft) + free(m_strTextLeft); + + if (m_strTextRight) + free(m_strTextRight); + + _snprintf(strTemp, 15, "%i", m_nMinimum); + m_strTextLeft = strdup(strTemp); + + _snprintf(strTemp, 15, "%i", m_nMaximum); + m_strTextRight = strdup(strTemp); + + if (m_pFont.p == NULL) { + // No font was specified, create the default font + CComPtr pPlugin; + m_pSite->get_PluginSite(&pPlugin); + + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont(bstrFontName /*_bstr_t(_T("Times New Roman"))*/, 14, 0, &m_pFont); + } + + RECT rc; + m_pSite->get_Position(&rc); + + SIZE textRight; + + m_pFont->MeasureText(_bstr_t(m_strTextRight), &textRight); + + long siteHHalf = (rc.bottom - rc.top) / 2; + + // The background bar + m_rcBackground.left = 0; + m_rcBackground.top = siteHHalf - 4; + m_rcBackground.bottom = siteHHalf + 6; + m_rcBackground.right = rc.right - rc.left; + + // The middle bar + m_rcBar.top = siteHHalf; + m_rcBar.left = 0; + m_rcBar.bottom = siteHHalf + 3; + m_rcBar.right = rc.right - rc.left; + + m_ptLeftText.x = m_rcBackground.left + 1; + m_ptLeftText.y = m_rcBackground.bottom + 1; + m_ptRightText.x = m_rcBackground.right - (textRight.cx + 1); + m_ptRightText.y = m_rcBackground.bottom + 1; + + // Ensure sane slider position + if (m_nSliderPos < m_nMinimum) + m_nSliderPos = m_nMinimum; + + if (m_nSliderPos > m_nMaximum) + m_nSliderPos = m_nMaximum; + + long siteDiff = abs(m_rcBar.right - m_rcBar.left); + long extentDiff = abs(m_nMaximum - m_nMinimum); + long valDiff = m_nSliderPos - m_nMinimum; + + if (valDiff == 0) { + m_ptSlider.x = m_rcBar.left; + + } else { + long diff = (long)(((float)valDiff / (float)extentDiff) * (float)siteDiff); + + m_ptSlider.x = m_rcBar.left + diff; + + if (m_ptSlider.x >= m_rcBar.right - 6) + m_ptSlider.x = m_rcBar.right - 6; + } + + m_ptSlider.y = siteHHalf - 5; + + return S_OK; +} + +STDMETHODIMP cSlider::Render(ICanvas *pCanvas) +{ + // intensity to lose or gain for 3d effect + #define COLOR_BAND 20 + + USES_CONVERSION; + + CComPtr pPlugin; + m_pSite->get_PluginSite(&pPlugin); + + CComPtr pIcon; + SIZE szIcon = {7, 12}; + pPlugin->GetIconCache(&szIcon, &pIcon); + + // we're averaging color differences w/bias... + float fractional = m_nSliderPos / m_nMaximum; + float lFraction = (1 - fractional) * 2; + float rFraction = fractional * 2; + + long lMinSliderRed = lFraction * (BYTE) m_nMinSliderColor; + long lMinSliderGreen = lFraction * (BYTE) (m_nMinSliderColor >> 8); + long lMinSliderBlue = lFraction * (BYTE) (m_nMinSliderColor >> 16); + + long lMaxSliderRed = rFraction * (BYTE) m_nMaxSliderColor; + long lMaxSliderGreen = rFraction * (BYTE) (m_nMaxSliderColor >> 8); + long lMaxSliderBlue = rFraction * (BYTE) (m_nMaxSliderColor >> 16); + + long lFillColorTop, lFillColorMiddle, lFillColorBottom; + + long lFillColorRed = (lMinSliderRed + lMaxSliderRed) / 2, + lFillColorGreen = (lMinSliderGreen + lMaxSliderGreen) / 2, + lFillColorBlue = (lMinSliderBlue + lMaxSliderBlue) / 2; + + if( m_nMinSliderColor && m_nMaxSliderColor ) // not black .. who would choose all black for both bars anyway? grr. + { + // find the most intense color channel to maul for our evil purposes (we're using std::max here) + long lMax = max( max( lFillColorRed, lFillColorGreen ), lFillColorBlue ); + + // if we're dark, don't overflow + long lOffset = lMax > (COLOR_BAND - 1) ? COLOR_BAND : 0; + long lOffset2 = lMax > (COLOR_BAND - 1) ? 0 : COLOR_BAND; + + // red + if( lMax == lFillColorRed ) + { + lFillColorTop = RGB( lFillColorRed - lOffset, lFillColorGreen, lFillColorBlue ); + lFillColorMiddle = RGB( lFillColorRed + lOffset2, lFillColorGreen, lFillColorBlue ); + lFillColorBottom = RGB( lFillColorRed - lOffset, lFillColorGreen, lFillColorBlue ); + } + + // green + else if( lMax == lFillColorGreen ) + { + lFillColorTop = RGB( lFillColorRed, lFillColorGreen - lOffset, lFillColorBlue ); + lFillColorMiddle = RGB( lFillColorRed, lFillColorGreen + lOffset2, lFillColorBlue ); + lFillColorBottom = RGB( lFillColorRed, lFillColorGreen - lOffset, lFillColorBlue ); + } + + // has to be blue + else + { + lFillColorTop = RGB( lFillColorRed, lFillColorGreen, lFillColorBlue - lOffset ); + lFillColorMiddle = RGB( lFillColorRed, lFillColorGreen, lFillColorBlue + lOffset2 ); + lFillColorBottom = RGB( lFillColorRed, lFillColorGreen, lFillColorBlue - lOffset ); + } + } + + // someone's a GOTH + else + { + lFillColorTop = 0; + lFillColorMiddle = 0x00161616; + lFillColorBottom = 0; + } + + pCanvas->Fill( &m_rcBar, lFillColorMiddle ); + + RECT topBar = {m_rcBar.left, m_rcBar.top, m_rcBar.right, m_rcBar.top + 1}; + pCanvas->Fill( &topBar, lFillColorTop ); + + RECT bottomBar = {m_rcBar.left, m_rcBar.bottom - 1, m_rcBar.right, m_rcBar.bottom}; + pCanvas->Fill( &bottomBar, lFillColorBottom ); + + pIcon->DrawIcon(&m_ptSlider, 0x06001286, 0, pCanvas); + + m_pFont->DrawText(&m_ptLeftText, _bstr_t(m_strTextLeft), RGB(0, 0, 0), pCanvas); + m_pFont->DrawText(&m_ptRightText, _bstr_t(m_strTextRight), RGB(0, 0, 0), pCanvas); + + return S_OK; +} + +STDMETHODIMP cSlider::MouseDown(struct MouseState *mouseState) { + _ASSERTE(m_pSite != NULL); + + POINT pt = mouseState->client; + + if (pt.x >= (m_ptSlider.x) && (pt.x <= m_ptSlider.x + 6) && + pt.y >= (m_ptSlider.y) && (pt.y <= m_ptSlider.y + 12)) { + // They hit the grapple point! + m_ptLastMouse = mouseState->client; + m_bGrappled = VARIANT_TRUE; + } else { + // The hit the bar - see if that's within the bar rect + + if (pt.x > m_rcBar.left && pt.x < m_rcBar.right && + pt.y > (m_rcBar.top - 3) && pt.y < (m_rcBar.bottom + 3)) { + + // Calcuate the new slider position + float pixelValue = (float)((float)(m_nMaximum - m_nMinimum) / (float)(m_rcBar.right - m_rcBar.left)); + + m_nSliderPos = (pt.x - m_rcBar.left) * pixelValue; + + Reformat(); + m_pSite->Invalidate(); + + long nID; + m_pSite->get_ID(&nID); + _ASSERTE(m_pSite.p != NULL); + Fire_Change(nID, m_nSliderPos); + } + } + + return S_OK; +} + +STDMETHODIMP cSlider::MouseUp(struct MouseState *mouseState) { + m_bGrappled = VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cSlider::MouseMove(struct MouseState *mouseState) { + if (m_bGrappled) { + long dx; + POINT pt = mouseState->client; + + dx = m_ptLastMouse.x - pt.x; + m_ptLastMouse = pt; + + float pixelValue = (float)((float)(m_nMaximum - m_nMinimum) / (float)(m_rcBar.right - m_rcBar.left)); + m_nSliderPos -= ((float)dx * pixelValue); + + // I personally like being able to drag the slider + // PAST THE EDGE OF THE SLIDE BAR without needing pixel accuracy... + if( pt.x >= m_rcBar.right ) + m_nSliderPos = m_nMaximum; + + Reformat(); + m_pSite->Invalidate(); + + long nID; + m_pSite->get_ID(&nID); + _ASSERTE(m_pSite.p != NULL); + Fire_Change(nID, m_nSliderPos); + } + + return S_OK; +} \ No newline at end of file diff --git a/Native/DecalControls/Slider.h b/Native/DecalControls/Slider.h new file mode 100644 index 0000000..784ed5b --- /dev/null +++ b/Native/DecalControls/Slider.h @@ -0,0 +1,96 @@ +// Checkbox.h : Declaration of the cCheckbox + +#ifndef __SLIDER_H_ +#define __SLIDER_H_ + +#include "resource.h" // main symbols +#include "DecalControlsCP.h" + +#include "SinkImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cSlider +class ATL_NO_VTABLE cSlider : + public CComObjectRootEx, + public CComCoClass, + public IControlImpl< cSlider, ISlider, &IID_ISlider, &LIBID_DecalControls >, + public ILayerMouseImpl, + public ILayerRenderImpl, + public ILayerImpl< cSlider >, + public ILayerSchema, + public IProvideClassInfo2Impl< &CLSID_Slider, &DIID_ISliderEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyISliderEvents +{ +public: + cSlider(); + ~cSlider(); + + CComPtr m_pFont; + + VARIANT_BOOL m_bVertical; + VARIANT_BOOL m_bMouseIn; + VARIANT_BOOL m_bGrappled; + + long m_nTextColor; + float m_nSliderPos; + long m_nMinimum, m_nMaximum; + long m_nMinSliderColor, m_nMaxSliderColor; + + char *m_strTextLeft, *m_strTextRight; + + POINT m_ptSlider, m_ptLastMouse; + POINT m_ptLeftText, m_ptRightText; + RECT m_rcBar, m_rcBackground; + +DECLARE_REGISTRY_RESOURCEID(IDR_SLIDER) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cSlider) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(ISlider) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cSlider) +CONNECTION_POINT_ENTRY(DIID_ISliderEvents) +END_CONNECTION_POINT_MAP() + +public: + // ISlider Methods + STDMETHOD(get_TextColor)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_TextColor)(/*[in]*/ long newVal); + + STDMETHOD(get_Font)(/*[out, retval]*/ IFontCacheDisp * *pVal); + STDMETHOD(putref_Font)(/*[in]*/ IFontCacheDisp * newVal); + + STDMETHOD(get_SliderPosition)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_SliderPosition)(/*[in]*/ long newVal); + + STDMETHOD(get_Minimum)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Minimum)(/*[in]*/ long newVal); + + STDMETHOD(get_Maximum)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Maximum)(/*[in]*/ long newVal); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pSchema); + + // ILayerRender Methods + STDMETHOD(Reformat)(); + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerMouse Methods + STDMETHOD(MouseDown)(struct MouseState *mouseState); + STDMETHOD(MouseUp)(struct MouseState *mouseState); + STDMETHOD(MouseMove)(struct MouseState *mouseState); +}; +#endif //__SLIDER_H_ diff --git a/Native/DecalControls/Slider.rgs b/Native/DecalControls/Slider.rgs new file mode 100644 index 0000000..e7046f6 --- /dev/null +++ b/Native/DecalControls/Slider.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Slider.1 = s Slider Class' + { + CLSID = s '{5D14557A-1268-43c6-A283-3B5B271359AA}' + } + DecalControls.Slider = s 'Slider Class' + { + CLSID = s '{5D14557A-1268-43c6-A283-3B5B271359AA}' + CurVer = s 'DecalControls.Slider.1' + } + NoRemove CLSID + { + ForceRemove {5D14557A-1268-43c6-A283-3B5B271359AA} = s 'Slider Class' + { + ProgID = s 'DecalControls.StaticText.1' + VersionIndependentProgID = s 'DecalControls.Slider' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/Static.cpp b/Native/DecalControls/Static.cpp new file mode 100644 index 0000000..8f4b8d5 --- /dev/null +++ b/Native/DecalControls/Static.cpp @@ -0,0 +1,372 @@ +// Static.cpp : Implementation of cStatic +#include "stdafx.h" +#include "DecalControls.h" +#include "Static.h" + +///////////////////////////////////////////////////////////////////////////// +// cStatic + + +STDMETHODIMP cStatic::get_Font(IFontCacheDisp **pVal) +{ + _ASSERTE( pVal != NULL ); + + if( m_pFont.p == NULL ) + *pVal = NULL; + else + m_pFont->QueryInterface( pVal ); + + return S_OK; +} + +STDMETHODIMP cStatic::putref_Font(IFontCacheDisp *newVal) +{ + _ASSERTE( newVal != NULL ); + + if( m_pFont.p ) + m_pFont.Release(); + + HRESULT hRes = newVal->QueryInterface( &m_pFont ); + + _ASSERTE( SUCCEEDED( hRes ) ); + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cStatic::get_Text(BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = OLE2BSTR( m_strText ); + + return S_OK; +} + +STDMETHODIMP cStatic::put_Text(BSTR newVal) +{ + _ASSERTE( newVal != NULL ); + + m_strText = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cStatic::SchemaLoad(IView *pView, IUnknown *pSchema) +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->CreateFontSchema( 14, 0, pSchema, &m_pFont ); + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vText = pElement->getAttribute( _T( "text" ) ), + vTextColor = pElement->getAttribute( _T( "textcolor" ) ), + vWidth = pElement->getAttribute( _T( "width" ) ), + vHeight = pElement->getAttribute( _T( "height" ) ), + vJustify = pElement->getAttribute( _T( "justify" ) ), + vOutline = pElement->getAttribute( _T( "outlinecolor" ) ), + vAntialias = pElement->getAttribute( _T( "aa" ) ); + + // This is a required element + _ASSERTE( vText.vt == VT_BSTR ); + + // Store the text, assume left justification + m_strText = vText.bstrVal; + m_eJustify = eFontLeft; + + // Determine the proper justification + if (vJustify.vt != VT_NULL) + { + _bstr_t bstrJustify = vJustify.bstrVal; + if (::_wcsicmp(L"left", bstrJustify) == 0) + { + m_eJustify = eFontLeft; + } + else if (::_wcsicmp(L"right", bstrJustify) == 0) + { + m_eJustify = eFontRight; + } + else if (::_wcsicmp(L"center", bstrJustify) == 0) + { + m_eJustify = eFontCenter; + } + } + + // Determine the color + if( vTextColor.vt != VT_NULL ) + { + try + { + m_nTextColor = static_cast< long >( vTextColor ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + m_nOutlineColor = 0; + m_bOutline = false; + if( vOutline.vt != VT_NULL ) + { + try + { + m_bOutline = true; + m_nOutlineColor = static_cast< long >( vOutline ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + m_bAA = true; + if( vAntialias.vt != VT_NULL ) + { + try + { + m_bAA = static_cast< bool >( vAntialias ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + + /* + // Set the width of the static (not same as text width) + if( vWidth.vt != VT_NULL ) + { + try + { + m_nWidth = static_cast< long >( vWidth ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + // Set the height of the static (not same as text height or fontsize) + if( vHeight.vt != VT_NULL ) + { + try + { + m_nHeight = static_cast< long >( vHeight ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + */ + + return S_OK; +} + +STDMETHODIMP cStatic::Render( ICanvas *pCanvas ) +{ + if( m_pFont.p == NULL ) + { + // Create the default font + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + } + + SIZE Size; + char *token; + POINT ptText = { 0, 0 }; + + //_bstr_t strText= m_strText.copy(); + //_bstr_t temp=_bstr_t(""); + + // Determine control size + RECT rcPos; + m_pSite->get_Position(&rcPos); + int nWidth = rcPos.right - rcPos.left; + int nHeight = rcPos.bottom - rcPos.top; + + // Copy the string for parsing + std::string strText((const char *) m_strText); + + // Determine line height + m_pFont->MeasureText(_bstr_t(strText.data()), &Size); + int height = Size.cy; + + // Break it into lines (can't use strtok or we miss blank lines) + std::vector<_bstr_t> lines; + int nStart = 0, nEnd; + bool bDone = false; + while (!bDone) + { + // Get the next CR + nEnd = strText.find("\n", nStart); + if (nEnd == std::string::npos) + { + bDone = true; + nEnd = strText.length(); + } + + // Store the line + lines.push_back(strText.substr(nStart, nEnd - nStart).data()); + + // Move one character beyond + nStart = nEnd + 1; + } + + // Loop through the lines + _bstr_t bstrSpace(" "), bstrEmpty(""); + int nIndex, nLines = lines.size(); + for (nIndex = 0, bDone = false; !bDone && (nIndex < nLines); nIndex++) + { + // Copy the line for parsing + _bstr_t strLine((const char *) lines[nIndex]); + + // Line to be built + _bstr_t strOut = bstrEmpty; + + // Loop through the "words" on the line + for (token = ::strtok((char *) strLine, " "); !bDone && (token != NULL); token = ::strtok(NULL, " ")) + { + _bstr_t bstrToken(token); + + // Measure this token + m_pFont->MeasureText(strOut + bstrToken, &Size); + + // Is this line full??? + if (Size.cx > nWidth) + { + DrawText(&ptText, strOut, pCanvas); + ptText.y += height; + + // Does the next line put us over the top + bDone = ((ptText.y + height) > nHeight) ? true : false; + + // Clear the line + strOut = bstrEmpty; + } + + // Store the token + strOut += bstrToken + bstrSpace; + } + + // Draw as needed + if (!bDone) + { + DrawText(&ptText, strOut, pCanvas); + ptText.y += height; + } + + // Does the next line put us over the top + bDone = ((ptText.y + height) > nHeight) ? true : false; + } + + /* + if(Size.cx > nWidth) + { + for( token = ::strtok( (char*)strText, " " ); token !=NULL; token = ::strtok( NULL, " " ) ) + { + m_pFont->MeasureText(temp + _bstr_t(token), &Size); + + if(Size.cx > nWidth) + { + DrawText( &ptText, temp, pCanvas ); + ptText.y+=height;//14; + if(ptText.y+height>nHeight) + return S_OK; + temp = _bstr_t(token) + _bstr_t(" "); + } + else + temp += _bstr_t(token) + _bstr_t(" "); + } + + DrawText( &ptText, temp, pCanvas ); + + } + else + { + DrawText( &ptText, strText, pCanvas ); + } + */ + + return S_OK; +} + +STDMETHODIMP cStatic::get_TextColor(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nTextColor; + + return S_OK; +} + +STDMETHODIMP cStatic::put_TextColor(long newVal) +{ + _ASSERTE( ( newVal & 0xFF000000L ) == 0 ); + + m_nTextColor = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +void cStatic::DrawText(LPPOINT ppt, BSTR szText, ICanvas *pCanvas) +{ + POINT pt = *ppt; + + RECT rcPos; + m_pSite->get_Position(&rcPos); + int nWidth = rcPos.right - rcPos.left; + int nHeight = rcPos.bottom - rcPos.top; + + // Act based on justification style + switch (m_eJustify) + { + case eFontRight: + { + SIZE Size; + m_pFont->MeasureText(szText, &Size); + pt.x = nWidth - Size.cx; + } + break; + + case eFontCenter: + { + SIZE Size; + m_pFont->MeasureText(szText, &Size); + pt.x = (nWidth / 2) - (Size.cx / 2); + } + break; + + case eFontLeft: + default: + { + // No-Op + } + break; + } + + long lFlags = 0; + + if( m_bAA ) + lFlags |= eAA; + + if( m_bOutline ) + lFlags |= eOutlined; + + m_pFont->DrawTextEx( &pt, szText, m_nTextColor, m_nOutlineColor, lFlags, pCanvas ); +} diff --git a/Native/DecalControls/Static.h b/Native/DecalControls/Static.h new file mode 100644 index 0000000..0256dcf --- /dev/null +++ b/Native/DecalControls/Static.h @@ -0,0 +1,78 @@ +// Static.h : Declaration of the cStatic + +#ifndef __STATIC_H_ +#define __STATIC_H_ + +#include "resource.h" // main symbols +#include "DecalControlsCP.h" + +#include "SinkImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cStatic +class ATL_NO_VTABLE cStatic : + public CComObjectRootEx, + public CComCoClass, + public ILayerImpl< cStatic >, + public IControlImpl< cStatic, IStatic, &IID_IStatic, &LIBID_DecalControls >, + public ILayerRenderImpl, + public ILayerSchema, + public IProvideClassInfo2Impl< &CLSID_StaticText, &DIID_IControlEvents, &LIBID_DecalControls >, + public IConnectionPointContainerImpl, + public CProxyIControlEvents< cStatic > +{ +public: + cStatic() + : m_nTextColor( RGB( 0, 0, 0 ) ) + { + } + + void DrawText(LPPOINT ppt, BSTR szText, ICanvas *pCanvas); + + CComPtr< IFontCache > m_pFont; + _bstr_t m_strText; + long m_nTextColor; + long m_nOutlineColor; + bool m_bAA; + bool m_bOutline; + //long m_nWidth; + //long m_nHeight; + eFontJustify m_eJustify; + +DECLARE_REGISTRY_RESOURCEID(IDR_STATIC) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cStatic) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IStatic) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cStatic) +CONNECTION_POINT_ENTRY(DIID_IControlEvents) +END_CONNECTION_POINT_MAP() + +public: + // IStatic Methods + STDMETHOD(get_Text)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Text)(/*[in]*/ BSTR newVal); + STDMETHOD(get_Font)(/*[out, retval]*/ IFontCacheDisp * *pVal); + STDMETHOD(putref_Font)(/*[in]*/ IFontCacheDisp * newVal); + STDMETHOD(get_TextColor)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_TextColor)(/*[in]*/ long newVal); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *pView, IUnknown *pSchema); + + // ILayerRender Methods + STDMETHOD(Render)(ICanvas *); +}; + +#endif //__STATIC_H_ diff --git a/Native/DecalControls/Static.rgs b/Native/DecalControls/Static.rgs new file mode 100644 index 0000000..4387690 --- /dev/null +++ b/Native/DecalControls/Static.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.StaticText.1 = s 'StaticText Class' + { + CLSID = s '{4887101C-A9F9-495B-921B-EF22822CFB97}' + } + DecalControls.StaticText = s 'StaticText Class' + { + CLSID = s '{4887101C-A9F9-495B-921B-EF22822CFB97}' + CurVer = s 'DecalControls.StaticText.1' + } + NoRemove CLSID + { + ForceRemove {4887101C-A9F9-495B-921B-EF22822CFB97} = s 'StaticText Class' + { + ProgID = s 'DecalControls.StaticText.1' + VersionIndependentProgID = s 'DecalControls.StaticText' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/StdAfx.cpp b/Native/DecalControls/StdAfx.cpp new file mode 100644 index 0000000..deb15b6 --- /dev/null +++ b/Native/DecalControls/StdAfx.cpp @@ -0,0 +1,14 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#include +#endif + +#include + +#include "..\Inject\SinkImpl.cpp" diff --git a/Native/DecalControls/StdAfx.h b/Native/DecalControls/StdAfx.h new file mode 100644 index 0000000..b9286de --- /dev/null +++ b/Native/DecalControls/StdAfx.h @@ -0,0 +1,53 @@ +// 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__2E05D2E0_3EAC_488F_8C1B_3CF7378ADE73__INCLUDED_) +#define AFX_STDAFX_H__2E05D2E0_3EAC_488F_8C1B_3CF7378ADE73__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _ATL_APARTMENT_THREADED + +// Don't use macros for min() and max()!!! +#define NOMINMAX + +#include +#include +#include +#include +#include +#include +#include + +// Keep things backward compatible +#if defined(_MSC_VER) && _MSC_VER <= 1200 +#define min std::_cpp_min +#define max std::_cpp_max +#else +using std::min; +using std::max; +#endif + +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include + +#include "..\Inject\Inject.h" +#import + +#ifdef _CHECKMEM +#define _ASSERTMEM(a) _ASSERTE(a) +#else +#define _ASSERTMEM(a) +#endif + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__2E05D2E0_3EAC_488F_8C1B_3CF7378ADE73__INCLUDED) diff --git a/Native/DecalControls/TextColumn.cpp b/Native/DecalControls/TextColumn.cpp new file mode 100644 index 0000000..e4d890d --- /dev/null +++ b/Native/DecalControls/TextColumn.cpp @@ -0,0 +1,222 @@ +// TextColumn.cpp : Implementation of cTextColumn +#include "stdafx.h" +#include "DecalControls.h" +#include "TextColumn.h" + +///////////////////////////////////////////////////////////////////////////// +// cTextColumn + +STDMETHODIMP cTextColumn::get_FixedWidth(VARIANT_BOOL *pVal) +{ + if( m_nFixedWidth == -1 ) + *pVal = VARIANT_FALSE; + else + *pVal = VARIANT_TRUE; + + return S_OK; +} + +STDMETHODIMP cTextColumn::get_Width(long *pVal) +{ + if( m_nFixedWidth == -1 ) + return E_NOTIMPL; + + *pVal = m_nFixedWidth; + + return S_OK; +} + +STDMETHODIMP cTextColumn::put_Width(long newVal) +{ + if( m_nFixedWidth == -1 ) + return E_NOTIMPL; + + m_nFixedWidth = newVal; + + return S_OK; +} + +STDMETHODIMP cTextColumn::Render(ICanvas *pCanvas, LPPOINT ptCell, long nColor) +{ + USES_CONVERSION; + + _variant_t vText; + m_pList->get_Data( ptCell->x, ptCell->y, 0, &vText ); + + vText.ChangeType( VT_BSTR ); + + CComPtr< IFontCache > pFont; + BSTR bstrFontName; + m_pSite->get_FontName(&bstrFontName); + m_pSite->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, m_nFontSize, 0, &pFont ); + + POINT pt = { m_nTextX, m_nTextY }; + + // GKusnick: Apply justification. + switch (m_eJustify) + { + case eFontRight: + { + SIZE Size; + pFont->MeasureText(vText.bstrVal, &Size); + pt.x = m_nFixedWidth - m_nTextX - Size.cx; + } + break; + + case eFontCenter: + { + SIZE Size; + pFont->MeasureText(vText.bstrVal, &Size); + pt.x = (m_nFixedWidth - Size.cx)/2; + } + break; + + case eFontLeft: + default: + { + // No-Op + } + break; + } + + pFont->DrawTextEx( &pt, vText.bstrVal, nColor, 0, eAA, pCanvas ); + + return S_OK; +} + +STDMETHODIMP cTextColumn::get_DataColumns(long *pVal) +{ + *pVal = 1; + + return S_OK; +} + +STDMETHODIMP cTextColumn::Initialize(IList *newVal, IPluginSite *pSite) +{ + m_pList = newVal; + m_pSite = pSite; + + // TODO: Make sure there is a row + + return S_OK; +} + +STDMETHODIMP cTextColumn::SchemaLoad(IUnknown *pSchema) +{ + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vFixedWidth = pElement->getAttribute( _T( "fixedwidth" ) ); + _variant_t vRowHeight = pElement->getAttribute( _T( "rowheight" ) ); + _variant_t vFontSize = pElement->getAttribute( _T( "fontsize" ) ); + _variant_t vTextX = pElement->getAttribute( _T( "textx" ) ); + _variant_t vTextY = pElement->getAttribute( _T( "texty" ) ); + _variant_t vJustify = pElement->getAttribute( _T( "justify" ) ); /// GKusnick: Justification option. + + if( vFixedWidth.vt != VT_NULL ) + { + try + { + m_nFixedWidth = static_cast< long >( vFixedWidth ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vRowHeight.vt != VT_NULL ) + { + try + { + m_nRowHeight = static_cast< long >( vRowHeight ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + else + m_nRowHeight = 20; + + + if( vFontSize.vt != VT_NULL ) + { + try + { + m_nFontSize = static_cast< long >( vFontSize ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + else + m_nFontSize = 14; + + if( vTextX.vt != VT_NULL ) + { + try + { + m_nTextX = static_cast< long >( vTextX ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + else + m_nTextX = 3; + + if( vTextY.vt != VT_NULL ) + { + try + { + m_nTextY = static_cast< long >( vTextY ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + else + m_nTextY = 2; + + // GKusnick: Set justification style from schema. + m_eJustify = eFontLeft; + if (vJustify.vt != VT_NULL) + { + if (::_wcsicmp(L"left", vJustify.bstrVal) == 0) + { + m_eJustify = eFontLeft; + } + else if (::_wcsicmp(L"right", vJustify.bstrVal) == 0) + { + m_eJustify = eFontRight; + } + else if (::_wcsicmp(L"center", vJustify.bstrVal) == 0) + { + m_eJustify = eFontCenter; + } + } + + return S_OK; +} + +STDMETHODIMP cTextColumn::get_Height(long *pVal) +{ + *pVal = m_nRowHeight; + + return S_OK; +} + +STDMETHODIMP cTextColumn::Activate(LPPOINT ptCell) +{ + // TODO: Add your implementation code here + + return S_OK; +} diff --git a/Native/DecalControls/TextColumn.h b/Native/DecalControls/TextColumn.h new file mode 100644 index 0000000..435bea7 --- /dev/null +++ b/Native/DecalControls/TextColumn.h @@ -0,0 +1,52 @@ +// TextColumn.h : Declaration of the cTextColumn + +#ifndef __TEXTCOLUMN_H_ +#define __TEXTCOLUMN_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cTextColumn +class ATL_NO_VTABLE cTextColumn : + public CComObjectRootEx, + public CComCoClass, + public IListColumn +{ +public: + cTextColumn() + : m_nFixedWidth( -1 ) + { + } + + CComPtr< IList > m_pList; + CComPtr< IPluginSite > m_pSite; + + long m_nFixedWidth; + long m_nRowHeight; + long m_nFontSize; + long m_nTextX; + long m_nTextY; + eFontJustify m_eJustify; // GKusnick: Justification option. + +DECLARE_REGISTRY_RESOURCEID(IDR_TEXTCOLUMN) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cTextColumn) + COM_INTERFACE_ENTRY(IListColumn) +END_COM_MAP() + +// IListColumn +public: + STDMETHOD(Activate)(LPPOINT ptCell); + STDMETHOD(get_Height)(/*[out, retval]*/ long *pVal); + STDMETHOD(SchemaLoad)(IUnknown *pSchema); + STDMETHOD(Initialize)(/*[in]*/ IList * newVal, IPluginSite *); + STDMETHOD(get_DataColumns)(/*[out, retval]*/ long *pVal); + STDMETHOD(Render)(ICanvas *, LPPOINT ptCell, long nColor); + STDMETHOD(get_Width)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_FixedWidth)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Width)(/*[in]*/ long newVal); +}; + +#endif //__TEXTCOLUMN_H_ diff --git a/Native/DecalControls/TextColumn.rgs b/Native/DecalControls/TextColumn.rgs new file mode 100644 index 0000000..576d023 --- /dev/null +++ b/Native/DecalControls/TextColumn.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.TextColumn.1 = s 'DecalControls TextColumn' + { + CLSID = s '{864DEABF-D079-4B61-A8CF-081418179239}' + } + DecalControls.TextColumn = s 'DecalControls TextColumn' + { + CLSID = s '{864DEABF-D079-4B61-A8CF-081418179239}' + CurVer = s 'DecalControls.TextColumn.1' + } + NoRemove CLSID + { + ForceRemove {864DEABF-D079-4B61-A8CF-081418179239} = s 'DecalControls TextColumn' + { + ProgID = s 'DecalControls.TextColumn.1' + VersionIndependentProgID = s 'DecalControls.TextColumn' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/DecalControls/progress.rgs b/Native/DecalControls/progress.rgs new file mode 100644 index 0000000..8cb9e7e --- /dev/null +++ b/Native/DecalControls/progress.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalControls.Progress.1 = s 'Progress Class' + { + CLSID = s '{FE361225-6BB7-4AE0-A10C-8A6420621680}' + } + DecalControls.Progress = s 'Progress Class' + { + CLSID = s '{FE361225-6BB7-4AE0-A10C-8A6420621680}' + CurVer = s 'DecalControls.Progress.1' + } + NoRemove CLSID + { + ForceRemove {FE361225-6BB7-4AE0-A10C-8A6420621680} = s 'Progress Class' + { + ProgID = s 'DecalControls.Progress.1' + VersionIndependentProgID = s 'DecalControls.Progress' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{1C4B007A-04DD-4DF8-BA29-2CFBD0220B89}' + } + } +} diff --git a/Native/DecalControls/resource.h b/Native/DecalControls/resource.h new file mode 100644 index 0000000..09c4d9b --- /dev/null +++ b/Native/DecalControls/resource.h @@ -0,0 +1,35 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by DecalControls.rc +// +#define IDS_PROJNAME 100 +#define IDR_EDIT 101 +#define IDR_CHOICE 102 +#define IDR_CLIENT 103 +#define IDR_BORDERLAYOUT 105 +#define IDR_PAGELAYOUT 106 +#define IDR_PUSHBUTTON 107 +#define IDR_STATIC 108 +#define IDR_CHECKBOX 109 +#define IDS_DERETHMAP_DESC 133 +#define IDR_DerethMap 134 +#define IDR_PROGRESS 136 +#define IDR_TEXTCOLUMN 201 +#define IDR_ICONCOLUMN 202 +#define IDR_LIST 203 +#define IDR_NOTEBOOK 204 +#define IDR_SCROLLER 205 +#define IDR_CHECKCOLUMN 206 +#define IDR_FIXEDLAYOUT 207 +#define IDR_SLIDER 208 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 209 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 137 +#endif +#endif diff --git a/Native/DecalDat/DatFile.cpp b/Native/DecalDat/DatFile.cpp new file mode 100644 index 0000000..a0b5027 --- /dev/null +++ b/Native/DecalDat/DatFile.cpp @@ -0,0 +1,164 @@ +// ACFile.cpp +// Implementation of class cACFile + +#include "stdafx.h" +#include "DatFile.h" + +#define AC_NUMFILELOC 0x03E +#define AC_ROOTDIRPTRLOC 0x148 + +#define new DEBUG_NEW + +cDatFile::cFile::cFile( cDatFile *pSource, BYTE *pFirstSector, DWORD dwSize ) +: m_pFirstSector( pFirstSector ), +m_pCurrentSector( pFirstSector ), +m_pCurrentByte( pFirstSector + sizeof( DWORD ) ), +m_dwSize( dwSize ), +m_dwOffset( 0 ), +m_pSource( pSource ) +{ +} + +void cDatFile::cFile::reset() +{ + m_pCurrentSector = m_pFirstSector; + m_pCurrentByte = m_pFirstSector + sizeof( DWORD ); + m_dwOffset = 0; +} + +DWORD cDatFile::cFile::read( BYTE *pbBuffer, DWORD dwSize ) +{ + // Check if we can fit + if( dwSize + m_dwOffset > m_dwSize ) + dwSize = m_dwSize - m_dwOffset; + + DWORD dwRemaining = dwSize; + while( dwRemaining > 0 ) + { + if( ( m_pCurrentByte + dwRemaining ) > m_pCurrentSector + m_pSource->m_dwSectorSize ) + { + // We are reading over a sector boundary, read what we've got and reset for the next sector + DWORD dwSection = ( m_pCurrentSector + m_pSource->m_dwSectorSize ) - m_pCurrentByte; + + ::memcpy( pbBuffer, m_pCurrentByte, dwSection ); + m_pCurrentSector = m_pSource->m_pData + *reinterpret_cast< DWORD * >( m_pCurrentSector ); + m_pCurrentByte = m_pCurrentSector + sizeof( DWORD ); + + dwRemaining -= dwSection; + pbBuffer += dwSection; + } + else + { + ::memcpy( pbBuffer, m_pCurrentByte, dwRemaining ); + m_pCurrentByte += dwRemaining; + dwRemaining = 0; + } + } + + m_dwOffset += dwSize; + return dwSize; +} + +DWORD cDatFile::cFile::skip( DWORD dwSize ) +{ + // Check if we can fit + if( dwSize + m_dwOffset > m_dwSize ) + dwSize = m_dwSize - m_dwOffset; + + DWORD dwRemaining = dwSize; + while( dwRemaining > 0 ) + { + if( ( m_pCurrentByte + dwRemaining ) > m_pCurrentSector + m_pSource->m_dwSectorSize ) + { + // We are reading over a sector boundary, read what we've got and reset for the next sector + DWORD dwSection = ( m_pCurrentSector + m_pSource->m_dwSectorSize ) - m_pCurrentByte; + + m_pCurrentSector = m_pSource->m_pData + *reinterpret_cast< DWORD * >( m_pCurrentSector ); + m_pCurrentByte = m_pCurrentSector + sizeof( DWORD ); + + dwRemaining -= dwSection; + } + else + { + m_pCurrentByte += dwRemaining; + dwRemaining = 0; + } + } + + m_dwOffset += dwSize; + return dwSize; +} + +cDatFile::cDatFile( LPCTSTR szFilename, DWORD dwSectorSize ) +: m_hFile( NULL ), +m_hMapping( NULL ), +m_pData( NULL ), +m_dwSectorSize( dwSectorSize ) +{ + m_hFile = ::CreateFile( szFilename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL ); + + if( m_hFile == INVALID_HANDLE_VALUE ) + throw std::exception(); + + // Proceed to create the file mapping + m_hMapping = ::CreateFileMapping( m_hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL ); + if( m_hMapping == NULL ) + { + ::CloseHandle( m_hFile ); + throw std::exception(); + } + + m_pData = reinterpret_cast< BYTE * >( ::MapViewOfFileEx( m_hMapping, FILE_MAP_READ, 0, 0, 0, NULL ) ); + + if( m_pData == NULL ) + { + ::CloseHandle( m_hMapping ); + ::CloseHandle( m_hFile ); + throw std::exception(); + } +} + +cDatFile::~cDatFile() +{ + ::UnmapViewOfFile( m_pData ); + ::CloseHandle( m_hMapping ); + ::CloseHandle( m_hFile ); +} + +cDatFile::cFile cDatFile::getFile( DWORD dwFileNumber ) +{ + cDirectory dir; + + // Search for our golden file + for ( DWORD dwDirStart = *reinterpret_cast< DWORD * >( m_pData + AC_ROOTDIRPTRLOC ); dwDirStart != 0; ) + { + cFile dir_entry( this, m_pData + dwDirStart, sizeof( cDirectory ) ); + dir_entry.read( reinterpret_cast< BYTE * >( &dir ), sizeof( cDirectory ) ); + + // Now, the files are located like triplets, so copy the triplets + cFileEntry *pEntry = dir.m_files, + *pEndEntry = pEntry + dir.m_dwFiles; + + for( cFileEntry *pIter = pEntry; pIter != pEndEntry && pIter->m_dwID < dwFileNumber; ++ pIter ); + + // We either got an exact match - or we attempt to further narrow down the file + if( pIter != pEndEntry ) + { + // We found some sort of match + if( pIter->m_dwID == dwFileNumber ) + // This is an exact match hooray + return cFile( this, m_pData + pIter->m_dwOffset, pIter->m_dwSize ); + } + + // We have an inexact match, but now we attempt to recurse + if( dir.m_subdirs[ 0 ] == 0 ) + // If the first entry in the directory is 0, there are no + // helpers - we lose, it's not here + break; + + dwDirStart = dir.m_subdirs[ pIter - pEntry ]; + } + + // If we get here, the file wasn't found - sniff + throw std::exception(); +} diff --git a/Native/DecalDat/DatFile.h b/Native/DecalDat/DatFile.h new file mode 100644 index 0000000..041e73a --- /dev/null +++ b/Native/DecalDat/DatFile.h @@ -0,0 +1,76 @@ +// DatFile.h +// Declaration of class cDatFile +// Class for extracting data from portal.dat and cell.dat + +#ifndef __ACFILE_H +#define __ACFILE_H + +#define FILE_COUNT 62 + +class cDatFile +{ + // The AC File is created as a memory mapped file + // so we let the memory manager cache manage - it's also quite a bit nicer than + // code to seek/read everything + HANDLE m_hFile, + m_hMapping; + BYTE *m_pData; + DWORD m_dwSectorSize; + +public: + class cFile + { + BYTE *m_pFirstSector, + *m_pCurrentSector, + *m_pCurrentByte; + DWORD m_dwSize, + m_dwOffset; + cDatFile *m_pSource; + + public: + // Locate the file in a directory + + cFile( cDatFile *pSource, BYTE *pFirstSector, DWORD dwSize ); + + DWORD getSize() const + { + return m_dwSize; + } + + DWORD tell() const + { + return m_dwOffset; + } + + void reset(); + DWORD read( BYTE *pbBuffer, DWORD dwSize ); + DWORD skip( DWORD dwSize ); + }; + + cDatFile( LPCTSTR szFilename, DWORD dwSectorSize = 256 ); + ~cDatFile(); + + cFile getFile( DWORD dwFileNumber ); + + // Structures +#pragma pack( push, 1 ) + struct cFileEntry + { + DWORD m_dwID, + m_dwOffset, + m_dwSize; + }; + + struct cDirectory + { + DWORD m_subdirs[ FILE_COUNT ]; + DWORD m_dwFiles; + cFileEntry m_files[ FILE_COUNT ]; + }; + +#pragma pack( pop ) + + friend cFile; +}; + +#endif diff --git a/Native/DecalDat/DatLibrary.cpp b/Native/DecalDat/DatLibrary.cpp new file mode 100644 index 0000000..3275866 --- /dev/null +++ b/Native/DecalDat/DatLibrary.cpp @@ -0,0 +1,158 @@ +// DatLibrary.cpp : Implementation of cDatLibrary +#include "stdafx.h" +#include "DecalDat.h" +#include "DatLibrary.h" + +#include "DatFile.h" +#include "DatService.h" +#include "DatStream.h" + +///////////////////////////////////////////////////////////////////////////// +// cDatLibrary + +void cDatLibrary::load( cDatService *pService, BSTR strFilename, int nFileType, long nSectorSize ) +{ + USES_CONVERSION; + + // Convert the template path into a real path + m_pService = pService; + CComBSTR strPath; + pService->m_pDecal->MapPath( strFilename, &strPath ); + m_nFileType = nFileType; + + try + { + m_pFile = new cDatFile( OLE2T( strPath ), nSectorSize ); + } + catch( ... ) + { + } +} + +HRESULT cDatLibrary::createFile( DWORD dwFile, REFIID iid, void **ppvItf ) +{ + CComObject< cDatStream > *pStream; + CComObject< cDatStream >::CreateInstance( &pStream ); + CComPtr< IUnknown > pUnkStream = pStream; + + try + { + pStream->m_pFile = new cDatFile::cFile( m_pFile->getFile( dwFile ) ); + } + catch( ... ) + { + delete pStream; + + // File not found + return E_INVALIDARG; + } + + return pStream->QueryInterface( iid, ppvItf ); +} + +STDMETHODIMP cDatLibrary::Lookup( BSTR strName, IUnknown **ppItf ) +{ + USES_CONVERSION; + LPTSTR szName = OLE2T( strName ); + + int nProtocol = ::_tcscspn( szName, _T( ":" ) ); + if( szName[ nProtocol ] == _T( '\0' ) ) + { + // Special case, no protocol creates a raw stream + DWORD dwFile; + if( ::_stscanf( szName, _T( "%X" ), &dwFile ) != 1 ) + return E_INVALIDARG; + + return get_Stream( dwFile, ppItf ); + } + + // We have a protocol name + szName[ nProtocol ] = _T( '\0' ); + + // Convert the hew file number + DWORD dwFile; + if( ::_stscanf( szName + nProtocol + 1, _T( "%X" ), &dwFile ) != 1 ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + return Open( CComBSTR( szName ), dwFile, ppItf ); +} + +STDMETHODIMP cDatLibrary::get_Stream(DWORD dwFile, LPUNKNOWN *pVal) +{ + return createFile( dwFile, IID_IUnknown, reinterpret_cast< void ** >( pVal ) ); +} + +STDMETHODIMP cDatLibrary::Open(BSTR Protocol, DWORD File, LPUNKNOWN *pFile) +{ + USES_CONVERSION; + LPTSTR szName = OLE2T( Protocol ); + + ::_tcslwr( szName ); + + cDatService::cFileFilter *pFilter = m_pService->getFilter( szName, ::_tcslen( szName ) ); + if( pFilter == NULL ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + if( pFilter->m_bCache ) + { + // Check the file cache for an existing verison + for( cDatService::cFileCacheList::iterator i = m_pService->m_cache.begin(); i != m_pService->m_cache.end(); ++ i ) + { + if( i->m_dwFile == File && + static_cast< int >( i->m_library ) == m_nFileType && + i->m_pFilter == pFilter ) + { + // Found our file, return victorious + return i->m_pFile->QueryInterface( pFile ); + } + } + } + + // No cache or not found in the cache, create the stream + CComPtr< IDatStream > pStream; + HRESULT hRes = createFile( File, IID_IDatStream, reinterpret_cast< void ** >( &pStream ) ); + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + return hRes; + } + + // Lookin' good, create the filter + CComPtr< IFileFilter > pFileFilter; + hRes = m_pService->createFilter( pFilter, IID_IFileFilter, reinterpret_cast< void ** >( &pFileFilter ) ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + return hRes; + } + + hRes = pFileFilter->Initialize( pStream ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + return hRes; + } + + if( pFilter->m_bCache ) + { + // Make a cache entry + cDatService::cFileCache fc; + + fc.m_dwFile = File; + fc.m_library = static_cast< cDatService::eLibrary >( m_nFileType ); + fc.m_pFilter = pFilter; + fc.m_pFile = pFileFilter; + + m_pService->m_cache.push_back( fc ); + } + + return pFileFilter->QueryInterface( IID_IUnknown, reinterpret_cast< void ** >( pFile ) ); +} diff --git a/Native/DecalDat/DatLibrary.h b/Native/DecalDat/DatLibrary.h new file mode 100644 index 0000000..252a685 --- /dev/null +++ b/Native/DecalDat/DatLibrary.h @@ -0,0 +1,52 @@ +// DatLibrary.h : Declaration of the cDatLibrary + +#ifndef __DATLIBRARY_H_ +#define __DATLIBRARY_H_ + +#include "resource.h" // main symbols + +class cDatFile; +class cDatService; + +///////////////////////////////////////////////////////////////////////////// +// cDatLibrary +class ATL_NO_VTABLE cDatLibrary : + public CComObjectRootEx, + public CComCoClass, + public IDecalDirectory, + public IDispatchImpl +{ +public: + cDatLibrary() + : m_pFile( NULL ) + { + } + + void load( cDatService *pService, BSTR strFilename, int nFileType, long nSectorSize ); + + int m_nFileType; + cDatFile *m_pFile; + cDatService *m_pService; + + HRESULT createFile( DWORD dwFile, REFIID iid, void **ppvItf ); + +DECLARE_REGISTRY_RESOURCEID(IDR_DATLIBRARY) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDatLibrary) + COM_INTERFACE_ENTRY(IDatLibrary) + COM_INTERFACE_ENTRY(IDecalDirectory) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IDatLibrary +public: + + // IDecalDirectory + STDMETHOD(Lookup)(BSTR strName, IUnknown **ppItf); + STDMETHOD(Open)(BSTR Protocol, DWORD File, /*[out, retval]*/ LPUNKNOWN *pFile); + STDMETHOD(get_Stream)(DWORD dwType, /*[out, retval]*/ LPUNKNOWN *pVal); +}; + +#endif //__DATLIBRARY_H_ diff --git a/Native/DecalDat/DatService.cpp b/Native/DecalDat/DatService.cpp new file mode 100644 index 0000000..413daf7 --- /dev/null +++ b/Native/DecalDat/DatService.cpp @@ -0,0 +1,152 @@ +// DatService.cpp : Implementation of cDatService +#include "stdafx.h" +#include "DecalDat.h" +#include "DatService.h" + +#include "DatLibrary.h" + +#include + +///////////////////////////////////////////////////////////////////////////// +// cDatService + +HANDLE WINAPI CreateFileF( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) +{ + dwShareMode |= FILE_SHARE_READ | FILE_SHARE_WRITE; + return cDatService::g_fn_CreateFile( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, + dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); +} + +static cHookDescriptor _hooks[] = { + { eByName, _T( "kernel32.dll" ), _T( "CreateFileA" ), 0, reinterpret_cast< DWORD >( CreateFileF ), 0 }, +}; + +cDatService::cFileFilter *cDatService::getFilter( LPTSTR szFilter, int nLength ) +{ + std::string strFilter( szFilter, nLength ); + + for( cFileFilterList::iterator i = m_filters.begin(); i != m_filters.end(); ++ i ) + { + if( strFilter == i->m_strName ) + return &(*(i)); + } + + return NULL; +} + +HRESULT cDatService::createFilter( cDatService::cFileFilter *pFilter, REFIID iid, LPVOID *ppvItf ) +{ + static _bstr_t _strFilter( _T( "FileFilters" ) ); + + CComPtr< IDecalEnum > pEnumFilter; + if( m_pDecal->get_Configuration( _strFilter, pFilter->m_clsid, &pEnumFilter ) != S_OK ) + return E_FAIL; + + return pEnumFilter->CreateInstance( iid, ppvItf ); +} + +HRESULT cDatService::onInitialize() +{ + USES_CONVERSION; + + static _bstr_t _strPortal( _T( "%ac%\\portal.dat" ) ), + _strCell( _T( "%ac%\\cell.dat" ) ); + + if( g_p == NULL ) + { + hookFunctions( _hooks, 1, true ); + g_fn_CreateFile = reinterpret_cast< fn_CreateFile >( _hooks[ 0 ].m_pOldFunction ); + g_p = this; + } + + CComObject< cDatLibrary > *pComCell, *pComPortal; + CComObject< cDatLibrary >::CreateInstance( &pComCell ); + CComObject< cDatLibrary >::CreateInstance( &pComPortal ); + + pComCell->AddRef(); + pComPortal->AddRef(); + + m_pCell = pComCell; + m_pPortal = pComPortal; + + m_pCell->load( this, _strCell, eCell, 256 ); + m_pPortal->load( this, _strPortal, ePortal, 1024 ); + + // Load the list of filters + static _bstr_t _strFilter( _T( "FileFilters" ) ), + _strPrefix( _T( "Prefix" ) ), + _strCache( _T( "Cache" ) ); + CComPtr< IDecalEnum > pEnum; + + m_pDecal->get_Configuration( _strFilter, GUID_NULL, &pEnum ); + + while( pEnum->Next() == S_OK ) + { + CComVariant vPrefix, vCache; + cFileFilter; + + cFileFilter ff; + pEnum->get_ComClass( &ff.m_clsid ); + + HRESULT hRes = pEnum->get_Property( _strPrefix, &vPrefix ); + if( !SUCCEEDED( hRes ) || vPrefix.vt != VT_BSTR ) + { + _ASSERT( FALSE ); + continue; + } + + hRes = pEnum->get_Property( _strCache, &vCache ); + if( !SUCCEEDED( hRes ) || vCache.vt != VT_I4 ) + { + _ASSERT( FALSE ); + continue; + } + + ff.m_bCache = !!vCache.lVal; + + LPTSTR szPrefix = OLE2T( vPrefix.bstrVal ); + ::_tcslwr( szPrefix ); + ff.m_strName = szPrefix; + + m_filters.push_back( ff ); + } + + return S_OK; +} + +void cDatService::onTerminate() +{ + m_cache.clear(); + m_filters.clear(); + + if( g_p == this ) + { + hookFunctions( _hooks, 1, false ); + g_p = NULL; + } + + m_pCell->Release(); + m_pPortal->Release(); + + m_pCell = NULL; + m_pPortal = NULL; +} + +cDatService *cDatService::g_p = NULL; +cDatService::fn_CreateFile cDatService::g_fn_CreateFile = NULL; + +STDMETHODIMP cDatService::Lookup( BSTR strName, IUnknown **ppItf ) +{ + static _bstr_t _strPortal( _T( "portal" ) ), + _strCell( _T( "cell" ) ); + + if( ::VarBstrCmp( strName, _strPortal, 0, NORM_IGNORECASE ) == VARCMP_EQ ) + return m_pPortal->QueryInterface( IID_IUnknown, reinterpret_cast< void ** >( ppItf ) ); + + if( ::VarBstrCmp( strName, _strCell, 0, NORM_IGNORECASE ) == VARCMP_EQ ) + return m_pCell->QueryInterface( IID_IUnknown, reinterpret_cast< void ** >( ppItf ) ); + + // None of the above + return E_INVALIDARG; +} diff --git a/Native/DecalDat/DatService.h b/Native/DecalDat/DatService.h new file mode 100644 index 0000000..59221b9 --- /dev/null +++ b/Native/DecalDat/DatService.h @@ -0,0 +1,87 @@ +// DatService.h : Declaration of the cDatService + +#ifndef __DATSERVICE_H_ +#define __DATSERVICE_H_ + +#include "resource.h" // main symbols +#include + +class cDatLibrary; + +///////////////////////////////////////////////////////////////////////////// +// cDatService +class ATL_NO_VTABLE cDatService : + public CComObjectRootEx, + public CComCoClass, + public IDecalServiceImpl< cDatService >, + public IDecalDirectory, + public IDispatchImpl +{ +public: + cDatService() + : m_pCell( NULL ), + m_pPortal( NULL ) + { + } + + struct cFileFilter + { + std::string m_strName; + CLSID m_clsid; + bool m_bCache; + }; + + typedef std::vector< cFileFilter > cFileFilterList; + cFileFilterList m_filters; + + cFileFilter *getFilter( LPTSTR szFilter, int nLength ); + HRESULT createFilter( cFileFilter *pFilter, REFIID iid, LPVOID *ppvItf ); + + enum eLibrary + { + eCell, + ePortal + }; + + struct cFileCache + { + cFileFilter *m_pFilter; + eLibrary m_library; + DWORD m_dwFile; + CComPtr< IUnknown > m_pFile; + }; + + typedef std::deque< cFileCache > cFileCacheList; + cFileCacheList m_cache; + + HRESULT onInitialize(); + void onTerminate(); + + cDatLibrary *m_pCell, + *m_pPortal; + + static cDatService *g_p; + + // Hooked functions + typedef HANDLE (WINAPI *fn_CreateFile)(LPCTSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); + static fn_CreateFile g_fn_CreateFile; + +DECLARE_REGISTRY_RESOURCEID(IDR_DATSERVICE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDatService) + COM_INTERFACE_ENTRY(IDecalService) + COM_INTERFACE_ENTRY(IDecalDirectory) + COM_INTERFACE_ENTRY(IDatService) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IDatService +public: + + // IDecalDirectory + STDMETHOD(Lookup)(BSTR strName, IUnknown **ppItf); +}; + +#endif //__DATSERVICE_H_ diff --git a/Native/DecalDat/DatService.rgs b/Native/DecalDat/DatService.rgs new file mode 100644 index 0000000..9b397ad --- /dev/null +++ b/Native/DecalDat/DatService.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalDat.DatService.1 = s 'DatService Class' + { + CLSID = s '{37B083F0-276E-43AD-8D26-3F7449B519DC}' + } + DecalDat.DatService = s 'DatService Class' + { + CLSID = s '{37B083F0-276E-43AD-8D26-3F7449B519DC}' + CurVer = s 'DecalDat.DatService.1' + } + NoRemove CLSID + { + ForceRemove {37B083F0-276E-43AD-8D26-3F7449B519DC} = s 'DatService Class' + { + ProgID = s 'DecalDat.DatService.1' + VersionIndependentProgID = s 'DecalDat.DatService' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{C2C11EC7-2CB9-4999-BDD9-AF599455601F}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Services + { + ForceRemove {37B083F0-276E-43AD-8D26-3F7449B519DC} = s 'Decal Dat Service' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/DecalDat/DatStream.cpp b/Native/DecalDat/DatStream.cpp new file mode 100644 index 0000000..74b1e90 --- /dev/null +++ b/Native/DecalDat/DatStream.cpp @@ -0,0 +1,95 @@ +// DatStream.cpp : Implementation of cDatStream +#include "stdafx.h" +#include "DecalDat.h" +#include "DatStream.h" + +///////////////////////////////////////////////////////////////////////////// +// cDatStream + + +STDMETHODIMP cDatStream::get_Size(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = static_cast< long >( m_pFile->getSize() ); + + return S_OK; +} + +STDMETHODIMP cDatStream::get_Tell(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = static_cast< long >( m_pFile->tell() ); + + return S_OK; +} + +STDMETHODIMP cDatStream::Skip(long Bytes) +{ + if( Bytes < 0 ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + m_pFile->skip( static_cast< DWORD >( Bytes ) ); + + return S_OK; +} + +STDMETHODIMP cDatStream::Restart() +{ + m_pFile->reset(); + + return S_OK; +} + +STDMETHODIMP cDatStream::ReadBinary(long Bytes, BYTE *Buffer) +{ + if( Bytes < 0 ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + if( Buffer == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + m_pFile->read( Buffer, static_cast< DWORD >( Bytes ) ); + + return S_OK; +} + +STDMETHODIMP cDatStream::Read(long Bytes, BSTR *Data) +{ + if( Bytes < 0 ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + if( Data == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + BYTE *Buffer = reinterpret_cast< BYTE * >( ::_alloca( Bytes ) ); + m_pFile->read( Buffer, static_cast< DWORD >( Bytes ) ); + + *Data = ::SysAllocStringByteLen( reinterpret_cast< LPCTSTR >( Buffer ), Bytes ); + + return S_OK; +} diff --git a/Native/DecalDat/DatStream.h b/Native/DecalDat/DatStream.h new file mode 100644 index 0000000..bdaa485 --- /dev/null +++ b/Native/DecalDat/DatStream.h @@ -0,0 +1,42 @@ +// DatStream.h : Declaration of the cDatStream + +#ifndef __DATSTREAM_H_ +#define __DATSTREAM_H_ + +#include "resource.h" // main symbols + +#include "DatFile.h" + +///////////////////////////////////////////////////////////////////////////// +// cDatStream +class ATL_NO_VTABLE cDatStream : + public CComObjectRootEx, + public CComCoClass, + public IDatStream +{ +public: + cDatStream() + { + } + + cDatFile::cFile *m_pFile; + +DECLARE_REGISTRY_RESOURCEID(IDR_DATSTREAM) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDatStream) + COM_INTERFACE_ENTRY(IDatStream) +END_COM_MAP() + +// IDatStream +public: + STDMETHOD(Read)(long Bytes, /*[out, retval]*/ BSTR *Data); + STDMETHOD(ReadBinary)(long Bytes, /*[size_is(Bytes)]*/ BYTE *Buffer); + STDMETHOD(Restart)(); + STDMETHOD(Skip)(long Bytes); + STDMETHOD(get_Tell)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Size)(/*[out, retval]*/ long *pVal); +}; + +#endif //__DATSTREAM_H_ diff --git a/Native/DecalDat/DecalDat.cpp b/Native/DecalDat/DecalDat.cpp new file mode 100644 index 0000000..945a32f --- /dev/null +++ b/Native/DecalDat/DecalDat.cpp @@ -0,0 +1,71 @@ +// DecalDat.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f DecalDatps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "DecalDat.h" + +#include "DecalDat_i.c" +#include "DatService.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_DatService, cDatService) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_DecalDat); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + + diff --git a/Native/DecalDat/DecalDat.def b/Native/DecalDat/DecalDat.def new file mode 100644 index 0000000..52740d0 --- /dev/null +++ b/Native/DecalDat/DecalDat.def @@ -0,0 +1,9 @@ +; DecalDat.def : Declares the module parameters. + +LIBRARY "DecalDat.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Native/DecalDat/DecalDat.dsp b/Native/DecalDat/DecalDat.dsp new file mode 100644 index 0000000..d14abaf --- /dev/null +++ b/Native/DecalDat/DecalDat.dsp @@ -0,0 +1,284 @@ +# Microsoft Developer Studio Project File - Name="DecalDat" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=DecalDat - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "DecalDat.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "DecalDat.mak" CFG="DecalDat - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "DecalDat - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalDat - Win32 Unicode Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalDat - Win32 Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalDat - Win32 Unicode Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "DecalDat - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /ZI /Od /Oy /Ob0 /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\Projects\decaldev2\source\Debug\DecalDat.dll +InputPath=\Projects\decaldev2\source\Debug\DecalDat.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalDat - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "DebugU" +# PROP BASE Intermediate_Dir "DebugU" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "DebugU" +# PROP Intermediate_Dir "DebugU" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\DebugU +TargetPath=.\DebugU\DecalDat.dll +InputPath=.\DebugU\DecalDat.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + if "%OS%"=="" goto NOTNT + if not "%OS%"=="Windows_NT" goto NOTNT + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + goto end + :NOTNT + echo Warning : Cannot register Unicode DLL on Windows 95 + :end + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalDat - Win32 Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinDependency" +# PROP BASE Intermediate_Dir "ReleaseMinDependency" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinDependency" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /D "_ATL_STATIC_REGISTRY" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX- /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "_MBCS" /D "_ATL_DLL" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libctiny.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libctiny.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\Projects\decaldev2\source\Release\DecalDat.dll +InputPath=\Projects\decaldev2\source\Release\DecalDat.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalDat - Win32 Unicode Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseUMinSize" +# PROP BASE Intermediate_Dir "ReleaseUMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ReleaseUMinSize" +# PROP Intermediate_Dir "ReleaseUMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /Zi /O1 /I "..\Include" /D "_UNICODE" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libctiny.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\ReleaseUMinSize +TargetPath=.\ReleaseUMinSize\DecalDat.dll +InputPath=.\ReleaseUMinSize\DecalDat.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + if "%OS%"=="" goto NOTNT + if not "%OS%"=="Windows_NT" goto NOTNT + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + goto end + :NOTNT + echo Warning : Cannot register Unicode DLL on Windows 95 + :end + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "DecalDat - Win32 Debug" +# Name "DecalDat - Win32 Unicode Debug" +# Name "DecalDat - Win32 Release MinSize" +# Name "DecalDat - Win32 Unicode Release MinSize" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\DatFile.cpp +# End Source File +# Begin Source File + +SOURCE=.\DatLibrary.cpp +# End Source File +# Begin Source File + +SOURCE=.\DatService.cpp +# End Source File +# Begin Source File + +SOURCE=.\DatStream.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalDat.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalDat.def +# End Source File +# Begin Source File + +SOURCE=..\Include\DecalDat.idl +# ADD MTL /nologo /tlb "DecalDat.tlb" /h "..\Include\DecalDat.h" /iid "..\Include\DecalDat_i.c" /Oicf +# End Source File +# Begin Source File + +SOURCE=.\DecalDat.rc +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\DatFile.h +# End Source File +# Begin Source File + +SOURCE=.\DatLibrary.h +# End Source File +# Begin Source File + +SOURCE=.\DatService.h +# End Source File +# Begin Source File + +SOURCE=.\DatStream.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\DatLibrary.rgs +# End Source File +# Begin Source File + +SOURCE=.\DatService.rgs +# End Source File +# Begin Source File + +SOURCE=.\DatStream.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/DecalDat/DecalDat.rc b/Native/DecalDat/DecalDat.rc new file mode 100644 index 0000000..da6b87a --- /dev/null +++ b/Native/DecalDat/DecalDat.rc @@ -0,0 +1,133 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""DecalDat.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "DecalDat houses the functionality that extracts data from the portal.dat file" + VALUE "FileDescription", "DecalDat Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "DecalDat" + VALUE "LegalCopyright", "Copyright 2001" + VALUE "OriginalFilename", "DecalDat.DLL" + VALUE "ProductName", "DecalDat Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "DecalDat" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_DATSERVICE REGISTRY "DatService.rgs" +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "DecalDat.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/DecalDat/DecalDat.vcproj b/Native/DecalDat/DecalDat.vcproj new file mode 100644 index 0000000..2f332fa --- /dev/null +++ b/Native/DecalDat/DecalDat.vcproj @@ -0,0 +1,784 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/DecalDat/DecalDatps.def b/Native/DecalDat/DecalDatps.def new file mode 100644 index 0000000..f820ffa --- /dev/null +++ b/Native/DecalDat/DecalDatps.def @@ -0,0 +1,11 @@ + +LIBRARY "DecalDatPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/DecalDat/DecalDatps.mk b/Native/DecalDat/DecalDatps.mk new file mode 100644 index 0000000..fe9368f --- /dev/null +++ b/Native/DecalDat/DecalDatps.mk @@ -0,0 +1,16 @@ + +DecalDatps.dll: dlldata.obj DecalDat_p.obj DecalDat_i.obj + link /dll /out:DecalDatps.dll /def:DecalDatps.def /entry:DllMain dlldata.obj DecalDat_p.obj DecalDat_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del DecalDatps.dll + @del DecalDatps.lib + @del DecalDatps.exp + @del dlldata.obj + @del DecalDat_p.obj + @del DecalDat_i.obj diff --git a/Native/DecalDat/StdAfx.cpp b/Native/DecalDat/StdAfx.cpp new file mode 100644 index 0000000..07f7b46 --- /dev/null +++ b/Native/DecalDat/StdAfx.cpp @@ -0,0 +1,5 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" diff --git a/Native/DecalDat/StdAfx.h b/Native/DecalDat/StdAfx.h new file mode 100644 index 0000000..c71d7ec --- /dev/null +++ b/Native/DecalDat/StdAfx.h @@ -0,0 +1,44 @@ +// 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__AC185D62_C11D_4681_B5DF_265B11F73819__INCLUDED_) +#define AFX_STDAFX_H__AC185D62_C11D_4681_B5DF_265B11F73819__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _ATL_APARTMENT_THREADED + +#pragma warning(disable:4530) + +//C Library includes +#include +#include + + +#ifdef NDEBUG + #ifdef _ATL_DLL + #undef _ATL_DLL + #endif +#endif +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include +#include +#include +#include +#include +#include + +#include + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__AC185D62_C11D_4681_B5DF_265B11F73819__INCLUDED) diff --git a/Native/DecalDat/resource.h b/Native/DecalDat/resource.h new file mode 100644 index 0000000..b59a412 --- /dev/null +++ b/Native/DecalDat/resource.h @@ -0,0 +1,19 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by DecalDat.rc +// +#define IDS_PROJNAME 100 +#define IDR_DATSERVICE 101 +#define IDR_DATLIBRARY 102 +#define IDR_DATSTREAM 103 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 104 +#endif +#endif diff --git a/Native/DecalFilters/AllegianceInfo.cpp b/Native/DecalFilters/AllegianceInfo.cpp new file mode 100644 index 0000000..beb1cac --- /dev/null +++ b/Native/DecalFilters/AllegianceInfo.cpp @@ -0,0 +1,83 @@ + +#include "stdafx.h" +#include "DecalFilters.h" +#include "AllegianceInfo.h" + +///////////////////////////////////////////////////////////////////////////// + +STDMETHODIMP cAllegianceInfo::get_Name(BSTR *pVal) +{ + *pVal = T2BSTR( m_pAllegiance->Name ); + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_GUID(long *pVal) +{ + *pVal = m_pAllegiance->GUID; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_TreeParent(long *pVal) +{ + *pVal = m_pAllegiance->TreeParent; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_Type(long *pVal) +{ + *pVal = m_pAllegiance->Type; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_XP(long *pVal) +{ + *pVal = m_pAllegiance->XP; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_Loyalty(long *pVal) +{ + *pVal = m_pAllegiance->Loyalty; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_Leadership(long *pVal) +{ + *pVal = m_pAllegiance->Leadership; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_Gender(long *pVal) +{ + *pVal = m_pAllegiance->Gender; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_Race(long *pVal) +{ + *pVal = m_pAllegiance->Race; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_Rank(long *pVal) +{ + *pVal = m_pAllegiance->Rank; + + return S_OK; +} + +STDMETHODIMP cAllegianceInfo::get_Unknown(double *pVal) +{ + *pVal = m_pAllegiance->Unknown; + + return S_OK; +} diff --git a/Native/DecalFilters/AllegianceInfo.h b/Native/DecalFilters/AllegianceInfo.h new file mode 100644 index 0000000..82fc769 --- /dev/null +++ b/Native/DecalFilters/AllegianceInfo.h @@ -0,0 +1,55 @@ +// AllegianceInfo.h: Definition of the AllegianceInfo class +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_ALLEGIANCEINFO_H__5CFBBCEE_BF69_4C0A_984D_6694471DD508__INCLUDED_) +#define AFX_ALLEGIANCEINFO_H__5CFBBCEE_BF69_4C0A_984D_6694471DD508__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" // main symbols +#include "CharacterStats.h" + +///////////////////////////////////////////////////////////////////////////// +// AllegianceInfo + +class cAllegianceInfo : + public IDispatchImpl, + public CComObjectRoot, + public CComCoClass +{ +public: + + cAllegianceInfo() + { + m_pAllegiance = &m_pAlleg; + } + + cCharacterStats::cAllegianceInfo m_pAlleg; + cCharacterStats::cAllegianceInfo *m_pAllegiance; + +BEGIN_COM_MAP(cAllegianceInfo) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IAllegianceInfo) +END_COM_MAP() + +//DECLARE_REGISTRY_RESOURCEID(IDR_AllegianceInfo) + +// IAllegianceInfo +public: + STDMETHOD(get_Unknown)(/*[out, retval]*/ double *pVal); + STDMETHOD(get_Rank)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Race)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Gender)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Leadership)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Loyalty)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_XP)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Type)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_TreeParent)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_GUID)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pVal); +}; + +#endif // !defined(AFX_ALLEGIANCEINFO_H__5CFBBCEE_BF69_4C0A_984D_6694471DD508__INCLUDED_) diff --git a/Native/DecalFilters/AllegianceInfo.rgs b/Native/DecalFilters/AllegianceInfo.rgs new file mode 100644 index 0000000..6363130 --- /dev/null +++ b/Native/DecalFilters/AllegianceInfo.rgs @@ -0,0 +1,23 @@ +HKCR +{ + DecalFilters.AllegianceInfo.1 = s 'AllegianceInfo Class' + { + CLSID = s '{B2EB5B5A-5E3F-4F60-8BC0-BB729FFC04F6}' + } + DecalFilters.AllegianceInfo = s 'AllegianceInfo Class' + { + CLSID = s '{B2EB5B5A-5E3F-4F60-8BC0-BB729FFC04F6}' + } + NoRemove CLSID + { + ForceRemove {B2EB5B5A-5E3F-4F60-8BC0-BB729FFC04F6} = s 'AllegianceInfo Class' + { + ProgID = s 'DecalFilters.AllegianceInfo.1' + VersionIndependentProgID = s 'DecalFilters.AllegianceInfo' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Native/DecalFilters/Attic/Location.cpp b/Native/DecalFilters/Attic/Location.cpp new file mode 100644 index 0000000..d0e7f0c --- /dev/null +++ b/Native/DecalFilters/Attic/Location.cpp @@ -0,0 +1,36 @@ +// Location.cpp : Implementation of cLocation +#include "stdafx.h" +#include "DecalFilters.h" +#include "Location.h" + +///////////////////////////////////////////////////////////////////////////// +// cLocation + + +STDMETHODIMP cLocation::get_Landblock(long *pVal) +{ + if (pVal == NULL) { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = m_dwLandblock; + return S_OK; +} + +STDMETHODIMP cLocation::Offset(float *x, float *y, float *z) +{ + *x = m_fxOffset; + *y = m_fyOffset; + *z = m_fzOffset; + return S_OK; +} + +STDMETHODIMP cLocation::Heading(float *x, float *y, float *z, float *w) +{ + *x = m_fxHeading; + *y = m_fyHeading; + *z = m_fzHeading; + *w = m_fwHeading; + return S_OK; +} diff --git a/Native/DecalFilters/Attic/Location.h b/Native/DecalFilters/Attic/Location.h new file mode 100644 index 0000000..1a6273e --- /dev/null +++ b/Native/DecalFilters/Attic/Location.h @@ -0,0 +1,56 @@ +// Location.h : Declaration of the cLocation + +#ifndef __LOCATION_H_ +#define __LOCATION_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cLocation +class ATL_NO_VTABLE cLocation : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + cLocation() + { + m_dwLandblock = 0; + + m_fxOffset = 0.0f; + m_fyOffset = 0.0f; + m_fzOffset = 0.0f; + + m_fxHeading = 0.0f; + m_fyHeading = 0.0f; + m_fzHeading = 0.0f; + m_fwHeading = 0.0f; + } + +DECLARE_REGISTRY_RESOURCEID(IDR_LOCATION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cLocation) + COM_INTERFACE_ENTRY(ILocation) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// ILocation +public: + STDMETHOD(Heading)(float *x, float *y, float *z, float *w); + STDMETHOD(Offset)(float *x, float *y, float *z); + STDMETHOD(get_Landblock)(/*[out, retval]*/ long *pVal); + long m_dwLandblock; + + float m_fxOffset; + float m_fyOffset; + float m_fzOffset; + + float m_fxHeading; + float m_fyHeading; + float m_fzHeading; + float m_fwHeading; +}; + +#endif //__LOCATION_H_ diff --git a/Native/DecalFilters/Attic/Location.rgs b/Native/DecalFilters/Attic/Location.rgs new file mode 100644 index 0000000..cd1ebd3 --- /dev/null +++ b/Native/DecalFilters/Attic/Location.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalFilters.Location.1 = s 'Location Class' + { + CLSID = s '{4031CDC0-FC4F-428F-B98A-ACAFA6CF19FB}' + } + DecalFilters.Location = s 'Location Class' + { + CLSID = s '{4031CDC0-FC4F-428F-B98A-ACAFA6CF19FB}' + CurVer = s 'DecalFilters.Location.1' + } + NoRemove CLSID + { + ForceRemove {4031CDC0-FC4F-428F-B98A-ACAFA6CF19FB} = s 'Location Class' + { + ProgID = s 'DecalFilters.Location.1' + VersionIndependentProgID = s 'DecalFilters.Location' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} diff --git a/Native/DecalFilters/Attic/Stackable.cpp b/Native/DecalFilters/Attic/Stackable.cpp new file mode 100644 index 0000000..26e189f --- /dev/null +++ b/Native/DecalFilters/Attic/Stackable.cpp @@ -0,0 +1,8 @@ +// Stackable.cpp : Implementation of cStackable +#include "stdafx.h" +#include "DecalFilters.h" +#include "Stackable.h" + +///////////////////////////////////////////////////////////////////////////// +// cStackable + diff --git a/Native/DecalFilters/Attic/Stackable.h b/Native/DecalFilters/Attic/Stackable.h new file mode 100644 index 0000000..83efed7 --- /dev/null +++ b/Native/DecalFilters/Attic/Stackable.h @@ -0,0 +1,33 @@ +// Stackable.h : Declaration of the cStackable + +#ifndef __STACKABLE_H_ +#define __STACKABLE_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cStackable +class ATL_NO_VTABLE cStackable : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + cStackable() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_STACKABLE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cStackable) + COM_INTERFACE_ENTRY(IStackable) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IStackable +public: +}; + +#endif //__STACKABLE_H_ diff --git a/Native/DecalFilters/Attic/Stackable.rgs b/Native/DecalFilters/Attic/Stackable.rgs new file mode 100644 index 0000000..e61a8a9 --- /dev/null +++ b/Native/DecalFilters/Attic/Stackable.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalFilters.Stackable.1 = s 'Stackable Class' + { + CLSID = s '{414EF2D6-E74F-4998-A2C7-26517162744E}' + } + DecalFilters.Stackable = s 'Stackable Class' + { + CLSID = s '{414EF2D6-E74F-4998-A2C7-26517162744E}' + CurVer = s 'DecalFilters.Stackable.1' + } + NoRemove CLSID + { + ForceRemove {414EF2D6-E74F-4998-A2C7-26517162744E} = s 'Stackable Class' + { + ProgID = s 'DecalFilters.Stackable.1' + VersionIndependentProgID = s 'DecalFilters.Stackable' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} diff --git a/Native/DecalFilters/AttributeInfo.cpp b/Native/DecalFilters/AttributeInfo.cpp new file mode 100644 index 0000000..0c3ec76 --- /dev/null +++ b/Native/DecalFilters/AttributeInfo.cpp @@ -0,0 +1,61 @@ +// AttributeInfo.cpp : Implementation of cAttributeInfo +#include "stdafx.h" +#include "DecalFilters.h" +#include "AttributeInfo.h" + +///////////////////////////////////////////////////////////////////////////// +// cAttributeInfo + +STDMETHODIMP cAttributeInfo::get_Name(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + USES_CONVERSION; + + *pVal = T2BSTR( m_pInfo->m_szName.c_str() ); + + return S_OK; +} + +STDMETHODIMP cAttributeInfo::get_Creation(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = m_pInfo->m_nBase; + + return S_OK; +} + +STDMETHODIMP cAttributeInfo::get_Exp(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = m_pInfo->m_nExp; + + return S_OK; +} + +STDMETHODIMP cAttributeInfo::get_Current(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = m_pInfo->m_nCurrent; + + return S_OK; +} diff --git a/Native/DecalFilters/AttributeInfo.h b/Native/DecalFilters/AttributeInfo.h new file mode 100644 index 0000000..269fba1 --- /dev/null +++ b/Native/DecalFilters/AttributeInfo.h @@ -0,0 +1,40 @@ +// AttributeInfo.h : Declaration of the cAttributeInfo + +#ifndef __ATTRIBUTEINFO_H_ +#define __ATTRIBUTEINFO_H_ + +#include "resource.h" // main symbols +#include "CharacterStats.h" + +///////////////////////////////////////////////////////////////////////////// +// cAttributeInfo +class ATL_NO_VTABLE cAttributeInfo : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + cAttributeInfo() + { + m_pInfo = &m_pAttribInfo; + } + + cCharacterStats::cAttributeInfo m_pAttribInfo; + cCharacterStats::cAttributeInfo *m_pInfo; + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cAttributeInfo) + COM_INTERFACE_ENTRY(IAttributeInfo) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IAttributeInfo +public: + STDMETHOD(get_Current)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Exp)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Creation)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pVal); +}; + +#endif //__ATTRIBUTEINFO_H_ diff --git a/Native/DecalFilters/CharacterStats.cpp b/Native/DecalFilters/CharacterStats.cpp new file mode 100644 index 0000000..75b66e3 --- /dev/null +++ b/Native/DecalFilters/CharacterStats.cpp @@ -0,0 +1,1849 @@ +// CharacterStats.cpp : Implementation of cCharacterStats +#include "stdafx.h" +#include "DecalFilters.h" +#include "CharacterStats.h" + +#include "AllegianceInfo.h" +#include "AttributeInfo.h" +#include "SkillInfo.h" +#include "Enchantment.h" +#include + +///////////////////////////////////////////////////////////////////////////// +// cCharacterStats + +#include +#include +#include + +struct stSkillInfo +{ + LPTSTR Name; + long AttribA, AttribB; + long Divider; + int TrainStyle; +}; + +const DWORD PrimStatArray[] = { 0, 110,277,501,784,1125,1527,1988,2511,3097,3746,4459,5238,6084,6998,7982,9038,10167,11372,12654,14015,15459,16988,18604,20311,22113,24012,26014,28122,30341,32676,35132,37716,40434,43293,46301,49465,52795,56300,59991,63878,67975,72295,76851,81659,86737,92102,97775,103775,110128,116858,123991,131559,139591,148124,157194,166843,177113,188053,199715,212153,225429,239609,254762,270967,288306,306870,326756,348070,370928,395453,421779,450054,480434,513091,548210,585992,626654,670432,717582,768378,823122,882136,945773,1014414,1088469,1168386,1254649,1347781,1448351,1556972,1674311,1801089,1938088,2086155,2246205,2419233,2606314,2808613,3027394,3264023,3519983,3796877,4096444,4420567,4771285,5150808,5561528,6006039,6487148,7007896,7571580,8181768,8842327,9557443,10331656,11169877,12077431,13060084,14124082,15276190,16523738,17874666,19337572,20921773,22637359,24495261,26507320,28686361,31046278,33602120,36370190,39368147,42615120,46131828,49940719,54066105,58534323,63373901,68615745,74293328,80442912,87103777,94318471,102133083,110597540,119765922,129696811,140453665,152105222,164725942,178396483,193204214,209243776,226617688,245437001,265822007,287903011,311821164,337729361,365793227,396192167,429120520,464788799,503425038,545276249,590610001,639716134,692908610,750527522,812941268,880548904,953782704,1033110914,1119040753,1212121655,1312948783,1422166831,1540474151,1668627219,1807445467,1957816530,2120701915,2297143157,2488268472,2695299977,2919561502,3162487055,3425629996,3710672964,4019438644 }; +const DWORD SecondaryStatArray[] = { 0, 73,183,331,517,743,1008,1312,1658,2044,2472,2943,3457,4015,4619,5268,5965,6711,7505,8352,9250,10203,11212,12279,13406,14595,15848,17169,18561,20025,21566,23187,24893,26687,28574,30559,32647,34845,37158,39594,42160,44864,47715,50722,53895,57247,60788,64531,68492,72685,77126,81834,86829,92130,97762,103748,110116,116895,124115,131812,140021,148784,158142,168143,178838,190282,202534,215659,229726,244812,260999,278375,297036,317087,338640,361819,386755,413592,442486,473604,507130,543260,582210,624211,669513,718390,771135,828069,889536,955912,1027602,1105046,1188719,1279139,1376862,1482495,1596694,1720167,1853685,1998080,2154256,2323189,2505939,2703654,2917575,3149049,3399533,3670609,3963986,4281518,4625212,4997243,5399967,5835936,6307913,6818893,7372119,7971105,8619656,9321894,10082286,10905668,11797280,12762798,13808370,14940657,16166873,17494831,18932998,20490543,22177399,24004326,25982977,28125979,30447007,32960875,35683629,38632653,41826775,45286392,49033597,53092322,57488493,62250191,67407835,72994377,79045509,85599896,92699419,100389447,108719122,117741679,127514781,138100892,149567674,161988421,175442525,190015988,205801968,222901379,241423530,261486830,283219543,306760608,332260525,359882324,389802601,422212649,457319683,495348165,536541237,581162277,629496585,681853203,738566897,800000293,866546197,938630108,1016712940,1101293965,1192914009,1292158910,1399663264,1516114484,1642257192,1778897985,1926910591,2087241457,2260915797,2449044157,2652829505,2873574933,3112691986,3371709687,3652284316,3956210003,4285430197 }; + +static stSkillInfo SkillInfo[] = { + { _T( "Unknown" ), eAttrNULL, eAttrNULL, 1, eTrainUnusable }, + { _T( "Axe" ), eAttrStrength, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Bow" ), eAttrCoordination, eAttrNULL, 2, eTrainUnusable }, + { _T( "Crossbow" ), eAttrCoordination, eAttrNULL, 2, eTrainUnusable }, + { _T( "Dagger" ), eAttrQuickness, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Mace" ), eAttrStrength, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Melee Defense" ), eAttrQuickness, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Missile Defense" ), eAttrQuickness, eAttrCoordination, 5, eTrainUnusable }, + { _T( "Unknown" ), eAttrNULL, eAttrNULL, 1, eTrainUnusable }, + { _T( "Spear" ), eAttrStrength, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Staff" ), eAttrStrength, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Sword" ), eAttrStrength, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Thrown Weapons" ), eAttrCoordination, eAttrNULL, 2, eTrainUnusable }, + { _T( "Unarmed Combat" ), eAttrStrength, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Arcane Lore" ), eAttrFocus, eAttrNULL, 3, eTrainUnusable }, + { _T( "Magic Defense" ), eAttrFocus, eAttrSelf, 7, eTrainUnusable }, + { _T( "Mana Conversion" ), eAttrFocus, eAttrSelf, 6, eTrainUnusable }, + { _T( "Unknown" ), eAttrNULL, eAttrNULL, 1, eTrainUnusable }, + { _T( "Item Tinkering" ), eAttrFocus, eAttrCoordination, 2, eTrainUnusable }, + { _T( "Assess Person" ), eAttrFocus, eAttrSelf, 2, eTrainUnusable }, + { _T( "Deception" ), eAttrFocus, eAttrSelf, 4, eTrainUnusable }, + { _T( "Healing" ), eAttrFocus, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Jump" ), eAttrStrength, eAttrCoordination, 2, eTrainUnusable }, + { _T( "Lockpick" ), eAttrFocus, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Run" ), eAttrQuickness, eAttrNULL, 1, eTrainUnusable }, + { _T( "Unknown" ), eAttrNULL, eAttrNULL, 1, eTrainUnusable }, + { _T( "Unknown" ), eAttrNULL, eAttrNULL, 1, eTrainUnusable }, + { _T( "Assess Creature" ), eAttrFocus, eAttrSelf, 2, eTrainUnusable }, + { _T( "Weapon Tinkering" ), eAttrFocus, eAttrStrength, 2, eTrainUnusable }, + { _T( "Armor Tinkering" ), eAttrFocus, eAttrEndurance, 2, eTrainUnusable }, + { _T( "Magic Item Tinkering" ), eAttrFocus, eAttrNULL, 1, eTrainUnusable }, + { _T( "Creature Enchantment" ), eAttrFocus, eAttrSelf, 4, eTrainUnusable }, + { _T( "Item Enchantment" ), eAttrFocus, eAttrSelf, 4, eTrainUnusable }, + { _T( "Life Magic" ), eAttrFocus, eAttrSelf, 4, eTrainUnusable }, + { _T( "War Magic" ), eAttrFocus, eAttrSelf, 4, eTrainUnusable }, + { _T( "Leadership" ), eAttrSelf, eAttrNULL, 4, eTrainUnusable }, + { _T( "Loyalty" ), eAttrSelf, eAttrNULL, 4, eTrainUnusable }, + { _T( "Fletching" ), eAttrFocus, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Alchemy" ), eAttrFocus, eAttrCoordination, 3, eTrainUnusable }, + { _T( "Cooking" ), eAttrFocus, eAttrCoordination, 3, eTrainUnusable } +}; + +STDMETHODIMP cCharacterStats::Initialize(INetService *pService) +{ + m_pService = pService; + m_pService->get_Decal( &m_pDecal ); + + SpellsLearned.clear(); + Enchantments.clear(); + + GotLogin = false; + GotAlleg = false; + memset( Name, 0, sizeof( Name ) ); + memset( Gender, 0, sizeof( Gender ) ); + memset( Race, 0, sizeof( Race ) ); + memset( Class, 0, sizeof( Class ) ); + memset( Server, 0, sizeof( Server ) ); + memset( PrimStat, 0, sizeof( PrimStat ) ); + memset( PrimStatInitial, 0, sizeof( PrimStatInitial ) ); + memset( SecStatInc, 0, sizeof( SecStatInc ) ); + memset( SkillInc, 0, sizeof( SkillInc ) ); + memset( SkillTrain, 0, sizeof( SkillTrain ) ); + memset( SkillXP, 0, sizeof( SkillXP ) ); + memset( SkillBonus, 0, sizeof( SkillBonus ) ); + memset( &MyAlleg, 0, sizeof( MyAlleg ) ); + memset( &Monarch, 0, sizeof( Monarch ) ); + memset( &Patron, 0, sizeof( Patron ) ); + memset( Vassals, 0, sizeof( Vassals ) ); + TotalBurden = 0; + TotalPyreal = 0; + TotalXP = 0; + UnassignedXP = 0; + SkillPoints = 0; + Level = 0; + Rank = 0; + Deaths = 0; + Birth = 0; + Age = 0; + Vitae = 1.0f; + DrainRange = 0.0f; + HarmRange = 0.0f; + GUID = 0; + VassalCount = 0; + Followers = 0; + MonarchFollowers = 0; + return S_OK; +} + +STDMETHODIMP cCharacterStats::Terminate() +{ + m_pService.Release(); + m_pDecal.Release(); + + return S_OK; +} + +STDMETHODIMP cCharacterStats::DispatchClient(IMessage2 *pMsg) +{ + return S_OK; +} + +STDMETHODIMP cCharacterStats::DispatchServer(IMessage2 *pMessage) +{ + USES_CONVERSION; + + long dwType; pMessage->get_Type( &dwType ); + switch( dwType ) + { + case 0xF746: // Character Entering World + { + _variant_t vObjectID; + + pMessage->get_Member (_variant_t ("character"), &vObjectID); + GUID = vObjectID.lVal; + + break; + } + + case 0xF659: // Login Failure - Char in World + { + GotLogin = false; + GotAlleg = false; + memset( Name, 0, sizeof( Name ) ); + memset( Gender, 0, sizeof( Gender ) ); + memset( Race, 0, sizeof( Race ) ); + memset( Class, 0, sizeof( Class ) ); + memset( PrimStat, 0, sizeof( PrimStat ) ); + memset( PrimStatInitial, 0, sizeof( PrimStatInitial ) ); + memset( SecStatInc, 0, sizeof( SecStatInc ) ); + memset( SkillInc, 0, sizeof( SkillInc ) ); + memset( SkillTrain, 0, sizeof( SkillTrain ) ); + memset( SkillXP, 0, sizeof( SkillXP ) ); + memset( SkillBonus, 0, sizeof( SkillBonus ) ); + memset( &MyAlleg, 0, sizeof( MyAlleg ) ); + memset( &Monarch, 0, sizeof( Monarch ) ); + memset( &Patron, 0, sizeof( Patron ) ); + memset( Vassals, 0, sizeof( Vassals ) ); + TotalBurden = 0; + TotalPyreal = 0; + TotalXP = 0; + UnassignedXP = 0; + SkillPoints = 0; + Level = 0; + Rank = 0; + Deaths = 0; + Birth = 0; + Age = 0; + Vitae = 1.0f; + DrainRange = 0.0f; + HarmRange = 0.0f; + GUID = 0; + VassalCount = 0; + Followers = 0; + MonarchFollowers = 0; + SpellsLearned.clear(); + Enchantments.clear(); + + break; + } + case 0xF653: // End 3d Mode + { + GotLogin = false; + GotAlleg = false; + memset( Name, 0, sizeof( Name ) ); + memset( Gender, 0, sizeof( Gender ) ); + memset( Race, 0, sizeof( Race ) ); + memset( Class, 0, sizeof( Class ) ); + memset( PrimStat, 0, sizeof( PrimStat ) ); + memset( PrimStatInitial, 0, sizeof( PrimStatInitial ) ); + memset( SecStatInc, 0, sizeof( SecStatInc ) ); + memset( SkillInc, 0, sizeof( SkillInc ) ); + memset( SkillTrain, 0, sizeof( SkillTrain ) ); + memset( SkillXP, 0, sizeof( SkillXP ) ); + memset( SkillBonus, 0, sizeof( SkillBonus ) ); + memset( &MyAlleg, 0, sizeof( MyAlleg ) ); + memset( &Monarch, 0, sizeof( Monarch ) ); + memset( &Patron, 0, sizeof( Patron ) ); + memset( Vassals, 0, sizeof( Vassals ) ); + TotalBurden = 0; + TotalPyreal = 0; + TotalXP = 0; + UnassignedXP = 0; + SkillPoints = 0; + Level = 0; + Rank = 0; + Deaths = 0; + Birth = 0; + Age = 0; + Vitae = 1.0f; + DrainRange = 0.0f; + HarmRange = 0.0f; + GUID = 0; + VassalCount = 0; + Followers = 0; + MonarchFollowers = 0; + SpellsLearned.clear(); + Enchantments.clear(); + + break; + } + + case 0xF65A: // MOTD ? + { + _variant_t vMess; + pMessage->get_Member( _variant_t ("message"), &vMess); + + memcpy(Server, OLE2T( vMess.bstrVal ) + 24, sizeof( Server ) ); + + //char *szPeriod = strstr( Server, "." ); + // para - fix for the ever changing dt motd + char * szLf = strstr( Server, "\n" ); + + //if( szPeriod ) + // *szPeriod = 0; + if ( szLf ) + { + *(--szLf) = 0; // seems ac uses /r/n, but strstr for /r didn't work in testing + if (*(--szLf) == '.') + *szLf = 0; + + //check for spaces (eff u dt!!!) + szLf = strstr(Server, " "); + if (szLf) + *szLf = 0; + } + else //something went wrong, put "Unknown" + strncpy(Server, "Unknown\0", 8); + + break; + } + + case 0x0244: // Update Vital Statistic + { + _variant_t vStat; + _variant_t vValue; + + pMessage->get_Member (_variant_t ("vital"), &vStat); + _ASSERTE(vStat.vt == VT_I4); + + pMessage->get_Member (_variant_t ("value"), &vValue); + _ASSERTE(vValue.vt == VT_I4); + + switch (vStat.lVal) + { + case 2: //Health + Health = vValue.lVal; + break; + case 4: //Stam + Stamina = vValue.lVal; + break; + case 6: //Mana + Mana = vValue.lVal; + break; + } + + break; + } + case 0xF748: // Set Position and Motion + { + _variant_t vGUID; + + pMessage->get_Member(_variant_t ("object"), &vGUID); + + if (vGUID.lVal == GUID) + { + _variant_t vLandblock, vX, vY, vZ, vW; + _variant_t vLoc; + pMessage->get_Member (_variant_t ("position"), &vLoc); + IMessageMember *pLoc = (IMessageMember *) vLoc.pdispVal; + + pLoc->get_Member(_variant_t ("landblock"), &vLandblock); + pLoc->get_Member(_variant_t ("xOffset"), &vX); + pLoc->get_Member(_variant_t ("yOffset"), &vY); + pLoc->get_Member(_variant_t ("zOffset"), &vZ); + pLoc->get_Member(_variant_t ("xHeading"), &vW); + + Location.landblock = vLandblock.lVal; + Location.x = vX.fltVal; + Location.y = vY.fltVal; + Location.z = vZ.fltVal; + Location.w = vW.fltVal; + } + break; + } + + case 0x0237: + { + //Update Statistic + + _variant_t vType, vVal, vSeq; + pMessage->get_Member(_variant_t("statistic"), &vType); + pMessage->get_Member(_variant_t("value"), &vVal); + + if (vType.lVal == 0x05) + TotalBurden = vVal.lVal; + else if (vType.lVal == 0x14) + TotalPyreal = vVal.lVal; + else if (vType.lVal == 0x15) + TotalXP = vVal.lVal; + else if (vType.lVal == 0x16) + UnassignedXP = vVal.lVal; + else if (vType.lVal == 0x18) + SkillPoints = vVal.lVal; + else if (vType.lVal == 0x19) + Level = vVal.lVal; + else if (vType.lVal == 0x1E) + Rank = vVal.lVal; + else if (vType.lVal == 0x2B) + { + Deaths = vVal.lVal; + + // Remove all but item based enchantments + for (std::list::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + time_t CurrentTime = time(NULL); + long SecondsLeft = (*tpi)->ExpireTime - CurrentTime; + + if ( SecondsLeft >= 0 ) + { + delete *tpi; + Enchantments.erase(tpi--); + } + } + + RecalcSecStats(); + RecalcSkills(); + } + + else if (vType.lVal == 0x62) + Birth = vVal.lVal; + else if (vType.lVal == 0x7D) + Age = vVal.lVal; + + break; + } + + case 0x023E: + { + //Update Skill + + _variant_t vSkill, vInc, vTrain, vXP; + pMessage->get_Member(_variant_t("skill"), &vSkill); + pMessage->get_Member(_variant_t("skillOffset"), &vInc); + pMessage->get_Member(_variant_t("skillTrained"), &vTrain); + pMessage->get_Member(_variant_t("appliedXP"), &vXP); + + SkillInc[vSkill.iVal] = vInc.iVal; + SkillTrain[vSkill.iVal] = vTrain.lVal; + SkillXP[vSkill.iVal] = vXP.lVal; + + RecalcSkill(vSkill.iVal); + + break; + } + + case 0x0241: + { + //Update Attribute + + _variant_t vAttrib, vNew, vStartingValue; + pMessage->get_Member(_variant_t("Attribute"), &vAttrib); + pMessage->get_Member(_variant_t("NewIncrement"), &vNew); + pMessage->get_Member(_variant_t("StartingValue"), &vStartingValue); + + PrimStat[vAttrib.iVal - 1] = vNew.lVal + vStartingValue.lVal; + + RecalcStat(vAttrib.iVal - 1); + RecalcSkills(); + RecalcSecStats(); + + break; + } + + case 0x0243: + { + //Update Secondary Attribute + + _variant_t vAttrib, vNew; + pMessage->get_Member(_variant_t("Attribute"), &vAttrib); + pMessage->get_Member(_variant_t("PointsAdded"), &vNew); + + SecStatInc[(vAttrib.iVal - 1) / 2] = vNew.lVal; + + RecalcSecStats(); + + break; + } + case 0xF7B0: // Game Event + { + _variant_t vEvent; + + pMessage->get_Member (_variant_t ("event"), &vEvent); + _ASSERTE(vEvent.vt == VT_I4); + + switch (vEvent.intVal) + { + case (0x0013): // Character Login + { + GotLogin = true; + + _variant_t vObjectID; + _variant_t vStrings, vSpells; + _variant_t vStringCount, vSpellCount; + _variant_t vName; + + pMessage->get_Member (_variant_t ("character"), &vObjectID); + GUID = vObjectID.lVal; + + pMessage->get_Member (_variant_t ("countStrings"), &vStringCount); + pMessage->get_Member (_variant_t ("strings"), &vStrings); + for(int i = 0; i < (vStringCount.iVal); i++) + { + IMessageMember* pMember = (IMessageMember*) vStrings.pdispVal; + _variant_t vString1; + + pMember->get_Member (_variant_t (long(i)), &vString1); + + IMessageMember* pString = (IMessageMember*) vString1.pdispVal; + _variant_t vKey; + + pString->get_Member (_variant_t ("key"), &vKey); + _variant_t vVal; + pString->get_Member(_variant_t ("string"), &vVal); + + if (vKey.lVal == 0x01) + strncpy( Name, OLE2T( vVal.bstrVal ),sizeof( Name ) ); + else if (vKey.lVal == 0x03) + strncpy( Gender, OLE2T( vVal.bstrVal ),sizeof( Gender ) ); + else if (vKey.lVal == 0x04) + strncpy( Race, OLE2T( vVal.bstrVal ),sizeof( Race ) ); + else if (vKey.lVal == 0x05) + strncpy( Class, OLE2T( vVal.bstrVal ),sizeof( Class ) ); + } + + pMessage->get_Member (_variant_t ("countStats"), &vStringCount); + pMessage->get_Member (_variant_t ("stats"), &vStrings); + for(i = 0; i < (vStringCount.iVal); i++) + { + IMessageMember* pMember = (IMessageMember*) vStrings.pdispVal; + _variant_t vString1; + + pMember->get_Member (_variant_t (long(i)), &vString1); + + IMessageMember* pString = (IMessageMember*) vString1.pdispVal; + + _variant_t vType, vVal; + pString->get_Member (_variant_t ("key"), &vType); + pString->get_Member (_variant_t ("value"), &vVal); + + if (vType.lVal == 0x05) + TotalBurden = vVal.lVal; + else if (vType.lVal == 0x14) + TotalPyreal = vVal.lVal; + else if (vType.lVal == 0x15) + TotalXP = vVal.lVal; + else if (vType.lVal == 0x16) + UnassignedXP = vVal.lVal; + else if (vType.lVal == 0x18) + SkillPoints = vVal.lVal; + else if (vType.lVal == 0x19) + Level = vVal.lVal; + else if (vType.lVal == 0x1E) + Rank = vVal.lVal; + else if (vType.lVal == 0x2B) + Deaths = vVal.lVal; + else if (vType.lVal == 0x62) + Birth = vVal.lVal; + else if (vType.lVal == 0x7D) + Age = vVal.lVal; + } + + //New CharInfo Stuff + _variant_t G; + pMessage->get_Member(_variant_t ("initialStrength"), &G); PrimStatInitial[0] = G.lVal; + pMessage->get_Member(_variant_t ("initialEndurance"), &G); PrimStatInitial[1] = G.lVal; + pMessage->get_Member(_variant_t ("initialQuickness"), &G); PrimStatInitial[2] = G.lVal; + pMessage->get_Member(_variant_t ("initialCoordination"), &G); PrimStatInitial[3] = G.lVal; + pMessage->get_Member(_variant_t ("initialFocus"), &G); PrimStatInitial[4] = G.lVal; + pMessage->get_Member(_variant_t ("initialSelf"), &G); PrimStatInitial[5] = G.lVal; + + pMessage->get_Member(_variant_t ("incStrength"), &G); PrimStat[0] = G.lVal + PrimStatInitial[0]; CurStat[0] = PrimStat[0]; + pMessage->get_Member(_variant_t ("incEndurance"), &G); PrimStat[1] = G.lVal + PrimStatInitial[1]; CurStat[1] = PrimStat[1]; + pMessage->get_Member(_variant_t ("incQuickness"), &G); PrimStat[2] = G.lVal + PrimStatInitial[2]; CurStat[2] = PrimStat[2]; + pMessage->get_Member(_variant_t ("incCoordination"), &G); PrimStat[3] = G.lVal + PrimStatInitial[3]; CurStat[3] = PrimStat[3]; + pMessage->get_Member(_variant_t ("incFocus"), &G); PrimStat[4] = G.lVal + PrimStatInitial[4]; CurStat[4] = PrimStat[4]; + pMessage->get_Member(_variant_t ("incSelf"), &G); PrimStat[5] = G.lVal + PrimStatInitial[5]; CurStat[5] = PrimStat[5]; + + pMessage->get_Member(_variant_t ("incHealth"), &G); SecStatInc[0] = G.lVal; + pMessage->get_Member(_variant_t ("incStamina"), &G); SecStatInc[1] = G.lVal; + pMessage->get_Member(_variant_t ("incMana"), &G); SecStatInc[2] = G.lVal; + + pMessage->get_Member(_variant_t ("currentHealth"), &G); Health = G.lVal; + pMessage->get_Member(_variant_t ("currentStamina"), &G); Stamina = G.lVal; + pMessage->get_Member(_variant_t ("currentMana"), &G); Mana = G.lVal; + + _variant_t vRecordCount, vSkills; + pMessage->get_Member (_variant_t ("skillCount"), &vRecordCount); + pMessage->get_Member (_variant_t ("skills"), &vSkills); + + ZeroMemory(SkillTrain, sizeof(SkillTrain)); + + for(i = 0; i < (vRecordCount.iVal); i++) + { + IMessageMember* pMember = (IMessageMember*) vSkills.pdispVal; + _variant_t vMember1; + + pMember->get_Member (_variant_t (long(i)), &vMember1); + IMessageMember* pRecord = (IMessageMember*) vMember1.pdispVal; + + _variant_t vSkillN, vSkillI, vSkillT, vSkillX, vSkillF; + pRecord->get_Member(_variant_t ("skill"), &vSkillN); + pRecord->get_Member(_variant_t ("increment"), &vSkillI); + pRecord->get_Member(_variant_t ("trained"), &vSkillT); + pRecord->get_Member(_variant_t ("exp"), &vSkillX); + pRecord->get_Member(_variant_t ("bonusPoints"), &vSkillF); + + SkillBonus[vSkillN.iVal] = vSkillF.lVal; + SkillXP[vSkillN.iVal] = vSkillX.lVal; + SkillTrain[vSkillN.iVal] = vSkillT.lVal; + SkillInc[vSkillN.iVal] = vSkillI.iVal; + + float TPS = 0; + + if (SkillInfo[vSkillN.iVal].AttribA != eAttrNULL) + TPS += PrimStat[SkillInfo[vSkillN.iVal].AttribA]; + if (SkillInfo[vSkillN.iVal].AttribB != eAttrNULL) + TPS += PrimStat[SkillInfo[vSkillN.iVal].AttribB]; + + TPS /= SkillInfo[vSkillN.iVal].Divider; + + TPS += vSkillI.lVal + 0.5f; + + CurSkill[vSkillN.iVal] = static_cast (TPS); + } + + //Get Spellbook + CComPtr pBegin; + CComPtr pSpell; + CComPtr pSpellbook; + + pMessage->get_Begin( &pBegin ); + pMessage->get_Member( _variant_t( "spellbookCount" ), &vSpellCount ); + + short sSpellbookCount = vSpellCount.iVal; + HRESULT HRes = pBegin->get_NextObject( _bstr_t( "spellbook" ), &pSpellbook ); + if( HRes == S_OK ) + { + for( int i = 0; i < sSpellbookCount; i++ ) + { + pSpellbook->get_NextObjectIndex( &pSpell ); + + long lSpellID; + pSpell->get_NextInt( _bstr_t( "spell" ), &lSpellID ); + + SpellsLearned.insert( lSpellID ); + + pSpell.Release(); + } + } + + //Get Enchantments + _variant_t vSpell1; + _variant_t vEnchantment, vSpellID, vIndex, vSourceID, vDifficulty, vEffectMask, vAffected, vLevelMask, vFamily, vDuration, vTimeElapsed, vStartTime, vAdjustment; + + // Get Life Enchantments + pMessage->get_Member (_variant_t ("lifeSpellCount"), &vSpellCount); + _ASSERTE(vSpellCount.vt == VT_I4); + + if(vSpellCount.vt == VT_I4) + { + pMessage->get_Member (_variant_t ("lifeSpells"), &vSpells); + _ASSERTE (vSpells.vt == VT_DISPATCH); + + if(vSpells.vt == VT_DISPATCH) + { + for(i = 0; i < (vSpellCount.lVal); i++) + { + IMessageMember* pMember = (IMessageMember*) vSpells.pdispVal; + + pMember->get_Member (_variant_t (long(i)), &vSpell1); + _ASSERTE(vSpell1.vt == VT_DISPATCH); + + if (vSpell1.vt == VT_DISPATCH) + { + IMessageMember* pRecord = (IMessageMember*) vSpell1.pdispVal; + + pRecord->get_Member (_variant_t ("enchantment"), &vEnchantment); + _ASSERTE (vEnchantment.vt == VT_DISPATCH); + + if(vEnchantment.vt != VT_DISPATCH) + break; + + IMessageMember* pEnchantment = (IMessageMember*) vEnchantment.pdispVal; + + pEnchantment->get_Member (_variant_t ("spell"), &vSpellID); + _ASSERTE(vSpellID.vt == VT_I2); + pEnchantment->get_Member (_variant_t ("source"), &vSourceID); + _ASSERTE(vSourceID.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("layers"), &vIndex); + _ASSERTE(vIndex.vt == VT_I2); + pEnchantment->get_Member (_variant_t ("difficulty"), &vDifficulty); + _ASSERTE(vDifficulty.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("family"), &vFamily); + _ASSERTE(vFamily.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("duration"), &vDuration); + _ASSERTE(vDuration.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("timeElapsed"), &vTimeElapsed); + _ASSERTE(vTimeElapsed.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("startTime"), &vStartTime); + _ASSERTE(vStartTime.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("flags"), &vEffectMask); + _ASSERTE(vEffectMask.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("affected"), &vAffected); + _ASSERTE(vAffected.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("adjustment"), &vAdjustment); + _ASSERTE(vAdjustment.vt == VT_R4); + + AddEnchant(vSpellID.iVal, vIndex.iVal, vDuration.dblVal, vFamily.lVal, vTimeElapsed.dblVal, vEffectMask.lVal, vAffected.lVal, vAdjustment.fltVal); + } + } + } + } // vSpellCount.vt == VT_I4 + + // Get Creature Enchantments + pMessage->get_Member (_variant_t ("creatureSpellCount"), &vSpellCount); + _ASSERTE(vSpellCount.vt == VT_I4); + + if(vSpellCount.vt == VT_I4) + { + pMessage->get_Member (_variant_t ("creatureSpells"), &vSpells); + _ASSERTE (vSpells.vt == VT_DISPATCH); + + if(vSpells.vt == VT_DISPATCH) + { + for(i = 0; i < (vSpellCount.lVal); i++) + { + IMessageMember* pMember = (IMessageMember*) vSpells.pdispVal; + + pMember->get_Member (_variant_t (long(i)), &vSpell1); + _ASSERTE(vSpell1.vt == VT_DISPATCH); + + if (vSpell1.vt == VT_DISPATCH) + { + IMessageMember* pRecord = (IMessageMember*) vSpell1.pdispVal; + + pRecord->get_Member (_variant_t ("enchantment"), &vEnchantment); + _ASSERTE (vEnchantment.vt == VT_DISPATCH); + + if(vEnchantment.vt != VT_DISPATCH) + break; + + IMessageMember* pEnchantment = (IMessageMember*) vEnchantment.pdispVal; + + pEnchantment->get_Member (_variant_t ("spell"), &vSpellID); + _ASSERTE(vSpellID.vt == VT_I2); + pEnchantment->get_Member (_variant_t ("source"), &vSourceID); + _ASSERTE(vSourceID.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("layers"), &vIndex); + _ASSERTE(vIndex.vt == VT_I2); + pEnchantment->get_Member (_variant_t ("difficulty"), &vDifficulty); + _ASSERTE(vDifficulty.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("family"), &vFamily); + _ASSERTE(vFamily.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("duration"), &vDuration); + _ASSERTE(vDuration.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("timeElapsed"), &vTimeElapsed); + _ASSERTE(vTimeElapsed.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("startTime"), &vStartTime); + _ASSERTE(vStartTime.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("flags"), &vEffectMask); + _ASSERTE(vEffectMask.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("affected"), &vAffected); + _ASSERTE(vAffected.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("adjustment"), &vAdjustment); + _ASSERTE(vAdjustment.vt == VT_R4); + + AddEnchant(vSpellID.iVal, vIndex.iVal, vDuration.dblVal, vFamily.lVal, vTimeElapsed.dblVal, vEffectMask.lVal, vAffected.lVal, vAdjustment.fltVal); + } + } + } + } // vSpellCount.vt == VT_I4 + + _variant_t vVitae; + if( SUCCEEDED(pMessage->get_Member(_variant_t ("vitae"), &vVitae))) + { + if( vVitae.vt != VT_EMPTY ) + { + IMessageMember* pVitae = (IMessageMember*) vVitae.pdispVal; + pVitae->get_Member( _variant_t ("adjustment"), &vVitae); + Vitae = vVitae.fltVal + 0.0000001f; // for float inaccuracies like 0.9499999881 + } + + else + Vitae = 1.0f; + } + + else + Vitae = 1.0f; + + // Added to allow for varying enchantmentMask section since the above section doesn't + RecalcSecStats(); + RecalcSkills(); + + Fire_Login( GUID ); + } + + break; // Login + + case 0x0020: // Allegiance Info + { + GotAlleg = true; + Patron.GUID = 0; + Monarch.GUID = 0; + MyAlleg.GUID = 0; + VassalCount = 0; + + _variant_t vRecordCount, vRecords, vFol, vMonFol; + + pMessage->get_Member (_variant_t ("followers"), &vFol); + pMessage->get_Member (_variant_t ("allegianceSize"), &vMonFol); + + Followers = vFol.lVal; + MonarchFollowers = vMonFol.lVal; + + pMessage->get_Member (_variant_t ("recordCount"), &vRecordCount); + _ASSERTE(vRecordCount.vt == VT_I2); + + pMessage->get_Member (_variant_t ("records"), &vRecords); + _ASSERTE (vRecords.vt == VT_DISPATCH); + + //std::map< DWORD, cAllegianceInfo * > AllegMap; + std::vector AllegInfo; + + for(int i = 0; i < (vRecordCount.bVal); i++) + { + IMessageMember* pMember = (IMessageMember*) vRecords.pdispVal; + _variant_t vMember1; + + pMember->get_Member (_variant_t (long(i)), &vMember1); + + IMessageMember* pRecord = (IMessageMember*) vMember1.pdispVal; + _variant_t vInfoRec; + pRecord->get_Member (_variant_t ("info"), &vInfoRec); + IMessageMember* pInfo = (IMessageMember*) vInfoRec.pdispVal; + + _variant_t vTreeParent, vGUID, vType, vXP, vGender, vRace, vRank, vLoyalty, vLeader, vName, vUnknown; + + pRecord->get_Member (_variant_t ("treeParent"), &vTreeParent); + + pInfo->get_Member (_variant_t ("character"), &vGUID); + pInfo->get_Member (_variant_t ("type"), &vType); + pInfo->get_Member (_variant_t ("exp"), &vXP); + pInfo->get_Member (_variant_t ("gender"), &vGender); + pInfo->get_Member (_variant_t ("race"), &vRace); + pInfo->get_Member (_variant_t ("rank"), &vRank); + pInfo->get_Member (_variant_t ("loyalty"), &vLoyalty); + pInfo->get_Member (_variant_t ("leadership"), &vLeader); + pInfo->get_Member (_variant_t ("unknown"), &vUnknown); + pInfo->get_Member (_variant_t ("name"), &vName); + + cAllegianceInfo * tpai = new cAllegianceInfo; + tpai->TreeParent = vTreeParent.lVal; + tpai->GUID = vGUID.lVal; + tpai->Type = vType.lVal; + tpai->XP = vXP.lVal; + tpai->Gender = vGender.bVal; + tpai->Race = vRace.bVal; + tpai->Rank = vRank.bVal; + tpai->Loyalty = vLoyalty.iVal; + tpai->Leadership = vLeader.iVal; + tpai->Unknown = vUnknown.dblVal; + strncpy( tpai->Name, OLE2A( vName.bstrVal ), sizeof( tpai->Name ) ); + + //AllegMap.insert( std::make_pair( vGUID.lVal, tpai ) ); + AllegInfo.push_back(tpai); + } + + //std::map< DWORD, cAllegianceInfo * >::iterator i = AllegMap.find( GUID ); + + // Solo player, get outta here + //if( i == AllegMap.end() ) + if ( AllegInfo.size() == 0 ) + break; + + //we now 'know' that the monarch is the first entry, always + //std::map< DWORD, cAllegianceInfo * >::iterator i2 = AllegMap.begin(); + std::vector::iterator j = AllegInfo.begin(); + + if ( (*j)->GUID != GUID ) //i'm not the monarch, so find out who is + { + if ( (*(j + 1))->GUID != GUID ) //i'm not a direct either + { + memcpy(&Monarch, *j, sizeof(cAllegianceInfo)); + //OutputDebugString(Monarch.Name); + delete *j; + j = AllegInfo.erase( j ); // this is my patron now + } + memcpy( &Patron, *j, sizeof( cAllegianceInfo ) ); + //OutputDebugString(Patron.Name); + delete *j; + j = AllegInfo.erase( j ); + } + // we've taken care of any possible patron & monarch, + // so i'm all that's left + memcpy(&MyAlleg, *j, sizeof(cAllegianceInfo)); + //OutputDebugString(MyAlleg.Name); + delete *j; + j = AllegInfo.erase( j ); + + //check for patron + /* + i = AllegMap.find( MyAlleg.TreeParent ); + if ( i != AllegMap.end() ) + { + memcpy( &Patron, i->second, sizeof( cAllegianceInfo ) ); + delete i->second; + AllegMap.erase( i ); + } + + //check for a monarch + if ( Patron.GUID != 0 ) + { + i = AllegMap.find( Patron.TreeParent ); + if ( i != AllegMap.end() ) + { + memcpy( &Monarch, i->second, sizeof( cAllegianceInfo ) ); + delete i->second; + AllegMap.erase( i ); + } + } + */ + + //The remainder *should* all be vassals + while( AllegInfo.size() > 0 ) + { + //for( i = AllegInfo.begin(); i != AllegInfo.end(); ++i ) + //{ + // Patron + /* + if( i->second->GUID == MyAlleg.TreeParent ) + { + memcpy( &Patron, i->second, sizeof( cAllegianceInfo ) ); + OutputDebugString("Got Patron\n"); + + delete i->second; + i = AllegMap.erase( i ); + + continue; + } + */ + + //Vassal + //just leaving the sanity check in place here + //if ((*i)->TreeParent == GUID) + //{ + memcpy( &Vassals[VassalCount], *j, sizeof( cAllegianceInfo ) ); + //OutputDebugString(Vassals[VassalCount].Name); + VassalCount++; + + delete *j; + j = AllegInfo.erase( j ); + + //continue; + //} + //} + } + + // only remnant should be monarch + //p = AllegMap.begin()->second; + //memcpy( &Monarch, p, sizeof( cAllegianceInfo ) ); + //delete p; + + break; + } + + case 0x004E: // Add Enchantment + { + _variant_t vEnchantment, vSpellID, vIndex, vSourceID, vDifficulty, vEffectMask, vAffected, vLevelMask, vFamily, vDuration, vTimeElapsed, vStartTime, vAdjustment; + + pMessage->get_Member (_variant_t ("enchantment"), &vEnchantment); + IMessageMember* pEnchantment = (IMessageMember*) vEnchantment.pdispVal; + pEnchantment->get_Member (_variant_t ("spell"), &vSpellID); + _ASSERTE(vSpellID.vt == VT_I2); + pEnchantment->get_Member (_variant_t ("source"), &vSourceID); + _ASSERTE(vSourceID.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("layers"), &vIndex); + _ASSERTE(vIndex.vt == VT_I2); + pEnchantment->get_Member (_variant_t ("difficulty"), &vDifficulty); + _ASSERTE(vDifficulty.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("family"), &vFamily); + _ASSERTE(vFamily.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("duration"), &vDuration); + _ASSERTE(vDuration.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("timeElapsed"), &vTimeElapsed); + _ASSERTE(vTimeElapsed.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("startTime"), &vStartTime); + _ASSERTE(vStartTime.vt == VT_R8); + pEnchantment->get_Member (_variant_t ("flags"), &vEffectMask); + _ASSERTE(vEffectMask.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("affected"), &vAffected); + _ASSERTE(vAffected.vt == VT_I4); + pEnchantment->get_Member (_variant_t ("adjustment"), &vAdjustment); + _ASSERTE(vAdjustment.vt == VT_R4); + + if( 666 == vSpellID.iVal ) // Vitae isn't a normal enchantment + { + Vitae = vAdjustment.fltVal + 0.0000001f; // for float inaccuracies like 0.9499999881 + RecalcSecStats(); + RecalcSkills(); + } + else + AddEnchant(vSpellID.iVal, vIndex.iVal, vDuration.dblVal, vFamily.lVal, vTimeElapsed.dblVal, vEffectMask.lVal, vAffected.lVal, vAdjustment.fltVal); + + break; + } + + case 0x01AE: // Remove Multiple Enchantments + { + _variant_t vNumSpells, vSpells, vSpell1; + pMessage->get_Member(_variant_t ("count"), &vNumSpells); + pMessage->get_Member(_variant_t ("enchantments"), &vSpells); + + IMessageMember* pMember = (IMessageMember*) vSpells.pdispVal; + + for (int i=0;iget_Member (_variant_t (long(i)), &vSpell1); + IMessageMember* pRecord = (IMessageMember*) vSpell1.pdispVal; + + _variant_t vSpellID, vLayer; + + pRecord->get_Member (_variant_t ("spell"), &vSpellID); + pRecord->get_Member (_variant_t ("layer"), &vLayer); + + if( 666 == vSpellID.iVal ) // Vitae isn't a normal enchantment + Vitae = 1.0f; + else + RemoveEnchant(vSpellID.iVal, vLayer.iVal); + } + + break; + } + + + case 0x004F: // Remove Enchantment + { + _variant_t vSpellID, vLayer; + + pMessage->get_Member (_variant_t ("spell"), &vSpellID); + pMessage->get_Member (_variant_t ("layer"), &vLayer); + + RemoveEnchant(vSpellID.iVal, vLayer.iVal); + + break; + } + + case 0x01A4: // Remove Enchantment (Silent) + { + _variant_t vSpellID, vLayer; + + pMessage->get_Member (_variant_t ("spell"), &vSpellID); + pMessage->get_Member (_variant_t ("layers"), &vLayer); + + RemoveEnchant(vSpellID.iVal, vLayer.iVal); + + break; + } + + case 0x01A6: // Remove Multiple Enchantments + { + _variant_t vNumSpells, vSpells, vSpell1; + pMessage->get_Member(_variant_t ("count"), &vNumSpells); + pMessage->get_Member(_variant_t ("enchantments"), &vSpells); + + IMessageMember* pMember = (IMessageMember*) vSpells.pdispVal; + + for (int i=0;iget_Member (_variant_t (long(i)), &vSpell1); + IMessageMember* pRecord = (IMessageMember*) vSpell1.pdispVal; + + _variant_t vSpellID, vLayer; + + pRecord->get_Member (_variant_t ("spell"), &vSpellID); + pRecord->get_Member (_variant_t ("layer"), &vLayer); + + RemoveEnchant(vSpellID.iVal, vLayer.iVal); + } + + break; + } + case 0x004C: // Spellbook Add + { + _variant_t vSpellID; + pMessage->get_Member( _variant_t( "spell" ), &vSpellID ); + DWORD nSpellID = vSpellID.lVal; + + std::pair< std::set< DWORD >::iterator, bool > pSuccess; + + pSuccess = SpellsLearned.insert( nSpellID ); + if( pSuccess.second ) + Fire_Spellbook_Add( nSpellID ); + + break; + } + + case 0x004D: // Spellbook Delete + { + _variant_t vSpellID; + pMessage->get_Member( _variant_t( "spell" ), &vSpellID ); + DWORD nSpellID = vSpellID.lVal; + if( SpellsLearned.erase( nSpellID ) ) + Fire_Spellbook_Delete( nSpellID ); + + break; + } + + } // End - F7B0 + } + } + + return S_OK; +} + +void cCharacterStats::AddEnchant(int SpellID, int Layer, double Duration, DWORD Family, double Elapsed, DWORD AffectMask, DWORD Affected, float Adjustment) +{ + time_t TimeExpires = time(NULL); + // duration of the spell plus the (negative) number the server sends us indicating how many seconds have elapsed + TimeExpires += (long(Duration + 0.5f) + long(Elapsed + 0.5f)); + + cEnchantment *tpench = new cEnchantment; + tpench->iSpellID = SpellID; + tpench->iLayer = Layer; + tpench->dwFamily = Family; + tpench->ExpireTime = TimeExpires; + tpench->dwAffected = Affected; + tpench->dwAffectMask = AffectMask; + tpench->fAdjustment = Adjustment; + + Enchantments.push_back(tpench); + + std::map FamilyMap; + + switch (tpench->dwAffectMask & 0x13) + { + case 0x01: //Primary Stat + { + tpench->dwAffected--; + + for (std::list::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + if ((((*tpi)->dwAffectMask & 0x13) == 0x01) && ((*tpi)->dwAffected == tpench->dwAffected)) + { + if (abs(FamilyMap[(*tpi)->dwFamily]) <= abs((*tpi)->fAdjustment)) + FamilyMap[(*tpi)->dwFamily] = (*tpi)->fAdjustment; + } + } + + float tpsf = PrimStat[tpench->dwAffected]; + + for (std::map::iterator tpf = FamilyMap.begin(); tpf != FamilyMap.end(); tpf++) + tpsf += (*tpf).second; + + CurStat[tpench->dwAffected] = static_cast (tpsf + 0.5f); + + RecalcSecStats(); + RecalcSkills(); + } + break; + case 0x02: //Secondary Stat + { + tpench->dwAffected--; + tpench->dwAffected /= 2; + + for (std::list::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + if ((((*tpi)->dwAffectMask & 0x13) == 0x02) && ((*tpi)->dwAffected == tpench->dwAffected)) + { + if (abs(FamilyMap[(*tpi)->dwFamily]) <= abs((*tpi)->fAdjustment)) + FamilyMap[(*tpi)->dwFamily] = (*tpi)->fAdjustment; + } + } + + float tpsf = SecStatInc[tpench->dwAffected]; + + if (tpench->dwAffected == 0) tpsf += CurStat[1] / 2.0f + 0.5f; + else if (tpench->dwAffected == 1) tpsf += CurStat[1]; + else if (tpench->dwAffected == 2) tpsf += CurStat[5]; + + for (std::map::iterator tpf = FamilyMap.begin(); tpf != FamilyMap.end(); tpf++) + tpsf += (*tpf).second; + + CurSecStat[tpench->dwAffected] = static_cast (tpsf); + } + break; + case 0x10: //Skill + { + for (std::list::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + if ((((*tpi)->dwAffectMask & 0x13) == 0x10) && ((*tpi)->dwAffected == tpench->dwAffected)) + { + if (abs(FamilyMap[(*tpi)->dwFamily]) <= abs((*tpi)->fAdjustment)) + FamilyMap[(*tpi)->dwFamily] = (*tpi)->fAdjustment; + } + } + + RecalcSkill(tpench->dwAffected); + + } + break; + } +} + +void cCharacterStats::RemoveEnchant(int SpellID, int Layer) +{ + for (std::list< cEnchantment * >::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + if( ( (*tpi)->iSpellID == SpellID) && ( (*tpi)->iLayer == Layer) ) + { + cEnchantment tpench; + memcpy(&tpench, *tpi, sizeof(tpench)); + delete *tpi; + Enchantments.erase(tpi); + if ((tpench.dwAffectMask & 0x013) == 0x01) + { + RecalcStat(tpench.dwAffected); + RecalcSecStats(); + RecalcSkills(); + } + else if ((tpench.dwAffectMask & 0x013) == 0x02) + { + RecalcSecStats(); + } + else if ((tpench.dwAffectMask & 0x013) == 0x10) + { + RecalcSkill(tpench.dwAffected); + } + tpi = Enchantments.begin(); + } + } +} + +void cCharacterStats::RecalcStat(int Stat) +{ + std::map FamilyMap; + + for (std::list< cEnchantment * >::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + if ((((*tpi)->dwAffectMask & 0x13) == 0x01) && ((*tpi)->dwAffected == Stat)) + { + if (abs(FamilyMap[(*tpi)->dwFamily]) <= abs((*tpi)->fAdjustment)) + FamilyMap[(*tpi)->dwFamily] = (*tpi)->fAdjustment; + } + } + + float tpsf = (float) PrimStat[Stat]; + + for (std::map::iterator tpf = FamilyMap.begin(); tpf != FamilyMap.end(); tpf++) + tpsf += (*tpf).second; + + CurStat[Stat] = static_cast (tpsf); +} + +void cCharacterStats::RecalcSecStats() +{ + for (int i=0;i<3;i++) + RecalcSecStat(i); +} + +void cCharacterStats::RecalcSecStat(int SecStat) +{ + std::map FamilyMap; + + for (std::list< cEnchantment * >::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + if( (((*tpi)->dwAffectMask & 0x13) == 0x02) && ((*tpi)->dwAffected == SecStat) ) + { + if (abs(FamilyMap[(*tpi)->dwFamily]) <= abs((*tpi)->fAdjustment)) + FamilyMap[(*tpi)->dwFamily] = (*tpi)->fAdjustment; + } + } + + float tpsf = SecStatInc[SecStat]; + if (SecStat == 0) tpsf += CurStat[1] / 2.0f + 0.5f; + else if (SecStat == 1) tpsf += CurStat[1]; + else if (SecStat == 2) tpsf += CurStat[5]; + + for (std::map::iterator tpf = FamilyMap.begin(); tpf != FamilyMap.end(); tpf++) + tpsf += (*tpf).second; + + CurSecStat[SecStat] = static_cast (tpsf); +} +void cCharacterStats::RecalcSkills() +{ + for (int i=0;i<40;i++) + RecalcSkill(i); +} +void cCharacterStats::RecalcSkill(int Skill) +{ + std::map FamilyMap; + + for (std::list::iterator tpi = Enchantments.begin(); tpi != Enchantments.end(); tpi++) + { + if ((((*tpi)->dwAffectMask & 0x13) == 0x10) && ((*tpi)->dwAffected == Skill)) + { + if (abs(FamilyMap[(*tpi)->dwFamily]) <= abs((*tpi)->fAdjustment)) + FamilyMap[(*tpi)->dwFamily] = (*tpi)->fAdjustment; + } + } + + float TPS = 0; + + if (SkillInfo[Skill].AttribA != eAttrNULL) + TPS += CurStat[SkillInfo[Skill].AttribA - 1]; + + if (SkillInfo[Skill].AttribB != eAttrNULL) + TPS += CurStat[SkillInfo[Skill].AttribB - 1]; + + TPS /= SkillInfo[Skill].Divider; + + TPS += SkillInc[Skill] + SkillBonus[Skill] + 0.5f; + + for (std::map::iterator tpf = FamilyMap.begin(); tpf != FamilyMap.end(); tpf++) + TPS += (*tpf).second; + + CurSkill[Skill] = static_cast (TPS); +} + +HRESULT cCharacterStats::get_TotalSpells(long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = SpellsLearned.size(); + return S_OK; +} + +HRESULT cCharacterStats::get_SpellLearned(long SpellID, long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + if( SpellID < 0 ) + { + *pVal = -1; + return E_FAIL; + } + + std::set< DWORD >::iterator a = SpellsLearned.find( SpellID ); + if( a == SpellsLearned.end() ) + { + *pVal = 0; + return S_OK; + } + + *pVal = 1; + return S_OK; +} + +HRESULT cCharacterStats::get_ClassTemplate(BSTR *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = T2BSTR(Class); + return S_OK; +} + +HRESULT cCharacterStats::get_Gender(BSTR *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = T2BSTR(Gender); + return S_OK; +} + +HRESULT cCharacterStats::get_Race(BSTR *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = T2BSTR(Race); + return S_OK; +} + +HRESULT cCharacterStats::get_Name(BSTR *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = T2BSTR(Name); + return S_OK; +} + +HRESULT cCharacterStats::get_Server(BSTR *pVal) +{ + if( !(*Server) ) + return E_FAIL; + + /* + //DIE!! + if( strncmp( Server, "DARKTIDE", 8 ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "FROSTFELL" ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "HARVESTGAIN" ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "LEAFCULL" ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "MORNINGTHAW" ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "SOLCLAIM" ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "THISTLEDOWN" ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "WINTERSEBB" ) == 0 ) + *pVal = T2BSTR( Server ); + else if( stricmp( Server, "VERDANTINE" ) == 0 ) + *pVal = T2BSTR( Server ); + else + *pVal = T2BSTR("Unknown"); + */ + *pVal = T2BSTR(Server); + return S_OK; +} + +HRESULT cCharacterStats::get_SkillPoints(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = SkillPoints; + return S_OK; +} + +HRESULT cCharacterStats::get_UnassignedExp(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = UnassignedXP; + return S_OK; +} + +HRESULT cCharacterStats::get_TotalExp(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = TotalXP; + return S_OK; +} + +HRESULT cCharacterStats::get_Rank(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Rank; + return S_OK; +} + +HRESULT cCharacterStats::get_Level(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Level; + return S_OK; +} + +HRESULT cCharacterStats::get_Character(/*[out, retval]*/ long *pVal) +{ + *pVal = GUID; + return S_OK; +} + +HRESULT cCharacterStats::get_VitalCount(/*[out, retval]*/ long *pVal) +{ + *pVal = 3; + return S_OK; +} + +HRESULT cCharacterStats::get_SkillCount(/*[out, retval]*/ long *pVal) +{ + *pVal = 40; + return S_OK; +} + +HRESULT cCharacterStats::get_AttributeCount(/*[out, retval]*/ long *pVal) +{ + *pVal = 6; + return S_OK; +} + +HRESULT cCharacterStats::get_Vital(enum eVitalID Index, /*[out, retval]*/ ISkillInfo ** pVal) +{ + if (!GotLogin) + return E_FAIL; + + if ((Index < 1) || (Index > 3)) + return E_FAIL; + + CComObject< ::cSkillInfo > *pSkill; + CComObject< ::cSkillInfo >::CreateInstance( &pSkill ); + + pSkill->m_pStats = this; + + if (Index == 1) + { + pSkill->m_pSkill->m_szName = "Health"; + pSkill->m_pSkill->m_nAttribute1 = eAttrEndurance; + pSkill->m_pSkill->m_nAttribute2 = eAttrNULL; + pSkill->m_pSkill->m_nDenominator = 2; + } + else if (Index == 2) + { + pSkill->m_pSkill->m_szName = "Stamina"; + pSkill->m_pSkill->m_nAttribute1 = eAttrEndurance; + pSkill->m_pSkill->m_nAttribute2 = eAttrNULL; + pSkill->m_pSkill->m_nDenominator = 1; + } + else if (Index == 3) + { + pSkill->m_pSkill->m_szName = "Mana"; + pSkill->m_pSkill->m_nAttribute1 = eAttrSelf; + pSkill->m_pSkill->m_nAttribute2 = eAttrNULL; + pSkill->m_pSkill->m_nDenominator = 1; + } + + pSkill->m_pSkill->m_nExp = SecondaryStatArray[SecStatInc[Index - 1]]; + pSkill->m_pSkill->m_nBonus = 0; + pSkill->m_pSkill->m_nOffset = SecStatInc[Index - 1]; + pSkill->m_pSkill->m_trained = eTrainTrained; + + return pSkill->QueryInterface( IID_ISkillInfo, reinterpret_cast< void ** >( pVal ) ); +} + +HRESULT cCharacterStats::get_Skill(enum eSkillID Index, ISkillInfo ** pVal) +{ + if (!GotLogin) + return E_FAIL; + + if ((Index < 1) || (Index > 39)) + return E_FAIL; + + + CComObject< ::cSkillInfo > *pSkill; + CComObject< ::cSkillInfo >::CreateInstance( &pSkill ); + + pSkill->m_pStats = this; + + pSkill->m_pSkill->m_nExp = SkillXP[Index]; + pSkill->m_pSkill->m_nBonus = SkillBonus[Index]; + pSkill->m_pSkill->m_nOffset = SkillInc[Index]; + + pSkill->m_pSkill->m_nAttribute1 = SkillInfo[Index].AttribA; + pSkill->m_pSkill->m_nAttribute2 = SkillInfo[Index].AttribB; + pSkill->m_pSkill->m_nDenominator = SkillInfo[Index].Divider; + pSkill->m_pSkill->m_szName = SkillInfo[Index].Name; + pSkill->m_pSkill->m_trained = (enum eTrainingType) SkillTrain[Index]; + + return pSkill->QueryInterface( IID_ISkillInfo, reinterpret_cast< void ** >( pVal ) ); +} + +HRESULT cCharacterStats::get_Attribute(enum eAttributeID Index, /*[out, retval]*/ IAttributeInfo ** pVal) +{ + if (!GotLogin) + return E_FAIL; + + if ((Index < 1) || (Index > 6)) + return E_FAIL; + + CComObject< ::cAttributeInfo > *pAttrib; + CComObject< ::cAttributeInfo >::CreateInstance( &pAttrib ); + + pAttrib->m_pInfo->m_nBase = PrimStatInitial[Index - 1]; + pAttrib->m_pInfo->m_nCurrent = PrimStat[Index - 1]; + pAttrib->m_pInfo->m_nExp = PrimStatArray[PrimStat[Index - 1] - PrimStatInitial[Index - 1]]; + + if (Index == 1) + pAttrib->m_pInfo->m_szName = "Strength"; + else if (Index == 2) + pAttrib->m_pInfo->m_szName = "Endurance"; + else if (Index == 3) + pAttrib->m_pInfo->m_szName = "Quickness"; + else if (Index == 4) + pAttrib->m_pInfo->m_szName = "Coordination"; + else if (Index == 5) + pAttrib->m_pInfo->m_szName = "Focus"; + else if (Index == 6) + pAttrib->m_pInfo->m_szName = "Self"; + + return pAttrib->QueryInterface( IID_IAttributeInfo, reinterpret_cast< void ** >( pVal ) ); +} + +HRESULT cCharacterStats::get_Birth(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Birth; + return S_OK; +} + +HRESULT cCharacterStats::get_Age(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Age; + return S_OK; +} + +HRESULT cCharacterStats::get_Deaths(/*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Deaths; + return S_OK; +} + +HRESULT cCharacterStats::get_Monarch(IAllegianceInfo ** pVal) +{ + if (!GotAlleg) + return E_FAIL; + + if (!Monarch.GUID) + return E_FAIL; + + CComObject< ::cAllegianceInfo > *pAlleg; + CComObject< ::cAllegianceInfo >::CreateInstance( &pAlleg ); + + strncpy( pAlleg->m_pAllegiance->Name, Monarch.Name, sizeof( pAlleg->m_pAllegiance->Name ) ); + pAlleg->m_pAllegiance->GUID = Monarch.GUID; + pAlleg->m_pAllegiance->TreeParent = Monarch.TreeParent; + pAlleg->m_pAllegiance->Leadership = Monarch.Leadership; + pAlleg->m_pAllegiance->Loyalty = Monarch.Loyalty; + pAlleg->m_pAllegiance->XP = Monarch.XP; + pAlleg->m_pAllegiance->Race = Monarch.Race; + pAlleg->m_pAllegiance->Rank = Monarch.Rank; + pAlleg->m_pAllegiance->Gender = Monarch.Gender; + pAlleg->m_pAllegiance->Type = Monarch.Type; + pAlleg->m_pAllegiance->Unknown = Monarch.Unknown; + + return pAlleg->QueryInterface( IID_IAllegianceInfo, reinterpret_cast< void ** >( pVal ) ); +} + +HRESULT cCharacterStats::get_Patron(IAllegianceInfo ** pVal) +{ + if (!GotAlleg) + return E_FAIL; + + if (!Patron.GUID) + return E_FAIL; + + CComObject< ::cAllegianceInfo > *pAlleg; + CComObject< ::cAllegianceInfo >::CreateInstance( &pAlleg ); + + strncpy( pAlleg->m_pAllegiance->Name, Patron.Name, sizeof( pAlleg->m_pAllegiance->Name ) ); + pAlleg->m_pAllegiance->GUID = Patron.GUID; + pAlleg->m_pAllegiance->TreeParent = Patron.TreeParent; + pAlleg->m_pAllegiance->Leadership = Patron.Leadership; + pAlleg->m_pAllegiance->Loyalty = Patron.Loyalty; + pAlleg->m_pAllegiance->XP = Patron.XP; + pAlleg->m_pAllegiance->Race = Patron.Race; + pAlleg->m_pAllegiance->Rank = Patron.Rank; + pAlleg->m_pAllegiance->Gender = Patron.Gender; + pAlleg->m_pAllegiance->Type = Patron.Type; + pAlleg->m_pAllegiance->Unknown = Patron.Unknown; + + return pAlleg->QueryInterface( IID_IAllegianceInfo, reinterpret_cast< void ** >( pVal ) ); +} + +HRESULT cCharacterStats::get_MyAllegiance(IAllegianceInfo ** pVal) +{ + if (!GotAlleg) + return E_FAIL; + + if (!MyAlleg.GUID) + return E_FAIL; + + CComObject< ::cAllegianceInfo > *pAlleg; + CComObject< ::cAllegianceInfo >::CreateInstance( &pAlleg ); + + strncpy( pAlleg->m_pAllegiance->Name, MyAlleg.Name, sizeof( pAlleg->m_pAllegiance->Name ) ); + pAlleg->m_pAllegiance->GUID = MyAlleg.GUID; + pAlleg->m_pAllegiance->TreeParent = MyAlleg.TreeParent; + pAlleg->m_pAllegiance->Leadership = MyAlleg.Leadership; + pAlleg->m_pAllegiance->Loyalty = MyAlleg.Loyalty; + pAlleg->m_pAllegiance->XP = MyAlleg.XP; + pAlleg->m_pAllegiance->Race = MyAlleg.Race; + pAlleg->m_pAllegiance->Rank = MyAlleg.Rank; + pAlleg->m_pAllegiance->Gender = MyAlleg.Gender; + pAlleg->m_pAllegiance->Type = MyAlleg.Type; + pAlleg->m_pAllegiance->Unknown = MyAlleg.Unknown; + + return pAlleg->QueryInterface( IID_IAllegianceInfo, reinterpret_cast< void ** >( pVal ) ); +} + +HRESULT cCharacterStats::get_Vassal(long VassalNum, IAllegianceInfo ** pVal) +{ + if (!GotAlleg) + return E_FAIL; + + if ((VassalNum < 0) || (VassalNum >= VassalCount)) + return E_FAIL; + + if (!Vassals[ VassalNum ].GUID) + return E_FAIL; + + CComObject< ::cAllegianceInfo > *pAlleg; + CComObject< ::cAllegianceInfo >::CreateInstance( &pAlleg ); + + strncpy( pAlleg->m_pAllegiance->Name, Vassals[ VassalNum ].Name, sizeof( pAlleg->m_pAllegiance->Name ) ); + pAlleg->m_pAllegiance->GUID = Vassals[ VassalNum ].GUID; + pAlleg->m_pAllegiance->TreeParent = Vassals[ VassalNum ].TreeParent; + pAlleg->m_pAllegiance->Leadership = Vassals[ VassalNum ].Leadership; + pAlleg->m_pAllegiance->Loyalty = Vassals[ VassalNum ].Loyalty; + pAlleg->m_pAllegiance->XP = Vassals[ VassalNum ].XP; + pAlleg->m_pAllegiance->Race = Vassals[ VassalNum ].Race; + pAlleg->m_pAllegiance->Rank = Vassals[ VassalNum ].Rank; + pAlleg->m_pAllegiance->Gender = Vassals[ VassalNum ].Gender; + pAlleg->m_pAllegiance->Type = Vassals[ VassalNum ].Type; + pAlleg->m_pAllegiance->Unknown = Vassals[ VassalNum ].Unknown; + + return pAlleg->QueryInterface( IID_IAllegianceInfo, reinterpret_cast< void ** >( pVal ) ); +} + +HRESULT cCharacterStats::get_VassalCount(long *pVal) +{ + if (!GotAlleg) + return E_FAIL; + + *pVal = VassalCount; + return S_OK; +} + +HRESULT cCharacterStats::get_Followers(long *pVal) +{ + if (!GotAlleg) + return E_FAIL; + + *pVal = Followers; + return S_OK; +} + +HRESULT cCharacterStats::get_MonarchFollowers(long *pVal) +{ + if (!GotAlleg) + return E_FAIL; + + *pVal = MonarchFollowers; + return S_OK; +} + +HRESULT cCharacterStats::get_EffectiveVital(enum eVitalID Index, /*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + if ((Index < 1) || (Index > 3)) + return E_FAIL; + + float fSkill = SecStatInc[Index - 1]; + if (Index == 1) fSkill += CurStat[1] / 2.0f + 0.5f; + else if (Index == 2) fSkill += CurStat[1]; + else if (Index == 3) fSkill += CurStat[5]; + + long nBuffs = CurSecStat[Index - 1] - static_cast< long >(fSkill); //calculates net buffs + + *pVal = long(long(fSkill) * Vitae + 0.5f + nBuffs); + + return S_OK; +} + +HRESULT cCharacterStats::get_EffectiveSkill(enum eSkillID Index, /*[out, retval]*/ long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + if ((Index < 1) || (Index > 39)) + return E_FAIL; + + // get current skill + float fSkill = 0.0; + if( SkillInfo[Index].AttribA != eAttrNULL ) + fSkill += CurStat[ SkillInfo[Index].AttribA - 1]; + if( SkillInfo[Index].AttribB != eAttrNULL ) + fSkill += CurStat[ SkillInfo[Index].AttribB - 1]; + fSkill /= static_cast< float >( SkillInfo[Index].Divider ); + fSkill += SkillInc[Index] + 0.5f; + fSkill += SkillBonus[Index]; + + // get our net buffs + long nBuffs = CurSkill[Index] - long(fSkill); + + // AC calculates the vitae penalty to a skill before buffs, so we do too + *pVal = long(long(fSkill) * Vitae + 0.5f + nBuffs); + + return S_OK; +} + +HRESULT cCharacterStats::get_EffectiveAttribute(enum eAttributeID Index, /*[out, retval]*/ long * pVal) +{ + if (!GotLogin) + return E_FAIL; + + if ((Index < 1) || (Index > 6)) + return E_FAIL; + + *pVal = CurStat[Index - 1]; + + return S_OK; +} + +HRESULT cCharacterStats::get_Health(long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Health; + return S_OK; +} + +HRESULT cCharacterStats::get_Stamina(long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Stamina; + return S_OK; +} + +HRESULT cCharacterStats::get_Mana(long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Mana; + return S_OK; +} + +HRESULT cCharacterStats::get_EnchantmentCount(long *pVal) +{ + if (!GotLogin) + return E_FAIL; + + *pVal = Enchantments.size(); + return S_OK; +} + +HRESULT cCharacterStats::get_Enchantment(long EnchantNum, IEnchantment **pVal) +{ + if (!GotLogin) + return E_FAIL; + + if (EnchantNum < 0) + return E_FAIL; + + std::list::iterator tpi = Enchantments.begin(); + + for( int i = 1; i < EnchantNum; i++ ) + tpi++; + + time_t CurrentTime = time(NULL); + long SecondsLeft = (*tpi)->ExpireTime - CurrentTime; + // Item based spells have no expiration. + // Sometimes nearly expired spells may also return -1 due to internet latency. + if( SecondsLeft < 0 ) + SecondsLeft = -1; + + CComObject< ::Enchantment > *pEnchant; + CComObject< ::Enchantment >::CreateInstance( &pEnchant ); + + pEnchant->put_SpellID( (*tpi)->iSpellID ); + pEnchant->put_Layer( (*tpi)->iLayer ); + pEnchant->put_TimeRemaining( SecondsLeft ); + pEnchant->put_Affected( (*tpi)->dwAffected ); + pEnchant->put_AffectedMask( (*tpi)->dwAffectMask ); + pEnchant->put_Family( (*tpi)->dwFamily ); + pEnchant->put_Adjustment( (*tpi)->fAdjustment ); + + pEnchant->QueryInterface(pVal); + return S_OK; +} + +HRESULT cCharacterStats::get_Vitae(long *pVal) +{ + if(!GotLogin) + return E_FAIL; + + *pVal = long((1.00 - Vitae) * 100 + 0.5f); + return S_OK; +} + +HRESULT cCharacterStats::get_BurdenUnits(long *pVal) +{ + if(!GotLogin) + return E_FAIL; + + *pVal = long(TotalBurden); + return S_OK; +} + +HRESULT cCharacterStats::get_Burden(long *pVal) +{ + if(!GotLogin) + return E_FAIL; + + long nLegalBurden; + get_EffectiveAttribute(eAttrStrength, &nLegalBurden); + nLegalBurden *= 150; + + *pVal = long( ( float(TotalBurden) / nLegalBurden ) * 100 ); + return S_OK; +} \ No newline at end of file diff --git a/Native/DecalFilters/CharacterStats.h b/Native/DecalFilters/CharacterStats.h new file mode 100644 index 0000000..9b83388 --- /dev/null +++ b/Native/DecalFilters/CharacterStats.h @@ -0,0 +1,629 @@ +// CharacterStats.h : Declaration of the cCharacterStats + +#ifndef __CHARACTERSTATS_H_ +#define __CHARACTERSTATS_H_ + +#include "DecalNetImpl.h" +#include "resource.h" // main symbols +#include "DecalFiltersCP.h" + +#include "DecalDat.h" // NEED THIS FOR THE PORTAL DATSTREAM! +#include + +///////////////////////////////////////////////////////////////////////////// +// cCharacterStats +//! cCharacterStats is the filter class used to monitor network traffic relating to your character's stats. +/*! + The Character Stats filter is a handy way of getting hold of many of your character's stats. It functions + by monitoring all the network traffic relating to your character's stats, vitae, etc. It is still the definitive + source of stat information in Decal, but if you are looking for something simple (like just one stat) you might + want to look at ACHooks first; ACHooks now has some hooks that replace the functionality of this filter for + Attributes/Vitals/Skills more reliably. +*/ +class ATL_NO_VTABLE cCharacterStats : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public IDispatchImpl, + public INetworkFilter2, + public CProxyICharacterStatsEvents< cCharacterStats > +{ +public: + cCharacterStats() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_CHARACTERSTATS) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cCharacterStats) + COM_INTERFACE_ENTRY(INetworkFilter2) + COM_INTERFACE_ENTRY(ICharacterStats) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cCharacterStats) + CONNECTION_POINT_ENTRY(DIID_ICharacterStatsEvents) +END_CONNECTION_POINT_MAP() + +public: + + //! The Location_t structure is used by the Character Stats filter for storing information about your character's location. + struct Location_t + { + //! Turbine-assigned landblock number (like using /loc). + DWORD landblock; + //! Coordinate offset to landblock base coordinates. + float x,y,z; + //! Component of the location quaternion. + float a,b,c,w; + }; + + //! The cEnchantment structure is used by the Character Stats filter for storing information about an enchantment. + struct cEnchantment + { + //! The SpellID, unique to each spell. Can be found in Turbine's portal.dat. + int iSpellID; + //! The spell's layer. That is, a spell that "surpasses" another spell has a higher layer, so the highest layer is the "active" spell. + int iLayer; + //! A standard C++ time_t object representing the time at which this spell expires. + time_t ExpireTime; + //! Stored value representing what this spell affects (what skill/attribute/etc). + DWORD dwAffected; + //! Stored value obtained from the protocol. I forget what it represents. + DWORD dwAffectMask; + //! Stored value representing what "family" or grouping of spells this spell belongs to. Families may be found in the portal.dat. + DWORD dwFamily; + //! The actual adjustment that is the result of the spell. For instance, the value for Creature Enchantment Mastery VI would be 35. + float fAdjustment; + + cEnchantment() + { + } + + cEnchantment( cEnchantment &right ) + { + iSpellID = right.iSpellID; + iLayer = right.iLayer; + ExpireTime = right.ExpireTime; + dwAffected = right.dwAffected; + dwAffectMask = right.dwAffectMask; + dwFamily = right.dwFamily; + fAdjustment = right.fAdjustment; + } + + cEnchantment& operator= ( cEnchantment& right ) + { + if( this != &right ) + { + iSpellID = right.iSpellID; + iLayer = right.iLayer; + ExpireTime = right.ExpireTime; + dwAffected = right.dwAffected; + dwAffectMask = right.dwAffectMask; + dwFamily = right.dwFamily; + fAdjustment = right.fAdjustment; + } + + return *this; + } + }; + + //! The cSkillInfo structure is generated for each skill your character has to store information on that skill. + struct cSkillInfo + { + //! The skill's "friendly" name (i.e. - "War Magic") + std::string m_szName; + //! The index number of the first attribute that this skill is derived from. + long m_nAttribute1; + //! The index number of the second attribute that this skill is derived from. + long m_nAttribute2; + //! The divisor for the skill. For example, War Magic is Focus + Self / 4, so the denominator is 4. + long m_nDenominator; + //! The skill's offset from the "formula base." Think of this as the number of times you incremented the skill directly. + long m_nOffset; + //! The amount of experience put into this skill directly. + long m_nExp; + //! The bonus added to this skill (+10 for a specialized skill, +5 for a creation-time train). + long m_nBonus; + //! The way this skill is trained (i.e. - "Untrained," "Trained," or "Specialized") represented by the enumeration eTrainingType. + eTrainingType m_trained; + }; + + //! The cAttributeInfo structure is generated for each attribute your character has to store information on the attribute. + struct cAttributeInfo + { + //! The attribute's "friendly" name (i.e. - "Strength") + std::string m_szName; + //! The attribute's "base" value, or value before buffs. + long m_nBase; + //! The amount of experience applied to this attribute. + long m_nExp; + //! The adjusted value of the attribute taking (de)buffs into effect. + long m_nCurrent; + }; + + //! The cAllegianceInfo structure is generated for each allegiance contact your character has to store information on that character. + struct cAllegianceInfo + { + //! The GUID of this character's Patron. + long TreeParent; + //! This character's GUID. + long GUID; + //! The node type for this entry in relation to your character. + long Type; + //! The amount of xp you have passed up to this character/this character has passed to you. + long XP; + //! The character's gender. + long Gender; + //! The character's race. + long Race; + //! The character's allegiance rank. + long Rank; + //! The character's loyalty (as of the moment the data was received--when the allegiance panel was opened, including buffs). + long Loyalty; + //! The character's leadership (as of the moment the data was received--when the allegiance panel was opened, including buffs). + long Leadership; + //! Some unknown in the protocol. It's stored here so you can experiment with it! + double Unknown; + //! The character's name. + char Name[32]; + }; + +private: + //! An internal pointer to decal's NetService interface. + CComPtr< INetService > m_pService; + //! An internal pointer to decal's main interface. + CComPtr< IDecal > m_pDecal; + +//Bases + //! Whether or not we've received login information for a character yet + /*! + Initially set to false, GotLogin is used internally to represent whether we've + received login information for a character yet. Functions check this variable + before doing any processing so that they may intentionally error as there is no + information on the user's character before login information is received. + \sa GotAlleg + */ + bool GotLogin; + //! Our character's GUID. + DWORD GUID; + //! Our character's name. + char Name[32]; + //! Our character's gender. + char Gender[32]; + //! Our character's race. + char Race[32]; + //! Our character's class/title. + char Class[32]; + +public: + // DWORD array representing the values of our character's primary attributes. + DWORD PrimStat[6]; + // DWORD array representing the initial (creation) values of your character's primary attributes. + DWORD PrimStatInitial[6]; + // DWORD array representing the number of times our vitals have been directly incremented. + DWORD SecStatInc[3]; + // DWORD array representing the number of times our skills have been directly incremented. + DWORD SkillInc[40]; + // DWORD array representing the training status of each skill. (Current protocol: 1 = Untrained/Unusable, 2 = Trained, 3 = Specialized) + DWORD SkillTrain[40]; + // DWORD array representing the amount of experience applied directly to each skill. + DWORD SkillXP[40]; + // DWORD array representing the bonus each skill receives (+10 for specialization, +5 for creation-time train). + DWORD SkillBonus[40]; + +private: + //! An internal list used to store all the enchantments on the character. + std::list< cEnchantment * > Enchantments; + + //! Internal storage for our character's total burden. + DWORD TotalBurden; + //! Internal storage for the number of pyreals our character owns. + DWORD TotalPyreal; + //! Internal storage for our character's total experience. + DWORD TotalXP; + //! Internal storage for our character's unsassigned experience. + DWORD UnassignedXP; + //! Internal storage for the number of skill points our character has available. + DWORD SkillPoints; + //! Internal storage for our character's level. + DWORD Level; + //! Internal storage for our character's allegiance rank. + DWORD Rank; + + //! Internal storage for our character's burden percentage. (0-300%) + float Burden; + + //! Internal Location_t for storing our character's location. + Location_t Location; + +//Current Stuff + //! Internal storage for our character's "current" or "adjusted" attributes. + DWORD CurStat[6]; + //! Internal storage for our character's "current" or "adjusted" vitals. + DWORD CurSecStat[3]; + //! Internal storage for our character's "current" or "adjusted" skills. + DWORD CurSkill[40]; + //! Internal storage originally allocated for our character's drain spell range. (Note by Eckzow on 7-31-03: I can't find record of this being set to anything useful...) + double DrainRange; + //! Internal storage originally allocated for our character's harm spell range. (Note by Eckzow on 7-31-03: I can't find record of this being set to anything useful...) + double HarmRange; + + //! Internal storage allocated for our character's current number of health points. + int Health; + //! Internal storage allocated for our character's current number of stamina points. + int Stamina; + //! Internal storage allocated for our character's current number of mana points. + int Mana; + + //! Internal storage for our percantage of vitae. + float Vitae; + + void __stdcall onMessage(IMessage* pMsg); + + //! Internal function to add a spell to our (also internal) list of enchantments on the character. + void AddEnchant(int SpellID, int Layer, double Duration, DWORD Family, double Elapsed, DWORD AffectMask, DWORD Affected, float Adjustment); + //! Internal function called to remove a spell from our (also internal) list of enchantments on the character. + void RemoveEnchant(int SpellID, int Layer); + + //! Internal function to trigger a recalculation of a specific stat. + /*! + \sa RecalcSecStat(), RecalcSkill() + \param Stat Index of the stat to be recalculated. + */ + void RecalcStat(int Stat); + //! Internal function to trigger a recalculation of all our character's vitals. + /*! + This function is necessary to keep our "adjusted" values up to date as an enchantment is cast, a spell expires, the user increments + their stat, etc. + \sa RecalcSkills() + */ + void RecalcSecStats(); + //! Internal function to trigger a recalculation of a specific vital. + /*! + \sa RecalcStat(), RecalcSkill() + \param SecStat Index of the vital to be recalculated. + */ + void RecalcSecStat(int SecStat); + //! Internal function to trigger a recalculation of all our character's skills. + /*! + This function is necessary to keep our "adjusted" values up to date as an enchantment is cast, a spell expires, the user increments + their stat, etc. + \sa RecalcSecStats() + */ + void RecalcSkills(); + //! Internal function to trigger a recalculation of a specific skill. + /*! + \sa RecalcSecStat(), RecalcSkill() + \param Skill Index of the skill to be recalculated. + */ + void RecalcSkill(int Skill); + +//Other + //! Internal storage for the name of the server we're on. + char Server[50]; + + //! Internal storage for the id's of spells we've learned. + std::set< DWORD > SpellsLearned; + + //! Internal storage for our monarch's allegiance information. + cAllegianceInfo Monarch; + //! Internal storage for our patron's allegiance information. + cAllegianceInfo Patron; + //! Internal storage for our own allegiance information. + cAllegianceInfo MyAlleg; + //! Internal storage array for each vassal's allegiance information. + cAllegianceInfo Vassals[12]; + //! Internal storage for the number of vassals our character has. + int VassalCount; + + //! Internal storage for the number of followers you specifically have. + DWORD Followers; + //! Internal storage for the number of followers your monarchy has. + DWORD MonarchFollowers; + //! Whether or not we've received allegiance information for our character yet + /*! + Initially set to false, GotAlleg is used internally to represent whether we've + received allegiance information for a character yet. Functions involving allegiance + check this variable before doing any processing so that they may intentionally error + as there is no allegiance information for the user's character before an allegiance + information packet is received. + \sa GotLogin + */ + bool GotAlleg; + + //! Internal storage for the number of deaths our character has. + DWORD Deaths; + //! Internal storage for the number of birthes our character has. + DWORD Birth; + //! Internal storage for the age of our characters (like /age this should not be taken as the gospel truth as it can be off by quite a bit) + DWORD Age; + +public: + STDMETHOD(Initialize)(INetService *pService); + STDMETHOD(Terminate)(); + STDMETHOD(DispatchServer)(IMessage2 *); + STDMETHOD(DispatchClient)(IMessage2 *); + + //Old Stuff + //! Function to get the number of spells our character has learned. + /*! + \param pVal Pointer to a long where the number of spells can be stored. + \return E_FAIL if the character has not yet logged in, otherwise S_OK. + \sa get_SpellLearned() + */ + STDMETHOD(get_TotalSpells)(/*[out, retval]*/ long *pVal); + //! Function to find out if a specific spell is known to our character or not. + /*! + \param SpellID The id of the spell (from portal.dat) that you wish to check. + \param pVal Pointer to a long where the status of the spell will be stored. pVal is set equal to false (0) if the spell is unknown or true (1) if it is. + \return E_FAIL if the character is not logged in or if the spellID supplied was invalid. If sucessful, S_OK is returned. pVal will also be set to -1 if the spell id was invalid. + \sa get_TotalSpells() + */ + STDMETHOD(get_SpellLearned)(long SpellID, /*[out, retval]*/ long *pVal); + // ICharacterStats + //! Function to get the class/title of our character. + /*! + \param pVal Pointer to a BSTR object where the class/title of the character may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_ClassTemplate)(/*[out, retval]*/ BSTR *pVal); + //! Function to get the gender of our character. + /*! + \param pVal Pointer to a BSTR object where the gender of the character may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Gender)(/*[out, retval]*/ BSTR *pVal); + //! Function to get the race of our character. + /*! + \param pVal Pointer to a BSTR object where the race of the character may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Race)(/*[out, retval]*/ BSTR *pVal); + //! Function to get the name of our character. + /*! + \param pVal Pointer to a BSTR object where the name of the character may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pVal); + //! Function to get the server our character is on. + /*! + \param pVal Pointer to a BSTR object where the name of the server our character is on may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Server)(/*[out, retval]*/ BSTR *pVal); + + //! Function to get the number of skill points available to our character. + /*! + \param pVal Pointer to a long where the number of skill points may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_SkillPoints)(/*[out, retval]*/ long *pVal); + //! Function to get the amount of unassigned experience available to our character. + /*! + \param pVal Pointer to a long where the number of unassigned experience points may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_UnassignedExp)(/*[out, retval]*/ long *pVal); + //! Function to get the amound of total experience our character has earned. + /*! + \param pVal Pointer to a long where the number experience points our character has earned may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_TotalExp)(/*[out, retval]*/ long *pVal); + + //! Function to get our character's allegiance rank. + /*! + \param pVal Pointer to a long where our character's allegiance rank may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Rank)(/*[out, retval]*/ long *pVal); + //! Function to get our character's level. + /*! + \param pVal Pointer to a long where our character's level may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Level)(/*[out, retval]*/ long *pVal); + //! Function to get our character's GUID. + /*! + \param pVal Pointer to a long where our character's GUID may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Character)(/*[out, retval]*/ long *pVal); + + //! Function to get the number of vitals that the filter is storing information for. + /*! + \param pVal Pointer to a long where the number of vitals the filter is tracking may be stored. + \return S_OK if successful. + */ + STDMETHOD(get_VitalCount)(/*[out, retval]*/ long *pVal); + //! Function to get the number of skills that the filter is storing information for. + /*! + \param pVal Pointer to a long where the number of skills the filter is tracking may be stored. + \return S_OK if successful. + */ + STDMETHOD(get_SkillCount)(/*[out, retval]*/ long *pVal); + //! Function to get the number of attributes that the filter is storing information for. + /*! + \param pVal Pointer to a long where the number of attributes the filter is tracking may be stored. + \return S_OK if successful. + */ + STDMETHOD(get_AttributeCount)(/*[out, retval]*/ long *pVal); + + //! Function to get information on a given vital. + /*! + Using get_Vital to get in-depth information on a vital statistic is approved, however + the function has been deprecated for simply getting the vital's value/it's base by the new + GetVital ACHooks. + \param Index A member of the eVitalID enumeration representing which vital you wish to obtain information for. + \param pVal A pointer to an ISkillInfo in which the vital's information may be stored. + \return E_FAIL if the character is not logged in or if the Index parameter is out of range, otherwise the result of the ISkillInfo's QueryInterface. + */ + STDMETHOD(get_Vital)(enum eVitalID Index, /*[out, retval]*/ ISkillInfo ** pVal); + //! Function to get information on a given skill. + /*! + Using get_Skill to get in-depth information on a skill is approved, however + the function has been deprecated for simply getting the skill's value/it's base by the new + GetSkill ACHooks. + \param Index A member of the eSkillID enumeration representing which skill you wish to obtain information for. + \param pVal A pointer to an ISkillInfo in which the vital's information may be stored. + \return E_FAIL if the character is not logged in or if the Index parameter is out of range, otherwise the result of the ISkillInfo's QueryInterface. + */ + STDMETHOD(get_Skill)(enum eSkillID Index, /*[out, retval]*/ ISkillInfo ** pVal); + //! Function to get information on a given attribute. + /*! + Using get_Attribute to get in-depth information on an attribute is approved, however + the function has been deprecated for simply getting the attribute's value/it's base by the new + GetAttribute ACHooks. + \param Index A member of the eAttributeID enumeration representing which vital you wish to obtain information for. + \param pVal A pointer to an IAttributeInfo in which the vital's information may be stored. + \return E_FAIL if the character is not logged in or if the Index parameter is out of range, otherwise the result of the IAttributeInfo's QueryInterface. + */ + STDMETHOD(get_Attribute)(enum eAttributeID Index, /*[out, retval]*/ IAttributeInfo ** pVal); + + //New Stuff + //! Function to get the allegiance information for your monarch. + /*! + \param pVal Pointer to an IAllegianceInfo into which the monarch's information may be stored. + \return E_FAIL if an allegiance information packet has not been received or you have no monarch, otherwise the result of the IAllegianceInfo's QueryInterface. + */ + STDMETHOD(get_Monarch)(IAllegianceInfo ** pVal); + //! Function to get the allegiance information for your patron. + /*! + \param pVal Pointer to an IAllegianceInfo into which your patron's information may be stored. + \return E_FAIL if an allegiance information packet has not been received or you have no patron, otherwise the result of the IAllegianceInfo's QueryInterface. + */ + STDMETHOD(get_Patron)(IAllegianceInfo ** pVal); + //! Function to get the allegiance information for your character. + /*! + \param pVal Pointer to an IAllegianceInfo into which the character's information may be stored. + \return E_FAIL if an allegiance information packet has not been received or is invalid, otherwise the result of the IAllegianceInfo's QueryInterface. + */ + STDMETHOD(get_MyAllegiance)(IAllegianceInfo ** pVal); + //! Function to get the allegiance information for one of your vassals. + /*! + \param VassalNum A long signifying the zero-based index of the vassal who's information you wish to retrieve. + \param pVal Pointer to an IAllegianceInfo into which your vassal's information may be stored. + \return E_FAIL if an allegiance information packet has not been received, the index you supplied was invalid, or you have no vassal at that index. Otherwise the result of the IAllegianceInfo's QueryInterface is returned. + */ + STDMETHOD(get_Vassal)(long VassalNum, IAllegianceInfo ** pVal); + //! Function to get the number of vassals your character has. + /*! + \param pVal Pointer to a long into which the number of vassals may be stored. + \return E_FAIL if an allegiance information packet has not been received, otherwise S_OK. + */ + STDMETHOD(get_VassalCount)(long *pVal); + //! Function to get the number of followers your character has. + /*! + \param pVal Pointer to a long into which the number of followers may be stored. + \return E_FAIL if an allegiance information packet has not been received, otherwise S_OK. + */ + STDMETHOD(get_Followers)(long *pVal); + //! Function to get the number of followers your monarchy has. + /*! + \param pVal Pointer to a long into which the number of followers may be stored. + \return E_FAIL if an allegiance information packet has not been received, otherwise S_OK. + */ + STDMETHOD(get_MonarchFollowers)(long *pVal); + + //! Function to get our character's birthtime. + /*! + \param pVal Pointer to a long where our character's birthtime (UNIX time) may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Birth)(long *pVal); + //! Function to get our character's age. + /*! + \param pVal Pointer to a long where our character's age (in seconds) may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Age)(long *pVal); + //! Function to get our character's death count. + /*! + \param pVal Pointer to a long where the number of times our character has died may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Deaths)(long *pVal); + + //! Function to get our character's current Health. + /*! + \param pVal Pointer to a long where our character's current Health may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Health)(long *pVal); + //! Function to get our character's current Stamina. + /*! + \param pVal Pointer to a long where our character's current Stamina may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Stamina)(long *pVal); + //! Function to get our character's current Mana. + /*! + \param pVal Pointer to a long where our character's current Mana may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Mana)(long *pVal); + + //! Function to get the number of enchantments currently affecting our character. + /*! + \param pVal Pointer to a long where the number of enchantments may be stored. + \return E_FAIL if the character is not yet logged in, else S_OK. + */ + STDMETHOD(get_EnchantmentCount)(long *pVal); + //! Function to get detailed information on an enchantment. + /*! + \param EnchantNum Zero-based index of the enchantment you wish to get information for. + \param pVal Pointer to an IEnchantment where the enchantment's information may be stored. + */ + STDMETHOD(get_Enchantment)(long EnchantNum, IEnchantment **pVal); + + //! Function to get the value of a given vital. + /*! + Usage of this function has been deprecated due to the release of the new GetVital ACHook. + \param Index A member of the eVitalID enumeration representing which vital you wish to obtain the value of. + \param pVal A pointer to a long where the vital's value may be stored. + \return E_FAIL if the character is not logged in or if the Index parameter is out of range, otherwise S_OK. + */ + STDMETHOD(get_EffectiveVital)(enum eVitalID Index, /*[out, retval]*/ long *pVal); + //! Function to get the value of a given skill. + /*! + Usage of this function has been deprecated due to the release of the new GetSkill ACHook. + \param Index A member of the eSkillID enumeration representing which skill you wish to obtain the value of. + \param pVal A pointer to a long where the skill's value may be stored. + \return E_FAIL if the character is not logged in or if the Index parameter is out of range, otherwise S_OK. + */ + STDMETHOD(get_EffectiveSkill)(enum eSkillID Index, /*[out, retval]*/ long *pVal); + //! Function to get the value of a given attribute. + /*! + Usage of this function has been deprecated due to the release of the new GetAttribute ACHook. + \param Index A member of the eAttributeID enumeration representing which vital you wish to obtain the value of. + \param pVal A pointer to a long where the attribute's value may be stored. + \return E_FAIL if the character is not logged in or if the Index parameter is out of range, otherwise S_OK. + */ + STDMETHOD(get_EffectiveAttribute)(enum eAttributeID Index, /*[out, retval]*/ long * pVal); + + //! Function to get our character's vitae percentage. + /*! + \param pVal Pointer to a long where the percentage vitae penalty our character has aquired may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Vitae)(/*[out, retval]*/ long *pVal); + + //! Function to get our character's current number of burden units. + /*! + \param pVal Pointer to a long where the number of burden units our character is carrying may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_BurdenUnits)(/*[out, retval]*/ long *pVal); + //! Function to get our character's burden percentage. + /*! + \param pVal Pointer to a long where our character's current burden percentage may be stored. + \return E_FAIL if the character is not logged in, otherwise S_OK. + */ + STDMETHOD(get_Burden)(/*[out, retval]*/ long *pVal); +}; + +#endif //__CHARACTERSTATS_H_ diff --git a/Native/DecalFilters/CharacterStats.rgs b/Native/DecalFilters/CharacterStats.rgs new file mode 100644 index 0000000..6f8ee07 --- /dev/null +++ b/Native/DecalFilters/CharacterStats.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalFilters.CharacterStats.1 = s 'CharacterStats Class' + { + CLSID = s '{4540C969-08D1-46BF-97AD-6B19D3C10BEE}' + } + DecalFilters.CharacterStats = s 'CharacterStats Class' + { + CLSID = s '{4540C969-08D1-46BF-97AD-6B19D3C10BEE}' + CurVer = s 'DecalFilters.CharacterStats.1' + } + NoRemove CLSID + { + ForceRemove {4540C969-08D1-46BF-97AD-6B19D3C10BEE} = s 'CharacterStats Class' + { + ProgID = s 'DecalFilters.CharacterStats.1' + VersionIndependentProgID = s 'DecalFilters.CharacterStats' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove NetworkFilters + { + ForceRemove {4540C969-08D1-46BF-97AD-6B19D3C10BEE} = s 'Character Stats Filter' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/DecalFilters/DecalFilters.cpp b/Native/DecalFilters/DecalFilters.cpp new file mode 100644 index 0000000..d7faac4 --- /dev/null +++ b/Native/DecalFilters/DecalFilters.cpp @@ -0,0 +1,88 @@ +// DecalFilters.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f DecalFiltersps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "DecalFilters.h" + +#include "EchoFilter.h" +#include "EchoFilter2.h" +#include "Prefilter.h" +#include "CharacterStats.h" + +#include "DecalFilters_i.c" +#include + +#include "World.h" +#include "WorldObject.h" +#include "WorldIterator.h" + +#include "IdentifyQueue.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) + OBJECT_ENTRY(CLSID_EchoFilter, cEchoFilter) + OBJECT_ENTRY(CLSID_EchoFilter2, cEchoFilter2) + OBJECT_ENTRY(CLSID_Prefilter, cPrefilter) + OBJECT_ENTRY(CLSID_CharacterStats, cCharacterStats) + OBJECT_ENTRY(CLSID_World, cWorld) + OBJECT_ENTRY(CLSID_WorldObject, cWorldObject) + OBJECT_ENTRY(CLSID_WorldIterator, cWorldIterator) + OBJECT_ENTRY(CLSID_IdentifyQueue, CIdentifyQueue) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_DecalFilters); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} \ No newline at end of file diff --git a/Native/DecalFilters/DecalFilters.def b/Native/DecalFilters/DecalFilters.def new file mode 100644 index 0000000..6ace0bf --- /dev/null +++ b/Native/DecalFilters/DecalFilters.def @@ -0,0 +1,9 @@ +; DecalFilters.def : Declares the module parameters. + +LIBRARY "DecalFilters.DLL" + +EXPORTS + DllCanUnloadNow @1 PRIVATE + DllGetClassObject @2 PRIVATE + DllRegisterServer @3 PRIVATE + DllUnregisterServer @4 PRIVATE diff --git a/Native/DecalFilters/DecalFilters.dsp b/Native/DecalFilters/DecalFilters.dsp new file mode 100644 index 0000000..abf2aa7 --- /dev/null +++ b/Native/DecalFilters/DecalFilters.dsp @@ -0,0 +1,298 @@ +# Microsoft Developer Studio Project File - Name="DecalFilters" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=DecalFilters - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "DecalFilters.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "DecalFilters.mak" CFG="DecalFilters - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "DecalFilters - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalFilters - Win32 Release MinDependency" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "DecalFilters - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /Ge /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\mysource\Debug\DecalFilters.dll +InputPath=\mysource\Debug\DecalFilters.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalFilters - Win32 Release MinDependency" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinDependency" +# PROP BASE Intermediate_Dir "ReleaseMinDependency" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinDependency" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\mysource\Release\DecalFilters.dll +InputPath=\mysource\Release\DecalFilters.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "DecalFilters - Win32 Debug" +# Name "DecalFilters - Win32 Release MinDependency" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\AllegianceInfo.cpp +# End Source File +# Begin Source File + +SOURCE=.\AttributeInfo.cpp +# End Source File +# Begin Source File + +SOURCE=.\CharacterStats.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalFilters.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalFilters.def +# End Source File +# Begin Source File + +SOURCE=.\DecalFilters.idl +# ADD MTL /tlb ".\DecalFilters.tlb" /h "DecalFilters.h" /iid "DecalFilters_i.c" /Oicf +# End Source File +# Begin Source File + +SOURCE=.\DecalFilters.rc +# End Source File +# Begin Source File + +SOURCE=.\EchoFilter.cpp +# End Source File +# Begin Source File + +SOURCE=.\EchoFilter2.cpp +# End Source File +# Begin Source File + +SOURCE=.\Enchantment.cpp +# End Source File +# Begin Source File + +SOURCE=.\IdentifyQueue.cpp +# End Source File +# Begin Source File + +SOURCE=.\Prefilter.cpp +# End Source File +# Begin Source File + +SOURCE=.\SkillInfo.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\World.cpp +# End Source File +# Begin Source File + +SOURCE=.\WorldIterator.cpp +# End Source File +# Begin Source File + +SOURCE=.\WorldObject.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\AllegianceInfo.h +# End Source File +# Begin Source File + +SOURCE=.\AttributeInfo.h +# End Source File +# Begin Source File + +SOURCE=.\CharacterStats.h +# End Source File +# Begin Source File + +SOURCE=.\DecalFiltersCP.h +# End Source File +# Begin Source File + +SOURCE=.\EchoFilter.h +# End Source File +# Begin Source File + +SOURCE=.\EchoFilter2.h +# End Source File +# Begin Source File + +SOURCE=.\Enchantment.h +# End Source File +# Begin Source File + +SOURCE=.\FilterImpl.h +# End Source File +# Begin Source File + + +SOURCE=.\IdentifyQueue.h +# End Source File +# Begin Source File + +SOURCE=.\Prefilter.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\SkillInfo.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\World.h +# End Source File +# Begin Source File + +SOURCE=.\WorldIterator.h +# End Source File +# Begin Source File + +SOURCE=.\WorldObject.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\AllegianceInfo.rgs +# End Source File +# Begin Source File + +SOURCE=.\CharacterStats.rgs +# End Source File +# Begin Source File + +SOURCE=.\EchoFilter.rgs +# End Source File +# Begin Source File + +SOURCE=.\EchoFilter2.rgs +# End Source File +# Begin Source File + +SOURCE=.\Enchantment.rgs +# End Source File +# Begin Source File + +SOURCE=.\IdentifyQueue.rgs +# End Source File +# Begin Source File + +SOURCE=.\Prefilter.rgs +# End Source File +# Begin Source File + +SOURCE=.\World.rgs +# End Source File +# Begin Source File + +SOURCE=.\WorldIterator.rgs +# End Source File +# Begin Source File + +SOURCE=.\WorldObject.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/DecalFilters/DecalFilters.idl b/Native/DecalFilters/DecalFilters.idl new file mode 100644 index 0000000..6aae691 --- /dev/null +++ b/Native/DecalFilters/DecalFilters.idl @@ -0,0 +1,686 @@ +// DecalFilters.idl : IDL source for DecalFilters.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (DecalFilters.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; +import "DecalNet.idl"; + +enum eTrainingType +{ + eTrainUnusable, + eTrainUntrained, + eTrainTrained, + eTrainSpecialized +}; + +enum eAttributeID +{ + eAttrStrength = 1, + eAttrEndurance = 2, + eAttrQuickness = 3, + eAttrCoordination = 4, + eAttrFocus = 5, + eAttrSelf = 6, + eAttrNULL = 255 +}; + +enum eSkillID +{ + eSkillAxe = 1, + eSkillBow = 2, + eSkillCrossbow = 3, + eSkillDagger = 4, + eSkillMace = 5, + eSkillMeleeDefense = 6, + eSkillMissileDefense = 7, + eSkillSpear = 9, + eSkillStaff = 10, + eSkillSword = 11, + eSkillThrownWeapons = 12, + eSkillUnarmed = 13, + eSkillArcaneLore = 14, + eSkillMagicDefense = 15, + eSkillManaConversion = 16, + eSkillItemTinkering = 18, + eSkillAssessPerson = 19, + eSkillDeception = 20, + eSkillHealing = 21, + eSkillJump = 22, + eSkillLockpick = 23, + eSkillRun = 24, + eSkillAssessCreature = 27, + eSkillWeaponTinkering = 28, + eSkillArmorTinkering = 29, + eSkillMagicItemTinkering = 30, + eSkillCreatureEnchantment = 31, + eSkillItemEnchantment = 32, + eSkillLifeMagic = 33, + eSkillWarMagic = 34, + eSkillLeadership = 35, + eSkillLoyalty = 36, + eSkillFletching = 37, + eSkillAlchemy = 38, + eSkillCooking = 39 +}; + +enum eVitalID +{ + eHealth = 1, + eStamina = 2, + eMana = 3 +}; + +enum eStatisticType +{ + eStatBurden = 5, + eStatPyreal = 20, + eStatExperience = 21, + eStatUnassignedExp = 22, + eStatUnassignedSkillPoints = 24, + eStatLevel = 25, + eStatRank = 30 +}; + +enum eStringType +{ + eStringName = 1, + eStringGender = 3, + eStringRace = 4, + eStringClass = 5 +}; + +enum eObjectType +{ + eMeleeWeapon = 0, + eArmor, + eClothing, + eJewelry, + eMonster, + eFood, + eMoney, + eMisc, + eMissileWeapon, + eContainer, + eGem, + eSpellComponent, + eKey, + ePortal, + eTradeNote, + eManaStone, + eService, + ePlant, + eBaseCooking, + eBaseAlchemy, + eBaseFletching, + eCraftedCooking, + eCraftedAlchemy, + eCraftedFletching, + ePlayer, + eVendor, + eDoor, + eCorpse, + eLifestone, + eHealingKit, + eLockpick, + eUnknownObject, + eWandStaffOrb, + eBundle, + eBook, + eJournal, + eSign, + eHousing, + eNPC, + eFoci, + eSalvage, + eUst, + + // Leave this last!!! + eNumObjectTypes +}; + + [ + uuid(A67C748D-2427-4a13-A114-7ACC1D4C9433), + helpstring("IPrefilterEvents Interface") + ] + dispinterface IPrefilterEvents + { + properties: + methods: + [id(1), helpstring("method Event")] void Event(long ID, IMessage *Message); + }; + + [ + object, + uuid(B6496852-E977-4DA2-884D-09AFEA3D7582), + dual, + helpstring("IAttributeInfo Interface"), + pointer_default(unique) + ] + interface IAttributeInfo : IDispatch + { + [propget, id(1), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(2), helpstring("property Creation")] HRESULT Creation([out, retval] long *pVal); + [propget, id(3), helpstring("property Exp")] HRESULT Exp([out, retval] long *pVal); + [propget, id(4), helpstring("property Current")] HRESULT Current([out, retval] long *pVal); + }; + + [ + object, + uuid(6FBA5326-F234-4AEC-B844-2136A0D50FD5), + dual, + helpstring("ISkillInfo Interface"), + pointer_default(unique) + ] + interface ISkillInfo : IDispatch + { + [propget, id(1), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(2), helpstring("property ShortName")] HRESULT ShortName([out, retval] BSTR *pVal); + [propget, id(3), helpstring("property Formula")] HRESULT Formula([out, retval] BSTR *pVal); + [propget, id(4), helpstring("property Base")] HRESULT Base([out, retval] long *pVal); + [propget, id(5), helpstring("property Current")] HRESULT Current([out, retval] long *pVal); + [propget, id(6), helpstring("property Exp")] HRESULT Exp([out, retval] long *pVal); + [propget, id(7), helpstring("property Training")] HRESULT Training([out, retval] enum eTrainingType *pVal); + [propget, id(8), helpstring("property Known")] HRESULT Known([out, retval] VARIANT_BOOL *pVal); + [propget, id(9), helpstring("property Increment")] HRESULT Increment([out, retval] long *pVal); + [propget, id(10), helpstring("property Bonus")] HRESULT Bonus([out, retval] long *pVal); + }; + + [ + object, + uuid(B83155F4-E298-4004-80C6-AA592F677430), + dual, + helpstring("IEnchantment Interface"), + pointer_default(unique) + ] + interface IEnchantment : IDispatch + { + [propget, id(1), helpstring("property SpellID")] HRESULT SpellID([out, retval] long *pVal); + [propput, id(1), helpstring("property SpellID")] HRESULT SpellID([in] long newVal); + [propget, id(2), helpstring("property Layer")] HRESULT Layer([out, retval] long *pVal); + [propput, id(2), helpstring("property Layer")] HRESULT Layer([in] long newVal); + [propget, id(3), helpstring("property TimeRemaining")] HRESULT TimeRemaining([out, retval] long *pVal); + [propput, id(3), helpstring("property TimeRemaining")] HRESULT TimeRemaining([in] long newVal); + [propget, id(4), helpstring("property Affected")] HRESULT Affected([out, retval] long *pVal); + [propput, id(4), helpstring("property Affected")] HRESULT Affected([in] long newVal); + [propget, id(5), helpstring("property AffectedMask")] HRESULT AffectedMask([out, retval] long *pVal); + [propput, id(5), helpstring("property AffectedMask")] HRESULT AffectedMask([in] long newVal); + [propget, id(6), helpstring("property Family")] HRESULT Family([out, retval] long *pVal); + [propput, id(6), helpstring("property Family")] HRESULT Family([in] long newVal); + [propget, id(7), helpstring("property Adjustment")] HRESULT Adjustment([out, retval] double *pVal); + [propput, id(7), helpstring("property Adjustment")] HRESULT Adjustment([in] double newVal); + }; + + [ + object, + uuid(C8A16199-B649-41F3-BFCA-A1BD6E2E1F2C), + dual, + helpstring("IAllegianceInfo Interface"), + pointer_default(unique) + ] + interface IAllegianceInfo : IDispatch + { + [propget, id(1), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(2), helpstring("property GUID")] HRESULT GUID([out, retval] long *pVal); + [propget, id(3), helpstring("property TreeParent")] HRESULT TreeParent([out, retval] long *pVal); + [propget, id(4), helpstring("property Type")] HRESULT Type([out, retval] long *pVal); + [propget, id(5), helpstring("property XP")] HRESULT XP([out, retval] long *pVal); + [propget, id(6), helpstring("property Loyalty")] HRESULT Loyalty([out, retval] long *pVal); + [propget, id(7), helpstring("property Leadership")] HRESULT Leadership([out, retval] long *pVal); + [propget, id(8), helpstring("property Gender")] HRESULT Gender([out, retval] long *pVal); + [propget, id(9), helpstring("property Race")] HRESULT Race([out, retval] long *pVal); + [propget, id(10), helpstring("property Rank")] HRESULT Rank([out, retval] long *pVal); + [propget, id(11), helpstring("property Unknown")] HRESULT Unknown([out, retval] double *pVal); + }; + + [ + object, + uuid(0CE57594-4E30-4446-956D-CE460C7355AF), + dual, + helpstring("ICharacterStats Interface"), + pointer_default(unique) + ] + interface ICharacterStats : IDispatch + { + [propget, id(1), helpstring("property Character")] HRESULT Character([out, retval] long *pVal); + [propget, id(2), helpstring("property Level")] HRESULT Level([out, retval] long *pVal); + [propget, id(3), helpstring("property Rank")] HRESULT Rank([out, retval] long *pVal); + [propget, id(4), helpstring("property TotalExp")] HRESULT TotalExp([out, retval] long *pVal); + [propget, id(5), helpstring("property UnassignedExp")] HRESULT UnassignedExp([out, retval] long *pVal); + [propget, id(6), helpstring("property SkillPoints")] HRESULT SkillPoints([out, retval] long *pVal); + [propget, id(7), helpstring("property Server")] HRESULT Server([out, retval] BSTR *pVal); + [propget, id(8), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(9), helpstring("property Race")] HRESULT Race([out, retval] BSTR *pVal); + [propget, id(10), helpstring("property Gender")] HRESULT Gender([out, retval] BSTR *pVal); + [propget, id(11), helpstring("property ClassTemplate")] HRESULT ClassTemplate([out, retval] BSTR *pVal); + [propget, id(12), helpstring("property AttributeCount")] HRESULT AttributeCount([out, retval] long *pVal); + [propget, id(13), helpstring("property SkillCount")] HRESULT SkillCount([out, retval] long *pVal); + [propget, id(14), helpstring("property VitalCount")] HRESULT VitalCount([out, retval] long *pVal); + [propget, id(15), helpstring("property Attribute")] HRESULT Attribute(enum eAttributeID Index, [out, retval] IAttributeInfo * *pVal); + [propget, id(16), helpstring("property Skill")] HRESULT Skill(enum eSkillID Index, [out, retval] ISkillInfo * *pVal); + [propget, id(17), helpstring("property Vital")] HRESULT Vital(enum eVitalID Index, [out, retval] ISkillInfo * *pVal); + [propget, id(18), helpstring("property SpellLearned")] HRESULT SpellLearned(long SpellID, [out, retval] long *pVal); + [propget, id(19), helpstring("property TotalSpells")] HRESULT TotalSpells([out, retval] long *pVal); + [propget, id(20), helpstring("property Health")] HRESULT Health([out, retval] long *pVal); + [propget, id(21), helpstring("property Stamina")] HRESULT Stamina([out, retval] long *pVal); + [propget, id(22), helpstring("property Mana")] HRESULT Mana([out, retval] long *pVal); + [propget, id(23), helpstring("property Birth")] HRESULT Birth([out, retval] long *pVal); + [propget, id(24), helpstring("property Age")] HRESULT Age([out, retval] long *pVal); + [propget, id(25), helpstring("property Deaths")] HRESULT Deaths([out, retval] long *pVal); + [propget, id(26), helpstring("property VassalCount")] HRESULT VassalCount([out, retval] long *pVal); + [propget, id(27), helpstring("property Monarch")] HRESULT Monarch([out, retval] IAllegianceInfo **pVal); + [propget, id(28), helpstring("property Patron")] HRESULT Patron([out, retval] IAllegianceInfo **pVal); + [propget, id(29), helpstring("property MyAllegiance")] HRESULT MyAllegiance([out, retval] IAllegianceInfo **pVal); + [propget, id(30), helpstring("property Vassal")] HRESULT Vassal(long VassalNum, [out, retval] IAllegianceInfo **pVal); + [propget, id(31), helpstring("property Followers")] HRESULT Followers([out, retval] long *pVal); + [propget, id(32), helpstring("property MonarchFollowers")] HRESULT MonarchFollowers([out, retval] long *pVal); + [propget, id(33), helpstring("property EnchantmentCount")] HRESULT EnchantmentCount([out, retval] long *pVal); + [propget, id(34), helpstring("property Enchantment")] HRESULT Enchantment(long EnchantNum, [out, retval] IEnchantment **pVal); + [propget, id(35), helpstring("property EffectiveAttribute")] HRESULT EffectiveAttribute(enum eAttributeID Index, [out, retval] long *pVal); + [propget, id(36), helpstring("property EffectiveSkill")] HRESULT EffectiveSkill(enum eSkillID Index, [out, retval] long *pVal); + [propget, id(37), helpstring("property EffectiveVital")] HRESULT EffectiveVital(enum eVitalID Index, [out, retval] long *pVal); + [propget, id(38), helpstring("property Vitae")] HRESULT Vitae([out, retval] long *pVal); + [propget, id(39), helpstring("property BurdenUnits")] HRESULT BurdenUnits([out, retval] long *pVal); + [propget, id(40), helpstring("property Burden")] HRESULT Burden([out, retval] long *pVal); + }; + + [ + uuid(7B7FEF07-DAE2-46f3-AC71-7E47F8EF3A44), + helpstring("IEchoSink2 Interface"), + dual, + pointer_default(unique) + ] + interface IEcho : IDispatch + { + }; + + [ + uuid(236B3F19-8F40-492b-A462-0EB4447A6296), + helpstring("IEchoSink Interface") + ] + dispinterface IEchoSink + { + properties: + methods: + [id(1), helpstring("method EchoMessage")] void EchoMessage(IMessage *pMsg); + }; + + [ + uuid(002C8BAE-917E-4978-B223-B45B3E8B15E6), + helpstring("IEchoSink2 Interface"), + dual, + pointer_default(unique) + ] + interface IEcho2 : IDispatch + { + }; + + [ + uuid(6C9BCC85-BAD0-4706-9CC5-D491E43F81C4), + helpstring("IEchoSink2 Interface") + ] + dispinterface IEchoSink2 + { + properties: + methods: + [id(1), helpstring("method EchoServer")] void EchoServer(IMessage2 *pMsg); + [id(2), helpstring("method EchoClient")] void EchoClient(IMessage2 *pMsg); + }; + +[ + object, + uuid(6FD2E07C-7E9C-451B-8968-2FCB0226D0E8), + dual, + nonextensible, + helpstring("IIdentifyQueue Interface"), + pointer_default(unique) +] +interface IIdentifyQueue : IDispatch{ +}; +[ + uuid(DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1), + version(1.0), + helpstring("Decal Network Filters Type Library") +] +library DecalFilters +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + dispinterface IEchoSink; + dispinterface IEchoSink2; + dispinterface IPrefilterEvents; + dispinterface ICharacterStatsEvents; + + interface IWorldIterator; + interface IWorldObject; + interface IWorldObject2; + interface IEnchantment; + interface IAllegianceInfo; + + [ + uuid(0B60F187-13CD-4E35-B8A2-FE128F05CA6B), + helpstring("_ICharacterStatsEvents Interface") + ] + dispinterface ICharacterStatsEvents + { + properties: + methods: + [id(1), helpstring("method Login")] HRESULT Login(long character); + [id(2), helpstring("method Spellbook_Add")] HRESULT Spellbook_Add(long SpellAdded); + [id(3), helpstring("method Spellbook_Delete")] HRESULT Spellbook_Delete(long SpellDeleted); + }; + + [ + object, + uuid(3C1CBEF8-E72A-4BDF-B92E-4F3307109766), + dual, + helpstring("IPrefilter Interface"), + pointer_default(unique) + ] + interface IPrefilter : IDispatch + { + }; + [ + object, + uuid(C5F0FF7E-A043-4A28-8893-F6E43F4E9DED), + dual, + helpstring("IWorld Interface"), + pointer_default(unique) + ] + interface IWorld : IDispatch + { + [propget, id(1), helpstring("property Object")] HRESULT Object(long GUID, [out, retval] IWorldObject **pVal); + [propget, id(2), helpstring("property ByName")] HRESULT ByName(BSTR Name, [out, retval] IWorldIterator **pVal); + [propget, id(3), helpstring("property All")] HRESULT All([out, retval] IWorldIterator **pVal); + [propget, id(4), helpstring("property ByType")] HRESULT ByType(enum eObjectType Type, [out, retval] IWorldIterator * *pVal); + [propget, id(5), helpstring("property ByNameSubstring")] HRESULT ByNameSubstring(BSTR Substring, [out, retval] IWorldIterator * *pVal); + [propget, id(6), helpstring("property ByContainer")] HRESULT ByContainer(long GUID, [out, retval] IWorldIterator * *pVal); + [propget, id(7), helpstring("property Inventory")] HRESULT Inventory([out, retval] IWorldIterator * *pVal); + [id(8), helpstring("method Distance2D")] HRESULT Distance2D(long GUID1, long GUID2, [out, retval] float* pVal); + [propget, id(9), helpstring("property ByOwner")] HRESULT ByOwner(long GUID, [out, retval] IWorldIterator * *pVal); + [propget, id(10), helpstring("property Landscape")] HRESULT Landscape([out, retval] IWorldIterator * *pVal); + [propget, id(11), helpstring("property NumObjectTypes")] HRESULT NumObjectTypes([out, retval] long *lVal); + }; + [ + uuid(4540C969-08D1-46BF-97AD-6B19D3C10BEE), + helpstring("CharacterStats Class") + ] + coclass CharacterStats + { + [default] interface ICharacterStats; + [default, source] dispinterface ICharacterStatsEvents; + }; + + [ + uuid(AF42E9D7-E3F3-416B-AF32-A411F3F6EE72), + helpstring("AttributeInfo Class"), + noncreatable + ] + coclass AttributeInfo + { + [default] interface IAttributeInfo; + }; + + [ + uuid(652DA384-AA3B-4F9D-9730-8CF753DA1A31), + helpstring("SkillInfo Class"), + noncreatable + ] + coclass SkillInfo + { + [default] interface ISkillInfo; + }; + + [ + uuid(5DCF056E-B7F5-4AEB-93A0-628617B28488), + helpstring("Enchantment Class"), + noncreatable + ] + coclass Enchantment + { + [default] interface IEnchantment; + }; + + [ + uuid(B2EB5B5A-5E3F-4F60-8BC0-BB729FFC04F6), + helpstring("AllegianceInfo Class"), + noncreatable + ] + coclass AllegianceInfo + { + [default] interface IAllegianceInfo; + }; + + [ + uuid(443D4A68-5422-4E0C-9460-973F8FBDB190), + helpstring("Prefilter Class") + ] + coclass Prefilter + { + [default] interface IPrefilter; + [default, source] dispinterface IPrefilterEvents; + }; + + [ + uuid(8C2FA400-315D-41DE-B063-D6EF04F12E1F), + helpstring("EchoFilter Class") + ] + coclass EchoFilter + { + [default] interface IEcho; + [default, source] dispinterface IEchoSink; + }; + + [ + uuid(34239EAD-6317-4c40-A405-193BA5232DD8), + helpstring("EchoFilter2 Class") + ] + coclass EchoFilter2 + { + [default] interface IEcho2; + [default, source] dispinterface IEchoSink2; + }; + + [ + object, + uuid(02EA40F2-59C0-4396-8B4C-B8D45EC0CC98), + dual, + helpstring("IWorldObject Interface"), + pointer_default(unique) + ] + interface IWorldObject : IDispatch + { + [propget, id(1), helpstring("property GUID")] HRESULT GUID([out, retval] long *pVal); + [propget, id(3), helpstring("property Model")] HRESULT Model([out, retval] long *pVal); + [propget, id(4), helpstring("property Icon")] HRESULT Icon([out, retval] long *pVal); + [propget, id(5), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(6), helpstring("property Value")] HRESULT Value([out, retval] long *pVal); + [propget, id(7), helpstring("property Container")] HRESULT Container([out, retval] long *pVal); + [propget, id(8), helpstring("property Landblock")] HRESULT Landblock([out, retval] long *pVal); + [propget, id(9), helpstring("property Offset")] HRESULT Offset([out] float *x, [out] float *y, [out] float *z, [out, retval] short *pVal); + [propget, id(10), helpstring("property Heading")] HRESULT Heading([out] float *x, [out] float *y, [out] float *z, [out] float *w, [out, retval] short *pVal); + [propget, id(11), helpstring("property Type")] HRESULT Type([out, retval] enum eObjectType *pVal); + [propget, id(12), helpstring("property ItemSlots")] HRESULT ItemSlots([out, retval] long *pVal); + [propget, id(13), helpstring("property PackSlots")] HRESULT PackSlots([out, retval] long *pVal); + [propget, id(14), helpstring("property Lockable")] HRESULT Lockable([out, retval] VARIANT_BOOL *pVal); + [propget, id(15), helpstring("property Inscribable")] HRESULT Inscribable([out, retval] VARIANT_BOOL *pVal); + [propget, id(16), helpstring("property UsesLeft")] HRESULT UsesLeft([out, retval] long *pVal); + [propget, id(17), helpstring("property TotalUses")] HRESULT TotalUses([out, retval] long *pVal); + [propget, id(18), helpstring("property StackCount")] HRESULT StackCount([out, retval] long *pVal); + [propget, id(19), helpstring("property StackMax")] HRESULT StackMax([out, retval] long *pVal); + [propget, id(20), helpstring("property TradeNoteVendor")] HRESULT TradeNoteVendor([out, retval] long *pVal); + [propget, id(21), helpstring("property AssociatedSpell")] HRESULT AssociatedSpell([out, retval] long *pVal); + [propget, id(22), helpstring("property Slot")] HRESULT Slot([out, retval] long *pVal); + [propget, id(23), helpstring("property Owner")] HRESULT Owner([out, retval] long *pVal); + [propget, id(24), helpstring("property Wielder")] HRESULT Wielder([out, retval] long *pVal); + [propget, id(25), helpstring("property WieldingSlot")] HRESULT WieldingSlot([out, retval] long *pVal); + [propget, id(26), helpstring("property Coordinates")] HRESULT Coordinates([in, out] float *NorthSouth, [in, out] float *EastWest, [out, retval] VARIANT_BOOL *pVal); + [propget, id(27), helpstring("property Distance")] HRESULT Distance([in, out] float *NorthSouth, [in, out] float *EastWest, [out, retval] VARIANT_BOOL *pVal); + [propget, id(28), helpstring("property Monarch")] HRESULT Monarch([out, retval] long *pVal); + [propget, id(29), helpstring("property Material")] HRESULT Material([out, retval] long *pVal); + [propget, id(30), helpstring("property Coverage")] HRESULT Coverage([out, retval] long *pVal); + [propget, id(31), helpstring("property Coverage2")] HRESULT Coverage2([out, retval] long *pVal); + [propget, id(32), helpstring("property Coverage3")] HRESULT Coverage3([out, retval] long *pVal); + [propget, id(33), helpstring("property EquipType")] HRESULT EquipType([out, retval] long *pVal); + [propget, id(34), helpstring("property ApproachDistance")] HRESULT ApproachDistance([out, retval] float *pVal); + [propget, id(35), helpstring("property SecondaryName")] HRESULT SecondaryName([out, retval] BSTR *pVal); + [propget, id(36), helpstring("property RawCoordinates")] HRESULT RawCoordinates([in, out] float *pX, [in, out] float *pY, float *pZ, [out, retval] VARIANT_BOOL *pVal); + [propget, id(37), helpstring("property Burden")] HRESULT Burden([out, retval] long *pVal); + [propget, id(38), helpstring("property Workmanship")] HRESULT Workmanship([out, retval] float *pVal); + [propget, id(39), helpstring("property IconOutline")] HRESULT IconOutline([out, retval] long *pVal); + [propget, id(40), helpstring("property MissileType")] HRESULT MissileType([out, retval] long *pVal); + [propget, id(41), helpstring("property TotalValue")] HRESULT TotalValue([out, retval] long *pVal); + [propget, id(42), helpstring("property UsageMask")] HRESULT UsageMask([out, retval] long *pVal); + [propget, id(43), helpstring("property HouseOwner")] HRESULT HouseOwner([out, retval] long *pVal); + [propget, id(44), helpstring("property HookMask")] HRESULT HookMask([out, retval] long *pVal); + [propget, id(45), helpstring("property HookType")] HRESULT HookType([out, retval] long *pVal); + [propget, id(46), helpstring("property RealModel")] HRESULT RealModel([out, retval] long *pVal); + [propget, id(47), helpstring("property Scale")] HRESULT Scale([out, retval] float* pVal); + [propget, id(48), helpstring("property Flags")] HRESULT Flags([out, retval] long *pVal); + [propget, id(49), helpstring("property CreateFlags1")] HRESULT CreateFlags1([out, retval] long *pVal); + [propget, id(50), helpstring("property CreateFlags2")] HRESULT CreateFlags2([out, retval] long *pVal); + [propget, id(51), helpstring("property ObjectFlags1")] HRESULT ObjectFlags1([out, retval] long *pVal); + [propget, id(52), helpstring("property ObjectFlags2")] HRESULT ObjectFlags2([out, retval] long *pVal); + [propget, id(53), helpstring("property HasIdData")] HRESULT HasIdData([out, retval] VARIANT_BOOL *pVal); + [propget, id(54), helpstring("property ArmorLevel")] HRESULT ArmorLevel([out, retval] long *pVal); + [propget, id(55), helpstring("property MagicDef")] HRESULT MagicDef([out, retval] long *pVal); + [propget, id(56), helpstring("property Spellcraft")] HRESULT Spellcraft([out, retval] long *pVal); + [propget, id(57), helpstring("property MaximumMana")] HRESULT MaximumMana([out, retval] long *pVal); + [propget, id(58), helpstring("property LoreReq")] HRESULT LoreReq([out, retval] long *pVal); + [propget, id(59), helpstring("property RankReq")] HRESULT RankReq([out, retval] long *pVal); + [propget, id(60), helpstring("property SkillReq")] HRESULT SkillReq([out, retval] long *pVal); + [propget, id(61), helpstring("property WieldReqType")] HRESULT WieldReqType([out, retval] long *pVal); + [propget, id(62), helpstring("property WieldReqId")] HRESULT WieldReqId([out, retval] long *pVal); + [propget, id(63), helpstring("property WieldReq")] HRESULT WieldReq([out, retval] long *pVal); + [propget, id(64), helpstring("property TinkerCount")] HRESULT TinkerCount([out, retval] long *pVal); + [propget, id(65), helpstring("property SkillReqId")] HRESULT SkillReqId([out, retval] long *pVal); + [propget, id(66), helpstring("property SpecialProps")] HRESULT SpecialProps([out, retval] long *pVal); + [propget, id(67), helpstring("property ManaCMod")] HRESULT ManaCMod([out, retval] float *pVal); + [propget, id(68), helpstring("property SpellCount")] HRESULT SpellCount([out, retval] long *pVal); + [propget, id(69), helpstring("property GetSpell")] HRESULT Spell([in] long index, [out, retval] long *pVal); + [propget, id(70), helpstring("property Inscription")] HRESULT Inscription([out, retval] BSTR *pVal); + [propget, id(71), helpstring("property WeapSpeed")] HRESULT WeapSpeed([out, retval] long *pVal); + [propget, id(72), helpstring("property EquipSkill")] HRESULT EquipSkill([out, retval] long *pVal); + [propget, id(73), helpstring("property DamageType")] HRESULT DamageType([out, retval] long *pVal); + [propget, id(74), helpstring("property MaxDamage")] HRESULT MaxDamage([out, retval] long *pVal); + [propget, id(75), helpstring("property Variance")] HRESULT Variance([out, retval] float *pVal); + [propget, id(76), helpstring("property DefenseBonus")] HRESULT DefenseBonus([out, retval] float *pVal); + [propget, id(77), helpstring("property AttackBonus")] HRESULT AttackBonus([out, retval] float *pVal); + [propget, id(78), helpstring("property Range")] HRESULT Range([out, retval] float *pVal); + [propget, id(79), helpstring("property SlashProt")] HRESULT SlashProt([out, retval] float *pVal); + [propget, id(80), helpstring("property PierceProt")] HRESULT PierceProt([out, retval] float *pVal); + [propget, id(81), helpstring("property BludProt")] HRESULT BludProt([out, retval] float *pVal); + [propget, id(82), helpstring("property ColdProt")] HRESULT ColdProt([out, retval] float *pVal); + [propget, id(83), helpstring("property FireProt")] HRESULT FireProt([out, retval] float *pVal); + [propget, id(84), helpstring("property ElectProt")] HRESULT ElectProt([out, retval] float *pVal); + [propget, id(85), helpstring("property RaceReq")] HRESULT RaceReq([out, retval] BSTR *pVal); + [propget, id(86), helpstring("property DamageBonus")] HRESULT DamageBonus([out, retval] float *pVal); + [propget, id(87), helpstring("property AcidProt")] HRESULT AcidProt([out, retval] float *pVal); + }; + + [ + object, + uuid(6D7556DA-19D1-4be3-BC18-357FEE292649), + dual, + helpstring("IWorldObject2 Interface"), + pointer_default(unique) + ] + interface IWorldObject2 : IUnknown + { + [propget, id(1), helpstring("property Flags")] HRESULT Flags([out, retval] long *pVal); + [propget, id(2), helpstring("property CreateFlags1")] HRESULT CreateFlags1([out, retval] long *pVal); + [propget, id(3), helpstring("property CreateFlags2")] HRESULT CreateFlags2([out, retval] long *pVal); + [propget, id(4), helpstring("property ObjectFlags1")] HRESULT ObjectFlags1([out, retval] long *pVal); + [propget, id(5), helpstring("property ObjectFlags2")] HRESULT ObjectFlags2([out, retval] long *pVal); + }; + + [ + uuid(175F99F1-B937-47C5-846E-CACBB986AFD9), + helpstring("IWorldEvents Interface") + ] + dispinterface IWorldEvents + { + properties: + methods: + [id(1), helpstring("method CreateObject")] HRESULT CreateObject(IWorldObject *pObject); + [id(2), helpstring("method ReleaseObject")] HRESULT ReleaseObject(IWorldObject *pObject); + [id(3), helpstring("method ChangeObject")] HRESULT ChangeObject(IWorldObject *pObject, BSTR Change); + [id(4), helpstring("method MovedObject")] HRESULT MoveObject(IWorldObject *pObject); + [id(5), helpstring("method ReleaseDone")] HRESULT ReleaseDone(); + }; + + [ + object, + uuid(6FC29250-9FB4-4A0C-AF16-329E35DF02F2), + dual, + helpstring("IWorldIterator Interface"), + pointer_default(unique) + ] + interface IWorldIterator : IDispatch + { + [propget, hidden, id(1), helpstring("property Next_Old")] HRESULT Next_Old([out, retval] IWorldObject * *pVal); + [id(2), helpstring("Resets the iterator back to its starting position")] HRESULT Reset(); + [propget, id(3), helpstring("The number of stacks in the iterator")] HRESULT Count([out, retval] long *pVal); + [propget, id(4), helpstring("The next object in the iterator")] HRESULT Next([in, out] IWorldObject **ppObject, [out, retval] VARIANT_BOOL *pVal); + [id(5), helpstring("Removes the last search criteria object from the list")] HRESULT Pop(); + [id(6), helpstring("method ByName")] HRESULT ByName(BSTR strName); + [id(7), helpstring("method ByNameSubstring")] HRESULT ByNameSubstring(BSTR strSubstring); + [id(8), helpstring("method ByType")] HRESULT ByType(enum eObjectType Type); + [id(9), helpstring("method ByAll")] HRESULT ByAll(); + [id(10), helpstring("method ByInventory")] HRESULT ByInventory(); + [id(11), helpstring("method ByContainer")] HRESULT ByContainer(long nContainer); + [propget, id(12), helpstring("The number of items in this iterator")] HRESULT Quantity([out, retval] long *pVal); + [id(13), helpstring("method ByOwner")] HRESULT ByOwner(long nOwner); + [id(14), helpstring("method ByLandscape")] HRESULT ByLandscape(); + }; + + [ + uuid(53092D1B-F0B0-46FF-BF11-8F031EC9B137), + helpstring("World Class") + ] + coclass World + { + [default] interface IWorld; + [default, source] dispinterface IWorldEvents; + }; + + [ + uuid(50A7E9EC-AB12-4484-9C28-C2A39274A636), + helpstring("WorldObject Class") + ] + coclass WorldObject + { + [default] interface IWorldObject; + }; + + [ + uuid(A34E27C6-0403-4027-908D-BABF23919E83), + helpstring("WorldObject2 Class") + ] + coclass WorldObject2 + { + [default] interface IWorldObject2; + }; + + [ + uuid(2681B113-294E-4ABF-B543-624194846BE1), + helpstring("WorldIterator Class") + ] + coclass WorldIterator + { + [default] interface IWorldIterator; + }; + + [ + uuid(B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4), + helpstring("IdentifyQueue Class") + ] + coclass IdentifyQueue + { + [default] interface IIdentifyQueue; + }; +}; + diff --git a/Native/DecalFilters/DecalFilters.rc b/Native/DecalFilters/DecalFilters.rc new file mode 100644 index 0000000..947e4ed --- /dev/null +++ b/Native/DecalFilters/DecalFilters.rc @@ -0,0 +1,146 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""DecalFilters.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "DecalFilters gives plug-in developers interfaces for monitoring client/server messages" + VALUE "FileDescription", "DecalFilters Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "DecalFilters" + VALUE "LegalCopyright", "Copyright 2001" + VALUE "OriginalFilename", "DecalFilters.DLL" + VALUE "ProductName", "DecalFilters Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_WORLD REGISTRY "World.rgs" +IDR_WORLDOBJECT REGISTRY "WorldObject.rgs" +IDR_WORLDITERATOR REGISTRY "WorldIterator.rgs" +IDR_IDENTIFYQUEUE REGISTRY "IdentifyQueue.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "DecalFilters" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_ECHOFILTER REGISTRY "EchoFilter.rgs" +IDR_CHARACTERSTATS REGISTRY "CharacterStats.rgs" +IDR_PREFILTER REGISTRY "Prefilter.rgs" +IDR_ECHOFILTER2 REGISTRY "EchoFilter2.rgs" +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "DecalFilters.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/DecalFilters/DecalFilters.vcproj b/Native/DecalFilters/DecalFilters.vcproj new file mode 100644 index 0000000..ea1122b --- /dev/null +++ b/Native/DecalFilters/DecalFilters.vcproj @@ -0,0 +1,597 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/DecalFilters/DecalFiltersCP.h b/Native/DecalFilters/DecalFiltersCP.h new file mode 100644 index 0000000..de5a422 --- /dev/null +++ b/Native/DecalFilters/DecalFiltersCP.h @@ -0,0 +1,347 @@ +#ifndef _DECALFILTERSCP_H_ +#define _DECALFILTERSCP_H_ + + + +template +class CProxyIEchoSink2 : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_EchoServer(IMessage2 * pMsg) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = pMsg; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VOID Fire_EchoClient(IMessage2 * pMsg) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = pMsg; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } +}; + +template +class CProxyIEchoSink : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_EchoMessage(IMessage * pMsg) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = pMsg; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } +}; + + +template +class CProxyIPrefilterEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Event(LONG ID, IMessage * Message) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[1] = ID; + pvars[0] = Message; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } +}; + + + + + + + +template +class CProxyIWorldEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_CreateObject(IWorldObject * pObject) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pObject; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + + HRESULT Fire_ReleaseObject(IWorldObject * pObject) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pObject; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + + HRESULT Fire_MovedObject(IWorldObject * pObject) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pObject; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x4, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + + HRESULT Fire_ChangeObject(IWorldObject * pObject, BSTR Change) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = pObject; + pvars[0] = Change; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + } + + HRESULT Fire_ReleaseDone() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x5, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + + return varResult.scode; + } + +}; + +template +class CProxyICharacterStatsEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Login(LONG character) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = character; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_Spellbook_Add(LONG SpellAdded) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = SpellAdded; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_Spellbook_Delete(LONG SpellDeleted) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = SpellDeleted; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } +}; +#endif diff --git a/Native/DecalFilters/DecalFiltersps.def b/Native/DecalFilters/DecalFiltersps.def new file mode 100644 index 0000000..f0ced3b --- /dev/null +++ b/Native/DecalFilters/DecalFiltersps.def @@ -0,0 +1,11 @@ + +LIBRARY "DecalFiltersPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/DecalFilters/DecalFiltersps.mk b/Native/DecalFilters/DecalFiltersps.mk new file mode 100644 index 0000000..d9f1a12 --- /dev/null +++ b/Native/DecalFilters/DecalFiltersps.mk @@ -0,0 +1,16 @@ + +DecalFiltersps.dll: dlldata.obj DecalFilters_p.obj DecalFilters_i.obj + link /dll /out:DecalFiltersps.dll /def:DecalFiltersps.def /entry:DllMain dlldata.obj DecalFilters_p.obj DecalFilters_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del DecalFiltersps.dll + @del DecalFiltersps.lib + @del DecalFiltersps.exp + @del dlldata.obj + @del DecalFilters_p.obj + @del DecalFilters_i.obj diff --git a/Native/DecalFilters/EchoFilter.cpp b/Native/DecalFilters/EchoFilter.cpp new file mode 100644 index 0000000..65b8ac0 --- /dev/null +++ b/Native/DecalFilters/EchoFilter.cpp @@ -0,0 +1,15 @@ +// EchoFilter.cpp : Implementation of cEchoFilter +#include "stdafx.h" +#include "DecalFilters.h" +#include "EchoFilter.h" + +///////////////////////////////////////////////////////////////////////////// +// cEchoFilter + + +STDMETHODIMP cEchoFilter::Dispatch(IMessage *pMsg) +{ + Fire_EchoMessage( pMsg ); + + return S_OK; +} diff --git a/Native/DecalFilters/EchoFilter.h b/Native/DecalFilters/EchoFilter.h new file mode 100644 index 0000000..18394c5 --- /dev/null +++ b/Native/DecalFilters/EchoFilter.h @@ -0,0 +1,47 @@ +// EchoFilter.h : Declaration of the cEchoFilter + +#ifndef __ECHOFILTER_H_ +#define __ECHOFILTER_H_ + +#include "resource.h" // main symbols + +#include "DecalFiltersCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cEchoFilter +class ATL_NO_VTABLE cEchoFilter : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl< IEcho, &IID_IEcho, &LIBID_DecalFilters >, + public IDispatchImpl< INetworkFilter, &IID_INetworkFilter, &LIBID_DecalNet >, + public IProvideClassInfo2Impl< &CLSID_EchoFilter, &DIID_IEchoSink, &LIBID_DecalFilters >, + public IConnectionPointContainerImpl, + public CProxyIEchoSink< cEchoFilter > +{ +public: + cEchoFilter() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_ECHOFILTER) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cEchoFilter) + COM_INTERFACE_ENTRY(INetworkFilter) + COM_INTERFACE_ENTRY(IEcho) + COM_INTERFACE_ENTRY2(IDispatch,INetworkFilter) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cEchoFilter) +CONNECTION_POINT_ENTRY(DIID_IEchoSink) +END_CONNECTION_POINT_MAP() + +// IEchoFilter +public: + STDMETHOD(Dispatch)(IMessage *); +}; + +#endif //__ECHOFILTER_H_ diff --git a/Native/DecalFilters/EchoFilter.rgs b/Native/DecalFilters/EchoFilter.rgs new file mode 100644 index 0000000..1089e05 --- /dev/null +++ b/Native/DecalFilters/EchoFilter.rgs @@ -0,0 +1,39 @@ +HKCR +{ + DecalFilters.EchoFilter.1 = s 'DecalFilters EchoFilter' + { + CLSID = s '{8C2FA400-315D-41DE-B063-D6EF04F12E1F}' + } + DecalFilters.EchoFilter = s 'DecalFilters EchoFilter' + { + CLSID = s '{8C2FA400-315D-41DE-B063-D6EF04F12E1F}' + CurVer = s 'DecalFilters.EchoFilter.1' + } + NoRemove CLSID + { + ForceRemove {8C2FA400-315D-41DE-B063-D6EF04F12E1F} = s 'DecalFilters EchoFilter' + { + ProgID = s 'DecalFilters.EchoFilter.1' + VersionIndependentProgID = s 'DecalFilters.EchoFilter' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove NetworkFilters + { + val {8C2FA400-315D-41DE-B063-D6EF04F12E1F} = d '1' + } + } + } +} diff --git a/Native/DecalFilters/EchoFilter2.cpp b/Native/DecalFilters/EchoFilter2.cpp new file mode 100644 index 0000000..1f18b95 --- /dev/null +++ b/Native/DecalFilters/EchoFilter2.cpp @@ -0,0 +1,22 @@ +// EchoFilter.cpp : Implementation of cEchoFilter +#include "stdafx.h" +#include "DecalFilters.h" +#include "EchoFilter2.h" + +///////////////////////////////////////////////////////////////////////////// +// cEchoFilter + + +STDMETHODIMP cEchoFilter2::DispatchServer(IMessage2 *pMsg) +{ + Fire_EchoServer( pMsg ); + + return S_OK; +} + +STDMETHODIMP cEchoFilter2::DispatchClient(IMessage2 *pMsg) +{ + Fire_EchoClient( pMsg ); + + return S_OK; +} diff --git a/Native/DecalFilters/EchoFilter2.h b/Native/DecalFilters/EchoFilter2.h new file mode 100644 index 0000000..0f38c90 --- /dev/null +++ b/Native/DecalFilters/EchoFilter2.h @@ -0,0 +1,49 @@ +// EchoFilter.h : Declaration of the cEchoFilter + +#ifndef __ECHOFILTER2_H_ +#define __ECHOFILTER2_H_ + +#include "resource.h" // main symbols + +#include +#include "DecalFiltersCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cEchoFilter +class ATL_NO_VTABLE cEchoFilter2 : + public CComObjectRootEx, + public CComCoClass, + public ISoloNetworkFilterImpl< cEchoFilter2 >, + public IProvideClassInfo2Impl< &CLSID_EchoFilter2, &DIID_IEchoSink2, &LIBID_DecalFilters >, + public IConnectionPointContainerImpl, + public IDispatchImpl, + public CProxyIEchoSink2< cEchoFilter2 > +{ +public: + cEchoFilter2() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_ECHOFILTER2) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cEchoFilter2) + COM_INTERFACE_ENTRY(IEcho2) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(INetworkFilter2) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cEchoFilter2) +CONNECTION_POINT_ENTRY(DIID_IEchoSink2) +END_CONNECTION_POINT_MAP() + +// IEchoFilter2 +public: + STDMETHOD(DispatchServer)(IMessage2 *); + STDMETHOD(DispatchClient)(IMessage2 *); +}; + +#endif //__ECHOFILTER2_H_ diff --git a/Native/DecalFilters/EchoFilter2.rgs b/Native/DecalFilters/EchoFilter2.rgs new file mode 100644 index 0000000..0ca7bdf --- /dev/null +++ b/Native/DecalFilters/EchoFilter2.rgs @@ -0,0 +1,42 @@ +HKCR +{ + DecalFilters.EchoFilter2.1 = s 'DecalFilters EchoFilter' + { + CLSID = s '{34239EAD-6317-4c40-A405-193BA5232DD8}' + } + DecalFilters.EchoFilter2 = s 'DecalFilters EchoFilter' + { + CLSID = s '{34239EAD-6317-4c40-A405-193BA5232DD8}' + CurVer = s 'DecalFilters.EchoFilter2.1' + } + NoRemove CLSID + { + ForceRemove {34239EAD-6317-4c40-A405-193BA5232DD8} = s 'DecalFilters EchoFilter2' + { + ProgID = s 'DecalFilters.EchoFilter2.1' + VersionIndependentProgID = s 'DecalFilters.EchoFilter2' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove NetworkFilters + { + ForceRemove {34239EAD-6317-4c40-A405-193BA5232DD8} = s 'Echo Filter 2' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/DecalFilters/Enchantment.cpp b/Native/DecalFilters/Enchantment.cpp new file mode 100644 index 0000000..38501e2 --- /dev/null +++ b/Native/DecalFilters/Enchantment.cpp @@ -0,0 +1,106 @@ +// Enchantment.cpp : Implementation of CDecalFiltersApp and DLL registration. + +#include "stdafx.h" +#include "DecalFilters.h" +#include "Enchantment.h" + +///////////////////////////////////////////////////////////////////////////// +// + +STDMETHODIMP Enchantment::get_SpellID(long *pVal) +{ + *pVal = SpellID; + + return S_OK; +} + +STDMETHODIMP Enchantment::put_SpellID(long newVal) +{ + SpellID = newVal; + + return S_OK; +} + +STDMETHODIMP Enchantment::get_Layer(long *pVal) +{ + *pVal = Layer; + + return S_OK; +} + +STDMETHODIMP Enchantment::put_Layer(long newVal) +{ + Layer = newVal; + + return S_OK; +} + +STDMETHODIMP Enchantment::get_TimeRemaining(long *pVal) +{ + *pVal = SecondsLeft; + + return S_OK; +} + +STDMETHODIMP Enchantment::put_TimeRemaining(long newVal) +{ + SecondsLeft = newVal; + + return S_OK; +} + +STDMETHODIMP Enchantment::get_Affected(long *pVal) +{ + *pVal = Affected; + + return S_OK; +} + +STDMETHODIMP Enchantment::put_Affected(long newVal) +{ + Affected = newVal; + + return S_OK; +} + +STDMETHODIMP Enchantment::get_AffectedMask(long *pVal) +{ + *pVal = AffectMask; + + return S_OK; +} + +STDMETHODIMP Enchantment::put_AffectedMask(long newVal) +{ + AffectMask = newVal; + + return S_OK; +} + +STDMETHODIMP Enchantment::get_Family(long *pVal) +{ + *pVal = Family; + + return S_OK; +} + +STDMETHODIMP Enchantment::put_Family(long newVal) +{ + Family = newVal; + + return S_OK; +} + +STDMETHODIMP Enchantment::get_Adjustment(double *pVal) +{ + *pVal = Adjustment; + + return S_OK; +} + +STDMETHODIMP Enchantment::put_Adjustment(double newVal) +{ + Adjustment = newVal; + + return S_OK; +} diff --git a/Native/DecalFilters/Enchantment.h b/Native/DecalFilters/Enchantment.h new file mode 100644 index 0000000..53b71e4 --- /dev/null +++ b/Native/DecalFilters/Enchantment.h @@ -0,0 +1,56 @@ +// Enchantment.h: Definition of the Enchantment class +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_ENCHANTMENT_H__C2D64F56_5FD0_43CD_9E1D_C9981D1F98C5__INCLUDED_) +#define AFX_ENCHANTMENT_H__C2D64F56_5FD0_43CD_9E1D_C9981D1F98C5__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" // main symbols +#include "CharacterStats.h" + +///////////////////////////////////////////////////////////////////////////// +// Enchantment + +class Enchantment : + public IDispatchImpl, + public CComObjectRoot, + public CComCoClass +{ +public: + Enchantment() {} + +BEGIN_COM_MAP(Enchantment) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IEnchantment) +END_COM_MAP() + +//DECLARE_REGISTRY_RESOURCEID(IDR_Enchantment) + +private: + long SpellID, Layer, SecondsLeft, Affected, AffectMask, Family; + double Adjustment; + + +// IEnchantment +public: + STDMETHOD(get_Adjustment)(/*[out, retval]*/ double *pVal); + STDMETHOD(put_Adjustment)(/*[in]*/ double newVal); + STDMETHOD(get_Family)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Family)(/*[in]*/ long newVal); + STDMETHOD(get_AffectedMask)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_AffectedMask)(/*[in]*/ long newVal); + STDMETHOD(get_Affected)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Affected)(/*[in]*/ long newVal); + STDMETHOD(get_TimeRemaining)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_TimeRemaining)(/*[in]*/ long newVal); + STDMETHOD(get_Layer)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Layer)(/*[in]*/ long newVal); + STDMETHOD(get_SpellID)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_SpellID)(/*[in]*/ long newVal); +}; + +#endif // !defined(AFX_ENCHANTMENT_H__C2D64F56_5FD0_43CD_9E1D_C9981D1F98C5__INCLUDED_) diff --git a/Native/DecalFilters/Enchantment.rgs b/Native/DecalFilters/Enchantment.rgs new file mode 100644 index 0000000..b1371e3 --- /dev/null +++ b/Native/DecalFilters/Enchantment.rgs @@ -0,0 +1,23 @@ +HKCR +{ + DecalFilters.Enchantment.1 = s 'Enchantment Class' + { + CLSID = s '{5DCF056E-B7F5-4AEB-93A0-628617B28488}' + } + DecalFilters.Enchantment = s 'Enchantment Class' + { + CLSID = s '{5DCF056E-B7F5-4AEB-93A0-628617B28488}' + } + NoRemove CLSID + { + ForceRemove {5DCF056E-B7F5-4AEB-93A0-628617B28488} = s 'Enchantment Class' + { + ProgID = s 'DecalFilters.Enchantment.1' + VersionIndependentProgID = s 'DecalFilters.Enchantment' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Native/DecalFilters/FilterImpl.h b/Native/DecalFilters/FilterImpl.h new file mode 100644 index 0000000..39ebd03 --- /dev/null +++ b/Native/DecalFilters/FilterImpl.h @@ -0,0 +1,80 @@ +// FilterImpl.h +// Declaration of template classes to help network filters + +#ifndef __FILTERIMPL_H +#define __FILTERIMPL_H + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl, const IID *pIID > +class IFilterEventsImpl +: public IDispEventImpl< nID, cImpl, pIID, &LIBID_DecalFilters, 1, 0 > +{ +public: + HRESULT advise( IUnknown *pUnk ) + { + return DispEventAdvise( pUnk ); + } + + HRESULT unadvise( IUnknown *pUnk ) + { + return DispEventUnadvise( pUnk ); + } +}; + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IWorldEventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_IWorldEvents > +{ +}; + +#define DISPID_CREATE_OBJECT 1 +#define DISPID_RELEASE_OBJECT 2 +#define DISPID_CHANGE_OBJECT 3 +#define DISPID_MOVED_OBJECT 4 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IEchoEventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_IEchoSink > +{ +}; + +#define DISPID_ECHO_MESSAGE 1 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IEcho2EventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_IEchoSink2 > +{ +}; + +#define DISPID_ECHO_SERVER 1 +#define DISPID_ECHO_CLIENT 2 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class ICharacterStatsEventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_ICharacterStatsEvents > +{ +}; + +#define DISPID_LOGIN 1 +#define DISPID_SPELLBOOK_ADD 2 +#define DISPID_SPELLBOOK_DELETE 3 + +#endif diff --git a/Native/DecalFilters/IdentifyQueue.cpp b/Native/DecalFilters/IdentifyQueue.cpp new file mode 100644 index 0000000..dc1d7af --- /dev/null +++ b/Native/DecalFilters/IdentifyQueue.cpp @@ -0,0 +1,212 @@ +// IdentifyQueue.cpp : Implementation of CIdentifyQueue + +#include "stdafx.h" +#include "IdentifyQueue.h" + +// Timeout in millisec to re-request ID +#define TIMEOUT 700 + + + +enum AcMessages +{ + msgGameEvent = 0xF7B0, + msgUnknown = 0 +}; + +enum AcGameEvents +{ + gevIDItem = 0x00C9, + gevUnknown = 0 +}; + +// CIdentifyQueue +HRESULT CIdentifyQueue::onInitialize() +{ + if( m_pService->get_Decal( &m_pDecal ) == S_OK ) + { + if( m_pDecal->get_Hooks( &m_pHooks ) == S_OK ) + { + m_pHooks->SetIDFilter( this ); + + long lRequestIDMemloc; + if( m_pHooks->QueryMemLoc( _bstr_t( "ItemEventAppraise" ), &lRequestIDMemloc ) == S_OK ) + { + if( lRequestIDMemloc != 0 ) + { + m_pfRequestFunc = reinterpret_cast< RequestPtr >( lRequestIDMemloc ); + return S_OK; + } + } + } + + } + + m_pfRequestFunc = NULL; + m_pService.Release(); + return E_FAIL; +} + +HRESULT CIdentifyQueue::onTerminate() +{ + m_pDecal.Release(); + m_pHooks.Release(); + + m_pfRequestFunc = NULL; + + return S_OK; +} + +STDMETHODIMP CIdentifyQueue::DispatchServer( IMessage2 *pMsg ) +{ + long lType; + pMsg->get_Type( &lType ); + + CComPtr< IMessageIterator > pMembers; + pMsg->get_Begin( &pMembers ); + + switch( lType ) + { + case msgGameEvent: MsgGameEvent( pMembers ); break; + } + + if( m_Queue.empty() ) + return S_OK; + + // Check for timeout... + if( m_bWaiting ) + { + if( abs( m_Queue[0]->lTime - timeGetTime() ) > TIMEOUT ) + { + if( ++m_lAttempts >= 3 ) + { + m_lAttempts = 0; + m_Queue.erase( m_Queue.begin() ); + m_bWaiting = false; + Request(); + } + + else + { + m_Queue[0]->lTime = timeGetTime(); + m_bWaiting = false; + Request(); + } + } + } + + return S_OK; +} + +STDMETHODIMP CIdentifyQueue::AddToQueue( long lObjectID ) +{ + if( lObjectID == 0 ) + return S_OK; + + if( !m_Queue.empty() ) + { + for( IDContainer::iterator pDeque = m_Queue.begin(); pDeque != m_Queue.end(); ++pDeque ) + { + if( (*pDeque)->lObjectID == lObjectID ) + return S_OK; + } + } + + IDStruct *QueueObj = new IDStruct(); + QueueObj->lObjectID = lObjectID; + QueueObj->lTime = timeGetTime(); + m_Queue.push_back( QueueObj ); + + if( !m_bWaiting ) + Request(); + + return S_OK; +} + +STDMETHODIMP CIdentifyQueue::ShortcircuitID( long lObjectID ) +{ + m_lLastManualAttempt = lObjectID; + + if( !m_Queue.empty() ) + { + for( IDContainer::iterator pDeque = m_Queue.begin(); pDeque != m_Queue.end(); ++pDeque ) + { + if ( (*pDeque)->lObjectID == lObjectID ) + { + m_Queue.erase( pDeque ); + break; + } + } + } + + IDStruct *QueueObj = new IDStruct(); + QueueObj->lObjectID = lObjectID; + QueueObj->lTime = timeGetTime(); + m_Queue.push_front( QueueObj ); + + if( !m_bWaiting ) + Request(); + + return S_OK; +} + +void CIdentifyQueue::MsgGameEvent( IMessageIterator *pMembers ) +{ + long lEvent; + pMembers->get_NextInt( _bstr_t( "event" ), &lEvent ); + + switch( lEvent ) + { + case gevIDItem: MsgIDItem( pMembers ); break; + } +} + +void CIdentifyQueue::MsgIDItem( IMessageIterator *pMembers ) +{ + if( m_Queue.empty() ) + return; + + long lObjectID; + pMembers->get_NextInt( _bstr_t( "object" ), &lObjectID ); + + + for( IDContainer::iterator pDeque = m_Queue.begin(); pDeque != m_Queue.end(); pDeque++ ) + { + if ( (*pDeque)->lObjectID == lObjectID ) + { + m_lAttempts = 0; + pDeque = m_Queue.erase( pDeque ); + break; + } + } + + if( m_bWaiting ) + { + m_bWaiting = false; + Request(); + } +} + +void CIdentifyQueue::Request() +{ + if( !m_bWaiting ) + { + if( m_Queue.empty() ) + { + m_pfRequestFunc( 0 ); + return; + } + + IDStruct *pQueueBegin = *m_Queue.begin(); + + m_pfRequestFunc( pQueueBegin->lObjectID ); + m_bWaiting = true; + + if( pQueueBegin->lObjectID == 0 ) + { + m_bWaiting = false; + m_Queue.erase( m_Queue.begin() ); + Request(); + } + } +} diff --git a/Native/DecalFilters/IdentifyQueue.h b/Native/DecalFilters/IdentifyQueue.h new file mode 100644 index 0000000..b5ad90b --- /dev/null +++ b/Native/DecalFilters/IdentifyQueue.h @@ -0,0 +1,80 @@ +// IdentifyQueue.h : Declaration of the CIdentifyQueue + +#ifndef __IDQUEUE_H_ +#define __IDQUEUE_H_ + +#pragma once +#include "resource.h" // main symbols + +#include "DecalFilters.h" +#include "DecalNetImpl.h" +#include "..\include\decal.h" +#include + +typedef void(*RequestPtr)( long ); + +struct IDStruct +{ + long lObjectID; + long lTime; +}; + +// CIdentifyQueue + +class ATL_NO_VTABLE CIdentifyQueue : + public IKitchenSink, + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl, + public INetworkFilterImpl +{ +public: + CIdentifyQueue() + { + m_bWaiting = false; + m_lAttempts = 0; + m_lLastManualAttempt = 0; + } + +DECLARE_REGISTRY_RESOURCEID(IDR_IDENTIFYQUEUE) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CIdentifyQueue) + COM_INTERFACE_ENTRY(IIdentifyQueue) + COM_INTERFACE_ENTRY(INetworkFilter2) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +private: + CComPtr< IDecal > m_pDecal; + CComPtr< IACHooks > m_pHooks; + + typedef std::deque< IDStruct * > IDContainer; + + IDContainer m_Queue; + bool m_bWaiting; + long m_lAttempts; + long m_lLastManualAttempt; + + // Id Func pointer + RequestPtr m_pfRequestFunc; + + void MsgGameEvent( IMessageIterator *pMembers ); + void MsgIDItem( IMessageIterator *pMembers ); + + void Request(); + +public: + // INetworkFilterImpl + HRESULT onInitialize(); + HRESULT onTerminate(); + + // INetworkFilter + STDMETHOD(DispatchServer)( IMessage2 *pMsg ); + + // IKitchenSink + STDMETHOD(AddToQueue)( long lObjectID ); + STDMETHOD(ShortcircuitID)( long lObjectID ); +}; + +#endif //__IDQUEUE_H_ \ No newline at end of file diff --git a/Native/DecalFilters/IdentifyQueue.rgs b/Native/DecalFilters/IdentifyQueue.rgs new file mode 100644 index 0000000..9fc78a3 --- /dev/null +++ b/Native/DecalFilters/IdentifyQueue.rgs @@ -0,0 +1,44 @@ +HKCR +{ + DecalFilters.IdentifyQueue.1 = s 'IdentifyQueue Class' + { + CLSID = s '{B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4}' + } + DecalFilters.IdentifyQueue = s 'IdentifyQueue Class' + { + CLSID = s '{B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4}' + CurVer = s 'DecalFilters.IdentifyQueue.1' + } + NoRemove CLSID + { + ForceRemove {B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4} = s 'IdentifyQueue Class' + { + ProgID = s 'DecalFilters.IdentifyQueue.1' + VersionIndependentProgID = s 'DecalFilters.IdentifyQueue' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} + + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove NetworkFilters + { + ForceRemove {B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4} = s 'Identify Queue Filter' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/DecalFilters/Prefilter.cpp b/Native/DecalFilters/Prefilter.cpp new file mode 100644 index 0000000..5229e6e --- /dev/null +++ b/Native/DecalFilters/Prefilter.cpp @@ -0,0 +1,438 @@ +// Prefilter.cpp : Implementation of cPrefilter +#include "stdafx.h" +#include "DecalFilters.h" +#include "Prefilter.h" + +///////////////////////////////////////////////////////////////////////////// +// cPrefilter + +class cFieldRule +: public cPrefilter::cFilterRule +{ +public: + _variant_t m_strField; + bool m_bReset; + + static _bstr_t _strField, + _strReset; + + cFieldRule() + : m_bReset( false ) + { + } + + bool loadField( MSXML::IXMLDOMElementPtr &pElement ) + { + m_strField = pElement->getAttribute( _strField ); + + _variant_t vReset = pElement->getAttribute( _strReset ); + if( vReset.vt != VT_NULL ) + m_bReset = vReset; + +#ifdef _DEBUG + if( m_bReset ) + _ASSERTE( m_strField.vt == VT_BSTR ); +#endif + + return true; + } + + void get( _variant_t &vValue, IMessageIterator *pMsg ) + { + if( m_bReset ) + pMsg->Reset(); + + if( m_strField.vt == VT_BSTR ) + pMsg->get_Next( m_strField, &vValue ); + else + pMsg->get_Current( &vValue ); + } +}; + +class cEndRule +: public cPrefilter::cFilterRule +{ +public: + virtual bool test( IMessageIterator * ) + { + return true; + } +}; + +_bstr_t cFieldRule::_strField( _T( "field" ) ); +_bstr_t cFieldRule::_strReset( _T( "reset" ) ); + +class cTestRule +: public cFieldRule +{ +public: + virtual bool test( IMessageIterator *pMsg ) + { + _variant_t vValue; + + get( vValue, pMsg ); + + return ( vValue.vt != VT_NULL ); + } +}; + +class cEqualsRule +: public cFieldRule +{ +public: + _variant_t m_vValue; + + virtual bool test( IMessageIterator *pMsg ) + { + _variant_t vValue; + + get( vValue, pMsg ); + + if( vValue.vt == VT_NULL || m_vValue.vt == VT_NULL ) + // Null values are never equal, use cTestRule + return false; + + if( vValue.vt != m_vValue.vt ) + { + // Attempt to convert them to the same type - this will typically happen + // the first time the rule is invoked. This will speed up comparisons + // in the future + HRESULT hRes = ::VariantChangeType( &m_vValue, &m_vValue, 0, vValue.vt ); + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + + // Could not convert the value - clear it so this rule becomes, disabled + ::VariantClear( &m_vValue ); + m_vValue.vt = VT_NULL; + + return false; + } + } + + // Compare the values + return( ::VarCmp( &vValue, &m_vValue, LOCALE_USER_DEFAULT, 0 ) == VARCMP_EQ ); + } +}; + +class cContainsRule +: public cFieldRule +{ +public: + _bstr_t m_strValue; + + virtual bool test( IMessageIterator *pMsg ) + { + _variant_t vValue; + + get( vValue, pMsg ); + + if( vValue.vt != VT_BSTR ) + // Null values are never equal, use cTestRule + return false; + + // Use the std::algorithm search + LPOLESTR szValueBegin = vValue.bstrVal, + szValueEnd = vValue.bstrVal + ::SysStringLen( vValue.bstrVal ), + szSearchBegin = m_strValue, + szSearchEnd = szSearchBegin + m_strValue.length(); + + LPOLESTR szFound = std::search( szValueBegin, szValueEnd, szSearchBegin, szSearchEnd ); + return( szFound != szValueEnd ); + } +}; + +class cMaskRule +: public cFieldRule +{ +public: + long m_nValue; + + virtual bool test( IMessageIterator *pMsg ) + { + long nValue; + + // Custom get + HRESULT hRes = pMsg->get_NextInt( m_strField.bstrVal, &nValue ); + if( FAILED( hRes ) ) + return false; + + return !!( nValue & m_nValue ); + } +}; + +bool cPrefilter::testRules( cFilterRule *pRule, IMessageIterator *pMsg ) +{ + if( !pRule->test( pMsg ) ) + return false; + + // If there is a fire ID, fire it now + if( pRule->m_nFire != cFilterRule::eFireChildren ) + { + CComPtr< IMessage > pMsgObj; + pMsg->get_Message( &pMsgObj ); + Fire_Event( pRule->m_nFire, pMsgObj ); + return true; + } + + // If it has no children ... carry on + if( pRule->m_childRules.empty() ) + return true; + + // Test our children + for( cFilterRule::cFilterRuleList::iterator i = pRule->m_childRules.begin(); i != pRule->m_childRules.end(); ++ i ) + { + if( testRules( i->get(), pMsg ) ) + return true; + } + + return false; +} + +cPrefilter::cFilterRule *cPrefilter::loadRule( MSXML::IXMLDOMElementPtr &pElement ) +{ + USES_CONVERSION; + + // Load the current rule, first figure out the type + static _bstr_t _strMessage( _T( "message" ) ), + _strFire( _T( "fire" ) ), + _strTest( _T( "test" ) ), + _strEqual( _T( "equal" ) ), + _strContain( _T( "contains" ) ), + _strMask( _T( "mask" ) ), + _strField( _T( "field" ) ), + _strNext( _T( "next" ) ), + _strValue( _T( "value" ) ), + _strEnd( _T( "end" ) ); + + try + { + _bstr_t strElement = pElement->tagName; + + VSBridge::auto_ptr< cFilterRule > pFilter; + + if( strElement == _strMessage || + strElement == _strFire ) + { + pFilter = VSBridge::auto_ptr< cFilterRule >( new cFilterRule ); + } + else if( strElement == _strTest ) + { + cTestRule *pRule = new cTestRule; + pFilter = VSBridge::auto_ptr< cFilterRule >( pRule ); + + if( !pRule->loadField( pElement ) ) + return NULL; + } + else if( strElement == _strEqual ) + { + cEqualsRule *pRule = new cEqualsRule; + pFilter = VSBridge::auto_ptr< cFilterRule >( pRule ); + + if( !pRule->loadField( pElement ) ) + return NULL; + + pRule->m_vValue = pElement->getAttribute( _strValue ); + if( pRule->m_vValue.vt == VT_NULL ) + { + // Missing required field + _ASSERT( FALSE ); + return false; + } + } + else if( strElement == _strContain ) + { + cContainsRule *pRule = new cContainsRule; + pFilter = VSBridge::auto_ptr< cFilterRule >( pRule ); + + if( !pRule->loadField( pElement ) ) + return NULL; + + _variant_t vValue = pElement->getAttribute( _strValue ); + if( vValue.vt != VT_BSTR ) + { + // Missing required field or incorrect type + _ASSERT( FALSE ); + return false; + } + + pRule->m_strValue = vValue; + } + else if( strElement == _strMask ) + { + cMaskRule *pRule = new cMaskRule; + pFilter = VSBridge::auto_ptr< cFilterRule >( pRule ); + + if( !pRule->loadField( pElement ) ) + return NULL; + + _variant_t vValue = pElement->getAttribute( _strValue ); + if( vValue.vt == VT_NULL ) + { + // Missing required field + _ASSERT( FALSE ); + return false; + } + + // Attempt to convert the value from hex + if( ::_stscanf( OLE2T( vValue.bstrVal ), _T( "%X" ), &pRule->m_nValue ) != 1 ) + { + _ASSERT( FALSE ); + return NULL; + } + } + else if( strElement == _strEnd ) + pFilter = VSBridge::auto_ptr< cFilterRule >( new cEndRule ); + else + return NULL; + + _variant_t vFire = pElement->getAttribute( _strFire ); + + // Convert the fire type, then carry on + if( vFire.vt != VT_NULL ) + pFilter->m_nFire = vFire; + else + { + // Select all children - all element children + MSXML::IXMLDOMNodeListPtr pRules = pElement->selectNodes( _T( "*" ) ); + for( MSXML::IXMLDOMElementPtr pChildRule = pRules->nextNode(); pChildRule; pChildRule = pRules->nextNode() ) + { + VSBridge::auto_ptr< cFilterRule > pChildFilter( loadRule( pChildRule ) ); + if( pChildFilter.get() == NULL ) + continue; + + // Load the children + pFilter->m_childRules.push_back( pChildFilter ); + } + } + + return pFilter.release(); + } + catch( _com_error &e ) + { + HRESULT hRes = e.Error(); + _ASSERTE( FALSE ); + } + + return NULL; +} + +STDMETHODIMP cPrefilter::Initialize(INetService *pService) +{ + USES_CONVERSION; + + CComPtr< IDecal > pDecal; + pService->get_Decal( &pDecal ); + + CComBSTR strMappedFile; + HRESULT hRes = pDecal->MapPath( m_strFile, &strMappedFile ); + + if( FAILED( hRes ) ) + // Bad token in the filename + return hRes; + + MSXML::IXMLDOMDocumentPtr pFilter; + hRes = ::CoCreateInstance( __uuidof( MSXML::DOMDocument ), NULL, CLSCTX_INPROC_SERVER, + __uuidof( MSXML::IXMLDOMDocument ), reinterpret_cast< void ** >( &pFilter ) ); + + if( FAILED( hRes ) ) + return hRes; + + bool bLoad = !!pFilter->load( strMappedFile.m_str ); + + if( !bLoad ) + { + // The document failed to load, get the error info for posterity + MSXML::IXMLDOMParseErrorPtr pErr = pFilter->parseError; + + long nCode = pErr->errorCode; + long nFilePos = pErr->filepos; + long nLine = pErr->line; + long nLinePos = pErr->linepos; + _bstr_t strReason = pErr->reason; + _bstr_t strText = pErr->srcText; + + TCHAR szError[ 1024 ]; + ::_stprintf( szError, _T( "0x%08X (%i, %i): %s" ), + nCode, nLine, nLinePos, OLE2T( strReason ) ); + + /* + long nHWND; + m_pSite->get_HWND( &nHWND ); + */ + + ::MessageBox( NULL, szError, _T( "XML Parse Error" ), MB_ICONERROR | MB_OK ); + + // Give the user a chance to break and look at this lovely info + _ASSERTE( FALSE ); + + return E_FAIL; + } + + // Looking good - now we'll load el'schema + MSXML::IXMLDOMNodeListPtr pMessages = pFilter->selectNodes( _T( "/filter/message" ) ); + for( MSXML::IXMLDOMElementPtr pMessage = pMessages->nextNode(); pMessage; pMessage = pMessages->nextNode() ) + { + _variant_t vMessage = pMessage->getAttribute( _T( "type" ) ), + vFire = pMessage->getAttribute( _T( "fire" ) ); + + if( vMessage.vt != VT_BSTR ) + { + _ASSERT( FALSE ); + continue; + } + + // Attempt to convert the message type + long nMessage; + if( ::_stscanf( OLE2T( vMessage.bstrVal ), _T( "%X" ), &nMessage ) != 1 ) + { + // Invalid message ID format + _ASSERT( FALSE ); + continue; + } + + VSBridge::auto_ptr pMessageRule( loadRule( pMessage ) ); + if( pMessageRule.get() == NULL ) + continue; + + m_messageRules.insert( cMessageRuleList::value_type( nMessage, pMessageRule ) ); + } + + return S_OK; +} + +STDMETHODIMP cPrefilter::DispatchServer( IMessage2 *pMsg ) +{ + long nID; + pMsg->get_Type( &nID ); + + // Look for a type + cMessageRuleList::iterator i_msg = m_messageRules.find( nID ); + if( i_msg == m_messageRules.end() ) + return S_OK; + + CComPtr< IMessageIterator > pMembers; + pMsg->get_Begin( &pMembers ); + testRules( i_msg->second.get(), pMembers ); + + return S_OK; +} + +STDMETHODIMP cPrefilter::CreateInstance( IDecalEnum *pInitData, REFIID iid, LPVOID *pObject ) +{ + CComVariant vFile; + HRESULT hRes = pInitData->get_Property( _bstr_t( "File" ), &vFile ); + + if( FAILED( hRes ) ) + return hRes; + + if( vFile.vt != VT_BSTR ) + { + // The surrogate must know the file + _ASSERT( FALSE ); + return E_FAIL; + } + + m_strFile = vFile.bstrVal; + return static_cast< IDecalSurrogate * >( this )->QueryInterface( iid, pObject ); +} diff --git a/Native/DecalFilters/Prefilter.h b/Native/DecalFilters/Prefilter.h new file mode 100644 index 0000000..751ec21 --- /dev/null +++ b/Native/DecalFilters/Prefilter.h @@ -0,0 +1,123 @@ +// Prefilter.h : Declaration of the cPrefilter + +#ifndef __PREFILTER_H_ +#define __PREFILTER_H_ + +#include "resource.h" // main symbols + +#include +#include +#include +#include "DecalFiltersCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cPrefilter +class ATL_NO_VTABLE cPrefilter : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl, + public ISoloNetworkFilterImpl, + public IDecalSurrogate, + public IProvideClassInfo2Impl<&CLSID_Prefilter, &DIID_IPrefilterEvents, &LIBID_DecalFilters >, + public IDecalFileSurrogateXMLImpl< cPrefilter, &CLSID_Prefilter >, + public CProxyIPrefilterEvents< cPrefilter >, + public IConnectionPointContainerImpl +{ +public: + static LPCTSTR getConfigGroup() + { + return _T( "NetworkFilters" ); + } + + cPrefilter() + { + } + + class cFilterRule + { + public: + long m_nFire; + + enum { eFireChildren = -1 }; + + typedef std::vector< VSBridge::auto_ptr< cFilterRule > > cFilterRuleList; + cFilterRuleList m_childRules; + + cFilterRule() + : m_nFire( eFireChildren ) + { + } + + virtual ~cFilterRule() + { + } + + virtual bool test( IMessageIterator *pMsg ) + { + return true; + } + }; + + typedef std::map< long, VSBridge::auto_ptr< cFilterRule > > cMessageRuleList; + cMessageRuleList m_messageRules; + _bstr_t m_strFile; + + bool testRules( cFilterRule *pRule, IMessageIterator *pMsg ); + cFilterRule *loadRule( MSXML::IXMLDOMElementPtr &pElement ); + +DECLARE_REGISTRY_RESOURCEID(IDR_PREFILTER) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cPrefilter) + COM_INTERFACE_ENTRY(IDecalSurrogate) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY(INetworkFilter2) + COM_INTERFACE_ENTRY(IPrefilter) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IDecalFileSurrogate) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cPrefilter) + CONNECTION_POINT_ENTRY(DIID_IPrefilterEvents) +END_CONNECTION_POINT_MAP() + +// IPrefilter +public: + + // INetworkFilter + STDMETHOD(Initialize)(INetService *pService); + STDMETHOD(DispatchServer)(IMessage2 *pMsg); + + // IDecalSurrogate + STDMETHOD(CreateInstance)(IDecalEnum *pInitData, REFIID iid, LPVOID *pObject); + + // IDecalFileSurrogate + STDMETHOD(get_Extension)( BSTR *pVal ) + { + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = T2BSTR( _T( "apn" ) ); + return S_OK; + } + + STDMETHOD(get_Description)( BSTR *pVal ) + { + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = T2BSTR( _T( "Network Prefilter" ) ); + return S_OK; + } +}; + +#endif //__PREFILTER_H_ diff --git a/Native/DecalFilters/Prefilter.rgs b/Native/DecalFilters/Prefilter.rgs new file mode 100644 index 0000000..90d130e --- /dev/null +++ b/Native/DecalFilters/Prefilter.rgs @@ -0,0 +1,45 @@ +HKCR +{ + DecalFilters.Prefilter.1 = s 'Prefilter Class' + { + CLSID = s '{443D4A68-5422-4E0C-9460-973F8FBDB190}' + } + DecalFilters.Prefilter = s 'Prefilter Class' + { + CLSID = s '{443D4A68-5422-4E0C-9460-973F8FBDB190}' + CurVer = s 'DecalFilters.Prefilter.1' + } + NoRemove CLSID + { + ForceRemove {443D4A68-5422-4E0C-9460-973F8FBDB190} = s 'Prefilter Class' + { + ProgID = s 'DecalFilters.Prefilter.1' + VersionIndependentProgID = s 'DecalFilters.Prefilter' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Surrogates + { + ForceRemove {443D4A68-5422-4E0C-9460-973F8FBDB190} = s 'Prefilter Network Filter Surrogate' + { + val Enabled = d '1' + val Extension = s 'apn' + val Description = s 'Network Prefilter' + } + } + } + } +} diff --git a/Native/DecalFilters/SkillInfo.cpp b/Native/DecalFilters/SkillInfo.cpp new file mode 100644 index 0000000..a45d3af --- /dev/null +++ b/Native/DecalFilters/SkillInfo.cpp @@ -0,0 +1,205 @@ +// SkillInfo.cpp : Implementation of cSkillInfo +#include "stdafx.h" +#include "DecalFilters.h" +#include "SkillInfo.h" + +///////////////////////////////////////////////////////////////////////////// +// cSkillInfo + + +STDMETHODIMP cSkillInfo::get_Name(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + USES_CONVERSION; + *pVal = T2BSTR( m_pSkill->m_szName.c_str() ); + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_ShortName(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + TCHAR *szShortName = new TCHAR[ ::_tcslen( m_pSkill->m_szName.c_str() ) + 1 ]; + for( TCHAR *i_short = szShortName, *i_long = const_cast< char * >( m_pSkill->m_szName.c_str() ); *i_long != _T( '\0' ); ++ i_long ) + { + if( *i_long != _T( ' ' ) ) + *( i_short ++ ) = *i_long; + } + + *i_short = _T( '\0' ); + + USES_CONVERSION; + *pVal = T2BSTR( szShortName ); + + delete[] szShortName; + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Formula(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + TCHAR szBuffer[ 255 ]; + if( m_pSkill->m_nAttribute2 != eAttrNULL ) + { + LPSTR attrA, attrB; + switch(m_pSkill->m_nAttribute1) + { + case eAttrStrength: attrA = "Strength"; break; + case eAttrEndurance: attrA = "Endurance"; break; + case eAttrCoordination: attrA = "Coordination"; break; + case eAttrQuickness: attrA = "Quickness"; break; + case eAttrFocus: attrA = "Focus"; break; + case eAttrSelf: attrA = "Self"; break; + } + switch(m_pSkill->m_nAttribute2) + { + case eAttrStrength: attrB = "Strength"; break; + case eAttrEndurance: attrB = "Endurance"; break; + case eAttrCoordination: attrB = "Coordination"; break; + case eAttrQuickness: attrB = "Quickness"; break; + case eAttrFocus: attrB = "Focus"; break; + case eAttrSelf: attrB = "Self"; break; + } + ::_stprintf( szBuffer, _T( "( %s + %s ) / %i" ), attrA, attrB, m_pSkill->m_nDenominator ); + } + else if( m_pSkill->m_nAttribute1 != eAttrNULL ) + { + LPSTR attrA; + switch(m_pSkill->m_nAttribute1) + { + case eAttrStrength: attrA = "Strength"; break; + case eAttrEndurance: attrA = "Endurance"; break; + case eAttrCoordination: attrA = "Coordination"; break; + case eAttrQuickness: attrA = "Quickness"; break; + case eAttrFocus: attrA = "Focus"; break; + case eAttrSelf: attrA = "Self"; break; + } + ::_stprintf( szBuffer, _T( "( %s ) / %i" ), attrA, m_pSkill->m_nDenominator ); + } + else + ::strcpy( szBuffer, _T( "Unknown" ) ); + + USES_CONVERSION; + *pVal = T2BSTR( szBuffer ); + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Base(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + float fSkill = 0.0; + if( m_pSkill->m_nAttribute1 != eAttrNULL ) + fSkill += m_pStats->PrimStat[ m_pSkill->m_nAttribute1 - 1]; + if( m_pSkill->m_nAttribute2 != eAttrNULL ) + fSkill += m_pStats->PrimStat[ m_pSkill->m_nAttribute2 - 1]; + + fSkill /= static_cast< float >( m_pSkill->m_nDenominator ); + fSkill += 0.5f; + + *pVal = static_cast< long >( fSkill ); + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Current(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + long nBase; + get_Base( &nBase ); + + *pVal = nBase + m_pSkill->m_nOffset + m_pSkill->m_nBonus; + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Increment(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = m_pSkill->m_nOffset; + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Exp(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = m_pSkill->m_nExp; + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Training(enum eTrainingType *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = m_pSkill->m_trained; + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Known(VARIANT_BOOL *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = ( ::_tcscmp( m_pSkill->m_szName.c_str(), _T( "Unknown" ) ) == 0 ) ? VARIANT_FALSE : VARIANT_TRUE; + + return S_OK; +} + +STDMETHODIMP cSkillInfo::get_Bonus(long *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = m_pSkill->m_nBonus; + + return S_OK; +} \ No newline at end of file diff --git a/Native/DecalFilters/SkillInfo.h b/Native/DecalFilters/SkillInfo.h new file mode 100644 index 0000000..c697116 --- /dev/null +++ b/Native/DecalFilters/SkillInfo.h @@ -0,0 +1,48 @@ +// SkillInfo.h : Declaration of the cSkillInfo + +#ifndef __SKILLINFO_H_ +#define __SKILLINFO_H_ + +#include "resource.h" // main symbols + +#include "CharacterStats.h" + +///////////////////////////////////////////////////////////////////////////// +// cSkillInfo +class ATL_NO_VTABLE cSkillInfo : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + cSkillInfo() + { + m_pSkill = &m_pSkillInfo; + } + + cCharacterStats *m_pStats; + cCharacterStats::cSkillInfo m_pSkillInfo; + cCharacterStats::cSkillInfo *m_pSkill; + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cSkillInfo) + COM_INTERFACE_ENTRY(ISkillInfo) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// ISkillInfo +public: + STDMETHOD(get_Known)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_Training)(/*[out, retval]*/ enum eTrainingType *pVal); + STDMETHOD(get_Exp)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Current)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Base)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Increment)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Formula)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_ShortName)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Bonus)(/*[out, retval]*/ long *pVal); +}; + +#endif //__SKILLINFO_H_ diff --git a/Native/DecalFilters/StdAfx.cpp b/Native/DecalFilters/StdAfx.cpp new file mode 100644 index 0000000..cc5fc28 --- /dev/null +++ b/Native/DecalFilters/StdAfx.cpp @@ -0,0 +1,15 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#include +#endif + +#include + +#include "..\Inject\SinkImpl.cpp" +#include "..\Inject\Inject_i.c" diff --git a/Native/DecalFilters/StdAfx.h b/Native/DecalFilters/StdAfx.h new file mode 100644 index 0000000..9584159 --- /dev/null +++ b/Native/DecalFilters/StdAfx.h @@ -0,0 +1,55 @@ +// 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__011A05A6_F7FE_4B67_8D02_926F1F11C8A8__INCLUDED_) +#define AFX_STDAFX_H__011A05A6_F7FE_4B67_8D02_926F1F11C8A8__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _ATL_APARTMENT_THREADED + +#pragma warning(disable:4530) + +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module + +//C Library includes +#include +#include + +#include +extern CComModule _Module; +#include +#include + +#include +#include +#include + +#if _MSC_VER > 1200 // .NET +#include +#endif + +#include +#include +#include +#include +#include "DecalFilters.h" +#include "../Include/VSBridge.h" + +#ifdef _CHECKMEM +#define _ASSERTMEM(a) _ASSERTE(a) +#else +#define _ASSERTMEM(a) +#endif + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + + +#endif // !defined(AFX_STDAFX_H__011A05A6_F7FE_4B67_8D02_926F1F11C8A8__INCLUDED) diff --git a/Native/DecalFilters/World.cpp b/Native/DecalFilters/World.cpp new file mode 100644 index 0000000..7584bc5 --- /dev/null +++ b/Native/DecalFilters/World.cpp @@ -0,0 +1,1929 @@ +// World.cpp : Implementation of cWorld +// Prepping for latest modifications + +#include "stdafx.h" +#include "DecalFilters.h" + +#include "World.h" +#include "WorldObject.h" +#include "WorldIterator.h" + +#include +#include +#include + + +const IID EVTID_AcHooks = { + 0xEB282FE5, 0x7170, 0x4a37, {0xA2, 0x6E, 0x92, 0xAF, 0x36, 0x38, 0x5D, 0x2C}} ; + +const IID LIBID_Decal = { + 0xFF7F5F6D, 0x34E0, 0x4B6F, {0xB3, 0xBB, 0x81, 0x41, 0xDE, 0x2E, 0xF7, 0x32}} ; + +const IID IID_Plugins = { + 0x702D3901, 0xC13A, 0x448e, {0x88, 0x71, 0xEC, 0xDC, 0x8B, 0xC8, 0xD0, 0x79}} ; + + +///////////////////////////////////////////////////////////////////////////// +// cWorld + +// static bstring stable of doom :( +BSTR strContainer; +BSTR strcontainer; +BSTR strSlot; +BSTR strslot; +BSTR strwielder; +BSTR strkey ; +BSTR strdwords ; +BSTR strstring ; +BSTR strdoubles ; +BSTR strstrings ; +BSTR strspellCount ; +BSTR strspells ; +BSTR strspellID ; +BSTR strspellFlag ; +BSTR strdamageType ; +BSTR strspeed ; +BSTR strskill ; +BSTR strdamage ; +BSTR strdamageRange ; +BSTR strdamageBonus ; +BSTR strrange ; +BSTR strdefenseBonus ; +BSTR strattackBonus ; +BSTR strslashProt ; +BSTR strpierceProt ; +BSTR strbludgeonProt ; +BSTR strcoldProt ; +BSTR strfireProt ; +BSTR stracidProt ; +BSTR strelectricalProt ; +BSTR strlandblock; +BSTR strOffset; +BSTR strStackCount; +BSTR strstackCount; +BSTR strvalue; + +BSTR strxOffset; +BSTR stryOffset; +BSTR strzOffset; +BSTR strxHeading; +BSTR strdestroyed; +BSTR stritem; +BSTR strcount; +BSTR strobject; +BSTR strowner; +BSTR strsequence; +BSTR strequipType; +BSTR strsequence2; +BSTR strcoverage; +BSTR strflags1; +BSTR strflags; +BSTR strlocation; +BSTR strwieldingSlot; +BSTR strflags2; +BSTR strobjectName; +BSTR strsecondaryName; +BSTR strmodel; +BSTR strrealmodel; +BSTR strunkgreen; +BSTR stricon; +BSTR strunknown_v0_2; +BSTR strunknown_v0_3; +BSTR strunknown_v2; +BSTR strunknown_v4; +BSTR strunknown_v5; +BSTR strunknown_w1; +BSTR strunknown10; +BSTR strunknown11b; +BSTR stritemSlots; +BSTR strpackSlots; +BSTR strusesLeft; +BSTR strtotalUses; +BSTR strstackMax; +BSTR strapproachDistance; +BSTR strequipmentType; +BSTR strtradenoteVendor; +BSTR strcoverage1; +BSTR strcoverage2; +BSTR strcoverage3; +BSTR strmonarch; +BSTR strmaterial; +BSTR strassociatedSpell; +BSTR strtext; +BSTR strsenderName; +BSTR strtype; +BSTR strcharacter; +BSTR strevent; +BSTR strpack; +BSTR stritemCount; +BSTR stritems; +BSTR strdestination; +BSTR strinventoryCount; +BSTR strinventory; +BSTR strisContainer; +BSTR strOwner; +BSTR strposition; +BSTR strburden; +BSTR strworkmanship; +BSTR strhouseOwnerID; +BSTR strSizeChange; +BSTR strStorageChange; +BSTR strLocationChange; +BSTR strIdentReceived; +BSTR strReleasePending; +BSTR strExpirationCancel; + +enum AcMessages +{ + msgDestroyObj = 0x0024, + msgLocalChat = 0x0037, + msgAdjustStackSize = 0x0197, + msgSetCoverage = 0x0229, + msgSetContainer = 0x022D, + msgEnd3dMode = 0xF653, + msgFailToLogin = 0xF659, + msgCreateObject = 0xF745, + msgRemoveItem = 0xF747, + msgSetObjectPosition = 0xF748, + msgWieldItem = 0xF749, + msgMoveToInventory = 0xF74A, + msgGameEvent = 0xF7B0, + msgUpdateObject = 0xF7DB, + msgUnknown = 0 +}; + +enum AcGameEvents +{ + gevLogin = 0x0013, + gevInsertIntoInventory = 0x0022, + gevIdentifyObject = 0x00C9, + gevSetPackContents = 0x0196, + gevDropItem = 0x019A, + gevWearItem = 0x0023, + gevUnknown = 0 +}; + + +cWorld::cWorld() +{ + m_nNextTime = 0; + m_HookIsSet = false ; +}; + +HRESULT cWorld::onInitialize() +{ + _DebugLog("OnInitialize") ; + + _DebugLog("\n\nLogin") ; + + SysReAllocString( &strContainer, L"Container" ); + SysReAllocString( &strContainer, L"Container" ); + SysReAllocString( &strcontainer, L"container" ); + SysReAllocString( &strSlot, L"Slot" ); + SysReAllocString( &strslot, L"slot" ); + SysReAllocString( &strwielder, L"wielder" ); + SysReAllocString( &strkey, L"key" ); + SysReAllocString( &strdwords, L"dwords" ); + SysReAllocString( &strstring, L"string" ); + SysReAllocString( &strdoubles, L"doubles") ; + SysReAllocString( &strstrings, L"strings") ; + SysReAllocString( &strspellCount, L"spellCount") ; + SysReAllocString( &strspells, L"spells") ; + SysReAllocString( &strspellID, L"spellID") ; + SysReAllocString( &strspellFlag, L"spellFlag") ; + SysReAllocString( &strdamageType, L"damageType") ; + SysReAllocString( &strspeed, L"speed") ; + SysReAllocString( &strskill, L"skill") ; + SysReAllocString( &strdamage, L"damage") ; + SysReAllocString( &strdamageRange, L"damageRange") ; + SysReAllocString( &strdamageBonus, L"damageBonus") ; + SysReAllocString( &strrange, L"range") ; + SysReAllocString( &strdefenseBonus, L"defenseBonus") ; + SysReAllocString( &strattackBonus, L"attackBonus") ; + SysReAllocString( &strslashProt, L"slashProt") ; + SysReAllocString( &strpierceProt, L"pierceProt") ; + SysReAllocString( &strbludgeonProt, L"bludgeonProt") ; + SysReAllocString( &strcoldProt, L"coldProt") ; + SysReAllocString( &strfireProt, L"fireProt") ; + SysReAllocString( &stracidProt, L"acidProt") ; + SysReAllocString( &strelectricalProt, L"electricalProt") ; + SysReAllocString( &strlandblock, L"landblock" ); + SysReAllocString( &strOffset, L"Offset" ); + SysReAllocString( &strStackCount, L"StackCount" ); + SysReAllocString( &strstackCount, L"stackCount" ); + SysReAllocString( &strvalue, L"value" ); + + SysReAllocString( &strxOffset, L"xOffset" ); + SysReAllocString( &stryOffset, L"yOffset" ); + SysReAllocString( &strzOffset, L"zOffset" ); + SysReAllocString( &strxHeading, L"xHeading" ); + SysReAllocString( &strdestroyed, L"destroyed" ); + SysReAllocString( &stritem, L"item" ); + SysReAllocString( &strcount, L"count" ); + SysReAllocString( &strobject, L"object" ); + SysReAllocString( &strowner, L"owner" ); + SysReAllocString( &strsequence, L"sequence" ); + SysReAllocString( &strequipType, L"equipType" ); + SysReAllocString( &strsequence2, L"sequence2" ); + SysReAllocString( &strcoverage, L"coverage" ); + SysReAllocString( &strflags1, L"flags1" ); + SysReAllocString( &strflags, L"flags" ); + SysReAllocString( &strlocation, L"location" ); + SysReAllocString( &strwieldingSlot, L"wieldingSlot" ); + SysReAllocString( &strflags2, L"flags2" ); + SysReAllocString( &strobjectName, L"objectName" ); + SysReAllocString( &strsecondaryName, L"secondaryName" ); + SysReAllocString( &strmodel, L"model" ); + SysReAllocString( &strrealmodel, L"modelNumber" ); + SysReAllocString( &strunkgreen, L"unknown_green" ); + SysReAllocString( &stricon, L"icon" ); + SysReAllocString( &strunknown_v0_2, L"unknown_v0_2" ); + SysReAllocString( &strunknown_v0_3, L"unknown_v0_3" ); + SysReAllocString( &strunknown_v2, L"unknown_v2" ); + SysReAllocString( &strunknown_v4, L"unknown_v4" ); + SysReAllocString( &strunknown_v5, L"unknown_v5" ); + SysReAllocString( &strunknown_w1, L"unknown_w1" ); + SysReAllocString( &strunknown10, L"unknown10" ); + SysReAllocString( &strunknown11b, L"unknown11b" ); + SysReAllocString( &stritemSlots, L"itemSlots" ); + SysReAllocString( &strpackSlots, L"packSlots" ); + SysReAllocString( &strusesLeft, L"usesLeft" ); + SysReAllocString( &strtotalUses, L"totalUses" ); + SysReAllocString( &strstackMax, L"stackMax" ); + SysReAllocString( &strapproachDistance, L"approachDistance" ); + SysReAllocString( &strequipmentType, L"equipmentType" ); + SysReAllocString( &strtradenoteVendor, L"tradenoteVendor" ); + SysReAllocString( &strcoverage1, L"coverage1" ); + SysReAllocString( &strcoverage2, L"coverage2" ); + SysReAllocString( &strcoverage3, L"coverage3" ); + SysReAllocString( &strmonarch, L"monarch" ); + SysReAllocString( &strmaterial, L"material" ); + SysReAllocString( &strassociatedSpell, L"associatedSpell" ); + SysReAllocString( &strtext, L"text" ); + SysReAllocString( &strsenderName, L"senderName" ); + SysReAllocString( &strtype, L"type" ); + SysReAllocString( &strcharacter, L"character" ); + SysReAllocString( &strevent, L"event" ); + SysReAllocString( &strpack, L"pack" ); + SysReAllocString( &stritemCount, L"itemCount" ); + SysReAllocString( &stritems, L"items" ); + SysReAllocString( &strdestination, L"destination" ); + SysReAllocString( &strinventoryCount, L"inventoryCount" ); + SysReAllocString( &strinventory, L"inventory" ); + SysReAllocString( &strisContainer, L"isContainer" ); + SysReAllocString( &strOwner, L"Owner" ); + SysReAllocString( &strposition, L"position" ); + SysReAllocString( &strburden, L"burden" ); + SysReAllocString( &strworkmanship, L"workmanship" ); + SysReAllocString( &strhouseOwnerID, L"houseOwnerID" ); + SysReAllocString( &strSizeChange, L"EvtSizeChange" ); + SysReAllocString( &strStorageChange, L"EvtStorageChange" ); + SysReAllocString( &strLocationChange, L"EvtLocationChange" ); + SysReAllocString( &strIdentReceived, L"EvtIdentReceived" ); + SysReAllocString( &strReleasePending, L"EvtReleasePending" ); + SysReAllocString( &strExpirationCancel, L"EvtExpirationCancel" ); + + if( !m_HookIsSet ) + SetHook() ; + + return S_OK; +} + + +void cWorld::SetHook() +{ + HRESULT hr = m_pService->get_Decal( &m_pDecal ); + + if( SUCCEEDED( hr ) ) + { + _DebugLog("\nGotDecal") ; + + hr = m_pDecal->get_Hooks(&m_pHooks) ; + + if( SUCCEEDED( hr ) ) + { + _DebugLog("\nGot Hooks") ; + IACHooksEventsImpl::advise(m_pHooks) ; + m_HookIsSet = true ; + } + + else + _DebugLog("\nFailed Get Hooks %x", hr) ; + } + + else + _DebugLog("\nFailed to get Decal %x", hr) ; +} + + +HRESULT cWorld::onTerminate() +{ + _DebugLog("OnTerminate") ; + _DebugLog("CLOSEFILE") ; + if( m_HookIsSet ) + { + IACHooksEventsImpl::unadvise(m_pHooks) ; + + if( m_pHooks.p != NULL ) + { + m_pHooks.Release() ; + //m_pHooks = NULL ; + } + + m_HookIsSet = false ; + } + + if( m_pDecal.p != NULL ) + { + m_pDecal.Release() ; + //m_pDecal = NULL ; + } + + // cleanup our bstr mess... + SysFreeString( strContainer ); + SysFreeString( strcontainer ); + SysFreeString( strSlot ); + SysFreeString( strslot ); + SysFreeString( strwielder ); + SysFreeString( strkey ); + SysFreeString( strdwords ); + SysFreeString( strstring ); + SysFreeString(strdoubles) ; + SysFreeString(strstrings) ; + SysFreeString(strspellCount) ; + SysFreeString(strspells) ; + SysFreeString(strspellID) ; + SysFreeString(strspellFlag) ; + SysFreeString(strdamageType) ; + SysFreeString(strspeed) ; + SysFreeString(strskill) ; + SysFreeString(strdamage) ; + SysFreeString(strdamageRange) ; + SysFreeString(strdamageBonus) ; + SysFreeString(strrange) ; + SysFreeString(strdefenseBonus) ; + SysFreeString(strattackBonus) ; + SysFreeString(strslashProt) ; + SysFreeString(strpierceProt) ; + SysFreeString(strbludgeonProt) ; + SysFreeString(strcoldProt) ; + SysFreeString(strfireProt) ; + SysFreeString(stracidProt) ; + SysFreeString(strelectricalProt) ; + + SysFreeString( strlandblock ); + SysFreeString( strOffset ); + SysFreeString( strStackCount ); + SysFreeString( strstackCount ); + SysFreeString( strvalue ); + SysFreeString( strxOffset ); + SysFreeString( stryOffset ); + SysFreeString( strzOffset ); + SysFreeString( strxHeading ); + SysFreeString( strdestroyed ); + SysFreeString( stritem ); + SysFreeString( strcount ); + SysFreeString( strobject ); + SysFreeString( strowner ); + SysFreeString( strsequence ); + SysFreeString( strequipType ); + SysFreeString( strsequence2 ); + SysFreeString( strcoverage ); + SysFreeString( strflags1 ); + SysFreeString( strflags ); + SysFreeString( strlocation ); + SysFreeString( strwieldingSlot ); + SysFreeString( strflags2 ); + SysFreeString( strobjectName ); + SysFreeString( strsecondaryName ); + SysFreeString( strmodel ); + SysFreeString( strrealmodel ); + SysFreeString( strunkgreen ); + SysFreeString( stricon ); + SysFreeString( strunknown_v0_2 ); + SysFreeString( strunknown_v0_3 ); + SysFreeString( strunknown_v2 ); + SysFreeString( strunknown_v4 ); + SysFreeString( strunknown_v5 ); + SysFreeString( strunknown_w1 ); + SysFreeString( strunknown10 ); + SysFreeString( stritemSlots ); + SysFreeString( strpackSlots ); + SysFreeString( strusesLeft ); + SysFreeString( strtotalUses ); + SysFreeString( strstackMax ); + SysFreeString( strapproachDistance ); + SysFreeString( strequipmentType ); + SysFreeString( strtradenoteVendor ); + SysFreeString( strcoverage1 ); + SysFreeString( strcoverage2 ); + SysFreeString( strcoverage3 ); + SysFreeString( strmonarch ); + SysFreeString( strmaterial ); + SysFreeString( strassociatedSpell ); + SysFreeString( strtext ); + SysFreeString( strsenderName ); + SysFreeString( strtype ); + SysFreeString( strcharacter ); + SysFreeString( strevent ); + SysFreeString( strpack ); + SysFreeString( stritemCount ); + SysFreeString( stritems ); + SysFreeString( strdestination ); + SysFreeString( strinventoryCount ); + SysFreeString( strinventory ); + SysFreeString( strisContainer ); + SysFreeString( strOwner ); + SysFreeString( strposition ); + SysFreeString( strburden ); + SysFreeString( strworkmanship ); + SysFreeString( strhouseOwnerID ); + SysFreeString( strSizeChange ); + SysFreeString( strStorageChange ); + SysFreeString( strLocationChange ); + SysFreeString( strIdentReceived ); + SysFreeString( strReleasePending ); + SysFreeString( strExpirationCancel ); + + return S_OK; +} + +void cWorld::FreeData() +{ + _DebugLog("\nFreeData") ; + for (cWorldDataMap::iterator iData = m_objects.begin(); iData != m_objects.end(); iData++) + { + if (iData->second) { + delete iData->second; + //_DebugLog("\ndeleted %x", iData->first) ; + } + } + + m_objects.clear(); + // Gouru: reset the player so next login the player gets updated... + m_objects.player(0) ; +} + + +STDMETHODIMP cWorld::DispatchServer(IMessage2 *pMsg) +{ + USES_CONVERSION; + long nType; + pMsg->get_Type(&nType); + + CComPtr< IMessageIterator > pMembers; + pMsg->get_Begin(&pMembers); + + switch (nType) + { + case msgFailToLogin: FreeData(); break ; + case msgEnd3dMode: FreeData(); break ; + case msgDestroyObj: DoDestroyObj(pMembers) ; break ; + case msgSetCoverage: DoSetCoverage(pMembers) ; break ; + case msgSetContainer: DoSetContainer(pMembers) ; break ; + case msgAdjustStackSize: DoAdjustStackSize(pMembers) ; break ; + case msgGameEvent: DoGameEvent(pMembers) ; break ; + case msgSetObjectPosition: DoSetObjectPosition(pMembers) ; break ; + case msgWieldItem: DoWieldItem(pMembers) ; break ; + case msgRemoveItem: DoRemoveItem(pMembers) ; break ; + case msgCreateObject: DoCreateObject(pMembers) ; break ; + case msgUpdateObject: DoCreateObject(pMembers) ; break ; + case msgMoveToInventory: DoMoveToInventory(pMembers) ; break ; +#ifdef Logging + case msgLocalChat: DoLocalChat(pMembers) ; break ; +#endif + } + +// ReleaseAllPendingObjects() ; + + return S_OK; +} + +#ifdef Logging +// Gouru: used in logging to allow log to have chat events to determine when a test action +// begins and ends. +void cWorld::DoLocalChat(CComPtr pMembers) +{ + BSTR Text ; + BSTR Sender ; + long nType ; + + pMembers->get_NextString(strtext, &Text) ; + pMembers->get_NextString(strsenderName, &Sender) ; + pMembers->get_NextInt(strtype, &nType) ; + if (nType==2) { + USES_CONVERSION; + _DebugLog("\n\n%s: %s", OLE2A(Sender), OLE2A(Text)) ; + } +} +#endif + +void cWorld::DoGameEvent(CComPtr pMembers) +{ + long nCharacter, nEvent; + + pMembers->get_NextInt(strcharacter, &nCharacter); + pMembers->get_NextInt(strevent, &nEvent); + + if (!m_objects.player()) { + _DebugLog("\nPlayer: %x", nCharacter) ; + m_objects.player(nCharacter); + } + + switch (nEvent) + { + case gevLogin: DoLogin(pMembers) ; break ; + case gevInsertIntoInventory: DoInsertIntoInventory(pMembers) ; break ; + case gevSetPackContents: DoSetPackContents(pMembers) ; break ; + case gevIdentifyObject: DoIdentifyObject(pMembers) ; break ; + case gevDropItem: DoDropItem(pMembers) ; break ; + case gevWearItem: DoWearItem(pMembers) ; break ; + } +} + + +void cWorld::ReleaseAllPendingObjects() +{ +// if (m_nNextTime <= time(NULL)) +// { +// cWorldData *pData = NULL; +// +// for (cWorldDataMap::iterator iData = m_objects.begin(); iData != m_objects.end();) +// { +// pData = iData->second; +// +// if (pData && pData->m_tExpires && pData->m_tExpires <= time(NULL)) +// { +// _DebugLog("\nReleased object %x", pData->m_dwGUID) ; +// cWorldDataMap::iterator iSkip = iData; +// iSkip++; +// +// DestroyObject(pData) ; +// +// iData = iSkip; +// } +// else +// ++iData; +// } +// m_nNextTime = time(NULL) + 5; // 5 seconds until next check +// } +} + +void cWorld::DestroyObject(cWorldData* pData) +{ + _DebugLog("\nDestroyObject: %x", pData->m_dwGUID) ; + + if (pData->m_dwGUID != m_objects.player()) { + _DebugLog(" : ReleaseObject") ; + Fire_ReleaseObject(pData->m_p); + + _DebugLog(" : MoveSlotBack") ; + MoveSlotBack(pData); + + _DebugLog(" : erase") ; + m_objects.erase(pData->m_dwGUID); + + _DebugLog(" : delete") ; + delete pData; + + _DebugLog(" : ReleaseDone" ); + Fire_ReleaseDone(); + } +} + + +STDMETHODIMP cWorld::get_Object(long GUID, IWorldObject **pVal) +{ + *pVal = NULL ; + if (cWorldData *pData = Data(GUID)) { + pData->m_p->QueryInterface(pVal); + return S_OK; + } + + return S_FALSE; +} + + +STDMETHODIMP cWorld::get_ByName(BSTR Name, IWorldIterator **pVal) +{ + USES_CONVERSION; + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByName(Name); + pList->QueryInterface(pVal); + + return S_OK; +} + +STDMETHODIMP cWorld::get_All(IWorldIterator **pVal) +{ + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByAll(); + pList->QueryInterface(pVal); + + return S_OK; +} + +STDMETHODIMP cWorld::get_ByType(eObjectType Type, IWorldIterator **pVal) +{ + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByType(Type); + pList->QueryInterface(pVal); + + return S_OK; +} + +STDMETHODIMP cWorld::get_ByNameSubstring(BSTR Substring, IWorldIterator **pVal) +{ + USES_CONVERSION; + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByNameSubstring(Substring); + pList->QueryInterface(pVal); + + return S_OK; +} + +STDMETHODIMP cWorld::get_ByContainer(long GUID, IWorldIterator **pVal) +{ + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByContainer(GUID); + pList->QueryInterface(pVal); + + return S_OK; +} + +STDMETHODIMP cWorld::get_ByOwner(long GUID, IWorldIterator **pVal) +{ + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByOwner(GUID) ; + pList->QueryInterface(pVal); + + return S_OK; +} + +STDMETHODIMP cWorld::Distance2D( + long GUID1, + long GUID2, + float* pVal) +{ + *pVal = 0.0 ; + _DebugLog("\nDistance2D %x %x", GUID1, GUID2) ; + if (cWorldData* pData1 = Data(GUID1)) { + _DebugLog(" from %s", pData1->m_strName.c_str()) ; + if (cWorldData* pData2 = Data(GUID2)) { + _DebugLog(" to %s", pData2->m_strName.c_str()) ; + float ew1 = EastWest(pData1->m_dwLandblock, pData1->m_fxOffset) ; + float ns1 = NorthSouth(pData1->m_dwLandblock, pData1->m_fyOffset) ; + float ew2 = EastWest(pData2->m_dwLandblock, pData2->m_fxOffset) ; + float ns2 = NorthSouth(pData2->m_dwLandblock, pData2->m_fyOffset) ; + _DebugLog(" %3.2f %3.2f %3.2f %3.2f", ew1, ns1, ew2, ns2) ; + ew1 -= ew2 ; // get eastwest difference + ns1 -= ns2 ; // get northsouth difference + // ask pythagorous how far... + ns1 = (ns1*ns1) + (ew1*ew1) ; + *pVal = sqrtf(ns1) ; + } + } + return S_OK ; +} + + + +// Returns a pointer to the data object for the specified GUID, if the guid +// is zero, or item not found, returns NULL. +cWorldData *cWorld::Data(DWORD nGuid) +{ + // don't bother searching if guid is null, object doesnt exist + if (nGuid==0) return NULL ; + cWorldDataMap::iterator iData = m_objects.find(nGuid); + if (iData != m_objects.end()) { + //_DebugLog("\nFound %x", nGuid) ; + return iData->second; + } else { + //_DebugLog("\nFailed find of %x", nGuid) ; + return NULL; + } +} + + +void cWorld::DoDestroyObj(CComPtr< IMessageIterator > pMembers) +{ + long nDestroyed; + pMembers->get_NextInt(strdestroyed, &nDestroyed); + _DebugLog("\n\nDestroyObj %x", nDestroyed) ; + + // if we know about this object + if (cWorldData *pData = Data(nDestroyed)) { + // remove it + DestroyObject(pData) ; + } +} + + +// Gouru: we only use this command to update what areas are being covered by an item, the +// coverage is not updated to reflect what is actually covered at any given time. To determine +// if an area of the body is covered, first the item must be in slot -1 (equipped) then the +// coverage information is the actual current coverage. +void cWorld::DoSetCoverage(CComPtr pMembers) +{ + long object, coverage ; + pMembers->get_NextInt(strobject, &object) ; + pMembers->get_NextInt(strcoverage, &coverage) ; + + _DebugLog("\n\nSetCoverage %x %x", object, coverage) ; + if (cWorldData *pData = Data(object)) { + pData->m_dwCoverage = coverage ; + } +} + + + +// Gouru: Set container messages often come in pairs, the first setting the container to zero +// the second to the actual container. In my testing so far they always appear to arrived +// in the proper order. In the messages.xml, the only description that seems to be +// accurate is the object and container number, the sequence, type,, etc do not appear to +// be as described. +void cWorld::DoSetContainer(CComPtr pMembers) +{ + long object, container, seq, type, seq2 ; + + pMembers->get_NextInt(strsequence, &seq) ; + pMembers->get_NextInt(strobject, &object) ; + pMembers->get_NextInt(strequipType, &type) ; + pMembers->get_NextInt(strcontainer, &container) ; + pMembers->get_NextInt(strsequence2, &seq2) ; + + _DebugLog("\n\nSetContainer: %d, %x, %d, %x, %d", seq, object, type, container, seq2) ; + + // special case 'wielding to ground'. In testing, the object is not 'really' being put on + // the ground, so we will ignore the message. + if (type==3 && container==0) { + _DebugLog(" - Wield to ground ignored") ; + return ; + } + if (cWorldData *pData = Data(object)) { + // if the container is changing + if (pData->m_dwContainer != container) { + cWorldData* pDest ; + pDest = container ? Data(container) : NULL; + if (PlayerOwns(pData)) { + // if moving out of the player + _DebugLog(" - Moving out") ; + MoveItems(pData->m_dwContainer, pData->m_Slot, eLeft) ; + pData->m_Slot.slot = -1 ; + pData->m_dwWielder = 0 ; + } + if (pDest && PlayerOwns(pDest)) { + _DebugLog(" - Moving in") ; + // if moving into player + if (type==3) { + // if the item being moved in is being wielded + pData->m_Slot.slot = -1 ; + } else { + // moving into pack, make room for it first + MoveItems(pDest->m_dwGUID, CSlot(0, pData->m_Slot.type), eRight) ; + pData->m_Slot.slot = 0 ; + } + } + pData->m_dwContainer = container ; + } else { + _DebugLog(" - Container did not change") ; + } + } +} + + +void cWorld::DoAdjustStackSize(CComPtr pMembers) +{ + long nItem, nCount, nValue; + + pMembers->get_NextInt(stritem, &nItem); + pMembers->get_NextInt(strcount, &nCount); + pMembers->get_NextInt(strvalue, &nValue); + + _DebugLog("\n\nAdjustStackSize %x %d %d", nItem, nCount, nValue) ; + + // if the object is in our object store + if (cWorldData *pData = Data(nItem)) { + // change the object values, reset expiration to 0 + pData->m_tExpires = 0; + pData->m_nStackCount = WORD(nCount); + pData->m_dwValue = nValue; + + // Fire change events for those items that may have changed + Fire_ChangeObject(pData->m_p, strSizeChange); + } +} + +void cWorld::DoWearItem(CComPtr pMembers) +{ + long nObject, nSlot; + pMembers->get_NextInt(stritem, &nObject); + pMembers->get_NextInt(strslot, &nSlot) ; + _DebugLog("\n\nWearItem %x %x", nObject, nSlot) ; + + if (cWorldData *pData = Data(nObject)) + { + pData->m_tExpires = 0; + + MoveSlotBack(pData); + pData->m_Slot.slot = -1; + pData->m_dwContainer = m_objects.player() ; + + // Gouru: Changed to capitalized versions of these string for consistency with other + // fired events + Fire_ChangeObject(pData->m_p, strStorageChange); + } +} + +void cWorld::DoDropItem(CComPtr pMembers) +{ + long nItem; + pMembers->get_NextInt(stritem, &nItem); + _DebugLog("\n\nDropItem %x", nItem) ; + + if (cWorldData *pData = Data(nItem)) { + pData->m_tExpires = 0; + if (PlayerOwns(pData)) { + MoveSlotBack(pData); + pData->m_Slot.slot = -1; + pData->m_dwContainer = 0; + pData->m_dwWielder = 0 ; // not wielded when on ground + } + Fire_ChangeObject(pData->m_p, strStorageChange); + } +} + +void cWorld::DoIdentifyObject(CComPtr pMembers) +{ + USES_CONVERSION ; + long nObject; + pMembers->get_NextInt(strobject, &nObject); + + _DebugLog("\n\nIdentifyObject %x", nObject) ; + + cWorldData *pData = Data(nObject); + + if (pData != NULL ) + { + pData->m_tExpires = 0; + pData->m_HasIdData = true ; + _DebugLog("\n HasIDData") ; + } else { + _DebugLog(" Object not found") ; + return ; // we don't have the create, so can't store id info + } + + long ObjectIdMask ; + pMembers->get_NextInt(strflags, &ObjectIdMask) ; + + if (ObjectIdMask && 0x0001) { + _DebugLog("\nChecking dwords") ; + CComPtr pItems, pItem; + + pMembers->get_NextObject(strdwords, &pItems); + + while (pItems != NULL && SUCCEEDED(pItems->get_NextObjectIndex(&pItem))) { + long key, value ; + pItem->get_NextInt(strkey, &key) ; + pItem->get_NextInt(strvalue, &value) ; + _DebugLog("\n key:%x value:%d || ", key, value) ; + switch (key) { + case 0x1C: pData->m_ArmorLevel = value ; _DebugLog("ArmorLevel %d", value) ; break ; + case 0x24: pData->m_MagicDef = value ; _DebugLog("MagicDef %d", value) ; break ; + case 0x6A: pData->m_Spellcraft = value ; _DebugLog("Spellcraft %d", value) ; break ; + case 0x6C: pData->m_MaximumMana = value ; _DebugLog("MaximumMana %d", value) ; break ; + case 0x6D: pData->m_LoreReq = value ; _DebugLog("LoreReq %d", value) ; break ; + case 0x6E: pData->m_RankReq = value ; _DebugLog("RankReq %d", value) ; break ; + case 0x73: pData->m_SkillReq = value ; _DebugLog("SkillReq %d", value) ; break ; + case 0x9E: pData->m_WieldReqType = value ; _DebugLog("WieldReqType %d", value) ; break ; + case 0x9F: pData->m_WieldReqId = value ; _DebugLog("WieldReqId %d", value) ; break ; + case 0xA0: pData->m_WieldReq = value ; _DebugLog("WieldReq %d", value) ; break ; + case 0xAB: pData->m_TinkerCount = value ; _DebugLog("TinkerCount %d", value) ; break ; + case 0xB0: pData->m_SkillReqId = value ; _DebugLog("SkillReqId %d", value) ; break ; + case 0xB3: pData->m_SpecialProps = value ; _DebugLog("SpecialProps %d", value) ; break ; + } + } + } + + if (ObjectIdMask && 0x0004) { + _DebugLog("\nChecking doubles") ; + CComPtr pItems, pItem; + + _DebugLog("\nGetting iterator") ; + pMembers->get_NextObject(strdoubles, &pItems); + _DebugLog("\nGetting object") ; + while (pItems != NULL && SUCCEEDED(pItems->get_NextObjectIndex(&pItem))) { + long key ; + float value ; + _DebugLog("\nGetting key") ; + pItem->get_NextInt(strkey, &key) ; + _DebugLog("\nGetting value") ; + pItem->get_NextFloat(strvalue, &value) ; + _DebugLog("\n key:%d value:%f || ", key, value) ; + switch (key) { + case 0x90: pData->m_ManaCMod = value ; _DebugLog("ManaCMod %f", value) ; break ; + } + } + } + + if (ObjectIdMask && 0x0008) { + _DebugLog("\nChecking strings") ; + + CComPtr pItems, pItem; + + pMembers->get_NextObject(strstrings, &pItems); + while (pItems != NULL && SUCCEEDED(pItems->get_NextObjectIndex(&pItem))) { + long key ; + BSTR value ; + pItem->get_NextInt(strkey, &key) ; + pItem->get_NextString(strstring, &value) ; + std::string sValue = OLE2A(value) ; + _DebugLog("\n key:%d value:%s || ", key, sValue.c_str()) ; + + switch (key) { + case 0x07: pData->m_Inscription = sValue ; _DebugLog("Inscription") ; break ; + case 0x13: pData->m_RaceReq = sValue ; _DebugLog("RaceReq") ; break ; + } + } + } + + if (ObjectIdMask && 0x0010) { + _DebugLog("\nChecking spells") ; + CComPtr pItems, pItem; + + pMembers->get_NextObject(strspells, &pItems); + int ix=0 ; + while (pItems != NULL && SUCCEEDED(pItems->get_NextObjectIndex(&pItem))) { + long spellID, spellFlag ; + pItem->get_NextInt(strspellID, &spellID) ; + pItem->get_NextInt(strspellFlag, &spellFlag) ; + + _DebugLog("\n key:%d value:%d || ", spellID, spellFlag) ; + if (spellFlag == 0 && ix < 10) { + pData->m_Spell[ix++] = spellID ; + } + } + pData->m_SpellCount = ix ; + } + if (ObjectIdMask && 0x0020) { + _DebugLog("\nChecking damages") ; + pMembers->get_NextInt(strdamageType, &(pData->m_DamageType)) ; + pMembers->get_NextInt(strspeed, &(pData->m_WeapSpeed)) ; + pMembers->get_NextInt(strskill, &(pData->m_EquipSkill)) ; + pMembers->get_NextInt(strdamage, &(pData->m_MaxDamage)) ; + pMembers->get_NextFloat(strdamageRange, &(pData->m_Variance)) ; + pMembers->get_NextFloat(strdamageBonus, &(pData->m_DamageBonus)) ; + pMembers->get_NextFloat(strrange, &(pData->m_Range)) ; + pMembers->get_NextFloat(strdefenseBonus, &(pData->m_DefenseBonus)) ; + pMembers->get_NextFloat(strattackBonus, &(pData->m_AttackBonus)) ; + } + if (ObjectIdMask && 0x0020) { + _DebugLog("\nChecking prots") ; + pMembers->get_NextFloat(strslashProt, &(pData->m_SlashProt)) ; + pMembers->get_NextFloat(strpierceProt, &(pData->m_PierceProt)) ; + pMembers->get_NextFloat(strbludgeonProt, &(pData->m_BludProt)) ; + pMembers->get_NextFloat(strcoldProt, &(pData->m_ColdProt)) ; + pMembers->get_NextFloat(strfireProt, &(pData->m_FireProt)) ; + pMembers->get_NextFloat(stracidProt, &(pData->m_AcidProt)) ; + pMembers->get_NextFloat(strelectricalProt, &(pData->m_ElectProt)) ; + } + Fire_ChangeObject(pData->m_p, strIdentReceived); +} + + +void cWorld::DoSetPackContents(CComPtr pMembers) +{ + CComPtr pItems, pItem; + long nPack, nItemCount, ixItem = 0, ixPack=0; + + pMembers->get_NextInt(strpack, &nPack); + pMembers->get_NextInt(stritemCount, &nItemCount); + pMembers->get_NextObject(stritems, &pItems); + + _DebugLog("\n\nSetPackContents %x %d", nPack, nItemCount) ; + + while (SUCCEEDED(pItems->get_NextObjectIndex(&pItem))) + { + long nItem, nType; + + pItem->get_NextInt(stritem, &nItem); + pItem->get_NextInt(strtype, &nType); + + CSlot slot = (nType==0) ? CSlot(ixItem++, 0x00) : CSlot(ixPack++, 0x01) ; + + // if the object has been created + if (cWorldData *pData = Data(nItem)) + { + pData->m_tExpires = 0; + pData->m_dwContainer = nPack; + pData->m_Slot = slot ; + + //SetObjectOwner(pData); + Fire_ChangeObject(pData->m_p, strStorageChange); + } + else + { + // store the slot information so it can be inserted when the object is created + // later + m_SlotStore[nItem] = slot ; + } + pItem.Release(); + } +} + + +void cWorld::DoInsertIntoInventory(CComPtr pMembers) +{ + long nItem, nDest, nSlot; + + pMembers->get_NextInt(stritem, &nItem); + pMembers->get_NextInt(strdestination, &nDest); + pMembers->get_NextInt(strslot, &nSlot); + + _DebugLog("\n\nInsertIntoInventory %x %x %d", nItem, nDest, nSlot) ; + + if (cWorldData *pData = Data(nItem)) { + + // get information about the destination container + cWorldData* pDest = Data(nDest) ; + // TODO: Gouru: what is destination if it doesn't exist, comes up with an unknown + // destination on death + if (!pDest) return ; + + // we will attempt to update slot information. If we don't have slot information for + // the destination (ie, its another player), we assume that it is going into the + // first slot. If it later shows up equipped, on the ground, whatever, we will + // remove it from the assumed slot. Since we can never actually access anything in + // another players pack, these assumption hurt nothing, even if wrong. + // move everything in the original pack left/up to fill the old slot + MoveItems(pData->m_dwContainer, pData->m_Slot, eLeft) ; + // now move everything after the new position right/down one to make room + MoveItems(nDest, CSlot(nSlot, pData->m_Slot.type), eRight) ; + + pData->m_tExpires = 0; + pData->m_dwContainer = nDest; + pData->m_Slot.slot = nSlot; + pData->m_dwWielder = 0 ; // not wielded when in inventory + + Fire_ChangeObject(pData->m_p, strStorageChange); + } +} + + +void cWorld::DoLogin(CComPtr pMembers) +{ + CComPtr pItems, pItem; + long nCount, ixSlot = 0, ixPack=0 ; + + pMembers->get_NextInt(strinventoryCount, &nCount); + pMembers->get_NextObject(strinventory, &pItems); + + while (pItems->get_NextObjectIndex(&pItem) == S_OK) + { + long nObject, nIsContainer; + cWorldData *pData; + + pItem->get_NextInt(strobject, &nObject); + pItem->get_NextInt(strisContainer, &nIsContainer); + + CSlot info ; + if (nIsContainer) { + info.type = 0x01 ; + info.slot = ixPack++ ; + } else { + info.type = 0x00 ; + info.slot = ixSlot++ ; + } + + // if the item is already in the global store + if (pData = Data(nObject)) { + pData->m_Slot = info ; + } else { + m_SlotStore[nObject] = info ; + } + pItem.Release(); + } +} + + +// Gouru: This message arrives when an item is put into inventory. Often seen when somebody +// picks up something that is lieing on the ground. It does not specify whose inventory it +// got added to, so we cannot make any assumptions as to owner, container, etc from this +// message. +void cWorld::DoMoveToInventory(CComPtr pMembers) +{ + long nObject; + pMembers->get_NextInt(strobject, &nObject); + + _DebugLog("\n\nMoveToInventory %x", nObject) ; + + if (cWorldData *pData = Data(nObject)) { + // if we don't own it, we can't be sure where it went, all we know is that we can + // no longers select it. + if (!PlayerOwns(pData)){ + pData->m_tExpires = 0; + pData->m_Slot.slot = -1 ; // unknown + pData->m_dwContainer = -1 ; // unknown + } + pData->m_dwWielder = 0 ; // unwielded unless we get a wield msg later + + Fire_ChangeObject(pData->m_p, strStorageChange); + } +} + + +void cWorld::DoCreateObject(CComPtr pMembers) +{ + USES_CONVERSION ; + + long nObject; + pMembers->get_NextInt(strobject, &nObject); + + _DebugLog("\n\nCreate/UpdateObject %x", nObject) ; + + cWorldData *pCreate = NULL; + + if (cWorldData *pData = Data(nObject)) + { + pCreate = pData; + pCreate->m_tExpires = 0; + } + else + { + pCreate = new cWorldData; + + if (!pCreate) + { + ::MessageBox(NULL, "Decal", "Could not allocate memory for World Data!", MB_OK); + return ; + } + + CComObject< cWorldObject > *p; + CComObject< cWorldObject >::CreateInstance(&p); + + p->m_p = pCreate; + p->QueryInterface(&pCreate->m_p); + + _DebugLog("\nInserting object") ; + m_objects.insert(m_objects.end(), std::pair< DWORD, cWorldData * >(nObject, pCreate)); + } + + _ASSERTE(pCreate); + + pCreate->m_dwGUID = nObject; + pMembers->get_NextInt(strflags1, &pCreate->m_dwFlags1); + + // Location of Object + if (pCreate->m_dwFlags1 & 0x00008000) + { + CComPtr< IMessageIterator > pPos; + pMembers->get_NextObject(strlocation, &pPos); + + pPos->get_NextInt(strlandblock, &pCreate->m_dwLandblock); + _DebugLog("\n Landblock %d", pCreate->m_dwLandblock) ; + pPos->get_NextFloat(strxOffset, &pCreate->m_fxOffset); + _DebugLog("\n xOffset %f", pCreate->m_fxOffset) ; + pPos->get_NextFloat(stryOffset, &pCreate->m_fyOffset); + _DebugLog("\n yOffset %f", pCreate->m_fyOffset) ; + pPos->get_NextFloat(strzOffset, &pCreate->m_fzOffset); + _DebugLog("\n zOffset %f", pCreate->m_fzOffset) ; + pPos->get_NextFloat(strxHeading, &pCreate->m_fxHeading); + _DebugLog("\n Heading %f", pCreate->m_fxHeading) ; + // landblock info used to speed up culling + pCreate->m_LandblockCol = (pCreate->m_dwLandblock>>24) & 0xff ; + pCreate->m_LandblockRow = (pCreate->m_dwLandblock>>16) & 0xff ; + + pCreate->m_flags |= FLAG_LOCATION; + } + + // Wielder Information + if (pCreate->m_dwFlags1 & 0x00000020) + { + pMembers->get_NextInt(strwielder, &pCreate->m_dwWielder); + _DebugLog("\n Wielder %d", pCreate->m_dwWielder) ; + pMembers->get_NextInt(strwieldingSlot, &pCreate->m_dwWieldingSlot); + _DebugLog("\n Wieldingslot %d", pCreate->m_dwWieldingSlot) ; + pCreate->m_Slot.slot = -1 ; // wielded items are slot 1 + pCreate->m_dwContainer = pCreate->m_dwWielder ; + } + + // Real Model + if (pCreate->m_dwFlags1 & 0x1) + { + pMembers->get_NextInt(strrealmodel, &pCreate->m_dwRealModel); + _DebugLog("\n Real Model %x",pCreate->m_dwRealModel) ; + } + + // Scale + if( pCreate->m_dwFlags1 & 0x80 ) + { + pMembers->get_NextFloat(strunkgreen, &pCreate->m_fScale); + _DebugLog("\n Scale %.2f",pCreate->m_fScale) ; + } + + pMembers->get_NextInt(strflags2, &pCreate->m_dwFlags2); + + BSTR strName; + pMembers->get_NextString(strobjectName, &strName); + pCreate->m_strName = OLE2A(strName); + _DebugLog("\n Name: %s", pCreate->m_strName.c_str()) ; + + pMembers->get_NextInt(strmodel, &pCreate->m_dwModel); + _DebugLog("\n Model %x",pCreate->m_dwModel) ; + pMembers->get_NextInt(stricon, &pCreate->m_dwIcon); + _DebugLog("\n Icon %x",pCreate->m_dwIcon) ; + pMembers->get_NextInt(strunknown_v0_2, &pCreate->m_dwObjectFlags1); + pMembers->get_NextInt(strunknown_v0_3, &pCreate->m_dwObjectFlags2); + + // Secondary name + if (pCreate->m_dwFlags2 & 0x00000001) { + BSTR strName; + pMembers->get_NextString(strsecondaryName, &strName); + pCreate->m_strSecondaryName = OLE2A(strName); + _DebugLog("\n SecName: %s", pCreate->m_strSecondaryName.c_str()) ; + } + + // Item Slots + if (pCreate->m_dwFlags2 & 0x00000002) + { + pCreate->m_flags |= FLAG_CONTAINS; + pMembers->get_NextInt(stritemSlots, (long *)&pCreate->m_nItemSlots); + _DebugLog("\n ItemSlots %x",pCreate->m_nItemSlots) ; + // if it has slots for items, must be a container type + pCreate->m_Slot.type = 1 ; + } + + // Pack Slots + if (pCreate->m_dwFlags2 & 0x00000004) + { + pCreate->m_flags |= FLAG_CONTAINS; + pMembers->get_NextInt(strpackSlots, (long *)&pCreate->m_nPackSlots); + _DebugLog("\n PackSlots %x",pCreate->m_nPackSlots) ; + // if it has slots for packs, must be a container type + pCreate->m_Slot.type = 1 ; + } + + // Missile Type + if (pCreate->m_dwFlags2 & 0x00000100) { + pMembers->get_NextInt(strunknown_w1, &pCreate->m_MissileType); + _DebugLog("\n m_MissileType %x",pCreate->m_MissileType) ; + } + + // Value + if (pCreate->m_dwFlags2 & 0x00000008) { + pMembers->get_NextInt(strvalue, &pCreate->m_dwValue); + _DebugLog("\n Value %x",pCreate->m_dwValue) ; + } else { + pCreate->m_dwValue = -1; + } + + + // Total Value + if (pCreate->m_dwFlags2 & 0x00000010) { + pMembers->get_NextInt(strunknown_v2, &pCreate->m_TotalValue); + _DebugLog("\n TotValue %x",pCreate->m_TotalValue) ; + } else { + pCreate->m_dwValue = -1; + } + + + // approachDistance + if (pCreate->m_dwFlags2 & 0x00000020) { + pMembers->get_NextFloat(strapproachDistance, &pCreate->m_fApproachDistance); + _DebugLog("\n ApproachDist %f",pCreate->m_fApproachDistance) ; + } + + + // Usage Mask + if (pCreate->m_dwFlags2 & 0x00080000) { + pMembers->get_NextInt(strunknown_v5, &pCreate->m_UsageMask); + _DebugLog("\n m_UsageMask: %x",pCreate->m_UsageMask) ; + } + + // Icon Outline + if (pCreate->m_dwFlags2 & 0x00000080) { + _DebugLog("\n m_IconOutline:", pCreate->m_IconOutline) ; + pMembers->get_NextInt(strunknown_v4, &pCreate->m_IconOutline); + _DebugLog(" %x",pCreate->m_IconOutline) ; + } + + // Equip Type + if (pCreate->m_dwFlags2 & 0x00000200) { + pMembers->get_NextInt(strequipmentType, &pCreate->m_dwEquipType); + _DebugLog("\n EquipType %x",pCreate->m_dwEquipType) ; + } + + // Uses Left + if (pCreate->m_dwFlags2 & 0x00000400) { + pCreate->m_flags |= FLAG_USEABLE; + pMembers->get_NextInt(strusesLeft, (long *)&pCreate->m_nUsesLeft); + _DebugLog("\n UsesLeft %x",pCreate->m_nUsesLeft) ; + } + + // Total Uses + if (pCreate->m_dwFlags2 & 0x00000800) { + pCreate->m_flags |= FLAG_USEABLE; + pMembers->get_NextInt(strtotalUses, (long *)&pCreate->m_nTotalUses); + _DebugLog("\n TotalUses %x",pCreate->m_nTotalUses) ; + } + + // Stack Count + if (pCreate->m_dwFlags2 & 0x00001000) { + pCreate->m_flags |= FLAG_STACKABLE; + pMembers->get_NextInt(strstackCount, (long *)&pCreate->m_nStackCount); + _DebugLog("\n StackCount %x",pCreate->m_nStackCount) ; + } + + // Stack Maximum + if (pCreate->m_dwFlags2 & 0x00002000) { + pCreate->m_flags |= FLAG_STACKABLE; + pMembers->get_NextInt(strstackMax, (long *)&pCreate->m_nStackMax); + _DebugLog("\n StackMax %x",pCreate->m_nStackMax) ; + } + + // Container ID + if (pCreate->m_dwFlags2 & 0x00004000) { + pMembers->get_NextInt(strcontainer, &pCreate->m_dwContainer); + _DebugLog("\n container: %x",pCreate->m_dwContainer) ; + } + + // Owner ID + if (pCreate->m_dwFlags2 & 0x00008000) { + long dword ; + // gouru, owner is same as container for these purposes, however, the item appears + // to be either worn or wielded, assume slot -1 + pMembers->get_NextInt(strowner, &dword); + _DebugLog("\n ownerid: %x",dword) ; + pCreate->m_dwContainer = dword ; + pCreate->m_Slot.slot = -1 ; + } + + // Coverage1 + if (pCreate->m_dwFlags2 & 0x00010000) { + pMembers->get_NextInt(strcoverage1, &pCreate->m_dwCoverage); + _DebugLog("\n coverage1: %x",pCreate->m_dwCoverage) ; + } + + // Coverage2 + if (pCreate->m_dwFlags2 & 0x00020000) { + pMembers->get_NextInt(strcoverage2, &pCreate->m_dwCoverage2); + _DebugLog("\n coverage2: %x",pCreate->m_dwCoverage2) ; + } + + // Coverage3 + if (pCreate->m_dwFlags2 & 0x00040000) { + pMembers->get_NextInt(strcoverage3, &pCreate->m_dwCoverage3); + _DebugLog("\n coverage3: %x",pCreate->m_dwCoverage3) ; + } + + + + //// Tradenote Vendor ID + //if (pCreate->m_dwFlags2 & 0x00020000) { + // pMembers->get_NextInt(strtradenoteVendor, &pCreate->m_dwTradeNoteVendor); + // _DebugLog("\n TradeNoteVendor: %x",pCreate->m_dwTradeNoteVendor) ; + //} + + + // Workmanship + if (pCreate->m_dwFlags2 & 0x01000000) { + pMembers->get_NextFloat(strworkmanship, &pCreate->m_Workmanship); + _DebugLog("\n m_Workmanship: %f", pCreate->m_Workmanship) ; + } + + // Burden + if (pCreate->m_dwFlags2 & 0x00200000) { + pMembers->get_NextInt(strburden, &pCreate->m_Burden); + _DebugLog("\n m_Burden: %x",pCreate->m_Burden) ; + } + + // Associated Spell + if (pCreate->m_dwFlags2 & 0x00400000) { + pMembers->get_NextInt(strassociatedSpell, &pCreate->m_dwAssociatedSpell); + _DebugLog("\n m_dwAssociatedSpell: %x",pCreate->m_dwAssociatedSpell) ; + } + + // HouseOwner + if (pCreate->m_dwFlags2 & 0x02000000) { + pMembers->get_NextInt(strhouseOwnerID, &pCreate->m_HouseOwner); + _DebugLog("\n m_HouseOwner: %x",pCreate->m_HouseOwner) ; + } + + // Hook Mask + if (pCreate->m_dwFlags2 & 0x10000000) { + pMembers->get_NextInt(strunknown10, &pCreate->m_HookMask); + _DebugLog("\n m_HookMask: %x",pCreate->m_HookMask) ; + } + + + // Hook Type + if (pCreate->m_dwFlags2 & 0x20000000) { + pMembers->get_NextInt(strunknown11b, &pCreate->m_HookType); + _DebugLog("\n m_HookType: %x",pCreate->m_HookType) ; + } + + + // Monarch + if (pCreate->m_dwFlags2 & 0x00000040) { + pMembers->get_NextInt(strmonarch, &pCreate->m_dwMonarch); + _DebugLog("\n Monarch: %x",pCreate->m_dwMonarch) ; + } + + + // Material + if (pCreate->m_dwFlags2 & 0x80000000) { + pMembers->get_NextInt(strmaterial, &pCreate->m_dwMaterial); + _DebugLog("\n m_dwMaterial: %x",pCreate->m_dwMaterial) ; + } + + + // Assume the type is unknown + pCreate->m_eType = eUnknownObject; + + _DebugLog("\n m_dwObjectFlags1: %x",pCreate->m_dwObjectFlags1) ; + // Get the type from ObjectFlags1 + /**/ if (pCreate->m_dwObjectFlags1 & 0x00000001) + pCreate->m_eType = eMeleeWeapon; + else if (pCreate->m_dwObjectFlags1 & 0x00000002) + pCreate->m_eType = eArmor; + else if (pCreate->m_dwObjectFlags1 & 0x00000004) + pCreate->m_eType = eClothing; + else if (pCreate->m_dwObjectFlags1 & 0x00000008) + pCreate->m_eType = eJewelry; + else if (pCreate->m_dwObjectFlags1 & 0x00000010) + pCreate->m_eType = eMonster; + else if (pCreate->m_dwObjectFlags1 & 0x00000020) + pCreate->m_eType = eFood; + else if (pCreate->m_dwObjectFlags1 & 0x00000040) + pCreate->m_eType = eMoney; + else if (pCreate->m_dwObjectFlags1 & 0x00000080) + pCreate->m_eType = eMisc; + else if (pCreate->m_dwObjectFlags1 & 0x00000100) + pCreate->m_eType = eMissileWeapon; + else if (pCreate->m_dwObjectFlags1 & 0x00000200) + pCreate->m_eType = eContainer; + else if (pCreate->m_dwObjectFlags1 & 0x00000400) + pCreate->m_eType = eBundle; + else if (pCreate->m_dwObjectFlags1 & 0x00000800) + pCreate->m_eType = eGem; + else if (pCreate->m_dwObjectFlags1 & 0x00001000) + pCreate->m_eType = eSpellComponent; + else if (pCreate->m_dwObjectFlags1 & 0x00004000) + pCreate->m_eType = eKey; + else if (pCreate->m_dwObjectFlags1 & 0x00008000) + pCreate->m_eType = eWandStaffOrb; + else if (pCreate->m_dwObjectFlags1 & 0x00010000) + pCreate->m_eType = ePortal; + else if (pCreate->m_dwObjectFlags1 & 0x00040000) + pCreate->m_eType = eTradeNote; + else if (pCreate->m_dwObjectFlags1 & 0x00080000) + pCreate->m_eType = eManaStone; + else if (pCreate->m_dwObjectFlags1 & 0x00100000) + pCreate->m_eType = eService; + else if (pCreate->m_dwObjectFlags1 & 0x00200000) + pCreate->m_eType = ePlant; + else if (pCreate->m_dwObjectFlags1 & 0x00400000) + pCreate->m_eType = eBaseCooking; + else if (pCreate->m_dwObjectFlags1 & 0x00800000) + pCreate->m_eType = eBaseAlchemy; + else if (pCreate->m_dwObjectFlags1 & 0x01000000) + pCreate->m_eType = eBaseFletching; + else if (pCreate->m_dwObjectFlags1 & 0x02000000) + pCreate->m_eType = eCraftedCooking; + else if (pCreate->m_dwObjectFlags1 & 0x04000000) + pCreate->m_eType = eCraftedAlchemy; + else if (pCreate->m_dwObjectFlags1 & 0x08000000) + pCreate->m_eType = eCraftedFletching; + else if (pCreate->m_dwObjectFlags1 & 0x20000000) + pCreate->m_eType = eUst; + else if (pCreate->m_dwObjectFlags1 & 0x40000000) + pCreate->m_eType = eSalvage; + + _DebugLog("\n m_dwObjectFlags2: %x",pCreate->m_dwObjectFlags2) ; + // Get the type from ObjectFlags2 (this means ObjectFlags2 overrides ObjectFlags1) + /**/ if (pCreate->m_dwObjectFlags2 & 0x00000008) + pCreate->m_eType = ePlayer; + else if (pCreate->m_dwObjectFlags2 & 0x00000200) + pCreate->m_eType = eVendor; + else if (pCreate->m_dwObjectFlags2 & 0x00001000) + pCreate->m_eType = eDoor; + else if (pCreate->m_dwObjectFlags2 & 0x00002000) + pCreate->m_eType = eCorpse; + else if (pCreate->m_dwObjectFlags2 & 0x00004000) + pCreate->m_eType = eLifestone; + else if (pCreate->m_dwObjectFlags2 & 0x00008000) + pCreate->m_eType = eFood; + else if (pCreate->m_dwObjectFlags2 & 0x00010000) + pCreate->m_eType = eHealingKit; + else if (pCreate->m_dwObjectFlags2 & 0x00020000) + pCreate->m_eType = eLockpick; + else if (pCreate->m_dwObjectFlags2 & 0x00040000) + pCreate->m_eType = ePortal; + else if (pCreate->m_dwObjectFlags2 & 0x00000001) // Keep this last (other wise some of the others won't come up right) + pCreate->m_eType = eContainer; + + // Is this an informational object??? + if ((pCreate->m_dwObjectFlags1 & 0x00002000) && + (pCreate->m_dwObjectFlags2 & 0x00000100) && + (pCreate->m_eType == eUnknownObject)) + { + /**/ if (pCreate->m_dwObjectFlags2 & 0x00000002) + pCreate->m_eType = eJournal; + else if (pCreate->m_dwObjectFlags2 & 0x00000004) + pCreate->m_eType = eSign; + else if (!(pCreate->m_dwObjectFlags2 & 0x0000000F)) + pCreate->m_eType = eBook; + } + + // can be inscribed + if (pCreate->m_dwObjectFlags2 & 0x00000002) + pCreate->m_flags |= FLAG_INSCRIBABLE; + + // lockpick + if (pCreate->m_dwObjectFlags1 & 0x00020000) + pCreate->m_flags |= FLAG_LOCKABLE; + + // if item location was received earlier, put slot into the object + if (m_SlotStore.find(nObject) != m_SlotStore.end()) + { + _DebugLog(" | Slot %d", m_SlotStore[nObject].slot) ; + pCreate->m_Slot = m_SlotStore[nObject]; + m_SlotStore.erase(nObject); + } else if (pCreate->m_Slot.slot == 0) { + // if we don't have slot information assumed yet + long tp = (pCreate->m_nPackSlots) ? 1 : 0 ; + pCreate->m_Slot.slot = -1 ; + if (pCreate->m_dwContainer == m_objects.player()) { + // if this is being created in the player, and slot information has not been + // given (this occurs when buying items) assume slot is zero, push everything + // back to make room for it. + MoveItems(m_objects.player(), CSlot(0, tp), eRight) ; + pCreate->m_Slot.slot = 0 ; + } else { + // -1, slot unknown, will never be greater than a good slot, so won't be moved + _DebugLog(" | Slot unknown") ; + } + } + + // Check if "monster" is really an NPC + if ((pCreate->m_eType == eMonster) && !(pCreate->m_dwObjectFlags2 & 0x00000010)) + { + pCreate->m_eType = eNPC; + } + + // Flag as a housing item (hook, covenant stone, or the house itself) + if ((pCreate->m_dwIcon == 0x000020C0) || // Hook + (pCreate->m_dwIcon == 0x000020C1) || // Covenant Crystal + (pCreate->m_dwIcon == 0x0000218C) || // Covenant Crystal + (pCreate->m_dwIcon == 0x0000218D) || // Storage + (pCreate->m_dwIcon == 0x00002181) || // House + (pCreate->m_dwIcon == 0x00002182) || // House + (pCreate->m_dwIcon == 0x00002183) || // House + (pCreate->m_dwIcon == 0x00002184) || // House + (pCreate->m_dwIcon == 0x00002185) || // House + (pCreate->m_dwIcon == 0x00002186) || // House + (pCreate->m_dwIcon == 0x0000218B) || // House + (pCreate->m_dwIcon == 0x0000218E) || // House + (pCreate->m_dwIcon == 0x0000218F)) // House + { + pCreate->m_eType = eHousing; + } + + // Check if a misc item is a Foci pack + if ((pCreate->m_eType == eMisc) && (pCreate->m_strName.find("Foci of ") != std::string::npos)) + { + pCreate->m_eType = eFoci; + } + + Fire_CreateObject(pCreate->m_p); +} + + +void cWorld::DoRemoveItem(CComPtr pMembers) +{ + long nObject; + pMembers->get_NextInt(strobject, &nObject); + + _DebugLog("\n\nRemoveItem %x", nObject) ; + + // don't remove it if we don't have a record of it + if (cWorldData *pData = Data(nObject)) { + DestroyObject(pData) ; + } +} + +void cWorld::DoWieldItem(CComPtr pMembers) +{ + long nObject, nOwner; + pMembers->get_NextInt(strowner, &nOwner); + pMembers->get_NextInt(strobject, &nObject); + _DebugLog("\n\nWieldItem %x %x", nObject, nOwner) ; + + if (cWorldData *pData = Data(nObject)) + { + pData->m_dwWielder = nOwner; + pData->m_dwContainer = nOwner ; + MoveSlotBack(pData); // moves back only if player owns this item + pData->m_Slot.slot = -1; + + Fire_ChangeObject(pData->m_p, strStorageChange); + } +} + +// testing running around the world showed that after running out about 1.5 +// landblock and running back, the CreateObject event was fired again. Therefore we +// won't hold the data in our memory for those objects. Rather than measuring distance +// we count land blocks, since it is possible to be 2 blocks away and only be 1.1 clicks +// away, we cull if the landblock separation is greater than 2 +bool cWorld::OutsideCullDistance(cWorldData* data, long row, long col) +{ +// _DebugLog("\nCull Distance %d-%d, %d-%d", data->m_LandblockRow, row, +// data->m_LandblockCol, col) ; +// long x = abs(data->m_LandblockRow-row) ; +// long y = abs(data->m_LandblockCol-col) ; +// if (x>2 || y>2) { +// _DebugLog(" ") ; +// return true ; +// } +// _DebugLog(" ") ; +// return false ; + return false ; +} + +void cWorld::DoSetObjectPosition(CComPtr pMembers) +{ + long nObject; + pMembers->get_NextInt(strobject, &nObject); + // Gouru: not normally logged as we get an S load of these messages, uncomment if you + // really need it for testing... +// _DebugLog("\nSetObjectPosition %x", nObject) ; + + cWorldData *pData = Data(nObject); + + if (pData) + { + CComPtr< IMessageIterator > pPos; + pMembers->get_NextObject(strposition, &pPos); + + DWORD dwLandblock; + pPos->get_NextInt(strlandblock, (long *)&dwLandblock); + +// long oldLandblock = pData->m_dwLandblock ; +// long colLandblock = (dwLandblock>>24) & 0xff ; +// long rowLandblock = (dwLandblock>>16) & 0xff ; + // store landblock and landblock h/v values so we don't have to recalculate them + // everytime since we do this a lot + pData->m_dwLandblock = dwLandblock; + pData->m_LandblockCol = (dwLandblock>>24) & 0xff ; + pData->m_LandblockRow = (dwLandblock>>16) & 0xff ; + pPos->get_NextFloat(strxOffset, &pData->m_fxOffset); + pPos->get_NextFloat(stryOffset, &pData->m_fyOffset); + pPos->get_NextFloat(strzOffset, &pData->m_fzOffset); + pPos->get_NextFloat(strxHeading, &pData->m_fxHeading); + + // Object culling monster! + // If moving object is player, and player changed landblocks... + // if the object changed landblocks +// if (HIWORD(oldLandblock) != HIWORD(pData->m_dwLandblock)) { +// if (nObject == m_objects.player()) { +// _DebugLog("\n\nPlayer changed landblock!") ; +// // If the moving object was the player, scan all items and tag those +// // too far away with an expiration time +// for (cWorldDataMap::iterator i = m_objects.begin(); i != m_objects.end(); i++) +// { +// cWorldData *pObject = i->second; +// if (!pObject) { +// continue ; // can't process if we don't have the object... +// } +// +// // get the outmost container of this object, its landblock is used in +// // distance checking... +// cWorldData *pLbData = OuterContainer(pObject) ; +// +// // if the object moving is the player, or carried by the player +// // dont process it, it should not be culled +// if (pLbData->m_dwGUID == m_objects.player()) { +// _DebugLog("\nplayerobj: %x", pObject->m_dwGUID) ; +// continue ; +// } +// +//#ifdef LOGGING +// if (pLbData != pObject) { +// _DebugLog("object %x contained in %x", +// pObject->m_dwGUID, pLbData->m_dwGUID) ; +// } +//#endif +// // if the object is outside the culling distance +// if (OutsideCullDistance(pLbData, rowLandblock, colLandblock)) { +// // if the item is not already tagged, tag it to expire in 30 seconds +// if (!pObject->m_tExpires) { +// _DebugLog("\nculling %x", pObject->m_dwGUID) ; +// pObject->m_tExpires = time(NULL)+30 ; +// Fire_ChangeObject(pObject->m_p, strReleasePending); +// } else { +// _DebugLog("\n%x already tagged", pObject->m_dwGUID) ; +// } +// } else if (pObject->m_tExpires) { +// // else it is inside the culling distance and if tagged to expire +// // cance the expiration +// _DebugLog("\ncancelled cull %x", pObject->m_dwGUID) ; +// pObject->m_tExpires = 0 ; +// Fire_ChangeObject(pObject->m_p, strExpirationCancel); +// } +// } +// } else { +// _DebugLog("\n\nItem %x changed landblock!", nObject) ; +// // object is not a player, tag it to expire if it has moved to far away +// cWorldData* pLbData = OuterContainer(pData) ; +// cWorldData* pPlayer = Data(m_objects.player()) ; +// if ( OutsideCullDistance(pPlayer, pLbData->m_LandblockRow, pLbData->m_LandblockCol)){ +// // if not already tagged, tag it to expire +// if (!pData->m_tExpires) { +// _DebugLog("\nculling %x", pData->m_dwGUID) ; +// pData->m_tExpires = time(NULL) + 30 ; +// Fire_ChangeObject(pData->m_p, strReleasePending); +// } else { +// _DebugLog("%x already tagged", pData->m_dwGUID) ; +// } +// } else if (pData->m_tExpires) { +// _DebugLog("\ncancelled cull %x", pData->m_dwGUID) ; +// // else it is inside the culling distance and if tagged to expire +// // cancel the expiration +// pData->m_tExpires = 0 ; +// Fire_ChangeObject(pData->m_p, strExpirationCancel); +// } +// } +// } + pData->m_flags |= FLAG_LOCATION; + Fire_MovedObject(pData->m_p); + } +} + + +STDMETHODIMP cWorld::get_Inventory(IWorldIterator **pVal) +{ + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByInventory(); + pList->QueryInterface(pVal); + + return S_OK; +} + + +STDMETHODIMP cWorld::get_Landscape(IWorldIterator **pVal) +{ + CComObject< cWorldIterator > *pList; + CComObject< cWorldIterator >::CreateInstance(&pList); + + pList->Initialize(&m_objects); + pList->ByLandscape() ; + pList->QueryInterface(pVal); + + return S_OK; +} + + +STDMETHODIMP cWorld::get_NumObjectTypes(long *lVal) +{ + *lVal = (long) eNumObjectTypes; + + return S_OK; +} + + +// changes the slot of every item the specified container, of the specified type +// that is after the specified slot position, in the specified direction +void cWorld::MoveItems( + DWORD container, // the container being adjusted + CSlot Slot, // first slot to be moved + eDIR direction) // direction to move -1=Forwards, 1 = Backwards +{ + _DebugLog("\nMove item: %x s:%d t:%d %s", + container, Slot.slot, Slot.type, direction>0 ? "right" : "left") ; + + if (Slot.slot<0) { + _DebugLog(" : no move, unequipping...") ; + return ; + } + + for (cWorldDataMap::iterator iData = m_objects.begin(); iData!=m_objects.end(); iData++) + { + cWorldData& p = *(iData->second) ; + if ( p.m_dwContainer==container + && p.m_Slot.type == Slot.type + && p.m_Slot.slot >= Slot.slot) { + p.m_Slot.slot += long(direction) ; + _DebugLog("\n %02d %x %s", p.m_Slot.slot, p.m_dwGUID, p.m_strName.c_str()) ; + } + } +} + + + +void cWorld::MoveSlotBack(cWorldData *pData) +{ + if (PlayerOwns(pData)) { + MoveItems(pData->m_dwContainer, pData->m_Slot, eLeft) ; + } +} + + +cWorldData* cWorld::OuterContainer(cWorldData* object) +{ + if (!object) return NULL ; + cWorldData* rv = Data(object->m_dwContainer) ; + // if no container, return the original object + if (!rv) return object ; + // else try to get the container's container ; + cWorldData* rv2 = Data(rv->m_dwContainer) ; + // if no container's container, return the container + if (!rv2) return rv ; + // else return the containers container + return rv2 ; +} + + +bool cWorld::PlayerOwns(cWorldData* pData) +{ + if (!pData) { + _DebugLog("\nNull ptr to PlayerOwns") ; + return false ; + } + return (OuterContainer(pData)->m_dwGUID==m_objects.player()) ; +} + + +float cWorld::EastWest(long landblock, float xOffset) +{ + long n = (((landblock>>24)&0xff)-0x7f)*192 ; + return float((float(n) + xOffset - 84.0) / 240.0) ; +} + + + +float cWorld::NorthSouth(long landblock, float yOffset) +{ + long n = (((landblock>>16)&0xff)-0x7f)*192 ; + return float((float(n) + yOffset - 84.0) / 240.0) ; +} + + +void cWorld::onObjectDestroyed(long nId) +{ + _DebugLog("\nonObjectDestroyed %x", nId) ; + // if we know about this object + if (cWorldData *pData = Data(nId)) + { + bool IsPlayer = pData->m_eType==ePlayer ; + // remove it + DestroyObject(pData) ; + if (IsPlayer) { + _DebugLog("\n Remove wielded items") ; + } + } +} + +#ifdef Logging +void cWorld::_DebugLog(LPCSTR fmt, ...) +{ + static FILE *pfile ; + + if (!pfile) { + pfile = fopen("C:\\world.log", "a+") ; + fprintf(pfile,"\n------------- SESSION START -------------\n") ; + } + if (!strcmp(fmt,"CLOSEFILE") && pfile) { + fprintf(pfile,"\n------------- SESSION END -------------\n") ; + fclose(pfile) ; + pfile = NULL ; + return ; + } + + va_list argList; + va_start(argList, fmt); + vfprintf(pfile, fmt, argList) ; + va_end(argList); + fflush(pfile) ; +} +#endif diff --git a/Native/DecalFilters/World.h b/Native/DecalFilters/World.h new file mode 100644 index 0000000..bfbf35a --- /dev/null +++ b/Native/DecalFilters/World.h @@ -0,0 +1,387 @@ +// World.h : Declaration of the cWorld + +#ifndef __WORLD_H_ +#define __WORLD_H_ +#include "resource.h" // main symbols +#include "DecalFiltersCP.h" +#include "DecalNetImpl.h" +#include "WorldObject.h" +#include "..\inject\inject.h" +#include + +// remark out next line to turn off logging. +//#define Logging 1 + +#define HookDestroyObj 101 + +extern const IID EVTID_AcHooks ; + +// Template class used to connect ACHooks events +templateclass IACHooksEventsImpl +:public IDispEventImpl +{ +public: HRESULT advise(IUnknown *pUnk){return DispEventAdvise(pUnk);} + HRESULT unadvise(IUnknown *pUnk){return DispEventUnadvise(pUnk);} +}; + + +// Gouru: added structure to store slot and slot type. Containers have two types of slots +// we need to track, slots than can contain other containers, and slots that contain items +struct CSlot { + CSlot() + : slot(0) + , type(0) + {} ; + CSlot(long slot, long type) + : slot(slot) + , type(type) + {} ; + long slot ; + long type ; // 0x00 = item, 0x01 = container +}; + +enum eDIR { + eRight = 1, + eLeft = -1 +}; + +class cWorldData +{ +public: + cWorldData() + : m_Slot(0,0) + { + m_bIdentified = false; + m_dwGUID = 0; + m_dwContainer = 0; + m_dwIcon = 0; + m_dwModel = 0; + m_dwRealModel = 0; + m_fScale = 1.0f; + m_dwValue = -1; + m_dwFlags1 = 0; + m_dwFlags2 = 0; + m_dwObjectFlags1 = 0; + m_dwObjectFlags2 = 0; + m_dwLandblock = 0; + m_fxOffset = 0.0f; + m_fyOffset = 0.0f; + m_fzOffset = 0.0f; + m_fxHeading = 0.0f; + m_fyHeading = 0.0f; + m_fzHeading = 0.0f; + m_fwHeading = 0.0f; + m_DamageBonus = 0.0f; + m_nItemSlots = 0; + m_nPackSlots = 0; + m_nUsesLeft = 0; + m_nTotalUses = 0; + m_nStackCount = 0; + m_nStackMax = 0; + m_dwTradeNoteVendor = 0; + m_dwAssociatedSpell = 0; + m_tExpires = 0; + m_dwWielder = 0; // container if wielded, zero if not + m_dwWieldingSlot = 0; + m_dwMonarch = 0 ; + m_dwMaterial = 0 ; + m_dwCoverage2 = 0 ; + m_dwCoverage3 = 0 ; + m_dwEquipType = 0 ; + + m_fApproachDistance = 0.0f ; + m_Burden=0; + m_Workmanship=0.0; + m_IconOutline=0; + m_MissileType=0; + m_TotalValue=0; + m_UsageMask=0; + m_HouseOwner=0; + m_HookMask=0; + m_HookType=0; + m_bTag = false; + m_HasIdData = false ; + m_ArmorLevel = -1 ; + m_MagicDef = -1 ; + m_Spellcraft = -1 ; + m_MaximumMana = -1 ; + m_LoreReq = -1 ; + m_RankReq = -1 ; + m_SkillReq = -1 ; + m_WieldReqType = -1 ; + m_WieldReqId = -1 ; + m_WieldReq = -1 ; + m_TinkerCount = -1 ; + m_SkillReqId = -1 ; + m_SpecialProps = -1 ; + m_ManaCMod = -1 ; + m_SpellCount = 0 ; + for (int x=0; x<10; x++) m_Spell[x] = -1 ; + m_WeapSpeed = -1 ; + m_EquipSkill = -1 ; + m_DamageType = -1 ; + m_MaxDamage = -1 ; + m_Variance = -1.0 ; + m_DefenseBonus = -1.0 ; + m_AttackBonus = -1.0 ; + m_Range = -1.0 ; + m_SlashProt = -1.0 ; + m_PierceProt = -1.0 ; + m_BludProt = -1.0 ; + m_ColdProt = -1.0 ; + m_FireProt = -1.0 ; + m_ElectProt = -1.0 ; + } + + ~cWorldData() + { + } + + bool m_bIdentified; + long m_dwGUID; + long m_dwContainer; + long m_dwValue; + long m_tExpires; + long m_dwFlags1; + long m_dwFlags2; + long m_dwObjectFlags1; + long m_dwObjectFlags2; + long m_dwIcon; + long m_dwModel; + long m_dwRealModel; + float m_fScale; + long m_flags; + std::string m_strName; + std::string m_strSecondaryName ; + eObjectType m_eType; + long m_dwLandblock; + long m_LandblockRow ; // landblock row (0-255) + long m_LandblockCol ; // landblock col (0-255) + float m_fxOffset; + float m_fyOffset; + float m_fzOffset; + float m_fxHeading; + float m_fyHeading; + float m_fzHeading; + float m_fwHeading; + float m_fApproachDistance ; + float m_DamageBonus ; + BYTE m_nItemSlots; + BYTE m_nPackSlots; + WORD m_nUsesLeft; + WORD m_nTotalUses; + WORD m_nStackCount; + WORD m_nStackMax; + long m_dwTradeNoteVendor; + long m_dwAssociatedSpell; + long m_dwWielder; + long m_dwWieldingSlot; + long m_dwCoverage ; + CSlot m_Slot ; + long m_dwMonarch ; + long m_dwMaterial ; + long m_dwCoverage2 ; + long m_dwCoverage3 ; + long m_dwEquipType ; + long m_Burden ; + float m_Workmanship ; + long m_IconOutline ; + long m_MissileType ; + long m_TotalValue ; + long m_UsageMask ; + long m_HouseOwner ; + long m_HookMask ; + long m_HookType ; + bool m_HasIdData ; + long m_ArmorLevel ; + long m_MagicDef ; + long m_Spellcraft ; + long m_MaximumMana ; + long m_LoreReq ; + long m_RankReq ; + long m_SkillReq ; + long m_WieldReqType ; + long m_WieldReqId ; + long m_WieldReq ; + long m_TinkerCount ; + long m_SkillReqId ; + long m_SpecialProps ; + float m_ManaCMod ; + long m_SpellCount ; + long m_Spell[10] ; + std::string m_Inscription ; + std::string m_RaceReq ; + long m_WeapSpeed ; + long m_EquipSkill ; + long m_DamageType ; + long m_MaxDamage ; + float m_Variance ; + float m_DefenseBonus ; + float m_AttackBonus ; + float m_Range ; + float m_SlashProt ; + float m_PierceProt ; + float m_BludProt ; + float m_ColdProt ; + float m_FireProt ; + float m_ElectProt ; + float m_AcidProt ; + + CComPtr< IWorldObject > m_p; + bool m_bTag; +}; + +// Use stdext::hash_map for VC7+, std::map for VC6 +#if _MSC_VER > 1300 // VC 7.1 +class cWorldDataMap : public stdext::hash_map< DWORD, cWorldData * > +#elif _MSC_VER > 1200 // VC 7.0 +class cWorldDataMap : public std::hash_map< DWORD, cWorldData * > +#else // VC6 +class cWorldDataMap : public std::map< DWORD, cWorldData * > +#endif +{ +public: + cWorldDataMap() + { + m_player = 0; + }; + + ~cWorldDataMap() + { + for (iterator iData = begin(); iData != end(); iData++) + { + if (iData->second) + delete iData->second; + } + }; + + long player() { return m_player; }; + void player(long guid) { m_player = guid; }; +private: + long m_player; +}; + +typedef std::map< long, CSlot > cGuidAlias; + +///////////////////////////////////////////////////////////////////////////// +// cWorld +class ATL_NO_VTABLE cWorld : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public IDispatchImpl, + public IProvideClassInfo2Impl<&CLSID_World, &DIID_IWorldEvents, &LIBID_DecalFilters>, + public IACHooksEventsImpl, + public INetworkFilterImpl, + public CProxyIWorldEvents +{ +public: + cWorld(); + +public: +DECLARE_REGISTRY_RESOURCEID(IDR_WORLD) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cWorld) + COM_INTERFACE_ENTRY(IWorld) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(INetworkFilter2) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY(IConnectionPointContainer) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cWorld) +CONNECTION_POINT_ENTRY(DIID_IWorldEvents) +END_CONNECTION_POINT_MAP() + +BEGIN_SINK_MAP(cWorld) + SINK_ENTRY_EX(HookDestroyObj, EVTID_AcHooks, 1, onObjectDestroyed) +END_SINK_MAP() + +public: + cWorldData *Data(DWORD nGuid); + +private: + void MoveItems(DWORD container, CSlot Slot, eDIR direction) ; + void MoveSlotBack(cWorldData *pData); + bool PlayerOwns(cWorldData* pData) ; + bool OutsideCullDistance(cWorldData* data, long row, long col) ; + cWorldData* OuterContainer(cWorldData* obj) ; + void DestroyObject(cWorldData* pData) ; + + void FreeData(); + void ReleaseAllPendingObjects() ; + void SetHook() ; + + // AC message handlers + void DoDestroyObj(CComPtr< IMessageIterator > pMembers) ; + void DoAdjustStackSize(CComPtr pMembers) ; + void DoSetCoverage(CComPtr pMembers) ; + void DoSetContainer(CComPtr pMembers) ; + void DoGameEvent(CComPtr pMembers) ; + void DoSetObjectPosition(CComPtr pMembers) ; + void DoWieldItem(CComPtr pMembers) ; + void DoRemoveItem(CComPtr pMembers) ; + void DoCreateObject(CComPtr pMembers) ; + void DoMoveToInventory(CComPtr pMembers) ; + void DoLogin(CComPtr pMembers) ; + void DoInsertIntoInventory(CComPtr pMembers) ; + void DoSetPackContents(CComPtr pMembers) ; + void DoIdentifyObject(CComPtr pMembers) ; + void DoDropItem(CComPtr pMembers) ; + void DoWearItem(CComPtr pMembers) ; +#ifdef Logging + void DoLocalChat(CComPtr pMembers) ; +#endif + + // map to store slot information for objects when storage information is received before + // the object is created + // Gouru: changed named from m_packslots to avoid confusion with m_npackslots which + // refers to slots that can store packs... + cGuidAlias m_SlotStore ; + + long m_nNextTime; + bool m_HookIsSet ; + CComPtr< IDecal > m_pDecal ; + CComPtr< IACHooks > m_pHooks ; + + void _stdcall onObjectDestroyed(long nId); + +public: + //void SetObjectOwner(cWorldData *pData); + // IWorld + STDMETHOD(get_Inventory)(/*[out, retval]*/ IWorldIterator **pVal); + STDMETHOD(get_Landscape)(/*[out, retval]*/ IWorldIterator **pVal); + STDMETHOD(get_All)(IWorldIterator **pVal); + STDMETHOD(get_ByContainer)(long GUID, /*[out, retval]*/ IWorldIterator **pVal); + STDMETHOD(get_ByOwner)(long GUID, /*[out, retval]*/ IWorldIterator **pVal); + STDMETHOD(get_ByNameSubstring)(BSTR Substring, /*[out, retval]*/ IWorldIterator **pVal); + STDMETHOD(get_ByType)(eObjectType Type, /*[out, retval]*/ IWorldIterator **pVal); + STDMETHOD(get_ByName)(BSTR Name, /*[out, retval]*/ IWorldIterator **pVal); + STDMETHOD(get_Object)(long GUID, /*[out, retval]*/ IWorldObject **pVal); + STDMETHOD(Distance2D)(long GUID1, long GUID2, /*[out, retval]*/ float* pVal); + STDMETHOD(get_NumObjectTypes)(/*[out, retval]*/ long *lVal); + + // INetworkFilterImpl + HRESULT onTerminate(); + HRESULT onInitialize(); + + // INetworkFilter + STDMETHOD(DispatchServer)(IMessage2 *pMsg); + + cWorldDataMap m_objects; + + static float NorthSouth(long landblock, float yOffset) ; + static float EastWest(long landblock, float xOffset) ; + +#ifdef Logging + static void _DebugLog(LPCSTR, ...) ; +#else + inline static void cWorld::_DebugLog(LPCSTR fmt, ...) {} +#endif +}; + +#endif //__WORLD_H_ diff --git a/Native/DecalFilters/World.rgs b/Native/DecalFilters/World.rgs new file mode 100644 index 0000000..b5978b4 --- /dev/null +++ b/Native/DecalFilters/World.rgs @@ -0,0 +1,44 @@ +HKCR +{ + DecalFilters.World.1 = s 'World Class' + { + CLSID = s '{53092D1B-F0B0-46FF-BF11-8F031EC9B137}' + } + DecalFilters.World = s 'World Class' + { + CLSID = s '{53092D1B-F0B0-46FF-BF11-8F031EC9B137}' + CurVer = s 'DecalFilters.World.1' + } + NoRemove CLSID + { + ForceRemove {53092D1B-F0B0-46FF-BF11-8F031EC9B137} = s 'World Class' + { + ProgID = s 'DecalFilters.World.1' + VersionIndependentProgID = s 'DecalFilters.World' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} + + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove NetworkFilters + { + ForceRemove {53092D1B-F0B0-46FF-BF11-8F031EC9B137} = s 'World Object Filter' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/DecalFilters/WorldIterator.cpp b/Native/DecalFilters/WorldIterator.cpp new file mode 100644 index 0000000..a6dfd8d --- /dev/null +++ b/Native/DecalFilters/WorldIterator.cpp @@ -0,0 +1,190 @@ +// WorldIterator.cpp : Implementation of cWorldIterator +#include "stdafx.h" +#include "DecalFilters.h" +#include "World.h" +#include "WorldIterator.h" + +///////////////////////////////////////////////////////////////////////////// +// cWorldIterator + + +STDMETHODIMP cWorldIterator::get_Next_Old(IWorldObject **pVal) +{ + return get_Next(pVal, NULL); +} + +STDMETHODIMP cWorldIterator::Reset() +{ + m_i = m_objects->begin(); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::get_Count(long *pVal) +{ + int nCount; + cWorldDataMap::iterator iSave = m_i; + + m_i = m_objects->begin(); + + for (nCount = 0; get_Next(NULL, NULL) == S_OK; nCount++); + *pVal = nCount; + + m_i = iSave; + + return S_OK; +} + + +STDMETHODIMP cWorldIterator::get_Quantity(long *pVal) +{ + long nCount=0; + cWorldDataMap::iterator iSave = m_i; + + IWorldObject* pObject = NULL ; + + m_i = m_objects->begin(); + + while (get_Next(&pObject, NULL) == S_OK) { + if (pObject) { + long x ; + pObject->get_StackMax(&x) ; + if (x) { + pObject->get_StackCount(&x) ; // stackable, get number in stack + } else { + x=1 ; // not stackable, so only count as one + } + nCount += x ; + } + } + + *pVal = nCount; + + m_i = iSave; + + return S_OK; +} + + +STDMETHODIMP cWorldIterator::get_Next(IWorldObject **ppObject, VARIANT_BOOL *pVal) +{ + while (m_i != m_objects->end()) + { + for (cMatchList::iterator i = m_compares.begin(); i != m_compares.end(); i++) + { + // if our match fails, try next object + if (!(*i)->match(m_i)) + goto next; + } + + if (pVal) { + *pVal = VARIANT_TRUE; + } + + if (ppObject) { + // Gouru: moved to release ONLY if we are setting a new value... + // release incoming object so get_Next can be used in a loop + if (*ppObject && *ppObject != (IWorldObject *)this) { + (*ppObject)->Release(); + } + m_i->second->m_p->QueryInterface(ppObject); + } + + m_i++; + return S_OK; + +next: + m_i++; + } + + if (pVal) + *pVal = VARIANT_FALSE; + + return S_FALSE; +} + +STDMETHODIMP cWorldIterator::Pop() +{ + if (!m_compares.empty()) + { + cMatch *pMatch = m_compares.back(); + delete pMatch; + m_compares.pop_back(); + } + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByName(BSTR strName) +{ + USES_CONVERSION; + + cMatch *pMatch = new cMatchName(m_objects, std::string(OLE2A(strName))); + m_compares.push_back(pMatch); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByNameSubstring(BSTR strSubstring) +{ + USES_CONVERSION; + + cMatch *pMatch = new cMatchNameSubstring(m_objects, std::string(OLE2A(strSubstring))); + m_compares.push_back(pMatch); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByType(enum eObjectType Type) +{ + cMatch *pMatch = new cMatchType(m_objects, Type); + m_compares.push_back(pMatch); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByContainer(long nContainer) +{ + cMatch *pMatch = new cMatchContainer(m_objects, nContainer); + m_compares.push_back(pMatch); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByInventory() +{ + cMatch *pMatch = new cMatchInventory(m_objects); + m_compares.push_back(pMatch); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByLandscape() +{ + cMatch *pMatch = new cMatchLandscape(m_objects); + m_compares.push_back(pMatch); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByOwner(long nOwner) +{ + cMatch *pMatch = new cMatchOwner(m_objects, nOwner); + m_compares.push_back(pMatch); + + return S_OK; +} + +STDMETHODIMP cWorldIterator::ByAll() +{ + cMatch *pMatch = new cMatchAll(m_objects); + m_compares.push_back(pMatch); + + return S_OK; +} + +void cWorldIterator::Initialize(cWorldDataMap *pMap) +{ + m_objects = pMap; + m_i = m_objects->begin(); +} diff --git a/Native/DecalFilters/WorldIterator.h b/Native/DecalFilters/WorldIterator.h new file mode 100644 index 0000000..8166300 --- /dev/null +++ b/Native/DecalFilters/WorldIterator.h @@ -0,0 +1,201 @@ +// WorldIterator.h : Declaration of the cWorldIterator + +#ifndef __WORLDITERATOR_H_ +#define __WORLDITERATOR_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cWorldIterator +class ATL_NO_VTABLE cWorldIterator : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + cWorldIterator() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_WORLDITERATOR) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cWorldIterator) + COM_INTERFACE_ENTRY(IWorldIterator) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +public: + class cMatch + { + public: + cMatch() {}; + virtual ~cMatch() {}; + + virtual bool match(cWorldDataMap::iterator i) = 0; + virtual cWorldDataMap::iterator end() = 0; + virtual cWorldDataMap::iterator begin() = 0; + virtual void reset() {}; + }; + + class cMatchName : public cMatch + { + private: + cWorldDataMap *m_list; + std::string m_name; + public: + cMatchName(cWorldDataMap *list, std::string name) : m_list(list), m_name(name) {}; + virtual bool match(cWorldDataMap::iterator i) { + cWorldData *pData = i->second; + return (!m_name.compare(pData->m_strName)); + }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + class cMatchNameSubstring : public cMatch + { + private: + cWorldDataMap *m_list; + std::string m_name; + public: + cMatchNameSubstring(cWorldDataMap *list, std::string name) : m_list(list), m_name(name) {}; + virtual bool match(cWorldDataMap::iterator i) { + cWorldData *pData = i->second; + return (pData->m_strName.find(m_name, 0) != std::string::npos); + }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + class cMatchContainer : public cMatch + { + private: + cWorldDataMap *m_list; + long m_container; + public: + cMatchContainer(cWorldDataMap *list, long container) : m_list(list), m_container(container) { }; + virtual bool match(cWorldDataMap::iterator i) { + cWorldData *pData = i->second; + return (m_container == pData->m_dwContainer); + }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + class cMatchLandscape : public cMatch + { + private: + cWorldDataMap *m_list; + + public: + cMatchLandscape(cWorldDataMap *list) : m_list(list) {}; + virtual bool match(cWorldDataMap::iterator i) { + cWorldData *pData = i->second ; + if (pData->m_dwContainer == 0) return true ; + return false ; + }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + class cMatchType : public cMatch + { + private: + cWorldDataMap *m_list; + eObjectType m_type; + public: + cMatchType(cWorldDataMap *list, eObjectType type) : m_list(list), m_type(type) {}; + virtual bool match(cWorldDataMap::iterator i) { + cWorldData *pData = i->second; + return (m_type == pData->m_eType); + }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + class cMatchInventory : public cMatch + { + private: + cWorldDataMap *m_list; + + public: + cMatchInventory(cWorldDataMap *list) : m_list(list) {}; + virtual bool match(cWorldDataMap::iterator i) { + cWorldData *pData = i->second ; + if (pData->m_dwContainer == m_list->player()) return true ; + cWorldDataMap::iterator iData = m_list->find(pData->m_dwContainer); + if (iData != m_list->end()) { + return iData->second->m_dwContainer == m_list->player() ; + } + return false ; + }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + class cMatchOwner : public cMatch + { + private: + cWorldDataMap *m_list; + long m_owner; + public: + cMatchOwner(cWorldDataMap *list, long owner) : m_list(list), m_owner(owner) { }; + virtual bool match(cWorldDataMap::iterator i) { + cWorldData *pData = i->second ; + if (pData->m_dwContainer == m_owner) return true ; + cWorldDataMap::iterator iData = m_list->find(pData->m_dwContainer); + if (iData != m_list->end()) { + return iData->second->m_dwContainer == m_owner ; + } + return false ; + }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + class cMatchAll : public cMatch + { + private: + cWorldDataMap *m_list; + public: + cMatchAll(cWorldDataMap *list) : m_list(list) {}; + virtual bool match(cWorldDataMap::iterator i) { return true; }; + virtual cWorldDataMap::iterator end() { return m_list->end(); }; + virtual cWorldDataMap::iterator begin() { return m_list->begin(); }; + }; + + typedef std::list< cMatch * > cMatchList; + + ~cWorldIterator() + { + for (cMatchList::iterator i = m_compares.begin(); i != m_compares.end(); i++) + delete (*i); + } + + // IWorldIterator + void Initialize(cWorldDataMap *pMap); + + STDMETHOD(ByAll)(); + STDMETHOD(ByInventory)(); + STDMETHOD(ByLandscape)(); + STDMETHOD(ByContainer)(long nContainer); + STDMETHOD(ByOwner)(long nOwner); + STDMETHOD(ByNameSubstring)(BSTR strSubstring); + STDMETHOD(ByName)(BSTR strName); + STDMETHOD(ByType)(enum eObjectType Type); + + STDMETHOD(Pop)(); + STDMETHOD(Reset)(); + + STDMETHOD(get_Next)(/*[out]*/ IWorldObject **ppObject, /*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Next_Old)(/*[out, retval]*/ IWorldObject **pVal); + STDMETHOD(get_Quantity)(/*[out, retval]*/ long *pVal); + + cWorldDataMap *m_objects; + cWorldDataMap::iterator m_i; + cMatchList m_compares; +}; + +#endif //__WORLDITERATOR_H_ diff --git a/Native/DecalFilters/WorldIterator.rgs b/Native/DecalFilters/WorldIterator.rgs new file mode 100644 index 0000000..329d35a --- /dev/null +++ b/Native/DecalFilters/WorldIterator.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalFilters.WorldIterator.1 = s 'WorldIterator Class' + { + CLSID = s '{2681B113-294E-4ABF-B543-624194846BE1}' + } + DecalFilters.WorldIterator = s 'WorldIterator Class' + { + CLSID = s '{2681B113-294E-4ABF-B543-624194846BE1}' + CurVer = s 'DecalFilters.WorldIterator.1' + } + NoRemove CLSID + { + ForceRemove {2681B113-294E-4ABF-B543-624194846BE1} = s 'WorldIterator Class' + { + ProgID = s 'DecalFilters.WorldIterator.1' + VersionIndependentProgID = s 'DecalFilters.WorldIterator' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} diff --git a/Native/DecalFilters/WorldObject.cpp b/Native/DecalFilters/WorldObject.cpp new file mode 100644 index 0000000..31fc0c9 --- /dev/null +++ b/Native/DecalFilters/WorldObject.cpp @@ -0,0 +1,674 @@ +// WorldObject.cpp : Implementation of cWorldObject +#include "stdafx.h" +#include "DecalFilters.h" +#include "World.h" +#include "WorldObject.h" +#include ".\worldobject.h" + +///////////////////////////////////////////////////////////////////////////// +// cWorldObject + +cWorldObject::~cWorldObject() +{ +} + + +HRESULT cWorldObject::GetLong(long val, long *ret) +{ + if (!ret) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *ret = val ; + return S_OK ; +} + + +STDMETHODIMP cWorldObject::get_GUID(long *pVal) +{ + return GetLong(m_p->m_dwGUID, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Model(long *pVal) +{ + return GetLong(m_p->m_dwModel, pVal) ; +} + +STDMETHODIMP cWorldObject::get_RealModel(LONG* pVal) +{ + return GetLong(m_p->m_dwRealModel, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Icon(long *pVal) +{ + return GetLong(m_p->m_dwIcon, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Name(BSTR *pVal) +{ + USES_CONVERSION; + + if(!pVal) + { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = T2BSTR(m_p->m_strName.c_str()); + + return S_OK; +} + +STDMETHODIMP cWorldObject::get_SecondaryName(BSTR *pVal) +{ + USES_CONVERSION; + + if(!pVal) + { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = T2BSTR(m_p->m_strSecondaryName.c_str()); + + return S_OK; +} + +STDMETHODIMP cWorldObject::get_Value(long *pVal) +{ + return GetLong(m_p->m_dwValue, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Container(long *pVal) +{ + return GetLong(m_p->m_dwContainer, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Landblock(long *pVal) +{ + HRESULT hr = GetLong(m_p->m_dwLandblock, pVal) ; + hr = (hr==S_OK && (m_p->m_flags & FLAG_LOCATION)) ? S_OK : S_FALSE ; + return hr ; +} + +STDMETHODIMP cWorldObject::get_Offset(float *x, float *y, float *z, short *pVal) +{ + if(!pVal || !x || !y || !z) + { + _ASSERT(FALSE); + return E_POINTER; + } + + HRESULT hr = S_OK ; + if (m_p->m_flags & FLAG_LOCATION) { + *pVal = true; + *x = m_p->m_fxOffset; + *y = m_p->m_fyOffset; + *z = m_p->m_fzOffset; + } else { + *pVal = false; + *x = 0; + *y = 0; + *z = 0; + hr = S_FALSE; + } + return hr ; +} + + +STDMETHODIMP cWorldObject::get_Heading(float *x, float *y, float *z, float *w, short *pVal) +{ + if(!pVal || !x || !y || !z || !w) + { + _ASSERT(FALSE); + return E_POINTER; + } + HRESULT hr = S_OK ; + if (m_p->m_flags & FLAG_LOCATION) { + *pVal = true; + // Gouru: modified so that x, y, and z are current position information, there is + // no such thing as x,y,z heading information from the server. + *x = m_p->m_fxOffset; + *y = m_p->m_fyOffset; + *z = m_p->m_fzOffset; + *w = m_p->m_fwHeading; + } else { + *pVal = false; + *x = 0; + *y = 0; + *z = 0; + *w = 0; + hr = S_FALSE; + } + return hr ; +} + +STDMETHODIMP cWorldObject::get_Type(eObjectType *pVal) +{ + if(!pVal) + { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = m_p->m_eType; + return S_OK; +} + +STDMETHODIMP cWorldObject::get_ItemSlots(long *pVal) +{ + return GetLong(m_p->m_nItemSlots, pVal) ; +} + +STDMETHODIMP cWorldObject::get_PackSlots(long *pVal) +{ + return GetLong(m_p->m_nPackSlots, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Lockable(VARIANT_BOOL *pVal) +{ + if(!pVal) { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = (m_p->m_flags & FLAG_LOCKABLE) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cWorldObject::get_Inscribable(VARIANT_BOOL *pVal) +{ + if(!pVal) { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = (m_p->m_flags & FLAG_INSCRIBABLE) ? VARIANT_TRUE : VARIANT_FALSE ; + return S_OK; +} + + +STDMETHODIMP cWorldObject::get_UsesLeft(long *pVal) +{ + return GetLong(m_p->m_nUsesLeft, pVal) ; +} + +STDMETHODIMP cWorldObject::get_TotalUses(long *pVal) +{ + return GetLong(m_p->m_nTotalUses, pVal) ; +} + +STDMETHODIMP cWorldObject::get_StackCount(long *pVal) +{ + return GetLong(m_p->m_nStackCount, pVal) ; +} + +STDMETHODIMP cWorldObject::get_StackMax(long *pVal) +{ + return GetLong(m_p->m_nStackMax, pVal) ; +} + +STDMETHODIMP cWorldObject::get_TradeNoteVendor(long *pVal) +{ + return GetLong(m_p->m_dwTradeNoteVendor, pVal) ; +} + +STDMETHODIMP cWorldObject::get_AssociatedSpell(long *pVal) +{ + return GetLong(m_p->m_dwAssociatedSpell, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Slot(long *pVal) +{ + return GetLong(m_p->m_Slot.slot, pVal) ; +} + +// Gouru: call maintained for backwards compatability. Owner will always be the same +// as the container. If you want the player that owns this item, +STDMETHODIMP cWorldObject::get_Owner(long *pVal) +{ + return GetLong(m_p->m_dwContainer, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Wielder(long *pVal) +{ + return GetLong(m_p->m_dwWielder, pVal) ; +} + +STDMETHODIMP cWorldObject::get_WieldingSlot(long *pVal) +{ + return GetLong(m_p->m_dwWieldingSlot, pVal) ; +} + + +// Gouru: this method should NEVER be implemented. It requires knowledge of the location of +// other objects. And since it is easily computed from the coordinates returned by +// get_Coordinates, this seems like a major waste. Method however is still here to avoid +// breaking the interface. +STDMETHODIMP cWorldObject::get_Distance(float *NorthSouth, float *EastWest, VARIANT_BOOL *pVal) +{ + return E_NOTIMPL ; +} + + +STDMETHODIMP cWorldObject::get_Coordinates(float *NorthSouth, float *EastWest, VARIANT_BOOL *pVal) +{ + // code based on algorithm from GKusnick + if (NorthSouth==NULL || EastWest==NULL ) { + _ASSERT(FALSE); + if (pVal) *pVal = VARIANT_FALSE ; + return E_POINTER ; + } + + *NorthSouth = cWorld::NorthSouth(m_p->m_dwLandblock, m_p->m_fyOffset) ; + *EastWest = cWorld::EastWest(m_p->m_dwLandblock, m_p->m_fxOffset) ; + + if (pVal) *pVal = VARIANT_TRUE ; + + return S_OK ; +} + +// Exposes the raw coordinate data as sent by the server, for those who prefer to do their own calcs. +STDMETHODIMP cWorldObject::get_RawCoordinates(float *pX, float *pY, float *pZ, VARIANT_BOOL *pVal) +{ + if (pX==NULL || pY==NULL ) { + _ASSERT(FALSE); + if (pVal) *pVal = VARIANT_FALSE ; + return E_POINTER ; + } + + *pX = m_p->m_fxOffset; + *pY = m_p->m_fyOffset; + + if (pZ) + { + *pZ = m_p->m_fzOffset; + } + + if (pVal) + { + *pVal = VARIANT_TRUE ; + } + + return S_OK ; +} + + +STDMETHODIMP cWorldObject::get_Scale(float* pVal) +{ + *pVal = m_p->m_fScale; + return S_OK; +} + +STDMETHODIMP cWorldObject::get_Flags(long *pVal) +{ + return GetLong(m_p->m_flags, pVal) ; +} + +STDMETHODIMP cWorldObject::get_CreateFlags1(long *pVal) +{ + return GetLong(m_p->m_dwFlags1, pVal) ; +} + +STDMETHODIMP cWorldObject::get_CreateFlags2(long *pVal) +{ + return GetLong(m_p->m_dwFlags2, pVal) ; +} + +STDMETHODIMP cWorldObject::get_ObjectFlags1(long *pVal) +{ + return GetLong(m_p->m_dwObjectFlags1, pVal) ; +} + +STDMETHODIMP cWorldObject::get_ObjectFlags2(long *pVal) +{ + return GetLong(m_p->m_dwObjectFlags2, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Monarch(long *pVal) { + return GetLong(m_p->m_dwMonarch, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Material(long *pVal) { + return GetLong(m_p->m_dwMaterial, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Coverage(long *pVal) { + return GetLong(m_p->m_dwCoverage, pVal) ; +} + + +STDMETHODIMP cWorldObject::get_Coverage2(long *pVal) { + return GetLong(m_p->m_dwCoverage2, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Coverage3(long *pVal) { + return GetLong(m_p->m_dwCoverage3, pVal) ; +} + +STDMETHODIMP cWorldObject::get_EquipType(long *pVal) { + return GetLong(m_p->m_dwEquipType, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Burden(long *pVal) { + return GetLong(m_p->m_Burden, pVal) ; +} + +STDMETHODIMP cWorldObject::get_IconOutline(long *pVal) { + return GetLong(m_p->m_IconOutline, pVal) ; +} + +STDMETHODIMP cWorldObject::get_MissileType(long *pVal) { + return GetLong(m_p->m_MissileType, pVal) ; +} + +STDMETHODIMP cWorldObject::get_TotalValue(long *pVal) { + return GetLong(m_p->m_TotalValue, pVal) ; +} + +STDMETHODIMP cWorldObject::get_UsageMask(long *pVal) { + return GetLong(m_p->m_UsageMask, pVal) ; +} + +STDMETHODIMP cWorldObject::get_HouseOwner(long *pVal) { + return GetLong(m_p->m_HouseOwner, pVal) ; +} + +STDMETHODIMP cWorldObject::get_HookMask(long *pVal) { + return GetLong(m_p->m_HookMask, pVal) ; +} + +STDMETHODIMP cWorldObject::get_HookType(long *pVal) { + return GetLong(m_p->m_HookType, pVal) ; +} + +STDMETHODIMP cWorldObject::get_ApproachDistance(float *pVal) { + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_fApproachDistance ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_Workmanship(float *pVal) { + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_Workmanship ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_HasIdData(VARIANT_BOOL *pVal) +{ + if(!pVal) { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = m_p->m_HasIdData ; + return S_OK; +} + +STDMETHODIMP cWorldObject::get_ArmorLevel(long *pVal) +{ + return GetLong(m_p->m_ArmorLevel, pVal) ; +} + +STDMETHODIMP cWorldObject::get_MagicDef(long *pVal) +{ + return GetLong(m_p->m_MagicDef, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Spellcraft(long *pVal) +{ + return GetLong(m_p->m_Spellcraft, pVal) ; +} + +STDMETHODIMP cWorldObject::get_MaximumMana(long *pVal) +{ + return GetLong(m_p->m_MaximumMana, pVal) ; +} + +STDMETHODIMP cWorldObject::get_LoreReq(long *pVal) +{ + return GetLong(m_p->m_LoreReq, pVal) ; +} + +STDMETHODIMP cWorldObject::get_RankReq(long *pVal) +{ + return GetLong(m_p->m_RankReq, pVal) ; +} + +STDMETHODIMP cWorldObject::get_SkillReq(long *pVal) +{ + return GetLong(m_p->m_SkillReq, pVal) ; +} + +STDMETHODIMP cWorldObject::get_WieldReqType(long *pVal) +{ + return GetLong(m_p->m_WieldReqType, pVal) ; +} + +STDMETHODIMP cWorldObject::get_WieldReqId(long *pVal) +{ + return GetLong(m_p->m_WieldReqId, pVal) ; +} + +STDMETHODIMP cWorldObject::get_WieldReq(long *pVal) +{ + return GetLong(m_p->m_WieldReq, pVal) ; +} + +STDMETHODIMP cWorldObject::get_TinkerCount(long *pVal) +{ + return GetLong(m_p->m_TinkerCount, pVal) ; +} + +STDMETHODIMP cWorldObject::get_SkillReqId(long *pVal) +{ + return GetLong(m_p->m_SkillReqId, pVal) ; +} + +STDMETHODIMP cWorldObject::get_SpecialProps(long *pVal) +{ + return GetLong(m_p->m_SpecialProps, pVal) ; +} + +STDMETHODIMP cWorldObject::get_ManaCMod(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_ManaCMod ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_SpellCount(long *pVal) +{ + return GetLong(m_p->m_SpellCount, pVal) ; +} + +STDMETHODIMP cWorldObject::get_Spell(long ix, long *pVal) +{ + return GetLong(m_p->m_Spell[ix], pVal) ; +} + +STDMETHODIMP cWorldObject::get_Inscription(BSTR *pVal) +{ + USES_CONVERSION; + + if(!pVal) + { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = T2BSTR(m_p->m_Inscription.c_str()); + + return S_OK; +} + +STDMETHODIMP cWorldObject::get_RaceReq(BSTR *pVal) +{ + USES_CONVERSION; + + if(!pVal) + { + _ASSERT(FALSE); + return E_POINTER; + } + + *pVal = T2BSTR(m_p->m_RaceReq.c_str()); + + return S_OK; +} + +STDMETHODIMP cWorldObject::get_WeapSpeed(long *pVal) +{ + return GetLong(m_p->m_WeapSpeed, pVal) ; +} + +STDMETHODIMP cWorldObject::get_EquipSkill(long *pVal) +{ + return GetLong(m_p->m_EquipSkill, pVal) ; +} + +STDMETHODIMP cWorldObject::get_DamageType(long *pVal) +{ + return GetLong(m_p->m_DamageType, pVal) ; +} + +STDMETHODIMP cWorldObject::get_MaxDamage(long *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_MaxDamage ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_Variance(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_Variance ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_DefenseBonus(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_DefenseBonus ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_AttackBonus(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_AttackBonus ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_Range(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_Range ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_SlashProt(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_SlashProt ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_PierceProt(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_PierceProt ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_BludProt(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_BludProt ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_ColdProt(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_ColdProt ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_FireProt(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_FireProt ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_ElectProt(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_ElectProt ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_AcidProt(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_AcidProt ; + return S_OK ; +} + +STDMETHODIMP cWorldObject::get_DamageBonus(float *pVal) +{ + if (!pVal) { + _ASSERT(FALSE) ; + return E_POINTER ; + } + *pVal = m_p->m_DamageBonus ; + return S_OK ; +} + diff --git a/Native/DecalFilters/WorldObject.h b/Native/DecalFilters/WorldObject.h new file mode 100644 index 0000000..09a3298 --- /dev/null +++ b/Native/DecalFilters/WorldObject.h @@ -0,0 +1,138 @@ +// WorldObject.h : Declaration of the cWorldObject + +#ifndef __WORLDOBJECT_H_ +#define __WORLDOBJECT_H_ + +#include "resource.h" // main symbols + +#define FLAG_STACKABLE 0x00000001 +#define FLAG_LOCATION 0x00000002 +#define FLAG_LOCKABLE 0x00000004 +#define FLAG_INSCRIBABLE 0x00000010 +#define FLAG_USEABLE 0x00000020 +#define FLAG_HASSPELL 0x00000040 +#define FLAG_CONTAINS 0x00000080 + +class cWorld; +class cWorldData; + +///////////////////////////////////////////////////////////////////////////// +// cWorldObject +class ATL_NO_VTABLE cWorldObject : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl, + public IWorldObject2 +{ +public: + cWorldObject() + { + } + virtual ~cWorldObject(); + +DECLARE_REGISTRY_RESOURCEID(IDR_WORLDOBJECT) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cWorldObject) + COM_INTERFACE_ENTRY(IWorldObject) + COM_INTERFACE_ENTRY2(IDispatch, IWorldObject) + COM_INTERFACE_ENTRY(IWorldObject2) +END_COM_MAP() + +private: + HRESULT GetLong(long val, long *ret) ; +public: + // IWorldObject + STDMETHOD(get_Coordinates)(/*[in, out]*/ float *NorthSouth, /*[in, out]*/ float *EastWest, /*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_RawCoordinates)(/*[in, out]*/ float *pX, /*[in, out]*/ float *pY, /*[in, out]*/ float *pZ, /*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_Distance)(float *NorthSouth, float *EastWest, /*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_WieldingSlot)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Wielder)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Owner)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Slot)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_AssociatedSpell)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_StackMax)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_StackCount)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_TotalUses)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_UsesLeft)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Inscribable)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_Lockable)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_PackSlots)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_ItemSlots)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Type)(/*[out, retval]*/ eObjectType *pVal); + STDMETHOD(get_Heading)(float *x, float *y, float *z, float *w, /*[out, retval]*/ short *pVal); + STDMETHOD(get_Offset)(float *x, float *y, float *z, /*[out, retval]*/ short *pVal); + STDMETHOD(get_Landblock)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Container)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Value)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Icon)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Model)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_GUID)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Monarch)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Material)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Coverage)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Coverage2)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Coverage3)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_TradeNoteVendor)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_EquipType)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_SecondaryName)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_ApproachDistance)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_Workmanship)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_Burden)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_IconOutline)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MissileType)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_TotalValue)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_UsageMask)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_HouseOwner)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_HookMask)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_HookType)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_RealModel)(/*[out, retval]*/long *pVal); + STDMETHOD(get_Scale)(/*[out, retval]*/float *pVal); + STDMETHOD(get_HasIdData)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_ArmorLevel)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MagicDef)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Spellcraft)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MaximumMana)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_LoreReq)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_RankReq)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_SkillReq)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_WieldReqType)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_WieldReqId)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_WieldReq)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_TinkerCount)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_SkillReqId)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_SpecialProps)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_ManaCMod)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_SpellCount)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Spell)(long index, /*[out, retval]*/ long *pVal); + STDMETHOD(get_Inscription)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_WeapSpeed)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_EquipSkill)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_DamageType)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MaxDamage)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Variance)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_DefenseBonus)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_AttackBonus)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_Range)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_SlashProt)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_PierceProt)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_BludProt)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_ColdProt)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_FireProt)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_ElectProt)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_AcidProt)(/*[out, retval]*/ float *pVal); + STDMETHOD(get_RaceReq)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_DamageBonus)(/*[out, retval]*/ float *pVal); + + // IWorldObject2 + STDMETHOD(get_Flags)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_CreateFlags1)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_CreateFlags2)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_ObjectFlags1)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_ObjectFlags2)(/*[out, retval]*/ long *pVal); + + cWorldData *m_p; +}; + +#endif //__WORLDOBJECT_H_ diff --git a/Native/DecalFilters/WorldObject.rgs b/Native/DecalFilters/WorldObject.rgs new file mode 100644 index 0000000..5efc6c1 --- /dev/null +++ b/Native/DecalFilters/WorldObject.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalFilters.WorldObject.1 = s 'WorldObject Class' + { + CLSID = s '{50A7E9EC-AB12-4484-9C28-C2A39274A636}' + } + DecalFilters.WorldObject = s 'WorldObject Class' + { + CLSID = s '{50A7E9EC-AB12-4484-9C28-C2A39274A636}' + CurVer = s 'DecalFilters.WorldObject.1' + } + NoRemove CLSID + { + ForceRemove {50A7E9EC-AB12-4484-9C28-C2A39274A636} = s 'WorldObject Class' + { + ProgID = s 'DecalFilters.WorldObject.1' + VersionIndependentProgID = s 'DecalFilters.WorldObject' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}' + } + } +} diff --git a/Native/DecalFilters/resource.h b/Native/DecalFilters/resource.h new file mode 100644 index 0000000..1ef2741 --- /dev/null +++ b/Native/DecalFilters/resource.h @@ -0,0 +1,28 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by DecalFilters.rc +// +#define IDS_PROJNAME 100 +#define IDR_INVENTORY 101 +#define IDR_INVENTORYITEM 102 +#define IDR_WORLD 103 +#define IDR_WORLDOBJECT 104 +#define IDR_STACKABLE 107 +#define IDR_LOCATION 108 +#define IDR_WORLDITERATOR 109 +#define IDR_IDENTIFYQUEUE 110 +#define IDR_ECHOFILTER 202 +#define IDR_CHARACTERSTATS 204 +#define IDR_PREFILTER 205 +#define IDR_ECHOFILTER2 207 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 208 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 111 +#endif +#endif diff --git a/Native/DecalInput/DecalInput.cpp b/Native/DecalInput/DecalInput.cpp new file mode 100644 index 0000000..48aacdf --- /dev/null +++ b/Native/DecalInput/DecalInput.cpp @@ -0,0 +1,91 @@ +// DecalInput.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f DecalInputps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "DecalInput.h" + +#include "DecalInput_i.c" +#include "InputService.h" +#include "Timer.h" +#include "Hotkey.h" +#include "WinMsgHook.h" +#include "InputBuffer.h" +#include "TypeAction.h" +#include "MouseMoveAction.h" +#include "DelayAction.h" +#include "EventAction.h" +#include "PolledDelayAction.h" +#include "RestoreAction.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_InputService, cInputService) +OBJECT_ENTRY(CLSID_Timer, cTimer) +OBJECT_ENTRY(CLSID_Hotkey, cHotkey) +OBJECT_ENTRY(CLSID_WinMsgHook, cWinMsgHook) +OBJECT_ENTRY(CLSID_InputBuffer, cInputBuffer) +OBJECT_ENTRY(CLSID_TypeAction, cTypeAction) +OBJECT_ENTRY(CLSID_MouseMoveAction, cMouseMoveAction) +OBJECT_ENTRY(CLSID_DelayAction, cDelayAction) +OBJECT_ENTRY(CLSID_EventAction, cEventAction) +OBJECT_ENTRY(CLSID_PolledDelayAction, cPolledDelayAction) +OBJECT_ENTRY(CLSID_RestoreAction, cRestoreAction) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_DecalInput); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + + diff --git a/Native/DecalInput/DecalInput.def b/Native/DecalInput/DecalInput.def new file mode 100644 index 0000000..8a8b2db --- /dev/null +++ b/Native/DecalInput/DecalInput.def @@ -0,0 +1,9 @@ +; DecalInput.def : Declares the module parameters. + +LIBRARY "DecalInput.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Native/DecalInput/DecalInput.dsp b/Native/DecalInput/DecalInput.dsp new file mode 100644 index 0000000..b3a2d32 --- /dev/null +++ b/Native/DecalInput/DecalInput.dsp @@ -0,0 +1,393 @@ +# Microsoft Developer Studio Project File - Name="DecalInput" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=DecalInput - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "DecalInput.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "DecalInput.mak" CFG="DecalInput - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "DecalInput - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalInput - Win32 Unicode Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalInput - Win32 Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalInput - Win32 Unicode Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "DecalInput - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /Ob0 /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\sb\source\Debug\DecalInput.dll +InputPath=\sb\source\Debug\DecalInput.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalInput - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "DebugU" +# PROP BASE Intermediate_Dir "DebugU" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "DebugU" +# PROP Intermediate_Dir "DebugU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\DebugU +TargetPath=.\DebugU\DecalInput.dll +InputPath=.\DebugU\DecalInput.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + if "%OS%"=="" goto NOTNT + if not "%OS%"=="Windows_NT" goto NOTNT + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + goto end + :NOTNT + echo Warning : Cannot register Unicode DLL on Windows 95 + :end + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalInput - Win32 Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinSize" +# PROP BASE Intermediate_Dir "ReleaseMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "_MBCS" /D "_ATL_DLL" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\sb\source\Release\DecalInput.dll +InputPath=\sb\source\Release\DecalInput.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalInput - Win32 Unicode Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseUMinSize" +# PROP BASE Intermediate_Dir "ReleaseUMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ReleaseUMinSize" +# PROP Intermediate_Dir "ReleaseUMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /Zi /O1 /I "..\Include" /D "_UNICODE" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib version.lib winmm.lib libctiny.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\ReleaseUMinSize +TargetPath=.\ReleaseUMinSize\DecalInput.dll +InputPath=.\ReleaseUMinSize\DecalInput.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + if "%OS%"=="" goto NOTNT + if not "%OS%"=="Windows_NT" goto NOTNT + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + goto end + :NOTNT + echo Warning : Cannot register Unicode DLL on Windows 95 + :end + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "DecalInput - Win32 Debug" +# Name "DecalInput - Win32 Unicode Debug" +# Name "DecalInput - Win32 Release MinSize" +# Name "DecalInput - Win32 Unicode Release MinSize" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\DecalInput.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalInput.def +# End Source File +# Begin Source File + +SOURCE=..\Include\DecalInput.idl +# ADD MTL /tlb "DecalInput.tlb" /h "..\Include\DecalInput.h" /iid "..\Include\DecalInput_i.c" +# End Source File +# Begin Source File + +SOURCE=.\DecalInput.rc +# End Source File +# Begin Source File + +SOURCE=.\DelayAction.cpp +# End Source File +# Begin Source File + +SOURCE=.\EventAction.cpp +# End Source File +# Begin Source File + +SOURCE=.\Hotkey.cpp +# End Source File +# Begin Source File + +SOURCE=.\InputBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=.\InputService.cpp +# End Source File +# Begin Source File + +SOURCE=.\MouseMoveAction.cpp +# End Source File +# Begin Source File + +SOURCE=.\PolledDelayAction.cpp +# End Source File +# Begin Source File + +SOURCE=.\RestoreAction.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\Timer.cpp +# End Source File +# Begin Source File + +SOURCE=.\TypeAction.cpp +# End Source File +# Begin Source File + +SOURCE=.\WinMsgHook.cpp +# End Source File +# Begin Source File + +SOURCE=.\WndMsg.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\DecalInputCP.h +# End Source File +# Begin Source File + +SOURCE=..\Include\DecalInputImpl.h +# End Source File +# Begin Source File + +SOURCE=.\DelayAction.h +# End Source File +# Begin Source File + +SOURCE=.\EventAction.h +# End Source File +# Begin Source File + +SOURCE=.\Hotkey.h +# End Source File +# Begin Source File + +SOURCE=.\InputBuffer.h +# End Source File +# Begin Source File + +SOURCE=.\InputService.h +# End Source File +# Begin Source File + +SOURCE=.\MouseMoveAction.h +# End Source File +# Begin Source File + +SOURCE=.\PolledDelayAction.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\RestoreAction.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\Timer.h +# End Source File +# Begin Source File + +SOURCE=.\TypeAction.h +# End Source File +# Begin Source File + +SOURCE=.\WinMsgHook.h +# End Source File +# Begin Source File + +SOURCE=.\WndMsg.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\DelayAction.rgs +# End Source File +# Begin Source File + +SOURCE=.\EventAction.rgs +# End Source File +# Begin Source File + +SOURCE=.\Hotkey.rgs +# End Source File +# Begin Source File + +SOURCE=.\InputBuffer.rgs +# End Source File +# Begin Source File + +SOURCE=.\InputService.rgs +# End Source File +# Begin Source File + +SOURCE=.\MouseMoveAction.rgs +# End Source File +# Begin Source File + +SOURCE=.\PolledDelayAction.rgs +# End Source File +# Begin Source File + +SOURCE=.\RestoreAction.rgs +# End Source File +# Begin Source File + +SOURCE=.\Timer.rgs +# End Source File +# Begin Source File + +SOURCE=.\TypeAction.rgs +# End Source File +# Begin Source File + +SOURCE=.\WinMsgHook.rgs +# End Source File +# Begin Source File + +SOURCE=.\WndMsg.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/DecalInput/DecalInput.rc b/Native/DecalInput/DecalInput.rc new file mode 100644 index 0000000..74e9618 --- /dev/null +++ b/Native/DecalInput/DecalInput.rc @@ -0,0 +1,143 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""DecalInput.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "DecalInput Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "DecalInput" + VALUE "LegalCopyright", "Copyright 2001" + VALUE "OriginalFilename", "DecalInput.DLL" + VALUE "ProductName", "DecalInput Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "DecalInput" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_INPUTSERVICE REGISTRY "InputService.rgs" +IDR_TIMER REGISTRY "Timer.rgs" +IDR_HOTKEY REGISTRY "Hotkey.rgs" +IDR_WINMSGHOOK REGISTRY "WinMsgHook.rgs" +IDR_WNDMSG REGISTRY "WndMsg.rgs" +IDR_INPUTBUFFER REGISTRY "InputBuffer.rgs" +IDR_TYPEACTION REGISTRY "TypeAction.rgs" +IDR_MOUSEMOVEACTION REGISTRY "MouseMoveAction.rgs" +IDR_DELAYACTION REGISTRY "DelayAction.rgs" +IDR_EVENTACTION REGISTRY "EventAction.rgs" +IDR_POLLEDDELAYACTION REGISTRY "PolledDelayAction.rgs" +IDR_RESTOREACTION REGISTRY "RestoreAction.rgs" +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "DecalInput.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/DecalInput/DecalInput.vcproj b/Native/DecalInput/DecalInput.vcproj new file mode 100644 index 0000000..8243462 --- /dev/null +++ b/Native/DecalInput/DecalInput.vcproj @@ -0,0 +1,1196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/DecalInput/DecalInputCP.h b/Native/DecalInput/DecalInputCP.h new file mode 100644 index 0000000..3be95d6 --- /dev/null +++ b/Native/DecalInput/DecalInputCP.h @@ -0,0 +1,191 @@ +#ifndef _DECALINPUTCP_H_ +#define _DECALINPUTCP_H_ + +template +class CProxyIHotkeyEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Hotkey(IHotkey * Source) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = Source; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } +}; + + +template +class CProxyITimerEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Timeout(IDecalTimer * Source) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = Source; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } +}; + +template +class CProxyIWinMsgHookEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Message(IWinMsgHook * Hook, IWndMsg * Message) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Hook; + pvars[0] = Message; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } +}; + +template +class CProxyIInputBufferEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Begin(IInputBuffer * Buffer) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = Buffer; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_End(IInputBuffer * Buffer) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = Buffer; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_Event(IInputBuffer * Buffer, LONG EventID, VARIANT Param) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = Buffer; + pvars[1] = EventID; + pvars[0].Copy( &Param ); + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } +}; +#endif \ No newline at end of file diff --git a/Native/DecalInput/DecalInputps.def b/Native/DecalInput/DecalInputps.def new file mode 100644 index 0000000..c115485 --- /dev/null +++ b/Native/DecalInput/DecalInputps.def @@ -0,0 +1,11 @@ + +LIBRARY "DecalInputPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/DecalInput/DecalInputps.mk b/Native/DecalInput/DecalInputps.mk new file mode 100644 index 0000000..cac2ebd --- /dev/null +++ b/Native/DecalInput/DecalInputps.mk @@ -0,0 +1,16 @@ + +DecalInputps.dll: dlldata.obj DecalInput_p.obj DecalInput_i.obj + link /dll /out:DecalInputps.dll /def:DecalInputps.def /entry:DllMain dlldata.obj DecalInput_p.obj DecalInput_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del DecalInputps.dll + @del DecalInputps.lib + @del DecalInputps.exp + @del dlldata.obj + @del DecalInput_p.obj + @del DecalInput_i.obj diff --git a/Native/DecalInput/DelayAction.cpp b/Native/DecalInput/DelayAction.cpp new file mode 100644 index 0000000..bada8f9 --- /dev/null +++ b/Native/DecalInput/DelayAction.cpp @@ -0,0 +1,8 @@ +// DelayAction.cpp : Implementation of cDelayAction +#include "stdafx.h" +#include "DecalInput.h" +#include "DelayAction.h" + +///////////////////////////////////////////////////////////////////////////// +// cDelayAction + diff --git a/Native/DecalInput/DelayAction.h b/Native/DecalInput/DelayAction.h new file mode 100644 index 0000000..128be77 --- /dev/null +++ b/Native/DecalInput/DelayAction.h @@ -0,0 +1,46 @@ +// DelayAction.h : Declaration of the cDelayAction + +#ifndef __DELAYACTION_H_ +#define __DELAYACTION_H_ + +#include "resource.h" // main symbols +#include + +///////////////////////////////////////////////////////////////////////////// +// cDelayAction +class ATL_NO_VTABLE cDelayAction : + public CComObjectRootEx, + public CComCoClass, + public IInputActionImpl< cDelayAction > +{ +public: + cDelayAction() + { + } + + long m_nTime; + + HRESULT onLoad( LPTSTR szData ) + { + // Attempt to convert it to a number + return ( ::_stscanf( szData, _T( "%i" ), &m_nTime ) == 1 ) ? S_OK : E_INVALIDARG; + } + +DECLARE_REGISTRY_RESOURCEID(IDR_DELAYACTION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cDelayAction) + COM_INTERFACE_ENTRY(IInputAction) +END_COM_MAP() + +// IInputAction +public: + STDMETHOD(Execute)() + { + m_pSite->Delay( m_nTime, VARIANT_TRUE ); + return S_OK; + } +}; + +#endif //__DELAYACTION_H_ diff --git a/Native/DecalInput/DelayAction.rgs b/Native/DecalInput/DelayAction.rgs new file mode 100644 index 0000000..bd4fe16 --- /dev/null +++ b/Native/DecalInput/DelayAction.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalInput.DelayAction.1 = s 'DelayAction Class' + { + CLSID = s '{324D76B8-D8C7-4A81-B867-E4E1F874E488}' + } + DecalInput.DelayAction = s 'DelayAction Class' + { + CLSID = s '{324D76B8-D8C7-4A81-B867-E4E1F874E488}' + CurVer = s 'DecalInput.DelayAction.1' + } + NoRemove CLSID + { + ForceRemove {324D76B8-D8C7-4A81-B867-E4E1F874E488} = s 'DelayAction Class' + { + ProgID = s 'DecalInput.DelayAction.1' + VersionIndependentProgID = s 'DecalInput.DelayAction' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove InputActions + { + ForceRemove {324D76B8-D8C7-4A81-B867-E4E1F874E488} = s 'Delay Input Action' + { + val Enabled = d '1' + val Prefix = s 'delay' + } + } + } + } +} diff --git a/Native/DecalInput/EventAction.cpp b/Native/DecalInput/EventAction.cpp new file mode 100644 index 0000000..9032dbc --- /dev/null +++ b/Native/DecalInput/EventAction.cpp @@ -0,0 +1,8 @@ +// EventAction.cpp : Implementation of cEventAction +#include "stdafx.h" +#include "DecalInput.h" +#include "EventAction.h" + +///////////////////////////////////////////////////////////////////////////// +// cEventAction + diff --git a/Native/DecalInput/EventAction.h b/Native/DecalInput/EventAction.h new file mode 100644 index 0000000..3751fab --- /dev/null +++ b/Native/DecalInput/EventAction.h @@ -0,0 +1,48 @@ +// EventAction.h : Declaration of the cEventAction + +#ifndef __EVENTACTION_H_ +#define __EVENTACTION_H_ + +#include "resource.h" // main symbols +#include + +///////////////////////////////////////////////////////////////////////////// +// cEventAction +class ATL_NO_VTABLE cEventAction : + public CComObjectRootEx, + public CComCoClass, + public IInputActionImpl< cEventAction > +{ +public: + cEventAction() + { + } + + long m_nEvent; + + HRESULT onLoad( LPTSTR szData ) + { + // Attempt to convert it to a number + return ( ::_stscanf( szData, _T( "%i" ), &m_nEvent ) == 1 ) ? S_OK : E_INVALIDARG; + } + +DECLARE_REGISTRY_RESOURCEID(IDR_EVENTACTION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cEventAction) + COM_INTERFACE_ENTRY(IInputAction) +END_COM_MAP() + +// IEventAction +public: + STDMETHOD(Execute)() + { + CComVariant v; + m_pSite->FireEvent( m_nEvent, v ); + + return S_OK; + } +}; + +#endif //__EVENTACTION_H_ diff --git a/Native/DecalInput/EventAction.rgs b/Native/DecalInput/EventAction.rgs new file mode 100644 index 0000000..d8efac0 --- /dev/null +++ b/Native/DecalInput/EventAction.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalInput.EventAction.1 = s 'EventAction Class' + { + CLSID = s '{D6E4BD19-4900-4515-BCE2-A9EA4AAE2699}' + } + DecalInput.EventAction = s 'EventAction Class' + { + CLSID = s '{D6E4BD19-4900-4515-BCE2-A9EA4AAE2699}' + CurVer = s 'DecalInput.EventAction.1' + } + NoRemove CLSID + { + ForceRemove {D6E4BD19-4900-4515-BCE2-A9EA4AAE2699} = s 'EventAction Class' + { + ProgID = s 'DecalInput.EventAction.1' + VersionIndependentProgID = s 'DecalInput.EventAction' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove InputActions + { + ForceRemove {D6E4BD19-4900-4515-BCE2-A9EA4AAE2699} = s 'Event Input Action' + { + val Enabled = d '1' + val Prefix = s 'event' + } + } + } + } +} diff --git a/Native/DecalInput/Hotkey.cpp b/Native/DecalInput/Hotkey.cpp new file mode 100644 index 0000000..94b31cb --- /dev/null +++ b/Native/DecalInput/Hotkey.cpp @@ -0,0 +1,159 @@ +// Hotkey.cpp : Implementation of cHotkey +#include "stdafx.h" +#include "DecalInput.h" +#include "Hotkey.h" + +#include "InputService.h" + +///////////////////////////////////////////////////////////////////////////// +// cHotkey + +STDMETHODIMP cHotkey::get_Tag(VARIANT *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + return ::VariantCopy( pVal, &m_tag ); +} + +STDMETHODIMP cHotkey::put_Tag(VARIANT newVal) +{ + m_tag = newVal; + + return S_OK; +} + +STDMETHODIMP cHotkey::get_Key(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + USES_CONVERSION; + + if( m_nVK == -1 ) + { + // Key must be set before it's retreived + _ASSERT( FALSE ); + return E_FAIL; + } + + // Try and convert it to a special char + cInputService::cCharNames *i_char = cInputService::charFromVK( m_nVK ); + if( i_char != cInputService::end_chars() ) + { + TCHAR szKey[ 12 ]; + ::_stprintf( szKey, _T( "{%s}" ), i_char->szName ); + + *pVal = T2BSTR( szKey ); + return S_OK; + } + + TCHAR szKey[2] = { static_cast< TCHAR >( m_nVK ), _T( '\0' ) }; + *pVal = T2BSTR( szKey ); + + return S_OK; +} + +STDMETHODIMP cHotkey::put_Key(BSTR newVal) +{ + USES_CONVERSION; + + // Convert to upper case + LPTSTR szKey = OLE2T( newVal ); + ::_tcsupr( szKey ); + + if( szKey[ 0 ] == '{' ) + { + for( LPTSTR szEndKey = szKey + 1; *szEndKey != '\0'; ++ szEndKey ) + { + if( *szEndKey == _T( '}' ) ) + { + cInputService::cCharNames *i_char = cInputService::charFromName( szKey + 1, szEndKey - ( szKey + 1 ) ); + if( i_char == cInputService::end_chars() ) + { + // Unknown special character name + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + // We have our vkey + m_nVK = i_char->m_nVKey; + return S_OK; + } + } + + // Malformed string + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + if( szKey[ 1 ] != _T( '\0' ) ) + { + // Malformed string - should only contain one character + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + m_nVK = szKey[ 0 ]; + + return S_OK; +} + +STDMETHODIMP cHotkey::get_Enabled(VARIANT_BOOL *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = ( m_bEnabled ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cHotkey::put_Enabled(VARIANT_BOOL newVal) +{ + if( !!newVal == m_bEnabled ) + return S_FALSE; + + if( cInputService::g_p == NULL ) + { + // Input Service must be started to enable or disable a hotkey + _ASSERT( FALSE ); + return E_FAIL; + } + + m_bEnabled = !!newVal; + + if( m_bEnabled ) + { +#ifdef _DEBUG + for( cInputService::cHotkeyList::iterator i = cInputService::g_p->m_hotkeys.begin(); i != cInputService::g_p->m_hotkeys.end(); ++ i ) + _ASSERTE( *i != this ); +#endif + + cInputService::g_p->m_hotkeys.push_back( this ); + } + else + { + for( cInputService::cHotkeyList::iterator i = cInputService::g_p->m_hotkeys.begin(); i != cInputService::g_p->m_hotkeys.end(); ++ i ) + { + if( *i == this ) + { + cInputService::g_p->m_hotkeys.erase( i ); + break; + } + } + + _ASSERTE( i != cInputService::g_p->m_hotkeys.end() ); + } + + return S_OK; +} diff --git a/Native/DecalInput/Hotkey.h b/Native/DecalInput/Hotkey.h new file mode 100644 index 0000000..d44bb6e --- /dev/null +++ b/Native/DecalInput/Hotkey.h @@ -0,0 +1,61 @@ +// Hotkey.h : Declaration of the cHotkey + +#ifndef __HOTKEY_H_ +#define __HOTKEY_H_ + +#include "resource.h" // main symbols +#include "DecalInputCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cHotkey +class ATL_NO_VTABLE cHotkey : + public CComObjectRootEx, + public CComCoClass, + public IProvideClassInfo2Impl< &CLSID_Hotkey, &DIID_IHotkeyEvents, &LIBID_DecalInput >, + public IConnectionPointContainerImpl, + public IDispatchImpl, + public CProxyIHotkeyEvents< cHotkey > +{ +public: + cHotkey() + : m_bEnabled( false ), + m_nVK( -1 ) + { + } + + void FinalRelease() + { + if( m_bEnabled ) + put_Enabled( VARIANT_FALSE ); + } + + bool m_bEnabled; + _variant_t m_tag; + long m_nVK; + +DECLARE_REGISTRY_RESOURCEID(IDR_HOTKEY) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cHotkey) + COM_INTERFACE_ENTRY(IHotkey) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() +BEGIN_CONNECTION_POINT_MAP(cHotkey) +CONNECTION_POINT_ENTRY(DIID_IHotkeyEvents) +END_CONNECTION_POINT_MAP() + +// IHotkey +public: + STDMETHOD(get_Enabled)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Enabled)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_Key)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Key)(/*[in]*/ BSTR newVal); + STDMETHOD(get_Tag)(/*[out, retval]*/ VARIANT *pVal); + STDMETHOD(put_Tag)(/*[in]*/ VARIANT newVal); +}; + +#endif //__HOTKEY_H_ diff --git a/Native/DecalInput/Hotkey.rgs b/Native/DecalInput/Hotkey.rgs new file mode 100644 index 0000000..0ed43cf --- /dev/null +++ b/Native/DecalInput/Hotkey.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalInput.Hotkey.1 = s 'Hotkey Class' + { + CLSID = s '{F183506A-3664-49D6-8CA4-CFD295F2811D}' + } + DecalInput.Hotkey = s 'Hotkey Class' + { + CLSID = s '{F183506A-3664-49D6-8CA4-CFD295F2811D}' + CurVer = s 'DecalInput.Hotkey.1' + } + NoRemove CLSID + { + ForceRemove {F183506A-3664-49D6-8CA4-CFD295F2811D} = s 'Hotkey Class' + { + ProgID = s 'DecalInput.Hotkey.1' + VersionIndependentProgID = s 'DecalInput.Hotkey' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} diff --git a/Native/DecalInput/InputBuffer.cpp b/Native/DecalInput/InputBuffer.cpp new file mode 100644 index 0000000..d4c7088 --- /dev/null +++ b/Native/DecalInput/InputBuffer.cpp @@ -0,0 +1,351 @@ +// InputBuffer.cpp : Implementation of cInputBuffer +#include "stdafx.h" +#include "DecalInput.h" +#include "InputBuffer.h" + +#include "InputService.h" + +///////////////////////////////////////////////////////////////////////////// +// cInputBuffer + +void cInputBuffer::FinalRelease() +{ + if( cInputService::g_p != NULL && cInputService::g_p->m_pActive == this ) + Stop(); +} + +bool cInputBuffer::checkState() +{ + if( cInputService::g_p == NULL || cInputService::g_p->m_pActive == this ) + { + // There must be an input service and it must be inactive + _ASSERT( FALSE ); + return false; + } + + return true; +} + +HRESULT cInputBuffer::addItem( BSTR strInit, IInputAction **ppAction ) +{ + USES_CONVERSION; + LPTSTR szType = OLE2T( strInit ); + + size_t iInitData = ::_tcscspn( szType, _T( ":" ) ); + + if( iInitData == -1 ) + return E_INVALIDARG; + + szType[ iInitData ] = _T( '\0' ); + LPCTSTR szInitData = szType + iInitData + 1; + ::_tcslwr( szType ); + + for( cInputService::cActionTypeList::iterator i = cInputService::g_p->m_actiontypes.begin(); i != cInputService::g_p->m_actiontypes.end(); ++ i ) + { + if( ::_tcscmp( szType, i->szAction ) == 0 ) + break; + } + + if( i == cInputService::g_p->m_actiontypes.end() ) + return E_INVALIDARG; + + // Get the configuration object for this inputaction + static _bstr_t _strActions( _T( "InputActions" ) ); + CComPtr< IDecalEnum > pInputEnum; + + if( cInputService::g_p->m_pDecal->get_Configuration( _strActions, i->m_clsid, &pInputEnum ) != S_OK ) + // What used to be there is gone + return E_FAIL; + + HRESULT hRes = pInputEnum->CreateInstance( __uuidof( IInputAction ), reinterpret_cast< void ** >( ppAction ) ); + if( FAILED( hRes ) ) + // Could not create our object + return hRes; + + return ( *ppAction )->Initialize( this, _bstr_t( szInitData ) ); +} + +void cInputBuffer::runActions() +{ + m_bWaiting = false; + + while( m_play != m_entries.end() ) + { + HRESULT hRes; + switch( m_play->m_eType ) + { + case eExecute: + hRes = m_play->m_pAction->Execute(); + break; + + case ePush: + m_playstack.push( &*m_play ); + hRes = m_play->m_pAction->Push(); + break; + + case ePop: + m_playstack.pop(); + hRes = m_play->m_pAction->Pop(); + break; + + default: + hRes = E_FAIL; + } + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + Stop(); + return; + } + + if( m_bWaiting || cInputService::g_p->m_pActive != this ) + // If we're now waiting, return from our actions and continue + return; + + ++ m_play; + } + + // We're done here + Stop(); +} + +STDMETHODIMP cInputBuffer::get_Tag(VARIANT *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + return ::VariantCopy( pVal, &m_tag ); +} + +STDMETHODIMP cInputBuffer::put_Tag(VARIANT newVal) +{ + m_tag = newVal; + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Add(BSTR strCommand) +{ + if( !checkState() ) + return E_FAIL; + + cEntry e; + HRESULT hRes = addItem( strCommand, &e.m_pAction ); + if( FAILED( hRes ) ) + return hRes; + + e.m_eType = eExecute; + m_entries.push_back( e ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Push(BSTR Command) +{ + if( !checkState() ) + return E_FAIL; + + cEntry e; + HRESULT hRes = addItem( Command, &e.m_pAction ); + if( FAILED( hRes ) ) + return hRes; + + VARIANT_BOOL bStackable; + e.m_pAction->get_Stackable( &bStackable ); + + if( !bStackable ) + return E_INVALIDARG; + + e.m_eType = ePush; + m_entries.push_back( e ); + m_insertstack.push( &m_entries.back() ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Pop() +{ + if( !checkState() ) + return E_FAIL; + + if( m_insertstack.size() == 0 ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + cEntry e; + e.m_eType = ePop; + e.m_pAction = m_insertstack.top()->m_pAction; + + m_entries.push_back( e ); + m_insertstack.pop(); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::get_CanRun(VARIANT_BOOL *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( cInputService::g_p == NULL ) + { + // There must be an input service + _ASSERT( FALSE ); + return E_FAIL; + } + + *pVal = ( cInputService::g_p->m_pActive == NULL ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Run() +{ + if( cInputService::g_p == NULL || cInputService::g_p->m_pActive != NULL ) + { + // There must be an input service and it must be inactive + _ASSERT( FALSE ); + return E_FAIL; + } + + // First check if the insert stack is incomplete + while( m_insertstack.size() > 0 ) + Pop(); + + // Reset the cursors + while( m_playstack.size() > 0 ) + m_playstack.pop(); + + m_play = m_entries.begin(); + cInputService::g_p->m_pActive = this; + + // Reset the actions + for( cEntryList::iterator i = m_entries.begin(); i != m_entries.end(); ++ i ) + i->m_pAction->Reset(); + + Fire_Begin( this ); + + // Lock down the user input + ::BlockInput( TRUE ); + runActions(); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Stop() +{ + if( cInputService::g_p == NULL ) + { + // There must be an input service + _ASSERT( FALSE ); + return E_FAIL; + } + + if( cInputService::g_p->m_pActive == NULL ) + return S_FALSE; + + if( cInputService::g_p->m_pActive != this ) + return E_FAIL; + + // Stop immediately, flush all entries in the stack + while( m_playstack.size() > 0 ) + { + m_playstack.top()->m_pAction->Pop(); + m_playstack.pop(); + } + + cInputService::g_p->m_pActive = NULL; + ::BlockInput( FALSE ); + + Fire_End( this ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Delay(long Time, VARIANT_BOOL Advance) +{ + if( Advance ) + ++ m_play; + + m_bWaiting = true; + m_nUntilTime = ::timeGetTime() + Time; + + return S_OK; +} + +STDMETHODIMP cInputBuffer::FireEvent(long nEventID, VARIANT vParam) +{ + Fire_Event( this, nEventID, vParam ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::MoveMouse(long X, long Y) +{ + if( cInputService::g_p == NULL ) + { + // There must be an input service + _ASSERT( FALSE ); + return E_FAIL; + } + + // These are already traslated to screen coords + cInputService *pis = cInputService::g_p; + if( pis->m_eWindows == cInputService::eWindows98NoMemLocs ) + return E_FAIL; + + // Otherwise, get the window proc and send some info to move the mouse + WNDPROC wndProc = reinterpret_cast< WNDPROC >( ::GetWindowLong( pis->m_hWndHook, GWL_WNDPROC ) ); + POINT ptScreen = { X, Y }; + ::ClientToScreen( pis->m_hWndHook, &ptScreen ); + + ::SetCursorPos( ptScreen.x, ptScreen.y ); + POINTS pts = { X, Y }; + wndProc( pis->m_hWndHook, WM_MOUSEMOVE, 0, *reinterpret_cast< DWORD * >( &pts ) ); + + // Special additional functionality for win98 + if( pis->m_eWindows == cInputService::eWindows98WithMemLocs ) + { + pis->m_pnOffset1[ 0 ] = X; + pis->m_pnOffset1[ 1 ] = Y; + + pis->m_pnOffset2[ 0 ] = X; + pis->m_pnOffset2[ 1 ] = Y; + pis->m_pnOffset2[ 2 ] = X; + pis->m_pnOffset2[ 3 ] = Y; + pis->m_pnOffset2[ 4 ] = X; + pis->m_pnOffset2[ 5 ] = Y; + + // Delay a couple frames to be sure it's taken effect + Delay( 100, VARIANT_TRUE ); + } + + return S_OK; +} + +STDMETHODIMP cInputBuffer::get_Service(IInputService **pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( cInputService::g_p == NULL ) + { + // There must be an input service + _ASSERT( FALSE ); + return E_FAIL; + } + + return static_cast< IInputService * >( cInputService::g_p )->QueryInterface( pVal ); +} diff --git a/Native/DecalInput/InputBuffer.h b/Native/DecalInput/InputBuffer.h new file mode 100644 index 0000000..e16adb1 --- /dev/null +++ b/Native/DecalInput/InputBuffer.h @@ -0,0 +1,93 @@ +// InputBuffer.h : Declaration of the cInputBuffer + +#ifndef __INPUTBUFFER_H_ +#define __INPUTBUFFER_H_ + +#include "resource.h" // main symbols +#include "DecalInputCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cInputBuffer +class ATL_NO_VTABLE cInputBuffer : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public IProvideClassInfo2Impl< &CLSID_InputBuffer, &DIID_IInputBufferEvents, &LIBID_DecalInput >, + public IDispatchImpl, + public IInputActionSite, + public CProxyIInputBufferEvents< cInputBuffer > +{ +public: + cInputBuffer() + : m_bWaiting( false ), + m_nUntilTime( 0 ) + { + } + + void FinalRelease(); + + _variant_t m_tag; + + enum eEntryType + { + eExecute, + ePush, + ePop + }; + + struct cEntry + { + eEntryType m_eType; + CComPtr< IInputAction > m_pAction; + }; + + typedef std::list< cEntry > cEntryList; + cEntryList m_entries; + + typedef std::stack< cEntry * > cEntryStack; + cEntryStack m_insertstack, m_playstack; + cEntryList::iterator m_play; + + bool checkState(); + HRESULT addItem( BSTR strInit, IInputAction **ppAction ); + void runActions(); + + // Delay information + bool m_bWaiting; + long m_nUntilTime; + +DECLARE_REGISTRY_RESOURCEID(IDR_INPUTBUFFER) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cInputBuffer) + COM_INTERFACE_ENTRY(IInputActionSite) + COM_INTERFACE_ENTRY(IInputBuffer) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() +BEGIN_CONNECTION_POINT_MAP(cInputBuffer) + CONNECTION_POINT_ENTRY(DIID_IInputBufferEvents) +END_CONNECTION_POINT_MAP() + +public: + // IInputActionSite + STDMETHOD(Delay)(long Time, VARIANT_BOOL Advance); + STDMETHOD(FireEvent)(long nEventID, VARIANT vParam); + STDMETHOD(MoveMouse)(long X, long Y); + STDMETHOD(get_Service)(/*[out, retval]*/ IInputService * *pVal); + + // IInputBuffer + STDMETHOD(Stop)(); + STDMETHOD(Run)(); + STDMETHOD(get_CanRun)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(Pop)(); + STDMETHOD(Push)(BSTR Command); + STDMETHOD(Add)(BSTR Command); + STDMETHOD(get_Tag)(/*[out, retval]*/ VARIANT *pVal); + STDMETHOD(put_Tag)(/*[in]*/ VARIANT newVal); +}; + +#endif //__INPUTBUFFER_H_ diff --git a/Native/DecalInput/InputBuffer.rgs b/Native/DecalInput/InputBuffer.rgs new file mode 100644 index 0000000..568af33 --- /dev/null +++ b/Native/DecalInput/InputBuffer.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalInput.InputBuffer.1 = s 'InputBuffer Class' + { + CLSID = s '{F0A17A04-7F8F-4A17-A41D-8C297A1E929B}' + } + DecalInput.InputBuffer = s 'InputBuffer Class' + { + CLSID = s '{F0A17A04-7F8F-4A17-A41D-8C297A1E929B}' + CurVer = s 'DecalInput.InputBuffer.1' + } + NoRemove CLSID + { + ForceRemove {F0A17A04-7F8F-4A17-A41D-8C297A1E929B} = s 'InputBuffer Class' + { + ProgID = s 'DecalInput.InputBuffer.1' + VersionIndependentProgID = s 'DecalInput.InputBuffer' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} diff --git a/Native/DecalInput/InputService.cpp b/Native/DecalInput/InputService.cpp new file mode 100644 index 0000000..cd76c01 --- /dev/null +++ b/Native/DecalInput/InputService.cpp @@ -0,0 +1,408 @@ +// InputService.cpp : Implementation of cInputService + +#include "stdafx.h" +#include "DecalInput.h" +#include "InputService.h" + +#include "Timer.h" +#include "Hotkey.h" +#include "WinMsgHook.h" +#include "InputBuffer.h" + +using cInputService::cCharNames; + +static cCharNames _charnames[] = { + { _T( "BACKSPACE" ), VK_BACK }, + { _T( "BS" ), VK_BACK }, + { _T( "BKSP" ), VK_BACK }, + { _T( "CAPSLOCK" ), VK_CAPITAL }, + { _T( "DELETE" ), VK_DELETE }, + { _T( "DEL" ), VK_DELETE }, + { _T( "DOWN" ), VK_DOWN }, + { _T( "END" ), VK_END }, + { _T( "ENTER" ), VK_RETURN }, + { _T( "ESC" ), VK_ESCAPE }, + { _T( "HELP" ), VK_HELP }, + { _T( "HOME" ), VK_HOME }, + { _T( "INS" ), VK_INSERT }, + { _T( "INSERT" ), VK_INSERT }, + { _T( "LEFT" ), VK_LEFT }, + { _T( "NUMLOCK" ), VK_NUMLOCK }, + { _T( "PGDN" ), VK_NEXT }, + { _T( "PGUP" ), VK_PRIOR }, + { _T( "PRTSC" ), VK_SNAPSHOT }, + { _T( "RIGHT" ), VK_RIGHT }, + { _T( "SCROLLLOCK" ), VK_SCROLL }, + { _T( "TAB" ), VK_TAB }, + { _T( "UP" ), VK_UP }, + { _T( "F1" ), VK_F1 }, + { _T( "F2" ), VK_F2 }, + { _T( "F3" ), VK_F3 }, + { _T( "F4" ), VK_F4 }, + { _T( "F5" ), VK_F5 }, + { _T( "F6" ), VK_F6 }, + { _T( "F7" ), VK_F7 }, + { _T( "F8" ), VK_F8 }, + { _T( "F9" ), VK_F9 }, + { _T( "F10" ), VK_F10 }, + { _T( "F11" ), VK_F11 }, + { _T( "F12" ), VK_F12 }, + { _T( "F13" ), VK_F13 }, + { _T( "F14" ), VK_F14 }, + { _T( "F15" ), VK_F15 }, + { _T( "F16" ), VK_F16 }, + { _T( "+" ), VK_ADD }, + { _T( "SHIFT" ), VK_SHIFT }, + { _T( "CTRL" ), VK_CONTROL }, + { _T( "ALT" ), VK_MENU }, + { _T( "LBUTTON" ), VK_LBUTTON }, + { _T( "RBUTTON" ), VK_RBUTTON } }, + *_end_charnames = _charnames + ( sizeof(_charnames ) / sizeof( cCharNames ) ); + +///////////////////////////////////////////////////////////////////////////// +// cInputService + +LRESULT cInputService::wndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) +{ + if( g_p == NULL || g_p->m_hWndHook != hWnd ) + { + // We have no idea how to continue - this hook has been orphaned + _ASSERT( FALSE ); + return 0; + } + + if( g_p->m_msghooks.size() > 0 ) + { + // Fill out the message + g_p->m_pMessage->loadMessage( hWnd, nMsg, wParam, lParam ); + + for( cWinMsgHookList::iterator i = g_p->m_msghooks.begin(); i != g_p->m_msghooks.end(); ++ i ) + { + ( *i )->Fire_Message( *i, g_p->m_pMessage ); + if( g_p->m_pMessage->m_bEaten ) + // This message was eaten, yummy + return 0; + } + } + + // NOTE: The hotkeys are not dispatched while an input buffer is running - tough luck + if( nMsg == WM_KEYUP && g_p->m_pActive == NULL ) + { + int nVK = static_cast< int >( wParam ); + + // Check if there's a matching hotkey + for( cHotkeyList::iterator i = g_p->m_hotkeys.begin(); i != g_p->m_hotkeys.end(); ++ i ) + { + if( ( *i )->m_nVK == nVK ) + { + // Found a hotkey - fire the event and eat it + ( *i )->Fire_Hotkey( *i ); + break; + } + } + } + + return g_p->m_pfnHook( hWnd, nMsg, wParam, lParam ); +} + +cInputService *cInputService::g_p = NULL; + +HRESULT cInputService::onInitialize() +{ + // ::DebugBreak(); + + USES_CONVERSION; + + if( g_p == NULL ) + g_p = this; + + // Create the message object + CComObject< cWndMsg >::CreateInstance( &m_pMessage ); + m_pMessage->AddRef(); + + // Load the list of action types from the configuration data + { + static _bstr_t _strPrefix( _T( "Prefix" ) ); + + CComPtr< IDecalEnum > pActions; + m_pDecal->get_Configuration( _bstr_t( _T( "InputActions" ) ), GUID_NULL, &pActions ); + while( pActions->Next() == S_OK ) + { + VARIANT_BOOL bEnabled; + HRESULT hRes = pActions->get_Enabled ( &bEnabled ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + + if ( !bEnabled ) + continue; + + cActionType at; + pActions->get_ComClass( &at.m_clsid ); + + CComVariant v; + if( FAILED( pActions->get_Property( _strPrefix, &v ) ) ) + continue; + + ::_tcscpy( at.szAction, OLE2T( v.bstrVal ) ); + ::_tcslwr( at.szAction ); + m_actiontypes.push_back( at ); + } + } + + // Get the OS version + OSVERSIONINFO ovi; + ovi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); + ::GetVersionEx( &ovi ); + + if( ovi.dwPlatformId == VER_PLATFORM_WIN32_NT ) + { + m_eWindows = eWindowsNT; + return S_OK; + } + + // First check if there's version info in the registry + RegKey key; + key.Open( HKEY_LOCAL_MACHINE, _T( "Software\\Decal" ) ); + DWORD dwRegMajor, dwRegMinor; + if( key.QueryDWORDValue( _T( "ACMajorVersion" ), dwRegMajor ) != ERROR_SUCCESS || + key.QueryDWORDValue( _T( "ACMinorVersion" ), dwRegMinor ) != ERROR_SUCCESS ) + { + m_eWindows = eWindows98NoMemLocs; + return S_OK; + } + + TCHAR szFilename[ MAX_PATH ]; + DWORD dwVerSize; + + ::GetModuleFileName( NULL, szFilename, MAX_PATH ); + if( ::GetFileVersionInfoSize( szFilename, &dwVerSize ) ) + { + m_eWindows = eWindows98NoMemLocs; + return S_OK; + } + + BYTE *pbVersionInfo = reinterpret_cast< BYTE * >( ::_alloca( dwVerSize ) ); + + ::GetFileVersionInfo( szFilename, 0, dwVerSize, pbVersionInfo ); + + VS_FIXEDFILEINFO *vffi; + UINT nLength = sizeof( VS_FIXEDFILEINFO ); + if( ::VerQueryValue( pbVersionInfo, _T( "\\" ), reinterpret_cast< LPVOID * >( &vffi ), &nLength ) ) + { + if( dwRegMajor == vffi->dwFileVersionMS && dwRegMinor == vffi->dwFileVersionLS ) + { + DWORD dwOffset1, dwOffset2; + if( key.QueryDWORDValue( _T( "MouseOffset1" ), dwOffset1 ) == ERROR_SUCCESS && + key.QueryDWORDValue( _T( "MouseOffset2" ), dwOffset2 ) == ERROR_SUCCESS ) + { + m_eWindows = eWindows98WithMemLocs; + m_pnOffset1 = reinterpret_cast< long * >( dwOffset1 ); + m_pnOffset2 = reinterpret_cast< long * >( dwOffset2 ); + + return S_OK; + } + } + } + + m_eWindows = eWindows98NoMemLocs; + + return S_OK; +} + +void cInputService::onTerminate() +{ + // Create the message object + m_pMessage->Release(); + m_pMessage = NULL; + + if( g_p == this ) + g_p = NULL; +} + +cCharNames *cInputService::begin_chars() +{ + return _charnames; +} + +cCharNames *cInputService::end_chars() +{ + return _end_charnames; +} + +cCharNames *cInputService::charFromVK( int nVK ) +{ + for( cCharNames *i_chars = _charnames; i_chars != _end_charnames; ++ i_chars ) + { + if( i_chars->m_nVKey == nVK ) + break; + } + + return i_chars; +} + +cCharNames *cInputService::charFromName( LPCTSTR szName, int nLength ) +{ + for( cCharNames *i_chars = _charnames; i_chars != _end_charnames; ++ i_chars ) + { + if( ::strlen( i_chars->szName ) == nLength && std::equal( szName, szName + nLength, i_chars->szName ) ) + break; + } + + return i_chars; +} + +STDMETHODIMP cInputService::BeforePlugins() +{ + // Hook the main plugin window + long nWnd; + m_pDecal->get_HWND( &nWnd ); + if( nWnd != 0 ) + { + m_hWndHook = reinterpret_cast< HWND >( nWnd ); + m_pfnHook = reinterpret_cast< WNDPROC >( ::SetWindowLong( m_hWndHook, GWL_WNDPROC, reinterpret_cast< LONG >( wndProc ) ) ); + } + + // Load the keymap + RegKey key; + if(key.Open( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00" ), KEY_READ ) != ERROR_SUCCESS) + return E_FAIL; + + TCHAR szFilename[ MAX_PATH ]; + TCHAR *pszInsert = szFilename; + DWORD dwSize = MAX_PATH; + key.QueryStringValue( _T("Path"), szFilename, &dwSize ); + pszInsert = &szFilename[dwSize-1]; + //pszInsert += dwSize; + + ::_tcscat( pszInsert, _T( "\\" ) ); + ++ pszInsert; + + dwSize = MAX_PATH - ( dwSize + 1 ); + key.QueryStringValue( _T( "CurrentInputMap" ), pszInsert, &dwSize ); + + // Looking good, open up the file and load the keys + std::ifstream is( szFilename ); + + if( is.bad() ) + // Could not load the file + return E_FAIL; + + int nCount = 0; + is >> nCount; + for( ; nCount > 0; -- nCount ) + { + int nInputType, nVK, nChording, nCommandType, nAnalogType; + TCHAR szCommandName[ 64 ]; + + is >> nInputType >> nVK >> nChording >> szCommandName >> nCommandType >> nAnalogType; + m_commands.insert( cCommandMap::value_type( szCommandName, static_cast< WORD >( nVK ) ) ); + } + + return S_OK; +} + +STDMETHODIMP cInputService::AfterPlugins() +{ + m_commands.clear(); + + if( m_hWndHook != NULL ) + { + _ASSERTE( reinterpret_cast< LONG >( wndProc ) == ::GetWindowLong( m_hWndHook, GWL_WNDPROC ) ); + ::SetWindowLong( m_hWndHook, GWL_WNDPROC, reinterpret_cast< LONG >( m_pfnHook ) ); + } + + return S_OK; +} + +STDMETHODIMP cInputService::get_Command(BSTR strCommandName, BSTR *pVal) +{ + USES_CONVERSION; + + // First try to find the command in the list + _bstr_t strCommand( strCommandName ); + cCommandMap::iterator i = m_commands.find( strCommand ); + + if( i == m_commands.end() ) + { + *pVal = T2BSTR( _T( "" ) ); + return S_FALSE; + } + + WORD nCommand = i->second; + + // Scan to see if this command has a special name + cCharNames *i_chars = charFromVK( nCommand ); + + if( i_chars != end_chars() ) + { + TCHAR szFormat[ 12 ]; + ::_stprintf( szFormat, _T( "{%s}" ), i_chars->szName ); + + *pVal = T2BSTR( szFormat ); + return S_OK; + } + + // Ok, we'll assume the char is printable + TCHAR szString[ 2 ] = { nCommand, _T( '\0' ) }; + *pVal = T2BSTR( szString ); + + return S_OK; +} + +STDMETHODIMP cInputService::Render2D() +{ + long nTime = static_cast< long >( ::timeGetTime() ); + + cTimerList::iterator i = m_timers.begin(); + while( i != m_timers.end() ) + { + cTimerList::iterator j = i++; // Make a copy of the iterator, increment it, then call the timeout. + if( ( ( *j )->m_nStart + ( *j )->m_nInterval ) <= nTime ) + { + ( *j )->m_nStart = nTime; + ( *j )->Fire_Timeout( *j ); + } + } + + // Check to see if there's a delay paused + if( m_pActive != NULL && m_pActive->m_bWaiting && m_pActive->m_nUntilTime <= nTime ) + // We've passed the timeout, continue processing actions + m_pActive->runActions(); + + return S_OK; +} + +STDMETHODIMP cInputService::ChangeHWND() +{ + return S_OK; +} + +STDMETHODIMP cInputService::get_Decal(IDecal **pVal) +{ + return m_pDecal->QueryInterface( pVal ); +} + +STDMETHODIMP cInputService::get_KeyByName(BSTR strName, long *pVal) +{ + USES_CONVERSION; + LPTSTR szName = OLE2T( strName ); + + cCharNames *i_c = charFromName( szName, ::_tcslen( szName ) ); + if( i_c == end_chars() ) + return E_INVALIDARG; + + *pVal = i_c->m_nVKey; + + return S_OK; +} + +STDMETHODIMP cInputService::get_CommandKey(BSTR strCommandName, long *pVal) +{ + _bstr_t strCommand( strCommandName ); + cCommandMap::iterator i = m_commands.find( strCommand ); + + if( i == m_commands.end() ) + return E_FAIL; + + *pVal = i->second; + return S_OK; +} diff --git a/Native/DecalInput/InputService.h b/Native/DecalInput/InputService.h new file mode 100644 index 0000000..d841f21 --- /dev/null +++ b/Native/DecalInput/InputService.h @@ -0,0 +1,121 @@ +// InputService.h : Declaration of the cInputService + +#ifndef __INPUTSERVICE_H_ +#define __INPUTSERVICE_H_ + +#include "resource.h" // main symbols +#include + +#include "WndMsg.h" + +class cTimer; +class cHotkey; +class cWinMsgHook; +class cInputBuffer; + +///////////////////////////////////////////////////////////////////////////// +// cInputService +class ATL_NO_VTABLE cInputService : + public CComObjectRootEx, + public CComCoClass, + public IDecalServiceImpl< cInputService >, + public IDecalRenderImpl, + public IDispatchImpl +{ +public: + cInputService() + : m_hWndHook( NULL ), + m_pfnHook( NULL ), + m_pnOffset1( NULL ), + m_pnOffset2( NULL ), + m_pMessage( NULL ), + m_pActive( NULL ) + { + } + + typedef std::map< _bstr_t, WORD > cCommandMap; + cCommandMap m_commands; + + typedef std::list< cTimer * > cTimerList; + cTimerList m_timers; + + typedef std::list< cHotkey * > cHotkeyList; + cHotkeyList m_hotkeys; + + typedef std::list< cWinMsgHook * > cWinMsgHookList; + cWinMsgHookList m_msghooks; + + CComObject< cWndMsg > *m_pMessage; + + HWND m_hWndHook; + WNDPROC m_pfnHook; + + static LRESULT CALLBACK wndProc( HWND, UINT, WPARAM, LPARAM ); + + enum eWindowsType + { + eWindowsNT, + eWindows98WithMemLocs, + eWindows98NoMemLocs + }; + + eWindowsType m_eWindows; + long *m_pnOffset1, + *m_pnOffset2; + + struct cActionType + { + TCHAR szAction[ 20 ]; + CLSID m_clsid; + }; + + typedef std::vector< cActionType > cActionTypeList; + cActionTypeList m_actiontypes; + + cInputBuffer *m_pActive; + + static cInputService *g_p; + + HRESULT onInitialize(); + void onTerminate(); + + // Key-name mapping + struct cCharNames + { + LPCTSTR szName; + WORD m_nVKey; + }; + + static cCharNames *begin_chars(); + static cCharNames *end_chars(); + static cCharNames *charFromVK( int nVK ); + static cCharNames *charFromName( LPCTSTR szName, int nLength ); + +DECLARE_REGISTRY_RESOURCEID(IDR_INPUTSERVICE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cInputService) + COM_INTERFACE_ENTRY(IDecalRender) + COM_INTERFACE_ENTRY(IDecalService) + COM_INTERFACE_ENTRY(IInputService) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IInputService +public: + STDMETHOD(get_CommandKey)(BSTR strCommand, /*[out, retval]*/ long *pVal); + STDMETHOD(get_KeyByName)(BSTR strName, /*[out, retval]*/ long *pVal); + STDMETHOD(get_Decal)(/*[out, retval]*/ IDecal * *pVal); + STDMETHOD(get_Command)(BSTR strCommandName, /*[out, retval]*/ BSTR *pVal); + + // IDecalService + STDMETHOD(BeforePlugins)(); + STDMETHOD(AfterPlugins)(); + + // IDecalRender + STDMETHOD(Render2D)(); + STDMETHOD(ChangeHWND)(); +}; + +#endif //__INPUTSERVICE_H_ diff --git a/Native/DecalInput/InputService.rgs b/Native/DecalInput/InputService.rgs new file mode 100644 index 0000000..393a5d7 --- /dev/null +++ b/Native/DecalInput/InputService.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalInput.InputService.1 = s 'InputService Class' + { + CLSID = s '{B33307BA-706D-474A-80B9-70BB8D13EF3E}' + } + DecalInput.InputService = s 'InputService Class' + { + CLSID = s '{B33307BA-706D-474A-80B9-70BB8D13EF3E}' + CurVer = s 'DecalInput.InputService.1' + } + NoRemove CLSID + { + ForceRemove {B33307BA-706D-474A-80B9-70BB8D13EF3E} = s 'InputService Class' + { + ProgID = s 'DecalInput.InputService.1' + VersionIndependentProgID = s 'DecalInput.InputService' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Services + { + ForceRemove {B33307BA-706D-474A-80B9-70BB8D13EF3E} = s 'Decal Input Service' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/DecalInput/MouseMoveAction.cpp b/Native/DecalInput/MouseMoveAction.cpp new file mode 100644 index 0000000..059e1a1 --- /dev/null +++ b/Native/DecalInput/MouseMoveAction.cpp @@ -0,0 +1,81 @@ +// MouseMoveAction.cpp : Implementation of cMouseMoveAction +#include "stdafx.h" +#include "DecalInput.h" +#include "MouseMoveAction.h" + +///////////////////////////////////////////////////////////////////////////// +// cMouseMoveAction + +HRESULT cMouseMoveAction::onLoad( LPTSTR szData ) +{ + int nSep = ::_tcscspn( szData, _T( "," ) ); + if( nSep == -1 ) + return E_INVALIDARG; + + szData[ nSep ] = _T( '\0' ); + + HRESULT hRes = loadValue( szData, m_x ); + if( FAILED( hRes ) ) + return hRes; + + return loadValue( szData + nSep + 1, m_y ); +} + +HRESULT cMouseMoveAction::loadValue( LPTSTR szData, cValue &val ) +{ + if( *szData == _T( '-' ) ) + { + // This is from right/bottom + if( ::_stscanf( szData + 1, _T( "%i" ), &val.m_nMagnitude ) != 1 ) + return E_INVALIDARG; + + if( val.m_nMagnitude < 0 || val.m_nMagnitude > 2000 ) + return E_INVALIDARG; + + val.m_eDir = eRightBottom; + return S_OK; + } + + int nLength = ::_tcslen( szData ); + if( szData[ nLength - 1 ] == _T( '%' ) ) + { + szData[ nLength - 1 ] = _T( '\0' ); + + // This is from right/bottom + if( ::_stscanf( szData, _T( "%i" ), &val.m_nMagnitude ) != 1 ) + return E_INVALIDARG; + + if( val.m_nMagnitude < 0 || val.m_nMagnitude > 100 ) + return E_INVALIDARG; + + val.m_eDir = ePercent; + return S_OK; + } + + if( ::_stscanf( szData, _T( "%i" ), &val.m_nMagnitude ) != 1 ) + return E_INVALIDARG; + + if( val.m_nMagnitude < 0 || val.m_nMagnitude > 2000 ) + return E_INVALIDARG; + + val.m_eDir = eLeftTop; + return S_OK; +} + +STDMETHODIMP cMouseMoveAction::Execute() +{ + CComPtr< IInputService > pService; + HRESULT hRes = m_pSite->get_Service( &pService ); + if( FAILED( hRes ) ) + return hRes; + + CComPtr< IDecal > pDecal; + hRes = pService->get_Decal( &pDecal ); + if( FAILED( hRes ) ) + return hRes; + + long nWidth, nHeight; + pDecal->get_ScreenSize( &nWidth, &nHeight ); + + return m_pSite->MoveMouse( m_x.value( nWidth ), m_y.value( nHeight ) ); +} diff --git a/Native/DecalInput/MouseMoveAction.h b/Native/DecalInput/MouseMoveAction.h new file mode 100644 index 0000000..0c11109 --- /dev/null +++ b/Native/DecalInput/MouseMoveAction.h @@ -0,0 +1,71 @@ +// MouseMoveAction.h : Declaration of the cMouseMoveAction + +#ifndef __MOUSEMOVEACTION_H_ +#define __MOUSEMOVEACTION_H_ + +#include "resource.h" // main symbols +#include + +///////////////////////////////////////////////////////////////////////////// +// cMouseMoveAction +class ATL_NO_VTABLE cMouseMoveAction : + public CComObjectRootEx, + public CComCoClass, + public IInputActionImpl< cMouseMoveAction > +{ +public: + cMouseMoveAction() + { + } + + enum eDirection + { + eLeftTop, + eRightBottom, + ePercent + }; + + struct cValue + { + eDirection m_eDir; + long m_nMagnitude; + + long value( long nMax ) + { + switch( m_eDir ) + { + case eLeftTop: + return m_nMagnitude; + + case ePercent: + return ( ( nMax * m_nMagnitude ) / 100 ); + + case eRightBottom: + return nMax - m_nMagnitude; + } + + // Unknown type + _ASSERT( FALSE ); + return 0; + } + }; + + cValue m_x, m_y; + + HRESULT onLoad( LPTSTR szData ); + HRESULT loadValue( LPTSTR szData, cValue &val ); + +DECLARE_REGISTRY_RESOURCEID(IDR_MOUSEMOVEACTION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cMouseMoveAction) + COM_INTERFACE_ENTRY(IInputAction) +END_COM_MAP() + +// IMouseMoveAction +public: + STDMETHOD(Execute)(); +}; + +#endif //__MOUSEMOVEACTION_H_ diff --git a/Native/DecalInput/MouseMoveAction.rgs b/Native/DecalInput/MouseMoveAction.rgs new file mode 100644 index 0000000..56bb427 --- /dev/null +++ b/Native/DecalInput/MouseMoveAction.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalInput.MouseMoveAction.1 = s 'MouseMoveAction Class' + { + CLSID = s '{57D18578-0BF0-4DE5-A0A9-E7CB531C0429}' + } + DecalInput.MouseMoveAction = s 'MouseMoveAction Class' + { + CLSID = s '{57D18578-0BF0-4DE5-A0A9-E7CB531C0429}' + CurVer = s 'DecalInput.MouseMoveAction.1' + } + NoRemove CLSID + { + ForceRemove {57D18578-0BF0-4DE5-A0A9-E7CB531C0429} = s 'MouseMoveAction Class' + { + ProgID = s 'DecalInput.MouseMoveAction.1' + VersionIndependentProgID = s 'DecalInput.MouseMoveAction' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove InputActions + { + ForceRemove {57D18578-0BF0-4DE5-A0A9-E7CB531C0429} = s 'Mouse Move Input Action' + { + val Enabled = d '1' + val Prefix = s 'mousemove' + } + } + } + } +} diff --git a/Native/DecalInput/PolledDelayAction.cpp b/Native/DecalInput/PolledDelayAction.cpp new file mode 100644 index 0000000..5c3079f --- /dev/null +++ b/Native/DecalInput/PolledDelayAction.cpp @@ -0,0 +1,8 @@ +// PolledDelayAction.cpp : Implementation of cPolledDelayAction +#include "stdafx.h" +#include "DecalInput.h" +#include "PolledDelayAction.h" + +///////////////////////////////////////////////////////////////////////////// +// cPolledDelayAction + diff --git a/Native/DecalInput/PolledDelayAction.h b/Native/DecalInput/PolledDelayAction.h new file mode 100644 index 0000000..ecb0135 --- /dev/null +++ b/Native/DecalInput/PolledDelayAction.h @@ -0,0 +1,84 @@ +// PolledDelayAction.h : Declaration of the cPolledDelayAction + +#ifndef __POLLEDDELAYACTION_H_ +#define __POLLEDDELAYACTION_H_ + +#include "resource.h" // main symbols +#include + +///////////////////////////////////////////////////////////////////////////// +// cPolledDelayAction +class ATL_NO_VTABLE cPolledDelayAction : + public CComObjectRootEx, + public CComCoClass, + public IInputActionImpl< cPolledDelayAction > +{ +public: + cPolledDelayAction() + : m_bFirst( true ) + { + } + + bool m_bFirst; + long m_nTime, + m_nEvent; + + HRESULT load( LPTSTR szBuffer ) + { + int nSep = ::_tcscspn( szBuffer, _T( ";" ) ); + if( nSep == -1 ) + return E_INVALIDARG; + + szBuffer[ nSep ] = _T( '\0' ); + if( ::_stscanf( szBuffer, _T( "%i" ), &m_nTime ) != 1 ) + return E_INVALIDARG; + + if( ::_stscanf( szBuffer + nSep + 1, _T( "%i" ), &m_nEvent ) != 1 ) + return E_INVALIDARG; + + return S_OK; + } + +DECLARE_REGISTRY_RESOURCEID(IDR_POLLEDDELAYACTION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cPolledDelayAction) + COM_INTERFACE_ENTRY(IInputAction) +END_COM_MAP() + +// IPolledDelayAction +public: + STDMETHOD(Reset)() + { + m_bFirst = true; + return S_OK; + } + + STDMETHOD(Execute)() + { + if( !m_bFirst ) + { + // Fire the event to figure out if we should continue + VARIANT_BOOL bContinue = VARIANT_FALSE; + VARIANT vParam; + vParam.vt = VT_BOOL | VT_BYREF; + vParam.pboolVal = &bContinue; + + m_pSite->FireEvent( m_nEvent, vParam ); + + if( !bContinue ) + // Abort and let it carry on + return S_OK; + } + else + // Clear the first flag + m_bFirst = false; + + m_pSite->Delay( m_nTime, VARIANT_FALSE ); + + return S_OK; + } +}; + +#endif //__POLLEDDELAYACTION_H_ diff --git a/Native/DecalInput/PolledDelayAction.rgs b/Native/DecalInput/PolledDelayAction.rgs new file mode 100644 index 0000000..e3614b9 --- /dev/null +++ b/Native/DecalInput/PolledDelayAction.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalInput.PolledDelayAction.1 = s 'PolledDelayAction Class' + { + CLSID = s '{762335B2-2274-4BB4-8B1F-F7286C949FF7}' + } + DecalInput.PolledDelayAction = s 'PolledDelayAction Class' + { + CLSID = s '{762335B2-2274-4BB4-8B1F-F7286C949FF7}' + CurVer = s 'DecalInput.PolledDelayAction.1' + } + NoRemove CLSID + { + ForceRemove {762335B2-2274-4BB4-8B1F-F7286C949FF7} = s 'PolledDelayAction Class' + { + ProgID = s 'DecalInput.PolledDelayAction.1' + VersionIndependentProgID = s 'DecalInput.PolledDelayAction' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove InputActions + { + ForceRemove {762335B2-2274-4BB4-8B1F-F7286C949FF7} = s 'Polled Delay Input Action' + { + val Enabled = d '1' + val Prefix = s 'polldelay' + } + } + } + } +} diff --git a/Native/DecalInput/RestoreAction.cpp b/Native/DecalInput/RestoreAction.cpp new file mode 100644 index 0000000..23dfbb9 --- /dev/null +++ b/Native/DecalInput/RestoreAction.cpp @@ -0,0 +1,8 @@ +// RestoreAction.cpp : Implementation of cRestoreAction +#include "stdafx.h" +#include "DecalInput.h" +#include "RestoreAction.h" + +///////////////////////////////////////////////////////////////////////////// +// cRestoreAction + diff --git a/Native/DecalInput/RestoreAction.h b/Native/DecalInput/RestoreAction.h new file mode 100644 index 0000000..955593a --- /dev/null +++ b/Native/DecalInput/RestoreAction.h @@ -0,0 +1,54 @@ +// RestoreAction.h : Declaration of the cRestoreAction + +#ifndef __RESTOREACTION_H_ +#define __RESTOREACTION_H_ + +#include "resource.h" // main symbols +#include + +///////////////////////////////////////////////////////////////////////////// +// cRestoreAction +class ATL_NO_VTABLE cRestoreAction : + public CComObjectRootEx, + public CComCoClass, + public IInputActionImpl< cRestoreAction > +{ +public: + cRestoreAction() + { + } + + POINT m_pt; + + // Nothing to load really + +DECLARE_REGISTRY_RESOURCEID(IDR_RESTOREACTION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cRestoreAction) + COM_INTERFACE_ENTRY(IInputAction) +END_COM_MAP() + +// IRestoreAction +public: + STDMETHOD(get_Stackable)(VARIANT_BOOL *pVal) + { + *pVal = VARIANT_TRUE; + return S_OK; + } + + STDMETHOD(Push)() + { + ::GetCursorPos( &m_pt ); + return S_OK; + } + + STDMETHOD(Pop)() + { + m_pSite->MoveMouse( m_pt.x, m_pt.y ); + return S_OK; + } +}; + +#endif //__RESTOREACTION_H_ diff --git a/Native/DecalInput/RestoreAction.rgs b/Native/DecalInput/RestoreAction.rgs new file mode 100644 index 0000000..9fb64c5 --- /dev/null +++ b/Native/DecalInput/RestoreAction.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalInput.RestoreAction.1 = s 'RestoreAction Class' + { + CLSID = s '{6EE2F682-7129-44BE-84B9-787BAE35EC1C}' + } + DecalInput.RestoreAction = s 'RestoreAction Class' + { + CLSID = s '{6EE2F682-7129-44BE-84B9-787BAE35EC1C}' + CurVer = s 'DecalInput.RestoreAction.1' + } + NoRemove CLSID + { + ForceRemove {6EE2F682-7129-44BE-84B9-787BAE35EC1C} = s 'RestoreAction Class' + { + ProgID = s 'DecalInput.RestoreAction.1' + VersionIndependentProgID = s 'DecalInput.RestoreAction' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove InputActions + { + ForceRemove {6EE2F682-7129-44BE-84B9-787BAE35EC1C} = s 'Restore Input Action' + { + val Enabled = d '1' + val Prefix = s 'restore' + } + } + } + } +} diff --git a/Native/DecalInput/StdAfx.cpp b/Native/DecalInput/StdAfx.cpp new file mode 100644 index 0000000..07f7b46 --- /dev/null +++ b/Native/DecalInput/StdAfx.cpp @@ -0,0 +1,5 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" diff --git a/Native/DecalInput/StdAfx.h b/Native/DecalInput/StdAfx.h new file mode 100644 index 0000000..19f7b20 --- /dev/null +++ b/Native/DecalInput/StdAfx.h @@ -0,0 +1,40 @@ +// 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__F251EED2_D7E2_4CAB_B862_F92CB04AF3C6__INCLUDED_) +#define AFX_STDAFX_H__F251EED2_D7E2_4CAB_B862_F92CB04AF3C6__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _ATL_APARTMENT_THREADED + +#pragma warning(disable:4530) + +#ifdef NDEBUG + #ifdef _ATL_DLL + #undef _ATL_DLL + #endif +#endif +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include +#include + +#include +#include +#include +#include +#include +#import + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__F251EED2_D7E2_4CAB_B862_F92CB04AF3C6__INCLUDED) diff --git a/Native/DecalInput/Timer.cpp b/Native/DecalInput/Timer.cpp new file mode 100644 index 0000000..934181b --- /dev/null +++ b/Native/DecalInput/Timer.cpp @@ -0,0 +1,96 @@ +// Timer.cpp : Implementation of cTimer +#include "stdafx.h" +#include "DecalInput.h" +#include "Timer.h" + +#include "InputService.h" + +///////////////////////////////////////////////////////////////////////////// +// cTimer + +STDMETHODIMP cTimer::Start(long Interval) +{ + if( cInputService::g_p == NULL ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + if( Interval <= 0 ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + if( m_bStarted ) + Stop(); + + m_nStart = static_cast< long >( ::timeGetTime() ); + m_nInterval = Interval; + + static_cast< IDispatch * >( cInputService::g_p )->AddRef(); + cInputService::g_p->m_timers.push_back( this ); + + m_bStarted = true; + + return S_OK; +} + +STDMETHODIMP cTimer::Stop() +{ + if( cInputService::g_p == NULL ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + if( !m_bStarted ) + return S_FALSE; + + m_bStarted = false; + + // Remove from the input service + for( cInputService::cTimerList::iterator i = cInputService::g_p->m_timers.begin(); i != cInputService::g_p->m_timers.end(); ++ i ) + { + if( *i == this ) + { + cInputService::g_p->m_timers.erase( i ); + static_cast< IDispatch * >( cInputService::g_p )->Release(); + return S_OK; + } + } + + _ASSERT( FALSE ); + return E_FAIL; +} + +STDMETHODIMP cTimer::get_Tag(VARIANT *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + return ::VariantCopy( pVal, &m_tag ); +} + +STDMETHODIMP cTimer::put_Tag(VARIANT newVal) +{ + m_tag = newVal; + + return S_OK; +} + +STDMETHODIMP cTimer::get_Running(VARIANT_BOOL *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = ( m_bStarted ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} diff --git a/Native/DecalInput/Timer.h b/Native/DecalInput/Timer.h new file mode 100644 index 0000000..552644a --- /dev/null +++ b/Native/DecalInput/Timer.h @@ -0,0 +1,60 @@ +// Timer.h : Declaration of the cTimer + +#ifndef __TIMER_H_ +#define __TIMER_H_ + +#include "resource.h" // main symbols +#include "DecalInputCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cTimer +class ATL_NO_VTABLE cTimer : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public IProvideClassInfo2Impl< &CLSID_Timer, &DIID_ITimerEvents, &LIBID_DecalInput >, + public IDispatchImpl, + public CProxyITimerEvents< cTimer > +{ +public: + cTimer() + : m_bStarted( false ) + { + } + + void FinalRelease() + { + if( m_bStarted ) + Stop(); + } + + _variant_t m_tag; + bool m_bStarted; + long m_nStart, + m_nInterval; + +DECLARE_REGISTRY_RESOURCEID(IDR_TIMER) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cTimer) + COM_INTERFACE_ENTRY(IDecalTimer) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() +BEGIN_CONNECTION_POINT_MAP(cTimer) +CONNECTION_POINT_ENTRY(DIID_ITimerEvents) +END_CONNECTION_POINT_MAP() + +// ITimer +public: + STDMETHOD(get_Running)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_Tag)(/*[out, retval]*/ VARIANT *pVal); + STDMETHOD(put_Tag)(/*[in]*/ VARIANT newVal); + STDMETHOD(Stop)(); + STDMETHOD(Start)(long Interval); +}; + +#endif //__TIMER_H_ diff --git a/Native/DecalInput/Timer.rgs b/Native/DecalInput/Timer.rgs new file mode 100644 index 0000000..55fe890 --- /dev/null +++ b/Native/DecalInput/Timer.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalInput.Timer.1 = s 'Timer Class' + { + CLSID = s '{79497C87-92E1-416B-AE5C-9D6C4C59133C}' + } + DecalInput.Timer = s 'Timer Class' + { + CLSID = s '{79497C87-92E1-416B-AE5C-9D6C4C59133C}' + CurVer = s 'DecalInput.Timer.1' + } + NoRemove CLSID + { + ForceRemove {79497C87-92E1-416B-AE5C-9D6C4C59133C} = s 'Timer Class' + { + ProgID = s 'DecalInput.Timer.1' + VersionIndependentProgID = s 'DecalInput.Timer' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} diff --git a/Native/DecalInput/TypeAction.cpp b/Native/DecalInput/TypeAction.cpp new file mode 100644 index 0000000..eda584b --- /dev/null +++ b/Native/DecalInput/TypeAction.cpp @@ -0,0 +1,231 @@ +// TypeAction.cpp : Implementation of cTypeAction +#include "stdafx.h" +#include "DecalInput.h" +#include "TypeAction.h" + +///////////////////////////////////////////////////////////////////////////// +// cTypeAction + +HRESULT cTypeAction::extractKey( LPTSTR &szIter, long nShiftState, IInputService *pService ) +{ + HRESULT hRes; + + switch( *szIter ) + { + case _T( '\0' ): + return E_INVALIDARG; + + case _T( '{' ): + // Make sure this is a good key + { + for( TCHAR *szChar = szIter + 1; *szChar != _T( '\0' ); ++ szChar ) + { + if( *szChar == _T( '}' ) ) + { + // Look up this character in the site table + std::string strspecial( szIter + 1, szChar - ( szIter + 1 ) ); + long nVK; + + hRes = pService->get_KeyByName( _bstr_t( strspecial.c_str() ), &nVK ); + if( FAILED( hRes ) ) + { + _ASSERTE( FALSE ); + return E_INVALIDARG; + } + + cKey key = { nShiftState, nVK }; + m_keys.push_back( key ); + szIter = szChar + 1; + break; + } + } + + if( *szChar == _T( '\0' ) ) + { + // Unterminated constant + return E_INVALIDARG; + } + } + break; + + case _T( '<' ): + { + for( TCHAR *szChar = szIter + 1; *szChar != _T( '\0' ); ++ szChar ) + { + if( *szChar == _T( '>' ) ) + { + // Look up this character in the site table + std::string strspecial( szIter + 1, szChar - ( szIter + 1 ) ); + long nVK; + + hRes = pService->get_CommandKey( _bstr_t( strspecial.c_str() ), &nVK ); + if( hRes != S_OK ) + { + _ASSERTE( FALSE ); + return E_INVALIDARG; + } + + cKey key = { nShiftState, nVK }; + m_keys.push_back( key ); + szIter = szChar + 1; + break; + } + } + + if( *szChar == _T( '\0' ) ) + { + // Unterminated constant + return E_INVALIDARG; + } + } + break; + + default: + { + // Convert the character + WORD wVkScan = VkKeyScan( *szIter ); + + cKey key = { nShiftState | ( wVkScan & SHIFT_MASK ), + wVkScan & VKEY_MASK }; + m_keys.push_back( key ); + + ++ szIter; + } + } + + return S_OK; +} + +HRESULT cTypeAction::onLoad( LPTSTR szData ) +{ + USES_CONVERSION; + + typedef std::stack< long > cShiftStack; + cShiftStack shifts; + long nCurrentShift = 0; + + CComPtr< IInputService > pService; + HRESULT hRes = m_pSite->get_Service( &pService ); + if( FAILED( hRes ) ) + return hRes; + + for( TCHAR *szIter = szData; *szIter != _T( '\0' ); ) + { + switch( *szIter ) + { + case _T( '+' ): + if( szIter[ 1 ] == _T( '(' ) ) + { + szIter += 2; + shifts.push( nCurrentShift ); + nCurrentShift |= MASK_SHIFT; + } + else + { + ++ szIter; + hRes = extractKey( szIter, nCurrentShift | MASK_SHIFT, pService ); + if( FAILED( hRes ) ) + return hRes; + } + break; + + case _T( '^' ): + if( szIter[ 1 ] == _T( '(' ) ) + { + szIter += 2; + shifts.push( nCurrentShift ); + nCurrentShift |= MASK_CTRL; + } + else + { + ++ szIter; + hRes = extractKey( szIter, nCurrentShift | MASK_SHIFT, pService ); + if( FAILED( hRes ) ) + return hRes; + } + break; + + case _T( '%' ): + if( szIter[ 1 ] == _T( '(' ) ) + { + szIter += 2; + shifts.push( nCurrentShift ); + nCurrentShift |= MASK_ALT; + } + else + { + ++ szIter; + hRes = extractKey( szIter, nCurrentShift | MASK_SHIFT, pService ); + if( FAILED( hRes ) ) + return hRes; + } + break; + + case _T( ')' ): + { + if( shifts.size() == 0 ) + { + // Misplaced ')' + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + nCurrentShift = shifts.top(); + shifts.pop(); + + ++ szIter; + } + break; + + default: + hRes = extractKey( szIter, nCurrentShift, pService ); + if( FAILED( hRes ) ) + return hRes; + + break; + } + } + + if( shifts.size() > 0 ) + { + // Unterminated shift + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + // Successful parsing WTG! + return S_OK; +} + +STDMETHODIMP cTypeAction::Execute() +{ + long nShift = 0; + for( cKeyList::iterator i = m_keys.begin(); i != m_keys.end(); ++ i ) + { + transitionShift( nShift, i->m_nShiftState ); + pressKey( i->m_nVK, true ); + pressKey( i->m_nVK, false ); + + nShift = i->m_nShiftState; + } + + // Make sure all shift keys are released + transitionShift( nShift, 0 ); + flushInput(); + + return S_OK; +} + +STDMETHODIMP cTypeAction::Push() +{ + doInput( m_keys.begin(), m_keys.end(), true ); + + return S_OK; +} + +STDMETHODIMP cTypeAction::Pop() +{ + doInput( m_keys.rbegin(), m_keys.rend(), false ); + + return S_OK; +} diff --git a/Native/DecalInput/TypeAction.h b/Native/DecalInput/TypeAction.h new file mode 100644 index 0000000..7417228 --- /dev/null +++ b/Native/DecalInput/TypeAction.h @@ -0,0 +1,140 @@ +// TypeAction.h : Declaration of the cTypeAction + +#ifndef __TYPEACTION_H_ +#define __TYPEACTION_H_ + +#include "resource.h" // main symbols +#include + +#define MASK_SHIFT 0x0100 +#define MASK_CTRL 0x0200 +#define MASK_ALT 0x0400 + +#define SHIFT_MASK 0x0700 +#define VKEY_MASK 0x00FF + +///////////////////////////////////////////////////////////////////////////// +// cTypeAction +class ATL_NO_VTABLE cTypeAction : + public CComObjectRootEx, + public CComCoClass, + public IInputActionImpl< cTypeAction > +{ +public: + cTypeAction() + : i_input( m_pInput ) + { + ::memset( m_pInput, 0, sizeof( INPUT ) * 16 ); + } + + struct cKey + { + long m_nShiftState, + m_nVK; + }; + + typedef std::deque< cKey > cKeyList; + cKeyList m_keys; + + INPUT m_pInput[ 32 ], + *i_input; + + void nextInput() + { + ++ i_input; + if( i_input == ( m_pInput + 32 ) ) + flushInput(); + } + + void flushInput() + { + if( i_input != m_pInput ) + { + ::SendInput( ( i_input - m_pInput ), m_pInput, sizeof( INPUT ) ); + i_input = m_pInput; + ::memset( m_pInput, 0, sizeof( INPUT ) * 32 ); + } + } + + void pressKey(long nVK, bool bDown) + { + switch( nVK ) + { + case VK_LBUTTON: + i_input->type = INPUT_MOUSE; + i_input->mi.dwFlags = ( bDown ) ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP; + break; + + case VK_RBUTTON: + i_input->type = INPUT_MOUSE; + i_input->mi.dwFlags = ( bDown ) ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP; + break; + + default: + i_input->type = INPUT_KEYBOARD; + i_input->ki.wVk = nVK; + i_input->ki.wScan = ::MapVirtualKey( nVK, 0 ); + i_input->ki.dwFlags = ( bDown ) ? 0 : KEYEVENTF_KEYUP; + break; + } + + nextInput(); + } + + void transitionShift(long nFrom, long nTo) + { + if( nFrom == nTo ) + // Nothing to transition + return; + + // Check for all 6 possible key presses + if( ( nFrom & MASK_SHIFT ) && !( nTo & MASK_SHIFT ) ) + pressKey( VK_SHIFT, false ); + else if( !( nFrom & MASK_SHIFT ) && ( nTo & MASK_SHIFT ) ) + pressKey( VK_SHIFT, true ); + + if( ( nFrom & MASK_CTRL ) && !( nTo & MASK_CTRL ) ) + pressKey( VK_CONTROL, false ); + else if( !( nFrom & MASK_CTRL ) && ( nTo & MASK_CTRL ) ) + pressKey( VK_CONTROL, true ); + + if( ( nFrom & MASK_ALT ) && !( nTo & MASK_ALT ) ) + pressKey( VK_MENU, false ); + else if( !( nFrom & MASK_ALT ) && ( nTo & MASK_ALT ) ) + pressKey( VK_MENU, true ); + } + + HRESULT extractKey( LPTSTR &szIterator, long nShiftState, IInputService *pService ); + HRESULT onLoad( LPTSTR szData ); + + template< class iterator_t > + void doInput( iterator_t begin, iterator_t end, bool bDown ) + { + for( iterator_t i = begin; i != end; ++ i ) + pressKey( i->m_nVK, bDown ); + + flushInput(); + } + +DECLARE_REGISTRY_RESOURCEID(IDR_TYPEACTION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cTypeAction) + COM_INTERFACE_ENTRY(IInputAction) +END_COM_MAP() + +// ITypeAction +public: + STDMETHOD(get_Stackable)(VARIANT_BOOL *pVal) + { + *pVal = VARIANT_TRUE; + return S_OK; + } + + STDMETHOD(Execute)(); + STDMETHOD(Push)(); + STDMETHOD(Pop)(); +}; + +#endif //__TYPEACTION_H_ diff --git a/Native/DecalInput/TypeAction.rgs b/Native/DecalInput/TypeAction.rgs new file mode 100644 index 0000000..dd31998 --- /dev/null +++ b/Native/DecalInput/TypeAction.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalInput.TypeAction.1 = s 'TypeAction Class' + { + CLSID = s '{9CDCEEDC-F8AC-42D5-9A05-52B9346D00A4}' + } + DecalInput.TypeAction = s 'TypeAction Class' + { + CLSID = s '{9CDCEEDC-F8AC-42D5-9A05-52B9346D00A4}' + CurVer = s 'DecalInput.TypeAction.1' + } + NoRemove CLSID + { + ForceRemove {9CDCEEDC-F8AC-42D5-9A05-52B9346D00A4} = s 'TypeAction Class' + { + ProgID = s 'DecalInput.TypeAction.1' + VersionIndependentProgID = s 'DecalInput.TypeAction' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove InputActions + { + ForceRemove {9CDCEEDC-F8AC-42D5-9A05-52B9346D00A4} = s 'Typing Input Action' + { + val Enabled = d '1' + val Prefix = s 'type' + } + } + } + } +} diff --git a/Native/DecalInput/WinMsgHook.cpp b/Native/DecalInput/WinMsgHook.cpp new file mode 100644 index 0000000..5faddf9 --- /dev/null +++ b/Native/DecalInput/WinMsgHook.cpp @@ -0,0 +1,81 @@ +// WinMsgHook.cpp : Implementation of cWinMsgHook +#include "stdafx.h" +#include "DecalInput.h" +#include "WinMsgHook.h" + +#include "InputService.h" + +///////////////////////////////////////////////////////////////////////////// +// cWinMsgHook + + +STDMETHODIMP cWinMsgHook::get_Tag(VARIANT *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + return ::VariantCopy( pVal, &m_tag ); +} + +STDMETHODIMP cWinMsgHook::put_Tag(VARIANT newVal) +{ + m_tag = newVal; + + return S_OK; +} + +STDMETHODIMP cWinMsgHook::get_Enabled(VARIANT_BOOL *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = ( m_bEnabled ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cWinMsgHook::put_Enabled(VARIANT_BOOL newVal) +{ + if( !!newVal == m_bEnabled ) + return S_FALSE; + + if( cInputService::g_p == NULL ) + { + // Input Service must be started to enable or disable a hotkey + _ASSERT( FALSE ); + return E_FAIL; + } + + m_bEnabled = !!newVal; + + if( m_bEnabled ) + { +#ifdef _DEBUG + for( cInputService::cWinMsgHookList::iterator i = cInputService::g_p->m_msghooks.begin(); i != cInputService::g_p->m_msghooks.end(); ++ i ) + _ASSERTE( *i != this ); +#endif + + cInputService::g_p->m_msghooks.push_back( this ); + } + else + { + for( cInputService::cWinMsgHookList::iterator i = cInputService::g_p->m_msghooks.begin(); i != cInputService::g_p->m_msghooks.end(); ++ i ) + { + if( *i == this ) + { + cInputService::g_p->m_msghooks.erase( i ); + break; + } + } + + _ASSERTE( i != cInputService::g_p->m_msghooks.end() ); + } + + return S_OK; +} diff --git a/Native/DecalInput/WinMsgHook.h b/Native/DecalInput/WinMsgHook.h new file mode 100644 index 0000000..63efc85 --- /dev/null +++ b/Native/DecalInput/WinMsgHook.h @@ -0,0 +1,57 @@ +// WinMsgHook.h : Declaration of the cWinMsgHook + +#ifndef __WINMSGHOOK_H_ +#define __WINMSGHOOK_H_ + +#include "resource.h" // main symbols +#include "DecalInputCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cWinMsgHook +class ATL_NO_VTABLE cWinMsgHook : + public CComObjectRootEx, + public CComCoClass, + public IProvideClassInfo2Impl< &CLSID_WinMsgHook, &DIID_IWinMsgHookEvents, &LIBID_DecalInput >, + public IConnectionPointContainerImpl, + public IDispatchImpl, + public CProxyIWinMsgHookEvents< cWinMsgHook > +{ +public: + cWinMsgHook() + : m_bEnabled( false ) + { + } + + void FinalRelease() + { + if( m_bEnabled ) + put_Enabled( VARIANT_FALSE ); + } + + _variant_t m_tag; + bool m_bEnabled; + +DECLARE_REGISTRY_RESOURCEID(IDR_WINMSGHOOK) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cWinMsgHook) + COM_INTERFACE_ENTRY(IWinMsgHook) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() +BEGIN_CONNECTION_POINT_MAP(cWinMsgHook) +CONNECTION_POINT_ENTRY(DIID_IWinMsgHookEvents) +END_CONNECTION_POINT_MAP() + +// IWinMsgHook +public: + STDMETHOD(get_Enabled)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Enabled)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_Tag)(/*[out, retval]*/ VARIANT *pVal); + STDMETHOD(put_Tag)(/*[in]*/ VARIANT newVal); +}; + +#endif //__WINMSGHOOK_H_ diff --git a/Native/DecalInput/WinMsgHook.rgs b/Native/DecalInput/WinMsgHook.rgs new file mode 100644 index 0000000..bfaacb7 --- /dev/null +++ b/Native/DecalInput/WinMsgHook.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalInput.WinMsgHook.1 = s 'WinMsgHook Class' + { + CLSID = s '{F3170E85-517E-43A4-B7B4-6F006A7B1B85}' + } + DecalInput.WinMsgHook = s 'WinMsgHook Class' + { + CLSID = s '{F3170E85-517E-43A4-B7B4-6F006A7B1B85}' + CurVer = s 'DecalInput.WinMsgHook.1' + } + NoRemove CLSID + { + ForceRemove {F3170E85-517E-43A4-B7B4-6F006A7B1B85} = s 'WinMsgHook Class' + { + ProgID = s 'DecalInput.WinMsgHook.1' + VersionIndependentProgID = s 'DecalInput.WinMsgHook' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} diff --git a/Native/DecalInput/WndMsg.cpp b/Native/DecalInput/WndMsg.cpp new file mode 100644 index 0000000..778e567 --- /dev/null +++ b/Native/DecalInput/WndMsg.cpp @@ -0,0 +1,50 @@ +// WndMsg.cpp : Implementation of cWndMsg +#include "stdafx.h" +#include "DecalInput.h" +#include "WndMsg.h" + +///////////////////////////////////////////////////////////////////////////// +// cWndMsg + + +STDMETHODIMP cWndMsg::get_HWND(long *pVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cWndMsg::get_Message(long *pVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cWndMsg::get_WParam(long *pVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cWndMsg::get_LParam(long *pVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cWndMsg::get_Eat(VARIANT_BOOL *pVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cWndMsg::put_Eat(VARIANT_BOOL newVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} diff --git a/Native/DecalInput/WndMsg.h b/Native/DecalInput/WndMsg.h new file mode 100644 index 0000000..f00aca8 --- /dev/null +++ b/Native/DecalInput/WndMsg.h @@ -0,0 +1,55 @@ +// WndMsg.h : Declaration of the cWndMsg + +#ifndef __WNDMSG_H_ +#define __WNDMSG_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cWndMsg +class ATL_NO_VTABLE cWndMsg : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + cWndMsg() + { + } + + long m_hWnd, + m_nMsg, + m_nWParam, + m_nLParam; + + bool m_bEaten; + + void loadMessage( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) + { + m_hWnd = reinterpret_cast< long >( hWnd ); + m_nMsg = static_cast< long >( nMsg ); + m_nWParam = static_cast< long >( wParam ); + m_nLParam = static_cast< long >( lParam ); + m_bEaten = false; + } + +DECLARE_REGISTRY_RESOURCEID(IDR_WNDMSG) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cWndMsg) + COM_INTERFACE_ENTRY(IWndMsg) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IWndMsg +public: + STDMETHOD(get_Eat)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Eat)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_LParam)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_WParam)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Message)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_HWND)(/*[out, retval]*/ long *pVal); +}; + +#endif //__WNDMSG_H_ diff --git a/Native/DecalInput/WndMsg.rgs b/Native/DecalInput/WndMsg.rgs new file mode 100644 index 0000000..c7c5f9b --- /dev/null +++ b/Native/DecalInput/WndMsg.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalInput.WndMsg.1 = s 'WndMsg Class' + { + CLSID = s '{85AB0296-124E-4E68-A6A8-FCF5721AC09B}' + } + DecalInput.WndMsg = s 'WndMsg Class' + { + CLSID = s '{85AB0296-124E-4E68-A6A8-FCF5721AC09B}' + CurVer = s 'DecalInput.WndMsg.1' + } + NoRemove CLSID + { + ForceRemove {85AB0296-124E-4E68-A6A8-FCF5721AC09B} = s 'WndMsg Class' + { + ProgID = s 'DecalInput.WndMsg.1' + VersionIndependentProgID = s 'DecalInput.WndMsg' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E}' + } + } +} diff --git a/Native/DecalInput/resource.h b/Native/DecalInput/resource.h new file mode 100644 index 0000000..a598857 --- /dev/null +++ b/Native/DecalInput/resource.h @@ -0,0 +1,28 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by DecalInput.rc +// +#define IDS_PROJNAME 100 +#define IDR_INPUTSERVICE 101 +#define IDR_TIMER 102 +#define IDR_HOTKEY 103 +#define IDR_WINMSGHOOK 104 +#define IDR_WNDMSG 105 +#define IDR_INPUTBUFFER 106 +#define IDR_TYPEACTION 107 +#define IDR_MOUSEMOVEACTION 108 +#define IDR_DELAYACTION 109 +#define IDR_EVENTACTION 110 +#define IDR_POLLEDDELAYACTION 111 +#define IDR_RESTOREACTION 112 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 113 +#endif +#endif diff --git a/Native/DecalNet/ACMessage.h b/Native/DecalNet/ACMessage.h new file mode 100644 index 0000000..75eb28a --- /dev/null +++ b/Native/DecalNet/ACMessage.h @@ -0,0 +1,16 @@ +#pragma once + +class ACMessage +{ +public: + virtual BYTE *getData () = 0; + virtual DWORD getSize () = 0; + virtual DWORD getType () = 0; +}; + +class ACMessageSink +{ +public: + virtual void onMessage( ACMessage& ) = 0; + virtual void onMessageOut( ACMessage& ) = 0; +}; diff --git a/Native/DecalNet/DecalNet.cpp b/Native/DecalNet/DecalNet.cpp new file mode 100644 index 0000000..6c69bef --- /dev/null +++ b/Native/DecalNet/DecalNet.cpp @@ -0,0 +1,74 @@ +// DecalNet.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f DecalNetps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "DecalNet.h" + +#include "DecalNet_i.c" +#include "NetService.h" +#include "WebRequest.h" + + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_NetService, cNetService) +OBJECT_ENTRY(CLSID_WebRequest, cWebRequest) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_DecalNet); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + + diff --git a/Native/DecalNet/DecalNet.def b/Native/DecalNet/DecalNet.def new file mode 100644 index 0000000..068fbfe --- /dev/null +++ b/Native/DecalNet/DecalNet.def @@ -0,0 +1,9 @@ +; DecalNet.def : Declares the module parameters. + +LIBRARY "DecalNet.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Native/DecalNet/DecalNet.dsp b/Native/DecalNet/DecalNet.dsp new file mode 100644 index 0000000..5141eee --- /dev/null +++ b/Native/DecalNet/DecalNet.dsp @@ -0,0 +1,341 @@ +# Microsoft Developer Studio Project File - Name="DecalNet" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=DecalNet - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "DecalNet.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "DecalNet.mak" CFG="DecalNet - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "DecalNet - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalNet - Win32 Unicode Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalNet - Win32 Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DecalNet - Win32 Unicode Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "DecalNet - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /Ob0 /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\Projects\decaldev2\source\Debug\DecalNet.dll +InputPath=\Projects\decaldev2\source\Debug\DecalNet.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalNet - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "DebugU" +# PROP BASE Intermediate_Dir "DebugU" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "DebugU" +# PROP Intermediate_Dir "DebugU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\DebugU +TargetPath=.\DebugU\DecalNet.dll +InputPath=.\DebugU\DecalNet.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + if "%OS%"=="" goto NOTNT + if not "%OS%"=="Windows_NT" goto NOTNT + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + goto end + :NOTNT + echo Warning : Cannot register Unicode DLL on Windows 95 + :end + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalNet - Win32 Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinSize" +# PROP BASE Intermediate_Dir "ReleaseMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX- /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "_MBCS" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\Projects\decaldev2\source\Release\DecalNet.dll +InputPath=\Projects\decaldev2\source\Release\DecalNet.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "DecalNet - Win32 Unicode Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseUMinSize" +# PROP BASE Intermediate_Dir "ReleaseUMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ReleaseUMinSize" +# PROP Intermediate_Dir "ReleaseUMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "_UNICODE" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /Zi /O1 /I "..\Include" /D "_UNICODE" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib libctiny.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\ReleaseUMinSize +TargetPath=.\ReleaseUMinSize\DecalNet.dll +InputPath=.\ReleaseUMinSize\DecalNet.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + if "%OS%"=="" goto NOTNT + if not "%OS%"=="Windows_NT" goto NOTNT + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + goto end + :NOTNT + echo Warning : Cannot register Unicode DLL on Windows 95 + :end + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "DecalNet - Win32 Debug" +# Name "DecalNet - Win32 Unicode Debug" +# Name "DecalNet - Win32 Release MinSize" +# Name "DecalNet - Win32 Unicode Release MinSize" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\DecalNet.cpp +# End Source File +# Begin Source File + +SOURCE=.\DecalNet.def +# End Source File +# Begin Source File + +SOURCE=..\Include\DecalNet.idl +# ADD MTL /tlb "DecalNet.tlb" /h "..\Include\DecalNet.h" /iid "..\Include\DecalNet_i.c" +# End Source File +# Begin Source File + +SOURCE=.\DecalNet.rc +# End Source File +# Begin Source File + +SOURCE=.\FilterAdapterV1.cpp +# End Source File +# Begin Source File + +SOURCE=.\Message.cpp +# End Source File +# Begin Source File + +SOURCE=.\MessageLoaders.cpp +# End Source File +# Begin Source File + +SOURCE=.\MessageParsers.cpp +# End Source File +# Begin Source File + +SOURCE=.\MessageRoot.cpp +# End Source File +# Begin Source File + +SOURCE=.\MessageStruct.cpp +# End Source File +# Begin Source File + +SOURCE=.\MessageVector.cpp +# End Source File +# Begin Source File + +SOURCE=.\NetService.cpp +# End Source File +# Begin Source File + +SOURCE=.\ProtocolStack.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\WebRequest.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\DecalNetCP.h +# End Source File +# Begin Source File + +SOURCE=..\Include\DecalNetImpl.h +# End Source File +# Begin Source File + +SOURCE=.\FilterAdapterV1.h +# End Source File +# Begin Source File + +SOURCE=.\Message.h +# End Source File +# Begin Source File + +SOURCE=.\MessageImpl.h +# End Source File +# Begin Source File + +SOURCE=.\MessageLoaders.h +# End Source File +# Begin Source File + +SOURCE=.\MessageParsers.h +# End Source File +# Begin Source File + +SOURCE=.\MessageRoot.h +# End Source File +# Begin Source File + +SOURCE=.\MessageStruct.h +# End Source File +# Begin Source File + +SOURCE=.\MessageVector.h +# End Source File +# Begin Source File + +SOURCE=.\NetService.h +# End Source File +# Begin Source File + +SOURCE=.\ProtocolStack.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\WebRequest.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\NetService.rgs +# End Source File +# Begin Source File + +SOURCE=.\WebRequest.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/DecalNet/DecalNet.rc b/Native/DecalNet/DecalNet.rc new file mode 100644 index 0000000..c3d69d9 --- /dev/null +++ b/Native/DecalNet/DecalNet.rc @@ -0,0 +1,134 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""DecalNet.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "DecalNet is the core module that processes the network messages between the client and the server" + VALUE "FileDescription", "DecalNet Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "DecalNet" + VALUE "LegalCopyright", "Copyright 2001" + VALUE "OriginalFilename", "DecalNet.DLL" + VALUE "ProductName", "DecalNet Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "DecalNet" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_NETSERVICE REGISTRY "NetService.rgs" +IDR_WEBREQUEST REGISTRY "WebRequest.rgs" +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "DecalNet.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/DecalNet/DecalNet.vcproj b/Native/DecalNet/DecalNet.vcproj new file mode 100644 index 0000000..53ca3f4 --- /dev/null +++ b/Native/DecalNet/DecalNet.vcproj @@ -0,0 +1,1073 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/DecalNet/DecalNetCP.h b/Native/DecalNet/DecalNetCP.h new file mode 100644 index 0000000..8f2c215 --- /dev/null +++ b/Native/DecalNet/DecalNetCP.h @@ -0,0 +1,60 @@ +#ifndef _DECALNETCP_H_ +#define _DECALNETCP_H_ + +template +class CProxyIWebRequestEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Begin() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + return varResult.scode; + + } + HRESULT Fire_End(LONG nResultCode, BSTR strText) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = nResultCode; + pvars[0] = strText; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } +}; +#endif \ No newline at end of file diff --git a/Native/DecalNet/DecalNetps.def b/Native/DecalNet/DecalNetps.def new file mode 100644 index 0000000..b85eb55 --- /dev/null +++ b/Native/DecalNet/DecalNetps.def @@ -0,0 +1,11 @@ + +LIBRARY "DecalNetPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/DecalNet/DecalNetps.mk b/Native/DecalNet/DecalNetps.mk new file mode 100644 index 0000000..9d45129 --- /dev/null +++ b/Native/DecalNet/DecalNetps.mk @@ -0,0 +1,16 @@ + +DecalNetps.dll: dlldata.obj DecalNet_p.obj DecalNet_i.obj + link /dll /out:DecalNetps.dll /def:DecalNetps.def /entry:DllMain dlldata.obj DecalNet_p.obj DecalNet_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del DecalNetps.dll + @del DecalNetps.lib + @del DecalNetps.exp + @del dlldata.obj + @del DecalNet_p.obj + @del DecalNet_i.obj diff --git a/Native/DecalNet/FilterAdapterV1.cpp b/Native/DecalNet/FilterAdapterV1.cpp new file mode 100644 index 0000000..cc49974 --- /dev/null +++ b/Native/DecalNet/FilterAdapterV1.cpp @@ -0,0 +1,21 @@ +// FilterAdapterV1.cpp +// Implementation of class cFilterAdapterV1 + +#include "Stdafx.h" +#include "FilterAdapterV1.h" + +HRESULT cFilterAdapterV1::init ( REFCLSID clsid ) +{ + HRESULT hRes = ::CoCreateInstance ( clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, + reinterpret_cast< LPVOID * > ( &m_pV1 ) ); + _ASSERTE( SUCCEEDED ( hRes ) ); + return hRes; +} + +STDMETHODIMP cFilterAdapterV1::DispatchServer ( IMessage2 *pMessage ) +{ + CComPtr pNF; + HRESULT hRes = m_pV1->QueryInterface ( &pNF ); + _ASSERTE( SUCCEEDED ( hRes ) ); + return pNF->Dispatch ( pMessage ); +} diff --git a/Native/DecalNet/FilterAdapterV1.h b/Native/DecalNet/FilterAdapterV1.h new file mode 100644 index 0000000..a9fdda0 --- /dev/null +++ b/Native/DecalNet/FilterAdapterV1.h @@ -0,0 +1,28 @@ +// FilterAdapterV1.h +// Declaration of the filter adapter for V1 filters + +#ifndef __FILTERADAPTER_H +#define __FILTERADAPTER_H + +#include + +class cFilterAdapterV1 +: public CComObjectRootEx< CComMultiThreadModel >, +public ISoloNetworkFilterImpl< cFilterAdapterV1 > +{ + CComPtr m_pV1; + +public: + HRESULT init ( REFCLSID clsid ); + +BEGIN_COM_MAP(cFilterAdapterV1) + COM_INTERFACE_ENTRY(INetworkFilter2) + COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_pV1.p) +END_COM_MAP() + +public: + // INetworkFilter2 + STDMETHOD(DispatchServer)(IMessage2 *pMessage); +}; + +#endif diff --git a/Native/DecalNet/Message.cpp b/Native/DecalNet/Message.cpp new file mode 100644 index 0000000..361376f --- /dev/null +++ b/Native/DecalNet/Message.cpp @@ -0,0 +1,393 @@ +// Message.cpp : Implementation of cMessage +#include "stdafx.h" +#include "DecalNet.h" +#include "NetService.h" +#include "Message.h" + +#include "MessageLoaders.h" +#include "MessageParsers.h" +#include "MessageRoot.h" + +cMessage::cFieldList::iterator cMessage::cLoadContext::lookupField( cMessage::cMessageElement *pElement ) +{ + for( cLoadContext *pContext = this; pContext != NULL; pContext = pContext->m_pParent ) + { + for( cFieldList::iterator i = pContext->m_pMessage->m_fields.begin() + pContext->m_dwOffset; i != pContext->m_pMessage->m_fields.end(); i += i->m_nOwns ) + { + if( i->m_pSchema == pElement ) + return i; + } + } + + return m_pMessage->m_fields.end(); +} + +void cMessage::cMessageSchema::loadSchema( MSXML::IXMLDOMDocumentPtr &pDoc, DWORD dwSchema ) +{ + TCHAR szQuery[ 255 ]; + ::_stprintf( szQuery, _T( "/schema/messages/message[@type='%04X']" ), dwSchema ); + + MSXML::IXMLDOMElementPtr pMessage = pDoc->selectSingleNode( szQuery ); + if( pMessage.GetInterfacePtr() == NULL ) + // Nothing here, so we create a valid but empty message + return; + + cElementParser::cContext c( &m_members ); + c.parseChildren( pMessage ); +} + +void cMessage::init() +{ + // Load the schema + CComBSTR strTemplate( _T( "%decal%\\messages.xml" ) ), + strPath; + m_pService->m_pDecal->MapPath( strTemplate, &strPath ); + + g_pXML.CreateInstance( __uuidof( MSXML::DOMDocument ) ); + BOOL bSuccess = g_pXML->load( strPath.m_str ); + + if( ! bSuccess ) + { + USES_CONVERSION; + std::string szXML; + DecryptXML( OLE2A( strPath.m_str ), szXML ); + + if( szXML != "" ) + bSuccess = g_pXML->loadXML( _bstr_t( szXML.c_str() ) ); + } + + // Initialize our schema helper objects + cFieldLoader::init(); + cElementParser::init(); +} + +void cMessage::DecryptXML( const char *szPath, std::string &szXML ) +{ + if( szPath == NULL ) + { + szXML = ""; + return; + } + + FILE *f = fopen( szPath, "rb" ); + if( f == NULL ) + { + szXML = ""; + return; + } + + szXML.clear(); + unsigned char szBuffer[1025]; + + try + { + CCryptProv crypt; + if( crypt.Initialize( PROV_RSA_FULL, "Decal_Memlocs", MS_DEF_PROV ) == NTE_BAD_KEYSET ) + crypt.Initialize( PROV_RSA_FULL, "Decal_Memlocs", MS_DEF_PROV, CRYPT_NEWKEYSET ); + + CCryptMD5Hash hash; + hash.Initialize( crypt ); + hash.AddString( DECAL_KEY ); + + CCryptDerivedKey key; + key.Initialize( crypt, hash ); + + DWORD dwDecLen = 0; + + while( ! feof(f) ) + { + memset( szBuffer, 0, sizeof( szBuffer ) ); + dwDecLen = fread( szBuffer, 1, 1024, f ); + key.Decrypt( feof(f), (BYTE *) szBuffer, &dwDecLen ); + szXML += (char *)szBuffer; + } + + key.Destroy(); + hash.Destroy(); + crypt.Release(); + } + + catch( ... ) + { + // crap... + szXML = ""; + } + + fclose( f ); +} + +void cMessage::term() +{ + g_schema.clear(); + cElementParser::term(); + cFieldLoader::term(); + + if( g_pXML.GetInterfacePtr() != NULL ) + g_pXML.Release(); +} + +///////////////////////////////////////////////////////////////////////////// +// cMessage + +cMessage::cMessage() +: m_nType( 0 ), +m_pStartCrack( NULL ), +m_pEndCrack( NULL ), +m_pEndData( NULL ), +m_pSchema( NULL ), +m_pRoot( NULL ) +{ +} + +cMessage::cFieldList::iterator cMessage::getFieldFromElement( cMessageElement *pElement ) +{ + for( cFieldList::iterator i = m_fields.begin(); i != m_fields.end(); i += i->m_nOwns ) + { + cMessageElement *pSchema = i->m_pSchema; + if( pSchema == pElement ) + break; + } + + return i; +} + +void cMessage::crackMessage( BYTE *pBody, DWORD dwSize ) +{ + m_pStartCrack = pBody; + m_pEndData = pBody + dwSize + sizeof( DWORD ); + + m_nType = *reinterpret_cast< long * >( pBody ); + + m_fields.clear(); + + m_pEndCrack = m_pStartCrack + sizeof( long ); + m_pSchema = NULL; +} + +bool cMessage::loadNextElement() +{ + if( m_iLoaded == m_pSchema->m_members.end() ) + return false; + + // Attempt to load what we've got + cLoadContext context( this ); + if( !m_iLoaded->get()->load( context ) ) + { + m_iLoaded = m_pSchema->m_members.end(); + return false; + } + + ++ m_iLoaded; + return true; +} + +void cMessage::loadAllElements() +{ + if( m_pSchema == NULL ) + { + // First look up the message to see if it's already decoded + cMessageSchemaMap::iterator i_schema = g_schema.find( m_nType ); + if( i_schema == g_schema.end() ) + { + // Make a new one + m_pSchema = new cMessageSchema; + m_pSchema->loadSchema( g_pXML, m_nType ); + g_schema.insert( cMessageSchemaMap::value_type( m_nType, VSBridge::auto_ptr< cMessageSchema >( m_pSchema ) ) ); + } + else + m_pSchema = i_schema->second.get(); + + // At this point we have "a" schema of some quality + // set up the cursors + m_iLoaded = m_pSchema->m_members.begin(); + } + + if( m_iLoaded == m_pSchema->m_members.end() ) + return; + + cLoadContext context( this ); + while ( m_iLoaded != m_pSchema->m_members.end () ) + { + if ( m_iLoaded->get()->load ( context ) ) + ++ m_iLoaded; + else + m_iLoaded = m_pSchema->m_members.end(); + } +} + +STDMETHODIMP cMessage::get_Type(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = *reinterpret_cast< long * >( m_pStartCrack ); + + return S_OK; +} + +STDMETHODIMP cMessage::get_Data(VARIANT *pVal) +{ + long nSize = m_pEndData - m_pStartCrack - sizeof( DWORD ); + + if( nSize == 0 ) + { + // Special case, this message is entirely cracked - return NULL + pVal->vt = VT_NULL; + pVal->intVal = 0; + + return S_OK; + } + + // We've got some data to share + SAFEARRAYBOUND sab = { nSize, 0 }; + SAFEARRAY *pArray = ::SafeArrayCreate( VT_UI1, 1, &sab ); + + ::SafeArrayAllocData( pArray ); + LPVOID pvData; + ::SafeArrayAccessData( pArray, &pvData ); + + ::memcpy( pvData, m_pStartCrack, nSize ); + + ::SafeArrayUnaccessData( pArray ); + + pVal->vt = VT_ARRAY | VT_UI1; + pVal->parray = pArray; + + return S_OK; +} + +STDMETHODIMP cMessage::get_Begin(IMessageIterator **pVal) +{ + if( m_pRoot == NULL ) + { + // Create a new message root object + CComObject< cMessageRoot > *pRoot; + CComObject< cMessageRoot >::CreateInstance( &pRoot ); + + // Do an extra addref so this object sticks around after the client is done with it + pRoot->AddRef(); + pRoot->init( this ); + + m_pRoot = pRoot; + } + + m_pRoot->Reset(); + + if( m_pSchema == NULL ) + { + // First look up the message to see if it's already decoded + cMessageSchemaMap::iterator i_schema = g_schema.find( m_nType ); + if( i_schema == g_schema.end() ) + { + // Make a new one + m_pSchema = new cMessageSchema; + m_pSchema->loadSchema( g_pXML, m_nType ); + g_schema.insert( cMessageSchemaMap::value_type( m_nType, VSBridge::auto_ptr< cMessageSchema >( m_pSchema ) ) ); + } + else + m_pSchema = i_schema->second.get(); + + // At this point we have "a" schema of some quality + // set up the cursors + m_iLoaded = m_pSchema->m_members.begin(); + } + + return m_pRoot->QueryInterface( IID_IMessageIterator, reinterpret_cast< void ** >( pVal ) ); +} + +STDMETHODIMP cMessage::get_Member(VARIANT vName, VARIANT *pVal) +{ + loadAllElements (); + + ::VariantInit (pVal); + + if( vName.vt == VT_BSTR ) + { + _bstr_t bstrName = vName; + + // Iterate over the fields and return our match - in this loop we'll do incremental + // cracking, so it's a little messy. When we hit the end, we look to see if there are + // more uncracked fields + int nFieldCount = m_fields.size(); + for( int nField = 0; nField != nFieldCount; nField += m_fields[ nField ].m_nOwns ) + { + if( m_fields[ nField ].m_pSchema->m_strName == bstrName ) + { + m_fields[ nField ].m_pSchema->getValue( this, m_fields.begin() + nField, pVal ); + return S_OK; + } + } + + pVal->vt = VT_EMPTY; + + return S_OK; + } + + // Attempt to convert it into an index + HRESULT hRes = ::VariantChangeType( &vName, &vName, 0, VT_I4 ); + if( FAILED( hRes ) ) + { + _ASSERTE( FALSE ); + return hRes; + } + + // Check if the value is in range + long nIndex = vName.lVal; + if( nIndex < 0 ) + { + _ASSERTE( nIndex >= 0 ); + return E_INVALIDARG; + } + + // Now, one problem is we aren't exactly sure how big the array is, so we have to walk + // through the fields, skipping appropriately + for( cFieldList::iterator i = m_fields.begin(); i != m_fields.end(); i += i->m_nOwns, -- nIndex ) + { + if( nIndex == 0 ) + { + // We've found the index - extract the value + i->m_pSchema->getValue( this, i, pVal ); + return S_OK; + } + } + + // The index was too high + _ASSERTE( FALSE ); + + return E_INVALIDARG; +} + +STDMETHODIMP cMessage::get_MemberName(long nIndex, BSTR *pVal) +{ + loadAllElements (); + + _ASSERTE( nIndex >= 0 ); + _ASSERTE( pVal != NULL ); + + USES_CONVERSION; + + for( cFieldList::iterator i = m_fields.begin(); i != m_fields.end(); i += i->m_nOwns, -- nIndex ) + { + if( nIndex == 0 ) + { + // We've found the index - extract the value + *pVal = OLE2BSTR( i->m_pSchema->m_strName ); + return S_OK; + } + } + + // The index was too high + + return E_INVALIDARG; +} + +STDMETHODIMP cMessage::get_Count(long *pVal) +{ + loadAllElements (); + + _ASSERTE( pVal != NULL ); + + *pVal = 0; + for( cFieldList::iterator i = m_fields.begin(); i != m_fields.end(); i += i->m_nOwns, ++ ( *pVal ) ); + + return S_OK; +} diff --git a/Native/DecalNet/Message.h b/Native/DecalNet/Message.h new file mode 100644 index 0000000..8399207 --- /dev/null +++ b/Native/DecalNet/Message.h @@ -0,0 +1,161 @@ +// Message.h : Declaration of the cMessage + +#ifndef __MESSAGE_H_ +#define __MESSAGE_H_ + +#include "resource.h" // main symbols + +class cNetService; +class cMessageRoot; + +// the public key to unencrypt xmls +#include "..\include\DecalKey.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessage +class ATL_NO_VTABLE cMessage : + public CComObjectRootEx, + public IDispatchImpl< IMessage2, &IID_IMessage2, &LIBID_DecalNet > +{ +public: + void DecryptXML( const char *szFilename, std::string &szXML ); + + class cMessageElement; + + class cField + { + public: + cMessageElement *m_pSchema; + void *m_pvData; + int m_nOwns; + CComPtr< IMessageIterator > m_pDisp; + }; + + typedef std::vector< cField > cFieldList; + + class cLoadContext + { + cMessage *m_pMessage; + DWORD m_dwOffset; + cLoadContext *m_pParent; + + public: + cLoadContext( cMessage *pMessage ) + : m_pMessage( pMessage ), + m_dwOffset( 0 ), + m_pParent( NULL ) + { + } + + cLoadContext( cLoadContext *pParent ) + : m_pMessage( pParent->m_pMessage ), + m_dwOffset( m_pMessage->m_fields.size() ), + m_pParent( pParent ) + { + } + + cFieldList::iterator lookupField( cMessageElement *pElement ); + + DWORD addField( cMessageElement *pElement, void *pvData ) + { + cField f; + f.m_pSchema = pElement; + f.m_pvData = pvData; + f.m_nOwns = 1; + + m_pMessage->m_fields.push_back( f ); + + return m_pMessage->m_fields.size(); + } + + void groupField( DWORD dwIndex ) + { + m_pMessage->m_fields[ dwIndex - 1 ].m_nOwns += m_pMessage->m_fields.size() - dwIndex; + } + + cMessage *getMessage() + { + return m_pMessage; + } + }; + + class cMessageElement + { + public: + _bstr_t m_strName; + + virtual ~cMessageElement() + { + } + + // Decodes from the current point and returns + // the pointer advanced by a certain number of offsets + virtual bool load( cLoadContext &context ) = 0; + virtual void getValue( cMessage *pMsg, cFieldList::iterator i, LPVARIANT pDest ) = 0; + virtual long getNumber( cFieldList::iterator i ) + { + // Default implementation fails + _ASSERTE( FALSE ); + + return 0; + } + }; + + typedef std::vector< VSBridge::auto_ptr< cMessageElement > > cElementList; + + class cMessageSchema + { + public: + cElementList m_members; + + void loadSchema( MSXML::IXMLDOMDocumentPtr &pDoc, DWORD dwSchema ); + bool parseChildren( cElementList &list, MSXML::IXMLDOMElementPtr &pElement ); + }; + + cNetService *m_pService; + + typedef std::map< DWORD, VSBridge::auto_ptr< cMessageSchema > > cMessageSchemaMap; + + MSXML::IXMLDOMDocumentPtr g_pXML; + cMessageSchemaMap g_schema; + + void init(); + void term(); + + cMessage(); + + cFieldList m_fields; + long m_nType; + cMessageSchema *m_pSchema; + + cFieldList::iterator getFieldFromElement( cMessageElement *pElement ); + + BYTE *m_pStartCrack, + *m_pEndCrack, + *m_pEndData; + + void crackMessage( BYTE *pBody, DWORD dwSize ); + + cElementList::iterator m_iLoaded; + cMessageRoot *m_pRoot; + + bool loadNextElement(); + void loadAllElements(); + +BEGIN_COM_MAP(cMessage) + COM_INTERFACE_ENTRY(IMessage2) + COM_INTERFACE_ENTRY(IMessage) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IMessage +public: + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MemberName)(long nIndex, /*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Member)(VARIANT vIndex, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(get_Begin)(/*[out, retval]*/ IMessageIterator * *pVal); + STDMETHOD(get_Data)(/*[out, retval]*/ VARIANT *pVal); + STDMETHOD(get_Type)(/*[out, retval]*/ long *pVal); +}; + +#endif //__MESSAGE_H_ diff --git a/Native/DecalNet/MessageImpl.h b/Native/DecalNet/MessageImpl.h new file mode 100644 index 0000000..38512e0 --- /dev/null +++ b/Native/DecalNet/MessageImpl.h @@ -0,0 +1,363 @@ +// MessageImpl.h +// Declaration of helper classes for implementing the IMessageMembers interface + +#ifndef __MESSAGEIMPL_H +#define __MESSAGEIMPL_H + +#include "Message.h" + +template< class ImplT > +class ATL_NO_VTABLE IMessageIteratorImpl +: public IDispatchImpl< IMessageIterator, &__uuidof( IMessageIterator ), &LIBID_DecalNet > +{ +public: + enum { eEndIndex = 0xFFFFFFFF }; + + cMessage *getSource(); + DWORD getStartIndex(); + DWORD getEndIndex(); + + DWORD m_dwIterator; + long m_nIndex; + + void init() + { + m_nIndex = -1; + } + + DWORD getNextIndex( DWORD dwIndex ) + { + DWORD dwNextIndex = dwIndex + ( static_cast< ImplT * >( this )->getSource()->m_fields.begin() + dwIndex )->m_nOwns; + if( dwNextIndex == static_cast< ImplT * >( this )->getEndIndex() ) + return eEndIndex; + return dwNextIndex; + } + + DWORD getNextIndex() + { + if( m_nIndex == -1 ) + { + DWORD dwIndex = static_cast< ImplT * >( this )->getStartIndex(); + if ( dwIndex == static_cast< ImplT * >( this )->getEndIndex () ) + // This was 0 size + return eEndIndex; + + return dwIndex; + } + + return static_cast< ImplT * >( this )->getNextIndex( m_dwIterator ); + } + + HRESULT advanceToIndex( long nIndex ) + { + if( nIndex <= m_nIndex ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + int nCurIndex = m_nIndex; + for( DWORD dwIterator = static_cast< ImplT * >( this )->getNextIndex(); dwIterator != eEndIndex; dwIterator = static_cast< ImplT * >( this )->getNextIndex( dwIterator ) ) + { + // Reset the counter + ++ nCurIndex; + if( nCurIndex == nIndex ) + { + m_dwIterator = dwIterator; + m_nIndex = nCurIndex; + return S_OK; + } + } + + // The advance went off the edge + m_dwIterator = eEndIndex; + return S_FALSE; + } + + HRESULT advanceToName( BSTR strName ) + { + int nIndex = m_nIndex; + for( DWORD dwIterator = static_cast< ImplT * >( this )->getNextIndex(); dwIterator != eEndIndex; dwIterator = static_cast< ImplT * >( this )->getNextIndex( dwIterator ) ) + { + ++ nIndex; + if( ::VarBstrCmp( strName, ( static_cast< ImplT * >( this )->getSource()->m_fields.begin() + dwIterator )->m_pSchema->m_strName, LOCALE_USER_DEFAULT, 0 ) == VARCMP_EQ ) + { + // We've found the field + m_nIndex = nIndex; + m_dwIterator = dwIterator; + return S_OK; + } + } + + return S_FALSE; + } + + HRESULT advanceNext() + { + m_dwIterator = static_cast< ImplT * >( this )->getNextIndex(); + if( m_dwIterator == eEndIndex ) + return S_FALSE; + + ++ m_nIndex; + return S_OK; + } + + STDMETHOD(get_Current)(VARIANT *pData) + { + if( pData == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_dwIterator == eEndIndex ) + { + pData->vt = VT_NULL; + return E_FAIL; + } + + cMessage::cFieldList::iterator i = static_cast< ImplT * >( this )->getSource()->m_fields.begin() + m_dwIterator; + i->m_pSchema->getValue( static_cast< ImplT * >( this )->getSource(), i, pData ); + return S_OK; + } + + STDMETHOD(get_MemberName)( BSTR *pstrName ) + { + if( pstrName == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_dwIterator == eEndIndex ) + return E_FAIL; + + cMessage::cFieldList::iterator i = static_cast< ImplT * >( this )->getSource()->m_fields.begin() + m_dwIterator; + *pstrName = SysAllocString( i->m_pSchema->m_strName ); + + return S_OK; + } + + STDMETHOD(get_Index)( long *pnIndex ) + { + if( pnIndex == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_dwIterator == eEndIndex ) + return E_FAIL; + + *pnIndex = m_nIndex; + return S_OK; + } + + STDMETHOD(get_Next)( VARIANT vIndex, LPVARIANT pvValue ) + { + if( pvValue == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + HRESULT hRes; + if( vIndex.vt == VT_ERROR ) + // Error value indicates the optional value was not filled + hRes = advanceNext(); + else if( vIndex.vt == VT_BSTR ) + hRes = advanceToName( vIndex.bstrVal ); + else + { + // Try and convert it to a long + HRESULT hResConv = ::VariantChangeType( &vIndex, &vIndex, 0, VT_I4 ); + if( FAILED( hResConv ) ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + hRes = advanceToIndex( vIndex.lVal ); + } + + if( hRes == S_FALSE ) + { + pvValue->vt = VT_NULL; + return hRes; + } + + cMessage::cFieldList::iterator i = static_cast< ImplT * >( this )->getSource()->m_fields.begin() + m_dwIterator; + i->m_pSchema->getValue( static_cast< ImplT * >( this )->getSource(), i, pvValue ); + return S_OK; + } + + STDMETHOD(get_NextString)(BSTR Name, BSTR *pValue) + { + VARIANT v; + v.vt = VT_BSTR; + v.bstrVal = Name; + + VARIANT vOut; + HRESULT hRes = get_Next( v, &vOut ); + + if( hRes == S_FALSE ) + return E_FAIL; + + if( vOut.vt != VT_BSTR ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + *pValue = vOut.bstrVal; + return S_OK; + } + + STDMETHOD(get_NextInt)(BSTR Name, long *pValue) + { + VARIANT v; + v.vt = VT_BSTR; + v.bstrVal = Name; + + VARIANT vOut; + HRESULT hRes = get_Next( v, &vOut ); + + if( hRes == S_FALSE ) + return E_FAIL; + + if( vOut.vt == VT_I4 ) + *pValue = vOut.lVal; + else if( vOut.vt == VT_I2 ) + *pValue = vOut.iVal; + else if ( vOut.vt == VT_UI1 ) + *pValue = vOut.bVal; + else + { + _ASSERT( FALSE ); + return E_FAIL; + } + + return S_OK; + } + + STDMETHOD(get_NextFloat)(BSTR Name, float *pValue) + { + VARIANT v; + v.vt = VT_BSTR; + v.bstrVal = Name; + + VARIANT vOut; + HRESULT hRes = get_Next( v, &vOut ); + + if( hRes == S_FALSE ) + return E_FAIL; + + if( vOut.vt == VT_R4 ) + *pValue = vOut.fltVal; + else if( vOut.vt == VT_R8 ) + *pValue = static_cast< float >( vOut.dblVal ); + else + { + _ASSERT( FALSE ); + return E_FAIL; + } + + return S_OK; + } + + STDMETHOD(get_NextObject)(BSTR Name, IMessageIterator **pValue) + { + VARIANT v; + v.vt = VT_BSTR; + v.bstrVal = Name; + + VARIANT vOut; + HRESULT hRes = get_Next( v, &vOut ); + + if( hRes == S_FALSE ) + return E_FAIL; + + if( vOut.vt != VT_DISPATCH ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + return vOut.pdispVal->QueryInterface ( pValue ); + } + + STDMETHOD(get_NextObjectIndex)(IMessageIterator **pValue) + { + VARIANT v; + v.vt = VT_ERROR; + + CComVariant vOut; + HRESULT hRes = get_Next( v, &vOut ); + + if( hRes == S_FALSE ) + return E_FAIL; + + if( vOut.vt != VT_DISPATCH ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + return vOut.pdispVal->QueryInterface ( pValue ); + } + + STDMETHOD(Reset)() + { + m_nIndex = -1; + + return S_OK; + } + + STDMETHOD(get_Message)(IMessage **ppMessage) + { + if( ppMessage == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + static_cast< ImplT * >( this )->getSource()->QueryInterface( IID_IMessage, reinterpret_cast< void ** >( ppMessage ) ); + + return S_OK; + } +}; + +class IMessageIteratorSublistImpl +: public IMessageIteratorImpl< IMessageIteratorSublistImpl > +{ +public: + cMessage *m_pSource; + DWORD m_dwStartIndex, + m_dwEndIndex; + + cMessage *getSource() + { + return m_pSource; + } + + DWORD getStartIndex() + { + return m_dwStartIndex; + } + + DWORD getEndIndex() + { + return m_dwEndIndex; + } + + void init( cMessage *pMessage, DWORD dwStructIndex ) + { + m_pSource = pMessage; + m_dwStartIndex = dwStructIndex + 1; + m_dwEndIndex = dwStructIndex + ( m_pSource->m_fields.begin() + dwStructIndex )->m_nOwns; + + IMessageIteratorImpl< IMessageIteratorSublistImpl >::init(); + } +}; + +#endif diff --git a/Native/DecalNet/MessageLoaders.cpp b/Native/DecalNet/MessageLoaders.cpp new file mode 100644 index 0000000..df87b30 --- /dev/null +++ b/Native/DecalNet/MessageLoaders.cpp @@ -0,0 +1,207 @@ +// MessageLoaders.cpp +// Implementation of message loaders for various data types + +#include "StdAfx.h" +#include "MessageLoaders.h" + +// The boatload of decoding classes +template< class ValueT > +class cVariantLoader +: public cFieldLoader +{ +public: + virtual void *skip( void *pData ) + { + return reinterpret_cast< BYTE * >( pData ) + sizeof( ValueT ); + } + + virtual void *align( void *pData, void *pStart ) + { + size_t nOffset = reinterpret_cast< BYTE * >( pData ) - reinterpret_cast< BYTE * >( pStart ); + if( ( nOffset % sizeof( ValueT ) ) == 0 ) + return pData; + + return ( reinterpret_cast< BYTE * >( pStart ) + nOffset + sizeof( ValueT ) - ( nOffset % sizeof( ValueT ) ) ); + } + + virtual bool testValue( void *pData, void *pEnd ) + { + return ( ( reinterpret_cast< BYTE * >( pData ) + sizeof( ValueT ) ) <= reinterpret_cast< BYTE * >( pEnd ) ); + } + + ValueT &valueOf( void *pvData ) + { + return *reinterpret_cast< ValueT * >( pvData ); + } +}; + +class cByteLoader +: public cVariantLoader< BYTE > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_UI1; + pDest->bVal = valueOf( pvData ); + } + + virtual long getNumber( void *pvData ) + { + return valueOf( pvData ); + } +}; + +class cShortLoader +: public cVariantLoader< short > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_I2; + pDest->iVal = valueOf( pvData ); + } + + virtual long getNumber( void *pvData ) + { + return valueOf( pvData ); + } +}; + +class cLongLoader +: public cVariantLoader< long > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_I4; + pDest->lVal = valueOf( pvData ); + } + + virtual long getNumber( void *pvData ) + { + return valueOf( pvData ); + } +}; + +class cFloatLoader +: public cVariantLoader< float > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_R4; + pDest->fltVal = valueOf( pvData ); + } +}; + +class cDoubleLoader +: public cVariantLoader< double > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_R8; + pDest->dblVal = valueOf( pvData ); + } +}; + +class cStringLoader +: public cFieldLoader +{ +public: + virtual void *skip( void *pvData ) + { + WORD wLength = *reinterpret_cast< WORD * >( pvData ) + sizeof( WORD ); + if( ( wLength % sizeof( DWORD ) ) != 0 ) + wLength += sizeof( DWORD ) - ( wLength % sizeof( DWORD ) ); + + return reinterpret_cast< BYTE * >( pvData ) + wLength; + } + + virtual void *align( void *pvData, void * ) + { + // Error, this is not a valid alignment type + _ASSERTE( FALSE ); + + return pvData; + } + + virtual bool testValue( void *pvData, void *pvEnd ) + { + WORD wLength = *reinterpret_cast< WORD * >( pvData ) + sizeof( WORD ), + wField = wLength; + + if( ( wField % sizeof( DWORD ) ) != 0 ) + wField += sizeof( DWORD ) - ( wField % sizeof( DWORD ) ); + + // It fits inside the packet, so our field isn't too big + if( ( reinterpret_cast< BYTE * >( pvData ) + wField ) > reinterpret_cast< BYTE * >( pvEnd ) ) + return false; + + // Strings are no longer NULL-Terminated in the stream + //if( *( reinterpret_cast< char * >( pvData ) + wLength - 1 ) != '\0' ) + // This string is not NULL terminated + // return false; + + // Anything else just makes the string ugly, but won't lead to a memory + // overrun, so let them play + return true; + } + + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_BSTR; + + USES_CONVERSION; + WORD wLength = *(WORD *) pvData; + + // make new string + char *szString = new char[wLength + 1]; + szString[wLength] = 0; + + memcpy( szString, (((BYTE*) pvData) + sizeof( WORD )), wLength ); + + pDest->bstrVal = A2BSTR( szString ); + + delete [] szString; + } +}; + +long cFieldLoader::getNumber( void *pvData ) +{ + // This default implementation does not support this conversion + _ASSERTE( FALSE ); + + return 0; +} + +cFieldLoader *cFieldLoader::lookup( const _bstr_t &strName ) +{ + cFieldLoaderMap::iterator i = g_primitives.find( strName ); + if( i == g_primitives.end() ) + return NULL; + + return i->second.get(); +} + +void cFieldLoader::init() +{ + addLoader( _T( "BYTE" ), new cByteLoader ); + addLoader( _T( "WORD" ), new cShortLoader ); + addLoader( _T( "DWORD" ), new cLongLoader ); + addLoader( _T( "float" ), new cFloatLoader ); + addLoader( _T( "double" ), new cDoubleLoader ); + addLoader( _T( "String" ), new cStringLoader ); +} + +void cFieldLoader::term() +{ + g_primitives.clear(); +} + +void cFieldLoader::addLoader( LPCTSTR szName, cFieldLoader *pLoader ) +{ + g_primitives.insert( cFieldLoaderMap::value_type( szName, VSBridge::auto_ptr< cFieldLoader >( pLoader ) ) ); +} + +cFieldLoader::cFieldLoaderMap cFieldLoader::g_primitives; diff --git a/Native/DecalNet/MessageLoaders.h b/Native/DecalNet/MessageLoaders.h new file mode 100644 index 0000000..590719f --- /dev/null +++ b/Native/DecalNet/MessageLoaders.h @@ -0,0 +1,28 @@ +// MessageLoaders.h +// Declaration of Primitive Data Type loaders for encoded message data + +#ifndef __MESSAGELOADERS_H +#define __MESSAGELOADERS_H + +class cFieldLoader +{ +public: + virtual void *skip(void *) = 0; + virtual void *align(void *pData, void *pStart) = 0; + virtual bool testValue(void *pData, void *pEnd) = 0; + virtual void getValue( void *, LPVARIANT pDest ) = 0; + virtual long getNumber( void *pvData ); + + static cFieldLoader *lookup( const _bstr_t &strName ); + + static void init(); + static void term(); + +private: + static void addLoader( LPCTSTR szName, cFieldLoader *pLoader ); + + typedef std::map< _bstr_t, VSBridge::auto_ptr< cFieldLoader > > cFieldLoaderMap; + static cFieldLoaderMap g_primitives; +}; + +#endif diff --git a/Native/DecalNet/MessageParsers.cpp b/Native/DecalNet/MessageParsers.cpp new file mode 100644 index 0000000..0f47fc3 --- /dev/null +++ b/Native/DecalNet/MessageParsers.cpp @@ -0,0 +1,727 @@ +// MessageParsers.cpp +// Implementation of parsers and runtime objects for parsing message data + +#include "StdAfx.h" +#include "DecalNet.h" + +#include "MessageParsers.h" +#include "MessageLoaders.h" + +#include "MessageStruct.h" +#include "MessageVector.h" + +class cStructElement + : public cMessage::cMessageElement +{ +public: + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // Walk through the list of members and have them load + int nIndex = context.addField( this, NULL ); + + for( cMessage::cElementList::iterator i = m_members.begin(); i != m_members.end(); ++ i ) + { + if( !i->get()->load( cMessage::cLoadContext( &context ) ) ) + return false; + } + + // Update the field count + context.groupField( nIndex ); + return true; + } + + virtual void getValue( cMessage *pMessage, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + if( i->m_pDisp.p == NULL ) + { + // Create the vector object + CComObject< cMessageStructIter > *pVecDisp; + CComObject< cMessageStructIter >::CreateInstance( &pVecDisp ); + + pVecDisp->init( pMessage, ( i - pMessage->m_fields.begin() ) ); + i->m_pDisp = pVecDisp; + } + else + i->m_pDisp->Reset(); + + pDest->vt = VT_DISPATCH; + i->m_pDisp->QueryInterface ( IID_IMessageMember, reinterpret_cast< LPVOID * > ( &pDest->pdispVal ) ); + } +}; + +class cFieldParser +: public cElementParser +{ +public: + class cFieldElement + : public cMessage::cMessageElement + { + public: + cFieldLoader *m_pLoader; + + virtual bool load( cMessage::cLoadContext &context ) + { + if( !m_pLoader->testValue( context.getMessage()->m_pEndCrack, context.getMessage()->m_pEndData ) ) + { + // The element failed, this will usually indicate bad schema + _ASSERTE( FALSE ); + return false; + } + + context.addField( this, context.getMessage()->m_pEndCrack ); + context.getMessage()->m_pEndCrack = reinterpret_cast< BYTE * >( m_pLoader->skip( context.getMessage()->m_pEndCrack ) ); + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + m_pLoader->getValue( i->m_pvData, pDest ); + } + + virtual long getNumber( cMessage::cFieldList::iterator i ) + { + return m_pLoader->getNumber( i->m_pvData ); + } + }; + + // Strings + static _bstr_t g_strType; + static _bstr_t g_strName; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + // Locate the data type in the list + _variant_t strDataType = pElement->getAttribute( g_strType ); + + if( strDataType.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strDataType.vt == VT_BSTR ); + return NULL; + } + + _bstr_t bstrDataType = strDataType; + + cFieldLoader *pField = cFieldLoader::lookup( bstrDataType ); + if( pField == NULL ) + return parseStruct( context, pElement, bstrDataType ); + + _variant_t strName = pElement->getAttribute( g_strName ); + + if( strName.vt != VT_BSTR ) + { + _ASSERTE( strName.vt == VT_BSTR ); + return NULL; + } + + cFieldElement *pFieldElement = new cFieldElement; + + pFieldElement->m_strName = strName; + pFieldElement->m_pLoader = pField; + return pFieldElement; + } + + cMessage::cMessageElement *parseStruct( cContext &context, MSXML::IXMLDOMElementPtr &pElement, const _bstr_t &strType ) + { + // Locate the data type in the list + _variant_t strName = pElement->getAttribute( cFieldParser::g_strName ); + + if( strName.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strName.vt == VT_BSTR ); + return NULL; + } + + // We have the field name, now look up data type schema + USES_CONVERSION; + + TCHAR szQuery[ 255 ]; + ::_stprintf( szQuery, _T( "/schema/datatypes/type[@name='%s']" ), + OLE2T( strType ) ); + + MSXML::IXMLDOMElementPtr pStruct = pElement->ownerDocument->selectSingleNode( szQuery ); + if( pStruct.GetInterfacePtr() == NULL ) + { + // Could not cross reference the structure + _ASSERTE( pStruct.GetInterfacePtr() != NULL ); + return NULL; + } + + VSBridge::auto_ptr< cStructElement > pStructElement( new cStructElement() ); + pStructElement->m_strName = strName; + if( context.parseChildren( pStructElement->m_members, pStruct ) ) + return pStructElement.release(); + + return NULL; + } +}; + +_bstr_t cFieldParser::g_strType( _T( "type" ) ); +_bstr_t cFieldParser::g_strName( _T( "name" ) ); + +class cMaskParser +: public cElementParser +{ +public: + class cMaskElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pValue; + + class cMask + { + public: + DWORD m_dwValue; + DWORD m_dwFirstChild, + m_dwLastChild; + }; + + typedef std::vector< cMask > cMaskMap; + + cMaskMap m_masks; + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pValue ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return false; + } + + _ASSERT( iField->m_pSchema == m_pValue ); + + long nMaskValue = iField->m_pSchema->getNumber( iField ); + + // Walk through the mask values and load all of the fields in range + for( cMaskMap::iterator i = m_masks.begin(); i != m_masks.end(); ++ i ) + { + if( ( nMaskValue & i->m_dwValue ) == 0 ) + continue; + + // This is a valid mask load up all teh fields in range + cMessage::cElementList::iterator m_end = m_members.begin() + i->m_dwLastChild; + for( cMessage::cElementList::iterator j = m_members.begin() + i->m_dwFirstChild; j != m_end; ++ j ) + { + if( !j->get()->load( context ) ) + return false; + } + } + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator, LPVARIANT ) + { + // This element should never insert itself into the message list + _ASSERTE( FALSE ); + } + }; + + static _bstr_t g_strMask; + static _bstr_t g_strValue; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Find a matching element in the schema + cMessage::cMessageElement *pName = context.findElement( vName.bstrVal ); + if( pName == NULL ) + { + // The mask field was not found + _ASSERTE( pName != NULL ); + return NULL; + } + + // Create the mask element + VSBridge::auto_ptr< cMaskElement > pMaskElement( new cMaskElement ); + pMaskElement->m_pValue = pName; + + // Walk through each of the mask values + USES_CONVERSION; + + MSXML::IXMLDOMNodeListPtr pMaskList = pElement->selectNodes( g_strMask ); + for( MSXML::IXMLDOMElementPtr pMask = pMaskList->nextNode(); pMask.GetInterfacePtr() != NULL; pMask = pMaskList->nextNode() ) + { + _variant_t vValue = pMask->getAttribute( g_strValue ); + if( vValue.vt != VT_BSTR ) + { + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Make sure it has the 'hex' prefix + if( vValue.bstrVal[ 0 ] != OLESTR( '0' ) ) + { + _ASSERTE( vValue.bstrVal[ 0 ] == OLESTR( '0' ) ); + return NULL; + } + + if( vValue.bstrVal[ 1 ] != OLESTR( 'x' ) ) + { + _ASSERTE( vValue.bstrVal[ 1 ] == OLESTR( 'x' ) ); + return NULL; + } + + // Attempt to convert the remaining number + long nMaskValue; + if( ::_stscanf( OLE2T( vValue.bstrVal + 2 ), _T( "%X" ), &nMaskValue ) != 1 ) + { + // Could not convert value + _ASSERTE( FALSE ); + return NULL; + } + + long nStartOffset = pMaskElement->m_members.size(); + context.parseChildren( pMaskElement->m_members, pMask ); + + cMaskElement::cMask mask = { nMaskValue, nStartOffset, pMaskElement->m_members.size() }; + pMaskElement->m_masks.push_back( mask ); + } + + return pMaskElement.release(); + } +}; + +_bstr_t cMaskParser::g_strMask( _T( "mask" ) ); +_bstr_t cMaskParser::g_strValue( _T( "value" ) ); + +class cAlignParser +: public cElementParser +{ +public: + class cAlignElement + : public cMessage::cMessageElement + { + public: + cFieldLoader *m_pLoader; + + virtual bool load( cMessage::cLoadContext &context ) + { + void *pAlign = m_pLoader->align( context.getMessage()->m_pEndCrack, context.getMessage()->m_pStartCrack ); + if( pAlign > context.getMessage()->m_pEndData ) + { + _ASSERTE( FALSE ); + return false; + } + + context.getMessage()->m_pEndCrack = reinterpret_cast< BYTE * >( pAlign ); + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + // This should never associate itself with a field + _ASSERTE( FALSE ); + } + }; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + // Locate the data type in the list + _variant_t strDataType = pElement->getAttribute( cFieldParser::g_strType ); + + if( strDataType.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strDataType.vt == VT_BSTR ); + return NULL; + } + + _bstr_t bstrDataType = strDataType; + + cFieldLoader *pField = cFieldLoader::lookup( bstrDataType ); + if( pField == NULL ) + { + _ASSERTE( FALSE ); + return NULL; + } + + cAlignElement *pAlignElement = new cAlignElement; + + pAlignElement->m_pLoader = pField; + return pAlignElement; + } +}; + +class cVectorParser +: public cElementParser +{ +public: + class cVectorElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pLength; + VSBridge::auto_ptr< cMessage::cMessageElement > m_pStruct; + int m_nSkip; + + DWORD m_dwMask; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pLength ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return NULL; + } + + _ASSERT( iField->m_pSchema == m_pLength ); + + long nLength = iField->m_pSchema->getNumber( iField ) - m_nSkip; + + if (m_dwMask != 0) + { + DWORD dwTemp = (DWORD) nLength & m_dwMask; + DWORD dwTempMask = m_dwMask; + + // Shift the length field right as far as we can. + while (! (dwTempMask & 0x1)) + { + dwTempMask >>= 1; + dwTemp >>= 1; + } + + nLength = (long) dwTemp; + } + + // Insert a record for ourself + DWORD dwIndex = context.addField( this, NULL ); + + for( int i = 0; i < nLength; ++ i ) + { + // Insert a record for the current struct + if( !m_pStruct->load( cMessage::cLoadContext( &context ) ) ) + return false; + } + + // Update the used field count + context.groupField( dwIndex ); + return true; + } + + virtual void getValue( cMessage *pMessage, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + if( i->m_pDisp.p == NULL ) + { + // Create the vector object + CComObject< cMessageVectorIter > *pVecDisp; + CComObject< cMessageVectorIter >::CreateInstance( &pVecDisp ); + + pVecDisp->init( pMessage, ( i - pMessage->m_fields.begin() ) ); + i->m_pDisp = pVecDisp; + } + else + i->m_pDisp->Reset(); + + pDest->vt = VT_DISPATCH; + i->m_pDisp->QueryInterface ( IID_IMessageMember, reinterpret_cast< LPVOID * > ( &pDest->pdispVal ) ); + } + }; + + static _bstr_t g_strLength, + g_strSkip, + g_strMask; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + _variant_t vLength = pElement->getAttribute( g_strLength ), + vSkip = pElement->getAttribute( g_strSkip ), + vMask = pElement->getAttribute( g_strMask ); + + if( vLength.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vLength.vt == VT_BSTR ); + return NULL; + } + + long nSkip = 0; + if( vSkip.vt != VT_NULL ) + { + try + { + nSkip = vSkip; + } + catch( ... ) + { + // Failed to make the conversion + _ASSERT( FALSE ); + return NULL; + } + } + + DWORD dwMask = 0; + if( vMask.vt != VT_NULL ) + { + dwMask = ::wcstoul (vMask.bstrVal, NULL, 16); + } + + cMessage::cMessageElement *pLength = context.findElement( vLength.bstrVal ); + if( pLength == NULL ) + { + // The mask field was not found + _ASSERTE( pLength != NULL ); + return NULL; + } + + VSBridge::auto_ptr< cStructElement > pStructElement( new cStructElement ); + + if( !context.parseChildren( pStructElement->m_members, pElement ) ) + return NULL; + + cVectorElement *pVector = new cVectorElement; + pVector->m_strName = vName; + pVector->m_pLength = pLength; + pVector->m_nSkip = nSkip; + pVector->m_dwMask = dwMask; + pVector->m_pStruct = VSBridge::auto_ptr< cMessage::cMessageElement >( pStructElement.release() ); + + return pVector; + } +}; + +_bstr_t cVectorParser::g_strLength( _T( "length" ) ); +_bstr_t cVectorParser::g_strSkip( _T( "skip" ) ); +_bstr_t cVectorParser::g_strMask( _T( "mask" ) ); + +class cSwitchParser +: public cElementParser +{ +public: + class cSwitchElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pValue; + + class cCase + { + public: + DWORD m_dwValue; + DWORD m_dwFirstChild, + m_dwLastChild; + }; + + typedef std::vector< cCase > cCaseMap; + + cCaseMap m_cases; + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pValue ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return NULL; + } + + _ASSERT( iField->m_pSchema == m_pValue ); + + long nCaseValue = iField->m_pSchema->getNumber( iField ); + + // Walk through the mask values and load all of the fields in range + for( cCaseMap::iterator i = m_cases.begin(); i != m_cases.end(); ++ i ) + { + if( nCaseValue != i->m_dwValue ) + continue; + + // This is a valid mask load up all teh fields in range + cMessage::cElementList::iterator m_end = m_members.begin() + i->m_dwLastChild; + for( cMessage::cElementList::iterator j = m_members.begin() + i->m_dwFirstChild; j != m_end; ++ j ) + { + if( !j->get()->load( context ) ) + return false; + } + + // For now we short circuit cases + break; + } + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator, LPVARIANT ) + { + // This element should never insert itself into the message list + _ASSERTE( FALSE ); + } + }; + + static _bstr_t g_strCase; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Find a matching element in the schema + cMessage::cMessageElement *pName = context.findElement( vName.bstrVal ); + if( pName == NULL ) + { + // The mask field was not found + _ASSERTE( pName != NULL ); + return NULL; + } + + // Create the mask element + VSBridge::auto_ptr< cSwitchElement > pSwitchElement( new cSwitchElement ); + pSwitchElement->m_pValue = pName; + + // Walk through each of the mask values + USES_CONVERSION; + + MSXML::IXMLDOMNodeListPtr pCaseList = pElement->selectNodes( g_strCase ); + for( MSXML::IXMLDOMElementPtr pCase = pCaseList->nextNode(); pCase.GetInterfacePtr() != NULL; pCase = pCaseList->nextNode() ) + { + _variant_t vValue = pCase->getAttribute( cMaskParser::g_strValue ); + if( vValue.vt != VT_BSTR ) + { + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Make sure it has the 'hex' prefix + if( vValue.bstrVal[ 0 ] != OLESTR( '0' ) ) + { + _ASSERTE( vValue.bstrVal[ 0 ] == OLESTR( '0' ) ); + return NULL; + } + + if( vValue.bstrVal[ 1 ] != OLESTR( 'x' ) ) + { + _ASSERTE( vValue.bstrVal[ 1 ] == OLESTR( 'x' ) ); + return NULL; + } + + // Attempt to convert the remaining number + long nCaseValue; + if( ::_stscanf( OLE2T( vValue.bstrVal + 2 ), _T( "%X" ), &nCaseValue ) != 1 ) + { + // Could not convert value + _ASSERTE( FALSE ); + return NULL; + } + + long nStartOffset = pSwitchElement->m_members.size(); + context.parseChildren( pSwitchElement->m_members, pCase ); + + cSwitchElement::cCase _case = { nCaseValue, nStartOffset, pSwitchElement->m_members.size() }; + pSwitchElement->m_cases.push_back( _case ); + } + + return pSwitchElement.release(); + } +}; + +_bstr_t cSwitchParser::g_strCase( _T( "case" ) ); + +cMessage::cMessageElement *cElementParser::cContext::findElement( const _bstr_t &strElement ) +{ + for( cContext *pContext = this; pContext != NULL; pContext = pContext->m_pParent ) + { + for( cMessage::cElementList::iterator i = m_pElements->begin() + m_dwStartOffset; i != m_pElements->end(); ++ i ) + { + if( i->get()->m_strName == strElement ) + return i->get(); + } + } + + return NULL; +} + +bool cElementParser::cContext::parseChildren( MSXML::IXMLDOMElementPtr &pElement ) +{ + MSXML::IXMLDOMNodeListPtr pChildList = pElement->selectNodes( g_strAll ); + for( MSXML::IXMLDOMElementPtr pChild = pChildList->nextNode(); pChild.GetInterfacePtr() != NULL; pChild = pChildList->nextNode() ) + { + _bstr_t strElementName = pChild->tagName; + cElementParser *pParser = cElementParser::lookup( strElementName ); + if( pParser == NULL ) + { + // Could not find a parse for this element type + _ASSERTE( FALSE ); + return false; + } + + cMessage::cMessageElement *pElement = pParser->parse( *this, pChild ); + if( pElement == NULL ) + return false; + + m_pElements->push_back( cMessage::cElementList::value_type( pElement ) ); + } + + return true; +} + +_bstr_t cElementParser::cContext::g_strAll( _T( "*" ) ); + +bool cElementParser::cContext::parseChildren( cMessage::cElementList &elements, MSXML::IXMLDOMElementPtr &pElement ) +{ + cContext c( &elements, this ); + return c.parseChildren( pElement ); +} + +cElementParser *cElementParser::lookup( const _bstr_t &strElement ) +{ + cElementParserMap::iterator i = g_parsers.find( strElement ); + if( i == g_parsers.end() ) + return NULL; + + return i->second.get(); +} + +void cElementParser::init() +{ + addParser( _T( "field" ), new cFieldParser ); + addParser( _T( "maskmap" ), new cMaskParser ); + addParser( _T( "vector" ), new cVectorParser ); + addParser( _T( "switch" ), new cSwitchParser ); + addParser( _T( "align" ), new cAlignParser ); +} + +void cElementParser::term() +{ + g_parsers.clear(); +} + +void cElementParser::addParser( LPCTSTR szName, cElementParser *pParser ) +{ + g_parsers.insert( cElementParserMap::value_type( szName, VSBridge::auto_ptr< cElementParser >( pParser ) ) ); +} + +cElementParser::cElementParserMap cElementParser::g_parsers; diff --git a/Native/DecalNet/MessageParsers.h b/Native/DecalNet/MessageParsers.h new file mode 100644 index 0000000..9587500 --- /dev/null +++ b/Native/DecalNet/MessageParsers.h @@ -0,0 +1,48 @@ +// MessageParsers.h +// Declaration of class cMessageParser - base class for parsing the +// XML Schema + +#ifndef __MESSAGEPARSERS_H +#define __MESSAGEPARSERS_H + +#include "Message.h" + +class cElementParser +{ +public: + class cContext + { + cContext *m_pParent; + cMessage::cElementList *m_pElements; + DWORD m_dwStartOffset; + + public: + cContext( cMessage::cElementList *pElements, cContext *pParent = NULL ) + : m_pParent( pParent ), + m_pElements( pElements ), + m_dwStartOffset( pElements->size() ) + { + } + + cMessage::cMessageElement *findElement( const _bstr_t &strElement ); + bool parseChildren( MSXML::IXMLDOMElementPtr &pElement ); + bool parseChildren( cMessage::cElementList &elements, MSXML::IXMLDOMElementPtr &pElement ); + + static _bstr_t g_strAll; + }; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) = 0; + + static cElementParser *lookup( const _bstr_t &strElement ); + + static void init(); + static void term(); + +private: + static void addParser( LPCTSTR szElement, cElementParser *pParser ); + + typedef std::map< _bstr_t, VSBridge::auto_ptr< cElementParser > > cElementParserMap; + static cElementParserMap g_parsers; +}; + +#endif diff --git a/Native/DecalNet/MessageRoot.cpp b/Native/DecalNet/MessageRoot.cpp new file mode 100644 index 0000000..8f274ca --- /dev/null +++ b/Native/DecalNet/MessageRoot.cpp @@ -0,0 +1,8 @@ +// MessageRoot.cpp : Implementation of cMessageRoot +#include "stdafx.h" +#include "DecalNet.h" +#include "MessageRoot.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageRoot + diff --git a/Native/DecalNet/MessageRoot.h b/Native/DecalNet/MessageRoot.h new file mode 100644 index 0000000..76bba45 --- /dev/null +++ b/Native/DecalNet/MessageRoot.h @@ -0,0 +1,90 @@ +// MessageRoot.h : Declaration of the cMessageRoot + +#ifndef __MESSAGEROOT_H_ +#define __MESSAGEROOT_H_ + +#include "resource.h" // main symbols + +#include "MessageImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageRoot +class ATL_NO_VTABLE cMessageRoot : + public CComObjectRootEx, + public CComCoClass, + public IMessageIteratorImpl< cMessageRoot > +{ +public: + cMessageRoot() + { + } + + cMessage *m_pSource; + + cMessage *getSource() + { + return m_pSource; + } + + DWORD getStartIndex() + { + return 0; + } + + DWORD getEndIndex() + { + return m_pSource->m_fields.size(); + } + + DWORD getNextIndex() + { + if( m_nIndex != -1 ) + return getNextIndex( m_dwIterator ); + + DWORD dwIterator = getStartIndex(); + + while( dwIterator == m_pSource->m_fields.size() ) + { + if( !m_pSource->loadNextElement() ) + return eEndIndex; + } + + return dwIterator; + } + + DWORD getNextIndex( DWORD dwIndex ) + { + // Calculate the next index + DWORD dwNextIndex = dwIndex + ( m_pSource->m_fields.begin() + dwIndex )->m_nOwns; + + // Insert this loop to make sure the cracking is done far enough ahead + // This is a loop because it's entirely possible that loading a message element + // will produce no fields (it's a rule that dosen't apply) + while( dwNextIndex == m_pSource->m_fields.size() ) + { + if( !m_pSource->loadNextElement() ) + return eEndIndex; + } + + return dwNextIndex; + } + + void init( cMessage *pSource ) + { + m_pSource = pSource; + IMessageIteratorImpl< cMessageRoot >::init(); + } + +DECLARE_REGISTRY_RESOURCEID(IDR_MESSAGEROOT) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cMessageRoot) + COM_INTERFACE_ENTRY(IMessageIterator) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +public: +}; + +#endif //__MESSAGEROOT_H_ diff --git a/Native/DecalNet/MessageStruct.cpp b/Native/DecalNet/MessageStruct.cpp new file mode 100644 index 0000000..66d958c --- /dev/null +++ b/Native/DecalNet/MessageStruct.cpp @@ -0,0 +1,96 @@ +// MessageStruct.cpp : Implementation of cMessageStruct +#include "stdafx.h" +#include "DecalNet.h" +#include "MessageStruct.h" + +#include "Message.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageIteratorStruct + +///////////////////////////////////////////////////////////////////////////// +// cMessageStruct + + +STDMETHODIMP cMessageStructIter::get_Count(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = m_pSource->m_fields.begin() + getEndIndex(); + + *pVal = 0; + + for( cMessage::cFieldList::iterator i = i_begin; i != i_end; i += i->m_nOwns ) + ++ ( *pVal ); + + return S_OK; +} + +STDMETHODIMP cMessageStructIter::get_MemberName(long Index, BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + _ASSERTE( Index >= 0 ); + + USES_CONVERSION; + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = m_pSource->m_fields.begin() + getEndIndex(); + + for( cMessage::cFieldList::iterator i = i_begin; i != i_end; i += i->m_nOwns, -- Index ) + { + if( Index == 0 ) + { + *pVal = OLE2BSTR( i->m_pSchema->m_strName ); + return S_OK; + } + } + + _ASSERTE( FALSE ); + return E_INVALIDARG; +} + +STDMETHODIMP cMessageStructIter::get_Member(VARIANT vIndex, VARIANT *pVal) +{ + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = m_pSource->m_fields.begin() + getEndIndex(); + + if( vIndex.vt == VT_BSTR ) + { + _bstr_t bstrIndex = vIndex; + for( cMessage::cFieldList::iterator i = i_begin; i != i_end; i += i->m_nOwns ) + { + if( bstrIndex == i->m_pSchema->m_strName ) + { + i->m_pSchema->getValue( m_pSource, i, pVal ); + return S_OK; + } + } + } + + HRESULT hRes = ::VariantChangeType( &vIndex, &vIndex, 0, VT_I4 ); + if( FAILED( hRes ) ) + { + _ASSERTE( FALSE ); + return hRes; + } + + // Check if the value is in range + long nIndex = vIndex.lVal; + if( nIndex < 0 ) + { + _ASSERTE( nIndex >= 0 ); + return E_INVALIDARG; + } + + for( cMessage::cFieldList::iterator i = i_begin; i != i_end; i += i->m_nOwns, -- nIndex ) + { + if( nIndex == 0 ) + { + i->m_pSchema->getValue( m_pSource, i, pVal ); + return S_OK; + } + } + + return S_OK; +} diff --git a/Native/DecalNet/MessageStruct.h b/Native/DecalNet/MessageStruct.h new file mode 100644 index 0000000..ffce2aa --- /dev/null +++ b/Native/DecalNet/MessageStruct.h @@ -0,0 +1,34 @@ +// MessageStruct.h : Declaration of the cMessageStruct + +#ifndef __MESSAGESTRUCT_H_ +#define __MESSAGESTRUCT_H_ + +#include "resource.h" // main symbols +#include "MessageImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageStruct +class ATL_NO_VTABLE cMessageStructIter : + public CComObjectRootEx, + public IDispatchImpl, + public IMessageIteratorSublistImpl +{ +public: + cMessageStructIter() + { + } + +BEGIN_COM_MAP(cMessageStructIter) + COM_INTERFACE_ENTRY(IMessageIterator) + COM_INTERFACE_ENTRY(IMessageMember) + COM_INTERFACE_ENTRY2(IDispatch, IMessageMember) +END_COM_MAP() + +public: + // IMessageStruct Implementation + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MemberName)(long Index, /*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Member)(VARIANT vIndex, /*[out, retval]*/ VARIANT *pVal); +}; + +#endif //__MESSAGESTRUCT_H_ diff --git a/Native/DecalNet/MessageVector.cpp b/Native/DecalNet/MessageVector.cpp new file mode 100644 index 0000000..325df0b --- /dev/null +++ b/Native/DecalNet/MessageVector.cpp @@ -0,0 +1,103 @@ +// MessageVector.cpp : Implementation of cMessageVector + +#include "stdafx.h" +#include "DecalNet.h" +#include "MessageVector.h" + +#include "Message.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageVector + +STDMETHODIMP cMessageVectorIter::get_MemberName(BSTR *pVal) +{ + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + if( m_nIndex == -1 || m_dwIterator == eEndIndex ) + { + // We are before the beginning or after the end + _ASSERT( FALSE ); + return E_FAIL; + } + + USES_CONVERSION; + + TCHAR strIndex[ 12 ]; + ::_stprintf( strIndex, _T( "%i" ), m_nIndex ); + + *pVal = T2BSTR( strIndex ); + + return S_OK; +} + +///////////////////////////////////////////////////////////////////////////// +// cMessageVector + +STDMETHODIMP cMessageVectorIter::get_MemberName(long nIndex, BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + _ASSERTE( nIndex >= 0 ); + + USES_CONVERSION; + + TCHAR strIndex[ 12 ]; + ::_stprintf( strIndex, _T( "%i" ), nIndex ); + + *pVal = T2BSTR( strIndex ); + + return S_OK; +} + +STDMETHODIMP cMessageVectorIter::get_Count(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = m_pSource->m_fields.begin() + getEndIndex(); + + *pVal = 0; + + for( cMessage::cFieldList::iterator i = i_begin; i != i_end; i += i->m_nOwns ) + ++ ( *pVal ); + + return S_OK; +} + +STDMETHODIMP cMessageVectorIter::get_Member(VARIANT vIndex, VARIANT *pVal) +{ + _ASSERTE( pVal != NULL ); + + HRESULT hRes = ::VariantChangeType( &vIndex, &vIndex, 0, VT_I4 ); + if( FAILED( hRes ) ) + { + _ASSERTE( FALSE ); + return hRes; + } + + // Check if the value is in range + long Index = vIndex.lVal; + if( Index < 0 ) + { + _ASSERTE( Index >= 0 ); + return E_INVALIDARG; + } + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = m_pSource->m_fields.begin() + getEndIndex(); + + for( cMessage::cFieldList::iterator i = i_begin; i != i_end; i += i->m_nOwns, -- Index ) + { + if( Index == 0 ) + { + i->m_pSchema->getValue( m_pSource, i, pVal ); + return S_OK; + } + } + + _ASSERTE( FALSE ); + return E_INVALIDARG; +} diff --git a/Native/DecalNet/MessageVector.h b/Native/DecalNet/MessageVector.h new file mode 100644 index 0000000..f04dd3a --- /dev/null +++ b/Native/DecalNet/MessageVector.h @@ -0,0 +1,37 @@ +// MessageVector.h : Declaration of the cMessageVector + +#ifndef __MESSAGEVECTOR_H_ +#define __MESSAGEVECTOR_H_ + +#include "resource.h" // main symbols +#include "MessageImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageVector +class ATL_NO_VTABLE cMessageVectorIter : + public CComObjectRootEx, + public IDispatchImpl, + public IMessageIteratorSublistImpl +{ +public: + cMessageVectorIter() + { + } + +BEGIN_COM_MAP(cMessageVectorIter) + COM_INTERFACE_ENTRY(IMessageMember) + COM_INTERFACE_ENTRY(IMessageIterator) + COM_INTERFACE_ENTRY2(IDispatch, IMessageMember) +END_COM_MAP() + +public: + // IMessageIterator Overrides + STDMETHOD(get_MemberName)(BSTR *pVal); + + // IMessageMember Implementation + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Member)(VARIANT vIndex, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(get_MemberName)(long Index, BSTR *pVal); +}; + +#endif //__MESSAGEVECTOR_H_ diff --git a/Native/DecalNet/NetService.cpp b/Native/DecalNet/NetService.cpp new file mode 100644 index 0000000..7eeee68 --- /dev/null +++ b/Native/DecalNet/NetService.cpp @@ -0,0 +1,460 @@ +// NetService.cpp : Implementation of cNetService +#include "stdafx.h" +#include "DecalNet.h" +#include "NetService.h" + +#include +#include "Message.h" +#include +#include "ProtocolHook.h" +#include "FilterAdapterV1.h" + + +#define _OUTGOING_PACKETS_ +//#define _LOGGING + +extern DWORD HookCall (DWORD dwCallAddress, DWORD dwReplacement); +extern void ReceiveBlob(); + +bool (__cdecl*LockMemoryPages)(void *); +bool g_bLockMemoryPages = false; +DWORD g_dwReceiveBlobReadyCall = 0; +DWORD g_dwReceiveBlobReadyProc = 0; +DWORD g_dwNetBlobObjectDataOffset = 0; +DWORD g_dwNetBlobObjectSizeOffset = 0; + +///////////////////////////////////////////////////////////////////////////// +// cNetService + +// Functions for hooking from wsock32.dll +int PASCAL recvfromF( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); +int PASCAL sendtoF( SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen ); +static cHookDescriptor _hooks[] = { + { eByOrdinal, _T( "fsock32.dll" ), _T( "recvfrom" ), 17, reinterpret_cast< DWORD >( recvfromF ), 0 }, + { eByOrdinal, _T( "wsock32.dll" ), _T( "recvfrom" ), 17, reinterpret_cast< DWORD >( recvfromF ), 0 }, +}; +static cHookDescriptor _hooksOut[] = { + { eByOrdinal, _T( "wsock32.dll" ), _T( "sendto" ), 20, reinterpret_cast< DWORD >( sendtoF ), 0 }, +}; + +HRESULT cNetService::onInitialize() +{ + if( g_pService == NULL ) + { + g_pService = this; + + m_pDecal->get_Hooks( &m_pHooks ); + + long lTemp = 0; + + m_pHooks->QueryMemLoc( _bstr_t( "ReceiveBlobReadyCall" ), &lTemp ); + g_dwReceiveBlobReadyCall = lTemp, lTemp = 0; + + m_pHooks->QueryMemLoc( _bstr_t( "NetBlobObjectDataOffset" ), &lTemp ); + g_dwNetBlobObjectDataOffset = lTemp, lTemp = 0; + + m_pHooks->QueryMemLoc( _bstr_t( "NetBlobObjectSizeOffset" ), &lTemp ); + g_dwNetBlobObjectSizeOffset = lTemp, lTemp = 0; + + + m_pHooks->QueryMemLoc( _bstr_t( "LockMemoryPages" ), &lTemp ); + if( lTemp ) + g_bLockMemoryPages = true; + LockMemoryPages = (bool(__cdecl*)(void*)) lTemp, lTemp = 0; + + + + if( g_dwReceiveBlobReadyCall && g_dwNetBlobObjectDataOffset && g_dwNetBlobObjectSizeOffset ) + g_dwReceiveBlobReadyProc = HookCall( g_dwReceiveBlobReadyCall, (DWORD) ReceiveBlob ); + else + { + g_dwReceiveBlobReadyCall = 0; // just in case. + + hookFunctions( _hooks, 2, true ); + if( _hooks[ 0 ].m_pOldFunction != 0 ) + g_fn_recvfrom = reinterpret_cast< fn_recvfrom >( _hooks[ 0 ].m_pOldFunction ); + else if( _hooks[ 1 ].m_pOldFunction != 0 ) + g_fn_recvfrom = reinterpret_cast< fn_recvfrom >( _hooks[ 1 ].m_pOldFunction ); + else + _ASSERTE( false ); + } + } + +#ifdef _OUTGOING_PACKETS_ + hookFunctions( _hooksOut, 1, true ); + + if( _hooksOut[ 0 ].m_pOldFunction != 0 ) + g_fn_sendto = reinterpret_cast< fn_sendto >( _hooksOut[ 0 ].m_pOldFunction ); + else + _ASSERTE( false ); +#endif + + m_stack.start( this ); + + // Start all of the network filters + { + CComPtr< IDecalEnum > pEnum; + HRESULT hRes = m_pDecal->get_Configuration( _bstr_t( _T( "NetworkFilters" ) ), GUID_NULL, &pEnum ); + if( FAILED( hRes ) ) + return hRes; + + while( pEnum->Next() == S_OK ) + { + // Unlike services, network filters are allowed to fail + VARIANT_BOOL bEnabled; + HRESULT hRes = pEnum->get_Enabled ( &bEnabled ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + + if ( !bEnabled ) + continue; + + cFilter f; + pEnum->get_ComClass( &f.m_clsid ); + + hRes = pEnum->CreateInstance( __uuidof( INetworkFilter2 ), reinterpret_cast< void ** >( &f.m_p ) ); + if( FAILED( hRes ) ) + { + // Heads up that a filter is failing to init + _ASSERT( FALSE ); + continue; + } + + hRes = f.m_p->Initialize( this ); + + if( SUCCEEDED( hRes ) ) + { + f.m_ver = eVersion2; + m_filters.push_back( f ); + } + } + } + + // Prepare the message container + CComObject< cMessage > *pMessage; + CComObject< cMessage >::CreateInstance( &pMessage ); + + pMessage->AddRef(); + pMessage->m_pService = this; + pMessage->init(); + + m_pMessage = pMessage; + + return S_OK; +} + +void cNetService::onTerminate() +{ + m_pMessage->term(); + + // The release should destroy it + m_pMessage->Release(); + m_pMessage = NULL; + + // Kill all of the network filters in reverse order + while( !m_filters.empty() ) + { + cFilterList::iterator i_end = ( -- m_filters.end() ); + i_end->m_p->Terminate(); + m_filters.erase( i_end ); + } + + m_filters.clear(); + + m_stack.stop(); + + if( g_pService == this ) + { +#ifdef _OUTGOING_PACKETS_ + hookFunctions( _hooksOut, 1, false ); +#endif + if( g_dwReceiveBlobReadyCall ) + HookCall( g_dwReceiveBlobReadyCall, g_dwReceiveBlobReadyProc ); + else + hookFunctions( _hooks, 2, false ); + + g_pService = NULL; + } + + m_pHooks.Release(); +} + +int PASCAL recvfromF( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ) +{ + _ASSERTE( cNetService::g_pService != NULL ); + + int iRes = cNetService::g_fn_recvfrom( s, buf, len, flags, from, fromlen ); + +#ifdef _LOGGING_ + if( iRes != SOCKET_ERROR && cNetService::g_pService != NULL ) + { + char *harro = new char[256]; + _snprintf(harro, 256, "recvfrom( %d, %08X, %d, %d, %08X, %d ) = %d", s, buf, len, flags, from, fromlen, iRes); + m_pHooks->ChatOut(_bstr_t (harro), 0); + delete[] harro; + } +#endif + + if( iRes != SOCKET_ERROR && cNetService::g_pService != NULL ) + cNetService::g_pService->m_stack.processPacket( static_cast< DWORD >( iRes ), reinterpret_cast< BYTE * >( buf ) ); + + return iRes; +} + +int PASCAL sendtoF( SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen ) +{ + _ASSERTE( cNetService::g_pService != NULL ); + +#ifdef _LOGGING_ + char *harro = new char[256]; + char *buffer = new char[512]; + sprintf(harro, "sendto( %d, %08X, %d, %d, %s:%d, %d )", + s, buf, len, flags, + inet_ntoa( ((sockaddr_in *)(to))->sin_addr ), + ntohs( ((sockaddr_in *)(to))->sin_port ), + tolen); + m_pHooks->ChatOut(_bstr_t (harro), 0); + delete[] buffer; + delete[] harro; +#endif + + int iRes = cNetService::g_fn_sendto( s, buf, len, flags, to, tolen ); + + if( iRes != SOCKET_ERROR && cNetService::g_pService != NULL ) + cNetService::g_pService->m_stack.processPacketOut( static_cast< DWORD >( len ), reinterpret_cast< const BYTE * >( buf ) ); + + return iRes; +} + +cNetService *cNetService::g_pService = NULL; +cNetService::fn_recvfrom cNetService::g_fn_recvfrom = NULL; +cNetService::fn_sendto cNetService::g_fn_sendto = NULL; + +void cNetService::onMessage( ACMessage &msg ) +{ + _ASSERTE( m_pMessage != NULL ); + + DWORD dwMessageCode = msg.getType(); + if( dwMessageCode == 0xF7C7 ) + m_pDecal->StartPlugins(); + + else if(( dwMessageCode == 0xF653 ) || ( dwMessageCode == 0xF659 )) + m_pDecal->StopPlugins(); + + m_pMessage->crackMessage( msg.getData (), msg.getSize () ); + +// if( g_bLockMemoryPages ) +// if( !LockMemoryPages( reinterpret_cast< void * >(m_pMessage) ) ) +// return; + + // Dispatch the message to all of the network filters + for( cFilterList::iterator i = m_filters.begin(); i != m_filters.end(); ++ i ) + i->m_p->DispatchServer( m_pMessage ); +} + +void cNetService::onMessageOut( ACMessage &msg ) +{ + _ASSERTE( m_pMessage != NULL ); + + DWORD dwMessageCode = msg.getType(); + + m_pMessage->crackMessage( msg.getData (), msg.getSize () ); + + // Dispatch the message to all of the network filters + for( cFilterList::iterator i = m_filters.begin(); i != m_filters.end(); ++ i ) + i->m_p->DispatchClient( m_pMessage ); +} + +STDMETHODIMP cNetService::BeforePlugins() +{ + USES_CONVERSION; + + // Startup version 1 network filters + RegKey hkeyNF; + if ( hkeyNF.Open ( HKEY_LOCAL_MACHINE, _T( "Software\\Decal\\NetworkFilters" ), KEY_READ ) == ERROR_SUCCESS ) + { + // Enum the values + DWORD dwSize = 64; + TCHAR szCLSID[ 64 ]; + + for ( int i = 0; ::RegEnumValue ( hkeyNF, i, szCLSID, &dwSize, NULL, NULL, NULL, NULL ) == ERROR_SUCCESS; ++ i ) + { + // Reset the sizes + dwSize = 64; + + // Try to convert the string + cFilter f; + HRESULT hRes = ::CLSIDFromString ( T2OLE ( szCLSID ), &f.m_clsid ); + if ( FAILED ( hRes ) ) + // This is not a CLSID + continue; + + // Check for enablement + DWORD dwEnabled; + hkeyNF.QueryDWORDValue ( szCLSID, dwEnabled ); + if ( !dwEnabled ) + continue; + + // We have a CLSID - try to create the object and the adapter + CComObject< cFilterAdapterV1 > *pAdapter; + hRes = CComObject< cFilterAdapterV1 >::CreateInstance ( &pAdapter ); + + if ( FAILED ( hRes ) ) + { + _ASSERT ( FALSE ); + continue; + } + + f.m_p = pAdapter; + hRes = pAdapter->init ( f.m_clsid ); + if( SUCCEEDED( hRes ) ) + { + f.m_ver = eVersion1; + m_filters.push_back( f ); + } + } + } + + return S_OK; +} + +STDMETHODIMP cNetService::AfterPlugins() +{ + // Remove all version 1 network filters + for ( cFilterList::iterator i = m_filters.begin (); i != m_filters.end (); ) + { + if ( i->m_ver == eVersion1 ) + i = m_filters.erase ( i ); + else + ++ i; + } + + return S_OK; +} + +STDMETHODIMP cNetService::Lookup( BSTR strName, IUnknown **ppvItf ) +{ + // Attempt to convert the name to a GUID + CLSID clsid; + HRESULT hRes; + if( strName[ 0 ] == OLECHAR( '{' ) ) + hRes = ::CLSIDFromString( strName, &clsid ); + else + hRes = ::CLSIDFromProgID( strName, &clsid ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + return E_INVALIDARG; + } + + // Walk through the list of filters to find our match + for( cFilterList::iterator i = m_filters.begin(); i != m_filters.end(); ++ i ) + { + if( i->m_clsid == clsid ) + return i->m_p->QueryInterface( IID_IUnknown, reinterpret_cast< void ** >( ppvItf ) ); + } + + // Could not find a network filter with that class ID + _ASSERT( FALSE ); + return E_INVALIDARG; +} + +STDMETHODIMP cNetService::get_Decal(IDecal **pVal) +{ + return m_pDecal->QueryInterface( pVal ); +} + +STDMETHODIMP cNetService::get_Filter(REFCLSID clsid, REFIID iid, LPVOID *pVal) +{ + for( cFilterList::iterator i = m_filters.begin(); i != m_filters.end(); ++ i ) + { + if( i->m_clsid == clsid ) + return i->m_p->QueryInterface( iid, pVal ); + } + + return E_INVALIDARG; +} + +STDMETHODIMP cNetService::get_FilterVB(BSTR strProgID, LPDISPATCH *pVal) +{ + _ASSERTE( strProgID != NULL ); + _ASSERTE( pVal != NULL ); + + // Prepend a fully-qualified service id + _bstr_t strPath ( _T( "services\\DecalNet.NetService\\" ) ); + strPath += strProgID; + + return m_pDecal->get_Object ( strPath, IID_IDispatch, reinterpret_cast< LPVOID * > ( pVal ) ); +} + +STDMETHODIMP cNetService::get_Hooks(IACHooks **pVal) +{ + return m_pHooks->QueryInterface( pVal ); +} + +void __stdcall OnReceiveBlob (DWORD *pStructure) +{ + LPBYTE pPacket = (LPBYTE) (pStructure [g_dwNetBlobObjectDataOffset]); + DWORD dwSize = pStructure [g_dwNetBlobObjectSizeOffset]; + if (cNetService::g_pService) + { + HookedMessage msg (pPacket, dwSize); + cNetService::g_pService->onMessage (msg); + } +} + +void __declspec (naked) ReceiveBlob() +{ + _asm + { + push ecx + + push ecx + call OnReceiveBlob + + pop ecx + + jmp g_dwReceiveBlobReadyProc + } +} + +// Returns the function which previously was being called, after replacing it with the new call. +DWORD HookCall (DWORD dwCallAddress, DWORD dwReplacement) +{ + DWORD* pTemp = (DWORD *) (dwCallAddress + 1); + + HANDLE hProcess = OpenProcess + ( + PROCESS_VM_WRITE | PROCESS_VM_OPERATION, + FALSE, + GetCurrentProcessId () + ); + + DWORD dwOriginal = 0; + + if (hProcess) + { + dwOriginal = (*pTemp) + dwCallAddress + 5; + + DWORD dwTemp = dwReplacement - (dwCallAddress + 5); + if (WriteProcessMemory + ( + hProcess, + pTemp, + &dwTemp, + sizeof (DWORD), + NULL + )) + { + } + else + { + dwOriginal = 0; + } + + CloseHandle (hProcess); + } + + return dwOriginal ; +} + diff --git a/Native/DecalNet/NetService.h b/Native/DecalNet/NetService.h new file mode 100644 index 0000000..54960ef --- /dev/null +++ b/Native/DecalNet/NetService.h @@ -0,0 +1,86 @@ +// NetService.h : Declaration of the cNetService + +#ifndef __NETSERVICE_H_ +#define __NETSERVICE_H_ + +#include "resource.h" // main symbols + +#include +#include "ProtocolStack.h" + +class cMessage; + +///////////////////////////////////////////////////////////////////////////// +// cNetService +class ATL_NO_VTABLE cNetService : + public CComObjectRootEx, + public CComCoClass, + public INetService, + public IDecalServiceImpl< cNetService >, + public IDecalDirectory, + public ACMessageSink +{ +public: + cNetService() + { + } + + cMessageStack m_stack; + + // IDecalServiceImpl overrides + HRESULT onInitialize(); + void onTerminate(); + + CComPtr< IACHooks > m_pHooks; + + static cNetService *g_pService; + typedef int (PASCAL *fn_recvfrom)(SOCKET, char FAR*, int , int, struct sockaddr FAR*, int FAR*); + typedef int (PASCAL *fn_sendto)(SOCKET, const char FAR*, int , int, const struct sockaddr FAR*, int); + static fn_recvfrom g_fn_recvfrom; + static fn_sendto g_fn_sendto; + + // ACMessageSink overrides + virtual void onMessage( ACMessage& ); + virtual void onMessageOut( ACMessage& ); + + // The network filter list + enum ePluginVersion { eVersion1, eVersion2 }; + struct cFilter + { + ePluginVersion m_ver; + CLSID m_clsid; + CComPtr< INetworkFilter2 > m_p; + }; + + typedef std::list< cFilter > cFilterList; + cFilterList m_filters; + + // The message parsing container + cMessage *m_pMessage; + +DECLARE_REGISTRY_RESOURCEID(IDR_NETSERVICE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cNetService) + COM_INTERFACE_ENTRY(INetService) + COM_INTERFACE_ENTRY(IDecalService) + COM_INTERFACE_ENTRY(IDecalDirectory) +END_COM_MAP() + +public: + // IDecalService + STDMETHOD(BeforePlugins)(); + STDMETHOD(AfterPlugins)(); + + // IDecalDirectory + STDMETHOD(Lookup)(BSTR strName, IUnknown **ppvItf); + + // INetService + STDMETHOD(get_Decal)(/*[out, retval]*/ IDecal * *pVal); + STDMETHOD(get_Hooks)(IACHooks **pVal); + STDMETHOD(get_Filter)(REFCLSID clsid, REFIID iid, /*[out, retval]*/ LPVOID *pVal); + STDMETHOD(get_FilterVB)(BSTR strProgID, /*[out, retval]*/ LPDISPATCH *pVal); +}; + +#endif //__NETSERVICE_H_ diff --git a/Native/DecalNet/NetService.rgs b/Native/DecalNet/NetService.rgs new file mode 100644 index 0000000..874562c --- /dev/null +++ b/Native/DecalNet/NetService.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalNet.NetService.1 = s 'NetService Class' + { + CLSID = s '{C8C406F8-BA2E-4964-8B04-FF38394A8E0E}' + } + DecalNet.NetService = s 'NetService Class' + { + CLSID = s '{C8C406F8-BA2E-4964-8B04-FF38394A8E0E}' + CurVer = s 'DecalNet.NetService.1' + } + NoRemove CLSID + { + ForceRemove {C8C406F8-BA2E-4964-8B04-FF38394A8E0E} = s 'NetService Class' + { + ProgID = s 'DecalNet.NetService.1' + VersionIndependentProgID = s 'DecalNet.NetService' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{572B87C4-93BD-46B3-A291-CD58181D25DC}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Services + { + ForceRemove {C8C406F8-BA2E-4964-8B04-FF38394A8E0E} = s 'Decal Networking Service' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/DecalNet/ProtocolHook.h b/Native/DecalNet/ProtocolHook.h new file mode 100644 index 0000000..e654d26 --- /dev/null +++ b/Native/DecalNet/ProtocolHook.h @@ -0,0 +1,44 @@ +#pragma once + +#include "ACMessage.h" + +class HookedMessage : public ACMessage +{ +public: + HookedMessage (BYTE *pData, DWORD dwSize) + { + _ASSERTE (pData != NULL); + _ASSERTE (m_dwSize >= 4); + + m_pData = pData; + m_dwSize = dwSize; + } + + virtual BYTE *getData () + { + _ASSERTE (m_pData != NULL); + return m_pData; + } + + virtual DWORD getSize () + { + return m_dwSize; + } + + virtual DWORD getType () + { + _ASSERTE (m_pData); + _ASSERTE (m_dwSize >= sizeof (DWORD)); + + if (m_pData && m_dwSize >= sizeof (DWORD)) + { + return * (DWORD *) m_pData; + } + + return 0; + } + +protected: + LPBYTE m_pData; + DWORD m_dwSize; +}; diff --git a/Native/DecalNet/ProtocolStack.cpp b/Native/DecalNet/ProtocolStack.cpp new file mode 100644 index 0000000..37dc153 --- /dev/null +++ b/Native/DecalNet/ProtocolStack.cpp @@ -0,0 +1,313 @@ +// ProtocolStack.cpp +// Implementation of class cProtocolStack + +#include "stdafx.h" +#include "ProtocolStack.h" + +cMessageStack::cProtocolMessage::cProtocolMessage( BYTE *pbData ) +: m_pbData( NULL ), +m_pbReceived( NULL ), +m_bOwn( false ) +{ + cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pbData ); + + if( pHeader->m_wFragmentCount == 1 ) + { + // This is the only fragment, we use a direct pointer for dispatching + m_pbData = pbData; + return; + } + + // This message has multiple fragments, create a buffer + m_pbData = new BYTE[ calcMessageLength( pbData ) ]; + m_pbReceived = new bool[ pHeader->m_wFragmentCount ]; + ::memset( m_pbReceived, 0, sizeof( bool ) * pHeader->m_wFragmentCount ); + m_bOwn = true; + + // Two initializers, with + // Copy the header into the new buffer + ::memcpy( m_pbData, pbData, sizeof( cMessageHeader ) ); + insertFragment( pbData ); +} + +cMessageStack::cProtocolMessage::cProtocolMessage( const cProtocolMessage &msg ) +: m_pbData( msg.m_pbData ), +m_bOwn( msg.m_bOwn ), +m_pbReceived( msg.m_pbReceived ) +{ + //msg.m_pbData = NULL; + msg.m_bOwn = false; + //msg.m_pbReceived = NULL; +} + +cMessageStack::cProtocolMessage::~cProtocolMessage() +{ + if( m_bOwn ) + { + delete[] m_pbData; + delete[] m_pbReceived; + } +} + +cMessageStack::cProtocolMessage &cMessageStack::cProtocolMessage::operator= ( const cProtocolMessage &msg ) +{ + if( &msg == this ) + // Do not copy to self + return *this; + + if( m_bOwn ) + { + delete[] m_pbData; + delete[] m_pbReceived; + } + + m_pbData = msg.m_pbData; + m_pbReceived = msg.m_pbReceived; + m_bOwn = msg.m_bOwn; + + //msg.m_pbData = NULL; + msg.m_bOwn = false; + //msg.m_pbReceived = NULL; + + return *this; +} + +bool cMessageStack::cProtocolMessage::isComplete() const +{ + if( m_pbReceived == NULL ) + // This is a single fragment + return true; + + // Walk through all of the sections and make sure that we've found all the fragments + bool *pbEndReceived = m_pbReceived + getMessageHeader()->m_wFragmentCount; + for( bool *i = m_pbReceived; i != pbEndReceived; ++ i ) + { + if( !(*i) ) + return false; + } + + // No unreceiced fragments found - it must be complete + return true; +} + +bool cMessageStack::cProtocolMessage::fragmentMatch( BYTE *pFragmentStart ) +{ + cMessageHeader *pThis = getMessageHeader(), + *pOther = reinterpret_cast< cMessageHeader * >( pFragmentStart ); + + return ( pThis->m_dwObjectID == pOther->m_dwObjectID && pThis->m_dwSequence == pOther->m_dwSequence ); +} + +#define MESSAGE_BODY 448 + +void cMessageStack::cProtocolMessage::insertFragment( BYTE *pFragmentStart ) +{ + cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart ); + + if( m_pbReceived[ pHeader->m_wFragmentIndex ] ) + // This fragment has already been inserted + return; + + BYTE *pInsertLocation = m_pbData + sizeof( cMessageHeader ) + ( MESSAGE_BODY * pHeader->m_wFragmentIndex ); + ::memcpy( pInsertLocation, pFragmentStart + sizeof( cMessageHeader ), pHeader->m_wFragmentLength - sizeof( cMessageHeader ) ); + + // Mark this fragment as received + m_pbReceived[ pHeader->m_wFragmentIndex ] = true; + + if( pHeader->m_wFragmentIndex == ( pHeader->m_wFragmentCount - 1 ) ) + getMessageHeader()->m_wFragmentLength = ( pHeader->m_wFragmentCount - 1 ) * MESSAGE_BODY + pHeader->m_wFragmentLength; +} + +DWORD cMessageStack::cProtocolMessage::calcMessageLength( BYTE *pFragmentStart ) +{ + cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart ); + + return ( pHeader->m_wFragmentIndex == ( pHeader->m_wFragmentCount - 1 ) ) ? + ( pHeader->m_wFragmentCount - 1 ) * MESSAGE_BODY + pHeader->m_wFragmentLength : pHeader->m_wFragmentCount * MESSAGE_BODY + sizeof( cMessageHeader ); +} + +cMessageStack::cMessageStack() +: m_pCallback( NULL ) +{ +} + +cMessageStack::~cMessageStack() +{ + // Make sure we clean up and intermediate steps + stop(); +} + +void cMessageStack::start( ACMessageSink *pCallback ) +{ + // Setting this enables messages + m_pCallback = pCallback; +} + +void cMessageStack::stop() +{ + // Clean out the message list since these will never be matched + m_messages.clear(); + m_pCallback = NULL; +} + +void cMessageStack::processPacket( DWORD dwLength, BYTE *pbPayload ) +{ + // First filter based on our status and the message type + if( m_pCallback == NULL ) + // We currently only support send or receive type messages + return; + + // AC messages must be at least as big as a packet header.+ a message header + if (dwLength < (sizeof (cPacketHeader) + sizeof (cMessageHeader))) + return; + + // Filter non-application messages + cPacketHeader *pHeader = reinterpret_cast< cPacketHeader * >( pbPayload ); + + if((pHeader->m_wTotalSize) != (dwLength - sizeof(cPacketHeader))) + return; + + DWORD dwOffset = 0; + if (pHeader->m_dwFlags & 0x00100000) + // 8 extra header bytes + dwOffset += 8; + + if (pHeader->m_dwFlags & 0x00200000) + // 6 extra header bytes + dwOffset += 6; + + if (pHeader->m_dwFlags & 0x00800000) + // 4 extra header bytes + dwOffset += 4; + + if (dwLength < (dwOffset + sizeof (cMessageHeader))) + return; + + splitPacket( dwLength - dwOffset, pbPayload + dwOffset ); +} + +void cMessageStack::processPacketOut( DWORD dwLength, const BYTE *pbPayload ) +{ + // First filter based on our status and the message type + if( m_pCallback == NULL ) + // We currently only support send or receive type messages + return; + + // AC messages must be at least as big as a packet header.+ a message header + if (dwLength < (sizeof (cPacketHeader) + sizeof (cMessageHeader))) + return; + + // Filter non-application messages + const cPacketHeader *pHeader = reinterpret_cast< const cPacketHeader * >( pbPayload ); + + if((pHeader->m_wTotalSize) != (dwLength - sizeof(cPacketHeader))) + return; + + DWORD dwOffset = 0; + if (pHeader->m_dwFlags & 0x00100000) + // 8 extra header bytes + dwOffset += 8; + + if (pHeader->m_dwFlags & 0x00200000) + // 6 extra header bytes + dwOffset += 6; + + if (pHeader->m_dwFlags & 0x00800000) + // 4 extra header bytes + dwOffset += 4; + + if (dwLength < (dwOffset + sizeof (cMessageHeader))) + return; + + splitPacketOut( dwLength - dwOffset, const_cast(pbPayload + dwOffset) ); +} + +void cMessageStack::splitPacket( DWORD dwLength, BYTE *pbPayload ) +{ + DWORD dwFragLength = 0; + BYTE *i_end_packet = pbPayload + dwLength; + + for( BYTE *iFrag = pbPayload + sizeof( cPacketHeader ); iFrag != i_end_packet; iFrag += dwFragLength ) + { + dwFragLength = reinterpret_cast< cMessageHeader * >( iFrag )->m_wFragmentLength; + + if( dwFragLength == 0 || ( iFrag + dwFragLength ) > i_end_packet ) + // We are off the end somehow + return; + + // First walk through our cached fragments and see if one will take this fragment + for( cMessageList::iterator i = m_messages.begin(); i != m_messages.end(); ++ i ) + { + if( i->fragmentMatch( iFrag ) ) + { + i->insertFragment( iFrag ); + if( i->isComplete() ) + { + // Remove it from the list and dispatch the message + m_pCallback->onMessage( *i ); + m_messages.erase( i ); + } + break; + } + } + + if( i != m_messages.end() ) + // The fragment was found in the list + continue; + + // Ok, we have a new fragment on our hands - generate the fragment object + cProtocolMessage msg( iFrag ); + + if( msg.isComplete() ) + // It's only one piece, dispatch right away + m_pCallback->onMessage( msg ); + else + // This requires more parts add it into the queue to wait + m_messages.push_back( msg ); + } +} + +void cMessageStack::splitPacketOut( DWORD dwLength, const BYTE *pbPayload ) +{ + DWORD dwFragLength = 0; + BYTE *i_end_packet = const_cast< BYTE * >(pbPayload) + dwLength; + + for( BYTE *iFrag = const_cast< BYTE * >(pbPayload) + sizeof( cPacketHeader ); iFrag != i_end_packet; iFrag += dwFragLength ) + { + dwFragLength = reinterpret_cast< const cMessageHeader * >( iFrag )->m_wFragmentLength; + + if( dwFragLength == 0 || ( iFrag + dwFragLength ) > i_end_packet ) + // We are off the end somehow + return; + + // First walk through our cached fragments and see if one will take this fragment + for( cMessageList::iterator i = m_messages.begin(); i != m_messages.end(); ++ i ) + { + if( i->fragmentMatch( iFrag ) ) + { + i->insertFragment( iFrag ); + if( i->isComplete() ) + { + // Remove it from the list and dispatch the message + m_pCallback->onMessageOut( *i ); + m_messages.erase( i ); + } + break; + } + } + + if( i != m_messages.end() ) + // The fragment was found in the list + continue; + + // Ok, we have a new fragment on our hands - generate the fragment object + cProtocolMessage msg( iFrag ); + + if( msg.isComplete() ) + // It's only one piece, dispatch right away + m_pCallback->onMessageOut( msg ); + else + // This requires more parts add it into the queue to wait + m_messages.push_back( msg ); + } +} diff --git a/Native/DecalNet/ProtocolStack.h b/Native/DecalNet/ProtocolStack.h new file mode 100644 index 0000000..89d41e5 --- /dev/null +++ b/Native/DecalNet/ProtocolStack.h @@ -0,0 +1,106 @@ +// ProtocolStack.h +// Declaration of class cProtocolStack + +#ifndef __PROTOCOLSTACK_H +#define __PROTOCOLSTACK_H + +#include "ACMessage.h" + +#define DEFAULT_HEADER_SIZE 16 +#define FRAGMENT_SIZE 448 + +#pragma pack( push, 1 ) +// The packet header +struct cPacketHeader +{ + DWORD m_dwSequence; + DWORD m_dwFlags; + DWORD m_dwCRC; + + WORD m_wUnk1; + WORD m_wUnk2; + WORD m_wTotalSize; + WORD m_wUnk3; +}; +#pragma pack( pop ) + +class cMessageStack +{ +public: +#pragma pack( push, 1 ) + struct cMessageHeader + { + DWORD m_dwSequence; + DWORD m_dwObjectID; + WORD m_wFragmentCount; + WORD m_wFragmentLength; + WORD m_wFragmentIndex, + m_wUnknown1; + }; +#pragma pack( pop ) + + class cProtocolMessage : public ACMessage + { + protected: + mutable BYTE *m_pbData; + mutable bool *m_pbReceived; + mutable bool m_bOwn; + + public: + cProtocolMessage( BYTE *pbData ); + cProtocolMessage( const cProtocolMessage &msg ); + ~cProtocolMessage(); + + cMessageHeader *getMessageHeader() const + { + return reinterpret_cast< cMessageHeader * >( m_pbData ); + } + + cProtocolMessage &operator= ( const cProtocolMessage &msg ); + + // ACMessage interface implementation for protocol stack + virtual BYTE *getData () + { + return m_pbData + sizeof( cMessageHeader ); + } + + virtual DWORD getSize () + { + return getMessageHeader()->m_wFragmentLength - sizeof( cMessageHeader ); + } + + virtual DWORD getType () + { + return *reinterpret_cast< DWORD * >( m_pbData + sizeof( cMessageHeader ) ); + } + + bool isComplete() const; + + bool fragmentMatch( BYTE *pFragmentStart ); + void insertFragment( BYTE *pFragmentStart ); + + static DWORD calcMessageLength( BYTE *pbHeader ); + }; + +private: + typedef std::list< cProtocolMessage > cMessageList; + + ACMessageSink *m_pCallback; + cMessageList m_messages; + +public: + cMessageStack(); + ~cMessageStack(); + + void start( ACMessageSink * ); + void stop(); + + void processPacket( DWORD dwLength, BYTE *pbPayload ); + void processPacketOut( DWORD dwLength, const BYTE *pbPayload ); + +private: + void splitPacket( DWORD dwLength, BYTE *pbPayload ); + void splitPacketOut( DWORD dwLength, const BYTE *pbPayload ); +}; + +#endif diff --git a/Native/DecalNet/StdAfx.cpp b/Native/DecalNet/StdAfx.cpp new file mode 100644 index 0000000..a5eea17 --- /dev/null +++ b/Native/DecalNet/StdAfx.cpp @@ -0,0 +1,12 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#include +#endif + +#include diff --git a/Native/DecalNet/StdAfx.h b/Native/DecalNet/StdAfx.h new file mode 100644 index 0000000..5e5b89e --- /dev/null +++ b/Native/DecalNet/StdAfx.h @@ -0,0 +1,45 @@ +// 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__88F425A2_1F36_4573_B1E2_C32EF26B2CBA__INCLUDED_) +#define AFX_STDAFX_H__88F425A2_1F36_4573_B1E2_C32EF26B2CBA__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _ATL_APARTMENT_THREADED + +#pragma warning(disable:4530) + +//C Library includes +#include +#include + +#include +#include + +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include + +#include +#include + +#include +#include +#include +#include +#include +#include "../Include/VSBridge.h" + +#import + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__88F425A2_1F36_4573_B1E2_C32EF26B2CBA__INCLUDED) diff --git a/Native/DecalNet/WebRequest.cpp b/Native/DecalNet/WebRequest.cpp new file mode 100644 index 0000000..26ed573 --- /dev/null +++ b/Native/DecalNet/WebRequest.cpp @@ -0,0 +1,108 @@ +// WebRequest.cpp : Implementation of cWebRequest +#include "stdafx.h" +#include "DecalNet.h" +#include "WebRequest.h" + +///////////////////////////////////////////////////////////////////////////// +// cWebRequest + +STDMETHODIMP cWebRequest::Get(BSTR strURL) +{ + USES_CONVERSION; + HRESULT hRes = ::URLOpenStream( NULL, OLE2T( strURL ), 0, this ); + m_strPost = _bstr_t(); + + return hRes; +} + +STDMETHODIMP cWebRequest::Post(BSTR strURL, BSTR strPostData) +{ + USES_CONVERSION; + m_strPost = strPostData; + HRESULT hRes = ::URLOpenStream( NULL, OLE2T( strURL ), 0, this ); + + return hRes; +} + +STDMETHODIMP cWebRequest::GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindinfo) +{ + USES_CONVERSION; + + *pgrfBINDF = BINDF_ASYNCHRONOUS | BINDF_GETNEWESTVERSION | BINDF_ASYNCSTORAGE | BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE; + + if( m_strPost.length() != 0 ) + { + // We're doing a post operation - set the data into an HGLOBAL + ::memset( pbindinfo, 0, sizeof( BINDINFO ) ); + + pbindinfo->cbSize = sizeof( BINDINFO ); + pbindinfo->szExtraInfo = NULL; + + LPCSTR strPost = OLE2A( m_strPost ); + int nLength = m_strPost.length(); + pbindinfo->stgmedData.tymed = TYMED_HGLOBAL; + pbindinfo->stgmedData.hGlobal = ::GlobalAlloc( GPTR, nLength ); + pbindinfo->stgmedData.pUnkForRelease = static_cast< IBindStatusCallback * >( this ); + pbindinfo->stgmedData.pUnkForRelease->AddRef(); + + ::memcpy( pbindinfo->stgmedData.hGlobal, strPost, nLength ); + + // pbindinfo->grfBindInfoF = 0; + pbindinfo->dwBindVerb = BINDVERB_POST; + pbindinfo->dwCodePage = 0; + pbindinfo->cbstgmedData = nLength; + pbindinfo->grfBindInfoF = BINDINFOF_URLENCODESTGMEDDATA; + } + else + pbindinfo->dwBindVerb = BINDVERB_GET; + + return S_OK; +} + +STDMETHODIMP cWebRequest::OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmetc, STGMEDIUM *pstgmed ) +{ + if( pstgmed->tymed != TYMED_ISTREAM ) + // We only support IStream format + return E_INVALIDARG; + + char *strStr = new char[ dwSize + 1 ]; + pstgmed->pstm->Read( strStr, dwSize, NULL ); + strStr[ dwSize ] = '\0'; + + m_strResult += strStr; + delete[] strStr; + + return S_OK; +} + +STDMETHODIMP cWebRequest::OnStopBinding(HRESULT hr, LPCWSTR sz) +{ + m_pBinding.Release(); + m_strPost = _bstr_t(); + + Fire_End( ( SUCCEEDED( hr ) ) ? 200 : 400, m_strResult ); + + return S_OK; +} + +STDMETHODIMP cWebRequest::BeginningTransaction(LPCWSTR szURL, LPCWSTR szHeaders, DWORD, LPWSTR *pszAdditionalRequestHeaders) +{ + if( m_strPost.length() == 0 ) + { + *pszAdditionalRequestHeaders = NULL; + return S_OK; + } + + // Append a content-type so the server will understand that this is a form submission + LPCWSTR wszContent = L"Content-Type: application/x-www-form-urlencoded\r\n"; + *pszAdditionalRequestHeaders = reinterpret_cast< LPWSTR >( ::CoTaskMemAlloc( sizeof( wchar_t ) * ( ::wcslen( wszContent ) + 1 ) ) ); + ::wcscpy( *pszAdditionalRequestHeaders, wszContent ); + + return S_OK; +} + +STDMETHODIMP cWebRequest::OnResponse(DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders) +{ + *pszAdditionalRequestHeaders = NULL; + return S_OK; +} diff --git a/Native/DecalNet/WebRequest.h b/Native/DecalNet/WebRequest.h new file mode 100644 index 0000000..6b9e36b --- /dev/null +++ b/Native/DecalNet/WebRequest.h @@ -0,0 +1,92 @@ +// WebRequest.h : Declaration of the cWebRequest + +#ifndef __WEBREQUEST_H_ +#define __WEBREQUEST_H_ + +#include "resource.h" // main symbols +#include "DecalNetCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cWebRequest +class ATL_NO_VTABLE cWebRequest : + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public IBindStatusCallback, + public IHttpNegotiate, + public IProvideClassInfo2Impl< &CLSID_WebRequest, &DIID_IWebRequestEvents, &LIBID_DecalNet >, + public IDispatchImpl, + public CProxyIWebRequestEvents< cWebRequest > +{ +public: + cWebRequest() + { + } + + _bstr_t m_strResult; + _bstr_t m_strPost; + + CComPtr< IBinding > m_pBinding; + +DECLARE_REGISTRY_RESOURCEID(IDR_WEBREQUEST) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cWebRequest) + COM_INTERFACE_ENTRY(IBindStatusCallback) + COM_INTERFACE_ENTRY(IWebRequest) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IHttpNegotiate) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cWebRequest) + CONNECTION_POINT_ENTRY(DIID_IWebRequestEvents) +END_CONNECTION_POINT_MAP() + +// IWebRequest +public: + STDMETHOD(Post)(BSTR strURL, BSTR strPostData); + STDMETHOD(Get)(BSTR strURL); + +// IBindStatusCallback + STDMETHOD(GetBindInfo)(DWORD *pgrfBINDF, BINDINFO *pbindinfo); + STDMETHOD(GetPriority)(LONG *pnPriority) + { + *pnPriority = THREAD_PRIORITY_NORMAL; + return S_OK; + } + + STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc, STGMEDIUM *pstgmed); + STDMETHOD(OnLowResource)(DWORD) + { + return E_NOTIMPL; + } + STDMETHOD(OnObjectAvailable)(REFIID, IUnknown *) + { + return E_NOTIMPL; + } + STDMETHOD(OnProgress)(ULONG, ULONG, ULONG, LPCWSTR) + { + return E_NOTIMPL; + } + STDMETHOD(OnStartBinding)(DWORD, IBinding *pBinding) + { + m_pBinding = pBinding; + + // Reset the result + m_strResult = _bstr_t( _T( "" ) ); + Fire_Begin(); + + return S_OK; + } + STDMETHOD(OnStopBinding)(HRESULT hr, LPCWSTR); + +// IHttpNegotiate + STDMETHOD(BeginningTransaction)(LPCWSTR szURL, LPCWSTR szHeaders, DWORD, LPWSTR *pszAdditionalRequestHeaders); + STDMETHOD(OnResponse)(DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders); +}; + +#endif //__WEBREQUEST_H_ diff --git a/Native/DecalNet/WebRequest.rgs b/Native/DecalNet/WebRequest.rgs new file mode 100644 index 0000000..3f4db02 --- /dev/null +++ b/Native/DecalNet/WebRequest.rgs @@ -0,0 +1,26 @@ +HKCR +{ + DecalNet.WebRequest.1 = s 'WebRequest Class' + { + CLSID = s '{15631E36-55CB-4D16-ADE7-74D9F8A5F4B6}' + } + DecalNet.WebRequest = s 'WebRequest Class' + { + CLSID = s '{15631E36-55CB-4D16-ADE7-74D9F8A5F4B6}' + CurVer = s 'DecalNet.WebRequest.1' + } + NoRemove CLSID + { + ForceRemove {15631E36-55CB-4D16-ADE7-74D9F8A5F4B6} = s 'WebRequest Class' + { + ProgID = s 'DecalNet.WebRequest.1' + VersionIndependentProgID = s 'DecalNet.WebRequest' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{572B87C4-93BD-46B3-A291-CD58181D25DC}' + } + } +} diff --git a/Native/DecalNet/resource.h b/Native/DecalNet/resource.h new file mode 100644 index 0000000..4007d18 --- /dev/null +++ b/Native/DecalNet/resource.h @@ -0,0 +1,19 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by DecalNet.rc +// +#define IDS_PROJNAME 100 +#define IDR_NETSERVICE 101 +#define IDR_WEBREQUEST 102 +#define IDR_MESSAGEROOT 103 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 104 +#endif +#endif diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.cpp b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.cpp new file mode 100644 index 0000000..f49e929 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.cpp @@ -0,0 +1,105 @@ +// DecalSupportLibraries.cpp : Defines the class behaviors for the application. +// + +#include "stdafx.h" +#include "DecalSupportLibraries.h" +#include "DecalSupportLibrariesDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CDecalSupportLibrariesApp + +BEGIN_MESSAGE_MAP(CDecalSupportLibrariesApp, CWinApp) + ON_COMMAND(ID_HELP, CWinApp::OnHelp) +END_MESSAGE_MAP() + + +// CDecalSupportLibrariesApp construction + +CDecalSupportLibrariesApp::CDecalSupportLibrariesApp() +{ + // TODO: add construction code here, + // Place all significant initialization in InitInstance +} + + +// The one and only CDecalSupportLibrariesApp object + +CDecalSupportLibrariesApp theApp; + +const GUID CDECL BASED_CODE _tlid = + { 0x24241FCB, 0x6DD4, 0x4B97, { 0x8C, 0x1F, 0x88, 0xA2, 0x30, 0x84, 0xAF, 0xA5 } }; +const WORD _wVerMajor = 1; +const WORD _wVerMinor = 0; + + +// CDecalSupportLibrariesApp initialization + +BOOL CDecalSupportLibrariesApp::InitInstance() +{ + // InitCommonControls() is required on Windows XP if an application + // manifest specifies use of ComCtl32.dll version 6 or later to enable + // visual styles. Otherwise, any window creation will fail. + InitCommonControls(); + + CWinApp::InitInstance(); + + // Initialize OLE libraries + if (!AfxOleInit()) + { + AfxMessageBox(IDP_OLE_INIT_FAILED); + return FALSE; + } + + AfxEnableControlContainer(); + + // Parse command line for automation or reg/unreg switches. + CCommandLineInfo cmdInfo; + ParseCommandLine(cmdInfo); + + // App was launched with /Embedding or /Automation switch. + // Run app as automation server. + if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) + { + // Register class factories via CoRegisterClassObject(). + COleTemplateServer::RegisterAll(); + } + // App was launched with /Unregserver or /Unregister switch. Remove + // entries from the registry. + else if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister) + { + COleObjectFactory::UpdateRegistryAll(FALSE); + AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor); + return FALSE; + } + // App was launched standalone or with other switches (e.g. /Register + // or /Regserver). Update registry entries, including typelibrary. + else + { + COleObjectFactory::UpdateRegistryAll(); + AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid); + if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppRegister) + return FALSE; + } + + CDecalSupportLibrariesDlg dlg; + m_pMainWnd = &dlg; + INT_PTR nResponse = dlg.DoModal(); + if (nResponse == IDOK) + { + // TODO: Place code here to handle when the dialog is + // dismissed with OK + } + else if (nResponse == IDCANCEL) + { + // TODO: Place code here to handle when the dialog is + // dismissed with Cancel + } + + // Since the dialog has been closed, return FALSE so that we exit the + // application, rather than start the application's message pump. + return FALSE; +} diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.h b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.h new file mode 100644 index 0000000..dad3403 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.h @@ -0,0 +1,31 @@ +// DecalSupportLibraries.h : main header file for the PROJECT_NAME application +// + +#pragma once + +#ifndef __AFXWIN_H__ + #error include 'stdafx.h' before including this file for PCH +#endif + +#include "resource.h" // main symbols + + +// CDecalSupportLibrariesApp: +// See DecalSupportLibraries.cpp for the implementation of this class +// + +class CDecalSupportLibrariesApp : public CWinApp +{ +public: + CDecalSupportLibrariesApp(); + +// Overrides + public: + virtual BOOL InitInstance(); + +// Implementation + + DECLARE_MESSAGE_MAP() +}; + +extern CDecalSupportLibrariesApp theApp; \ No newline at end of file diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.idl b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.idl new file mode 100644 index 0000000..87e0405 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.idl @@ -0,0 +1,29 @@ +// DecalSupportLibraries.idl : type library source for DecalSupportLibraries.exe + +// This file will be processed by the MIDL compiler to produce the +// type library (DecalSupportLibraries.tlb). + +[ uuid(24241FCB-6DD4-4B97-8C1F-88A23084AFA5), version(1.0) ] +library DecalSupportLibraries +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + // Primary dispatch interface for CDecalSupportLibrariesDoc + + [ uuid(586E5AC4-7A88-4CFA-B075-2D7F0E70250D) ] + dispinterface IDecalSupportLibraries + { + properties: + + methods: + }; + + // Class information for CDecalSupportLibrariesDoc + + [ uuid(29FC66D6-DFC1-45D0-87AD-52D44949DCBC) ] + coclass DecalSupportLibraries + { + [default] dispinterface IDecalSupportLibraries; + }; +}; diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.rc b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.rc new file mode 100644 index 0000000..a09eba9 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.rc @@ -0,0 +1,210 @@ +// Microsoft Visual C++ 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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "LANGUAGE 9, 1\r\n" + "#pragma code_page(1252)\r\n" + "#include ""res\\DecalSupportLibraries.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\r\n" + "1 TYPELIB ""DecalSupportLibraries.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON "res\\DecalSupportLibraries.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "About DecalSupportLibraries" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 + LTEXT "DecalSupportLibraries Version 1.0",IDC_STATIC,40,10,119, + 8,SS_NOPREFIX + LTEXT "Copyright (C) 2003",IDC_STATIC,40,25,119,8 + DEFPUSHBUTTON "OK",IDOK,178,7,50,16,WS_GROUP +END + +IDD_DECALSUPPORTLIBRARIES_DIALOG DIALOGEX 0, 0, 193, 46 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "DSL 1.0" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,71,23,50,16 + CTEXT "Decal Support Libraries Vsn 1.0 are Installed.", + IDC_STATIC,7,7,179,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "TODO: " + VALUE "FileDescription", "TODO: " + VALUE "FileVersion", "1.0.0.1" + VALUE "InternalName", "DecalSupportLibraries.exe" + VALUE "LegalCopyright", "TODO: (c) . All rights reserved." + VALUE "OriginalFilename", "DecalSupportLibraries.exe" + VALUE "ProductName", "TODO: " + VALUE "ProductVersion", "1.0.0.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 228 + TOPMARGIN, 7 + BOTTOMMARGIN, 48 + END + + IDD_DECALSUPPORTLIBRARIES_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 186 + TOPMARGIN, 7 + BOTTOMMARGIN, 39 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +IDR_MANIFEST RT_MANIFEST "res\\DecalSupportLibraries.manifest" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDP_OLE_INIT_FAILED "OLE initialization failed. Make sure that the OLE libraries are the correct version." + IDS_ABOUTBOX "&About DecalSupportLibraries..." +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 9, 1 +#pragma code_page(1252) +#include "res\DecalSupportLibraries.rc2" // non-Microsoft Visual C++ edited resources +#include "afxres.rc" // Standard components +#endif +1 TYPELIB "DecalSupportLibraries.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.reg b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.reg new file mode 100644 index 0000000..1c5ee3f --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.reg @@ -0,0 +1,14 @@ +REGEDIT +; This .REG file may be used by your SETUP program. +; If a SETUP program is not available, the entries below will be +; registered in your InitInstance automatically with a call to +; CWinApp::RegisterShellFileTypes and COleObjectFactory::UpdateRegistryAll. + +HKEY_CLASSES_ROOT\DecalSupportLibraries.Application = DecalSupportLibraries Application +HKEY_CLASSES_ROOT\DecalSupportLibraries.Application\CLSID = {29FC66D6-DFC1-45D0-87AD-52D44949DCBC} + +HKEY_CLASSES_ROOT\CLSID\{29FC66D6-DFC1-45D0-87AD-52D44949DCBC} = DecalSupportLibraries Application +HKEY_CLASSES_ROOT\CLSID\{29FC66D6-DFC1-45D0-87AD-52D44949DCBC}\ProgId = DecalSupportLibraries.Application + + +HKEY_CLASSES_ROOT\CLSID\{29FC66D6-DFC1-45D0-87AD-52D44949DCBC}\LocalServer32 = DecalSupportLibraries.EXE diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.sln b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.sln new file mode 100644 index 0000000..92f6a85 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.sln @@ -0,0 +1,26 @@ +Microsoft Visual Studio Solution File, Format Version 7.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DecalSupportLibraries", "DecalSupportLibraries.vcproj", "{360B2C0C-FF38-4582-83DC-9BCE1EA2D6D8}" +EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "DSLSetup", "DSLSetup\DSLSetup.vdproj", "{F5C00DF4-0DB7-45F8-B9C2-FA3EAFF4A60D}" +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + ConfigName.0 = Debug + ConfigName.1 = Release + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {360B2C0C-FF38-4582-83DC-9BCE1EA2D6D8}.Debug.ActiveCfg = Debug|Win32 + {360B2C0C-FF38-4582-83DC-9BCE1EA2D6D8}.Debug.Build.0 = Debug|Win32 + {360B2C0C-FF38-4582-83DC-9BCE1EA2D6D8}.Release.ActiveCfg = Release|Win32 + {360B2C0C-FF38-4582-83DC-9BCE1EA2D6D8}.Release.Build.0 = Release|Win32 + {F5C00DF4-0DB7-45F8-B9C2-FA3EAFF4A60D}.Debug.ActiveCfg = Debug + {F5C00DF4-0DB7-45F8-B9C2-FA3EAFF4A60D}.Release.ActiveCfg = Release + {F5C00DF4-0DB7-45F8-B9C2-FA3EAFF4A60D}.Release.Build.0 = Release + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.vcproj b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.vcproj new file mode 100644 index 0000000..263fdd0 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibraries.vcproj @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.cpp b/Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.cpp new file mode 100644 index 0000000..cff9335 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.cpp @@ -0,0 +1,202 @@ +// DecalSupportLibrariesDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "DecalSupportLibraries.h" +#include "DecalSupportLibrariesDlg.h" +#include "DlgProxy.h" +#include "string" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CAboutDlg dialog used for App About + +class CAboutDlg : public CDialog +{ +public: + CAboutDlg(); + +// Dialog Data + enum { IDD = IDD_ABOUTBOX }; + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + +// Implementation +protected: + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) +{ +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) +END_MESSAGE_MAP() + + +// CDecalSupportLibrariesDlg dialog + + + + +IMPLEMENT_DYNAMIC(CDecalSupportLibrariesDlg, CDialog); +CDecalSupportLibrariesDlg::CDecalSupportLibrariesDlg(CWnd* pParent /*=NULL*/) + : CDialog(CDecalSupportLibrariesDlg::IDD, pParent) +{ + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + m_pAutoProxy = NULL; +} +CDecalSupportLibrariesDlg::~CDecalSupportLibrariesDlg() +{ + // If there is an automation proxy for this dialog, set + // its back pointer to this dialog to NULL, so it knows + // the dialog has been deleted. + if (m_pAutoProxy != NULL) + m_pAutoProxy->m_pDialog = NULL; +} + +void CDecalSupportLibrariesDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CDecalSupportLibrariesDlg, CDialog) + ON_WM_SYSCOMMAND() + ON_WM_CLOSE() + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +// CDecalSupportLibrariesDlg message handlers + +BOOL CDecalSupportLibrariesDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Add "About..." menu item to system menu. + + // IDM_ABOUTBOX must be in the system command range. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + std::string sAbout("Decal Support Libraries") ; + + CString strAboutMenu; + strAboutMenu.LoadString(IDS_ABOUTBOX); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + // TODO: Add extra initialization here + + return TRUE; // return TRUE unless you set the focus to a control +} + +void CDecalSupportLibrariesDlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + if ((nID & 0xFFF0) == IDM_ABOUTBOX) + { + CAboutDlg dlgAbout; + dlgAbout.DoModal(); + } + else + { + CDialog::OnSysCommand(nID, lParam); + } +} + +// If you add a minimize button to your dialog, you will need the code below +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CDecalSupportLibrariesDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialog::OnPaint(); + } +} + +// The system calls this function to obtain the cursor to display while the user drags +// the minimized window. +HCURSOR CDecalSupportLibrariesDlg::OnQueryDragIcon() +{ + return static_cast(m_hIcon); +} + +// Automation servers should not exit when a user closes the UI +// if a controller still holds on to one of its objects. These +// message handlers make sure that if the proxy is still in use, +// then the UI is hidden but the dialog remains around if it +// is dismissed. + +void CDecalSupportLibrariesDlg::OnClose() +{ + if (CanExit()) + CDialog::OnClose(); +} + +void CDecalSupportLibrariesDlg::OnOK() +{ + if (CanExit()) + CDialog::OnOK(); +} + +void CDecalSupportLibrariesDlg::OnCancel() +{ + if (CanExit()) + CDialog::OnCancel(); +} + +BOOL CDecalSupportLibrariesDlg::CanExit() +{ + // If the proxy object is still around, then the automation + // controller is still holding on to this application. Leave + // the dialog around, but hide its UI. + if (m_pAutoProxy != NULL) + { + ShowWindow(SW_HIDE); + return FALSE; + } + + return TRUE; +} diff --git a/Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.h b/Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.h new file mode 100644 index 0000000..980a4b8 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DecalSupportLibrariesDlg.h @@ -0,0 +1,43 @@ +// DecalSupportLibrariesDlg.h : header file +// + +#pragma once + +class CDecalSupportLibrariesDlgAutoProxy; + + +// CDecalSupportLibrariesDlg dialog +class CDecalSupportLibrariesDlg : public CDialog +{ + DECLARE_DYNAMIC(CDecalSupportLibrariesDlg); + friend class CDecalSupportLibrariesDlgAutoProxy; + +// Construction +public: + CDecalSupportLibrariesDlg(CWnd* pParent = NULL); // standard constructor + virtual ~CDecalSupportLibrariesDlg(); + +// Dialog Data + enum { IDD = IDD_DECALSUPPORTLIBRARIES_DIALOG }; + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + +// Implementation +protected: + CDecalSupportLibrariesDlgAutoProxy* m_pAutoProxy; + HICON m_hIcon; + + BOOL CanExit(); + + // Generated message map functions + virtual BOOL OnInitDialog(); + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + afx_msg void OnPaint(); + afx_msg HCURSOR OnQueryDragIcon(); + afx_msg void OnClose(); + virtual void OnOK(); + virtual void OnCancel(); + DECLARE_MESSAGE_MAP() +}; diff --git a/Native/DecalSupportLibraries/Attic/DlgProxy.cpp b/Native/DecalSupportLibraries/Attic/DlgProxy.cpp new file mode 100644 index 0000000..40d23ad --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DlgProxy.cpp @@ -0,0 +1,80 @@ +// DlgProxy.cpp : implementation file +// + +#include "stdafx.h" +#include "DecalSupportLibraries.h" +#include "DlgProxy.h" +#include "DecalSupportLibrariesDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CDecalSupportLibrariesDlgAutoProxy + +IMPLEMENT_DYNCREATE(CDecalSupportLibrariesDlgAutoProxy, CCmdTarget) + +CDecalSupportLibrariesDlgAutoProxy::CDecalSupportLibrariesDlgAutoProxy() +{ + EnableAutomation(); + + // To keep the application running as long as an automation + // object is active, the constructor calls AfxOleLockApp. + AfxOleLockApp(); + + // Get access to the dialog through the application's + // main window pointer. Set the proxy's internal pointer + // to point to the dialog, and set the dialog's back pointer to + // this proxy. + ASSERT (AfxGetApp()->m_pMainWnd != NULL); + ASSERT_VALID (AfxGetApp()->m_pMainWnd); + ASSERT_KINDOF(CDecalSupportLibrariesDlg, AfxGetApp()->m_pMainWnd); + m_pDialog = reinterpret_cast(AfxGetApp()->m_pMainWnd); + m_pDialog->m_pAutoProxy = this; +} + +CDecalSupportLibrariesDlgAutoProxy::~CDecalSupportLibrariesDlgAutoProxy() +{ + // To terminate the application when all objects created with + // with automation, the destructor calls AfxOleUnlockApp. + // Among other things, this will destroy the main dialog + if (m_pDialog != NULL) + m_pDialog->m_pAutoProxy = NULL; + AfxOleUnlockApp(); +} + +void CDecalSupportLibrariesDlgAutoProxy::OnFinalRelease() +{ + // When the last reference for an automation object is released + // OnFinalRelease is called. The base class will automatically + // deletes the object. Add additional cleanup required for your + // object before calling the base class. + + CCmdTarget::OnFinalRelease(); +} + +BEGIN_MESSAGE_MAP(CDecalSupportLibrariesDlgAutoProxy, CCmdTarget) +END_MESSAGE_MAP() + +BEGIN_DISPATCH_MAP(CDecalSupportLibrariesDlgAutoProxy, CCmdTarget) +END_DISPATCH_MAP() + +// Note: we add support for IID_IDecalSupportLibraries to support typesafe binding +// from VBA. This IID must match the GUID that is attached to the +// dispinterface in the .IDL file. + +// {586E5AC4-7A88-4CFA-B075-2D7F0E70250D} +static const IID IID_IDecalSupportLibraries = +{ 0x586E5AC4, 0x7A88, 0x4CFA, { 0xB0, 0x75, 0x2D, 0x7F, 0xE, 0x70, 0x25, 0xD } }; + +BEGIN_INTERFACE_MAP(CDecalSupportLibrariesDlgAutoProxy, CCmdTarget) + INTERFACE_PART(CDecalSupportLibrariesDlgAutoProxy, IID_IDecalSupportLibraries, Dispatch) +END_INTERFACE_MAP() + +// The IMPLEMENT_OLECREATE2 macro is defined in StdAfx.h of this project +// {29FC66D6-DFC1-45D0-87AD-52D44949DCBC} +IMPLEMENT_OLECREATE2(CDecalSupportLibrariesDlgAutoProxy, "DecalSupportLibraries.Application", 0x29fc66d6, 0xdfc1, 0x45d0, 0x87, 0xad, 0x52, 0xd4, 0x49, 0x49, 0xdc, 0xbc) + + +// CDecalSupportLibrariesDlgAutoProxy message handlers diff --git a/Native/DecalSupportLibraries/Attic/DlgProxy.h b/Native/DecalSupportLibraries/Attic/DlgProxy.h new file mode 100644 index 0000000..983c6a1 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/DlgProxy.h @@ -0,0 +1,42 @@ +// DlgProxy.h: header file +// + +#pragma once + +class CDecalSupportLibrariesDlg; + + +// CDecalSupportLibrariesDlgAutoProxy command target + +class CDecalSupportLibrariesDlgAutoProxy : public CCmdTarget +{ + DECLARE_DYNCREATE(CDecalSupportLibrariesDlgAutoProxy) + + CDecalSupportLibrariesDlgAutoProxy(); // protected constructor used by dynamic creation + +// Attributes +public: + CDecalSupportLibrariesDlg* m_pDialog; + +// Operations +public: + +// Overrides + public: + virtual void OnFinalRelease(); + +// Implementation +protected: + virtual ~CDecalSupportLibrariesDlgAutoProxy(); + + // Generated message map functions + + DECLARE_MESSAGE_MAP() + DECLARE_OLECREATE(CDecalSupportLibrariesDlgAutoProxy) + + // Generated OLE dispatch map functions + + DECLARE_DISPATCH_MAP() + DECLARE_INTERFACE_MAP() +}; + diff --git a/Native/DecalSupportLibraries/Attic/ReadMe.txt b/Native/DecalSupportLibraries/Attic/ReadMe.txt new file mode 100644 index 0000000..32ec0a4 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/ReadMe.txt @@ -0,0 +1,105 @@ +================================================================================ + MICROSOFT FOUNDATION CLASS LIBRARY : DecalSupportLibraries Project Overview +=============================================================================== + +The application wizard has created this DecalSupportLibraries application for +you. This application not only demonstrates the basics of using the Microsoft +Foundation Classes but is also a starting point for writing your application. + +This file contains a summary of what you will find in each of the files that +make up your DecalSupportLibraries application. + +DecalSupportLibraries.vcproj + This is the main project file for VC++ projects generated using an application wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + application wizard. + +DecalSupportLibraries.h + This is the main header file for the application. It includes other + project specific headers (including Resource.h) and declares the + CDecalSupportLibrariesApp application class. + +DecalSupportLibraries.cpp + This is the main application source file that contains the application + class CDecalSupportLibrariesApp. + +DecalSupportLibraries.rc + This is a listing of all of the Microsoft Windows resources that the + program uses. It includes the icons, bitmaps, and cursors that are stored + in the RES subdirectory. This file can be directly edited in Microsoft + Visual C++. Your project resources are in 1033. + +res\DecalSupportLibraries.ico + This is an icon file, which is used as the application's icon. This + icon is included by the main resource file DecalSupportLibraries.rc. + +res\DecalSupportLibraries.rc2 + This file contains resources that are not edited by Microsoft + Visual C++. You should place all resources not editable by + the resource editor in this file. +DecalSupportLibraries.reg + This is an example .reg file that shows you the kind of registration + settings the framework will set for you. You can use this as a .reg + file to go along with your application. +DecalSupportLibraries.idl + This file contains the Interface Description Language source code for the + type library of your application. + +///////////////////////////////////////////////////////////////////////////// + +The application wizard creates one dialog class and automation proxy class: +DecalSupportLibrariesDlg.h, DecalSupportLibrariesDlg.cpp - the dialog + These files contain your CDecalSupportLibrariesDlg class. This class defines + the behavior of your application's main dialog. The dialog's template is + in DecalSupportLibraries.rc, which can be edited in Microsoft Visual C++. +DlgProxy.h, DlgProxy.cpp - the automation object + These files contain your CDecalSupportLibrariesDlgAutoProxy class. This class + is called the Automation proxy class for your dialog, because it + takes care of exposing the Automation methods and properties that + Automation controllers can use to access your dialog. These methods + and properties are not exposed from the dialog class directly, because + in the case of a modal dialog-based MFC application it is cleaner and + easier to keep the Automation object separate from the user interface. +///////////////////////////////////////////////////////////////////////////// + +Other Features: + +ActiveX Controls + The application includes support to use ActiveX controls. +///////////////////////////////////////////////////////////////////////////// + +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named DecalSupportLibraries.pch and a precompiled types file named StdAfx.obj. + +Resource.h + This is the standard header file, which defines new resource IDs. + Microsoft Visual C++ reads and updates this file. + +DecalSupportLibraries.manifest + Application manifest files are used by Windows XP to describe an applications + dependency on specific versions of Side-by-Side assemblies. The loader uses this + information to load the appropriate assembly from the assembly cache or private + from the application. The Application manifest maybe included for redistribution + as an external .manifest file that is installed in the same folder as the application + executable or it may be included in the executable in the form of a resource. +///////////////////////////////////////////////////////////////////////////// + +Other notes: + +The application wizard uses "TODO:" to indicate parts of the source code you +should add to or customize. + +If your application uses MFC in a shared DLL, and your application is in a +language other than the operating system's current language, you will need +to copy the corresponding localized resources MFC70XXX.DLL from the Microsoft +Visual C++ CD-ROM under the Win\System directory to your computer's system or +system32 directory, and rename it to be MFCLOC.DLL. ("XXX" stands for the +language abbreviation. For example, MFC70DEU.DLL contains resources +translated to German.) If you don't do this, some of the UI elements of +your application will remain in the language of the operating system. + +///////////////////////////////////////////////////////////////////////////// diff --git a/Native/DecalSupportLibraries/Attic/Resource.h b/Native/DecalSupportLibraries/Attic/Resource.h new file mode 100644 index 0000000..0114696 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/Resource.h @@ -0,0 +1,23 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by DecalSupportLibraries.RC +// +#define IDR_MAINFRAME 128 +#define IDM_ABOUTBOX 0x0010 +#define IDD_ABOUTBOX 100 +#define IDP_OLE_INIT_FAILED 100 +#define IDS_ABOUTBOX 101 +#define IDD_DECALSUPPORTLIBRARIES_DIALOG 102 +#define IDR_MANIFEST CREATEPROCESS_MANIFEST_RESOURCE_ID + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS + +#define _APS_NEXT_RESOURCE_VALUE 129 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 32771 +#endif +#endif diff --git a/Native/DecalSupportLibraries/Attic/stdafx.cpp b/Native/DecalSupportLibraries/Attic/stdafx.cpp new file mode 100644 index 0000000..cd33fea --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/stdafx.cpp @@ -0,0 +1,7 @@ +// stdafx.cpp : source file that includes just the standard includes +// DecalSupportLibraries.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + + diff --git a/Native/DecalSupportLibraries/Attic/stdafx.h b/Native/DecalSupportLibraries/Attic/stdafx.h new file mode 100644 index 0000000..ff644d4 --- /dev/null +++ b/Native/DecalSupportLibraries/Attic/stdafx.h @@ -0,0 +1,53 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#pragma once + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + +// Modify the following defines if you have to target a platform prior to the ones specified below. +// Refer to MSDN for the latest info on corresponding values for different platforms. +#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later. +#define WINVER 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. +#endif + +#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later. +#define _WIN32_WINNT 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. +#endif + +#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. +#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. +#endif + +#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later. +#define _WIN32_IE 0x0400 // Change this to the appropriate value to target IE 5.0 or later. +#endif + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit + +// turns off MFC's hiding of some common and often safely ignored warning messages +#define _AFX_ALL_WARNINGS + +#include // MFC core and standard components +#include // MFC extensions +#include // MFC Automation classes + +#include // MFC support for Internet Explorer 4 Common Controls +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + +// This macro is the same as IMPLEMENT_OLECREATE, except it passes TRUE +// for the bMultiInstance parameter to the COleObjectFactory constructor. +// We want a separate instance of this application to be launched for +// each automation proxy object requested by automation controllers. +#ifndef IMPLEMENT_OLECREATE2 +#define IMPLEMENT_OLECREATE2(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \ + RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \ + const AFX_DATADEF GUID class_name::guid = \ + { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; +#endif // IMPLEMENT_OLECREATE2 diff --git a/Native/DecalSupportLibraries/DSLSetup/Attic/DSLSetup.vdproj b/Native/DecalSupportLibraries/DSLSetup/Attic/DSLSetup.vdproj new file mode 100644 index 0000000..a5498a6 --- /dev/null +++ b/Native/DecalSupportLibraries/DSLSetup/Attic/DSLSetup.vdproj @@ -0,0 +1,799 @@ +"DeployProject" +{ +"VSVersion" = "3:700" +"ProjectType" = "8:{5443560c-dbb4-11d2-8724-00a0c9a8b90c}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:DSLSetup" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_42D5FF05AE1E4B97A2C1ED6BEBECE84C" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:VC_User_CRT.BA9B6D09_0DE0_11D5_A548_0090278A1BB8" + } + "Entry" + { + "MsmKey" = "8:_42D5FF05AE1E4B97A2C1ED6BEBECE84C" + "OwnerKey" = "8:_7DA4A71F64B2445E89E9400659E428B3" + "MsmSig" = "8:VC_User_CRT.BA9B6D09_0DE0_11D5_A548_0090278A1BB8" + } + "Entry" + { + "MsmKey" = "8:_47564ED156C34AE799935495C7305D36" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:VC_User_MFC.BA9B6D6E_0DE0_11D5_A548_0090278A1BB8" + } + "Entry" + { + "MsmKey" = "8:_47564ED156C34AE799935495C7305D36" + "OwnerKey" = "8:_7DA4A71F64B2445E89E9400659E428B3" + "MsmSig" = "8:VC_User_MFC.BA9B6D6E_0DE0_11D5_A548_0090278A1BB8" + } + "Entry" + { + "MsmKey" = "8:_7DA4A71F64B2445E89E9400659E428B3" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:C:\\DOCUMENTS AND SETTINGS\\JOHN\\MY DOCUMENTS\\MYPROJECTS\\DECALSUPPORTLIBRARIES\\DEBUG\\DECALSUPPORTLIBRARIES.EXE" + } + "Entry" + { + "MsmKey" = "8:_93B4D2495A4A4A5F80751EAFD5B53DE0" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:VC_User_ATL.BA9B6DD3_0DE0_11D5_A548_0090278A1BB8" + } + "Entry" + { + "MsmKey" = "8:_C64C6FF01F864BADA89FFE8B5C056FAB" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:VC_User_STL.BA9B76E9_0DE0_11D5_A548_0090278A1BB8" + } + "Entry" + { + "MsmKey" = "8:_C64C6FF01F864BADA89FFE8B5C056FAB" + "OwnerKey" = "8:_7DA4A71F64B2445E89E9400659E428B3" + "MsmSig" = "8:VC_User_STL.BA9B76E9_0DE0_11D5_A548_0090278A1BB8" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\DSLSetup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\DSLSetup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "Feature" + { + } + "File" + { + } + "FileType" + { + } + "Folder" + { + "{777C097F-0ED8-11D3-8D6C-00A0C9CFCEE6}:_13100C8A909B432AA2396FDDE8D5C75B" + { + "Name" = "8:#1914" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:SystemFolder" + "Folders" + { + } + } + "{EE62640D-12F2-11D3-8D6C-00A0C9CFCEE6}:_4A04CBCDF5074610AC31E64A5B766C8E" + { + "DefaultLocation" = "8:[ProgramFilesFolder]Decal" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "Shortcut" + { + } + "Sequences" + { + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{7DF0CD0A-FF27-11D2-8D6B-00A0C9CFCEE6}:_2A4905977C6A4A9A850BA928ECC52C23" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{7DF0CD0A-FF27-11D2-8D6B-00A0C9CFCEE6}:_81FA24843D5845628CFC66160B04F6C9" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{7DF0CD0A-FF27-11D2-8D6B-00A0C9CFCEE6}:_3D5EBE5D1DF343FABD4A43584DED4154" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{7DF0CD0A-FF27-11D2-8D6B-00A0C9CFCEE6}:_AB09CDDA22634C0BA176D6A3731CD7C3" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "ProjectOutput" + { + "{B1E2BB22-187D-11D3-8E02-00C04F6837D0}:_7DA4A71F64B2445E89E9400659E428B3" + { + "SourcePath" = "8:..\\Release\\DecalSupportLibraries.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_4A04CBCDF5074610AC31E64A5B766C8E" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectCanonicalName" = "8:DecalSupportLibraries.vcproj" + "OutputProjectGuid" = "8:{360B2C0C-FF38-4582-83DC-9BCE1EA2D6D8}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:Decal Support Libraries" + "ProductCode" = "8:{F3C02240-56F8-44B6-AFD7-5671A6A51757}" + "PackageCode" = "8:{36FEA07A-84B6-4C0F-AF47-A2AFCF86530C}" + "UpgradeCode" = "8:{6E5CFD21-C666-4D69-914C-5B86388C0159}" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" + "DetectNewerInstalledVersion" = "11:TRUE" + "ProductVersion" = "8:1.0.1" + "Manufacturer" = "8:Decal" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:" + "Title" = "8:Install Decal Support Libraries" + "Subject" = "8:" + "ARPCONTACT" = "8:DecalDevs" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:" + "ARPURLINFOABOUT" = "8:http://decaldev.sf.net" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + } + "MergeModule" + { + "{AC8774A4-3E09-11D3-8E14-00C04F6837D0}:_42D5FF05AE1E4B97A2C1ED6BEBECE84C" + { + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:C:\\Program Files\\Common Files\\Merge Modules\\VC_CRT.msm" + "ModuleSignature" = "8:VC_User_CRT.BA9B6D09_0DE0_11D5_A548_0090278A1BB8" + "Properties" + { + "DIR_RETARGET_TARGETDIR" + { + "Name" = "8:DIR_RETARGET_TARGETDIR" + "DisplayName" = "8:Module Retargetable Folder" + "Description" = "8:" + "Type" = "3:10" + "ContextData" = "8:IsolationDir" + "Attributes" = "3:6" + "Setting" = "3:2" + "Value" = "8:_13100C8A909B432AA2396FDDE8D5C75B" + "UsePlugInResources" = "11:FALSE" + } + } + "LanguageId" = "3:0" + "Exclude" = "11:FALSE" + "Folder" = "8:" + "Feature" = "8:" + "IsolateTo" = "8:" + } + "{AC8774A4-3E09-11D3-8E14-00C04F6837D0}:_47564ED156C34AE799935495C7305D36" + { + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:C:\\Program Files\\Common Files\\Merge Modules\\VC_MFC.msm" + "ModuleSignature" = "8:VC_User_MFC.BA9B6D6E_0DE0_11D5_A548_0090278A1BB8" + "Properties" + { + "DIR_RETARGET_TARGETDIR" + { + "Name" = "8:DIR_RETARGET_TARGETDIR" + "DisplayName" = "8:Module Retargetable Folder" + "Description" = "8:" + "Type" = "3:10" + "ContextData" = "8:IsolationDir" + "Attributes" = "3:6" + "Setting" = "3:2" + "Value" = "8:_13100C8A909B432AA2396FDDE8D5C75B" + "UsePlugInResources" = "11:FALSE" + } + } + "LanguageId" = "3:0" + "Exclude" = "11:FALSE" + "Folder" = "8:" + "Feature" = "8:" + "IsolateTo" = "8:" + } + "{AC8774A4-3E09-11D3-8E14-00C04F6837D0}:_93B4D2495A4A4A5F80751EAFD5B53DE0" + { + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:C:\\Program Files\\Common Files\\Merge Modules\\VC_atl70.msm" + "ModuleSignature" = "8:VC_User_ATL.BA9B6DD3_0DE0_11D5_A548_0090278A1BB8" + "Properties" + { + "DIR_RETARGET_TARGETDIR" + { + "Name" = "8:DIR_RETARGET_TARGETDIR" + "DisplayName" = "8:Module Retargetable Folder" + "Description" = "8:" + "Type" = "3:10" + "ContextData" = "8:IsolationDir" + "Attributes" = "3:6" + "Setting" = "3:2" + "Value" = "8:_13100C8A909B432AA2396FDDE8D5C75B" + "UsePlugInResources" = "11:FALSE" + } + } + "LanguageId" = "3:0" + "Exclude" = "11:FALSE" + "Folder" = "8:" + "Feature" = "8:" + "IsolateTo" = "8:" + } + "{AC8774A4-3E09-11D3-8E14-00C04F6837D0}:_C64C6FF01F864BADA89FFE8B5C056FAB" + { + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:C:\\Program Files\\Common Files\\Merge Modules\\VC_STL.msm" + "ModuleSignature" = "8:VC_User_STL.BA9B76E9_0DE0_11D5_A548_0090278A1BB8" + "Properties" + { + "DIR_RETARGET_TARGETDIR" + { + "Name" = "8:DIR_RETARGET_TARGETDIR" + "DisplayName" = "8:Module Retargetable Folder" + "Description" = "8:" + "Type" = "3:10" + "ContextData" = "8:IsolationDir" + "Attributes" = "3:6" + "Setting" = "3:2" + "Value" = "8:_13100C8A909B432AA2396FDDE8D5C75B" + "UsePlugInResources" = "11:FALSE" + } + } + "LanguageId" = "3:0" + "Exclude" = "11:FALSE" + "Folder" = "8:" + "Feature" = "8:" + "IsolateTo" = "8:" + } + } + "UserInterface" + { + "{7DFFC192-4ABE-11D3-8D78-00A0C9CFCEE6}:_2269732C60624C2CB8D5964130FE964E" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_2744A39837D94568A5B4BB0CB04F4DC5" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "ModuleSignature" = "8:VsdDialogs.EE9A1AFA_41DD_4514_B727_DF0ACA1D7389" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{7DFFC192-4ABE-11D3-8D78-00A0C9CFCEE6}:_2AB94671354B4B54B92649390DB71A80" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_0FB6E69598B248049BC2918171EC15B1" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "ModuleSignature" = "8:VsdDialogs.6DBC9783_3677_4D68_8BF5_D749558A0AC1" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_97D21D7FA0CC4633B3A59CE91385650F" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "ModuleSignature" = "8:VsdDialogs.C113BC36_2532_4D45_8099_4818B1133B2F" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_D1C4E7CAC18840C2B899A363518DBDCF" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "ModuleSignature" = "8:VsdDialogs.68F69290_BB7C_474E_A153_6679845F3DDF" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{7DFFC192-4ABE-11D3-8D78-00A0C9CFCEE6}:_371ADE88DFF04424A6C23FCCF18FB1B9" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_193C4631B4414DAF957A656FB4850F8E" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "ModuleSignature" = "8:VsdDialogs.2DED2424_5429_4616_A1AD_4D62837C2ADA" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_B363F8DAD34C40F787C39353F3325CA7" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "ModuleSignature" = "8:VsdDialogs.E35A0E2C_F131_4B57_B946_59A1A2A8F45F" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_FA13848DFB6741FF9F5C1508F8CF8C3F" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "ModuleSignature" = "8:VsdDialogs.FA58E60A_A1E8_4876_95FC_2AC3B5AAA5F8" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{7DFFC192-4ABE-11D3-8D78-00A0C9CFCEE6}:_691ED02423E24A759B7B604B9CC93354" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_6BA78C0AFAF04EB3AE534DD09CE2C047" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "ModuleSignature" = "8:VsdDialogs.83D22742_1B79_46f6_9A99_DF0F2BD4C077" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{7DFFC192-4ABE-11D3-8D78-00A0C9CFCEE6}:_C0BFAB6F351C4573A2A3A510C7AABF59" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_38C4C3FEC08A4C95A6C1468EB7F8C531" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "ModuleSignature" = "8:VsdDialogs.4FB12620_0D15_42D0_8677_2766FFA6923F" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{E4ECAB26-4AB7-11D3-8D78-00A0C9CFCEE6}:_D8BB020279BA432D966BBE81E4CA6F73" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + "ModuleSignature" = "8:VsdDialogs.CE4B864F_F1C1_4B85_98D4_2A2BF5FFB12B" + } + "{E4ECAB26-4AB7-11D3-8D78-00A0C9CFCEE6}:_EDE8A9C6957147348D588707FAECE50C" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + "ModuleSignature" = "8:VsdUserInterface.524F4245_5254_5341_4C45_534153783400" + } + "{7DFFC192-4ABE-11D3-8D78-00A0C9CFCEE6}:_F581651EBBAF4B34B9E30B8B6BF27846" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{E4ECAB24-4AB7-11D3-8D78-00A0C9CFCEE6}:_B4F438F39A7B4B1E8696EBFA316168E9" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "ModuleSignature" = "8:VsdDialogs.1DB77F5A_BA5C_4470_89B6_0B0EC07E3A10" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + } +} diff --git a/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.ico b/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a84ca3d34597ada57e4c79ef62b28cf07b5ed9a GIT binary patch literal 21630 zcmeHv2V7N0+WxDFG5L~RW2&1XG0AQcqhg7@#)>^Q6a+;<1hFAlu+c$4ii*+|l&Ul- zQbg%pk={WR0YwD_E?oNe%sKa75z*}WCHvp~{rFMz& z91+A%k78nCkkP|=>gi!2&LN0s4;38j*Oe8VkT_G}^I%y)kG0sD_6n922!+C-!*CD^ zP4OEFHw-~eey9{z1oHYUeW;2_V1o(+3RUR1Jwc~-QK{(n-Q!(a_OedLke z3(uSDm)vh3{llR0`Terszk>g{eMCll$(}5o)BmFVMHTj9eWCJ2&Qu)e>1i!{ReLBq z#2Nv2;9CP1JXXdx6kYDdxC2W!ErVkLUDPf@ znEWwO5}(dQhYn-%FQzlq|DrrIQh)ln^nUceQXZK4!!wk%@_z6S{e$F1_I%L}%s#w5 zUrc{){}8z4O?uGQ{y#!a~WfCW8C@+ZfmCq>>OX{)S2z}mv+c}2e z9!ylh&O?YA*jb85$j-CTw<1A`^|AjcX8@bc@N^RCvU4|nIJ0r)8~o8Tjf!`k_W_Ek?$+2`+vaE~-SP#X|lm;(O=2uvY)>i(!`Z#pjmvAJ~wim~2DF;+V%#&SE|G+aTcXSPz7lR5=yPo&`elPLYv21+<7OC^CO zRC_Cc;`Js{y47MT^4v|uUVG@lbsMURaiFHsc#7AbM9C)8D9vIfrC9t*&k7?c{p3t4 z^V>>OrcyVMYykLDbn)Lun@`Q-<9_sti9u_1WGetj(kLx>AZg{wbxH|3D=^ zid1*Ul?3JCB&fJa#qLX}Dc_Bn3cabh*pHe@0;#zygar5FsHHlcirl2B{GK1U5Xj?|cUff@@u=t;sZdYW>W>e3DAQPc{09HU4NBc{<}2O=3vN@nQ1O*0P< zqPhFOreE=!dtf+C+W8rc-TVbDK0k)$>W!iK1`}wZ;S}0pBu86~<#Cp$#m2Kp!E+_8 zvs*%o-DZ-qzZ@wztfOTni)f3pB5l8*Oq!Q>(T;1|XkWx`(z$+s45D>ux2p!NGFwUO zEo8|!){u?{947NPGqQ=ZCgUI@vP`g|)5*4UCgm*Ir#X^Sx(l64bs(o(=gIlj1#-)9 zC*Qn4x?XydqRZpRJ=2E*^F!!baU><*Powk)85Dark; zp4f$Z>L9!HE^^N3qVy`vkskL@Rbvl*Z%|3nmaUX{ubcj^olid>%AxP{1oS=oY30+j zBRS-m)ML^_u5X%PAw#7 zo=>|jwvwiYkTl&}>3|RLT@li*vjwCV&_=rcLNW>xl4(dAod|6s%kVZzEqF=?91FqJY(sF5`#X60&TEB@DjwFzlMG8&Z@r-`m+elW{r)jMGGg3bq zMLUi~(THimBsIz%zf1Jh*Jt{F;QOSuzJcS1mluw$FT_LQ;d!EeD~^A;<5^^wSbmc|?;ONVWy^SJskw7!z)hY! zdEB^hqehJy*-PHk%+lP-+Tyg$sk63c>>MxbhWzl=3m3^OnKyswvSl-8&6+ahXR*AR z!X~2=W|qe^HT6UVE^Snjmi~6t>b2j0_2rjeeDT>hR^aFHB0M`3HW{FRma?*r=n9t< zl*UVcyK>d=&p+ba_kTx$kz#pug-!Y>z~rqhPBKWB6mY-au2?x_@Q_K9MvnaOosR+O z$LI2j$Mp@3_CX%^zzXp4>sLU2;aZu+BY*xG_wZvc{6|p$@>=YsQNT?B_#x82?%UzRrKH{$_ayZfFFLxq zTsVI|*5A(`F2EmW_UG@1<6G|!{opU}z4up%cx!9@MMthcjQ>p!4^K}|56-O!8JDJhZSy|Vkq9T3#-u?sy{^td8u7InnON@VQTKcWh zvT{}cC6lwGz5L$(^pp4B?<0-^%t5{)EnP6MnO#9Zf~@3dFaNhb{p6FE#Q9rK@OxB| zmL?b|C=)c@Ve;2~z5Ji?PnFm>z0WcJkIL^>K)#d&8IX_8^7Zj+e6@Un|D%%f3c&zD z=|I7K6pN1b_40d-e#n=mmJ6tb`IZ5K%;=EU;(>foX{vx|;D7-G2U2rp=I_Y+)fE<% z3I@`^oE*H3H)q@lzU==R{4xG@`GrMHe|{ki#64#O`@GgZ0d;u=h0Oz71O@qm782af zh`91Q@;Q0=Fih&*3RVqCwi^uP2PEH=|S%LzPzm@cQ`2>H+=QIhLV5Pe_rQZs_ z@>>1=PamKF?xCop43N^(!(NZyui??7+S=L&52~uFs;g@rKFkXYcuoDr_{GJ?!N)Tf zhfsW+f52<(pNQu#fIWkF5d8wUqyLR3y<23T@Z)>lQBl_;qkThygTk*}yLvS=@pa;@ ztxuv}C=ie3_I`x* zpqT%}GuEd#TvDR-s@bCTDqYcf71n{UEQA>~_BwEW3+MkA>sGVbbuq!$WoH1wB%iHQ zv57tlV=~Xq%=KNj`se1UyMI$7BlSbnQ1g(ou3e+-urP``Ys<}76FptYPwxQ5Ua+G; zV;zb)Yfc{fRmpqn5=wHhqC{s)vRgThyte#G&f8a#m(ncEQ|D8N(N2nUFd}c2ndGj% znBuJVQp!au$`A7-AC)O|No@h?AU zT(ucM%!b$U4i-O&fAA(3AKbRCmjm3SGa(ymT4nq!Vbf)@WLEifG;m zqPeF0{B-UC%t?FAP3K#DPLp?iMiaITBN^+zbMw?CHe+bH%|x1Y@Ml_V{R_?4A5XuX znn?={rgC%BC77SC^;tx!0UK$#(E{2MEJxd~ZlXQG+eyh;o>W6O)4uSXq~fAPI$_$R z8*!NSM{1Jh#oc5SrH?t10qI2_=jN*?Zkmv7k}X*#T9JK<1G%KJdFgpNm&VUgozlDVwvhIch;|5tTeCBj4PsbnC$#iY$nxM@^6EXsi{T zO1ng+Hs<7*=|`@GVdPsLPZ5wQc=muQ1y3vV{-NOB6+6^G+E1xrf8ef#QkSz zLtqDO3hg8n%sD5>AEuzv9!hxd;v99#`8JyE)=rB(+G)*|c2WrHq^rzUpp=KC~181{n()Jvhzb}`T9>}8=hjMA1ekobH=h3aaM>J(q z0zYq^8p6$4zy866o3~!Sev|dSFSyRmuHLRsth2Mz)!f_y-hv&?yN2>Jt&ct$I`pHz zc6A|NQU1AGFFShNXt5hNdN9jZ*nZBz(b37t+4;hSU9#iH{3wsP!34xHORe+qCb#8ZqK$Ow2^(w;3DhD(|sk0?3~*^^=dk`SRlrzn>|}SKOv= zd_;MVB@@t)ojhUAd!H{_^21kSq5mCr{Y~4B>mO3ybNVC%kUs_aD;F(UI)D1eaU4EH zm1D;bDsNFz(zCK=`3sTH35*=al~+*FIkrz(?TGG)lUB%Ifc)hvRxVn+RGKfZuyw!A zKII*Hre>#4YRJxBu;9HfR<9oO-L%EhJpPSawfFB(;JawQAMs z)hnj*jyMc)(D09H~d~MUzJo^_E`8N`+-oHcf;?|OV@vtoQe5Q#l7tE zySY*Ql&_9u6RO)88F%3N!PgWK85tCG_3G8Yz<_}8rWb6(MQUTBqZ6-$UAqx_J+t=Z z?9R^Sn7HVh5D3lcHyZ*8@dfGKsk=9D933PHQ!ICloLNu3f8?Jr`X~><0fUEn?hN3Gf;juJ&ZTy z-Xj{aFJQg?O-Y<5YK^yE>Vm*2-sfKLA7-K`q&YS5B&S!4ekWH{99l3FcOk$15 zHO-YA(w)g8)0;A?GAW|u1{t0+rrQXYJ}IZ*yhyUfcfnwEuc1ozLv1$a1XpKIx$`Hm&pz;}#mTHwx>nHIz`)NTYT{ z(Rh6UjmOyd3w~2EK2A4np_v#XXJdSwW6??{u_n9M@H~0NJ>teiHXdqY3_OmtTQ=Uw zo^Bz9vn{0R+)6sm1!U-1MS&>|wDkCWQae*glQfD+Mmvv`PL$Fn!#vt{B9GK9@=1C_ z5_yLflUHaFdHeX%_tOJt#Q00}Eq=qtky8(#L0#svXdKzy!Uy- zkd=!XhDeVSN_BSri0U7UpAvopXc&(FeeN5n@0kCF^L&^)jzEgkcR2C^CeSMv;q5BQ zq7;ctA3c1LJ_Qlwe7}~$L=Jn5*kZ)2jyn!VRGh-X5a>4-ApQ1C!2awj{3Jddo436L zo`?C{>;nnAn2YUb@j1@hvCU9E$^tKXr0|}lb436W8@}+^>g5A0%y~(aPvN5yF+O0o zb2T8nghvj_u^+o7%4BPl2{tR?w?|v3MW0lUw%UOW>sXtev8Q&$p57a0yC=?eUxJ-h zg8h!Tv)HDE-S`V(tGX`ZLVc!NeU^KDmREiD<@#Lz`rLr}yrBC0;D&;*#-hl^qNt{l zn5NRWrt+k!C>ubs-?gS+Jh*G@4P)E&;vG+qOdr3zt5*v`!-}upD2s``n~+kOj@{Pm zn!J20)jqvjQD0fp_$aZq1jDezKETtEa3bvZ2e*f7?7OHld#o|rX{gYL$=+s9OtI|i=`pPU;xBeX~bCVim}!NDQjD`(zL;`htBxI{+lBMC;SZXF*i}7(i0Lpz51RZLX zXCJ)df)>Fb#hJlMN=_RA242B#jrq+J*0GkS;!c6vAhOc^RO`YB^g_Mc^V8&mb*aZ; z8B`6!lYI`5n3W2>um}e$HJ616?nSrUk87z)c?}-0J8-A4&ygq{gBU%d7+A?n(Lt8S z!yjQQEWR--6-P#L6=zux#@h$Y049Qco+R!CB-9sZJ2--v!b57zdkzWg7QsDq0&%Zt zKYafTJO{69AHAW&TS>uj9gqOVVw0I@OWRzws9#j^%?;oo!AchSp&XvCCGF=)f(9T- z>Z|^?86eeXoomQuRzk(0Ej5)~6_kewDsF(@gM$4&@92NNyoMOhXb^K4qzsXj#E^Wkc-mYZ z2K%6teShP{R*YX1r>RHl(hTdEm8|bxJy030TN87#G2b1{8{DJU)EC2p@$2v)^=ryIucUyp9AejF`tJ8v}Ko}VP`uj3$r z<-|aa9qqGiA=ph#1@6tozOS>7XuNn^IaonGRC#9@gS5tOA&+OG`sZlLyq~o5Q&qRk ze8uT!`f&9n8sE{LA6}PvbYoS5*&JWBDJLhgCJh+8M>I-zRn`R!)(PZYfR*rky{i52 z;|1D}QjqM{;EigbTQ#n!%Db(Yr!PHEZ`=a?2@CWmEi{eBS<(oH0g`2NR!XFu;7{P+(0 z%rzW8-{_YGMpG9WPm?j3En_lgspCuCNfSOVtQYO|H=%-6_TtXprfUhbs)a;r_e zefa(dG`hkIBMMzd7G0cFba8sorFq33ON%{!EB0Dn;w@itS*hf*a*6MbGQZtr{+eZh z2eTcNP+zZkzR;whpB=dX?j0Us{>TR;VM&y4&(Mta6R$s!9mPJ55AcbSqgV!1!dH!_ z$4~05wVbuXOJ3D${Wee8Egox>JXR^XuatLRChxu!e75Na)o1SCBJnf!EAe3jrmAez zRM*(Qd$%^{`2dbAu=k+OKC_!fOQKCy#9ORQv|OKjN+I>k=Ja#QcO2DnTz1}e+-;*Q zi|Ih0_f8JQU|xn) z_^c|k?r!X(eBgoFb;p|=V%l93J1!-+U%u55aHk_AyDKuk`(|NxVp(@ec{jFCa;v*b z9{1dP+FjkylUmyY;vov|`%TG7b-CM~jXb1aGd&*C?}B+5QbEH5K;rDvy83A2*_-Y5 z3{ty(K$~$;8}?TKDI&iMCxM>u=WGZ3i3p9Un>T83Hi?ML%cDBKFd+-0E<- z!|dP&u-8-$r@m43_KmXx) zP+zbQ*yx)bTETsXmA;)B0!ZIX4dI(N4{5}-5P(6V6GpM*j&o_i!}{kxyuP^hES#eL zO#W;OgXGLvN!*r>_~MBZ8U?fA)he?6)b%!uxz2IzXOcVEcwyT*@lSc)g=059Td3P4 zquaF1uxXV^^BU7;ISau?OTlJq!Io2kZD(54&I-Wx-{aJx>D;paLJJ!I7zg&|Ht~-h zzqseC6<;~Pf2Z3F>Iggwb4Na%i#GF#qFhLF?~s3ZeN8!-iQD9r^KY$q{E>nq?~%nv zdx>%Hw4BTaRq&SnV24jE9tnDQf3KkjyNI`{yA$tsN0jvh7x#GOcH=vfbGN!IledU!}669JNDcqbtJd0==@ zJfsJWJ%ChR&mg5$@mA{QAa%QDGb{0s{%kN3NXC~654jY&51fStQpSRkJPg^0v%i)%K{+%`Bt&%R!TV?;;;=hZx`g{A7 zefIfY6}3Nm=2cmJ(wViy4qu4OT{dU#a?T?l@yqATTmCCc=Te~Ipu*|{3abw)u0eqF zYY=5Ad?L~n*J#VF8aG-R!eaGop^&Y%h&SXA=DlR)h0g_(lwS|xSIzh^JBl~$_|?WB z?MbT_EaNyBbC5VQ*=f(R^$y;S$_k zWERvGLqG6mJ1j4`qH!-olkFI(%5eLCfnX=cTWW%Tj6Jr8$?n*%ec3)sZN?kN8i8MX zJVFQfp&#FSh7^TkaUYk!#+6wA(h{G|6+t^W{R`PHW1%-zs6iqU+>gbEP)*_m)cDKx zSz%WtBeRek9mcN9^J`M{@FDq6AZiRktm3i2rYshhGD)ebC z2@u?k6x@rgNpM0d>Z2d^yV&Yykcahd9@`hP1Ns-}Pc*!)XLiE`8qPo$d zuH*)QYb@43tH@(5CL00xyqisO}Bf02FcW)@wXQFd7d3*zV3{sQhfDCl6Mdu^Fr8Lo%w zuDW5~ul|LWUu+55uswA1_CQ5^T|8fZ!hHQ-78y)gWH8Mv+7#dSitwMCjBlGCMakR? zSPoJembtxEru%H0{UGuHc;u*y>YL`Ue_#6?7(VaBC+q!Xwg$_A`n5M)gVja!F~ewm z%S5({ja79#UugdzyMudP6F&Y?)S}1HvX5gnKZ)P@G)Wu#F?H#t^;x!6*9~5_Kk9d( z4I`(6qb~7t#bG{u(P_qDLs`k1F9Oe(eZ@1f)yP6aPLb!j< zHRsz`PNiN1$s646$=c>%db16ttF0`TgL3}w7?_iYTW|e=<<3V~9 zJi2j-az21dfJhFHRY-UxyCiVA*Z8)t_3v08*dZ6#u`#G)Q%L9LkWS@moyuXIsu7)v zVV!shKCpg=$Np`B#)t7eLz1T(F7dMR-j~2yC-ke>r{E19OL*rK+C5S_{4+Yk^SZIL z0dhFj$ck%wD(ica9`->0-sK8T+gExY-syd8U##aVl}j#x8-Z8Qy$b!@l3d%Q&B>VE zf!1vu(PkRVRy0OT4Joeej;&()H_Y93T6x2jquRK{tC07x6`~;7LBB}|TlJf&5Q7DX z=^8m$iBNZG!Ab-!fxC#h*MnIB=CuF3TFHf=A9EYMK%sGnaK)iKOrggsXG61!gJAd% z=W#nQRB$Q7KYR85H_#6vJn&-8vlTP>FS)h6 zfIFR+a=I}+nXg{)NTJV*`HW#)wgwG>T-B@A79cg*C zI>vV30}iy$H^a}`k43ArZu3|@!32H5FNT7NhJwk)f+;3~=_gudoM@SOLNLRkh1o~$ z$Q!gD8=s>>Dq=bRwlU!f3|v}W#sn; z`thK-hF9QIm6AG)h0AyBPq6djTci-%ugY-#4!~AC&f>+z61? zN2y;2ZC&gGXB-Zc-W!FF1Mt0JW{7*Nmn+}caP+zC2jV$6=vc;8GAqMJS%#j~S5u#X z;eJ3?EznG_l6`62*G)4OfS!(?ZL&r&xa6Rk<7>3ZGnS^MB=r^L;^4f4x{mP(1a$Ph zpr>yM?U?dvd2r=7o)vukt^G3H`{1i98svd}{~G<^*RMMz7_&YJg!x5UxuC@3E4kO` z2S*=8(8WzP5ukIMW6>gQ)2g9mR$pJ&FMjay;|rhRkq6Nqe1FjXwJ&7fuW9U8m`?ZhE7K3@6XL8T4GIvj}FO52Q1{xM5=gTKAl7Z&c?^QReG~waN6RA!JD)i20JWl V7_3;)FxY%t!w{8u!r68W{|isv(C`2N literal 0 HcmV?d00001 diff --git a/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.manifest b/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.manifest new file mode 100644 index 0000000..7b216ab --- /dev/null +++ b/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.manifest @@ -0,0 +1,22 @@ + + + +Your app description here + + + + + + diff --git a/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.rc2 b/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.rc2 new file mode 100644 index 0000000..8b33ecf --- /dev/null +++ b/Native/DecalSupportLibraries/res/Attic/DecalSupportLibraries.rc2 @@ -0,0 +1,13 @@ +// +// DecalSupportLibraries.RC2 - resources Microsoft Visual C++ does not edit directly +// + +#ifdef APSTUDIO_INVOKED +#error this file is not editable by Microsoft Visual C++ +#endif //APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// Add manually edited resources here... + +///////////////////////////////////////////////////////////////////////////// diff --git a/Native/DenAgent/AddRemoveDlg.cpp b/Native/DenAgent/AddRemoveDlg.cpp new file mode 100644 index 0000000..c4263a6 --- /dev/null +++ b/Native/DenAgent/AddRemoveDlg.cpp @@ -0,0 +1,687 @@ +// AddRemoveDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "AddRemoveDlg.h" + +#include "DownloadDlg.h" +#include "..\Inject\Inject.h" +#include "..\Inject\Inject_i.c" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// cAddRemoveDlg dialog + + +cAddRemoveDlg::cAddRemoveDlg(CWnd* pParent /*=NULL*/) + : CDialog(cAddRemoveDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(cAddRemoveDlg) + //}}AFX_DATA_INIT +} + + +void cAddRemoveDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(cAddRemoveDlg) + DDX_Control(pDX, IDC_PLUGINS, m_wndPlugins); + //}}AFX_DATA_MAP +} + +void cAddRemoveDlg::convertVersion( LPTSTR szVersion, DWORD &dwVersionMajor, DWORD &dwVersionMinor ) +{ + int wVersionParts[ 4 ], + *i_ver = wVersionParts; + + for( TCHAR *szVersionPart = ::_tcstok( szVersion, _T( "." ) ); szVersionPart != NULL; szVersionPart = ::_tcstok( NULL, _T( "." ) ), ++ i_ver ) + ::_stscanf( szVersionPart, _T( "%i" ), i_ver ); + + dwVersionMajor = MAKELONG( wVersionParts[ 1 ], wVersionParts[ 0 ] ); + dwVersionMinor = MAKELONG( wVersionParts[ 3 ], wVersionParts[ 2 ] ); +} + +void cAddRemoveDlg::loadListing() +{ + USES_CONVERSION; + + // Clear old data + m_wndPlugins.SetRedraw( FALSE ); + m_wndPlugins.DeleteAllItems(); + m_plugins.clear(); + + if (m_pDoc->load("decalplugins.xml") == VARIANT_FALSE) + return; + + MSXML::IXMLDOMNodeListPtr pPlugins = m_pDoc->selectNodes( _T( "/decal/plugin" ) ); + for( MSXML::IXMLDOMElementPtr pPlugin = pPlugins->nextNode(); pPlugin.GetInterfacePtr() != NULL; pPlugin = pPlugins->nextNode() ) + { + _variant_t vClsid = pPlugin->getAttribute( _T( "clsid" ) ), + vCodebase = pPlugin->getAttribute( _T( "codebase" ) ), + vVersion = pPlugin->getAttribute( _T( "version" ) ), + vName = pPlugin->getAttribute( _T( "name" ) ); + + cPlugin p; + ::CLSIDFromString( vClsid.bstrVal, &p.m_clsid ); + convertVersion( OLE2T( vVersion.bstrVal ), p.m_dwMajor, p.m_dwMinor ); + ::wcscpy( p.m_szURL, OLE2W( vCodebase.bstrVal ) ); + + CString csurl(p.m_szURL); + if((-1!=csurl.Find(".exe", 0)) || (-1!=csurl.Find(".msi", 0)) || (-1!=csurl.Find(".dll", 0)) || (-1!=csurl.Find(".zip", 0)) || (-1!=csurl.Find(".js", 0)) || (-1!=csurl.Find(".vbs", 0))) + p.m_bBinary = TRUE; + else + p.m_bBinary = FALSE; + + // Now get matching info from the registry - if available + RegKey keyPlugin; + CString csVersion; + CString decalPluginKey; + + // See if this plugin is installed in the Decal plugin list + decalPluginKey.Format("SOFTWARE\\Decal\\Plugins\\%s", OLE2T(vClsid.bstrVal)); + + if (keyPlugin.Open(HKEY_LOCAL_MACHINE, _T(decalPluginKey), KEY_READ) == ERROR_SUCCESS) + { + CString szDllName; + + keyPlugin.Close(); + + // It is! Get the DLL for the CLSID + if (!CDenAgentApp::getCOMObjectDLL(p.m_clsid, szDllName)) + goto NotInstalled; + + int iMajor, iMinor, iBuildMajor, iBuildMinor; + + // Now get the version from the DLL + if (!CDenAgentApp::getVersionInfo(szDllName, iMajor, iMinor, iBuildMajor, iBuildMinor)) + goto NotInstalled; + + // Setup the installed data by shifting the majors into the HIWORDs, minors into the LOWORDs + p.m_dwInstalledMajor = (iMajor << 16) | iMinor; + p.m_dwInstalledMinor = (iBuildMajor << 16) | iBuildMinor; + + // Format a version string + csVersion.Format("%d.%d.%d.%d", iMajor, iMinor, iBuildMajor, iBuildMinor); + + p.m_bInstalled = true; + } + else + { + +NotInstalled: + + p.m_bInstalled = false; + p.m_dwInstalledMajor = 0; + p.m_dwInstalledMinor = 0; + } + + m_plugins.push_back( p ); + + // Next, load this data into the listbox + int nIndex = m_wndPlugins.InsertItem( m_wndPlugins.GetItemCount(), OLE2T( vName.bstrVal ) ); + m_wndPlugins.SetItemData( nIndex, reinterpret_cast< DWORD >( &m_plugins.back() ) ); + m_wndPlugins.SetItemText( nIndex, 1, OLE2T( vVersion.bstrVal ) ); + + if( p.m_bInstalled ) + m_wndPlugins.SetItemText( nIndex, 2, csVersion ); + else + m_wndPlugins.SetItemText( nIndex, 2, _T( "Not Installed" ) ); + + // Set the proper image indicator + int nImage = 0; + if (p.m_bInstalled) + { + CString szInstalled, szKnown; + + // Write them out, padded with lots of zeroes + szInstalled.Format(_T("%.10d.%.10d.%.10d.%.10d"), + HIWORD(p.m_dwInstalledMajor), LOWORD(p.m_dwInstalledMajor), + HIWORD(p.m_dwInstalledMinor), LOWORD(p.m_dwInstalledMinor)); + szKnown.Format(_T("%.10d.%.10d.%.10d.%.10d"), + HIWORD(p.m_dwMajor), LOWORD(p.m_dwMajor), + HIWORD(p.m_dwMinor), LOWORD(p.m_dwMinor)); + + // Determine the image + if (szInstalled == szKnown) + { + nImage = 2; + } + else if (szInstalled > szKnown) + { + nImage = 3; + } + else if (szInstalled < szKnown) + { + nImage = 1; + } + } + m_wndPlugins.SetItem(nIndex, 0, LVIF_IMAGE, 0, nImage, 0, 0, 0); + } + + if(!m_SortInfo.pListControl) + { + m_SortInfo.nAscendingSortOrder = TRUE; + m_SortInfo.nColumnNo = 2; + m_SortInfo.pListControl = &m_wndPlugins; + } + + m_wndPlugins.SortItems(ComparePlugins, (DWORD)&m_SortInfo); + + m_wndPlugins.SetRedraw( TRUE ); +} + +BEGIN_MESSAGE_MAP(cAddRemoveDlg, CDialog) + //{{AFX_MSG_MAP(cAddRemoveDlg) + ON_BN_CLICKED(IDC_CHANGE_DIR, OnChangeDir) + ON_BN_CLICKED(IDC_INSTALL, OnInstall) + ON_NOTIFY(NM_DBLCLK, IDC_PLUGINS, OnDblclkPlugins) + ON_BN_CLICKED(IDC_UPGRADE, OnUpgrade) + ON_NOTIFY(LVN_COLUMNCLICK, IDC_PLUGINS, OnColumnclickPlugins) + ON_NOTIFY(LVN_GETINFOTIP, IDC_PLUGINS, OnInfoTip) + ON_BN_CLICKED(IDC_BROWSE, OnBrowse) + ON_BN_CLICKED(IDC_REFRESH, OnRefresh) + ON_NOTIFY(LVN_ITEMCHANGED, IDC_PLUGINS, OnSelChanged) + ON_NOTIFY(NM_CLICK, IDC_PLUGINS, OnSelChanged) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// cAddRemoveDlg message handlers + +void cAddRemoveDlg::OnChangeDir() +{ + + // TODO: Add your control notification handler code here +} + +void cAddRemoveDlg::OnInstall() +{ +// cDownloadDlg dlg( this ); + + // TODO: Get the currently selected item + cPlugin *pPlugin = reinterpret_cast< cPlugin * >( m_wndPlugins.GetItemData( m_wndPlugins.GetSelectionMark() ) ); + + if(pPlugin==NULL) + return; + +/* dlg.m_clsid = pPlugin->m_clsid; + dlg.m_dwMajor = pPlugin->m_dwMajor; + dlg.m_dwMinor = pPlugin->m_dwMinor; + dlg.m_strURL = pPlugin->m_szURL; + dlg.m_bDownloadPlugin = true; + + if( dlg.DoModal() != IDOK ) + return; + + // The download was successful - try and create an instance + CComPtr< IPlugin > pPluginObj; + HRESULT hRes = dlg.m_pFactory->CreateInstance( NULL, __uuidof( IPlugin ), reinterpret_cast< void ** >( &pPluginObj ) ); + if( FAILED( hRes ) ) + // Something isn't right + AfxMessageBox( _T( "The newly downloaded plugin dosen't appear to work." ), MB_ICONERROR | MB_OK, 0 ); + + dlg.m_pFactory->LockServer( FALSE ); + + // Refresh the view + loadListing(); +*/ + CString url(pPlugin->m_szURL); + ShellExecute(m_hWnd,"open",url,0,0,0); +} + +void cAddRemoveDlg::OnDblclkPlugins(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + + *pResult = 0; +} + +void cAddRemoveDlg::OnUpgrade() +{ + OnInstall(); +} + +BOOL cAddRemoveDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Load the string + RegKey keyAgent; + if( keyAgent.Open( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" )) != ERROR_SUCCESS ) + { + ::AfxMessageBox( _T( "Critical registry keys are missing, this installation is broken.\r\nRepair the installation." ), MB_ICONERROR | MB_OK, 0 ); + EndDialog( IDCANCEL ); + return FALSE; + } + + // Make it look nicer + m_wndPlugins.SetExtendedStyle( m_wndPlugins.GetExtendedStyle() | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); + + // Create and assign the image list + //m_ImageList.Create(IDR_VERSION_STATES, 21, 0, RGB(255, 255, 255)); + + m_ImageList.Create(IDB_IMAGES, 16, 0, RGB(255,0,255)); + m_wndPlugins.SetImageList(&m_ImageList, LVSIL_SMALL); + + // Setup the columns in the list control + m_wndPlugins.InsertColumn( 0, _T( "Plugin Name" ), LVCFMT_LEFT, 175 ); + m_wndPlugins.InsertColumn( 1, _T( "Version" ), LVCFMT_LEFT, 75, 1 ); + m_wndPlugins.InsertColumn( 2, _T( "Installed" ), LVCFMT_LEFT, 75, 2 ); + + m_wndPlugins.m_pAddRemoveDlg = this; + + m_pDoc.CreateInstance( __uuidof( MSXML::DOMDocument ) ); + m_pDoc->async = false; + + m_SortInfo.pListControl = NULL; + + loadListing(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void cAddRemoveDlg::OnColumnclickPlugins(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + + if (pNMListView->iSubItem == m_SortInfo.nColumnNo) + m_SortInfo.nAscendingSortOrder = !m_SortInfo.nAscendingSortOrder; + else + m_SortInfo.nAscendingSortOrder = TRUE; + + m_SortInfo.nColumnNo = pNMListView->iSubItem; + m_SortInfo.pListControl = &m_wndPlugins; + + m_wndPlugins.SortItems( ComparePlugins, (DWORD)&m_SortInfo ); + + *pResult = 0; +} + +int CALLBACK cAddRemoveDlg::ComparePlugins(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + SortInfo *pSortInfo = (SortInfo *) lParamSort; + + CListCtrl *pListControl = pSortInfo->pListControl; + + int lFirstData = -1, lSecondData = -1; + + LV_FINDINFO FindInfo; + + FindInfo.flags = LVFI_PARAM | LVFI_WRAP; + FindInfo.lParam = lParam1; + lFirstData = pListControl->FindItem(&FindInfo); + + FindInfo.lParam = lParam2; + lSecondData = pListControl->FindItem(&FindInfo,lFirstData); + + ASSERT(lFirstData != -1); ASSERT(lSecondData != -1); + + CString FirstText = pListControl->GetItemText(lFirstData,pSortInfo->nColumnNo); + CString SecondText = pListControl->GetItemText(lSecondData,pSortInfo->nColumnNo); + + return FirstText.CompareNoCase(SecondText) * ((pSortInfo->nAscendingSortOrder)?1:-1); +} + +void cAddRemoveDlg::OnInfoTip( NMHDR *pNMHDR, LRESULT *pResult ) +{ + NMLVGETINFOTIP *pInfoTip = reinterpret_cast(pNMHDR); + + cPlugin *pPlugin = reinterpret_cast< cPlugin * >( m_wndPlugins.GetItemData( pInfoTip->iItem ) ); + + if(pPlugin==NULL) + return; + + CString strTipText(pPlugin->m_szURL); + + lstrcpy(pInfoTip->pszText, strTipText); + + *pResult = 0; +} + +void cAddRemoveDlg::DisplayError(HRESULT hr) +{ + LPVOID lpMsgBuf; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,hr, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf, 0, NULL ); + + char szTemp[100]; + wsprintf(szTemp, "%s\n", lpMsgBuf); + MessageBox(szTemp, "Decal Plugin Registration" , MB_ICONEXCLAMATION); +} + +bool cAddRemoveDlg::ReadTypeLib(CString cstrDll, bool bMultipleFiles) +{ + USES_CONVERSION; + + bool bRegedDLL = false; + + HINSTANCE hDLL = LoadLibrary(cstrDll); + if(hDLL) + { + DLLREG DllReg = (DLLREG)GetProcAddress(hDLL, "DllRegisterServer"); + + if(DllReg!=NULL) + { + DllReg(); + bRegedDLL = true; + } + + FreeLibrary(hDLL); + } + + ITypeLib *pTypeLib = NULL; + ITypeInfo *pTypeInfo = NULL; + TYPEATTR *pTypeAttr = NULL; + + bool bSuccess = false; + + HRESULT hr; + WCHAR* pwszClassID = NULL; + int i; + UINT iCount; + + hr = LoadTypeLib(A2OLE(cstrDll),&pTypeLib); + if ( FAILED(hr)) + { + goto _cleanup; + DisplayError(hr); + } + + iCount = pTypeLib->GetTypeInfoCount(); + + for (i=0; i < iCount ; i++) + { + + if (FAILED(hr = (pTypeLib->GetTypeInfo(i, &pTypeInfo)))) + { + DisplayError(hr); + goto _cleanup; + } + + if (FAILED(hr = (pTypeInfo->GetTypeAttr(&pTypeAttr)))) + { + DisplayError(hr); + goto _cleanup; + } + + if (TKIND_COCLASS == pTypeAttr->typekind) + { + HREFTYPE hRefType; + ITypeInfo *pTInfoImpl; + TYPEATTR *pTAttr = NULL; + CComBSTR bstrName; + + for( int j = 0 ; j < pTypeAttr->cImplTypes ; ++j ) + { + hr = pTypeInfo->GetRefTypeOfImplType( j, &hRefType ); + if( SUCCEEDED( hr ) ) + { + hr = pTypeInfo->GetRefTypeInfo( hRefType, &pTInfoImpl ); + if( SUCCEEDED( hr ) ) + { + hr = pTInfoImpl->GetDocumentation( -1, &bstrName, NULL, NULL, NULL ); + + hr = pTInfoImpl->GetTypeAttr(&pTAttr); + + if( SUCCEEDED( hr ) ) + { + if((pTAttr->guid==IID_IPlugin) && (bstrName == CComBSTR("IPlugin"))) + { + StringFromCLSID(pTypeAttr->guid, &pwszClassID); + + RegKey key; + if( key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Plugins" )) == ERROR_SUCCESS ) + if(key.SetDWORDValue(OLE2A(pwszClassID), (DWORD)0x1) == ERROR_SUCCESS) + bSuccess = true; + + CoTaskMemFree(pwszClassID); + } + pTInfoImpl->ReleaseTypeAttr(pTAttr); + } + + bstrName.Empty(); + pTInfoImpl->Release(); + } + } + } + } + pTypeInfo->ReleaseTypeAttr(pTypeAttr); + pTypeInfo->Release(); + } + +_cleanup: + + if (pTypeAttr) + pTypeInfo->ReleaseTypeAttr(pTypeAttr); + + if (pTypeInfo) + pTypeInfo->Release(); + + if(pTypeLib) + pTypeLib->Release(); + + if(bSuccess) + { + MessageBox(CString("Decal Plugin: ") + cstrDll + " was sucessfully registered.", "Decal Plugin Registration", MB_ICONINFORMATION ); + return true; + } + else if(bRegedDLL) + { + MessageBox(CString("File: ") + cstrDll + " was sucessfully registered.\n\nHowever, Decal was unable to determine if the DLL was a Decal Plugin.\n\nIf it was, it should appear in the Plugin List, otherwise it wasn't.", "Decal Plugin Registration", MB_ICONINFORMATION ); + return true; + } + else if(!bMultipleFiles) + MessageBox("Registration failed. Dll might not be a Decal Plugin.", "Decal Plugin Registration", MB_ICONEXCLAMATION); + + return false; +} + +struct cFileType +{ + CString m_strExt; + CComPtr< IDecalFileSurrogate > m_pFile; +}; + +typedef std::list< cFileType > cFileTypeList; + +void cAddRemoveDlg::OnBrowse() +{ + USES_CONVERSION; + + // Walk through the list of surrogates and build up a string + CComPtr< IDecalEnum > pEnum; + m_pDecal->get_Configuration( CComBSTR( _T( "Surrogates" ) ), GUID_NULL, &pEnum ); + + CString strOpen = _T( "Decal Components (" ); + + cFileTypeList filetypes; + + std::string ssTemp; + std::list vExtensions; + + while( pEnum->Next() == S_OK ) + { + CComPtr< IDecalFileSurrogate > pFileSurrogate; + + if( FAILED( pEnum->CreateInstance( __uuidof( IDecalFileSurrogate ), reinterpret_cast< void ** >( &pFileSurrogate ) ) ) ) + // This surrogate did not support files, move on + continue; + + CComBSTR strExt, strDescription; + pFileSurrogate->get_Extension( &strExt ); + pFileSurrogate->get_Description( &strDescription ); + + TCHAR szItem[ 255 ]; + LPTSTR szExt = OLE2T( strExt ), + szDesc = OLE2T( strDescription ); + + ::_stprintf( szItem, _T( "*.%s," ), szExt ); + //::_stprintf( szItem, _T( "%s (*.%s)|*.%s|" ), szDesc, szExt, szExt ); + strOpen += szItem; + + ssTemp = szExt; + vExtensions.push_back( ssTemp ); + + cFileType ft; + ft.m_strExt = szExt; + ft.m_pFile = pFileSurrogate; + + filetypes.push_back( ft ); + } + + strOpen.Delete( strOpen.GetLength() - 1, 1 ); // Remove that last "," + strOpen += _T( ") |" ); + + for( std::list::iterator z = vExtensions.begin(); z != vExtensions.end(); z++ ) + { + TCHAR szExtension[ 15 ]; + ::_stprintf( szExtension, _T( "*.%s;" ), z->data() ); + strOpen += szExtension; + } + + strOpen += _T( "|" ); + + // Changed fd( TRUE, NULL, NULL, (etc) to NULL, NULL, NULL - removes open as readonly checkbox + CFileDialog fd( NULL, NULL, NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, strOpen, this ); + + if( fd.DoModal() != IDOK ) + return; + + CString strExt = fd.GetFileExt(); + + // Find the matching file type + for( cFileTypeList::iterator i = filetypes.begin(); i != filetypes.end(); ++ i ) + { + if( i->m_strExt.CompareNoCase( strExt ) == 0 ) + { + // Found our match + HRESULT hRes = i->m_pFile->Register( CComBSTR( fd.GetPathName() ) ); + if( FAILED( hRes ) ) + AfxMessageBox( _T( "Failed to register plugin." ) ); + + break; + } + } + + // Dump the proxy libraries + ::CoFreeUnusedLibraries(); +} + +BEGIN_MESSAGE_MAP(CListViewSC, CListCtrl) + //{{AFX_MSG_MAP(CListViewSC) + ON_WM_DROPFILES() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +void CListViewSC::OnDropFiles( HDROP dropInfo ) +{ + char szTemp[MAX_PATH+1]; + m_bGotAFile = false; + + int iTotal = DragQueryFile(dropInfo, 0xFFFFFFFF, NULL, NULL); + + for(int i = 0; iReadTypeLib(szTemp, false); + m_bGotAFile = true; + } + else if( iTotal == 1 ) + { + m_pAddRemoveDlg->MessageBox("Invalid Decal Plugin.", "Decal Plugin Registration", MB_ICONEXCLAMATION); + m_bGotAFile = true; + } + } + else if(FILE_ATTRIBUTE_DIRECTORY & GetFileAttributes(szTemp)) + SearchDirectory(szTemp); + } + + if(!m_bGotAFile) + MessageBox("Could not locate any Decal Plugins.", "Decal Plugin Registration", MB_ICONEXCLAMATION); + + m_pAddRemoveDlg->loadListing(); + + return; +} + +bool CListViewSC::SearchDirectory(char *szDirectory) +{ + WIN32_FIND_DATA finder; + HANDLE session; + char buffer[MAX_PATH+1]; + + SetCurrentDirectory(szDirectory); + GetCurrentDirectory(_MAX_PATH, buffer); + + session = FindFirstFile("*", &finder); + + if(session==INVALID_HANDLE_VALUE) + return false; + + do + { + if((~finder.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + if(CString(PathFindExtension(finder.cFileName)).CompareNoCase(".dll") == 0 ) + { + GetCurrentDirectory(_MAX_PATH, buffer); + if(buffer[strlen(buffer)-1]=='\\') + wsprintf(buffer, "%s%s", buffer, finder.cFileName); + else + wsprintf(buffer, "%s\\%s", buffer, finder.cFileName); + if(m_pAddRemoveDlg->ReadTypeLib(buffer, true)) + m_bGotAFile = true; + } + } + else if(finder.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if(*finder.cFileName!='.') + { + SearchDirectory(finder.cFileName); + + SetCurrentDirectory(".."); + GetCurrentDirectory(_MAX_PATH, buffer); + } + } + } + while(FindNextFile(session, &finder)); + FindClose(session); + return true; +} + +void cAddRemoveDlg::OnRefresh() +{ + loadListing(); +} + +void cAddRemoveDlg::OnSelChanged(NMHDR* pNMHDR, LRESULT* pResult) +{ + int nSelectionMark = m_wndPlugins.GetSelectionMark(); + + if ( nSelectionMark == -1 ) + return; + + cPlugin *pPlugin = reinterpret_cast(m_wndPlugins.GetItemData( nSelectionMark )); + + if (pPlugin == NULL) + return; + + if (pPlugin->m_bBinary) + SetDlgItemText(IDC_INSTALL, "Download"); + else + SetDlgItemText(IDC_INSTALL, "Visit Website"); + + *pResult = 0; +} + diff --git a/Native/DenAgent/AddRemoveDlg.h b/Native/DenAgent/AddRemoveDlg.h new file mode 100644 index 0000000..8a20735 --- /dev/null +++ b/Native/DenAgent/AddRemoveDlg.h @@ -0,0 +1,114 @@ +#if !defined(AFX_ADDREMOVEDLG_H__CA058B98_7B3E_4315_BB99_0D8D582335BA__INCLUDED_) +#define AFX_ADDREMOVEDLG_H__CA058B98_7B3E_4315_BB99_0D8D582335BA__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// AddRemoveDlg.h : header file +// + +#include + +///////////////////////////////////////////////////////////////////////////// +// cAddRemoveDlg dialog + +typedef struct tagSortInfo +{ + CListCtrl *pListControl; + int nColumnNo; + bool nAscendingSortOrder; +} SortInfo; + +typedef CRuntimeClass * (*DLLREG)(); + +class CListViewSC : public CListCtrl +{ + friend class cAddRemoveDlg; + + public: + CListViewSC(){}; + cAddRemoveDlg *m_pAddRemoveDlg; + bool SearchDirectory(char *szDirectory); + bool m_bGotAFile; + protected: + //{{AFX_MSG(CListViewSC) + afx_msg void OnDropFiles(HDROP dropInfo); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + private: + CListViewSC& operator=(const CListViewSC& x); + CListViewSC(const CListViewSC& x); +}; + +class cAddRemoveDlg : public CDialog +{ +// Construction +public: + cAddRemoveDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(cAddRemoveDlg) + enum { IDD = IDD_ADDREMOVE }; + CListViewSC m_wndPlugins; + //}}AFX_DATA + + struct cPlugin + { + CLSID m_clsid; + WCHAR m_szURL[ 1024 ]; + DWORD m_dwMajor; + DWORD m_dwMinor; + bool m_bInstalled; + DWORD m_dwInstalledMajor; + DWORD m_dwInstalledMinor; + bool m_bBinary; + }; + + CImageList m_ImageList; + SortInfo m_SortInfo; + + bool m_bHide; + + typedef std::list< cPlugin > cPluginList; + cPluginList m_plugins; + + IDecal *m_pDecal; + + MSXML::IXMLDOMDocumentPtr m_pDoc; + + void DisplayError(HRESULT hr); + void convertVersion( LPTSTR szVersion, DWORD &dwVersionMajor, DWORD &dwVersionMinor ); + void loadListing(); + bool ReadTypeLib(CString cstrDll, bool bMultipleFiles); + static int CALLBACK ComparePlugins(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(cAddRemoveDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(cAddRemoveDlg) + afx_msg void OnChangeDir(); + afx_msg void OnInstall(); + afx_msg void OnDblclkPlugins(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnUpgrade(); + virtual BOOL OnInitDialog(); + afx_msg void OnColumnclickPlugins(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnInfoTip( NMHDR * pNMHDR, LRESULT * pResult ); + afx_msg void OnBrowse(); + afx_msg void OnRefresh(); + afx_msg void OnSelChanged(NMHDR* pNMHDR, LRESULT* pResult); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_ADDREMOVEDLG_H__CA058B98_7B3E_4315_BB99_0D8D582335BA__INCLUDED_) diff --git a/Native/DenAgent/AutoUpdate.cpp b/Native/DenAgent/AutoUpdate.cpp new file mode 100644 index 0000000..84eb356 --- /dev/null +++ b/Native/DenAgent/AutoUpdate.cpp @@ -0,0 +1,527 @@ +#include "stdafx.h" + +#include + +#include "DenAgent.h" +#include "DownloaderDlg.h" +#include "AutoUpdate.h" + +static LPCSTR updateList = "updatelist.xml" ; + +// DownloadAgent + +/* static */ bool DownloadAgent::downloadFile(std::string remoteFile, std::string localFile) { + // Perform a direct, one time download of a file + + cDownloaderDlg dlg; + + dlg.addFile(remoteFile, localFile); + + dlg.DoModal(); + + return (dlg.GetDownloadStatus() == cDownloaderDlg::DownloadStatus::DOWNLOAD_SUCCEEDED); +} + +DownloadAgent::DownloadAgent() { + m_ScheduledDownloads.clear(); +} + +void DownloadAgent::scheduleDownload(std::string remoteFile, std::string localFile) { + // Encapsulate this download in a download slot, and add it to the schedule list + + DownloadSlot slot; + + slot.remoteFile = remoteFile; + slot.localFile = localFile; + + m_ScheduledDownloads.push_back(slot); +} + +bool DownloadAgent::runDownloads() { + if (!m_ScheduledDownloads.size()) + return false; + + cDownloaderDlg dlg; + + // Add each schduled download to our downloader + std::list::iterator it; + + for (it = m_ScheduledDownloads.begin(); it != m_ScheduledDownloads.end(); ++it) { + DownloadSlot slot = *it; + + dlg.addFile(slot.remoteFile, slot.localFile); + } + + // And run them + dlg.DoModal(); + + return (dlg.GetDownloadStatus() == cDownloaderDlg::DownloadStatus::DOWNLOAD_SUCCEEDED); +} + +// AutoUpdateSource + +AutoUpdateSource::AutoUpdateSource(std::string decalDir, AutoUpdateType type, std::string localTarget, std::string remoteSource, std::string requiredVersion) + : m_DecalDir(decalDir) + , m_LocalTarget(localTarget) + , m_RequiredVersion(requiredVersion) + , m_RemoteSource(remoteSource) + , m_Type(type) +{ +} + +bool AutoUpdateSource::needsUpdating() { + USES_CONVERSION; + + // Get the version of the local file + + // Make sure the file exists + + OFSTRUCT targetFile; + std::string localTarget = m_DecalDir + "/" + m_LocalTarget; + + if (OpenFile(localTarget.c_str(), &targetFile, OF_EXIST) == HFILE_ERROR) { + // It didn't exist, we must update + return true; + } + + if (m_RequiredVersion.length() == 0) { + // If we don't have a remote version, assume we want to update + return true; + } + + int reqMajor(0), reqMinor(0), reqPatch(0), reqBuild(0) ; + sscanf(m_RequiredVersion.c_str(), "%i.%i.%i.%i", &reqMajor, &reqMinor, &reqPatch, &reqBuild); + + if (m_Type == AU_TYPE_XML) { + // Extract the version node from an XML document + MSXML::IXMLDOMDocumentPtr pDoc; + + try { + pDoc.CreateInstance (__uuidof(MSXML::DOMDocument), NULL, CLSCTX_INPROC_SERVER); + pDoc->async = false; + + // Construct a list of update targets based on the XML contents + if (pDoc->load(static_cast(localTarget.c_str()))) { + // Read the autoupdate version string +// MSXML::IXMLDOMNodePtr pVersionNode = pDoc->selectSingleNode ( _T( "/*/@version" ) ); + MSXML::IXMLDOMElementPtr pVersionNode = pDoc->selectSingleNode ("//revision"); + if (pVersionNode != NULL) { +// _variant_t vXMLVer = pVersionNode->text; + _variant_t vXMLVer = pVersionNode->getAttribute("version") ; + if (vXMLVer.vt == VT_BSTR) { + int locMajor(0), locMinor(0), locPatch(0), locBuild(0) ; + sscanf(OLE2T(vXMLVer.bstrVal), "%i.%i.%i.%i", &locMajor, &locMinor, &locPatch, &locBuild); + if (locMajor==reqMajor) { + if (locMinor==reqMinor) { + if (locPatch==reqPatch) { + return locBuild::iterator it; + for (it = m_Requirements.begin(); it != m_Requirements.end(); ++it) + { + UpdateRequirement ur = *it; + localTarget = m_DecalDir + "/" + ur.sFile; + sscanf(ur.sVers.c_str(), "%i.%i.%i.%i", &reqMajor, &reqMinor, &reqPatch, &reqBuild); + if (isOutDatedVersion(localTarget, reqMajor, reqMinor, reqPatch, reqBuild)) + { + std::string sMsg = m_LocalTarget + " cannot be updated because one or more dependencies is outdated"; + ::MessageBox(0, _T(sMsg.c_str()), NULL, S_OK); + return false; + } + } + return true; + } + else // File is newer, ignore requirements and exit + { + return false; + } + } + // if anything went wrong or we were unable to tell whether it should be updated + // or not...assume it needs updating. + return true ; +} + +std::string AutoUpdateSource::getSource() { + return m_RemoteSource; +} + +std::string AutoUpdateSource::getDestination() { + return m_LocalTarget; +} + +AutoUpdateType AutoUpdateSource::getType() { + return m_Type; +} + +bool AutoUpdateSource::isOutDatedVersion(std::string sFile, int nMajor, int nMinor, int nPatch, int nBuild) +{ + // Extract the DLL version + DWORD dwDummy, dwVerSize; + + dwVerSize = ::GetFileVersionInfoSize(const_cast(sFile.c_str()), &dwDummy); + + if( dwVerSize == 0 ) + return true; // if file vsn not available, assume needs updating + else + { + BYTE *pbVersionInfo = reinterpret_cast< BYTE * >(::_alloca(dwVerSize)); + + ::GetFileVersionInfo(const_cast(sFile.c_str()), 0, dwVerSize, pbVersionInfo); + + VS_FIXEDFILEINFO *vffi; + UINT nLength = sizeof(VS_FIXEDFILEINFO); + + if( ::VerQueryValue( pbVersionInfo, _T("\\"), reinterpret_cast< LPVOID * >( &vffi ), &nLength ) ) + { + // Got it, so format it + int locMajor(0), locMinor(0), locPatch(0), locBuild(0); + locMajor = static_cast< int >( HIWORD( vffi->dwFileVersionMS ) ); + locMinor = static_cast< int >( LOWORD( vffi->dwFileVersionMS ) ); + locPatch = static_cast< int >( HIWORD( vffi->dwFileVersionLS ) ); + locBuild = static_cast< int >( LOWORD( vffi->dwFileVersionLS ) ); + + if( locMajor == nMajor ) + { + if( locMinor == nMinor ) + { + if( locPatch == nPatch ) + return locBuild < nBuild; + else + return locPatch < nPatch; + } + + else + return locMinor < nMinor ; + } + + else + return locMajor < nMajor ; + } + + // problem with VerQueryValue... maybe updating will fix it. + else + return true; + } +} + +void AutoUpdateSource::AddRequirement(UpdateRequirement reqUpdate) +{ + m_Requirements.push_back(reqUpdate); +} + +// AutoUpdate + +AutoUpdate::AutoUpdate(std::string decalDir) { + m_DecalDir = decalDir; + m_LocalXML = ""; + + m_RemoteSources.clear(); +} + +bool AutoUpdate::initialiseFromXML(std::string remoteXML) { + USES_CONVERSION; + + m_RemoteXML = remoteXML + "/" + updateList ; + + // Download the remote XML document to a local file + if (!DownloadAgent::downloadFile(m_RemoteXML, m_DecalDir + "/" + updateList)) + { + // We couldn't download the update list. We must bail here, or suffer! + ::MessageBox(NULL, "Could not obtain updatelist.xml. Cannot update - Hosting server down?", NULL, MB_OK); + + return false; + } + + // Parse it as an XML document + MSXML::IXMLDOMDocumentPtr pDoc; + +// try { + pDoc.CreateInstance (__uuidof(MSXML::DOMDocument), NULL, CLSCTX_INPROC_SERVER); + pDoc->async = false; + + // Construct a list of update targets based on the XML contents + std::string localXML = m_DecalDir + "/" + updateList ; + + if (!pDoc->load( static_cast(localXML.c_str()))) + return false; + + // Read the autoupdate version string + MSXML::IXMLDOMNodePtr pVersionNode = pDoc->selectSingleNode ( _T( "/*/@version" ) ); + + if (pVersionNode == NULL) { + ::MessageBox(NULL,"No version information in updatelist.xml. Cannot update",NULL,MB_OK) ; + return false; + } + + // Check to make sure we understand this version + char *version = OLE2T(pVersionNode->text); + if (strcmp(version,"1.0.0.0")) { + ::MessageBox(NULL,"Unknown version type in updatelist.xml. Cannot update",NULL,MB_OK) ; + return false ; + } + + // Now iterate over the Files entries, creating an AutoUpdateSource for each + MSXML::IXMLDOMNodeListPtr xmlFiles = pDoc->selectNodes(_T("/updatelist/file")); + + if (xmlFiles.GetInterfacePtr() == NULL) + return false; + + for (MSXML::IXMLDOMElementPtr xmlFile = xmlFiles->nextNode(); xmlFile.GetInterfacePtr() != NULL; xmlFile = xmlFiles->nextNode()) { + std::string localFile, remoteFile, version; + AutoUpdateType type; + BSTR bResult; + _variant_t vResult; + + // Read the type + vResult = xmlFile->getAttribute("type"); + + if (vResult.vt != VT_BSTR) + continue; + + bResult = vResult.bstrVal; + char *cType = OLE2T(bResult); + + if (strcmp(cType, "xml") == 0) { + type = AU_TYPE_XML; + } else if (strcmp(cType, "dll") == 0) { + type = AU_TYPE_DLL; + } else if (strcmp(cType, "beta") == 0) { + type = AU_TYPE_BETADLL ; + } else { + continue; + } + + // Local name + vResult = xmlFile->getAttribute("localname"); + + if (vResult.vt != VT_BSTR) + continue; + + bResult = vResult.bstrVal; + localFile = OLE2T(bResult); + + // Remote name + vResult = xmlFile->getAttribute("remotename"); + + if (vResult.vt != VT_BSTR) + continue; + + bResult = vResult.bstrVal; + remoteFile = OLE2T(bResult); + + // And version + vResult = xmlFile->getAttribute("version"); + + if (vResult.vt != VT_BSTR) + continue; + + bResult = vResult.bstrVal; + version = OLE2T(bResult); + + AutoUpdateSource aUSource(m_DecalDir, type, localFile, remoteFile, version); + //if the source is dll || beta check for requirements + if (type == AU_TYPE_DLL || type == AU_TYPE_BETADLL) + { + MSXML::IXMLDOMNodeListPtr xmlReqs = NULL;//xmlFile->selectNodes(_T("requirement")); //pDoc->selectNodes(_T("/updatelist/file")); + xmlReqs = xmlFile->getElementsByTagName(_T("requirement")); + + if (xmlReqs.GetInterfacePtr() == NULL) + continue; + + for (MSXML::IXMLDOMElementPtr xmlNode = xmlReqs->nextNode(); xmlNode.GetInterfacePtr() != NULL; xmlNode = xmlReqs->nextNode()) + { + std::string sLocalFile, sVersion; + + // Read the file name + vResult = xmlNode->getAttribute("file"); + if (vResult.vt != VT_BSTR) + continue; + + bResult = vResult.bstrVal; + sLocalFile = OLE2T(bResult); + + // Read the version + vResult = xmlNode->getAttribute("version"); + if (vResult.vt != VT_BSTR) + continue; + + bResult = vResult.bstrVal; + sVersion = OLE2T(bResult); + + UpdateRequirement uReq(sLocalFile, sVersion); + aUSource.AddRequirement(uReq); + } + } + // Add the source to the cache + m_RemoteSources.push_back(aUSource); + } +// } catch (...) { +// return false; +// } + + return true; +} + +bool AutoUpdate::needsUpdate() { + // Ask all the dependancies if they want to update themselves + + // Check the versions of all our local XML documents to see if we need an update + std::list::iterator it; + + for (it = m_RemoteSources.begin(); it != m_RemoteSources.end(); ++it) { + AutoUpdateSource aUSource = *it; + + if (aUSource.needsUpdating()) + return true; + } + + // Nothing needed updating + return false; +} + +bool AutoUpdate::performUpdate() { + // Construct a list of all the remote components that need updating + std::list updateList; + DownloadAgent dlAgent; + + + bool DllUpdate = false ; + bool BetaUpdate = false ; + std::list::iterator itRemote = m_RemoteSources.begin();; + while (itRemote != m_RemoteSources.end()) { + AutoUpdateSource aUSource = *itRemote++; + + if (aUSource.needsUpdating()) { + switch(aUSource.getType()) { + case AU_TYPE_DLL: DllUpdate = true ; break ; + case AU_TYPE_BETADLL: BetaUpdate = true ; break ; + } + if (aUSource.getType()==AU_TYPE_BETADLL) { + BetaUpdate = true ; + } + updateList.push_back(aUSource); + } + } + if (DllUpdate) { + if ( MessageBox(NULL, + "Updates to the Decal program are available.\n\n" + "These are supported updates to the current release\n" + "version of Decal.\n" + "Installation of these updates is recommended.\n\n" + "Do you wish to install these updates now?", + "Decal Program Updates Available", + MB_YESNO) == IDNO + ){ + DllUpdate = false ; + } + } + if (BetaUpdate) { + if (MessageBox(NULL, + "Decal Beta updates are available.\n\n" + "NOTE: Beta versions are not supported and have NOT\n" + "been tested extensively.\n" + " They can crash your system, and require a full\n" + "re-install of the original Decal program.\n\n" + "Do you wish to install these unsupported Beta updates?", + "Beta program updates available", + MB_YESNO|MB_DEFBUTTON2) == IDNO + ) { + BetaUpdate = false ; + } + } + // Schedule downloads and processing for all selected types + std::list::iterator itUpdates = updateList.begin();; + while (itUpdates != updateList.end()) { + AutoUpdateSource source = *itUpdates++ ; + if ( (source.getType() == AU_TYPE_DLL && !DllUpdate) + || (source.getType() == AU_TYPE_BETADLL && !BetaUpdate) + ){ + continue ; + } + dlAgent.scheduleDownload(source.getSource(), m_DecalDir + "\\" + source.getDestination() + ".tmp"); + } + + // Download them to the local cache + if (!dlAgent.runDownloads()) { + // Something went horribly wrong + return false; + } + + // Delete the destinations and move the cached objects to their new homes + itUpdates = updateList.begin() ; + while (itUpdates != updateList.end()) { + AutoUpdateSource aUSource = *itUpdates++; + if ( (aUSource.getType() == AU_TYPE_DLL && !DllUpdate) + || (aUSource.getType() == AU_TYPE_BETADLL && !BetaUpdate) + ){ + continue ; + } + + std::string newFile = (m_DecalDir + "\\" + aUSource.getDestination()); + std::string tmpFile = (m_DecalDir + "\\" + aUSource.getDestination() + ".tmp"); + + BOOL bResult = ::DeleteFile (newFile.c_str ()); + DWORD dwLastError = 0; + + if (!bResult) + { + dwLastError = ::GetLastError (); + } + + if (bResult || dwLastError == ERROR_FILE_NOT_FOUND) + { + MoveFile(tmpFile.c_str(), newFile.c_str()); + + // We may have to register DLLs + + if (aUSource.getType() == AU_TYPE_DLL || aUSource.getType() == AU_TYPE_BETADLL ) + { + HINSTANCE hDLL = LoadLibrary(newFile.c_str()); + + if (hDLL) { + typedef CRuntimeClass * (*DLLREG)(); + + DLLREG DllReg = (DLLREG)GetProcAddress(hDLL, "DllRegisterServer"); + + if (DllReg != NULL) + DllReg(); + + FreeLibrary(hDLL); + } + } + } + + // Delete failed - file is in use + else + { + MessageBox(NULL, "A file being updated is in use - close programs and try again.", "Decal", MB_OK); + } + } + + if (updateList.size() > 0) { + MessageBox(NULL, "Your Decal components have been updated", "Decal", MB_OK); + } else { + MessageBox(NULL, "Your Decal components are already up to date", "Decal", MB_OK); + } + + return true; +} \ No newline at end of file diff --git a/Native/DenAgent/AutoUpdate.h b/Native/DenAgent/AutoUpdate.h new file mode 100644 index 0000000..995df41 --- /dev/null +++ b/Native/DenAgent/AutoUpdate.h @@ -0,0 +1,70 @@ +#ifndef __AUTOUPDATE_H__ +#define __AUTOUPDATE_H__ + +class DownloadAgent { +public: + static bool downloadFile(std::string remoteFile, std::string localFile); + + DownloadAgent(); + + void scheduleDownload(std::string remoteFile, std::string localFile); + bool runDownloads(); + +private: + struct DownloadSlot { + std::string remoteFile, localFile; + }; + + std::list m_ScheduledDownloads; +}; + +enum AutoUpdateType { + AU_TYPE_XML, + AU_TYPE_DLL, + AU_TYPE_BETADLL +}; + +class UpdateRequirement +{ +public: + UpdateRequirement(std::string File, std::string Version): + sFile(File), sVers(Version) { } + std::string sFile; + std::string sVers; +}; + +class AutoUpdateSource { +public: + AutoUpdateSource(std::string decalPath, AutoUpdateType type, std::string localTarget, std::string remoteSource, std::string requiredVersion); + + bool needsUpdating(); + std::string getSource(); + std::string getDestination(); + AutoUpdateType getType(); + bool isOutDatedVersion(std::string sFile, int nMajor, int nMinor, int nPatch, int nBuild); + void AddRequirement(UpdateRequirement reqUpdate); + +private: + std::string m_LocalTarget; + std::string m_RemoteSource; + std::string m_RequiredVersion; + std::string m_DecalDir; + AutoUpdateType m_Type; + std::vector m_Requirements; +}; + +class AutoUpdate { +public: + AutoUpdate(std::string decalDir); + + bool initialiseFromXML(std::string remoteXML); + bool needsUpdate(); + bool performUpdate(); + +private: + std::string m_LocalXML, m_RemoteXML; + std::string m_DecalDir; + std::list m_RemoteSources; +}; + +#endif \ No newline at end of file diff --git a/Native/DenAgent/BindStatusCallback.cpp b/Native/DenAgent/BindStatusCallback.cpp new file mode 100644 index 0000000..4182571 --- /dev/null +++ b/Native/DenAgent/BindStatusCallback.cpp @@ -0,0 +1,125 @@ +#include "stdafx.h" +#include "DownloadDlg.h" +#include "BindStatusCallback.h" +#include + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +STDMETHODIMP CCallback::OnProgress ( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR wszStatusText ) +{ + + static CString sIEStatusMsg; + static TCHAR szCustomStatusMsg [256]; + static TCHAR szAmtDownloaded [256], szTotalSize [256]; + + UNREFERENCED_PARAMETER(ulStatusCode); + + if ( 0 != g_fAbortDownload ) + return E_ABORT; + + if ( m_bUseTimeout && CTime::GetCurrentTime() > m_timeToStop ) + return E_ABORT; + + if ( NULL != wszStatusText ) + sIEStatusMsg = wszStatusText; + else + sIEStatusMsg.Empty(); + + StrFormatByteSize ( ulProgress, szAmtDownloaded, 256 ); + StrFormatByteSize ( ulProgressMax, szTotalSize, 256 ); + + if ( 0 != ulProgressMax ) + wsprintf ( szCustomStatusMsg, _T("Downloaded %s of %s"), szAmtDownloaded, szTotalSize ); + else + wsprintf ( szCustomStatusMsg, _T("Downloaded %s (total size unknown)"), szAmtDownloaded ); + + if ( 0 != ulProgressMax ) + m_pDlg->ProgressUpdate ( sIEStatusMsg, szCustomStatusMsg, int( 100.0 * ulProgress / ulProgressMax) ); + else + m_pDlg->ProgressUpdate ( sIEStatusMsg, szCustomStatusMsg, 0 ); + + return(NOERROR); +} + +CCallback::CCallback() +{ + m_pbinding = NULL; + m_pstm = NULL; + m_cRef = 1; + m_cbOld = 0; + m_bUseTimeout = FALSE; + m_pDlg = NULL; +} + +CCallback::~CCallback() +{ + if (m_pstm) + m_pstm->Release(); + if (m_pbinding) + m_pbinding->Release(); +} + +STDMETHODIMP CCallback::QueryInterface(REFIID riid, void** ppv) +{ + *ppv = NULL; + + if (riid==IID_IUnknown || riid==IID_IBindStatusCallback) + { + *ppv = this; + AddRef(); + return S_OK; + } + return E_NOINTERFACE; +} + +STDMETHODIMP CCallback::OnStartBinding(DWORD grfBSCOption, IBinding* pbinding) +{ + if(NULL != pbinding) + { + pbinding->AddRef(); + m_pbinding = pbinding; + } + + return(NOERROR); +} + +STDMETHODIMP CCallback::OnStopBinding(HRESULT hrStatus, LPCWSTR pszError) +{ + if(NULL != m_pbinding) + { + m_pbinding->Release(); + m_pbinding = NULL; + } + + return(NOERROR); +} + +STDMETHODIMP CCallback::GetPriority(LONG* pnPriority) +{ + return(NOERROR); +} + +STDMETHODIMP CCallback::OnLowResource(DWORD dwReserved) +{ + return(NOERROR); +} + +STDMETHODIMP CCallback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindInfo) +{ + return (NOERROR); +} + +STDMETHODIMP CCallback::OnDataAvailable(DWORD grfBSCF, + DWORD dwSize, FORMATETC* pfmtetc, STGMEDIUM* pstgmed) +{ + return(NOERROR); +} + +STDMETHODIMP CCallback::OnObjectAvailable(REFIID riid, IUnknown* punk) +{ + return(NOERROR); +} \ No newline at end of file diff --git a/Native/DenAgent/BindStatusCallback.h b/Native/DenAgent/BindStatusCallback.h new file mode 100644 index 0000000..edd0144 --- /dev/null +++ b/Native/DenAgent/BindStatusCallback.h @@ -0,0 +1,36 @@ +#include "resource.h" +#include "downloaderdlg.h" + +class CCallback : public IBindStatusCallback +{ + public: + // IUnknown methods + STDMETHODIMP QueryInterface(REFIID riid,void ** ppv); + STDMETHODIMP_(ULONG) AddRef() { return m_cRef++; } + STDMETHODIMP_(ULONG) Release() { if (--m_cRef == 0) { delete this; return 0; } return m_cRef; } + + // IBindStatusCallback methods + STDMETHODIMP OnStartBinding(DWORD grfBSCOption, IBinding* pbinding); + STDMETHODIMP GetPriority(LONG* pnPriority); + STDMETHODIMP OnLowResource(DWORD dwReserved); + STDMETHOD(OnProgress)( /* [in] */ ULONG ulProgress,/* [in] */ ULONG ulProgressMax,/* [in] */ ULONG ulStatusCode,/* [in] */ LPCWSTR szStatusText); + STDMETHODIMP OnStopBinding(HRESULT hrResult, LPCWSTR szError); + STDMETHODIMP GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo); + STDMETHODIMP OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc, STGMEDIUM* pstgmed); + STDMETHODIMP OnObjectAvailable(REFIID riid, IUnknown* punk); + + // constructors/destructors + CCallback(); + ~CCallback(); + + // data members + DWORD m_cRef; + IBinding* m_pbinding; + IStream* m_pstm; + DWORD m_cbOld; + + cDownloaderDlg* m_pDlg; + + BOOL m_bUseTimeout; + CTime m_timeToStop; +}; \ No newline at end of file diff --git a/Native/DenAgent/ChangePluginDirectory.cpp b/Native/DenAgent/ChangePluginDirectory.cpp new file mode 100644 index 0000000..64ecf4f --- /dev/null +++ b/Native/DenAgent/ChangePluginDirectory.cpp @@ -0,0 +1,81 @@ +// cChangePluginDirectory.cpp : implementation file +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "ChangePluginDirectory.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// cChangePluginDirectory dialog + + +cChangePluginDirectory::cChangePluginDirectory(CWnd* pParent /*=NULL*/) + : CDialog(cChangePluginDirectory::IDD, pParent) +{ + //{{AFX_DATA_INIT(cChangePluginDirectory) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT +} + + +void cChangePluginDirectory::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(cChangePluginDirectory) + DDX_Control(pDX, IDC_NEWURL, m_NewUrl); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(cChangePluginDirectory, CDialog) + //{{AFX_MSG_MAP(cChangePluginDirectory) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// cChangePluginDirectory message handlers + +void cChangePluginDirectory::OnOK() +{ + // TODO: Add extra validation here + + RegKey keyAgent; + if( keyAgent.Open( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" )) == ERROR_SUCCESS ) + { + CString csu; + m_NewUrl.GetWindowText(csu); + keyAgent.SetStringValue("DecalDirectory", csu); + keyAgent.Close(); + } + CDialog::OnOK(); +} + +BOOL cChangePluginDirectory::OnInitDialog() +{ + CDialog::OnInitDialog(); + + RegKey keyAgent; + if( keyAgent.Open( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" )) != ERROR_SUCCESS ) + { + ::AfxMessageBox( _T( "Critical registry keys are missing, this installation is broken.\r\nRepair the installation." ), MB_ICONERROR | MB_OK, 0 ); + EndDialog( IDCANCEL ); + return FALSE; + } + + TCHAR szUrl[ 1024 ]; + DWORD dwSize = 1024; + + keyAgent.QueryStringValue(_T("DecalDirectory"), szUrl, &dwSize); + m_NewUrl.SetWindowText(szUrl); + keyAgent.Close(); + // TODO: Add extra initialization here + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} diff --git a/Native/DenAgent/DenAgent.cpp b/Native/DenAgent/DenAgent.cpp new file mode 100644 index 0000000..eb18a2d --- /dev/null +++ b/Native/DenAgent/DenAgent.cpp @@ -0,0 +1,691 @@ +// DenAgent.cpp : Defines the class behaviors for the application. +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "DenAgentDlg.h" + +#include "TrayWnd.h" +#include +#include "DenAgent_i.c" +#include "..\Inject\Inject.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +//FILELIST g_FileList[] = { { "messages.xml", "messages.dlc" }, { "memlocs.xml", "messages.dlc" }, { "decalplugins.xml", "messages.dlc" } }; + +///////////////////////////////////////////////////////////////////////////// +// CDenAgentApp + +BEGIN_MESSAGE_MAP(CDenAgentApp, CWinApp) + //{{AFX_MSG_MAP(CDenAgentApp) + // NOTE - the ClassWizard will add and remove mapping macros here. + // DO NOT EDIT what you see in these blocks of generated code! + //}}AFX_MSG + ON_COMMAND(ID_HELP, CWinApp::OnHelp) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDenAgentApp construction + +CDenAgentApp::CDenAgentApp() +{ + // TODO: add construction code here, + // Place all significant initialization in InitInstance +} + +///////////////////////////////////////////////////////////////////////////// +// The one and only CDenAgentApp object + +CDenAgentApp theApp; +LONG g_fAbortDownload; + +///////////////////////////////////////////////////////////////////////////// +// CDenAgentApp initialization + +bool CheckForHardwareMode () +{ + RegKey key; + + if (key.Open (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00", KEY_READ) != ERROR_SUCCESS) + { + return false; + } + + DWORD dwValue = 0; + + if (key.QueryDWORDValue ("UseHardware", dwValue) != ERROR_SUCCESS) + { + return false; + } + + return dwValue ? true : false; +} + +bool CheckForIE5OrLater () +{ + RegKey key; + + if (key.Open (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Internet Explorer", KEY_READ) != ERROR_SUCCESS) + return false; + + DWORD dwValue = 0; + + TCHAR szVersionBuffer[256]; + DWORD dwSize = sizeof (szVersionBuffer); + + if (key.QueryStringValue("Version", szVersionBuffer, &dwSize) != ERROR_SUCCESS) + return false; + + DWORD dwMajor = 0, dwMinor = 0, dwBuild1 = 0, dwBuild2 = 0; + + if (::_stscanf (szVersionBuffer, _T("%ld.%ld.%ld.%ld"), &dwMajor, &dwMinor, &dwBuild1, &dwBuild2) != 4) + return false; + + // IE 5.01 is build: 5.00.2919.6307 + return !( dwMajor < 5 || ( dwMajor == 5 && dwMinor == 0 ) && ( ( dwBuild1 < 2919 ) || ( dwBuild1 == 2919 && dwBuild2 < 6307 ) ) ); +} + +bool CDenAgentApp::getVersionString ( LPCTSTR szFilename, CString &strVersion ) +{ + DWORD dwDummy, + dwVerSize = ::GetFileVersionInfoSize( const_cast< LPTSTR > ( szFilename ), &dwDummy ); + if( dwVerSize == 0 ) + return false; + + BYTE *pbVersionInfo = reinterpret_cast< BYTE * >( ::_alloca( dwVerSize ) ); + + ::GetFileVersionInfo( const_cast< LPTSTR > ( szFilename ), 0, dwVerSize, pbVersionInfo ); + + VS_FIXEDFILEINFO *vffi; + UINT nLength = sizeof( VS_FIXEDFILEINFO ); + if( !::VerQueryValue( pbVersionInfo, _T( "\\" ), reinterpret_cast< LPVOID * >( &vffi ), &nLength ) ) + return false; + + // Got it, so format it + strVersion.FormatMessage ( IDS_VERSIONTEMPLATE, static_cast< int > ( HIWORD ( vffi->dwFileVersionMS ) ), + static_cast< int > ( LOWORD ( vffi->dwFileVersionMS ) ), static_cast< int > ( HIWORD ( vffi->dwFileVersionLS ) ), + static_cast< int > ( LOWORD ( vffi->dwFileVersionLS ) ) ); + + return true; +} + +bool CDenAgentApp::getVersionInfo ( LPCTSTR szFilename, int &iReleaseMajor, int &iReleaseMinor, int &iBuildMajor, int &iBuildMinor ) +{ + DWORD dwDummy, + dwVerSize = ::GetFileVersionInfoSize( const_cast< LPTSTR > ( szFilename ), &dwDummy ); + if( dwVerSize == 0 ) + return false; + + BYTE *pbVersionInfo = reinterpret_cast< BYTE * >( ::_alloca( dwVerSize ) ); + + ::GetFileVersionInfo( const_cast< LPTSTR > ( szFilename ), 0, dwVerSize, pbVersionInfo ); + + VS_FIXEDFILEINFO *vffi; + UINT nLength = sizeof( VS_FIXEDFILEINFO ); + if( !::VerQueryValue( pbVersionInfo, _T( "\\" ), reinterpret_cast< LPVOID * >( &vffi ), &nLength ) ) + return false; + + // Got it, so format it + iReleaseMajor = static_cast< int > ( HIWORD ( vffi->dwFileVersionMS ) ); + iReleaseMinor = static_cast< int > ( LOWORD ( vffi->dwFileVersionMS ) ); + iBuildMajor = static_cast< int > ( HIWORD ( vffi->dwFileVersionLS ) ); + iBuildMinor = static_cast< int > ( LOWORD ( vffi->dwFileVersionLS ) ); + + return true; +} + +bool CDenAgentApp::getACVersionString ( CString &strVersion ) +{ + RegKey rk; + if ( rk.Open ( HKEY_LOCAL_MACHINE, _T( "Software\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00" ) ) != ERROR_SUCCESS ) + { + ::AfxMessageBox ( IDE_NOCLIENTEXE, MB_ICONWARNING ); + return false; + } + + TCHAR szClientPath[ MAX_PATH ]; + DWORD dwPathLength = MAX_PATH; + if ( rk.QueryStringValue ( _T( "path" ), szClientPath, &dwPathLength ) != ERROR_SUCCESS ) + { + ::AfxMessageBox ( IDE_NOCLIENTEXE, MB_ICONWARNING ); + return false; + } + + ::_tcscpy ( szClientPath + ( dwPathLength - 1 ), _T( "\\client.exe" ) ); + + bool bHasVersion = getVersionString ( szClientPath, strVersion ); + + if ( !bHasVersion ) + ::AfxMessageBox ( IDE_NOCLIENTVER, MB_ICONWARNING ); + + return bHasVersion; +} + +bool CDenAgentApp::getCOMObjectDLL ( REFCLSID rclsid, CString &strFilename ) +{ + USES_CONVERSION; + + LPOLESTR oclsid; + HRESULT hRes = ::StringFromCLSID ( rclsid, &oclsid ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + LPCTSTR clsidName = OLE2T ( oclsid ); + ::CoTaskMemFree ( oclsid ); + + TCHAR keyName[ MAX_PATH ]; + ::_stprintf ( keyName, _T( "CLSID\\%s\\InprocServer32" ), clsidName ); + + RegKey rk; + if ( rk.Open ( HKEY_CLASSES_ROOT, keyName ) != ERROR_SUCCESS ) + return false; + + DWORD dwPathSize = MAX_PATH; + + long regResult = rk.QueryStringValue ( NULL, strFilename.GetBuffer ( MAX_PATH ), &dwPathSize ); + + strFilename.ReleaseBuffer(); + + if (regResult != ERROR_SUCCESS) + return false; + + // Check to see if the default KeyValue points to the MS.NET core DLL + const char *dotNetProxy = "mscoree.dll"; + + CString dotNetMatchString = strFilename.Right(strlen(dotNetProxy)); + + if (dotNetMatchString.CompareNoCase(dotNetProxy) == 0) + { + // Get CodeBase KeyValue - Should point to the Plugin DLL + dwPathSize = MAX_PATH; + if (rk.QueryStringValue ( "CodeBase", strFilename.GetBuffer ( MAX_PATH ), &dwPathSize ) == ERROR_SUCCESS) + { + // Release extra buffer (Not doing this seem to cause the Left() and Delete() funcs to fail) + strFilename.ReleaseBuffer(); + // Check for garbage in KeyValue and delete it + if (strFilename.Left(8) == "file:///") + strFilename.Delete(0,8); + } + else + { + // CodeBase isn't accessable - Possible that plugin is in GAC + // Return Path to MS.NET core DLL + dwPathSize = MAX_PATH; + if (rk.QueryStringValue ( NULL, strFilename.GetBuffer ( MAX_PATH ), &dwPathSize ) != ERROR_SUCCESS) + { + rk.Close(); + strFilename.ReleaseBuffer(); + return false; + } + } + } + rk.Close(); + return true; +} + +bool CDenAgentApp::getAgentPath ( LPCTSTR szFilename, CString &strPath ) +{ + TCHAR *szAgentPath = strPath.GetBuffer ( MAX_PATH ); + ::GetModuleFileName ( NULL, szAgentPath, MAX_PATH ); + + TCHAR *filePath = ::_tcsrchr ( szAgentPath, _T( '\\' ) ); + ::strcpy ( filePath + 1, szFilename ); + + return true; +} + +bool CDenAgentApp::checkXMLVersion ( CString &strClientVersion, CString &strXMLFile, CTrayWnd* pTrayWnd ) +{ + MSXML::IXMLDOMDocumentPtr pDoc; + + try + { + pDoc.CreateInstance ( __uuidof ( MSXML::DOMDocument ), NULL, CLSCTX_INPROC_SERVER ); + pDoc->async = false; + BOOL bSuccess = pDoc->load( static_cast< LPCTSTR > ( strXMLFile ) ); + + if( !bSuccess ) + { + std::string szXML; + DecryptXML( static_cast< LPCSTR >( strXMLFile ), szXML ); + + if( szXML != "" ) + bSuccess = pDoc->loadXML( _bstr_t( szXML.c_str() ) ); + } + + if( ! bSuccess ) + { + CString strMessage; + strMessage.FormatMessage ( IDE_NOXMLDOC, static_cast< LPCTSTR > ( strXMLFile ) ); + + CString strUpdate; + strUpdate.LoadString( IDE_UPDATETEXT ); + strMessage += strUpdate; + + if ( ::AfxMessageBox ( strMessage, MB_YESNO | MB_ICONERROR ) == IDYES ) + pTrayWnd->UpdateXMLFiles( ); + + return false; + } + + // Read the client version string + MSXML::IXMLDOMNodePtr pVersionNode = pDoc->selectSingleNode ( _T( "/*/@version" ) ); + if ( pVersionNode == NULL ) + { + CString strError; + + strError.FormatMessage ( IDE_NOXMLVER, static_cast< LPCTSTR > ( strXMLFile ) ); + ::AfxMessageBox ( strError, MB_ICONWARNING ); + + return false; + } + + _variant_t vXMLVer = pVersionNode->text; + if ( vXMLVer.vt != VT_BSTR ) + { + CString strError; + + strError.FormatMessage ( IDE_NOXMLVER, static_cast< LPCTSTR > ( strXMLFile ) ); + ::AfxMessageBox ( strError, MB_ICONWARNING ); + + return false; + } + + CString strXMLVer ( vXMLVer.bstrVal ); + if ( strClientVersion.Compare ( strXMLVer ) != 0 ) + { + CString str; + str.FormatMessage ( IDE_XMLCLIENTVERSIONMISMATCH, static_cast< LPCTSTR > ( strXMLFile ), + static_cast< LPCTSTR > ( strClientVersion ), static_cast< LPCTSTR > ( strXMLVer ) ); + + CString strUpdate; + strUpdate.LoadString( IDE_UPDATETEXT ); + str += strUpdate; + + if ( ::AfxMessageBox ( str, MB_YESNO | MB_ICONWARNING ) == IDYES ) + pTrayWnd->UpdateXMLFiles( ); + + return false; + } + + return true; + } + catch ( _com_error & ) + { + CString strMessage; + strMessage.FormatMessage ( IDE_NOXMLDOC, static_cast< LPCTSTR > ( strXMLFile ) ); + ::AfxMessageBox ( strMessage, MB_ICONERROR ); + } + + return true; +} + +void CDenAgentApp::DecryptXML( const char *szPath, std::string &szXML ) +{ + if( szPath == NULL ) + { + szXML = ""; + return; + } + + FILE *f = fopen( szPath, "rb" ); + if( f == NULL ) + { + szXML = ""; + return; + } + + szXML.clear(); + unsigned char szBuffer[1025]; + + try + { + CCryptProv crypt; + if( crypt.Initialize( PROV_RSA_FULL, "Decal_Memlocs", MS_DEF_PROV ) == NTE_BAD_KEYSET ) + crypt.Initialize( PROV_RSA_FULL, "Decal_Memlocs", MS_DEF_PROV, CRYPT_NEWKEYSET ); + + CCryptMD5Hash hash; + hash.Initialize( crypt ); + hash.AddString( DECAL_KEY ); + + CCryptDerivedKey key; + key.Initialize( crypt, hash ); + + DWORD dwDecLen = 0; + + while( ! feof(f) ) + { + memset( szBuffer, 0, sizeof( szBuffer ) ); + dwDecLen = fread( szBuffer, 1, 1024, f ); + key.Decrypt( feof(f), (BYTE *) szBuffer, &dwDecLen ); + szXML += (char *)szBuffer; + } + + key.Destroy(); + hash.Destroy(); + crypt.Release(); + } + + catch( ... ) + { + // crap... + szXML = ""; + } + + fclose( f ); +} + +bool CDenAgentApp::checkXMLVersions ( CTrayWnd* pTrayWnd ) +{ + bool bOK = true; + // Check the versions of the XML files + CString strClientVersion; + if ( getACVersionString ( strClientVersion ) ) + { + CString strXMLFile; + if ( getAgentPath ( _T( "memlocs.xml" ), strXMLFile ) ) + bOK = bOK && checkXMLVersion ( strClientVersion, strXMLFile, pTrayWnd ); + //if ( getAgentPath ( _T( "messages.xml" ), strXMLFile ) ) + //bOK = bOK && checkXMLVersion ( strClientVersion, strXMLFile ); + } + + return bOK; +} + +void CDenAgentApp::getXMLBuilds ( cXMLBuild *pFirst, cXMLBuild *pLast ) +{ + MSXML::IXMLDOMDocumentPtr pDoc; + pDoc.CreateInstance ( __uuidof ( MSXML::DOMDocument ), NULL, CLSCTX_INPROC_SERVER ); + pDoc->async = false; + + for ( ; pFirst != pLast; ++ pFirst ) + { + CString strPath; + getAgentPath ( pFirst->XMLFile, strPath ); + + try + { + BOOL bSuccess = pDoc->load( static_cast< LPCTSTR > ( pFirst->XMLFile ) ); + + if( ! bSuccess ) + { + std::string szXML; + DecryptXML( static_cast< LPCSTR >( pFirst->XMLFile ), szXML ); + + if( szXML != "" ) + bSuccess = pDoc->loadXML( _bstr_t( szXML.c_str() ) ); + } + + if( ! bSuccess ) + { + CString strMessage; + strMessage.FormatMessage( IDE_NOXMLDOC, pFirst->XMLFile ); + ::AfxMessageBox ( strMessage, MB_ICONERROR ); + + pFirst->build = 0; + continue; + } + + // Read the client version string + MSXML::IXMLDOMNodePtr pBuildNode = pDoc->selectSingleNode ( _T( "/*/@build" ) ); + if ( pBuildNode == NULL ) + { + pFirst->build = 0; + continue; + } + + pFirst->build = pBuildNode->GetnodeValue (); + } + catch ( _com_error & ) + { + pFirst->build = 0; + } + } +} + +BOOL CDenAgentApp::InitInstance() +{ + HWND hDenAgent = FindWindow(NULL, "Decal Agent"); + + if(hDenAgent) + { + ::MessageBox(hDenAgent, "Decal is already running!", "Decal", 0); + return FALSE; + } + + if (!CheckForHardwareMode ()) + { + ::MessageBox + ( + NULL, + _T("Decal requires Asheron's Call to be installed with hardware 3d acceleration enabled! Decal will run, but will be unable to display any UI in-game."), + _T("Decal Agent Startup Warning"), + MB_OK + ); + } + + if (!CheckForIE5OrLater ()) + { + ::MessageBox + ( + NULL, + "Decal requires Internet Explorer 5.01 or later!", + "Decal Agent Startup Error", + MB_OK + ); + + return FALSE; + } + + if (!InitATL()) + return FALSE; + + + CCommandLineInfo cmdInfo; + ParseCommandLine(cmdInfo); + + if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) + { + return TRUE; + } + + // Set our current directory to the path of DenAgent.exe + // TODO: Fix all the code so that it doesn't rely on the current directory + TCHAR szAppPath[MAX_PATH]; + ::memset (szAppPath, 0, sizeof (szAppPath)); + ::GetModuleFileName (0, szAppPath, MAX_PATH); + + TCHAR *szLastSlash = ::_tcsrchr (szAppPath, _T('\\')); + if (szLastSlash) + { + *szLastSlash = 0; + ::SetCurrentDirectory (szAppPath); + } + + // Move V1 plugins into the V2 registry format + importV1Plugins (); + + // Standard initialization + // If you are not using these features and wish to reduce the size + // of your final executable, you should remove from the following + // the specific initialization routines you do not need. + m_pTrayWnd = new CTrayWnd; + m_pMainWnd = m_pTrayWnd; + + m_pTrayWnd->CreateEx( 0, ::AfxRegisterWndClass( 0, NULL, NULL, NULL ), _T( "Decal Agent" ), WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL ); + + checkXMLVersions ( m_pTrayWnd ); + + return TRUE; +} + + +CDenAgentModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +END_OBJECT_MAP() + +LONG CDenAgentModule::Unlock() +{ + AfxOleUnlockApp(); + return 0; +} + +LONG CDenAgentModule::Lock() +{ + AfxOleLockApp(); + return 1; +} +LPCTSTR CDenAgentModule::FindOneOf(LPCTSTR p1, LPCTSTR p2) +{ + while (*p1 != NULL) + { + LPCTSTR p = p2; + while (*p != NULL) + { + if (*p1 == *p) + return CharNext(p1); + p = CharNext(p); + } + p1++; + } + return NULL; +} + +int CDenAgentApp::ExitInstance() +{ + delete m_pTrayWnd; + + if (m_bATLInited) + { + _Module.RevokeClassObjects(); + _Module.Term(); + CoUninitialize(); + } + + return CWinApp::ExitInstance(); + +} + +void CDenAgentApp::importV1Plugins () +{ + USES_CONVERSION; + + RegKey hkGroup; + if ( hkGroup.Open ( HKEY_LOCAL_MACHINE, _T ( "Software\\Decal\\Plugins" ) ) != ERROR_SUCCESS ) + // No plugins - no problem + return; + + DWORD dwValues = 0; + ::RegQueryInfoKey ( hkGroup, NULL, NULL, NULL, NULL, NULL, NULL, &dwValues, NULL, NULL, NULL, NULL ); + + // Now - iterate through the values backwards + for ( int i = dwValues - 1; i >= 0; -- i ) + { + TCHAR szCLSID[ 64 ]; + DWORD dwCLSID = sizeof ( szCLSID ); + DWORD dwEnabled; + DWORD dwEnabledSize = sizeof ( dwEnabled ); + + if ( ::RegEnumValue ( hkGroup, i, szCLSID, &dwCLSID, NULL, NULL, reinterpret_cast< BYTE * > ( &dwEnabled ), &dwEnabledSize ) != ERROR_SUCCESS ) + continue; + + // Try and convert the name to a CLSID + CLSID clsidPlugin; + HRESULT hRes = ::CLSIDFromString ( T2OLE ( szCLSID ), &clsidPlugin ); + if ( FAILED ( hRes ) ) + continue; + + // Delete the value and ask questions later + hkGroup.DeleteValue ( szCLSID ); + + // Try and create a key to extract the friendly name + CComPtr< IPlugin > pPlugin; + hRes = ::CoCreateInstance ( clsidPlugin, NULL, CLSCTX_INPROC_SERVER, __uuidof ( IPlugin ), + reinterpret_cast< LPVOID * > ( &pPlugin ) ); + + if ( FAILED ( hRes ) ) + // Bad plugin - skip + continue; + + CComBSTR strName; + pPlugin->get_FriendlyName ( &strName ); + + // Create the Real registry key + // Key configuration copied from Decal/cActiveXSurrogate::Register + RegKey hkeyItem; + if ( hkeyItem.Create ( hkGroup, szCLSID ) != ERROR_SUCCESS ) + continue; + + // Friendly name + hkeyItem.SetStringValue( NULL, OLE2T( strName ) ); + // Enabled by default + hkeyItem.SetDWORDValue( _T( "Enabled" ), dwEnabled ); + // The V1 surrogate + hkeyItem.SetStringValue( _T( "Surrogate" ), _T( "{3D837F6E-B5CA-4604-885F-7AB45FCFA62A}" ) ); + hkeyItem.Close(); + } +} + +BOOL CDenAgentApp::InitATL() +{ + m_bATLInited = TRUE; + + HRESULT hRes = CoInitialize(NULL); + + if (FAILED(hRes)) + { + m_bATLInited = FALSE; + return FALSE; + } + + _Module.Init(ObjectMap, AfxGetInstanceHandle()); + _Module.dwThreadID = GetCurrentThreadId(); + + LPTSTR lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT + TCHAR szTokens[] = _T("-/"); + + BOOL bRun = TRUE; + LPCTSTR lpszToken = _Module.FindOneOf(lpCmdLine, szTokens); + while (lpszToken != NULL) + { + if (lstrcmpi(lpszToken, _T("UnregServer"))==0) + { + _Module.UpdateRegistryFromResource(IDR_DENAGENT, FALSE); + _Module.UnregisterServer(TRUE); //TRUE means typelib is unreg'd + bRun = FALSE; + break; + } + if (lstrcmpi(lpszToken, _T("RegServer"))==0) + { + _Module.UpdateRegistryFromResource(IDR_DENAGENT, TRUE); + _Module.RegisterServer(TRUE); + bRun = FALSE; + break; + } + lpszToken = _Module.FindOneOf(lpszToken, szTokens); + } + + if (!bRun) + { + m_bATLInited = FALSE; + _Module.Term(); + CoUninitialize(); + return FALSE; + } + + hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, + REGCLS_MULTIPLEUSE); + if (FAILED(hRes)) + { + m_bATLInited = FALSE; + CoUninitialize(); + return FALSE; + } + + return TRUE; + +} diff --git a/Native/DenAgent/DenAgent.dsp b/Native/DenAgent/DenAgent.dsp new file mode 100644 index 0000000..d070112 --- /dev/null +++ b/Native/DenAgent/DenAgent.dsp @@ -0,0 +1,260 @@ +# Microsoft Developer Studio Project File - Name="DenAgent" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=DenAgent - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "DenAgent.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "DenAgent.mak" CFG="DenAgent - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "DenAgent - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "DenAgent - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "DenAgent - Win32 Release" + +# PROP BASE Use_MFC 6 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 6 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /Oa /Og /Oi /Os /Oy /Ob1 /I "..\Include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR /Yu"stdafx.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /I "..\Include" /D "NDEBUG" /Oicf /win32 +# ADD BASE RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL" +# ADD RSC /l 0x1009 /d "NDEBUG" /d "_AFXDLL" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386 +# ADD LINK32 ..\Release\Inject.lib version.lib shlwapi.lib ..\include\forcelibrary.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" + +!ELSEIF "$(CFG)" == "DenAgent - Win32 Debug" + +# PROP BASE Use_MFC 6 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 6 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /I "..\Include" /D "_DEBUG" /Oicf /win32 +# ADD BASE RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL" +# ADD RSC /l 0x1009 /d "_DEBUG" /d "_AFXDLL" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 ..\debug\Inject.lib version.lib shlwapi.lib ..\include\forcelibrary.lib /nologo /subsystem:windows /debug /machine:I386 + +!ENDIF + +# Begin Target + +# Name "DenAgent - Win32 Release" +# Name "DenAgent - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\AddRemoveDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\AutoUpdate.cpp +# End Source File +# Begin Source File + +SOURCE=.\BindStatusCallback.cpp +# End Source File +# Begin Source File + +SOURCE=.\ChangePluginDirectory.cpp +# End Source File +# Begin Source File + +SOURCE=.\DenAgent.cpp +# End Source File +# Begin Source File + +SOURCE=.\DenAgent.idl +# ADD MTL /h "DenAgent_i.h" /iid "DenAgent_i.c" /Oicf +# End Source File +# Begin Source File + +SOURCE=.\DenAgent.rc +# End Source File +# Begin Source File + +SOURCE=.\DenAgentDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\DownloadDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\DownloaderDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\OptionsDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\TrayWnd.cpp +# End Source File +# Begin Source File + +SOURCE=.\URLCallback.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\AddRemoveDlg.h +# End Source File +# Begin Source File + +SOURCE=.\AutoUpdate.h +# End Source File +# Begin Source File + +SOURCE=.\BindStatusCallback.h +# End Source File +# Begin Source File + +SOURCE=.\ChangePluginDirectory.h +# End Source File +# Begin Source File + +SOURCE=.\DenAgent.h +# End Source File +# Begin Source File + +SOURCE=.\DenAgentDlg.h +# End Source File +# Begin Source File + +SOURCE=.\DownloadDlg.h +# End Source File +# Begin Source File + +SOURCE=.\DownloaderDlg.h +# End Source File +# Begin Source File + +SOURCE=.\OptionsDlg.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\TrayWnd.h +# End Source File +# Begin Source File + +SOURCE=.\URLCallback.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\res\bitmap1.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\cursor1.cur +# End Source File +# Begin Source File + +SOURCE=.\res\DenAgent.ico +# End Source File +# Begin Source File + +SOURCE=.\res\DenAgent.rc2 +# End Source File +# Begin Source File + +SOURCE=.\DenAgent.rgs +# End Source File +# Begin Source File + +SOURCE=.\res\groups.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\idr_tray.ico +# End Source File +# Begin Source File + +SOURCE=.\Images.bmp +# End Source File +# Begin Source File + +SOURCE=.\ImagesMask.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\version_.bmp +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project +# Section DenAgent : {0050004F-0045-0052-5400-59005F005200} +# 1:12:IDR_DENAGENT:103 +# End Section diff --git a/Native/DenAgent/DenAgent.h b/Native/DenAgent/DenAgent.h new file mode 100644 index 0000000..6aea954 --- /dev/null +++ b/Native/DenAgent/DenAgent.h @@ -0,0 +1,87 @@ +// DenAgent.h : main header file for the DENAGENT application +// + +#if !defined(AFX_DENAGENT_H__A4F37F75_E088_4616_9AC5_3B39579BC3BB__INCLUDED_) +#define AFX_DENAGENT_H__A4F37F75_E088_4616_9AC5_3B39579BC3BB__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#ifndef __AFXWIN_H__ + #error include 'stdafx.h' before including this file for PCH +#endif + +#include "resource.h" // main symbols +#include "DenAgent_i.h" + +class CTrayWnd; + + +// the public key to unencrypt xmls +#include "..\include\DecalKey.h" + +///////////////////////////////////////////////////////////////////////////// +// CDenAgentApp: +// See DenAgent.cpp for the implementation of this class +// + +class CDenAgentApp : public CWinApp +{ +public: + CDenAgentApp(); + + // Returns the formatted string of the AC version + static bool getVersionString ( LPCTSTR szFilename, CString &strVersion ); + static bool getVersionInfo ( LPCTSTR szFilename, int &iReleaseMajor, int &iReleaseMinor, int &iBuildMajor, int &iBuildMinor ); + static bool getACVersionString ( CString &strVersion ); + static bool getCOMObjectDLL ( REFCLSID rclsid, CString &strFilename ); + + // decrypts xml file + static void DecryptXML( const char *szPath, std::string &szXML ); + + // Prepends the agent path to a filename + static bool getAgentPath ( LPCTSTR szFilename, CString &strPath ); + static bool checkXMLVersion ( CString &strClientVersion, CString &strXMLFile, CTrayWnd* pTrayWnd ); + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDenAgentApp) + public: + virtual BOOL InitInstance(); + virtual int ExitInstance(); + //}}AFX_VIRTUAL + + // Implementation + static void importV1Plugins (); + + // Helper functions + static bool checkXMLVersions ( CTrayWnd* pTrayWnd ); + + struct cXMLBuild + { + LPCTSTR XMLFile; + long build; + }; + + static void getXMLBuilds ( cXMLBuild *pFirst, cXMLBuild *pLast ); + + //{{AFX_MSG(CDenAgentApp) + // NOTE - the ClassWizard will add and remove member functions here. + // DO NOT EDIT what you see in these blocks of generated code ! + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +private: + BOOL m_bATLInited; +private: + BOOL InitATL(); + CTrayWnd* m_pTrayWnd; +}; + + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DENAGENT_H__A4F37F75_E088_4616_9AC5_3B39579BC3BB__INCLUDED_) diff --git a/Native/DenAgent/DenAgent.idl b/Native/DenAgent/DenAgent.idl new file mode 100644 index 0000000..344109b --- /dev/null +++ b/Native/DenAgent/DenAgent.idl @@ -0,0 +1,29 @@ + + // DenAgent.idl : IDL source for DenAgent.exe +// +// This file will be processed by the MIDL tool to +// produce the type library (DenAgent.tlb) and marshalling code. +import "oaidl.idl"; +import "ocidl.idl"; + [ + object, + uuid(13B57D9E-F277-4014-B6A9-17CD90B4FFAB), + + helpstring("IURLCallback Interface"), + pointer_default(unique) + ] + interface IURLCallback : IUnknown + { + }; +[ + uuid(5504FC1C-B2A3-43F6-B9CE-E3B3282273B7), + version(1.0), + helpstring("DenAgent 1.0 Type Library") +] +library DenAgentLib +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + interface IURLCallback; +}; diff --git a/Native/DenAgent/DenAgent.rc b/Native/DenAgent/DenAgent.rc new file mode 100644 index 0000000..86cf241 --- /dev/null +++ b/Native/DenAgent/DenAgent.rc @@ -0,0 +1,576 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "../Include/DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral (Default) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUD) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_TRAYICON ICON "res\\idr_tray.ico" +#endif // Neutral (Default) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// 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. +IDR_MAINFRAME ICON "res\\DenAgent.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DENAGENT_DIALOG DIALOGEX 0, 0, 265, 215 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Decal Agent" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,208,194,50,14 + LTEXT "Choose the Plugins you'd like to run. Click update to download the latest Messages and MemLocs files from the web.", + IDC_STATIC,7,7,251,17 + PUSHBUTTON "Refresh List",IDC_REFRESH,208,176,50,14 + PUSHBUTTON "Add",IDC_ADDREMOVE,208,65,50,14 + PUSHBUTTON "Update",IDC_UPDATE,208,30,50,14 + PUSHBUTTON "Options",IDC_OPTIONS,208,48,50,14 + LTEXT "messages",IDC_MESSAGES_TEXT,74,175,127,8 + LTEXT "memlocs",IDC_MEMLOCS_TEXT,74,187,127,8 + LTEXT "decalplugins",IDC_DECALPLUGINS_TEXT,74,200,127,8 + LTEXT "Messages:",IDC_STATIC,7,175,35,8 + LTEXT "Memory Locations:",IDC_STATIC,7,187,60,8 + LTEXT "Decal Plugins List:",IDC_STATIC,7,200,59,8 + CONTROL "List1",IDC_PLUGINS,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | + LVS_NOCOLUMNHEADER | WS_TABSTOP,7,30,194,140, + WS_EX_CLIENTEDGE + PUSHBUTTON "Remove",IDC_DELETE,208,83,50,14 + PUSHBUTTON "Export",IDC_EXPORT,208,128,50,16 +END + +IDD_ADDREMOVE DIALOGEX 0, 0, 301, 171 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Add/Remove Plugins" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,244,7,50,14 + CONTROL "List1",IDC_PLUGINS,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_TABSTOP,7,7,230, + 157,WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE + PUSHBUTTON "Visit Website",IDC_INSTALL,244,28,50,14 + PUSHBUTTON "Upgrade",IDC_UPGRADE,245,150,50,14,NOT WS_VISIBLE | + WS_DISABLED + PUSHBUTTON "Browse",IDC_BROWSE,244,71,50,14 + PUSHBUTTON "Refresh",IDC_REFRESH,244,50,50,14 +END + +IDD_DOWNLOAD DIALOG 0, 0, 203, 71 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Downloading Component" +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Cancel",IDC_STOPDOWNLOAD,146,50,50,14,WS_DISABLED + LTEXT "Status Text",IDC_STATUSTEXT,7,7,189,8 + CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,7,18, + 189,14 + LTEXT "Status Text",IDC_CUSTOMSTATUS,7,35,189,8 +END + +IDD_CHANGEDIR DIALOG 0, 0, 236, 49 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Change Decal URL" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,179,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,179,28,50,14 + EDITTEXT IDC_NEWURL,7,28,165,14,ES_AUTOHSCROLL + LTEXT "Type the full URL of the new Decal XML Directory", + IDC_STATIC,7,7,165,14,SS_CENTERIMAGE +END + +IDD_OPTIONS DIALOGEX 0, 0, 271, 221 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Decal Options" +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + DEFPUSHBUTTON "OK",IDOK,155,200,50,14 + PUSHBUTTON "Cancel",IDCANCEL,214,200,50,14 + EDITTEXT IDC_BARALPHA,59,16,45,14,ES_CENTER | ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + CONTROL "",IDC_BARALPHA_SPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,93,16,11, + 14 + EDITTEXT IDC_VIEWALPHA,59,31,45,14,ES_CENTER | ES_AUTOHSCROLL | + ES_NUMBER + CONTROL "Spin2",IDC_VIEWALPHA_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,93,31,11,14 + GROUPBOX "View Options",IDC_STATIC,7,7,257,157 + CTEXT "Bar Alpha",IDC_STATIC,17,20,35,8,SS_CENTERIMAGE | NOT + WS_GROUP + CTEXT "View Alpha",IDC_STATIC,19,34,35,8,SS_CENTERIMAGE | NOT + WS_GROUP + CTEXT "0 is Transparent - 255 is Opaque",IDC_STATIC,21,46,106, + 9 + CONTROL "Use Hardware Mode",IDC_BLENDINGGDIPLUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,144,16,114,9 + CONTROL "Multiple Views",IDC_VIEWMULTI,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,144,26,114,9 + CONTROL "Adjust Bar for Radar",IDC_RADARYES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,144,36,114,9 + CONTROL "Use Old Injection Method",IDC_OLDINJECT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,144,46,114,10 + GROUPBOX "Font Options",IDC_STATIC,14,66,244,28 + CONTROL "Default",IDC_DEFAULT_FONT_RADIO,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,21,78,39,10 + CONTROL "AC Client",IDC_CLIENT_FONT_RADIO,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,64,78,45,10 + CONTROL "Custom",IDC_CUSTOM_FONT_RADIO,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,111,78,39,10 + EDITTEXT IDC_CUSTOM_FONT_EDIT,151,76,98,12,ES_AUTOHSCROLL + GROUPBOX "Time Stamping",IDC_STATIC,14,95,244,27 + CONTROL "Enabled",IDC_TIMESTAMPON,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,21,108,44,9,WS_EX_RIGHT | WS_EX_RTLREADING + LTEXT "Color",IDC_STATIC,71,108,19,11 + COMBOBOX IDC_FORMATCLR,92,105,29,67,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Format",IDC_STATIC,123,108,25,9 + EDITTEXT IDC_FORMATSTR,151,105,88,12,ES_AUTOHSCROLL + PUSHBUTTON "?",IDC_FORMATHELP,244,105,7,12 + GROUPBOX "Client Patches",IDC_STATIC,14,122,139,35 + CONTROL "Dual Log",IDC_DUALLOG,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,21,131,44,11 + CONTROL "Windowed Mode",IDC_WINDOWED,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,21,143,71,11 + CONTROL "No Movies",IDC_NOMOVIES,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,91,130,47,11 + CONTROL "No Logos",IDC_NOLOGOS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,91,142,45,11 + PUSHBUTTON "?",IDC_PATCHHELP,139,135,10,15 + GROUPBOX "Decal Bar Docking Position",IDC_STATIC,155,122,103,35 + COMBOBOX IDC_DOCKPOS,159,135,92,43,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + GROUPBOX "Decal Update URL",IDC_STATIC,7,166,257,28 + LTEXT "http://decal.acdev.org",IDC_PLUGINDIR,14,178,169,8, + SS_CENTERIMAGE + PUSHBUTTON "Change",IDC_CHANGE_DIR,208,175,50,14 + CONTROL "Start on Bootup",IDC_CHECK_AUTOSTART,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,202,63,12 + PUSHBUTTON "Reset Bar Position",IDC_BTN_RESET,81,200,68,14 +END + +IDD_DOWNLOADER DIALOG 0, 0, 202, 86 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Downloading Components" +FONT 8, "MS Sans Serif" +BEGIN + PUSHBUTTON "Cancel",IDC_STOPDOWNLOAD,145,65,50,14 + LTEXT "Status Text",IDC_STATUSTEXT,5,5,189,8 + CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,5,16, + 189,14 + LTEXT "Status Text",IDC_CUSTOMSTATUS,5,33,189,8 + CONTROL "Progress1",IDC_PROGRESSTOTAL,"msctls_progress32",0x0,5, + 45,189,14 + LTEXT "Dowloading File 1 of 3",IDC_STATUSTOTAL,55,67,80,8 + LTEXT "Total Progress:",IDC_STATUST,5,67,50,8 +END + +IDD_EXPORT DIALOGEX 0, 0, 231, 186 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "Export Decal List" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Export",IDC_STATIC,7,7,140,26 + CONTROL "Enabled",IDC_CHKENABLED,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,17,17,41,8 + CONTROL "Location",IDC_CHKLOC,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,61,17,41,8 + CONTROL "CLSID",IDC_CHKCLSID,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,106,17,34,8 + PUSHBUTTON "&Export",IDC_BTNEXPORT,151,11,69,20 + EDITTEXT IDC_EDITEXPORT,7,37,217,142,ES_MULTILINE | + ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | + WS_VSCROLL | WS_HSCROLL +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "DenAgent is the program that manages Decal settings" + VALUE "FileDescription", "DenAgent MFC Application" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "DenAgent" + VALUE "LegalCopyright", "Copyright (C) 2000, 2001" + VALUE "OriginalFilename", "DenAgent.EXE" + VALUE "ProductName", "DenAgent Application" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DENAGENT_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 258 + VERTGUIDE, 67 + VERTGUIDE, 74 + VERTGUIDE, 201 + VERTGUIDE, 208 + TOPMARGIN, 7 + BOTTOMMARGIN, 208 + HORZGUIDE, 24 + HORZGUIDE, 30 + HORZGUIDE, 44 + HORZGUIDE, 48 + HORZGUIDE, 90 + HORZGUIDE, 113 + HORZGUIDE, 144 + HORZGUIDE, 170 + HORZGUIDE, 175 + END + + IDD_ADDREMOVE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 294 + VERTGUIDE, 237 + VERTGUIDE, 244 + TOPMARGIN, 7 + BOTTOMMARGIN, 164 + HORZGUIDE, 21 + HORZGUIDE, 28 + END + + IDD_DOWNLOAD, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 196 + TOPMARGIN, 7 + BOTTOMMARGIN, 64 + HORZGUIDE, 43 + HORZGUIDE, 50 + END + + IDD_CHANGEDIR, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 229 + VERTGUIDE, 172 + VERTGUIDE, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 42 + HORZGUIDE, 21 + HORZGUIDE, 28 + END + + IDD_OPTIONS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 264 + VERTGUIDE, 14 + VERTGUIDE, 258 + TOPMARGIN, 7 + BOTTOMMARGIN, 214 + END + + IDD_DOWNLOADER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 195 + TOPMARGIN, 7 + BOTTOMMARGIN, 79 + END + + IDD_EXPORT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 224 + TOPMARGIN, 7 + BOTTOMMARGIN, 179 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_POPUPS MENU +BEGIN + POPUP "SYSTRAY" + BEGIN + MENUITEM "Configure", ID_SYSTRAY_CONFIGURE + MENUITEM "Exit", ID_SYSTRAY_EXIT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Toolbar +// + +IDR_VERSION_STATES TOOLBAR 21, 20 +BEGIN + BUTTON IDC_STATIC + BUTTON IDC_STATIC + BUTTON IDC_STATIC + BUTTON IDC_STATIC +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDR_VERSION_STATES BITMAP "res\\version_.bmp" +IDB_IMAGES BITMAP "Images.bmp" +IDB_BITMAP1 BITMAP "res\\bitmap1.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog Info +// + +IDD_OPTIONS DLGINIT +BEGIN + IDC_FORMATCLR, 0x403, 2, 0 +0x002d, + IDC_FORMATCLR, 0x403, 2, 0 +0x0030, + IDC_FORMATCLR, 0x403, 2, 0 +0x0031, + IDC_FORMATCLR, 0x403, 2, 0 +0x0032, + IDC_FORMATCLR, 0x403, 2, 0 +0x0033, + IDC_FORMATCLR, 0x403, 2, 0 +0x0034, + IDC_FORMATCLR, 0x403, 2, 0 +0x0035, + IDC_FORMATCLR, 0x403, 2, 0 +0x0036, + IDC_FORMATCLR, 0x403, 2, 0 +0x0037, + IDC_FORMATCLR, 0x403, 2, 0 +0x0038, + IDC_FORMATCLR, 0x403, 2, 0 +0x0039, + IDC_FORMATCLR, 0x403, 3, 0 +0x3031, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3131, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3231, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3331, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3431, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3531, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3631, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3731, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3831, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3931, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3032, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3132, "\000" + IDC_FORMATCLR, 0x403, 3, 0 +0x3232, "\000" + IDC_DOCKPOS, 0x403, 4, 0 +0x6f54, 0x0070, + IDC_DOCKPOS, 0x403, 5, 0 +0x654c, 0x7466, "\000" + IDC_DOCKPOS, 0x403, 6, 0 +0x6952, 0x6867, 0x0074, + 0 +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_GROUPS BITMAP "res\\groups.bmp" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "#ifdef _WIN32\r\n" + "LANGUAGE 9, 1\r\n" + "#pragma code_page(1252)\r\n" + "#endif //_WIN32\r\n" + "#include ""res\\DenAgent.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_DENAGENT REGISTRY "DenAgent.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDE_NOCLIENTEXE "Could not locate client.exe" + IDE_NOCLIENTVER "Could not extract version information from client.exe" + IDS_VERSIONTEMPLATE "%1!d!.%2!d!.%3!d!.%4!d!" + IDE_NOXMLDOC "Could not load the xml document: %1 - it may be missing or malformed." + IDE_NOXMLVER "Could not locate the version in the XML document.\r\n(xml doc=%1)" + IDE_XMLCLIENTVERSIONMISMATCH + "The client version does not match the XML version, this may cause some plugins to malfunction.\r\n(xmldoc=%1 client version=%2 xml version=%3)" + IDE_UPDATETEXT "\r\n\r\nUpdating your XML files will correct this problem. Would you like to update now?" +END + +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE 9, 1 +#pragma code_page(1252) +#endif //_WIN32 +#include "res\DenAgent.rc2" // non-Microsoft Visual C++ edited resources +#include "afxres.rc" // Standard components +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/DenAgent/DenAgent.rgs b/Native/DenAgent/DenAgent.rgs new file mode 100644 index 0000000..06f8e4a --- /dev/null +++ b/Native/DenAgent/DenAgent.rgs @@ -0,0 +1,11 @@ +HKCR +{ + NoRemove AppID + { + {19A473FE-ED5F-4A68-8920-DD5D0D3E4B41} = s 'DenAgent' + 'DenAgent.EXE' + { + val AppID = s {19A473FE-ED5F-4A68-8920-DD5D0D3E4B41} + } + } +} diff --git a/Native/DenAgent/DenAgent.vcproj b/Native/DenAgent/DenAgent.vcproj new file mode 100644 index 0000000..182d668 --- /dev/null +++ b/Native/DenAgent/DenAgent.vcproj @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/DenAgent/DenAgentDlg.cpp b/Native/DenAgent/DenAgentDlg.cpp new file mode 100644 index 0000000..5f61bb1 --- /dev/null +++ b/Native/DenAgent/DenAgentDlg.cpp @@ -0,0 +1,844 @@ +// DenAgentDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "DenAgentDlg.h" +#include "DownloaderDlg.h" +#include "OptionsDlg.h" +#include "ExportDlg.h" +#include "TrayWnd.h" +#include "AutoUpdate.h" + +#include "..\Inject\InjectApi.h" + +#include "AddRemoveDlg.h" +#include ".\denagentdlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDenAgentDlg dialog + +CDenAgentDlg::CDenAgentDlg(CWnd* pParent /*=NULL*/) + : CDialog(CDenAgentDlg::IDD, pParent), + m_pCurrentDrag ( NULL ), m_bDoingUpdate( false ), m_bDoUpdate( false ) +{ + //{{AFX_DATA_INIT(CDenAgentDlg) + //}}AFX_DATA_INIT + + // Load the icon, unload will be done automagically + m_hIcon = AfxGetApp()->LoadIcon(IDR_TRAYICON); +} + +void CDenAgentDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CDenAgentDlg) + DDX_Control(pDX, IDC_PLUGINS, m_wndPlugins); + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CDenAgentDlg, CDialog) + //{{AFX_MSG_MAP(CDenAgentDlg) + ON_BN_CLICKED(IDC_REFRESH, OnRefresh) + ON_BN_CLICKED(IDC_ADDREMOVE, OnAddremove) + ON_BN_CLICKED(IDC_UPDATE, OnUpdate) + ON_BN_CLICKED(IDC_OPTIONS, OnOptions) + ON_NOTIFY(LVN_DELETEITEM, IDC_PLUGINS, OnDeleteitemPlugins) + ON_NOTIFY(NM_CLICK, IDC_PLUGINS, OnClickPlugins) + ON_NOTIFY(LVN_BEGINDRAG, IDC_PLUGINS, OnBegindragPlugins) + ON_WM_MOUSEMOVE() + ON_WM_LBUTTONUP() + //}}AFX_MSG_MAP + ON_BN_CLICKED(IDC_DELETE, OnBnClickedDelete) + ON_BN_CLICKED(IDC_EXPORT, OnBnClickedExport) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDenAgentDlg message handlers + +BOOL CDenAgentDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + SetForegroundWindow(); + BringWindowToTop(); + + // Create the decal object + HRESULT hRes = ::CoCreateInstance ( __uuidof ( Decal ), NULL, CLSCTX_INPROC_SERVER, __uuidof ( IDecal ), + reinterpret_cast< LPVOID * > ( &m_pDecal ) ); + + // Set up the list control and image list + m_groups.Create ( IDB_GROUPS, 16, 0, RGB(255,0,255)); + m_wndPlugins.SetImageList ( &m_groups, LVSIL_SMALL ); + + // Prepare the column list + CRect rcListClient; + m_wndPlugins.GetClientRect ( rcListClient ); + + CClientDC dcList ( &m_wndPlugins ); + dcList.SelectObject ( m_wndPlugins.GetFont () ); + + int nVersionWidth = dcList.GetTextExtent ( CString ( _T( "100.00.00.00001" ) ) ).cx; + + m_wndPlugins.InsertColumn ( 0, _T( "Component" ), LVCFMT_LEFT, rcListClient.Width () - nVersionWidth - 16, 0 ); + m_wndPlugins.InsertColumn ( 1, _T( "Version" ), LVCFMT_RIGHT, nVersionWidth, 1 ); + + m_wndPlugins.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP ); + + if ( FAILED ( hRes ) ) + { + AfxMessageBox ( _T( "Failed to create Decal Object." ) ); + EndDialog ( IDCANCEL ); + return FALSE; + } + + loadPluginList (); + + // Set the icon into the window for runtime + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + TCHAR szModule[ MAX_PATH ]; + ::GetModuleFileName ( NULL, szModule, MAX_PATH ); + + CString strVersion; + CDenAgentApp::getVersionString ( szModule, strVersion ); + CDenAgentApp::getVersionInfo ( szModule, iReleaseMajor, iReleaseMinor, iBuildMajor, iBuildMinor ); + + SetWindowText( CString("Decal Agent ") + strVersion ); + + updateFileInfo(); + + return TRUE; // return TRUE unless you set the focus to a control +} + +void CDenAgentDlg::OnRefresh() +{ + loadPluginList (); +} + +void CDenAgentDlg::OnAddremove() +{ + CFile cf; + CFileStatus cfs; + + RegKey key; + CString strDecalPlugins("decalplugins.xml"); + + if( key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" )) == ERROR_SUCCESS ) + { + TCHAR szDecalDirectory[ MAX_PATH + 1]; + DWORD dwSize = MAX_PATH; + + if(key.QueryStringValue( _T( "AgentPath" ), szDecalDirectory, &dwSize )==ERROR_SUCCESS) + { + strDecalPlugins = CString(szDecalDirectory) + "\\decalplugins.xml"; + } + } + + if(!cf.GetStatus(strDecalPlugins, cfs)) + { + if(MessageBox("Your list of Decal Components is missing.\n\nWould like to Download them?", NULL, MB_YESNO)==IDYES) + OnUpdate(); + } + else + { + + CTime modification_time = cfs.m_mtime; + CTime now = CTime::GetCurrentTime (); + + if((modification_time.GetDay() < now.GetDay()) && (modification_time.GetMonth() <= now.GetMonth()) && (modification_time.GetYear() <= now.GetYear())) + if(MessageBox("Your list of Decal Components are outdated.\n\nWould you like to Update?", NULL, MB_YESNO)==IDYES) + { + m_bDoingUpdate = true; + OnUpdate(); + } + } + + cAddRemoveDlg dlg( this ); + dlg.m_pDecal = m_pDecal; + dlg.DoModal (); + + loadPluginList (); +} + +int CDenAgentDlg::getDragInsertBefore ( CPoint &ptClient ) +{ + _ASSERTE ( m_pCurrentDrag != NULL ); + + CRect rc; + m_wndPlugins.GetWindowRect ( rc ); + ScreenToClient ( rc ); + + ptClient.x = ptClient.x - rc.left; + ptClient.y = ptClient.y - rc.top; + + int nItemHit = m_wndPlugins.HitTest ( ptClient ); + + if ( nItemHit != -1 ) + { + cPlugin *pPlugin = reinterpret_cast< cPlugin * > ( m_wndPlugins.GetItemData ( nItemHit ) ); + if ( pPlugin != NULL && pPlugin->m_dragimage == m_pCurrentDrag->m_dragimage ) + return nItemHit; + } + + return -1; +} + +///////////////////////////////////////////////////////////////////////////// +// Tries to update the local copy of decal +///////////////////////////////////////////////////////////////////////////// + +void CDenAgentDlg::updateDecal(_variant_t vCodeBase) { + USES_CONVERSION; + + if (MessageBox("A New Version of Decal exists.\n\nWould you like to Update?",NULL, MB_ICONQUESTION | MB_YESNO) == IDYES) { + ShellExecute(m_hWnd,"open",OLE2A(vCodeBase.bstrVal),0,0,0); + EndDialog(0); + GetParent()->DestroyWindow(); + PostQuitMessage(0); + } +} + +struct cPluginGroup +{ + LPCTSTR m_groupName, + m_groupKey; + int m_iconIndex; +}; + +void CDenAgentDlg::loadPluginList () +{ + m_wndPlugins.SetRedraw ( FALSE ); + + int nTop = m_wndPlugins.GetTopIndex (); + + // Save the original selection + GUID idSelected = GUID_NULL; + { + POSITION pos = m_wndPlugins.GetFirstSelectedItemPosition (); + if ( pos != NULL ) + { + int nSelected = m_wndPlugins.GetNextSelectedItem ( pos ); + cPlugin *pPlugin = reinterpret_cast< cPlugin * > ( m_wndPlugins.GetItemData ( nSelected ) ); + if ( pPlugin != NULL ) + idSelected = pPlugin->m_id; + } + } + + // Erase the contents of the list and collection + m_wndPlugins.DeleteAllItems (); + CDenAgentApp::importV1Plugins (); + + USES_CONVERSION; + + static cPluginGroup _groups[] = { + { _T( "Plugins" ), _T( "Plugins" ), 4 }, + { _T( "Network Filters" ), _T( "NetworkFilters" ), 1 }, + { _T( "File Filters" ), _T( "FileFilters" ), 1 }, + { _T( "Services" ), _T( "Services" ), 0 }, + { _T( "Surrogates" ), _T( "Surrogates" ), 3 }, + { _T( "Input Actions" ), _T( "InputActions" ), 2 } }, + *_end_groups = _groups + sizeof ( _groups ) / sizeof ( cPluginGroup ); + + int nCount = 0; + for ( cPluginGroup *i = _groups; i != _end_groups; ++ i ) + { + int nGroup = m_wndPlugins.InsertItem ( LVIF_IMAGE | LVIF_TEXT, nCount ++, i->m_groupName, 0, + 0, i->m_iconIndex, 0 ); + + CComPtr pEnum; + HRESULT hRes = m_pDecal->get_Configuration ( _bstr_t ( i->m_groupKey ), GUID_NULL, &pEnum ); + _ASSERTE( SUCCEEDED ( hRes ) ); + + while ( pEnum->Next () == S_OK ) + { + CLSID clsid; + hRes = pEnum->get_ComClass ( &clsid ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + + VARIANT_BOOL bEnabled; + hRes = pEnum->get_Enabled ( &bEnabled ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + + int nState = ( clsid == idSelected ) ? LVIS_SELECTED | LVIS_FOCUSED : 0; + + LVITEM lvi = { LVIF_STATE | LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM | LVIF_TEXT, nCount ++, 0, + nState, nState, NULL, -1, ( bEnabled ) ? 6 : 5, reinterpret_cast< LPARAM > ( new cPlugin ( clsid, i->m_groupKey, !!bEnabled, i->m_iconIndex ) ), 1 }; + + CComBSTR strName; + if ( SUCCEEDED ( pEnum->get_FriendlyName( &strName ) ) ) + lvi.pszText = OLE2T ( strName ); + else + { + LPOLESTR szProgID; + if ( FAILED ( ::ProgIDFromCLSID ( clsid, &szProgID ) ) ) + { + hRes = ::StringFromCLSID ( clsid, &szProgID ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + } + + // This *must* succeed + lvi.pszText = OLE2T ( szProgID ); + ::CoTaskMemFree ( szProgID ); + } + + lvi.cchTextMax = ::_tcslen ( lvi.pszText ); + int nItem = m_wndPlugins.InsertItem ( &lvi ); + + // Load the version info + CString strDLL; + if ( !CDenAgentApp::getCOMObjectDLL ( clsid, strDLL ) ) + { + m_wndPlugins.SetItemText ( nItem, 1, _T( "" ) ); + continue; + } + + CString strDLLVersion; + if ( !CDenAgentApp::getVersionString ( strDLL, strDLLVersion ) ) + m_wndPlugins.SetItemText ( nItem, 1, _T( "" ) ); + else + m_wndPlugins.SetItemText ( nItem, 1, strDLLVersion ); + } + } + + m_wndPlugins.SetRedraw ( TRUE ); + m_wndPlugins.Invalidate (); + + // Scroll back to the top index of before + RECT rc; + m_wndPlugins.GetItemRect ( 0, &rc, LVIR_BOUNDS ); + m_wndPlugins.Scroll ( CSize ( 0, ( rc.bottom - rc.top ) * nTop ) ); +} + +void CDenAgentDlg::OnUpdate() +{ + USES_CONVERSION; + // Release Decal object so it can be updated. + m_pDecal.Release(); + m_pDecal = NULL; + CoFreeUnusedLibraries(); + RegKey key; + + cDownloaderDlg dlg; + bool bUpdates = false; + + if (key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" )) != ERROR_SUCCESS) + return; + + TCHAR szURLDirectory[1024]; + TCHAR szDecalDirectory[MAX_PATH + 1]; + DWORD dwSize = 1024; + + if (key.QueryStringValue( _T( "DecalDirectory" ), szURLDirectory, &dwSize ) != ERROR_SUCCESS) + { + ::_tcscpy(szURLDirectory, "http://decal.acdev.org"); + key.SetStringValue("DecalDirectory", "http://decal.acdev.org"); + } + + dwSize = MAX_PATH; + + if (key.QueryStringValue( _T( "AgentPath" ), szDecalDirectory, &dwSize ) == ERROR_SUCCESS) { + // Gouru: szDecalDirectory may have trailing slash in registry, all following + // code assumes it does not, and adds another one. Since this could potentially + // cause path problems, the extra slash (if extant) is removed here + if ( szDecalDirectory[strlen(szDecalDirectory)-1] == '/' + || szDecalDirectory[strlen(szDecalDirectory)-1] == '\\' + ){ + szDecalDirectory[strlen(szDecalDirectory)-1] = 0 ; + } + + AutoUpdate aUpdate(szDecalDirectory); + + aUpdate.initialiseFromXML(std::string(szURLDirectory)); + + if (!aUpdate.performUpdate()) + MessageBox("Decal component update failed!"); + } else { + return; + } + + MSXML::IXMLDOMDocumentPtr pDPDoc; + + pDPDoc.CreateInstance( __uuidof( MSXML::DOMDocument ) ); + pDPDoc->async = false; + + VARIANT_BOOL bSuccess = pDPDoc->load( "decalplugins.xml" ); + + if(bSuccess) + { + MSXML::IXMLDOMElementPtr pNode = pDPDoc->selectSingleNode( _T("decal") ); + _variant_t vVersion = pNode->getAttribute( _T( "version" ) ), vCodeBase = pNode->getAttribute( _T( "codebase" ) ); + + char *sVersion = OLE2A(vVersion.bstrVal); + + int iRemoteReleaseMajor, iRemoteReleaseMinor; + int iRemoteBuildMajor, iRemoteBuildMinor; + + sscanf(sVersion, "%d.%d.%d.%d", &iRemoteReleaseMajor, &iRemoteReleaseMinor, &iRemoteBuildMajor, &iRemoteBuildMinor); + + if (iReleaseMajor == iRemoteReleaseMajor) + { + if (iReleaseMinor == iRemoteReleaseMinor) + { + if (iBuildMajor == iRemoteBuildMajor) + { + if (iBuildMinor < iRemoteBuildMinor) + updateDecal(vCodeBase); + } + else if (iBuildMajor < iRemoteBuildMajor) + updateDecal(vCodeBase); + } + else if (iReleaseMinor < iRemoteReleaseMinor) + updateDecal(vCodeBase); + } + else if (iReleaseMajor < iRemoteReleaseMajor) + updateDecal(vCodeBase); + + + MSXML::IXMLDOMNodeListPtr pPlugins = pDPDoc->selectNodes( _T( "/decal/plugin" ) ); + for( MSXML::IXMLDOMElementPtr pPlugin = pPlugins->nextNode(); pPlugin.GetInterfacePtr() != NULL; pPlugin = pPlugins->nextNode() ) + { + _variant_t vClsid = pPlugin->getAttribute( _T( "clsid" ) ), + vCodebase = pPlugin->getAttribute( _T( "codebase" ) ), + vVersion = pPlugin->getAttribute( _T( "version" ) ), + vName = pPlugin->getAttribute( _T( "name" ) ); + + DWORD dwMajor; + DWORD dwMinor; + + convertVersion( OLE2T( vVersion.bstrVal ), dwMajor, dwMinor ); + + RegKey keyPlugin; + + if( keyPlugin.Open( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Plugins\\" ), KEY_READ ) == ERROR_SUCCESS ) + { + keyPlugin.Close(); + + if( keyPlugin.Open( HKEY_CLASSES_ROOT, CString(_T("\\CLSID\\")) + OLE2T(vClsid.bstrVal) + _T("\\InprocServer32"), KEY_READ ) != ERROR_SUCCESS ) continue; + + DWORD dwSize = MAX_PATH; + TCHAR szDllName[MAX_PATH]; + + if(keyPlugin.QueryStringValue("", szDllName, &dwSize) != ERROR_SUCCESS) continue; + + keyPlugin.Close(); + + DWORD dwHandle; + DWORD dwVerInfoSize = GetFileVersionInfoSize(szDllName,&dwHandle); + if(!dwVerInfoSize) continue; + + LPBYTE pVersionData = NULL; + + pVersionData = new BYTE[dwVerInfoSize]; + + if(!GetFileVersionInfo(szDllName, dwHandle, dwVerInfoSize, pVersionData)) + { + delete [] pVersionData; + continue; + } + + VS_FIXEDFILEINFO* pFixedFileInfo; + + UINT uFixedInfoSize; + if(!VerQueryValue(pVersionData, "\\", (void**) &pFixedFileInfo, &uFixedInfoSize)) + { + delete [] pVersionData; + continue; + } + + + if (HIWORD(pFixedFileInfo->dwFileVersionMS) == HIWORD(dwMajor)) + { + if (LOWORD(pFixedFileInfo->dwFileVersionMS) == LOWORD(dwMajor)) + { + if (HIWORD(pFixedFileInfo->dwFileVersionLS) == HIWORD(dwMinor)) + { + if (LOWORD(pFixedFileInfo->dwFileVersionLS) < LOWORD(dwMinor)) + bUpdates = true; + } + else if (HIWORD(pFixedFileInfo->dwFileVersionLS) < HIWORD(dwMinor)) + bUpdates = true; + } + else if (LOWORD(pFixedFileInfo->dwFileVersionMS) < LOWORD(dwMajor)) + bUpdates = true; + } + else if (HIWORD(pFixedFileInfo->dwFileVersionMS) < HIWORD(dwMajor)) + bUpdates = true; + + delete [] pVersionData; + } + } + + if((bUpdates) && (!m_bDoingUpdate)) + { + if (MessageBox("Decal has detected that one or more of your plugins are out of date.\n\nWould you like to view the plugin list?",NULL, MB_ICONQUESTION | MB_YESNO) == IDYES) + { + HRESULT hRes = ::CoCreateInstance ( __uuidof ( Decal ), NULL, CLSCTX_INPROC_SERVER, __uuidof ( IDecal ), + reinterpret_cast< LPVOID * > ( &m_pDecal ) ); + + cAddRemoveDlg ardlg( this ); + ardlg.m_pDecal = m_pDecal; + ardlg.DoModal(); + loadPluginList(); + } + } + } + + m_bDoingUpdate = false; + + updateFileInfo (); + + HRESULT hRes = ::CoCreateInstance ( __uuidof ( Decal ), NULL, CLSCTX_INPROC_SERVER, __uuidof ( IDecal ), + reinterpret_cast< LPVOID * > ( &m_pDecal ) ); +} + +void CDenAgentDlg::OnOptions() +{ + cOptionsDlg dlg; + dlg.DoModal(); +} + +void CDenAgentDlg::convertVersion( LPTSTR szVersion, DWORD &dwVersionMajor, DWORD &dwVersionMinor ) +{ + int wVersionParts[ 4 ], + *i_ver = wVersionParts; + + for( TCHAR *szVersionPart = ::_tcstok( szVersion, _T( "." ) ); szVersionPart != NULL; szVersionPart = ::_tcstok( NULL, _T( "." ) ), ++ i_ver ) + ::_stscanf( szVersionPart, _T( "%i" ), i_ver ); + + dwVersionMajor = MAKELONG( wVersionParts[ 1 ], wVersionParts[ 0 ] ); + dwVersionMinor = MAKELONG( wVersionParts[ 3 ], wVersionParts[ 2 ] ); +} + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +void CDenAgentDlg::updateFileInfo(void) +{ + struct cFiles + { + LPCTSTR szFilename; + LPCTSTR szRootElement; + LPCTSTR szVElement; + UINT nDlgID; + }; + + static cFiles files[] = { + { _T( "messages.xml" ), _T("schema"), _T("revision"), IDC_MESSAGES_TEXT }, + { _T( "memlocs.xml" ), _T(""), _T("locations"), IDC_MEMLOCS_TEXT }, + { _T( "decalplugins.xml" ), _T(""), _T(""), IDC_DECALPLUGINS_TEXT } }, + *end_files = files + sizeof ( files ) / sizeof ( cFiles ); + + for ( cFiles *i = files; i != end_files; ++ i ) + { + CString strFileInfo; + GetFileInfoBase ( i->szFilename, i->szRootElement, i->szVElement, strFileInfo ); + SetDlgItemText ( i->nDlgID, strFileInfo ); + } +} + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +void CDenAgentDlg::GetFileInfoBase(LPCTSTR pszFilename, LPCTSTR pszRootElement, LPCTSTR pszVElement, CString &szFileInfo) +{ + USES_CONVERSION; + + RegKey key; + TCHAR szVal[MAX_PATH+1]; + DWORD dwSize = MAX_PATH; + static BOOL bAlreadyBuggedUser = false; + + szFileInfo = _T("file not found"); + + // Open the registry key + if(key.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal\\Agent")) == ERROR_SUCCESS) + { + // Determine the agent path + if (key.QueryStringValue(_T("AgentPath"), szVal, &dwSize) == ERROR_SUCCESS) + { + CString szFilename, szAgentPath(szVal); + + // Create the filename + szFilename.Format(_T("%s%s%s"), + szAgentPath, + (szAgentPath.Right(1) != _T("\\")) ? _T("\\") : _T(""), + pszFilename); + + // Look for the data file + CFileStatus FileStatus; + if (CFile::GetStatus((LPCTSTR)szFilename, FileStatus)) + { + if (strlen(pszVElement)) { + MSXML::IXMLDOMDocumentPtr m_pDoc; + MSXML::IXMLDOMElementPtr pVersionElement; + + m_pDoc.CreateInstance( __uuidof( MSXML::DOMDocument ) ); + m_pDoc->async = false; + + BOOL bSuccess = m_pDoc->load( _bstr_t(szFilename) ); + if( !bSuccess ) + { + std::string szXML; + CDenAgentApp::DecryptXML( static_cast< LPCSTR >( szFilename ), szXML ); + + if( szXML != "" ) + bSuccess = m_pDoc->loadXML( _bstr_t( szXML.c_str() ) ); + + szXML = " "; + for( int i = 0; i < 2500; ++i ) + szXML += "DIRL"; + } + + if( !bSuccess ) + return; + + if (strlen(pszRootElement)) { + MSXML::IXMLDOMElementPtr pRootElement = m_pDoc->selectSingleNode(_T(pszRootElement)); + pVersionElement = pRootElement->selectSingleNode(_T(pszVElement)); + } else { + pVersionElement = m_pDoc->selectSingleNode(_T(pszVElement)); + } + + if (pVersionElement) { + _variant_t vVersion = pVersionElement->getAttribute(_T("version")); + + szFileInfo.Format(_T("%d bytes, Version %s"), (DWORD) FileStatus.m_size, OLE2T(vVersion.bstrVal)); + } else { + CString szDateTime = FileStatus.m_mtime.Format(_T("%#m/%#d/%Y %#I:%M %p")); + szFileInfo.Format(_T("%d bytes, %s"), (DWORD) FileStatus.m_size, szDateTime); + } + } else { + CString szDateTime = FileStatus.m_mtime.Format(_T("%#m/%#d/%Y %#I:%M %p")); + szFileInfo.Format(_T("%d bytes, %s"), (DWORD) FileStatus.m_size, szDateTime); + } + } + } + } + + // This is mainly to protect me from myself :) Yes, I did almost post a bug report + // because I didn't have XML files in and AC was crashing. --elph + if( m_bDoUpdate ) + { + m_bDoUpdate = false; + OnUpdate( ); + } + else if (szFileInfo == _T("file not found") && !bAlreadyBuggedUser) { + ::MessageBox(NULL, "One or more of your XML files were not found!\nPlease click the Update button to ensure that Decal works correctly!", "Decal", MB_OK|MB_ICONERROR); + bAlreadyBuggedUser = true; + } +} + +void CDenAgentDlg::OnDeleteitemPlugins(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + + // Clear the plugin + delete reinterpret_cast< cPlugin * > ( pNMListView->lParam ); + + *pResult = 0; +} + +void CDenAgentDlg::OnClickPlugins(NMHDR* pNMHDR, LRESULT* pResult) +{ + *pResult = 0; + LPNMITEMACTIVATE pItemActivate = reinterpret_cast< LPNMITEMACTIVATE > ( pNMHDR ); + + if ( pItemActivate->iItem == -1 || pItemActivate->lParam == 0 ) + // A plugin item was not hit + return; + + // Hit test to see if the icon was hit (checkbox) + if ( pItemActivate->ptAction.x < 16 || pItemActivate->ptAction.x > 32 ) + return; + + // Invert the check + cPlugin *pPlugin = reinterpret_cast< cPlugin * > ( m_wndPlugins.GetItemData ( pItemActivate->iItem ) ); + CComPtr< IDecalEnum > pEnum; + + if (pPlugin && SUCCEEDED ( m_pDecal->get_Configuration ( _bstr_t ( pPlugin->m_group ), pPlugin->m_id, &pEnum ) ) ) + { + pPlugin->m_bEnabled = !pPlugin->m_bEnabled; + + // Write the registry and the icons + pEnum->put_Enabled ( ( pPlugin->m_bEnabled ) ? VARIANT_TRUE : VARIANT_FALSE ); + + LVITEM lvi = { LVIF_IMAGE, pItemActivate->iItem, 0, 0, 0, NULL, 0, + ( pPlugin->m_bEnabled ) ? 6 : 5, }; + m_wndPlugins.SetItem ( &lvi ); + } + else + // Bad data in the list - refresh + loadPluginList (); +} + +void CDenAgentDlg::OnBegindragPlugins(NMHDR* pNMHDR, LRESULT* pResult) +{ + *pResult = 0; + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + + // Check if this item is valid for dragging + if ( pNMListView->iItem == -1 ) + return; + + cPlugin *pPlugin = reinterpret_cast< cPlugin * > ( m_wndPlugins.GetItemData ( pNMListView->iItem ) ); + if ( pPlugin == NULL ) + return; + + m_wndPlugins.SetItemState ( pNMListView->iItem, LVIS_SELECTED, LVIS_SELECTED ); + m_hDragImage = ListView_CreateDragImage ( m_wndPlugins.m_hWnd, pNMListView->iItem, &CPoint ( 0, 0 ) ); + + CRect rcItem; + m_wndPlugins.GetItemRect ( pNMListView->iItem, rcItem, LVIR_BOUNDS ); + + ImageList_BeginDrag ( m_hDragImage, 0, pNMListView->ptAction.x - rcItem.left, pNMListView->ptAction.y - rcItem.top ); + ImageList_DragEnter ( m_wndPlugins.m_hWnd, pNMListView->ptAction.x, pNMListView->ptAction.y ); + + m_pCurrentDrag = pPlugin; + + SetCapture (); +} + +void CDenAgentDlg::OnMouseMove(UINT nFlags, CPoint point) +{ + if ( m_pCurrentDrag != NULL ) + { + SetCursor ( ::LoadCursor ( NULL, ( getDragInsertBefore ( point ) == -1 ) ? IDC_NO : IDC_ARROW ) ); + ImageList_DragMove ( point.x, point.y ); + } + + CDialog::OnMouseMove(nFlags, point); +} + +void CDenAgentDlg::OnLButtonUp(UINT nFlags, CPoint point) +{ + if ( m_pCurrentDrag != NULL ) + { + ImageList_DragLeave ( m_wndPlugins.m_hWnd ); + ImageList_EndDrag (); + ImageList_Destroy ( m_hDragImage ); + + ReleaseCapture (); + + int nInsertBefore = getDragInsertBefore ( point ); + if ( nInsertBefore != -1 ) + { + { + CComPtr< IDecalEnum > pEnum; + if ( SUCCEEDED ( m_pDecal->get_Configuration ( _bstr_t ( m_pCurrentDrag->m_group ), GUID_NULL, &pEnum ) ) ) + { + if ( SUCCEEDED ( pEnum->Skip ( m_pCurrentDrag->m_id ) ) ) + pEnum->MoveBefore ( reinterpret_cast< cPlugin * > ( m_wndPlugins.GetItemData ( nInsertBefore ) )->m_id ); + } + } + + loadPluginList (); + } + + m_pCurrentDrag = NULL; + } + + CDialog::OnLButtonUp(nFlags, point); +} + +void CDenAgentDlg::OnBnClickedDelete() +{ +/* + HOW TO USE THIS FEATURE + create a string value under your plugin key called "Uninstaller" + the value of this key should be the name of your uninstaller program, + as listed under HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\ + for MSI installers the name will be a GUID, for others it may be a GUID or plain text + + that's it + -para +*/ + + USES_CONVERSION; + + int nSelMark = m_wndPlugins.GetSelectionMark(); + if ( nSelMark == -1 ) + return; + + cPlugin *pPlugin = reinterpret_cast< cPlugin * >(m_wndPlugins.GetItemData( nSelMark )); + if ( pPlugin == NULL ) + return; + + //ask permission MB_OKCANCEL | MB_ICONEXCLAMATION = IDOK + //_snprintf(szMsg, 512, "You are about to remove %s\nPress OK to continue", stuff) + if ( ::MessageBox(NULL, _T("You are about to remove this plugin.\nPress OK to continue"), _T("Remove Plugin"), MB_OKCANCEL | MB_ICONEXCLAMATION) != IDOK ) + return; + + //load up the decal registry and remove this entry + RegKey keyPlugin; + CString decalPluginKey; + BSTR sClsid; + + StringFromCLSID(pPlugin->m_id, &sClsid); + if ((stricmp(pPlugin->m_group, "plugins") == 0) || (stricmp(pPlugin->m_group, "networkfilters") == 0)) + { + decalPluginKey.Format("SOFTWARE\\Decal\\%s", pPlugin->m_group); + + if (keyPlugin.Open(HKEY_LOCAL_MACHINE, _T(decalPluginKey), KEY_ALL_ACCESS) == ERROR_SUCCESS) + { + RegKey keySub; + if (keySub.Open(keyPlugin.m_hKey, OLE2T(sClsid), KEY_READ) == ERROR_SUCCESS) + { + //read the uninstaller string and fire it off + TCHAR sUninstall[512]; + DWORD dwSize = 512; + + if (keySub.QueryStringValue(_T("Uninstaller"), sUninstall, &dwSize) == ERROR_SUCCESS) + { + RegKey keyUninstall; + CString sUninstallKey; + + sUninstallKey.Format("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%s", sUninstall); + if (keyUninstall.Open(HKEY_LOCAL_MACHINE, _T(sUninstallKey), KEY_READ) == ERROR_SUCCESS) + { + TCHAR sUninstallPath[512]; + dwSize = 512; + + keyUninstall.QueryStringValue(_T("UninstallString"), sUninstallPath, &dwSize); + keyUninstall.Close(); + + //execute! + STARTUPINFO si; + PROCESS_INFORMATION pi; + + memset(&si, 0, sizeof(si)); + memset(&pi, 0, sizeof(pi)); + si.cb = sizeof(si); + + CreateProcess(NULL, sUninstallPath, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi); + } + } else { + ::MessageBox(NULL, _T("There was no uninstaller key defined for this object\nYou will have to uninstall it manually"), _T("Decal Error"), MB_ICONEXCLAMATION); + } + keySub.Close(); + } + + keyPlugin.DeleteSubKey(OLE2T(sClsid)); + keyPlugin.Close(); + } + else + ::MessageBox(NULL, _T("Unable to open registry"), _T("Decal Error"), MB_ICONEXCLAMATION); + + //refresh + loadPluginList(); + } +} +void CDenAgentDlg::OnBnClickedExport() +{ + cExportDlg dlg; + dlg.SetDecal(m_pDecal); + dlg.DoModal(); +} diff --git a/Native/DenAgent/DenAgentDlg.h b/Native/DenAgent/DenAgentDlg.h new file mode 100644 index 0000000..f2b88f2 --- /dev/null +++ b/Native/DenAgent/DenAgentDlg.h @@ -0,0 +1,100 @@ +// DenAgentDlg.h : header file +// + +#if !defined(AFX_DENAGENTDLG_H__2E961411_B570_4DAA_B5F1_89B9714C39EC__INCLUDED_) +#define AFX_DENAGENTDLG_H__2E961411_B570_4DAA_B5F1_89B9714C39EC__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include + +///////////////////////////////////////////////////////////////////////////// +// CDenAgentDlg dialog + +class CDenAgentDlg : public CDialog +{ +// Construction +public: + CDenAgentDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CDenAgentDlg) + enum { IDD = IDD_DENAGENT_DIALOG }; + CListCtrl m_wndPlugins; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDenAgentDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + struct cPlugin + { + CLSID m_id; + LPCTSTR m_group; + bool m_bEnabled; + int m_dragimage; + + cPlugin ( REFCLSID clsid, LPCTSTR group, bool bEnabled, int dragimage ) + : m_id ( clsid ), + m_group ( group ), + m_bEnabled ( bEnabled ), + m_dragimage ( dragimage ) + { + } + }; + + HIMAGELIST m_hDragImage; + cPlugin *m_pCurrentDrag; + + int getDragInsertBefore ( CPoint &ptClient ); + + void updateDecal(_variant_t vCodeBase); + void loadPluginList (); + + void GetFileInfoBase(LPCTSTR pszFilename, LPCTSTR pszRootElement, LPCTSTR pszVElement, CString &szFileInfo); + void updateFileInfo(); + +public: + bool m_bDoingUpdate; + bool m_bDoUpdate; + + CImageList m_groups; + + void convertVersion( LPTSTR szVersion, DWORD &dwVersionMajor, DWORD &dwVersionMinor ); + + int iReleaseMajor, iReleaseMinor; + int iBuildMajor, iBuildMinor; + + CComPtr m_pDecal; + +// Implementation +protected: + HICON m_hIcon; + + // Generated message map functions + //{{AFX_MSG(CDenAgentDlg) + virtual BOOL OnInitDialog(); + afx_msg void OnRefresh(); + afx_msg void OnAddremove(); + afx_msg void OnUpdate(); + afx_msg void OnOptions(); + afx_msg void OnDeleteitemPlugins(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnClickPlugins(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnBegindragPlugins(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedDelete(); + afx_msg void OnBnClickedExport(); +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DENAGENTDLG_H__2E961411_B570_4DAA_B5F1_89B9714C39EC__INCLUDED_) diff --git a/Native/DenAgent/DownloadDlg.cpp b/Native/DenAgent/DownloadDlg.cpp new file mode 100644 index 0000000..5b7da47 --- /dev/null +++ b/Native/DenAgent/DownloadDlg.cpp @@ -0,0 +1,77 @@ +// DownloadDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "DownloadDlg.h" + +#include "URLCallback.h" +#include "BindStatusCallback.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// cDownloadDlg dialog + + +cDownloadDlg::cDownloadDlg(CWnd* pParent /*=NULL*/) + : CDialog(cDownloadDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(cDownloadDlg) + //}}AFX_DATA_INIT +} + + +void cDownloadDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(cDownloadDlg) + DDX_Control(pDX, IDC_STATUSTEXT, m_stIEMsg); + DDX_Control(pDX, IDC_CUSTOMSTATUS, m_stCustomMsg); + DDX_Control(pDX, IDC_STOPDOWNLOAD, m_wndStop); + DDX_Control(pDX, IDC_PROGRESS, m_wndProgress); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(cDownloadDlg, CDialog) + //{{AFX_MSG_MAP(cDownloadDlg) + ON_BN_CLICKED(IDC_STOPDOWNLOAD, OnStopdownload) + ON_WM_DESTROY() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// cDownloadDlg message handlers + +void cDownloadDlg::OnStopdownload() +{ + m_pCallback->stop(); +} + +BOOL cDownloadDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Create the URL Bind Context + CComObject< cURLCallback > *pCallback; + CComObject< cURLCallback >::CreateInstance( &pCallback ); + m_pCallback = pCallback; + m_pCallback->AddRef(); + m_pCallback->m_pDlg = this; + m_pCallback->start( m_clsid, m_strURL, m_dwMajor, m_dwMinor ); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void cDownloadDlg::OnDestroy() +{ + m_pCallback->Release(); + + CDialog::OnDestroy(); +} \ No newline at end of file diff --git a/Native/DenAgent/DownloadDlg.h b/Native/DenAgent/DownloadDlg.h new file mode 100644 index 0000000..e5f4afd --- /dev/null +++ b/Native/DenAgent/DownloadDlg.h @@ -0,0 +1,62 @@ +#if !defined(AFX_DOWNLOADDLG_H__E5094CC4_4B01_46AF_9C32_5DBECF5C11D6__INCLUDED_) +#define AFX_DOWNLOADDLG_H__E5094CC4_4B01_46AF_9C32_5DBECF5C11D6__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// DownloadDlg.h : header file +// + +#include "resource.h" + +class cURLCallback; + +///////////////////////////////////////////////////////////////////////////// +// cDownloadDlg dialog + +class cDownloadDlg : public CDialog +{ +// Construction +public: + cDownloadDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(cDownloadDlg) + enum { IDD = IDD_DOWNLOAD }; + CStatic m_stIEMsg; + CStatic m_stCustomMsg; + CButton m_wndStop; + CProgressCtrl m_wndProgress; + //}}AFX_DATA + + cURLCallback *m_pCallback; + + CLSID m_clsid; + LPCWSTR m_strURL; + DWORD m_dwMajor; + DWORD m_dwMinor; + CComPtr< IClassFactory > m_pFactory; + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(cDownloadDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(cDownloadDlg) + afx_msg void OnStopdownload(); + virtual BOOL OnInitDialog(); + afx_msg void OnDestroy(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DOWNLOADDLG_H__E5094CC4_4B01_46AF_9C32_5DBECF5C11D6__INCLUDED_) diff --git a/Native/DenAgent/DownloaderDlg.cpp b/Native/DenAgent/DownloaderDlg.cpp new file mode 100644 index 0000000..a14114f --- /dev/null +++ b/Native/DenAgent/DownloaderDlg.cpp @@ -0,0 +1,246 @@ +// DownloaderDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "denagent.h" +#include "DownloaderDlg.h" + +#include "BindStatusCallback.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// cDownloaderDlg dialog + + +cDownloaderDlg::cDownloaderDlg(CWnd* pParent /*=NULL*/) + : CDialog(cDownloaderDlg::IDD, pParent), m_bDownloadSucceeded(false) +{ + //{{AFX_DATA_INIT(cDownloaderDlg) + //}}AFX_DATA_INIT +} + + +void cDownloaderDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(cDownloaderDlg) + DDX_Control(pDX, IDC_STATUSTOTAL, m_stStatusTotal); + DDX_Control(pDX, IDC_STOPDOWNLOAD, m_wndStop); + DDX_Control(pDX, IDC_PROGRESS, m_wndProgress); + DDX_Control(pDX, IDC_PROGRESSTOTAL, m_wndProgressTotal); + DDX_Control(pDX, IDC_STATUSTEXT, m_stIEMsg); + DDX_Control(pDX, IDC_CUSTOMSTATUS, m_stCustomMsg); + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(cDownloaderDlg, CDialog) + //{{AFX_MSG_MAP(cDownloaderDlg) + ON_BN_CLICKED(IDC_STOPDOWNLOAD, OnStopdownload) + ON_WM_DESTROY() + ON_WM_CLOSE() + //}}AFX_MSG_MAP + ON_MESSAGE(WM_USER+1, OnEndDownload) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// cDownloaderDlg message handlers + +void cDownloaderDlg::OnStopdownload() +{ + if(!m_bThreadDone) + InterlockedExchange ( &g_fAbortDownload, 1 ); + else + EndDialog(IDOK); +} + +UINT gThreadProc ( void* pv ) +{ + cDownloaderDlg* cDDlg = (cDownloaderDlg*)pv; + + cDDlg->WorkerThreadProc(); + + return 0; +} + +//FILELIST g_FileList[] = { { "messages.xml", "messages.dlc" }, { "memlocs.xml", "messages.dlc" }, { "decalplugins.xml", "messages.dlc" } }; + +void cDownloaderDlg::addFile(std::string remoteFile, std::string localFile) { + FILELIST tmpFile; + + tmpFile.strFile = const_cast(remoteFile.c_str()); + tmpFile.strLFile = const_cast(localFile.c_str()); + + m_FileList.push_back(tmpFile); +} + +void cDownloaderDlg::WorkerThreadProc() +{ + //srand((unsigned int) time( NULL ) ); + + OLECHAR olestr[1024]; + + GUID pGuid; + CoCreateGuid(&pGuid); + + StringFromGUID2(pGuid, olestr, 1024); + + HRESULT hr; + CString strFile; + + //TCHAR lpFileName[MAX_PATH]; + + int fileListSize = m_FileList.size(); + + for(int i=0; i < fileListSize; i++) + { + CString st; + st.Format("Downloading File %d of %d.", i + 1, fileListSize); + + m_stStatusTotal.SetWindowText(st); + + CCallback callback; + callback.m_pDlg = this; + + CString strFullURL = m_FileList[i].strFile; + m_stIEMsg.SetWindowText ( strFullURL ); + + hr = URLDownloadToFile( NULL, strFullURL + CString("?") + CString(olestr), m_FileList[i].strLFile, 0, &callback ); + + if ( FAILED(hr) ) + { + if(!g_fAbortDownload ) + { + LPTSTR lpszErrorMessage; + CString sMsg; + + if(FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, hr, MAKELANGID ( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR) &lpszErrorMessage, 0, NULL )) + { + sMsg.Format ( _T("Download failed. \n\n%s"), lpszErrorMessage ); + LocalFree ( lpszErrorMessage ); + } + else + sMsg.Format ( _T("Download failed."), (DWORD) hr ); + + m_bDownloadSucceeded = false; + + AfxMessageBox ( sMsg ); + PostMessage(WM_USER+1, 1, NULL); + } + else + { + m_bDownloadSucceeded = false; + + PostMessage(WM_USER+1, IDCANCEL, NULL); + AfxEndThread(0); + } + } else { + m_bDownloadSucceeded = true; + + OFSTRUCT targetFile; + OFSTRUCT sourceFile; + + // Make sure we really got a source file + if (OpenFile(m_FileList[i].strLFile, &sourceFile, OF_EXIST) != HFILE_ERROR) + { + if (OpenFile(m_FileList[i].strFile, &targetFile, OF_EXIST) != HFILE_ERROR) + DeleteFile(m_FileList[i].strFile); + + MoveFile(m_FileList[i].strLFile, m_FileList[i].strFile); + } + } + + if(g_fAbortDownload) + { + m_bDownloadSucceeded = false; + PostMessage(WM_USER+1, IDCANCEL, NULL); + AfxEndThread(0); + } + } + + PostMessage(WM_USER+1, 0, NULL); + + AfxEndThread(0); +} + +void cDownloaderDlg::OnDestroy() +{ + if(m_bThreadDone) + CDialog::OnDestroy(); + else + InterlockedExchange ( &g_fAbortDownload, 1 ); +} + +BOOL cDownloaderDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // TODO: Add extra initialization here + + m_bThreadDone = false; + g_fAbortDownload = 0; + SetWindowText("Updating Decal Components"); + m_pWorkerThread = AfxBeginThread ( gThreadProc, this, THREAD_PRIORITY_NORMAL, 0, 0 ); + + m_wndProgressTotal.SetRange(0, m_FileList.size() * 100); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void cDownloaderDlg::ProgressUpdate ( LPCTSTR szIEMsg, LPCTSTR szCustomMsg, const int nPercentDone ) +{ + ASSERT ( AfxIsValidString ( szIEMsg )); + ASSERT ( AfxIsValidString ( szCustomMsg )); + ASSERT ( nPercentDone >= 0 && nPercentDone <= 100 ); + + static int nPercentOld = nPercentDone; + + if(nPercentOld > nPercentDone) + nPercentOld = nPercentDone; + + //m_stIEMsg.SetWindowText ( szIEMsg ); + m_stCustomMsg.SetWindowText ( szCustomMsg ); + m_wndProgress.SetPos ( nPercentDone ); + + m_wndProgressTotal.SetPos( m_wndProgressTotal.GetPos() + (nPercentDone-nPercentOld)); + + nPercentOld = nPercentDone; + + static TCHAR szMsg [256]; + StrFormatByteSize ( m_ulTotalData, szMsg, 256 ); +} + +void cDownloaderDlg::OnClose() +{ + // TODO: Add your message handler code here and/or call default + if(m_bThreadDone) + CDialog::OnClose(); + else + InterlockedExchange ( &g_fAbortDownload, 1 ); +} + +LRESULT cDownloaderDlg::OnEndDownload(WPARAM nID, LPARAM uMsg) +{ + m_bThreadDone = true; + if((nID!=0) && (nID!=1)) + EndDialog(nID); + else + { + CDialog::OnOK(); + } + return 0; +} + +cDownloaderDlg::DownloadStatus cDownloaderDlg::GetDownloadStatus() +{ + if (m_bDownloadSucceeded) + return DownloadStatus::DOWNLOAD_SUCCEEDED; + else + return DownloadStatus::DOWNLOAD_FAILED; + +} diff --git a/Native/DenAgent/DownloaderDlg.h b/Native/DenAgent/DownloaderDlg.h new file mode 100644 index 0000000..47d86a2 --- /dev/null +++ b/Native/DenAgent/DownloaderDlg.h @@ -0,0 +1,79 @@ +#if !defined(AFX_DOWNLOADERDLG_H__EF5E9E0B_873E_4AFC_85D8_8F210D77AD79__INCLUDED_) +#define AFX_DOWNLOADERDLG_H__EF5E9E0B_873E_4AFC_85D8_8F210D77AD79__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// DownloaderDlg.h : header file +// + +#include "resource.h" + +///////////////////////////////////////////////////////////////////////////// +// cDownloaderDlg dialog + +class cDownloaderDlg : public CDialog +{ +// Construction +public: + enum DownloadStatus + { + DOWNLOAD_SUCCEEDED, + DOWNLOAD_FAILED + }; + + cDownloaderDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(cDownloaderDlg) + enum { IDD = IDD_DOWNLOADER }; + CStatic m_stStatusTotalData; + CStatic m_stStatusTotal; + CButton m_wndStop; + CProgressCtrl m_wndProgress; + CProgressCtrl m_wndProgressTotal; + CStatic m_stIEMsg; + CStatic m_stCustomMsg; + //}}AFX_DATA + + CLSID m_clsid; + CWinThread* m_pWorkerThread; + + bool m_bThreadDone; + DownloadStatus GetDownloadStatus(); + + unsigned long m_ulTotalData; + + void cDownloaderDlg::addFile(std::string remoteFile, std::string localFile); + void ProgressUpdate ( LPCTSTR szIEMsg, LPCTSTR szCustomMsg, const int nPercentDone ); + void WorkerThreadProc(); + LRESULT OnEndDownload(WPARAM nID, LPARAM uMsg); + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(cDownloaderDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(cDownloaderDlg) + afx_msg void OnStopdownload(); + afx_msg void OnDestroy(); + virtual BOOL OnInitDialog(); + afx_msg void OnClose(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + +private: + std::vector m_FileList; + bool m_bDownloadSucceeded; +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DOWNLOADERDLG_H__EF5E9E0B_873E_4AFC_85D8_8F210D77AD79__INCLUDED_) diff --git a/Native/DenAgent/ExportDlg.cpp b/Native/DenAgent/ExportDlg.cpp new file mode 100644 index 0000000..8c305f9 --- /dev/null +++ b/Native/DenAgent/ExportDlg.cpp @@ -0,0 +1,750 @@ +// ExportDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "ExportDlg.h" +#include "DenAgentDlg.h" +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// cExportDlg dialog + +cExportDlg::cExportDlg(CWnd* pParent /*=NULL*/) + : CDialog(cExportDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(cExportDlg) + + //}}AFX_DATA_INIT +} + +cExportDlg::~cExportDlg() +{ + m_pDecal.Release(); +} + +void cExportDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(cExportDlg, CDialog) + //{{AFX_MSG_MAP(cExportDlg) + ON_BN_CLICKED(IDC_BTNEXPORT, OnBnClickedBtnexport) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// cExportDlg message handlers + +BOOL cExportDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + ::SendMessage( GetDlgItem( IDC_CHKENABLED )->m_hWnd, BM_SETCHECK, TRUE, 0 ); + ::SendMessage( GetDlgItem( IDC_CHKLOC )->m_hWnd, BM_SETCHECK, FALSE, 0 ); + ::SendMessage( GetDlgItem( IDC_CHKCLSID )->m_hWnd, BM_SETCHECK, TRUE, 0 ); + UpdateData(FALSE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +struct cPluginGroup +{ + LPCTSTR m_groupName, + m_groupKey; + int m_iconIndex; +}; + +void cExportDlg::AppendExportText(const char *szNewText) +{ + int dwOldTextLength =::SendMessage(GetDlgItem(IDC_EDITEXPORT)->m_hWnd, WM_GETTEXTLENGTH, 0, 0) + 1; + int dwNewTextLength = strlen(szNewText) + 1; + char *szOldText = new char[dwOldTextLength]; + memset(szOldText, 0, dwOldTextLength); + char *szBuffer = new char[dwOldTextLength + dwNewTextLength]; + memset(szBuffer, 0, dwOldTextLength + dwNewTextLength); + ::SendMessage(GetDlgItem(IDC_EDITEXPORT)->m_hWnd, WM_GETTEXT, dwOldTextLength, (LPARAM) szOldText); + if(dwOldTextLength > 0) + sprintf(szBuffer, "%s%s", szOldText, szNewText); + else + sprintf(szBuffer, "%s", szNewText); + ::SendMessage(GetDlgItem(IDC_EDITEXPORT)->m_hWnd, WM_SETTEXT, 0, (LPARAM) szBuffer); + delete[]szBuffer; + delete[]szOldText; +} + +void cExportDlg::OnBnClickedBtnexport() +{ + USES_CONVERSION; + std::string szDelim = ", "; + // Set Cursor + HCURSOR hCurDefault = GetCursor(); + HCURSOR hCurWaiting = LoadCursor(NULL, IDC_WAIT); + SetCursor(hCurWaiting); + + // Drakier: Get plugins/filters/services/etc from decal + cPluginGroup _groups[] = { + { _T( "Plugins" ), _T( "Plugins" ), 4 }, + { _T( "Network Filters" ), _T( "NetworkFilters" ), 1 }, + { _T( "File Filters" ), _T( "FileFilters" ), 1 }, + { _T( "Services" ), _T( "Services" ), 0 }, + { _T( "Surrogates" ), _T( "Surrogates" ), 3 }, + { _T( "Input Actions" ), _T( "InputActions" ), 2 } }, + *_end_groups = _groups + sizeof ( _groups ) / sizeof ( cPluginGroup ); + + int nCount = 0; + std::string szOutput; + szOutput = ""; + ::SendMessage( GetDlgItem( IDC_EDITEXPORT )->m_hWnd,WM_SETTEXT, 0, (LPARAM)szOutput.c_str()); + + szOutput += "type, "; + if ( ::SendMessage( GetDlgItem( IDC_CHKENABLED )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + szOutput += "enabled, "; + szOutput += "name, version, "; + if ( ::SendMessage( GetDlgItem( IDC_CHKLOC )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + szOutput += "location, "; + if ( ::SendMessage( GetDlgItem( IDC_CHKCLSID )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + szOutput += "clsid"; + szOutput += "\r\n"; + AppendExportText(szOutput.c_str()); + + // Go through all the groups exporting their sub-lists + for ( cPluginGroup *i = _groups; i != _end_groups; ++ i ) + { + CComPtr pEnum; + HRESULT hRes = m_pDecal->get_Configuration ( _bstr_t ( i->m_groupKey ), GUID_NULL, &pEnum ); + _ASSERTE( SUCCEEDED ( hRes ) ); + + // enum through all items in a group + while ( pEnum->Next () == S_OK ) + { + szOutput = ""; + CLSID clsid; + CComBSTR strName; + CString strDLL = ""; + CString strDLLVersion = ""; + LPOLESTR szCLSID; + + hRes = pEnum->get_ComClass ( &clsid ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + + if (hRes == S_OK) + { + if ( CDenAgentApp::getCOMObjectDLL ( clsid, strDLL ) ) + { + if ( !CDenAgentApp::getVersionString ( strDLL, strDLLVersion ) ) + strDLLVersion = _T( "" ); + } + else + strDLL = _T( "" ); + } + + szOutput += i->m_groupName; + + if ( ::SendMessage( GetDlgItem( IDC_CHKENABLED )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + VARIANT_BOOL bEnabled; + hRes = pEnum->get_Enabled ( &bEnabled ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + szOutput += szDelim; + szOutput += bEnabled?"1":"0"; + } + + hRes = pEnum->get_FriendlyName( &strName ); + _ASSERTE ( SUCCEEDED ( hRes ) ); + szOutput += szDelim; + if (hRes == S_OK) + szOutput += OLE2T ( strName ); + else + szOutput += ""; + + szOutput += szDelim; + szOutput += strDLLVersion; + + if ( ::SendMessage( GetDlgItem( IDC_CHKLOC )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + szOutput += szDelim; + szOutput += strDLL; + } + + if ( ::SendMessage( GetDlgItem( IDC_CHKCLSID )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + szOutput += szDelim; + if ( StringFromCLSID(clsid, &szCLSID) == S_OK ) + { + szOutput += OLE2T(szCLSID); + ::CoTaskMemFree ( szCLSID ); + } + else + szOutput += ""; + } + szOutput += "\r\n"; + AppendExportText(szOutput.c_str()); + } + } + + // Drakier: Get the OS Version + szOutput = "\r\nOperating System:\r\n"; + const int BUFSIZE = 80; + OSVERSIONINFOEX osvi; + BOOL bOsVersionInfoEx; + + // Try calling GetVersionEx using the OSVERSIONINFOEX structure. + // If that fails, try using the OSVERSIONINFO structure. + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + + if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) + { + osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + GetVersionEx ( (OSVERSIONINFO *) &osvi); + } + + switch (osvi.dwPlatformId) + { + // Test for the Windows NT product family. + case VER_PLATFORM_WIN32_NT: + + // Test for the specific product family. + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) + szOutput += "Microsoft Windows Server 2003 family, "; + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) + szOutput += "Microsoft Windows XP "; + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) + szOutput += "Microsoft Windows 2000 "; + if ( osvi.dwMajorVersion <= 4 ) + szOutput += "Microsoft Windows NT "; + + // Test for specific product on Windows NT 4.0 SP6 and later. + if( bOsVersionInfoEx ) + { + // Test for the workstation type. + if ( osvi.wProductType == VER_NT_WORKSTATION ) + { + if( osvi.dwMajorVersion == 4 ) + szOutput += "Workstation 4.0 "; + else if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) + szOutput += "Home Edition "; + else + szOutput += "Professional "; + } + + // Test for the server type. + else if ( osvi.wProductType == VER_NT_SERVER ) + { + if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) + { + if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) + szOutput += "Datacenter Edition "; + else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) + szOutput += "Enterprise Edition "; + else if ( osvi.wSuiteMask == VER_SUITE_BLADE ) + szOutput += "Web Edition "; + else + szOutput += "Standard Edition "; + } + + else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) + { + if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) + szOutput += "Datacenter Server "; + else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) + szOutput += "Advanced Server "; + else + szOutput += "Server "; + } + + else // Windows NT 4.0 + { + if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) + szOutput += "Server 4.0, Enterprise Edition "; + else + szOutput += "Server 4.0 "; + } + } + } + else // Test for specific product on Windows NT 4.0 SP5 and earlier + { + HKEY hKey; + char szProductType[BUFSIZE]; + DWORD dwBufLen=BUFSIZE; + LONG lRet; + + lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, + "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", + 0, KEY_QUERY_VALUE, &hKey ); + if( lRet == ERROR_SUCCESS ) + { + lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL, + (LPBYTE) szProductType, &dwBufLen); + if( (lRet == ERROR_SUCCESS) && (dwBufLen <= BUFSIZE) ) + { + RegCloseKey( hKey ); + + if ( lstrcmpi( "WINNT", szProductType) == 0 ) + szOutput += "Workstation "; + if ( lstrcmpi( "LANMANNT", szProductType) == 0 ) + szOutput += "Server "; + if ( lstrcmpi( "SERVERNT", szProductType) == 0 ) + szOutput += "Advanced Server "; + + szOutput += (char)osvi.dwMajorVersion; + szOutput += "."; + szOutput += (char)osvi.dwMinorVersion; + } + } + } + + // Display service pack (if any) and build number. + if( osvi.dwMajorVersion == 4 && + lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 ) + { + HKEY hKey; + LONG lRet; + + // Test for SP6 versus SP6a. + lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009", + 0, KEY_QUERY_VALUE, &hKey ); + if( lRet == ERROR_SUCCESS ) + { + char szBuild[6]; //might make it a bit longer + memset(szBuild, 0, 6); + ltoa(osvi.dwBuildNumber & 0xFFFF, szBuild, 10); + + szOutput += "Service Pack 6a (Build "; + szOutput += szBuild; + szOutput += ")\r\n"; + } + else // Windows NT 4.0 prior to SP6a + { + char szBuild[6]; //might make it a bit longer + memset(szBuild, 0, 6); + ltoa(osvi.dwBuildNumber & 0xFFFF, szBuild, 10); + + szOutput += osvi.szCSDVersion; + szOutput += " (Build "; + szOutput += szBuild; + szOutput += ")\r\n"; + } + RegCloseKey( hKey ); + } + else // Windows NT 3.51 and earlier or Windows 2000 and later + { + char szBuild[6]; //might make it a bit longer + memset(szBuild, 0, 6); + ltoa(osvi.dwBuildNumber & 0xFFFF, szBuild, 10); + + szOutput += osvi.szCSDVersion; + szOutput += " (Build "; + szOutput += szBuild; + szOutput += ")\r\n"; + } + break; + + // Test for the Windows 95 product family. + case VER_PLATFORM_WIN32_WINDOWS: + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) + { + szOutput += "Microsoft Windows 95 "; + if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) + szOutput += "OSR2 "; + } + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) + { + szOutput += "Microsoft Windows 98 "; + if ( osvi.szCSDVersion[1] == 'A' ) + szOutput += "SE "; + } + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) + { + szOutput += "Microsoft Windows Millennium Edition\r\n"; + } + break; + + case VER_PLATFORM_WIN32s: + szOutput += "Microsoft Win32s\r\n"; + break; + } + AppendExportText(szOutput.c_str()); + + // Drakier: Check the Protected Storage + RegKey key; + if ( key.Open( HKEY_LOCAL_MACHINE, _T( "SYSTEM\\CurrentControlSet\\Services\\ProtectedStorage" ) ) == ERROR_SUCCESS ) + { + DWORD dwStartMode; + szOutput = "\r\n[Protected Storage Service] : "; + if ( key.QueryDWORDValue( "Start", dwStartMode ) == ERROR_SUCCESS ) + { + switch (dwStartMode) + { + case 2: //automatic + szOutput += "Automatic\r\n"; + break; + case 3: // manual + szOutput += "Manual\r\n"; + break; + case 4: // disabled + szOutput += "Disabled\r\n"; + break; + } + } + key.Close(); + AppendExportText(szOutput.c_str()); + } + + // Drakier: Get the Injection Mode + if( key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" )) == ERROR_SUCCESS ) + { + DWORD dwViewMode; + szOutput = "\r\n[Injection Method] : "; + if( key.QueryDWORDValue( "OldInjection", dwViewMode )== ERROR_SUCCESS ) + { + if (dwViewMode == 1) + { + szOutput += "OLD\r\n"; + } + else + { + szOutput += "NEW\r\n"; + } + } + else + szOutput += "Error Reading Key"; + key.Close(); + AppendExportText(szOutput.c_str()); + } + + // Drakier: Get the Runtime versions (if installed). + szOutput = "\r\nRuntime Libraries\r\n"; + AppendExportText(szOutput.c_str()); + // Visual Basic 6 Runtimes + szOutput = "[msvbvm60.dll]\t: "; + HMODULE hLib = ::LoadLibrary( "msvbvm60.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // msvcp 7.0 Runtime + szOutput = "[msvcr70.dll]\t: "; + hLib = ::LoadLibrary( "msvcr70.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // msvcr 7.0 Runtime + szOutput = "[msvcp70.dll]\t: "; + hLib = ::LoadLibrary( "msvcp70.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // msvcp 7.1 Runtime + szOutput = "[msvcr71.dll]\t: "; + hLib = ::LoadLibrary( "msvcr71.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // msvcr 7.1 Runtime + szOutput = "[msvcp71.dll]\t: "; + hLib = ::LoadLibrary( "msvcp71.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // Haz - mfc+atl + // mfc 7.0 runtime + szOutput = "[mfc70.dll]\t: "; + hLib = ::LoadLibrary( "mfc70.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // mfc 7.1 runtime + szOutput = "[mfc71.dll]\t: "; + hLib = ::LoadLibrary( "mfc71.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // atl 7.0 runtime + szOutput = "[atl70.dll]\t\t: "; + hLib = ::LoadLibrary( "atl70.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // atl 7.1 runtime + szOutput = "[atl71.dll]\t\t: "; + hLib = ::LoadLibrary( "atl71.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // Drakier: Get the MSXML Versions + szOutput = "\r\nMicrosoft XML Libraries\r\n"; + AppendExportText(szOutput.c_str()); + // msxml3 + szOutput = "[msxml3.dll]\t: "; + hLib = ::LoadLibrary( "msxml3.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // msxml4 + szOutput = "[msxml4.dll]\t: "; + hLib = ::LoadLibrary( "msxml4.dll" ); + if( hLib == NULL ) + szOutput += "Not Installed\r\n"; + else + { + char strDllFilePath[MAX_PATH] = {""}; + CString strDLLVersion = ""; + GetModuleFileName(hLib, strDllFilePath, MAX_PATH); + if ( !CDenAgentApp::getVersionString ( strDllFilePath, strDLLVersion ) ) + strDLLVersion = _T( "(No Version)" ); + else + { + szOutput += "Installed ("; + szOutput += strDLLVersion; + szOutput += ")\r\n"; + } + } + ::FreeLibrary(hLib); + AppendExportText(szOutput.c_str()); + + // Drakier: Get the Compat Mode Layers and display them. + if (key.Open( HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers" ) == ERROR_SUCCESS) + { + RegKey hkItem; + DWORD dwIndex = 0; + DWORD dwValues = NULL; + BOOL bTitle = FALSE; + + // Enum regkey for AppCompatFlags checking for client.exe + ::RegQueryInfoKey(key, NULL, NULL, NULL, NULL, NULL, NULL, &dwValues, NULL, NULL, NULL, NULL); + if (dwValues) + { + HRESULT retCode = ERROR_SUCCESS; + for (dwIndex = 0; dwIndex < dwValues; dwIndex++) + { + DWORD dwValueNameLen = 255; + DWORD dwValueDataLen = 10; + TCHAR szValueName[255]; + BYTE szValueData[10]; + //TCHAR szValueData[10]; + DWORD dwType; + + retCode = ::RegEnumValue ( key, dwIndex, szValueName, &dwValueNameLen, NULL, &dwType, szValueData, &dwValueDataLen ); + if ( retCode == ERROR_SUCCESS) + { + if ( strstr(szValueName, "client.exe") != NULL ) + { + if (!bTitle) + szOutput = "\r\nApplication Compatibility\r\n"; + bTitle = TRUE; + szOutput += szValueName; + szOutput += ": "; + szOutput += (char *)szValueData; + szOutput += "\r\n"; + } + } + } + AppendExportText(szOutput.c_str()); + } + } + key.Close(); + + // Set Cursor back... + SetCursor(hCurDefault); + + // Display information + if (::MessageBox(NULL, "Would you like to export the data to the clipboard?", "Export Data...", MB_YESNO | MB_ICONQUESTION) == IDYES ) + { + if(OpenClipboard()) + { + DWORD dwTextLength = ::SendMessage( GetDlgItem( IDC_EDITEXPORT )->m_hWnd, WM_GETTEXTLENGTH, 0, 0) + 1; + char *szCBText = new char[dwTextLength]; + memset(szCBText, 0, dwTextLength); + ::SendMessage( GetDlgItem( IDC_EDITEXPORT )->m_hWnd, WM_GETTEXT, dwTextLength, (LPARAM)szCBText ); + HGLOBAL hData; + LPVOID pData; + + EmptyClipboard(); + hData = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE,strlen(szCBText) + 1); + pData = GlobalLock(hData); + strcpy((LPSTR)pData, szCBText); + GlobalUnlock(hData); + SetClipboardData(CF_TEXT, hData); + CloseClipboard(); + delete[] szCBText; + } + else + ::MessageBox(NULL, "Error opening clipboard!", "Error...", MB_OK | MB_ICONERROR); + } +} + +void cExportDlg::SetDecal(IDecal* pDecal) +{ + m_pDecal = pDecal; +} \ No newline at end of file diff --git a/Native/DenAgent/ExportDlg.h b/Native/DenAgent/ExportDlg.h new file mode 100644 index 0000000..482fa68 --- /dev/null +++ b/Native/DenAgent/ExportDlg.h @@ -0,0 +1,56 @@ +#include "afxwin.h" +#if !defined(AFX_EXPORTDLG_H__F2DBFC10_6835_494D_9A03_B97D9068BAF9__INCLUDED_) +#define AFX_EXPORTDLG_H__F2DBFC10_6835_494D_9A03_B97D9068BAF9__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include + +// ExportDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// cExportDlg dialog + +class cExportDlg : public CDialog +{ +// Construction +public: + cExportDlg(CWnd* pParent = NULL); // standard constructor + ~cExportDlg(); + +// Dialog Data + //{{AFX_DATA(cExportDlg) + enum { IDD = IDD_EXPORT }; + + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(cExportDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(cExportDlg) + virtual BOOL OnInitDialog(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +public: + void SetDecal(IDecal* pDecal); + void AppendExportText(const char* szNewText); + CComPtr m_pDecal; + afx_msg void OnBnClickedBtnexport(); +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_ExportDlg_H__F2DBFC10_6835_494D_9A03_B97D9068BAF9__INCLUDED_) diff --git a/Native/DenAgent/Images.bmp b/Native/DenAgent/Images.bmp new file mode 100644 index 0000000000000000000000000000000000000000..758db46bd6d22bdea94e36a3458c453cc1230a65 GIT binary patch literal 3896 zcmeHKYfM{J9RJ&N=x% ze&^rwJNJM8=QL|aN+>)}5*_1d&!?TIoxvJ9dY`@!z}@dZ1Z1iGA9lcI`}5!%hlhrS z#bm#maf(%`++^LQQf}c@&qoHPtyY$)l%&Zj#fb99_==I{9Usjvf|0n^#m4e#HJ^}R zFc>7Rhg3Q4R&cQG<)WI-j&^UTx;nCI<<*Z)p7I&Ft~wDo5Qz3&b*9+<@G{5!2>eV}lbZ7JK>wEx`z*su0XMUCCr(=H z0cJ;(eGJ3kRI0Np=ImbPDk zB-m`Wd9N?Q&G*`%`S`~^;pf@I_ zrM3BU`StW%I+UZ$*se)aYqn)+sZ4q<$s$#csW9SUdJHJ{2xm}PSt$z^8~=H~E)rev z4z)+`-tFezJRw*r#4x{QtCeuvb%o+G!`NwykGFMP{=#Rpi?z=HZ-rx6i<-?yp*$|u z%7T^AN_+}50grnQ!VbU*lsuTSoA2l_oJ7B~iAL7z_2}xt^dutI$o`NY#)ya+jvHm! zF8XpS%4=jJOgtIV{iZN|`hzXN=}lpzETA(78|epd>V5k`fqEsg5C(7a+7S!f0bD>C zEEbCdELP|FCTx9=+7mPy+`ET?E6Ey-80NQJSm+7}m}VGvJ_9|5XXT6Yb;01h!X&Q5 z)r??bWWOmu-r4{aumYgo#TQUtUyn54Cr@IBK@bFAcsJi+`hHyyYH*|)-92b&)s;V* zl2u&nWZ7w;Gx2`C0=l2ubw+kEW2L$40plhR6No@Z_WPU=1B2cYy)0g0Y-nhpB@4d* zcR{azMx#*z@T#8g_XeDEDs9z@mr5`(g~6dGblI}t|72`yqjhr-m{}Lqa;3k+dmgdu z*OYR$?yPL6vC^G1PxWglUv^9#N>A7BeR;A-StF&qJbgJmo7~4>7A&t@8XFrWNH#JI zH~ZisPiqfR7milB>y=g~f%&1{zD;s-@3O4z+}Ug1>GZw<3~}679M|A0;Q0Q$Kw#S{ zCY=lDD}F#4FAUPw*0wBY84d$~0Utscq?BL;i-4+hkUOyVqW%cTANZ_2H9ubh^G}_f zC6klCi|5wX(sJD#9zH5IO61WZ&1$8xfA4mQ{a>mMhlBp1;o>-MGZz#Zv~ZTmY~r;k a{GJ#1qJ8|1{Ir~$g_tGF(hhic0QegxcFR!! literal 0 HcmV?d00001 diff --git a/Native/DenAgent/OptionsDlg.cpp b/Native/DenAgent/OptionsDlg.cpp new file mode 100644 index 0000000..cc8b41c --- /dev/null +++ b/Native/DenAgent/OptionsDlg.cpp @@ -0,0 +1,553 @@ +// OptionsDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "OptionsDlg.h" +#include "ChangePluginDirectory.h" +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// cOptionsDlg dialog + + +cOptionsDlg::cOptionsDlg(CWnd* pParent /*=NULL*/) + : CDialog(cOptionsDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(cOptionsDlg) + m_nBarAlpha = 0; + m_nViewAlpha = 0; + m_nFontChoice = 0; + m_szCustomFont = _T(""); + //}}AFX_DATA_INIT + + // Default Decal and AC Client Font + m_szDefaultFont = "Times New Roman"; + m_szACClientFont = "Times New Roman"; +} + + +void cOptionsDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(cOptionsDlg) + DDX_Control(pDX, IDC_CUSTOM_FONT_EDIT, m_CustomFontEdit); + DDX_Control(pDX, IDC_VIEWALPHA_SPIN, m_ViewAlphaSpin); + DDX_Control(pDX, IDC_BARALPHA_SPIN, m_BarAlphaSpin); + DDX_Control(pDX, IDC_BARALPHA, m_BarAlpha); + DDX_Control(pDX, IDC_VIEWALPHA, m_ViewAlpha); + DDX_Control(pDX, IDC_PLUGINDIR, m_Url); + DDX_Text(pDX, IDC_BARALPHA, m_nBarAlpha); + DDV_MinMaxInt(pDX, m_nBarAlpha, 0, 255); + DDX_Text(pDX, IDC_VIEWALPHA, m_nViewAlpha); + DDV_MinMaxInt(pDX, m_nViewAlpha, 0, 255); + DDX_Radio(pDX, IDC_DEFAULT_FONT_RADIO, m_nFontChoice); + DDX_Text(pDX, IDC_CUSTOM_FONT_EDIT, m_szCustomFont); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(cOptionsDlg, CDialog) + //{{AFX_MSG_MAP(cOptionsDlg) + ON_BN_CLICKED(IDC_CHANGE_DIR, OnChangeDir) + ON_BN_CLICKED(IDC_BTN_RESET, OnReset) + ON_BN_CLICKED(IDC_DEFAULT_FONT_RADIO, OnDefaultFontRadio) + ON_BN_CLICKED(IDC_CLIENT_FONT_RADIO, OnClientFontRadio) + ON_BN_CLICKED(IDC_CUSTOM_FONT_RADIO, OnCustomFontRadio) + //}}AFX_MSG_MAP + ON_BN_CLICKED(IDC_OLDINJECT, OnBnClickedOldInject) + ON_BN_CLICKED(IDC_TIMESTAMPON, OnBnClickedTimestampon) + ON_BN_CLICKED(IDC_FORMATHELP, OnBnClickedFormathelp) + ON_BN_CLICKED(IDC_PATCHHELP, OnBnClickedPatchHelp) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// cOptionsDlg message handlers + +BOOL cOptionsDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + m_bClientPatchesEnabled = true; + + // TODO: Add extra initialization here + RegKey key; + if( key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" )) != ERROR_SUCCESS ) + return TRUE; + + // Force spin ranges + m_ViewAlphaSpin.SetRange(0, 255); + m_BarAlphaSpin.SetRange(0, 255); + + DWORD alpha; + if(key.QueryDWORDValue("BarAlpha", alpha)==ERROR_SUCCESS) + { + m_nBarAlpha = alpha; + //CString csa; + //csa.Format("%d", alpha); + //m_BarAlpha.SetWindowText(csa); + } + else + m_nBarAlpha = 255; + //m_BarAlpha.SetWindowText("255"); + + if(key.QueryDWORDValue("ViewAlpha", alpha)==ERROR_SUCCESS) + { + m_nViewAlpha = alpha; + //CString csa; + //csa.Format("%d", alpha); + //m_ViewAlpha.SetWindowText(csa); + } + else + m_nViewAlpha = 255; + //m_ViewAlpha.SetWindowText("255"); + + DWORD dwRadarDraw = 1; + key.QueryDWORDValue( "BarRadarDraw", dwRadarDraw ); + //::SendMessage( GetDlgItem( IDC_RADARNO )->m_hWnd, BM_SETCHECK, !dwRadarDraw, 0 ); + ::SendMessage( GetDlgItem( IDC_RADARYES )->m_hWnd, BM_SETCHECK, !dwRadarDraw, 0 ); + + DWORD dwTimestamp = 0; + key.QueryDWORDValue( "Timestamp", dwTimestamp ); + //::SendMessage( GetDlgItem( IDC_TIMESTAMPOFF )->m_hWnd, BM_SETCHECK, !dwTimestamp, 0 ); + ::SendMessage( GetDlgItem( IDC_TIMESTAMPON )->m_hWnd, BM_SETCHECK, dwTimestamp, 0 ); + + //setup timestamp options + ::SendMessage( GetDlgItem( IDC_FORMATSTR )->m_hWnd, EM_SETLIMITTEXT, MAX_PATH - 1, 0 ); + ::EnableWindow( GetDlgItem( IDC_FORMATSTR )->m_hWnd, dwTimestamp ); + ::EnableWindow( GetDlgItem( IDC_FORMATCLR )->m_hWnd, dwTimestamp ); + + DWORD dwTSColor = 12; + key.QueryDWORDValue( "TimestampColor", dwTSColor ); + ::SendMessage( GetDlgItem( IDC_FORMATCLR )->m_hWnd, CB_SETCURSEL, ++dwTSColor, 0 ); + + DWORD dwDockPos = 0; + key.QueryDWORDValue( "BarDock", dwDockPos ); + ::SendMessage( GetDlgItem( IDC_DOCKPOS )->m_hWnd, CB_SETCURSEL, dwDockPos, 0 ); + + char szFormat[MAX_PATH]; + DWORD dwFormatLen = MAX_PATH; + if( key.QueryStringValue( "TimestampFormat", szFormat, &dwFormatLen ) != ERROR_SUCCESS ) //just thieved from achooks + memset( szFormat, 0, sizeof(szFormat) ), strncpy( szFormat, "[%H:%M]", sizeof( szFormat ) ); + ::SendMessage( GetDlgItem( IDC_FORMATSTR )->m_hWnd, WM_SETTEXT, 0, (LPARAM)szFormat ); + + // Get font type + DWORD dwFontType; + if (key.QueryDWORDValue("FontType", dwFontType) == ERROR_SUCCESS) + { + m_nFontChoice = (int) dwFontType; + } + + // Get the custom font name (might not be enabled) + TCHAR szFontName[512]; + DWORD dwCount = 512; + if (key.QueryStringValue("FontName", szFontName, &dwCount) == ERROR_SUCCESS) + { + m_szCustomFont = szFontName; + } + + DWORD dwAlphaBlendMode; + + // para - dialog clean up + if(key.QueryDWORDValue("AlphaBlendMode", dwAlphaBlendMode)==ERROR_SUCCESS) + if(dwAlphaBlendMode==0x2) + ::SendMessage(GetDlgItem(IDC_BLENDINGGDIPLUS)->m_hWnd, BM_SETCHECK, 1, 0); + + + DWORD dwViewMode; + + // para - dialog clean up + if( key.QueryDWORDValue( "ViewMode", dwViewMode )== ERROR_SUCCESS ) + if( dwViewMode == 1 ) + ::SendMessage( GetDlgItem( IDC_VIEWMULTI )->m_hWnd, BM_SETCHECK, 1, 0 ); + + if( key.QueryDWORDValue( "AllowWindowed", dwViewMode )== ERROR_SUCCESS ) + if( dwViewMode == 1 ) + { + ::SendMessage( GetDlgItem( IDC_WINDOWED )->m_hWnd, BM_SETCHECK, 1, 0 ); + } + + if( key.QueryDWORDValue( "AllowDualLog", dwViewMode )== ERROR_SUCCESS ) + if( dwViewMode == 1 ) + { + ::SendMessage( GetDlgItem( IDC_DUALLOG )->m_hWnd, BM_SETCHECK, 1, 0 ); + } + + if( key.QueryDWORDValue( "NoMovies", dwViewMode )== ERROR_SUCCESS ) + if( dwViewMode == 1 ) + { + ::SendMessage( GetDlgItem( IDC_NOMOVIES )->m_hWnd, BM_SETCHECK, 1, 0 ); + } + + if( key.QueryDWORDValue( "NoSplash", dwViewMode )== ERROR_SUCCESS ) + if( dwViewMode == 1 ) + { + ::SendMessage( GetDlgItem( IDC_NOLOGOS )->m_hWnd, BM_SETCHECK, 1, 0 ); + } + + if( key.QueryDWORDValue( "OldInjection", dwViewMode )== ERROR_SUCCESS ) + if( dwViewMode == 1 ) + { + ::SendMessage( GetDlgItem( IDC_OLDINJECT )->m_hWnd, BM_SETCHECK, 1, 0 ); + m_bClientPatchesEnabled = true; + ::EnableWindow( GetDlgItem( IDC_WINDOWED )->m_hWnd, FALSE ); + ::EnableWindow( GetDlgItem( IDC_DUALLOG )->m_hWnd, FALSE ); + } + + key.Close(); + + if( key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" )) != ERROR_SUCCESS ) + return TRUE; + + TCHAR szURLDirectory[ 1024 ]; + DWORD dwSize = 1024; + + if(key.QueryStringValue( _T( "DecalDirectory" ), szURLDirectory, &dwSize )==ERROR_SUCCESS) + m_Url.SetWindowText(szURLDirectory); + else + { + key.SetStringValue("DecalDirectory", "http://decal.acdev.org"); + m_Url.SetWindowText("http://decal.acdev.org"); + } + + RegKey k; + k.Create(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run")); + + TCHAR szPath[ MAX_PATH ]; + DWORD dwPathSize = MAX_PATH; + if (k.QueryStringValue("Decal", szPath, &dwPathSize) == ERROR_SUCCESS) { + ::SendMessage(GetDlgItem(IDC_CHECK_AUTOSTART)->m_hWnd, BM_SETCHECK, 1, 0); + } + + k.Close(); + + // Get the AC Client font + k.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00")); + dwCount = 512; + if (k.QueryStringValue("Font", szFontName, &dwCount) == ERROR_SUCCESS) + { + m_szACClientFont = szFontName; + } + + k.Close(); + + + UpdateData(FALSE); + + UpdateCustomEdit(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void cOptionsDlg::OnOK() +{ + UpdateData(TRUE); + + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) ); + + CString csa; + m_BarAlpha.GetWindowText(csa); + + DWORD alpha = atoi(csa); + if((alpha<0) || (alpha>255)) + alpha = 255; + + key.SetDWORDValue("BarAlpha", alpha); + + m_ViewAlpha.GetWindowText(csa); + + alpha = atoi(csa); + if((alpha<0) || (alpha>255)) + alpha = 255; + + key.SetDWORDValue("ViewAlpha", alpha); + + + + DWORD dwRadarDraw = 1; + key.QueryDWORDValue( "BarRadarDraw", dwRadarDraw ); + + if( ::SendMessage( GetDlgItem( IDC_RADARYES )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + key.SetDWORDValue( "BarRadarDraw", (DWORD)0 ); + // Drakier: No longer need BarDelta + //if( dwRadarDraw ) + //key.SetDWORDValue( "BarDelta", (DWORD)0 ); + } + + else + { + key.SetDWORDValue( "BarRadarDraw", (DWORD)1 ); + // Drakier: No longer need BarDelta + //if( !dwRadarDraw ) + //key.SetDWORDValue( "BarDelta", (DWORD)0 ); + } + + DWORD dwTimestamp = 1; + key.QueryDWORDValue( "Timestamp", dwTimestamp ); + + if( ::SendMessage( GetDlgItem( IDC_TIMESTAMPON )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + key.SetDWORDValue( "Timestamp", (DWORD)1 ); + else + key.SetDWORDValue( "Timestamp", (DWORD)0 ); + + DWORD dwColor = ::SendMessage(GetDlgItem(IDC_FORMATCLR)->m_hWnd, CB_GETCURSEL, 0, 0); + key.SetDWORDValue( "TimestampColor", --dwColor ); + + DWORD dwDockPos = ::SendMessage(GetDlgItem(IDC_DOCKPOS)->m_hWnd, CB_GETCURSEL, 0, 0); + key.SetDWORDValue( "BarDock", dwDockPos); + + char szFormat[MAX_PATH]; + ::SendMessage( GetDlgItem(IDC_FORMATSTR)->m_hWnd, WM_GETTEXT, MAX_PATH, (LPARAM)szFormat); + key.SetStringValue( "TimestampFormat", szFormat ); + + if(::SendMessage(GetDlgItem(IDC_BLENDINGGDIPLUS)->m_hWnd, BM_GETCHECK, 0, 0)) + key.SetDWORDValue("AlphaBlendMode", 0x2L); + else + key.SetDWORDValue("AlphaBlendMode", 0x1L); + + bool bMessage = false; + DWORD dwViewMode = 0; + if( ::SendMessage( GetDlgItem( IDC_WINDOWED )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + // enabled, but old inject is on + if( ! m_bClientPatchesEnabled ) + MessageBox( "One drawback of the old injection method is that Decal is not loaded before Asheron's Call.\nThis means any client patches will not work.", "Decal Agent", MB_OK ), bMessage = true; + + key.SetDWORDValue( "AllowWindowed", 0x1L ); + } + + else + key.SetDWORDValue( "AllowWindowed", 0x0L ); + + if( ::SendMessage( GetDlgItem( IDC_DUALLOG )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + // enabled, but old inject is on + if( ! m_bClientPatchesEnabled ) + if( ! bMessage ) + MessageBox( "One drawback of the old injection method is that Decal is not loaded before Asheron's Call.\nThis means any client patches will not work.", "Decal Agent", MB_OK ), bMessage = true; + + key.SetDWORDValue( "AllowDualLog", 0x1L ); + } + + else + key.SetDWORDValue( "AllowDualLog", 0x0L ); + + if( ::SendMessage( GetDlgItem( IDC_NOLOGOS )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + // enabled, but old inject is on + if( ! m_bClientPatchesEnabled ) + if( ! bMessage ) + MessageBox( "One drawback of the old injection method is that Decal is not loaded before Asheron's Call.\nThis means any client patches will not work.", "Decal Agent", MB_OK ), bMessage = true; + + key.SetDWORDValue( "NoMovies", 0x1L ); + } + + else + key.SetDWORDValue( "NoMovies", 0x0L ); + + if( ::SendMessage( GetDlgItem( IDC_NOLOGOS )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + // enabled, but old inject is on + if( ! m_bClientPatchesEnabled ) + if( ! bMessage ) + MessageBox( "One drawback of the old injection method is that Decal is not loaded before Asheron's Call.\nThis means any client patches will not work.", "Decal Agent", MB_OK ), bMessage = true; + + key.SetDWORDValue( "NoSplash", 0x1L ); + } + + else + key.SetDWORDValue( "NoSplash", 0x0L ); + + + // cbt hook injection + if( ::SendMessage(GetDlgItem(IDC_OLDINJECT)->m_hWnd, BM_GETCHECK, 0, 0) ) + { + if( key.QueryDWORDValue( "OldInjection", dwViewMode ) == ERROR_SUCCESS ) + { + if( dwViewMode != 1 ) + { + key.SetDWORDValue("OldInjection", 0x1L); + MessageBox( "You must restart DenAgent for injection method changes to take effect!", "DenAgent", MB_OK ); + } + } + + else + { + key.SetDWORDValue("OldInjection", 0x1L); + MessageBox( "You must restart DenAgent for injection method changes to take effect!", "DenAgent", MB_OK ); + } + } + + else + { + if( key.QueryDWORDValue( "OldInjection", dwViewMode ) == ERROR_SUCCESS ) + if( dwViewMode != 0 ) + { + key.SetDWORDValue("OldInjection", 0x0L); + MessageBox( "You must restart DenAgent for injection method changes to take effect!", "DenAgent", MB_OK ); + } + } + + // para - dropped viewsingle, switched around + if( ::SendMessage( GetDlgItem( IDC_VIEWMULTI )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + key.SetDWORDValue( "ViewMode", (DWORD) 1L ); + else + key.SetDWORDValue( "ViewMode", 0L ); + + // Set the font info + key.SetDWORDValue("FontType", (DWORD)m_nFontChoice); + key.SetStringValue("FontName", (LPCTSTR)m_szCustomFont); + + key.Close(); + + // Auto-Start on Bootup + RegKey k; + k.Create(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run")); + + if (::SendMessage(GetDlgItem(IDC_CHECK_AUTOSTART)->m_hWnd, BM_GETCHECK, 0, 0)) { + std::string szCmdLine = GetCommandLine(); + + if (szCmdLine[0] == '\"' && szCmdLine[szCmdLine.length() - 2] == '\"') { + szCmdLine.erase((int)0, 1); // STL is odd + szCmdLine.erase(szCmdLine.length() - 2, 1); + } + + k.SetStringValue("Decal", szCmdLine.data()); + } + else { + k.DeleteValue("Decal"); + } + + k.Close(); + + CDialog::OnOK(); +} + +void cOptionsDlg::OnChangeDir() +{ + // TODO: Add your control notification handler code here + + cChangePluginDirectory cpddlg(this); + if(cpddlg.DoModal() == IDOK ) + { + RegKey keyAgent; + if( keyAgent.Open( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" ), KEY_READ ) == ERROR_SUCCESS ) + { + TCHAR szURLDirectory[ 1024 ]; + DWORD dwSize = 1024; + keyAgent.QueryStringValue( _T( "DecalDirectory" ), szURLDirectory, &dwSize ); + m_Url.SetWindowText(szURLDirectory); + } + } +} + +void cOptionsDlg::OnReset() +{ + RegKey key; + if( key.Create( HKEY_LOCAL_MACHINE, "Software\\Decal", REG_NONE, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS ) != ERROR_SUCCESS ) + return; + + //key.DeleteValue( _T( "BarDelta" ) ); + // Drakier: New Bar stuff + key.DeleteValue( _T( "BarLength" ) ); + key.DeleteValue( _T( "BarStart" ) ); + ::AfxMessageBox( _T( "The Decal bar's position has been reset." ), MB_ICONINFORMATION | MB_OK, 0 ); +} + +void cOptionsDlg::UpdateCustomEdit(void) +{ + UpdateData(TRUE); + + // Enable for editing only for custom font only + m_CustomFontEdit.SetReadOnly(m_nFontChoice != 2); + + // Update the font name as needed + switch (m_nFontChoice) + { + case 0: // Default Font + { + m_szCustomFont = m_szDefaultFont; + } + break; + + case 1: // Current AC Client Font + { + m_szCustomFont = m_szACClientFont; + } + break; + } + + UpdateData(FALSE); +} + +void cOptionsDlg::OnDefaultFontRadio() +{ + UpdateCustomEdit(); +} + +void cOptionsDlg::OnClientFontRadio() +{ + UpdateCustomEdit(); +} + +void cOptionsDlg::OnCustomFontRadio() +{ + UpdateCustomEdit(); +} + +void cOptionsDlg::OnBnClickedOldInject() +{ + if( ::SendMessage( GetDlgItem( IDC_OLDINJECT )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + ::EnableWindow( GetDlgItem( IDC_WINDOWED )->m_hWnd, FALSE ); + ::EnableWindow( GetDlgItem( IDC_DUALLOG )->m_hWnd, FALSE ); + ::EnableWindow( GetDlgItem( IDC_NOMOVIES )->m_hWnd, FALSE ); + ::EnableWindow( GetDlgItem( IDC_NOLOGOS )->m_hWnd, FALSE ); + m_bClientPatchesEnabled = false; + } + + else + { + ::EnableWindow( GetDlgItem( IDC_WINDOWED )->m_hWnd, TRUE ); + ::EnableWindow( GetDlgItem( IDC_DUALLOG )->m_hWnd, TRUE ); + ::EnableWindow( GetDlgItem( IDC_NOMOVIES )->m_hWnd, TRUE ); + ::EnableWindow( GetDlgItem( IDC_NOLOGOS )->m_hWnd, TRUE ); + m_bClientPatchesEnabled = true; + } +} + +void cOptionsDlg::OnBnClickedTimestampon() +{ + //we need to activate the options when this is enabled + if( ::SendMessage( GetDlgItem( IDC_TIMESTAMPON )->m_hWnd, BM_GETCHECK, 0, 0 ) ) + { + ::EnableWindow( GetDlgItem( IDC_FORMATSTR )->m_hWnd, true ); + ::EnableWindow( GetDlgItem( IDC_FORMATCLR )->m_hWnd, true ); + } + + else + { + ::EnableWindow( GetDlgItem( IDC_FORMATSTR )->m_hWnd, false ); + ::EnableWindow( GetDlgItem( IDC_FORMATCLR )->m_hWnd, false ); + } +} + +void cOptionsDlg::OnBnClickedFormathelp() +{ + //open up ie and point at.... TimestampFormat.htm + ShellExecute(m_hWnd, _T("open"), _T("http://decal.acdev.org/TimestampFormat.htm"), 0, 0, 0); +} + +void cOptionsDlg::OnBnClickedPatchHelp() +{ + ShellExecute(m_hWnd, _T("open"), _T("http://decal.acdev.org/clientpatchinfo.html"), 0, 0, 0); +} \ No newline at end of file diff --git a/Native/DenAgent/OptionsDlg.h b/Native/DenAgent/OptionsDlg.h new file mode 100644 index 0000000..cbd210b --- /dev/null +++ b/Native/DenAgent/OptionsDlg.h @@ -0,0 +1,74 @@ +#include "afxwin.h" +#if !defined(AFX_OPTIONSDLG_H__F2DBFC10_6835_494D_9A03_B97D9068BAF9__INCLUDED_) +#define AFX_OPTIONSDLG_H__F2DBFC10_6835_494D_9A03_B97D9068BAF9__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// OptionsDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// cOptionsDlg dialog + +class cOptionsDlg : public CDialog +{ +// Construction +public: + cOptionsDlg(CWnd* pParent = NULL); // standard constructor + + void UpdateCustomEdit(void); + + CString m_szDefaultFont; + CString m_szACClientFont; + +// Dialog Data + //{{AFX_DATA(cOptionsDlg) + enum { IDD = IDD_OPTIONS }; + CEdit m_CustomFontEdit; + CSpinButtonCtrl m_ViewAlphaSpin; + CSpinButtonCtrl m_BarAlphaSpin; + CEdit m_BarAlpha; + CEdit m_ViewAlpha; + CStatic m_Url; + int m_nBarAlpha; + int m_nViewAlpha; + int m_nFontChoice; + CString m_szCustomFont; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(cOptionsDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + bool m_bClientPatchesEnabled; + + // Generated message map functions + //{{AFX_MSG(cOptionsDlg) + virtual BOOL OnInitDialog(); + virtual void OnOK(); + afx_msg void OnChangeDir(); + afx_msg void OnReset(); + afx_msg void OnDefaultFontRadio(); + afx_msg void OnClientFontRadio(); + afx_msg void OnCustomFontRadio(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedOldInject(); + afx_msg void OnBnClickedCheckAutostart(); + afx_msg void OnBnClickedTimestampon(); + afx_msg void OnBnClickedFormathelp(); + afx_msg void OnBnClickedPatchHelp(); +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_OPTIONSDLG_H__F2DBFC10_6835_494D_9A03_B97D9068BAF9__INCLUDED_) diff --git a/Native/DenAgent/ReadMe.txt b/Native/DenAgent/ReadMe.txt new file mode 100644 index 0000000..59bb9d2 --- /dev/null +++ b/Native/DenAgent/ReadMe.txt @@ -0,0 +1,88 @@ +======================================================================== + MICROSOFT FOUNDATION CLASS LIBRARY : DenAgent +======================================================================== + + +AppWizard has created this DenAgent application for you. This application +not only demonstrates the basics of using the Microsoft Foundation classes +but is also a starting point for writing your application. + +This file contains a summary of what you will find in each of the files that +make up your DenAgent application. + +DenAgent.dsp + This file (the project file) contains information at the project level and + is used to build a single project or subproject. Other users can share the + project (.dsp) file, but they should export the makefiles locally. + +DenAgent.h + This is the main header file for the application. It includes other + project specific headers (including Resource.h) and declares the + CDenAgentApp application class. + +DenAgent.cpp + This is the main application source file that contains the application + class CDenAgentApp. + +DenAgent.rc + This is a listing of all of the Microsoft Windows resources that the + program uses. It includes the icons, bitmaps, and cursors that are stored + in the RES subdirectory. This file can be directly edited in Microsoft + Visual C++. + +DenAgent.clw + This file contains information used by ClassWizard to edit existing + classes or add new classes. ClassWizard also uses this file to store + information needed to create and edit message maps and dialog data + maps and to create prototype member functions. + +res\DenAgent.ico + This is an icon file, which is used as the application's icon. This + icon is included by the main resource file DenAgent.rc. + +res\DenAgent.rc2 + This file contains resources that are not edited by Microsoft + Visual C++. You should place all resources not editable by + the resource editor in this file. + + + + +///////////////////////////////////////////////////////////////////////////// + +AppWizard creates one dialog class: + +DenAgentDlg.h, DenAgentDlg.cpp - the dialog + These files contain your CDenAgentDlg class. This class defines + the behavior of your application's main dialog. The dialog's + template is in DenAgent.rc, which can be edited in Microsoft + Visual C++. + + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named DenAgent.pch and a precompiled types file named StdAfx.obj. + +Resource.h + This is the standard header file, which defines new resource IDs. + Microsoft Visual C++ reads and updates this file. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" to indicate parts of the source code you +should add to or customize. + +If your application uses MFC in a shared DLL, and your application is +in a language other than the operating system's current language, you +will need to copy the corresponding localized resources MFC42XXX.DLL +from the Microsoft Visual C++ CD-ROM onto the system or system32 directory, +and rename it to be MFCLOC.DLL. ("XXX" stands for the language abbreviation. +For example, MFC42DEU.DLL contains resources translated to German.) If you +don't do this, some of the UI elements of your application will remain in the +language of the operating system. + +///////////////////////////////////////////////////////////////////////////// diff --git a/Native/DenAgent/SinkImpl.cpp b/Native/DenAgent/SinkImpl.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Native/DenAgent/StdAfx.cpp b/Native/DenAgent/StdAfx.cpp new file mode 100644 index 0000000..1469052 --- /dev/null +++ b/Native/DenAgent/StdAfx.cpp @@ -0,0 +1,5 @@ +// stdafx.cpp : source file that includes just the standard includes +// DenAgent.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" diff --git a/Native/DenAgent/StdAfx.h b/Native/DenAgent/StdAfx.h new file mode 100644 index 0000000..6e91378 --- /dev/null +++ b/Native/DenAgent/StdAfx.h @@ -0,0 +1,64 @@ +// 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__017FA8D0_FE44_43D6_956B_FB615165AF2B__INCLUDED_) +#define AFX_STDAFX_H__017FA8D0_FE44_43D6_956B_FB615165AF2B__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define WINVER 0x0410 +#define _WIN32_DCOM + +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + +#pragma warning(disable:4530) + +#include // MFC core and standard components +#include // MFC extensions +#include // MFC support for Internet Explorer 4 Common Controls +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include + +#include +#include +#include + +#define _ATL_APARTMENT_THREADED +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +class CDenAgentModule : public CComModule +{ +public: + LONG Unlock(); + LONG Lock(); + LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2); + DWORD dwThreadID; +}; +extern CDenAgentModule _Module; +#include + +#import +#include +#include + +#include "../include/Helpers.h" + +extern LONG g_fAbortDownload; + +struct FILELIST { CString strFile; CString strLFile; }; + +//extern FILELIST g_FileList[3]; + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__017FA8D0_FE44_43D6_956B_FB615165AF2B__INCLUDED_) diff --git a/Native/DenAgent/TrayWnd.cpp b/Native/DenAgent/TrayWnd.cpp new file mode 100644 index 0000000..194b923 --- /dev/null +++ b/Native/DenAgent/TrayWnd.cpp @@ -0,0 +1,507 @@ +// TrayWnd.cpp : implementation file +// + +#include "stdafx.h" +#include "DenAgent.h" +#include "TrayWnd.h" +#include "..\Inject\InjectApi.h" + +#include "forcelib.h" + +#include "DenAgentDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +#define ID_SYSTRAY 1 +#define NM_SYSTRAY ( WM_USER + 1000 ) + +const UINT s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); + +bool g_bOldInject; + +// Inject Enable/Inject Disable function pointers +typedef void (*VoidNoParams)(); + +VoidNoParams InjEnable = NULL; +VoidNoParams InjDisable = NULL; + +// HMODULE for Inject dll +HMODULE g_hInj = NULL; + +// This is for our windows enumeration process +BOOL CALLBACK EnumerationCallbackProc( HWND, LPARAM ); +CTrayWnd* CTrayWnd::s_pWnd = NULL; + +///////////////////////////////////////////////////////////////////////////// +// CTrayWnd + +CTrayWnd::CTrayWnd() +: m_pDialog( NULL ), m_uiTimer( NULL ) +{ + s_pWnd = this; +} + +CTrayWnd::~CTrayWnd() +{ + s_pWnd = NULL; +} + +BEGIN_MESSAGE_MAP(CTrayWnd, CWnd) + //{{AFX_MSG_MAP(CTrayWnd) + ON_WM_CREATE() + ON_WM_DESTROY() + ON_WM_TIMER() + ON_COMMAND(ID_SYSTRAY_CONFIGURE, OnSystrayConfigure) + ON_COMMAND(ID_SYSTRAY_EXIT, OnSystrayExit) + ON_REGISTERED_MESSAGE(s_uTaskbarRestart, OnTaskbarRestart) + //}}AFX_MSG_MAP + ON_MESSAGE(NM_SYSTRAY, OnSysTray) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CTrayWnd message handlers + +LRESULT CTrayWnd::OnTaskbarRestart(WPARAM, LPARAM) +{ + NOTIFYICONDATA nid; + ::memset( &nid, 0, sizeof( NOTIFYICONDATA ) ); + + nid.cbSize = sizeof( NOTIFYICONDATA ); + nid.hWnd = m_hWnd; + nid.uID = ID_SYSTRAY; + nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + nid.uCallbackMessage = NM_SYSTRAY; + nid.hIcon = AfxGetApp()->LoadIcon( IDR_TRAYICON ); + ::_tcscpy( nid.szTip, _T( "Decal Agent" ) ); + + ::Shell_NotifyIcon( NIM_DELETE, &nid ); + ::Shell_NotifyIcon( NIM_ADD, &nid ); + + DestroyIcon(nid.hIcon); + return TRUE; +} + +void CTrayWnd::showDialog() +{ + if( m_pDialog == NULL ) + { + CDenAgentDlg dlg; + + m_pDialog = &dlg; + dlg.DoModal(); + m_pDialog = NULL; + } + else + { + m_pDialog->SetForegroundWindow(); + m_pDialog->BringWindowToTop(); + } +} + +int CTrayWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (CWnd::OnCreate(lpCreateStruct) == -1) + return -1; + + ::CoInitialize( NULL ); + + // Check if asheron's call is already running + HWND wndAC = ::FindWindowEx( NULL, NULL, _T( "Asheron's Call" ), _T( "Asheron's Call" ) ); + + bEnabled = ( wndAC == NULL ); + if( wndAC != NULL ) + { + ::AfxMessageBox( _T( "Asheron's Call was started before the Agent.\r\nNo plugins will be installed until Asheron's Call and the agent are exited and restarted.\r\n\r\nThe Agent must be run before Asheron's Call to properly install plugins." ), MB_ICONERROR | MB_OK ); + ::PostQuitMessage( 0 ); + } + + else + { + RegKey key; + DWORD dwOldInj; + if( key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" )) != ERROR_SUCCESS ) + { + g_bOldInject = false; + m_uiTimer = SetTimer (1, 1000, NULL); + } + + else + { + if( key.QueryDWORDValue( "OldInjection", dwOldInj ) == ERROR_SUCCESS ) + { + if( dwOldInj == 1 ) + { + g_bOldInject = true; + + TCHAR szInjectDll[ MAX_PATH ]; + memset( szInjectDll, 0, sizeof( szInjectDll ) / sizeof( szInjectDll[0] ) ); + + // Open the COM CoClass for IPager to get Inject.dll path + if( key.Open( HKEY_CLASSES_ROOT, _T( "CLSID\\{C79E2F76-06F8-4CD0-A613-4829237D297D}\\InprocServer32" ), KEY_READ ) == ERROR_SUCCESS ) + { + DWORD dwChars = MAX_PATH - 1; + if( key.QueryStringValue( NULL, szInjectDll, &dwChars ) != ERROR_SUCCESS ) + { + ::AfxMessageBox( _T( "There is a serious problem with the Decal Agent registry settings!!\n\nExiting." ), MB_ICONERROR | MB_OK ); + ::PostQuitMessage( 0 ); + } + } + + g_hInj = LoadLibrary( szInjectDll ); + + InjEnable = (VoidNoParams) GetProcAddress( g_hInj, (LPCSTR) 0x00000012 ); + InjDisable = (VoidNoParams) GetProcAddress( g_hInj, (LPCSTR) 0x00000011 ); + + if( !InjEnable || !InjDisable ) + { + ::AfxMessageBox( _T( "Can't load Inject.dll. Please turn off old style injection." ), MB_ICONERROR | MB_OK ); + g_bOldInject = false; + } + + else + ::InjEnable(); + } + + else + { + g_bOldInject = false; + m_uiTimer = SetTimer( 1, 1000, NULL ); + } + } + + else + { + g_bOldInject = false; + m_uiTimer = SetTimer( 1, 1000, NULL ); + } + } + } + + // Create the system tray icon + NOTIFYICONDATA nid; + ::memset( &nid, 0, sizeof( NOTIFYICONDATA ) ); + + nid.cbSize = sizeof( NOTIFYICONDATA ); + nid.hWnd = m_hWnd; + nid.uID = ID_SYSTRAY; + nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + nid.uCallbackMessage = NM_SYSTRAY; + nid.hIcon = AfxGetApp()->LoadIcon( IDR_TRAYICON ); + ::_tcscpy( nid.szTip, _T( "Decal Agent" ) ); + + ::Shell_NotifyIcon( NIM_ADD, &nid ); + + DestroyIcon(nid.hIcon); + + // Get the image path (path of parent executable) + TCHAR szImagePath[ MAX_PATH ]; + ::GetModuleFileName( NULL, szImagePath, MAX_PATH ); + + LPTSTR strProcessName = ::_tcsrchr( szImagePath, _T( '\\' ) ); + *( strProcessName + 1 ) = _T( '\0' ); + + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" ) ); + key.SetStringValue( _T( "AgentPath" ), szImagePath ); + + return 0; +} + +void CTrayWnd::OnDestroy() +{ + CWnd::OnDestroy(); + + NOTIFYICONDATA nid; + ::memset( &nid, 0, sizeof( NOTIFYICONDATA ) ); + + nid.cbSize = sizeof( NOTIFYICONDATA ); + nid.hWnd = m_hWnd; + nid.uID = ID_SYSTRAY; + + ::Shell_NotifyIcon( NIM_DELETE, &nid ); + + if( g_bOldInject ) + { + if( bEnabled ) + ::InjDisable(); + + InjEnable = NULL; + InjDisable = NULL; + FreeLibrary( g_hInj ); + } + + else + if( m_uiTimer ) + { + KillTimer (m_uiTimer); + m_uiTimer = 0; + } + + + ::CoUninitialize(); +} + +void CTrayWnd::OnTimer (UINT_PTR nIDEvent) +{ + ::EnumWindows( EnumerationCallbackProc, (LPARAM) NULL ); +} + +BOOL CALLBACK EnumerationCallbackProc( HWND hwnd, LPARAM lParam ) +{ + TCHAR szClassName[64]; + memset( szClassName, 0, sizeof( szClassName ) / sizeof( szClassName[0] ) ); + GetClassName( hwnd, szClassName, 64 ); + + if( _tcsicmp( _T( "ZoneLobbyWindow" ), szClassName ) != 0 ) + { + return TRUE; + } + + if( CTrayWnd::s_pWnd != NULL ) + return CTrayWnd::s_pWnd->OnEnum( hwnd ); + else + return FALSE; +} + +BOOL CTrayWnd::OnEnum( HWND hWndLobby ) +{ + if( hWndLobby != NULL ) + { + DWORD dwProcessId = 0; + GetWindowThreadProcessId( hWndLobby, &dwProcessId ); + + if( dwProcessId != 0 ) + { + TCHAR tszBuffer [256]; + + ::_stprintf (tszBuffer, _T("__LOBBYHOOK_%d"), dwProcessId); + HANDLE hLobbySemaphore = ::CreateSemaphore (NULL, 0, 1, tszBuffer); + + DWORD dwLastError = ::GetLastError (); + + if (hLobbySemaphore) + { + ::CloseHandle (hLobbySemaphore); + + if (dwLastError == ERROR_ALREADY_EXISTS) + { + // The lobbyhook has already been injected, we know because it created the semaphore. + return TRUE; + } + } + + RegKey key; + + TCHAR szDll[ MAX_PATH ]; + TCHAR szDllPath[ MAX_PATH ]; + memset( szDllPath, 0, sizeof( szDllPath ) / sizeof( szDllPath[0] ) ); + + if( key.Open( HKEY_LOCAL_MACHINE, _T( "Software\\Decal\\Agent" ), KEY_READ ) == ERROR_SUCCESS ) + { + DWORD dwChars = MAX_PATH - 1; + if( key.QueryStringValue( _T( "AgentPath" ), szDllPath, &dwChars ) == ERROR_SUCCESS ) + { + lstrcpy( szDll, szDllPath ); + lstrcat( szDll, _T( "\\ForceLibrary.dll" ) ); + } + + else + { + DWORD dwError = GetLastError(); + char szBuffer[256]; + + _snprintf( szBuffer, sizeof( szBuffer ), "Couldn't query AgentPath value: 0x%08lx", dwError ); + ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_OK ); + } + } + + else + { + DWORD dwError = GetLastError(); + char szBuffer[256]; + + _snprintf( szBuffer, sizeof( szBuffer ), "Couldn't open HKLM\\Software\\Decal\\Agent key: 0x%08lx", dwError ); + ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_OK ); + } + + if( szDllPath[0] ) + { + HMODULE hLib = (HMODULE) ForceLibraryNow( dwProcessId, szDll ); + if( hLib == NULL ) + { + DWORD dwError = GetLastError(); + char szBuffer[256]; + + _snprintf( szBuffer, sizeof( szBuffer ), "ForceLibraryNow (LobbyHook.dll) has failed( 0x%08lx )\nDo you want to switch to old style injection?\nIf Decal is loading in AC properly answer no.", dwError ); + + // Kill timer to avoid 1000 popups + KillTimer( m_uiTimer ); + m_uiTimer = 0; + + int iRet = ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_YESNO ); + if( iRet == IDYES ) + { + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) ); + key.SetDWORDValue("OldInjection", 0x1L); + g_bOldInject = true; + + TCHAR szInjectDll[ MAX_PATH ]; + memset( szInjectDll, 0, sizeof( szInjectDll ) / sizeof( szInjectDll[0] ) ); + + // Open the COM CoClass for IPager to get Inject.dll path + if( key.Open( HKEY_CLASSES_ROOT, _T( "CLSID\\{C79E2F76-06F8-4CD0-A613-4829237D297D}\\InprocServer32" ), KEY_READ ) == ERROR_SUCCESS ) + { + DWORD dwChars = MAX_PATH - 1; + if( key.QueryStringValue( NULL, szInjectDll, &dwChars ) != ERROR_SUCCESS ) + { + ::AfxMessageBox( _T( "There is a serious problem with the Decal Agent registry settings!!\n\nExiting." ), MB_ICONERROR | MB_OK ); + ::PostQuitMessage( 0 ); + } + } + + g_hInj = LoadLibrary( szInjectDll ); + + InjEnable = (VoidNoParams) GetProcAddress( g_hInj, (LPCSTR) 0x00000012 ); + InjDisable = (VoidNoParams) GetProcAddress( g_hInj, (LPCSTR) 0x00000011 ); + + ::InjEnable(); + } + + else // no + { + _snprintf( szBuffer, sizeof( szBuffer ), "Lobby Injection halted... restart DenAgent to try again." ); + ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_OK ); + } + + } + + lstrcpy( szDll, szDllPath ); + lstrcat( szDll, _T( "\\LobbyHook.dll" ) ); + hLib = (HMODULE) ForceLibraryNow( dwProcessId, szDll ); + + if( hLib == NULL ) + { + DWORD dwError = GetLastError(); + char szBuffer[256]; + + _snprintf( szBuffer, sizeof( szBuffer ), "ForceLibraryNow (LobbyHook.dll) has failed( 0x%08lx )\nDo you want to switch to old style injection?\nIf Decal is loading in AC properly answer no.", dwError ); + + // Kill timer + KillTimer( m_uiTimer ); + m_uiTimer = 0; + + int iRet = ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_YESNO ); + if( iRet == IDYES ) + { + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) ); + key.SetDWORDValue("OldInjection", 0x1L); + g_bOldInject = true; + + TCHAR szInjectDll[ MAX_PATH ]; + memset( szInjectDll, 0, sizeof( szInjectDll ) / sizeof( szInjectDll[0] ) ); + + // Open the COM CoClass for IPager to get Inject.dll path + if( key.Open( HKEY_CLASSES_ROOT, _T( "CLSID\\{C79E2F76-06F8-4CD0-A613-4829237D297D}\\InprocServer32" ), KEY_READ ) == ERROR_SUCCESS ) + { + DWORD dwChars = MAX_PATH - 1; + if( key.QueryStringValue( NULL, szInjectDll, &dwChars ) != ERROR_SUCCESS ) + { + ::AfxMessageBox( _T( "There is a serious problem with the Decal Agent registry settings!!\n\nExiting." ), MB_ICONERROR | MB_OK ); + ::PostQuitMessage( 0 ); + } + } + + g_hInj = LoadLibrary( szInjectDll ); + + InjEnable = (VoidNoParams) GetProcAddress( g_hInj, (LPCSTR) 0x00000012 ); + InjDisable = (VoidNoParams) GetProcAddress( g_hInj, (LPCSTR) 0x00000011 ); + + ::InjEnable(); + } + + else // no + { + _snprintf( szBuffer, sizeof( szBuffer ), "Lobby Injection halted... restart DenAgent to try again." ); + ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_OK ); + } + } + } + + else + { + DWORD dwError = GetLastError(); + char szBuffer[256]; + + _snprintf( szBuffer, sizeof( szBuffer ), "DLL path was blank: 0x%08lx", dwError ); + ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_OK ); + } + } + + else + { + DWORD dwError = GetLastError(); + char szBuffer[256]; + + _snprintf( szBuffer, sizeof( szBuffer ), "Couldn't get process id: 0x%08lx", dwError ); + ::MessageBox( NULL, szBuffer, _T( "DenAgent" ), MB_OK ); + } + + } + + return TRUE; +} + +LRESULT CTrayWnd::OnSysTray(WPARAM nID, LPARAM uMsg) +{ + // We should only receive message for the one systray we register + ASSERT( nID == ID_SYSTRAY ); + + switch( uMsg ) + { + case WM_RBUTTONUP: + { + POINT pt; + ::GetCursorPos( &pt ); + CMenu menu; + menu.LoadMenu( IDR_POPUPS ); + CMenu *pSystray = menu.GetSubMenu( 0 ); + + pSystray->SetDefaultItem( 0, TRUE ); + SetForegroundWindow(); + pSystray->TrackPopupMenu( TPM_RIGHTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this ); + } + break; + + case WM_LBUTTONUP: + showDialog(); + break; + } + + return 0; +} + +void CTrayWnd::OnSystrayConfigure() +{ + showDialog(); +} + +void CTrayWnd::OnSystrayExit() +{ + DestroyWindow(); + ::PostQuitMessage( 0 ); +} + +void CTrayWnd::UpdateXMLFiles() +{ + CDenAgentDlg dlg; + m_pDialog = &dlg; + dlg.m_bDoUpdate = true; + dlg.DoModal( ); + m_pDialog = NULL; +} diff --git a/Native/DenAgent/TrayWnd.h b/Native/DenAgent/TrayWnd.h new file mode 100644 index 0000000..34203dc --- /dev/null +++ b/Native/DenAgent/TrayWnd.h @@ -0,0 +1,67 @@ +#if !defined(AFX_TRAYWND_H__6CE1FB59_8D19_44C1_8064_0AEE1B3AA745__INCLUDED_) +#define AFX_TRAYWND_H__6CE1FB59_8D19_44C1_8064_0AEE1B3AA745__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// TrayWnd.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CTrayWnd window + +class CTrayWnd : public CWnd +{ +// Construction +public: + CTrayWnd(); + +// Attributes +public: + +// Operations +public: + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CTrayWnd) + //}}AFX_VIRTUAL + +// Implementation +public: + virtual ~CTrayWnd(); + bool bEnabled; + + CWnd *m_pDialog; + + UINT_PTR m_uiTimer; + + void showDialog(); + + void UpdateXMLFiles(); + + BOOL OnEnum( HWND hWndLobby ); + static CTrayWnd* s_pWnd; + + // Generated message map functions +protected: + //{{AFX_MSG(CTrayWnd) + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + afx_msg void OnDestroy(); + afx_msg void OnTimer(UINT_PTR nIDEvent); + afx_msg void OnSystrayConfigure(); + afx_msg void OnSystrayExit(); + afx_msg LRESULT OnTaskbarRestart(WPARAM, LPARAM); + //}}AFX_MSG + + afx_msg LRESULT OnSysTray(WPARAM, LPARAM); + + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_TRAYWND_H__6CE1FB59_8D19_44C1_8064_0AEE1B3AA745__INCLUDED_) diff --git a/Native/DenAgent/URLCallback.cpp b/Native/DenAgent/URLCallback.cpp new file mode 100644 index 0000000..8c2a0bf --- /dev/null +++ b/Native/DenAgent/URLCallback.cpp @@ -0,0 +1,123 @@ +// URLCallback.cpp : Implementation of cURLCallback +#include "stdafx.h" +#include "DenAgent.h" +#include "URLCallback.h" + +#include "DownloadDlg.h" + +///////////////////////////////////////////////////////////////////////////// +// cURLCallback + +void cURLCallback::start( REFCLSID clsid, LPCWSTR szURL, DWORD dwMajor, DWORD dwMinor ) +{ + // Create the bind context + CComPtr< IBindCtx > pBindCtx; + ::CreateAsyncBindCtx( 0, this, NULL, &pBindCtx ); + + HRESULT hRes = ::CoCreateInstance( CLSID_InternetZoneManager, NULL, CLSCTX_SERVER, IID_IInternetZoneManager, + reinterpret_cast< void ** >( &m_pZone ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + m_pZone->GetZoneActionPolicy( URLZONE_INTERNET, URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX, reinterpret_cast< BYTE * >( &m_dwOldPolicy ), + sizeof( DWORD ), URLZONEREG_HKCU ); + + DWORD dwPolicy = URLPOLICY_QUERY; + m_pZone->SetZoneActionPolicy( URLZONE_INTERNET, URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX, reinterpret_cast< BYTE * >( &dwPolicy ), + sizeof( DWORD ), URLZONEREG_HKCU ); + + hRes = ::CoGetClassObjectFromURL( clsid, szURL, 0xFFFFFFFF, 0xFFFFFFFF, L"application/x-oleobject", + pBindCtx, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, reinterpret_cast< void ** >( &m_pDlg->m_pFactory ) ); + + if( FAILED( hRes ) ) + { + m_pDlg->EndDialog( IDCANCEL ); + resetZone(); + } + else if( hRes == S_OK ) + { + m_pDlg->m_pFactory->LockServer( TRUE ); + m_pDlg->EndDialog( IDOK ); + resetZone(); + } + + // Otherwise, we'll assume that we're hapilly downloading asynchronously +} + +void cURLCallback::stop() +{ + m_pDlg->m_wndStop.EnableWindow( FALSE ); + m_pBinding->Abort(); +} + +void cURLCallback::resetZone() +{ + m_pZone->SetZoneActionPolicy( URLZONE_INTERNET, URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX, reinterpret_cast< BYTE * >( &m_dwOldPolicy ), + sizeof( DWORD ), URLZONEREG_HKCU ); + m_pZone.Release(); +} + +STDMETHODIMP cURLCallback::GetBindInfo( DWORD *pgrfBINF, BINDINFO *pbindinfo ) +{ + *pgrfBINF = BINDF_ASYNCHRONOUS | BINDF_GETNEWESTVERSION | BINDF_FROMURLMON | BINDF_IGNORESECURITYPROBLEM; + + // Not changing the defaults in pbindinfo + return S_OK; +} + +STDMETHODIMP cURLCallback::OnObjectAvailable( REFIID iid, IUnknown *pUnk ) +{ + // Save the object pointer + _ASSERTE( iid == IID_IClassFactory ); + + m_pDlg->m_pFactory = static_cast< IClassFactory * >( pUnk ); + m_pDlg->m_pFactory->LockServer( TRUE ); + + return S_OK; +} + +STDMETHODIMP cURLCallback::OnProgress( ULONG ulProgress, ULONG ulProgressMax, ULONG, LPCWSTR szStatusText ) +{ + USES_CONVERSION; + + // Update the status in the dialog + m_pDlg->SetDlgItemText( IDC_STATUSTEXT, W2T( szStatusText ) ); + + m_pDlg->m_wndProgress.SetRange32( 0, ulProgressMax ); + m_pDlg->m_wndProgress.SetPos( ulProgress ); + + return S_OK; +} + +STDMETHODIMP cURLCallback::OnStartBinding( DWORD, IBinding *pBinding ) +{ + m_pBinding = pBinding; + m_pDlg->m_wndStop.EnableWindow(); + + return S_OK; +} + +STDMETHODIMP cURLCallback::OnStopBinding( HRESULT hr, LPCWSTR strError ) +{ + + USES_CONVERSION; + + if( SUCCEEDED( hr ) ) + m_pDlg->EndDialog( IDOK ); + else + { + ::AfxMessageBox( W2T( strError ), MB_ICONERROR | MB_OK, 0 ); + m_pDlg->EndDialog( IDCANCEL ); + } + + resetZone(); + m_pBinding.Release(); + + return S_OK; +} + +STDMETHODIMP cURLCallback::GetWindow( REFGUID rguidReason, HWND *phwnd ) +{ + *phwnd = m_pDlg->m_hWnd; + return S_OK; +} diff --git a/Native/DenAgent/URLCallback.h b/Native/DenAgent/URLCallback.h new file mode 100644 index 0000000..b93db91 --- /dev/null +++ b/Native/DenAgent/URLCallback.h @@ -0,0 +1,203 @@ +// URLCallback.h : Declaration of the cURLCallback + +#ifndef __URLCALLBACK_H_ +#define __URLCALLBACK_H_ + +#include "resource.h" // main symbols +#include "DownloadDlg.h" + +///////////////////////////////////////////////////////////////////////////// +// cURLCallback +class ATL_NO_VTABLE cURLCallback : + public CComObjectRootEx, + public IBindStatusCallback, + public IServiceProvider, + public IInternetSecurityManager, + public IInternetHostSecurityManager, + public ICodeInstall +{ +public: + cURLCallback() + { + } + ~cURLCallback() + { + } + +BEGIN_COM_MAP(cURLCallback) + COM_INTERFACE_ENTRY(IBindStatusCallback) + COM_INTERFACE_ENTRY(IServiceProvider) + COM_INTERFACE_ENTRY(IInternetSecurityManager) + COM_INTERFACE_ENTRY(IInternetHostSecurityManager) + COM_INTERFACE_ENTRY(ICodeInstall) + COM_INTERFACE_ENTRY(IWindowForBindingUI) +END_COM_MAP() + + CComPtr< IBinding > m_pBinding; + CComPtr< IInternetZoneManager > m_pZone; + DWORD m_dwOldPolicy; + cDownloadDlg *m_pDlg; + + // Helper functions for setting up a transfer + void start( REFCLSID clsid, LPCWSTR szURL, DWORD dwMajor, DWORD dwMinor ); + void stop(); + + void resetZone(); + +public: + // IBindStatusCallback + + STDMETHOD(GetBindInfo)( DWORD *pgrfBINDF, BINDINFO *pbindinfo ); + STDMETHOD(GetPriority)( LONG *pnPriority ) + { + *pnPriority = THREAD_PRIORITY_NORMAL; + return S_OK; + } + + STDMETHOD(OnDataAvailable)( DWORD, DWORD, FORMATETC *, STGMEDIUM * ) + { + return E_NOTIMPL; + } + + STDMETHOD(OnLowResource)(DWORD) + { + return E_NOTIMPL; + } + + STDMETHOD(OnObjectAvailable)( REFIID iid, IUnknown *pUnk ); + STDMETHOD(OnProgress)( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText ); + STDMETHOD(OnStartBinding)( DWORD dwReserved, IBinding *pBinding ); + STDMETHOD(OnStopBinding)( HRESULT hr, LPCWSTR szStatusText ); + + // IServiceProvider + STDMETHOD(QueryService)(REFGUID sid,REFIID iid,void **ppvItf) + { + return static_cast< IServiceProvider * >( this )->QueryInterface( iid, ppvItf ); + } + + // IInternetSecurityManager + CComPtr< IInternetSecurityMgrSite > m_pSecuritySite; + + STDMETHOD(SetSecuritySite)(IInternetSecurityMgrSite*pSite) + { + m_pSecuritySite = pSite; + + return S_OK; + } + + STDMETHOD(GetSecuritySite)(IInternetSecurityMgrSite **ppSite) + { + return m_pSecuritySite->QueryInterface( ppSite ); + } + + STDMETHOD(MapUrlToZone)(LPCWSTR,DWORD*pdwZone,DWORD) + { + // All URLs are on the local machine - most trusted + *pdwZone = URLZONE_LOCAL_MACHINE; + return S_OK; + } + + STDMETHOD(GetSecurityId)(LPCWSTR,BYTE*,DWORD*,DWORD) + { + return INET_E_DEFAULT_ACTION; + } + + STDMETHOD(ProcessUrlAction)( + /* [in] */ LPCWSTR pwszUrl, + /* [in] */ DWORD dwAction, + /* [size_is][out] */ BYTE *pPolicy, + /* [in] */ DWORD cbPolicy, + /* [in] */ BYTE *pContext, + /* [in] */ DWORD cbContext, + /* [in] */ DWORD dwFlags, + /* [in] */ DWORD dwReserved = 0) + { + if( cbPolicy == sizeof( DWORD ) ) + { + // Set everything to allow + *reinterpret_cast< DWORD * >( pPolicy ) = URLPOLICY_ALLOW; + return S_OK; + } + + return INET_E_DEFAULT_ACTION; + } + + STDMETHOD(QueryCustomPolicy)(LPCWSTR,REFGUID,BYTE**,DWORD*,BYTE*,DWORD,DWORD) + { + return INET_E_DEFAULT_ACTION; + } + + STDMETHOD(SetZoneMapping)(DWORD,LPCWSTR,DWORD) + { + return INET_E_DEFAULT_ACTION; + } + + STDMETHOD(GetZoneMappings)(DWORD,IEnumString**,DWORD) + { + return INET_E_DEFAULT_ACTION; + } + + // IInternetHostSecurityManager + STDMETHOD(GetSecurityId)( BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved) + { + static LPCTSTR strSecurity = _T( "None:localhost+My Computer" ); + ::strcpy( reinterpret_cast< char * >( pbSecurityId ), strSecurity ); + *pcbSecurityId = ::_tcslen( strSecurity ); + + return S_OK; + } + + STDMETHOD(ProcessUrlAction)( + /* [in] */ DWORD dwAction, + /* [size_is][out] */ BYTE __RPC_FAR *pPolicy, + /* [in] */ DWORD cbPolicy, + /* [in] */ BYTE __RPC_FAR *pContext, + /* [in] */ DWORD cbContext, + /* [in] */ DWORD dwFlags, + /* [in] */ DWORD dwReserved) + { + switch( dwAction ) + { + case URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX: + *reinterpret_cast< DWORD * >( pPolicy ) = URLPOLICY_QUERY; + return S_OK; + } + + if( cbPolicy == sizeof( DWORD ) ) + { + // Set everything to allow + *reinterpret_cast< DWORD * >( pPolicy ) = URLPOLICY_ALLOW; + return S_OK; + } + + return INET_E_DEFAULT_ACTION; + } + + virtual HRESULT STDMETHODCALLTYPE QueryCustomPolicy( + /* [in] */ REFGUID guidKey, + /* [size_is][size_is][out] */ BYTE __RPC_FAR *__RPC_FAR *ppPolicy, + /* [out] */ DWORD __RPC_FAR *pcbPolicy, + /* [in] */ BYTE __RPC_FAR *pContext, + /* [in] */ DWORD cbContext, + /* [in] */ DWORD dwReserved) + { + return INET_E_DEFAULT_ACTION; + } + + // ICodeInstall + virtual HRESULT STDMETHODCALLTYPE OnCodeInstallProblem( + /* [in] */ ULONG ulStatusCode, + /* [unique][in] */ LPCWSTR szDestination, + /* [unique][in] */ LPCWSTR szSource, + /* [in] */ DWORD dwReserved) + { + return S_OK; + } + + // IWindowForBindingUI + virtual HRESULT STDMETHODCALLTYPE GetWindow( + /* [in] */ REFGUID rguidReason, + /* [out] */ HWND __RPC_FAR *phwnd); +}; + +#endif //__URLCALLBACK_H_ diff --git a/Native/DenAgent/URLCallback.rgs b/Native/DenAgent/URLCallback.rgs new file mode 100644 index 0000000..af26c9d --- /dev/null +++ b/Native/DenAgent/URLCallback.rgs @@ -0,0 +1,23 @@ +HKCR +{ + DenAgent.URLCallback.1 = s 'URLCallback Class' + { + CLSID = s '{2935B913-CCF9-4145-ADE2-8F024E75BAB2}' + } + DenAgent.URLCallback = s 'URLCallback Class' + { + CLSID = s '{2935B913-CCF9-4145-ADE2-8F024E75BAB2}' + CurVer = s 'DenAgent.URLCallback.1' + } + NoRemove CLSID + { + ForceRemove {2935B913-CCF9-4145-ADE2-8F024E75BAB2} = s 'URLCallback Class' + { + ProgID = s 'DenAgent.URLCallback.1' + VersionIndependentProgID = s 'DenAgent.URLCallback' + LocalServer32 = s '%MODULE%' + val AppID = s '{19A473FE-ED5F-4A68-8920-DD5D0D3E4B41}' + 'TypeLib' = s '{5504FC1C-B2A3-43F6-B9CE-E3B3282273B7}' + } + } +} diff --git a/Native/DenAgent/changeplugindirectory.h b/Native/DenAgent/changeplugindirectory.h new file mode 100644 index 0000000..b26df02 --- /dev/null +++ b/Native/DenAgent/changeplugindirectory.h @@ -0,0 +1,47 @@ +#if !defined(AFX_CCHANGEPLUGINDIRECTORY_H__3AB22538_1DA2_48AB_A4E8_CFD30AD52A75__INCLUDED_) +#define AFX_CCHANGEPLUGINDIRECTORY_H__3AB22538_1DA2_48AB_A4E8_CFD30AD52A75__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// cChangePluginDirectory.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// cChangePluginDirectory dialog + +class cChangePluginDirectory : public CDialog +{ +// Construction +public: + cChangePluginDirectory(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(cChangePluginDirectory) + enum { IDD = IDD_CHANGEDIR }; + CEdit m_NewUrl; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(cChangePluginDirectory) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(cChangePluginDirectory) + virtual void OnOK(); + virtual BOOL OnInitDialog(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CCHANGEPLUGINDIRECTORY_H__3AB22538_1DA2_48AB_A4E8_CFD30AD52A75__INCLUDED_) diff --git a/Native/DenAgent/res/Attic/asheron.ico b/Native/DenAgent/res/Attic/asheron.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea423d8683ada2ee41ec765b70e664355c9e9ee1 GIT binary patch literal 4710 zcmeI0O=ufO6o8+*Y26}6vZURE(?YC+LN5Wwx&%^NIThO{UmV|kDi};bm*9&9h2&;~ z4>_helv3o2g&}n?G)@9G^pKM%k?SAXhP20xs}%wnPrtXjvSe2xIhV}(&CHwk&70Yo z)yzvodgO}q_xFpYuX{wkr3_X1?o*LD+6D&$``@34{PCIUN{jsRxyWx{(2u$jgNXXm zwCU$T7W8g5awQoJ(A1}QO0|Q z#A4JT3ned>Uy4|(5v8$FaryPM+v{l zizOqoTSms#jid{#lgje0$ow;rnMWcMIg#N>DILRa!>_ETN@Qd)X@MG|4SUE%B1zz9kyC!mM%e+<73zXHDmpM#%6soYfp*HTm#zX;yOp-i1GcFTroYufrGM3-HVE^YAn96Y#_O z8-X|Q2HwCMc*A_yu3fh48Qb-U?aHxTlanGY{1JQ!ehYpbz5w6l^O0ltZTJ=VCHNft zG<=uO2frmL!Y{(l!jHkH;kzwR$sEIP!>_|S)48l zRN@RNB8$i@GKQp)ZVPmBaw2cvzLlMw9eMrwwY+@!Ql372DuqHp9zT98%gf91;K2i# zpP!exxjC7cnUQ<E0z>yhbc$H+fGS+fK&pu)z^0SrtizKr$s!R8nA%dQCm({~x_7eeVL3pGQR+4Rzpz ze4kVsja14>g;1l9O2YO+6`GexHZ?8#_7jPAUCyr+(KA*>&&)dKsLL5!LG+w`VFJ;* zfA(UpTo2A!J(sngp0k6Nsszg%6C0yKjc1Y`DxXH+oesvIG{u>>n)V| zl2%&{dJnC&bZbcD&c@og{Z7AFnYFb{vw=$HP9~EHt}n5Q(vzXh$^=7lA6otm>1TTJ z$(^M3Rlg+AHNO&M+=daF&J#*-L53}Azsz6IS0(am!213b4sO(NJan_Fz)&zg^NAs1 z>BUXbx@nMwx?cO%#@bLgeTk_pvZ1dSB;VVYtvUEWIG7TV=jyU8#Y|&JU;8{o&hPxN ziH3GNt&w^~2MJcdyP6V-6o8bn#2A zKQ!6HS7+IGFHW;=<$l(6>2qI9eU$z&%bZ#GlU@P~M1Kf%gfTCE=RrJ?zjFR2`ti4= zeAn;%V?6OOp7Jd){TlCg{<@?PMYrk6VXwk*Fp$6slr%G;%7JD;Fl=*|v6f z5((dnNV&Wp*3>KEmEWD-zDia(2rn(ap^{XC-75^S*}DyLgSKH>)j#zv94tlKI zdgoR!h@rB#uS4&b%l|aHrThgAHK(zo(cnp~wx@nbx}9x5j3~*RIOI_SKq5T@k^1ZPdT+(EeKgt z@s7)g9U$SP?9O(z2@|OkEwr8tWl8#w<5$KF0n{Gd-%g?wk1He1hraG@ W%hbP$nbRmf1^+7gpCA>40RCU+e?Ec$ literal 0 HcmV?d00001 diff --git a/Native/DenAgent/res/DenAgent.ico b/Native/DenAgent/res/DenAgent.ico new file mode 100644 index 0000000000000000000000000000000000000000..3ba5a8ac2897f310db08508a59bb79a21defc493 GIT binary patch literal 4710 zcmeH~L1-IC7l2=?wChqD<(g1vE($#+&Y^`ri3^3|_~c9CyH5o}Q1C&;JxJw;q$dk} z$T97qlpq)l@qX`hnz$YAqRPlgbADMRtR>%s^9;;*Y#eUEADwTMmCY~2b zwXh+TB7@&-Ohm=96dpgOm8`|h2fuo8F&3}zi_}HS<`|&j+|tfV=(UjdR$hoKJrbF}FEXjr zHTcW$CHQmj_+49rUxr_RpN22N$^il|@B%OJGAq0A+wiOKb@)a2Iry9G;SKm}@R#9B z@aNzocptt6zXiVm-+*txufQ+C&%@8aPr@s_!YjPOE4;!V@Oi=K5uf{f7WvFNK7#k* zTku=(8}R160lfmf1U(Nu13iiVUHEPIRd^1?^dkHm{7v{9@Ymok!jm5Oi0!)1b}h19v$LE{cptt6zXiVm-+&);d}J4X z8-5kO4!;OL2S4Wc;I}1f@XPQE@YC=m_;CSh=`Q>>{3?7Mo=EE)4|Z~ZS{lLo@GbZ) z_zif1GbTVS-XUwqGO~b7BPC>9fO@^2bh}-7{`|Q-d-hD8Jb5AyA3l^uqahC-Jdl-@ z6}fx&t}HDr$?e;>Wqy8MZr!>iGcz-C{rYv8oSc-47ca{B^XKKvnKKgYtNi%G5AI#Z zBHbSwWIcqB4Ox|z!`_K{|G1q2P4dZo36mt&BpV1NjC;1@sUGvgK&2#w0=4!teP530 zg;ei}29B4)zVWtDa}bKDw(_286orv#6t}ic(oZ$hnUcO!vmy06o!pwXuU}{S!4zA9 z*gMm`XFcAfyce6BBAe}0tlzY;>^<8yHk)Vf*$c?$NPZs)ch||K#yb`ZFIU%4({+3F zf80k*6e;FU?X)-RRl7_^3Xd=>cK?jnJ=60`h_2m3)oMI+fbLbQYLqL4xDrgIQ4gj(9b7Hw;ImUYV8KZ{sYaWFJAXYrK=kvSd)nNoBllE>@^s+sY!1A3 z^XsXoE!Bv~Bv+aLVL=ZHo*obgi>5Y_J>>7A9zEw-K5=@u@-&y=Hf7^iH4W!mGC2JHm+ITneUii+hzKYiQZ-byZ16RAXcoY1J98R?JzHQvU;2Hv@yHgl zVa_!k{JkIy;$bS9da&f!Z5EMf<&E$)nW>jrwc}nzIL6eV)Iyi$* OaxyikA#Efn>i+=gSQ_2{ literal 0 HcmV?d00001 diff --git a/Native/DenAgent/res/DenAgent.rc2 b/Native/DenAgent/res/DenAgent.rc2 new file mode 100644 index 0000000..1546658 --- /dev/null +++ b/Native/DenAgent/res/DenAgent.rc2 @@ -0,0 +1,13 @@ +// +// DENAGENT.RC2 - resources Microsoft Visual C++ does not edit directly +// + +#ifdef APSTUDIO_INVOKED + #error this file is not editable by Microsoft Visual C++ +#endif //APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// Add manually edited resources here... + +///////////////////////////////////////////////////////////////////////////// diff --git a/Native/DenAgent/res/bitmap1.bmp b/Native/DenAgent/res/bitmap1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ae0b08eba7320cae998279510b5f9a5f07db4b23 GIT binary patch literal 630 zcmY*Wp>o483{||5bRZryYHw)Qk@Aq;_+>;QSNukXJD^5& zZ#g*Nl_2*irLKgL<$(ldF1|z)ko!scTLA)k>{|QpqErDH;M3FvPj0^$$E zsUG+<^)GvnIBT%g2Q?KQ#}px+k5?!FE;wSiC>46pt6q2kY=DD7Uz)mdSCltApKsM8 zz^no5(+T%8inR59)^bcG9y;K5#oPTBZ|v3pL&$HFLp`|H`CtInosJ`QiTv2`f4%RM`h9)^AoH@eyb4c0P9Y?VH(My*s`4$jK+@*BBYb5ylI82~DJjybBJL zMiLWR_XZj+?RGm@Nm%zMYsJIBPo|(4QaUYOFUIsX8sh&LD&sOJvEKl1jLEUIsuBUz zE66GKb~0J8UDK5p8^Rzn&3#H7);Ti?Wxl-rH z=Ly$m@4udX1kUAXvfztvZm!~{uLIewvKF|dQp-ge)$RIQdx*mt>8L#E=ua#xnK7Ch z_1W5oyh2QAn*58CQxsnEs0*p_jmb7!?dX65T~>N&TDNj8tEoP$rvSK6`|~&5bs%+S zm~wP>FJ)2*!uqa7ojA{_KTHeXrU2i($0-FIZWXvnWoW@m>NRj5;7&NO1;l<>bPsvS zO$a`-4H{bjm*W};8z&L3R$p*^PjKQB&n$%&dpR7<0xtGK$LUcVm-HRy#+Rc0@*x0D z>yWhITz|kdR&I~qRw>au63C^f1Dy0{!w{V?zD}6i{ggB7q)l@qX`hnz$YAqRPlgbADMRtR>%s^9;;*Y#eUEADwTMmCY~2b zwXh+TB7@&-Ohm=96dpgOm8`|h2fuo8F&3}zi_}HS<`|&j+|tfV=(UjdR$hoKJrbF}FEXjr zHTcW$CHQmj_+49rUxr_RpN22N$^il|@B%OJGAq0A+wiOKb@)a2Iry9G;SKm}@R#9B z@aNzocptt6zXiVm-+*txufQ+C&%@8aPr@s_!YjPOE4;!V@Oi=K5uf{f7WvFNK7#k* zTku=(8}R160lfmf1U(Nu13iiVUHEPIRd^1?^dkHm{7v{9@Ymok!jm5Oi0!)1b}h19v$LE{cptt6zXiVm-+&);d}J4X z8-5kO4!;OL2S4Wc;I}1f@XPQE@YC=m_;CSh=`Q>>{3?7Mo=EE)4|Z~ZS{lLo@GbZ) z_zif1GbTVS-XUwqGO~b7BPC>9fO@^2bh}-7{`|Q-d-hD8Jb5AyA3l^uqahC-Jdl-@ z6}fx&t}HDr$?e;>Wqy8MZr!>iGcz-C{rYv8oSc-47ca{B^XKKvnKKgYtNi%G5AI#Z zBHbSwWIcqB4Ox|z!`_K{|G1q2P4dZo36mt&BpV1NjC;1@sUGvgK&2#w0=4!teP530 zg;ei}29B4)zVWtDa}bKDw(_286orv#6t}ic(oZ$hnUcO!vmy06o!pwXuU}{S!4zA9 z*gMm`XFcAfyce6BBAe}0tlzY;>^<8yHk)Vf*$c?$NPZs)ch||K#yb`ZFIU%4({+3F zf80k*6e;FU?X)-RRl7_^3Xd=>cK?jnJ=60`h_2m3)oMI+fbLbQYLqL4xDrgIQ4gj(9b7Hw;ImUYV8KZ{sYaWFJAXYrK=kvSd)nNoBllE>@^s+sY!1A3 z^XsXoE!Bv~Bv+aLVL=ZHo*obgi>5Y_J>>7A9zEw-K5=@u@-&y=Hf7^iH4W!mGC2JHm+ITneUii+hzKYiQZ-byZ16RAXcoY1J98R?JzHQvU;2Hv@yHgl zVa_!k{JkIy;$bS9da&f!Z5EMf<&E$)nW>jrwc}nzIL6eV)Iyi$* OaxyikA#Efn>i+=gSQ_2{ literal 0 HcmV?d00001 diff --git a/Native/DenAgent/res/version_.bmp b/Native/DenAgent/res/version_.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5f298fa5b6e7acb6e51d2081e68eee0ec517f75c GIT binary patch literal 998 zcmb7?ziz@n491<%1v(I zsiK$MpPYa9*^ck^?R!GjJ~2L_zoS2(7j%b_=)>*yaWQO&@X}_JCX86p@p#0nhG;Lv zs4H|lx~1PYH{)-lllJuq$^Il8bx|<0n<}EEc`0{u_a^m=ufPg76xw8}LgQ?=%Iw#P zRj%O5Hbz}pciYVFJqk>~Byj7dG=Uw1kh<@C^GY&ucu4(W)1*OCisPGV7k-op>gzKUA|T`%}ES=hsZtt{N_7GXF{a II`%*I2ks=BjQ{`u literal 0 HcmV?d00001 diff --git a/Native/DenAgent/resource.h b/Native/DenAgent/resource.h new file mode 100644 index 0000000..64ee33b --- /dev/null +++ b/Native/DenAgent/resource.h @@ -0,0 +1,110 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by DenAgent.rc +// +#define IDE_NOCLIENTEXE 1 +#define IDC_WEBSITE 2 +#define IDE_NOCLIENTVER 2 +#define IDS_VERSIONTEMPLATE 3 +#define IDE_NOXMLDOC 4 +#define IDE_NOXMLVER 5 +#define IDE_XMLCLIENTVERSIONMISMATCH 6 +#define IDS_UPDATETEXT 7 +#define IDE_UPDATETEXT 7 +#define IDR_TRAYICON 101 +#define IDD_DENAGENT_DIALOG 102 +#define IDR_DENAGENT 103 +#define IDR_MAINFRAME 128 +#define IDR_POPUPS 129 +#define IDD_ADDREMOVE 130 +#define IDD_DOWNLOAD 131 +#define IDD_CHANGEDIR 134 +#define IDD_OPTIONS 135 +#define IDR_VERSION_STATES 136 +#define IDB_IMAGES 141 +#define IDB_BITMAP1 142 +#define IDD_DOWNLOADER 143 +#define IDB_GROUPS 145 +#define IDC_CURSOR1 147 +#define IDD_EXPORT 152 +#define IDC_PLUGINS 1001 +#define IDC_REFRESH 1002 +#define IDC_CHANGE_DIR 1005 +#define IDC_PLUGINDIR 1006 +#define IDC_INSTALL 1007 +#define IDC_UPGRADE 1008 +#define IDC_REMOVE 1009 +#define IDC_BROWSE 1009 +#define IDC_PROGRESS 1011 +#define IDC_STATUSTEXT 1012 +#define IDC_STOPDOWNLOAD 1013 +#define IDC_ADDREMOVE 1014 +#define IDC_CUSTOMSTATUS 1014 +#define IDC_UP 1015 +#define IDC_PROGRESSTOTAL 1015 +#define IDC_DOWN 1016 +#define IDC_STATUSTOTAL 1016 +#define IDC_REORDER 1017 +#define IDC_UPDATE 1017 +#define IDC_STATUST 1017 +#define IDC_BARALPHA 1018 +#define IDC_OPTIONS 1018 +#define IDC_VIEWALPHA 1019 +#define IDC_NEWURL 1022 +#define IDC_BARALPHA_SPIN 1023 +#define IDC_VIEWALPHA_SPIN 1024 +#define IDC_EDIT1 1028 +#define IDC_CUSTOM_FONT_EDIT 1028 +#define IDC_EDITEXPORT 1028 +#define IDC_BLENDINGSOFTWARE 1030 +#define IDC_BLENDINGGDIPLUS 1031 +#define IDC_MESSAGES_TEXT 1031 +#define IDC_MEMLOCS_TEXT 1032 +#define IDC_DECALPLUGINS_TEXT 1033 +#define IDC_CHECK_AUTOSTART 1035 +#define IDC_BTN_RESET 1036 +#define IDC_VIEWMULTI 1037 +#define IDC_VIEWSINGLE 1038 +#define IDC_DEFAULT_FONT_RADIO 1039 +#define IDC_CLIENT_FONT_RADIO 1040 +#define IDC_CUSTOM_FONT_RADIO 1041 +#define IDC_RADARYES 1042 +#define IDC_RADIO2 1043 +#define IDC_RADARNO 1043 +#define IDC_RADIO1 1044 +#define IDC_TIMESTAMPON 1044 +#define IDC_TIMESTAMPOFF 1045 +#define IDC_DELETE 1050 +#define IDC_BUTTON1 1051 +#define IDC_FORMATHELP 1051 +#define IDC_BTNEXPORT 1051 +#define IDC_EXPORT 1051 +#define IDC_COMBO 1052 +#define IDC_FORMATCLR 1052 +#define IDC_FORMATSTR 1053 +#define IDC_CHECK1 1054 +#define IDC_OLDINJECT 1054 +#define IDC_CHKENABLED 1054 +#define IDC_DUALLOG 1055 +#define IDC_CHKLOC 1055 +#define IDC_WINDOWED 1056 +#define IDC_CHKCLSID 1056 +#define IDC_BUTTON2 1057 +#define IDC_PATCHHELP 1057 +#define IDC_NOMOVIES 1058 +#define IDC_NOMOVIES2 1059 +#define IDC_NOLOGOS 1059 +#define IDC_DOCKPOS 1060 +#define ID_SYSTRAY_CONFIGURE 32771 +#define ID_SYSTRAY_EXIT 32772 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 153 +#define _APS_NEXT_COMMAND_VALUE 32776 +#define _APS_NEXT_CONTROL_VALUE 1061 +#define _APS_NEXT_SYMED_VALUE 105 +#endif +#endif diff --git a/Native/Include/ApiHook.h b/Native/Include/ApiHook.h new file mode 100644 index 0000000..98abdec --- /dev/null +++ b/Native/Include/ApiHook.h @@ -0,0 +1,226 @@ +// ApiHook.h +// Declaration and implementation of functions for hooking APIs in DLLs + +#ifndef __APIHOOK_H +#define __APIHOOK_H + +enum eAddressing +{ + eByName, + eByOrdinal +}; + +struct cHookDescriptor +{ + eAddressing m_addr; + LPCTSTR m_szModule, + m_szFunction; + DWORD m_dwOrdinal, + m_pNewFunction, + m_pOldFunction; +}; + +// Functions to aid hooking +#define MakePtr( cast, ptr, AddValue ) (cast)( (DWORD)(ptr)+(DWORD)(AddValue)) + +PIMAGE_IMPORT_DESCRIPTOR getNamedImportDescriptor( HMODULE hModule, LPCSTR szImportMod ) +{ + PIMAGE_DOS_HEADER pDOSHeader = reinterpret_cast< PIMAGE_DOS_HEADER >( hModule ); + + // Get the PE header. + PIMAGE_NT_HEADERS pNTHeader = MakePtr( PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew ); + + // If there is no imports section, leave now. + if( pNTHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT ].VirtualAddress == NULL ) + return NULL; + + // Get the pointer to the imports section. + PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr ( PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader, + pNTHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT ].VirtualAddress ); + + // Loop through the import module descriptors looking for the + // module whose name matches szImportMod. + while( pImportDesc->Name != NULL ) + { + PSTR szCurrMod = MakePtr( PSTR, pDOSHeader, pImportDesc->Name ); + if( stricmp( szCurrMod, szImportMod ) == 0 ) + // Found it. + break; + + // Look at the next one. + pImportDesc ++; + } + + // If the name is NULL, then the module is not imported. + if ( pImportDesc->Name == NULL ) + return ( NULL ) ; + + // All OK, Jumpmaster! + return pImportDesc; + +} + +bool hookFunctions( cHookDescriptor *pHook, DWORD nCount, bool bHook ) +{ + HMODULE hProcess = ::GetModuleHandle( NULL ); + for( cHookDescriptor *i = pHook; i != pHook + nCount; ++ i ) + { + // Get the specific import descriptor. + PIMAGE_IMPORT_DESCRIPTOR pImportDesc = getNamedImportDescriptor( hProcess, i->m_szModule ); + + if ( pImportDesc == NULL ) + continue; + + // Get the original thunk information for this DLL. I cannot use + // the thunk information stored in the pImportDesc->FirstThunk + // because the that is the array that the loader has already + // bashed to fix up all the imports. This pointer gives us acess + // to the function names. + PIMAGE_THUNK_DATA pOrigThunk = MakePtr( PIMAGE_THUNK_DATA, hProcess, pImportDesc->OriginalFirstThunk ); + + // Get the array pointed to by the pImportDesc->FirstThunk. This is + // where I will do the actual bash. + PIMAGE_THUNK_DATA pRealThunk = MakePtr( PIMAGE_THUNK_DATA, hProcess, pImportDesc->FirstThunk ); + + // Loop through and look for the one that matches the name. + for( ; pOrigThunk->u1.Function != NULL; ++ pOrigThunk, ++ pRealThunk ) + { + if( i->m_addr == eByName ) + { + if( pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) + // Only look at those that are imported by name, not ordinal. + continue; + + // Look get the name of this imported function. + PIMAGE_IMPORT_BY_NAME pByName = MakePtr( PIMAGE_IMPORT_BY_NAME, hProcess, pOrigThunk->u1.AddressOfData ); + + // If the name starts with NULL, then just skip out now. + if( pByName->Name[ 0 ] == '\0' ) + continue; + + if ( ::_tcsicmp( reinterpret_cast< char * >( pByName->Name ), i->m_szFunction ) != 0 ) + // This name dosen't match + continue; + } + else + { + if( !( pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) ) + // The import must be by ordinal + continue; + + if( ( pOrigThunk->u1.Ordinal & ~IMAGE_ORDINAL_FLAG ) != i->m_dwOrdinal ) + // Ordinal does not match + continue; + } + + // I found it. Now I need to change the protection to + // writable before I do the blast. Note that I am now + // blasting into the real thunk area! + MEMORY_BASIC_INFORMATION mbi_thunk; + + ::VirtualQuery( pRealThunk, &mbi_thunk, sizeof ( MEMORY_BASIC_INFORMATION ) ); + ::VirtualProtect( mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect ); + + // Save the original address if requested. + if( bHook ) + { + i->m_pOldFunction = pRealThunk->u1.Function; + pRealThunk->u1.Function = i->m_pNewFunction; + } + else if( i->m_pOldFunction != NULL ) + pRealThunk->u1.Function = i->m_pOldFunction; + + DWORD dwOldProtect; + + ::VirtualProtect( mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect ); + + break; + } + } + + return true; +} + +// This patches the export table rather than the import table +bool hookFunctionsByExport( char *szFilename, cHookDescriptor *pHook, DWORD nCount, bool bHook ) +{ + HMODULE hProcess = ::GetModuleHandle( reinterpret_cast< LPCSTR >( szFilename ) ); + for( cHookDescriptor *i = pHook; i != pHook + nCount; ++ i ) + { + // Get the specific import descriptor. + PIMAGE_IMPORT_DESCRIPTOR pImportDesc = getNamedImportDescriptor( hProcess, i->m_szModule ); + + if ( pImportDesc == NULL ) + continue; + + // Get the original thunk information for this DLL. I cannot use + // the thunk information stored in the pImportDesc->FirstThunk + // because the that is the array that the loader has already + // bashed to fix up all the imports. This pointer gives us acess + // to the function names. + PIMAGE_THUNK_DATA pOrigThunk = MakePtr( PIMAGE_THUNK_DATA, hProcess, pImportDesc->OriginalFirstThunk ); + + // Get the array pointed to by the pImportDesc->FirstThunk. This is + // where I will do the actual bash. + PIMAGE_THUNK_DATA pRealThunk = MakePtr( PIMAGE_THUNK_DATA, hProcess, pImportDesc->FirstThunk ); + + // Loop through and look for the one that matches the name. + for( ; pOrigThunk->u1.Function != NULL; ++ pOrigThunk, ++ pRealThunk ) + { + if( i->m_addr == eByName ) + { + if( pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) + // Only look at those that are imported by name, not ordinal. + continue; + + // Look get the name of this imported function. + PIMAGE_IMPORT_BY_NAME pByName = MakePtr( PIMAGE_IMPORT_BY_NAME, hProcess, pOrigThunk->u1.AddressOfData ); + + // If the name starts with NULL, then just skip out now. + if( pByName->Name[ 0 ] == '\0' ) + continue; + + if ( ::_tcsicmp( reinterpret_cast< char * >( pByName->Name ), i->m_szFunction ) != 0 ) + // This name dosen't match + continue; + } + else + { + if( !( pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) ) + // The import must be by ordinal + continue; + + if( ( pOrigThunk->u1.Ordinal & ~IMAGE_ORDINAL_FLAG ) != i->m_dwOrdinal ) + // Ordinal does not match + continue; + } + + // I found it. Now I need to change the protection to + // writable before I do the blast. Note that I am now + // blasting into the real thunk area! + MEMORY_BASIC_INFORMATION mbi_thunk; + + ::VirtualQuery( pRealThunk, &mbi_thunk, sizeof ( MEMORY_BASIC_INFORMATION ) ); + ::VirtualProtect( mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect ); + + // Save the original address if requested. + if( bHook ) + { + i->m_pOldFunction = pRealThunk->u1.Function; + pRealThunk->u1.Function = i->m_pNewFunction; + } + else if( i->m_pOldFunction != NULL ) + pRealThunk->u1.Function = i->m_pOldFunction; + + DWORD dwOldProtect; + + ::VirtualProtect( mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect ); + + break; + } + } + + return true; +} + +#endif diff --git a/Native/Include/DX6InjectApi.h b/Native/Include/DX6InjectApi.h new file mode 100644 index 0000000..fa3b1fe --- /dev/null +++ b/Native/Include/DX6InjectApi.h @@ -0,0 +1,21 @@ +// DX6InjectApi.h +// Declaration of exported functions from DX6Inject + +#ifndef __DX6INJECTAPI_H +#define __DX6INJECTAPI_H + +#ifdef DX6INJECT_IMPL +#define DX6INJECT_API __declspec(dllexport) +#else +#define DX6INJECT_API __declspec(dllimport) +#endif + +// Adds a reference to the registered hook function +void DX6INJECT_API InjectInstall(); + +// Removes a reference to the registered hook function +void DX6INJECT_API InjectUninstall(); + +LRESULT CALLBACK DX6Callback( int, WPARAM, LPARAM ); + +#endif diff --git a/Native/Include/Decal.idl b/Native/Include/Decal.idl new file mode 100644 index 0000000..dcbc5ab --- /dev/null +++ b/Native/Include/Decal.idl @@ -0,0 +1,566 @@ +// Decal.idl : IDL source for Decal.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (Decal.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; + + interface IPluginSite2; + + [ + object, + uuid(A51CEB03-B59F-4302-B125-A0846EA537DD), + helpstring("IPlugin2 Interface - All plugin components are required to implement this interface"), + pointer_default(unique) + ] + interface IPlugin2 : IUnknown + { + [helpstring("Create all objects and views within your plugin. The assigned ID can be used for self termiantion and the plugin site should be stored.")] HRESULT Initialize(IPluginSite2 *Site); + [helpstring("Release all your objects including the stored IPluginSite2")] HRESULT Terminate(); + }; + + [ + object, + uuid(256DF70B-0B87-45e4-96EE-043E2254CC95), + helpstring("IRenderSink Interface"), + pointer_default(unique) + ] + interface IKitchenSink : IUnknown + { + [helpstring("method AddToQueue")] HRESULT AddToQueue([in]long lObjectID); + [helpstring("method ShortcircuitID")] HRESULT ShortcircuitID([in] long lObjectID); + }; + + [ + object, + uuid(FFA32A7A-EFAF-484A-B358-8802DBBAB0EC), + helpstring("IDecalEnum Interface"), + pointer_default(unique) + ] + interface IDecalEnum : IUnknown + { + [propget, helpstring("Human Readable Name")] HRESULT FriendlyName([out, retval] BSTR *pVal); + [propget, helpstring("CLSID for the object")] HRESULT ComClass([out, retval] CLSID *pVal); + [propget, helpstring("If the object is enabled")] HRESULT Enabled([out, retval] VARIANT_BOOL *pVal); + [propput, helpstring("Set the object enabled")] HRESULT Enabled([in] VARIANT_BOOL newVal); + [helpstring("Create an instance of this object")] HRESULT CreateInstance(REFIID iid, [out, retval, iid_is(iid)] LPVOID *ppvItf); + [helpstring("Move to the next entry, returns S_FALSE when complete")] HRESULT Next(); + [propget, helpstring("If this object is a surrogate, returns the surrogate CLSID, otherwise GUID_NULL")] HRESULT SurrogateClass([out, retval] CLSID *pVal); + [propget, helpstring("Resource path for this object, if not specified the decal resource path")] HRESULT ResourcePath([out, retval] BSTR *pVal); + [propget, helpstring("property Property")] HRESULT Property(BSTR Name, [out, retval] VARIANT *pVal); + [propget, helpstring("property Group")] HRESULT Group([out, retval] BSTR *pVal); + [helpstring("Advance to a specific class")] HRESULT Skip ([in] REFCLSID clsid); + [helpstring("method MoveBefore")] HRESULT MoveBefore(REFCLSID clsidBefore); + }; + + [ + object, + uuid(9337777E-3079-47E3-8B6A-EDCB1ECABC27), + helpstring("IACHooks Interface"), + dual, + pointer_default(unique), + oleautomation + ] + interface IACHooks : IDispatch + { + [id(1), propget, helpstring("property CurrentSelection")] HRESULT CurrentSelection([out, retval] long* pVal); + [id(1), propput, helpstring("property CurrentSelection")] HRESULT CurrentSelection([in] long pVal); + [id(2), propget, helpstring("property PreviousSelection")] HRESULT PreviousSelection([out, retval] long* pVal); + [id(2), propput, helpstring("property PreviousSelection")] HRESULT PreviousSelection([in] long pVal); + [id(3), helpstring("method ChatOut")] HRESULT ChatOut([in]BSTR szText, long lColor); + [id(4), helpstring("method RawChatOut")] HRESULT RawChatOut([in]BSTR szText, long lColor); + [id(5), helpstring("method SetCursorPosition")] HRESULT SetCursorPosition([in] long lX, long lY); + [id(6), helpstring("method CastSpell")] HRESULT CastSpell([in]long lSpellID, long lObjectID); + [id(7), helpstring("method MoveItem")] HRESULT MoveItem([in] long lObjectID, long lPackID, long lSlot, VARIANT_BOOL bStack); + [id(8), helpstring("method SelectItem")] HRESULT SelectItem([in]long lObjectID); + [id(9), helpstring("method UseItem")] HRESULT UseItem([in]long lObjectID, long lUseState); + [propget, id(10), helpstring("property CombatState")] HRESULT CombatState([out, retval] long *pVal); + [propget, id(12), helpstring("property ChatState")] HRESULT ChatState([out, retval] VARIANT_BOOL *pVal); + [id(13), helpstring("method UseItemEx")] HRESULT UseItemEx([in] long UseThis, long OnThis); + [id(14), helpstring("method GetFellowStats")] HRESULT GetFellowStats([in] long lCharID); + [propget, id(15), helpstring("property SelectedStackCount")] HRESULT SelectedStackCount(long lStackCount, [out, retval] long *pVal); + [propput, id(15), helpstring("property SelectedStackCount")] HRESULT SelectedStackCount(long lStackCount, [in] long newVal); + [propget, id(16), helpstring("property VendorID")] HRESULT VendorID([out, retval] long *pVal); + [propget, id(17), helpstring("property BusyState")] HRESULT BusyState([out, retval] long *pVal); + [propget, id(18), helpstring("property BusyStateID")] HRESULT BusyStateID([out, retval] long *pVal); + [propget, id(19), helpstring("property PointerState")] HRESULT PointerState([out, retval] long *pVal); + [id(20), helpstring("method MoveItemEx")] HRESULT MoveItemEx([in]long lObjectID, long lDestinationID); + [propget, id(21), helpstring("property Heading")] HRESULT Heading([out, retval] double *pVal); + [propget, id(22), helpstring("property Landblock")] HRESULT Landblock([out, retval] long *pVal); + [propget, id(23), helpstring("property LocationX")] HRESULT LocationX([out, retval] double *pVal); + [propget, id(24), helpstring("property LocationY")] HRESULT LocationY([out, retval] double *pVal); + [propget, id(25), helpstring("property LocationZ")] HRESULT LocationZ([out, retval] double *pVal); + [propget, id(26), helpstring("property HooksAvailable")] HRESULT HooksAvail([out, retval] long *pVal); + [id(27), helpstring("method DropItem")] HRESULT DropItem([in]long lObjectID); + [id(28), helpstring("method FaceHeading")] HRESULT FaceHeading([in] float fHeading, [in] VARIANT_BOOL bUnknown, [out,retval] VARIANT_BOOL *pVal); + [propget, id(29), helpstring("property Screen3DWidth")] HRESULT Area3DWidth([out, retval] long *pVal); + [propget, id(30), helpstring("property Screen3DHeight")] HRESULT Area3DHeight([out, retval] long *pVal); + [id(31), helpstring("method ItemIsKnown")] HRESULT ItemIsKnown([in] long lGUID, [out,retval] VARIANT_BOOL *pVal); + [id(32), helpstring("method SendTell")] HRESULT SendTell([in]long lPlayerID, BSTR Message); + [id(33), helpstring("method SetAutorun")] HRESULT SetAutorun([in] VARIANT_BOOL bOnOff); + [id(34), helpstring("method SendTellEx")] HRESULT SendTellEx([in]BSTR Name, BSTR Message); + [id(35), helpstring("Gets known MemLocs from the xml.")] HRESULT QueryMemLoc([in] BSTR bstrName, [out, retval] long *pVal); + [propget, id(36), helpstring("property Vital")] HRESULT Vital([in] long Vital, [out, retval] long* pVal); + [propget, id(37), helpstring("property Attribute")] HRESULT Attribute([in] long Attribute, [out, retval] long* pVal); + [propget, id(38), helpstring("property Skill")] HRESULT Skill([in] long Skill, [out, retval] long* pVal); + [id(39), helpstring("method LocalChatText")] HRESULT LocalChatText([in] BSTR Text); + [id(40), helpstring("method LocalChatEmote")] HRESULT LocalChatEmote([in] BSTR EmoteText); + [id(41), helpstring("method SetCombatState")] HRESULT SetCombatState([in] long pVal); + [propget, id(42), helpstring("property HooksAvailEx")] HRESULT HooksAvailEx([in] enum eAvailableHooksEx HookID,[out, retval] VARIANT_BOOL *pVal); + [id(43), helpstring("method Logout")] HRESULT Logout(); + [id(44), helpstring("method SetDecal")] HRESULT SetDecal([in] IUnknown *pDecal); + [id(45), helpstring("method SecureTrade_Add")] HRESULT SecureTrade_Add([in] long ItemID, [out, retval] VARIANT_BOOL *pVal); + + [propget, id(46), helpstring("property SkillTrainLevel")] HRESULT SkillTrainLevel([in] enum eSkill SkillID, [out, retval] enum eTrainLevel *pVal); + [propget, id(47), helpstring("property SkillTotalXP")] HRESULT SkillTotalXP([in] enum eSkill SkillID, [out, retval] int *pVal); + [propget, id(48), helpstring("property SkillFreePoints")] HRESULT SkillFreePoints([in] enum eSkill SkillID, [out, retval] int *pVal); + [propget, id(49), helpstring("property SkillClicks")] HRESULT SkillClicks([in] enum eSkill SkillID, [out, retval] int *pVal); + + [propget, id(50), helpstring("property AttributeTotalXP")] HRESULT AttributeTotalXP([in] enum eAttribute AttributeID, [out, retval] int *pVal); + [propget, id(51), helpstring("property AttributeClicks")] HRESULT AttributeClicks([in] enum eAttribute AttributeID, [out, retval] int *pVal); + [propget, id(52), helpstring("property AttributeStart")] HRESULT AttributeStart([in] enum eAttribute AttributeID, [out, retval] int *pVal); + + [propget, id(53), helpstring("property VitalTotalXP")] HRESULT VitalTotalXP([in] enum eVital VitalD, [out, retval] int *pVal); + [propget, id(54), helpstring("property VitalClicks")] HRESULT VitalClicks([in] enum eVital VitalID, [out, retval] int *pVal); + [id(55), helpstring("method RequestID")] HRESULT RequestID([in] long lObjectID); + [id(56), helpstring("method IDQueueAdd")] HRESULT IDQueueAdd([in] long lObjectID); + [id(57), helpstring("method SetIDFilter")] HRESULT SetIDFilter([in] IKitchenSink* pIDFilter); + [id(58), helpstring("method UstAddItem")] HRESULT UstAddItem([in] long lObjectID); + [id(59), helpstring("method SendMessageByMask")] HRESULT SendMessageByMask([in] LONG lMask, [in] BSTR szMessage); + [id(60), helpstring("Display a message in the upper left hand corner as either white text or yellow with the busy/error sound.")] HRESULT ToolText([in] BSTR Text, [in] VARIANT_BOOL bError); + [id(61), helpstring("Appends text to the message in the upper left hand corner as either white text or yellow with the busy/error sound.")] HRESULT ToolTextAppend([in] BSTR Text, [in] VARIANT_BOOL bError); + [id(62), helpstring("Raw Use Item (3rd param)")] HRESULT UseItemRaw([in]long lObjectID, long lUseState, long lUseMethod); + [id(63), helpstring("Use the Casting Foci's Spell")] HRESULT UseFociSpell([in]long UseThis, long OnThis); + [id(64), helpstring("Set the idle time required to log out")] HRESULT SetIdleTime([in] double dIdleTimeout); + [id(65), helpstring("Set /day")] HRESULT SetDay([in] VARIANT_BOOL bDay); + [propget, id(66), helpstring("property Misc")] HRESULT Misc([in] long Vital, [out, retval] long* pVal); + + [id(67), helpstring("Give an item")] HRESULT GiveItem([in] long lObject, long lDestination); + [id(68), helpstring("Raw MoveItemEx")] HRESULT MoveItemExRaw([in] long lObject, long lDestination, long lMoveFlags); + }; + + [ + object, + uuid(5C36D41D-1DDD-4315-97CA-75095DDFF8BB), + helpstring("IDecal Interface"), + pointer_default(unique) + ] + interface IDecal : IUnknown + { + [helpstring("Initialize the graphics library")] HRESULT InitGraphics( IUnknown *pDirectDraw, IUnknown *pD3DDevice ); + [propget, helpstring("The DirectDraw object used by AC")] HRESULT DirectDraw(REFIID iid, [iid_is(iid)] void **ppvItf); + [propget, helpstring("The Direct3DDevice used by AC")] HRESULT D3DDevice(REFIID iid, [iid_is(iid)] void **ppvItf); + [propget, helpstring("The main AC window")] HRESULT HWND([out, retval] long *pVal); + [propput, helpstring("The main AC window")] HRESULT HWND(long nVal); + [propget, helpstring("If a Decal control current has keyboard focus")] HRESULT Focus([out, retval] VARIANT_BOOL *pVal); + [propget, helpstring("Returns the current resolution, in windowed mode it is the client area")] HRESULT ScreenSize([out] long *pWidth, [out] long *pHeight); + [helpstring("Converts a tokenized path into a real path")] HRESULT MapPath(BSTR pPath, [out, retval] BSTR *pMapped); + [helpstring("Starts all plugins")] HRESULT StartPlugins(); + [helpstring("Stops all plugins")] HRESULT StopPlugins(); + [propget, helpstring("Get one fo the singleton objects")] HRESULT Object(BSTR strPath, REFIID iid, [out, retval, iid_is(iid)] LPVOID *pVal); + [helpstring("Starts services, should be called once and before starting plugins")] HRESULT StartServices(); + [propget, helpstring("Returns an enumerator for child objects, the optional GUID advances the iterator to a particular object.")] HRESULT Configuration(BSTR strType, REFCLSID clsidAdvance, [out, retval] IDecalEnum * *pVal); + [helpstring("method StopServices")] HRESULT StopServices(); + [propget, helpstring("property Plugin")] HRESULT Plugin(REFCLSID clsid, REFIID iid, [out, retval, iid_is(iid)] LPVOID *pVal); + [propget, helpstring("property Service")] HRESULT Service(REFCLSID clsid, REFIID iid, [out, retval, iid_is(iid)] LPVOID *pVal); + [helpstring("method Render2D")] HRESULT Render2D(); + [helpstring("method Render3D")] HRESULT Render3D(); + [propget, helpstring("property Hooks")] HRESULT Hooks([out, retval] IACHooks** pVal); + }; + + [ + object, + uuid(5DBD2180-4B88-440e-9706-E6159A39D014), + helpstring("IDecalDirectory Interface"), + pointer_default(unique) + ] + interface IDecalDirectory : IUnknown + { + [helpstring("method Lookup")] HRESULT Lookup(BSTR strName, [out, retval] IUnknown **ppvItf); + }; + + [ + object, + uuid(0F95468D-5071-4e28-A223-D83FDFED99E2), + helpstring("Interface for a decal service object"), + pointer_default(unique) + ] + interface IDecalService : IUnknown + { + [helpstring("Prepare the service")] HRESULT Initialize(IDecal *pDecal); + [helpstring("Before plugins are loaded")] HRESULT BeforePlugins(); + [helpstring("After plugins are terminates")] HRESULT AfterPlugins(); + [helpstring("method Terminate")] HRESULT Terminate(); + }; + + [ + object, + uuid(B66985FA-8CB0-48e5-A2A9-7B232D609B9C), + helpstring("Service interface for services that perform an action each frame"), + pointer_default(unique) + ] + interface IDecalRender : IUnknown + { + [helpstring("method Render2D")] HRESULT Render2D(); + [helpstring("method Render3D")] HRESULT Render3D(); + [helpstring("method ChangeHWND")] HRESULT ChangeHWND(); + [helpstring("method ChangeDirectX")] HRESULT ChangeDirectX(); + }; + + [ + object, + uuid(4FA5D6DF-6169-4F9C-B286-F863D4DA2357), + dual, + helpstring("IPluginSite2 Interface"), + pointer_default(unique) + ] + interface IPluginSite2 : IUnknown + { + [helpstring("method Unload")] HRESULT Unload(); + [propget, helpstring("property Object")] HRESULT Object(BSTR Path, [out, retval] LPDISPATCH *pVal); + [propget, helpstring("property Decal")] HRESULT Decal([out, retval] IDecal * *pVal); + }; + + [ + object, + uuid(DA98635C-A312-463b-A746-2CF62AF7413A), + helpstring("IDecalSurrogate Interface"), + pointer_default(unique) + ] + interface IDecalSurrogate : IUnknown + { + [helpstring("method CreateInstance")] HRESULT CreateInstance(IDecalEnum *pInitData, REFIID iid, [out, retval, iid_is(iid)] LPVOID *pObject); + }; + + [ + object, + uuid(E182005F-6A67-48b5-A50F-464340105330), + helpstring("IDecalFileSurrogate Interface"), + pointer_default(unique) + ] + interface IDecalFileSurrogate : IUnknown + { + [helpstring("method Register")] HRESULT Register(BSTR Filename); + [propget, helpstring("property Extension")] HRESULT Extension([out, retval] BSTR *pVal); + [propget, helpstring("property Description")] HRESULT Description([out, retval] BSTR *pVal); + }; + + [ + object, + uuid(6A188D19-EC3D-409d-8190-7975FEEE2081), + helpstring("IDecalUninstall Interface"), + pointer_default(unique) + ] + interface IDecalUninstall : IUnknown + { + [helpstring("This is the uninstallers last chance to see the configuration data. Record everything useful")] HRESULT Prepare(IDecalEnum *pEnum); + [helpstring("Perform the remove operation")] HRESULT Uninstall(); + }; + + [ + object, + uuid(A074F83A-32AB-46FC-9E4E-7E9DAFCD5D18), + dual, + helpstring("IDecalRes Interface"), + pointer_default(unique) + ] + interface IDecalRes : IDispatch + { + }; + + [ + uuid(EB282FE5-7170-4a37-A26E-92AF36385D2C), + helpstring("IACHooksEvents Interface") + ] + dispinterface IACHooksEvents + { + properties: + methods: + [id(1), helpstring("method ObjectDestroyed")] HRESULT ObjectDestroyed([in] LONG lGuid); + [id(2), helpstring("method OnChatBoxMessage")] VARIANT_BOOL OnChatBoxMessage([in] BSTR bstrText, [in] LONG lColor, [in,out] VARIANT_BOOL *bEat ); + [id(3), helpstring("method OnCommandLineText")] VARIANT_BOOL OnCommandLineText([in] BSTR bstrText, [in,out] VARIANT_BOOL *bEat ); + [id(4), helpstring("method OnSelectItem")] HRESULT OnSelectItem([in] LONG lGuid); + [id(5), helpstring("method OnToolText")] void OnToolText([in] BSTR bstrText, [in] VARIANT_BOOL bError); + [id(6), helpstring("method OnToolTextAppend")] void OnToolTextAppend([in] BSTR bstrText, [in] VARIANT_BOOL bError); + }; + +[ + uuid(FF7F5F6D-34E0-4B6F-B3BB-8141DE2EF732), + version(1.0), + helpstring("Decal 1.0 Type Library") +] +library Decal +{ + // For SendMessageByMask + enum eMessageMasks + { + eFellowship = 0x800, + eVassals = 0x1000, + ePatron = 0x2000, + eMonarch = 0x4000, + eCovassals = 0x1000000, + eAllegiance = 0x2000000, + eMasks_DWORD = 0x7FFFFFFF + }; + + enum eTrainLevel + { + eUntrained = 1, + eTrained = 2, + eSpecialized = 3, + eTrainLevel_DWORD = 0x7FFFFFFF + }; + + enum eVital + { + eCurrentHealth = 1, + eMaximumHealth = 2, + eCurrentStamina = 3, + eMaximumStamina = 4, + eCurrentMana = 5, + eMaximumMana = 6, + eBaseHealth = 7, + eBaseStamina = 8, + eBaseMana = 9, + eVital_DWORD = 0x7FFFFFFF + }; + + enum eAttribute + { + eCurrentStrength = 1, + eCurrentEndurance = 2, + eCurrentQuickness = 3, + eCurrentCoordination = 4, + eCurrentFocus = 5, + eCurrentSelf = 6, + eBaseStrength = 7, + eBaseEndurance = 8, + eBaseQuickness = 9, + eBaseCoordination = 10, + eBaseFocus = 11, + eBaseSelf = 12, + eAttribute_DWORD = 0x7FFFFFFF + }; + + enum eSkill + { + eCurrentAxe = 1, + eCurrentBow = 2, + eCurrentCrossbow = 3, + eCurrentDagger = 4, + eCurrentMace = 5, + eCurrentMeleeDefense = 6, + eCurrentMissileDefense = 7, + eCurrentSpear = 9, + eCurrentStaff = 10, + eCurrentSword = 11, + eCurrentThrownWeapons = 12, + eCurrentUnarmed = 13, + eCurrentArcaneLore = 14, + eCurrentMagicDefense = 15, + eCurrentManaConversion = 16, + eCurrentItemTinkering = 18, + eCurrentAssessPerson = 19, + eCurrentDeception = 20, + eCurrentHealing = 21, + eCurrentJump = 22, + eCurrentLockpick = 23, + eCurrentRun = 24, + eCurrentAssessCreature = 27, + eCurrentWeaponTinkering = 28, + eCurrentArmorTinkering = 29, + eCurrentMagicItemTinkering = 30, + eCurrentCreatureEnchantment = 31, + eCurrentItemEnchantment = 32, + eCurrentLifeMagic = 33, + eCurrentWarMagic = 34, + eCurrentLeadership = 35, + eCurrentLoyalty = 36, + eCurrentFletchingSkill = 37, + eCurrentAlchemySkill = 38, + eCurrentCookingSkill = 39, + eBaseAxe = 51, + eBaseBow = 52, + eBaseCrossbow = 53, + eBaseDagger = 54, + eBaseMace = 55, + eBaseMeleeDefense = 56, + eBaseMissileDefense = 57, + eBaseSpear = 59, + eBaseStaff = 60, + eBaseSword = 61, + eBaseThrownWeapons = 62, + eBaseUnarmed = 63, + eBaseArcaneLore = 64, + eBaseMagicDefense = 65, + eBaseManaConversion = 66, + eBaseItemTinkering = 68, + eBaseAssessPerson = 69, + eBaseDeception = 70, + eBaseHealing = 71, + eBaseJump = 72, + eBaseLockpick = 73, + eBaseRun = 74, + eBaseAssessCreature = 77, + eBaseWeaponTinkering = 78, + eBaseArmorTinkering = 79, + eBaseMagicItemTinkering = 80, + eBaseCreatureEnchantment = 81, + eBaseItemEnchantment = 82, + eBaseLifeMagic = 83, + eBaseWarMagic = 84, + eBaseLeadership = 85, + eBaseLoyalty = 86, + eBaseFletchingSkill = 87, + eBaseAlchemySkill = 88, + eBaseCookingSkill = 89, + eSkill_DWORD = 0x7FFFFFFF + }; + + enum eAvailableHooks + { + ePrevSelect = 0x00000001, + eCurrentSelect = 0x00000002, + eMouse = 0x00000004, + eCastSpell = 0x00000008, + eMoveItem = 0x00000010, + eSelectItem = 0x00000020, + eUseItem = 0x00000040, + eCombatState = 0x00000080, + eChatState = 0x00000100, + eGetFellowStats = 0x00000200, + eStackCount = 0x00000400, + eTestFormula = 0x00000800, + eVendorID = 0x00001000, + eBusyState = 0x00002000, + eBusyStateID = 0x00004000, + ePointerState = 0x00008000, + eMoveItemEx = 0x00010000, + ePosition = 0x00020000, + eFaceHeading = 0x00040000, + eArea3DWidth = 0x00080000, + eArea3DHeight = 0x00100000, + eObjectDestroyed = 0x00200000, + eSendTell = 0x00400000, + eSetAutorun = 0x00800000, + eGetVital = 0x01000000, + eSendTellEx = 0x02000000, + eLocalChatText = 0x04000000, + eLocalChatEmote = 0x08000000, + eSetCombatState = 0x10000000, + eGetAttribute = 0x20000000, + eGetSkill = 0x40000000, + eHooksAvailEx = 0x80000000 + }; + + // Items in here go in sequence (0, 1, 2, 3, ...), not as a bit-field + enum eAvailableHooksEx + { + eLogout = 0, + eSecureTrade_Add = 1, + eColorEx = 2, + eSkillInfo = 3, + eAttributeInfo = 4, + eVitalInfo = 5, + eObjectFromGUID = 6, + eObjectFromGUIDClass = 7, + eOnSelectItemEvent = 8, + eRequestID = 9, + eIDQueueAdd = 10, + eUstAddItem = 11, + eSendMessageByMask = 12, + eToolText = 13, + eToolText2 = 14, + eUseItemRaw = 15, + eUseFociSpell = 16, + eSetIdleTime = 17, + eSetDay = 18, + eGiveItem = 19, + eMoveItemExRaw = 20, + eAvailableHooksEx_DWORD = 0x7FFFFFFF // coerce enums into 4 byte instead of two + }; + + + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + interface IDecalSurrogate; + interface IDecalFileSurrogate; + interface IDecalUninstall; + + interface IPlugin2; + interface IDecalService; + interface IDecalRender; + interface IKitchenSink; + dispinterface IACHooksEvents; + + [ + uuid(4557D5A1-00DB-48F6-ACB3-4FEF30E2F358), + helpstring("Decal Class") + ] + coclass Decal + { + [default] interface IDecal; + }; + + [ + uuid(E2284FC7-17E5-4846-ADAB-07953273C5FB), + helpstring("PluginSite Class"), + noncreatable + ] + coclass PluginSite2 + { + [default] interface IPluginSite2; + }; + + [ + uuid(6DE65A82-C451-46E6-A82D-92137BE851AD), + helpstring("DecalEnum Class"), + noncreatable + ] + coclass DecalEnum + { + [default] interface IDecalEnum; + }; + + [ + uuid(144FBF76-E7FB-4B41-AE19-6B5AB0E0A89B), + helpstring("SurrogateRemove Class") + ] + coclass SurrogateRemove + { + [default] interface IDecalUninstall; + }; + + [ + uuid(7559F22F-C56F-4621-AE08-9C354D799D4B), + helpstring("ActiveXSurrogate Class") + ] + coclass ActiveXSurrogate + { + [default] interface IDecalFileSurrogate; + interface IDecalUninstall; + }; + + [ + uuid(EA7BE91B-C98A-4138-8985-E22364BE8207), + noncreatable, + helpstring("DecalRes Class") + ] + coclass DecalRes + { + [default] interface IDecalRes; + }; + + [ + uuid(CB8875CD-ABC2-42AD-8175-8908706EED37), + helpstring("ACHooks Class") + ] + coclass ACHooks + { + [default] interface IACHooks; + [default, source] interface IACHooksEvents; + }; +}; diff --git a/Native/Include/DecalDat.idl b/Native/Include/DecalDat.idl new file mode 100644 index 0000000..4965903 --- /dev/null +++ b/Native/Include/DecalDat.idl @@ -0,0 +1,101 @@ +// DecalDat.idl : IDL source for DecalDat.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (DecalDat.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; + + [ + object, + uuid(D501DE12-DD81-4CE1-8854-78CBCB96C2DB), + dual, + helpstring("IDatService Interface"), + pointer_default(unique) + ] + interface IDatService : IDispatch + { + }; + + [ + object, + uuid(4EC04AB5-F87A-465D-B282-1B6C2E6068C9), + dual, + helpstring("IDatLibrary Interface"), + pointer_default(unique) + ] + interface IDatLibrary : IDispatch + { + [propget, id(1), helpstring("property Stream")] HRESULT Stream(DWORD File, [out, retval] LPUNKNOWN *pVal); + [id(2), helpstring("method Open")] HRESULT Open(BSTR Protocol, DWORD File, [out, retval] LPUNKNOWN *pFile); + }; + + [ + object, + uuid(B27D3F72-2640-432F-BAE4-175E1AA0CA39), + helpstring("IDatStream Interface"), + pointer_default(unique) + ] + interface IDatStream : IUnknown + { + [propget, helpstring("property Size")] HRESULT Size([out, retval] long *pVal); + [propget, helpstring("property Tell")] HRESULT Tell([out, retval] long *pVal); + [helpstring("method Skip")] HRESULT Skip(long Bytes); + [helpstring("method Restart")] HRESULT Restart(); + [helpstring("method ReadBinary")] HRESULT ReadBinary(long Bytes, [size_is(Bytes)] BYTE *Buffer); + [helpstring("method Read")] HRESULT Read(long Bytes, [out, retval] BSTR *Data); + }; + + [ + object, + uuid(1349EF1A-06EA-43e5-9026-4F3967C6C1D3), + helpstring("IFileFilter Interface"), + pointer_default(unique) + ] + interface IFileFilter : IUnknown + { + [helpstring("method Initiailize")] HRESULT Initialize(IDatStream *Stream); + }; + +[ + uuid(C2C11EC7-2CB9-4999-BDD9-AF599455601F), + version(1.0), + helpstring("DecalDat 1.0 Type Library") +] +library DecalDat +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + interface IFileFilter; + + [ + uuid(37B083F0-276E-43AD-8D26-3F7449B519DC), + helpstring("DatService Class") + ] + coclass DatService + { + [default] interface IDatService; + }; + + [ + uuid(6FA05FDA-B4B5-4386-AB45-92D7E6A5D698), + helpstring("DatLibrary Class"), + noncreatable + ] + coclass DatLibrary + { + [default] interface IDatLibrary; + }; + + [ + uuid(9F7F6CD9-D164-418D-8CB5-3B9ACD70BEAF), + helpstring("DatStream Class"), + noncreatable + ] + coclass DatStream + { + [default] interface IDatStream; + }; +}; diff --git a/Native/Include/DecalFilters.idl b/Native/Include/DecalFilters.idl new file mode 100644 index 0000000..f32a5f5 --- /dev/null +++ b/Native/Include/DecalFilters.idl @@ -0,0 +1,273 @@ +// DecalFilters.idl : IDL source for DecalFilters.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (DecalFilters.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; +import "DecalNet.idl"; + +enum eTrainingType +{ + eTrainUnusable, + eTrainUntrained, + eTrainTrained, + eTrainSpecialized +}; + +enum eAttributeID +{ + eAttrStrength = 1, + eAttrEndurance = 2, + eAttrQuickness = 3, + eAttrCoordination = 4, + eAttrFocus = 5, + eAttrSelf = 6 +}; + +enum eSkillID +{ + eSkillAxe = 1, + eSkillBow = 2, + eSkillCrossbow = 3, + eSkillDagger = 4, + eSkillMace = 5, + eSkillMeleeDefense = 6, + eSkillMissileDefense = 7, + eSkillSpear = 9, + eSkillStaff = 10, + eSkillSword = 11, + eSkillThrownWeapons = 12, + eSkillUnarmed = 13, + eSkillArcaneLore = 14, + eSkillMagicDefense = 15, + eSkillManaConversion = 16, + eSkillAppraiseItem = 18, + eSkillAssessPerson = 19, + eSkillDeception = 20, + eSkillHealing = 21, + eSkillJump = 22, + eSkillLockpick = 23, + eSkillRun = 24, + eSkillAssessCreature = 27, + eSkillAppraiseWeapon = 28, + eSkillAppraiseArmour = 29, + eSkillAppraiseMagicItem = 30, + eSkillCreatureEnchantment = 31, + eSkillItemEnchantment = 32, + eSkillLifeMagic = 33, + eSkillWarMagic = 34, + eSkillLeadership = 35, + eSkillLoyalty = 36, + eSkillFletching = 37, + eSkillAlchemy = 38, + eSkillCooking = 39 +}; + +enum eVitalID +{ + eHealth = 1, + eStamina = 2, + eMana = 3 +}; + +enum eStatisticType +{ + eStatBurden = 5, + eStatPyreal = 20, + eStatExperience = 21, + eStatUnassignedExp = 22, + eStatUnassignedSkillPoints = 24, + eStatLevel = 25, + eStatRank = 30 +}; + +enum eStringType +{ + eStringName = 1, + eStringGender = 3, + eStringRace = 4, + eStringClass = 5 +}; + + [ + uuid(236B3F19-8F40-492b-A462-0EB4447A6296), + helpstring("IEchoEvents Interface") + ] + dispinterface IEchoEvents + { + properties: + methods: + [id(1), helpstring("method EchoMessage")] void EchoMessage(IMessage *Message); + }; + + [ + uuid(A67C748D-2427-4a13-A114-7ACC1D4C9433), + helpstring("IPrefilterEvents Interface") + ] + dispinterface IPrefilterEvents + { + properties: + methods: + [id(1), helpstring("method Event")] void Event(long ID, IMessage *Message); + }; + + [ + object, + uuid(B6496852-E977-4DA2-884D-09AFEA3D7582), + dual, + helpstring("IAttributeInfo Interface"), + pointer_default(unique) + ] + interface IAttributeInfo : IDispatch + { + [propget, id(1), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(2), helpstring("property Creation")] HRESULT Creation([out, retval] long *pVal); + [propget, id(3), helpstring("property Exp")] HRESULT Exp([out, retval] long *pVal); + [propget, id(4), helpstring("property Current")] HRESULT Current([out, retval] long *pVal); + }; + + [ + object, + uuid(6FBA5326-F234-4AEC-B844-2136A0D50FD5), + dual, + helpstring("ISkillInfo Interface"), + pointer_default(unique) + ] + interface ISkillInfo : IDispatch + { + [propget, id(1), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(2), helpstring("property ShortName")] HRESULT ShortName([out, retval] BSTR *pVal); + [propget, id(3), helpstring("property Formula")] HRESULT Formula([out, retval] BSTR *pVal); + [propget, id(4), helpstring("property Base")] HRESULT Base([out, retval] long *pVal); + [propget, id(5), helpstring("property Current")] HRESULT Current([out, retval] long *pVal); + [propget, id(6), helpstring("property Exp")] HRESULT Exp([out, retval] long *pVal); + [propget, id(7), helpstring("property Training")] HRESULT Training([out, retval] enum eTrainingType *pVal); + [propget, id(8), helpstring("property Known")] HRESULT Known([out, retval] VARIANT_BOOL *pVal); + }; + + [ + object, + uuid(BFBE3A29-5F61-4973-9A74-EF50B328225E), + dual, + helpstring("INetworkFilter Interface"), + pointer_default(unique) + ] + interface IEchoFilter : IDispatch + { + }; + + [ + object, + uuid(0CE57594-4E30-4446-956D-CE460C7355AF), + dual, + helpstring("ICharacterStats Interface"), + pointer_default(unique) + ] + interface ICharacterStats : IDispatch + { + [propget, id(1), helpstring("property Character")] HRESULT Character([out, retval] long *pVal); + [propget, id(2), helpstring("property Level")] HRESULT Level([out, retval] long *pVal); + [propget, id(3), helpstring("property Rank")] HRESULT Rank([out, retval] long *pVal); + [propget, id(4), helpstring("property TotalExp")] HRESULT TotalExp([out, retval] long *pVal); + [propget, id(5), helpstring("property UnassignedExp")] HRESULT UnassignedExp([out, retval] long *pVal); + [propget, id(6), helpstring("property SkillPoints")] HRESULT SkillPoints([out, retval] long *pVal); + [propget, id(7), helpstring("property Server")] HRESULT Server([out, retval] BSTR *pVal); + [propget, id(8), helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal); + [propget, id(9), helpstring("property Race")] HRESULT Race([out, retval] BSTR *pVal); + [propget, id(10), helpstring("property Gender")] HRESULT Gender([out, retval] BSTR *pVal); + [propget, id(11), helpstring("property ClassTemplate")] HRESULT ClassTemplate([out, retval] BSTR *pVal); + [propget, id(12), helpstring("property AttributeCount")] HRESULT AttributeCount([out, retval] long *pVal); + [propget, id(13), helpstring("property SkillCount")] HRESULT SkillCount([out, retval] long *pVal); + [propget, id(14), helpstring("property VitalCount")] HRESULT VitalCount([out, retval] long *pVal); + [propget, id(15), helpstring("property Attribute")] HRESULT Attribute(enum eAttributeID Index, [out, retval] IAttributeInfo * *pVal); + [propget, id(16), helpstring("property Skill")] HRESULT Skill(enum eSkillID Index, [out, retval] ISkillInfo * *pVal); + [propget, id(17), helpstring("property Vital")] HRESULT Vital(enum eVitalID Index, [out, retval] ISkillInfo * *pVal); + }; + +[ + uuid(DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1), + version(1.0), + helpstring("Decal Network Filters Type Library") +] +library DecalFilters +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + dispinterface IEchoEvents; + dispinterface IPrefilterEvents; + + [ + uuid(8C2FA400-315D-41DE-B063-D6EF04F12E1F), + helpstring("EchoFilter Class") + ] + coclass EchoFilter + { + [default] interface IEchoFilter; + [default, source] dispinterface IEchoEvents; + }; + + [ + uuid(0B60F187-13CD-4E35-B8A2-FE128F05CA6B), + helpstring("_ICharacterStatsEvents Interface") + ] + dispinterface ICharacterStatsEvents + { + properties: + methods: + [id(1), helpstring("method Login")] HRESULT Login(long character); + }; + + [ + object, + uuid(3C1CBEF8-E72A-4BDF-B92E-4F3307109766), + dual, + helpstring("IPrefilter Interface"), + pointer_default(unique) + ] + interface IPrefilter : IDispatch + { + }; + + [ + uuid(4540C969-08D1-46BF-97AD-6B19D3C10BEE), + helpstring("CharacterStats Class") + ] + coclass CharacterStats + { + [default] interface ICharacterStats; + [default, source] dispinterface ICharacterStatsEvents; + }; + + [ + uuid(AF42E9D7-E3F3-416B-AF32-A411F3F6EE72), + helpstring("AttributeInfo Class"), + noncreatable + ] + coclass AttributeInfo + { + [default] interface IAttributeInfo; + }; + + [ + uuid(652DA384-AA3B-4F9D-9730-8CF753DA1A31), + helpstring("SkillInfo Class"), + noncreatable + ] + coclass SkillInfo + { + [default] interface ISkillInfo; + }; + + [ + uuid(443D4A68-5422-4E0C-9460-973F8FBDB190), + helpstring("Prefilter Class") + ] + coclass Prefilter + { + [default] interface IPrefilter; + [default, source] dispinterface IPrefilterEvents; + }; +}; diff --git a/Native/Include/DecalImpl.h b/Native/Include/DecalImpl.h new file mode 100644 index 0000000..8ee60ab --- /dev/null +++ b/Native/Include/DecalImpl.h @@ -0,0 +1,386 @@ +// DecalImpl.h +// Declaration of default implementations for Decal interfaces + +#ifndef __DECALIMPL_H +#define __DECALIMPL_H + +//C Library includes +#include +#include + +#include +#import + +#include "../Include/Helpers.h" + +template< class ImplT > +class ATL_NO_VTABLE IDecalServiceImpl +: public IDecalService +{ +public: + CComPtr< IDecal > m_pDecal; + + HRESULT onInitialize() + { + return S_OK; + } + + void onTerminate() + { + } + + STDMETHOD(Initialize)( IDecal *pDecal ) + { + m_pDecal = pDecal; + + HRESULT hRes = static_cast< ImplT * >( this )->onInitialize(); + + if( FAILED( hRes ) ) + m_pDecal.Release(); + + return hRes; + } + + STDMETHOD(Terminate)() + { + static_cast< ImplT * >( this )->onTerminate(); + m_pDecal.Release(); + + return S_OK; + } + + STDMETHOD(BeforePlugins)() + { + return S_OK; + } + + STDMETHOD(AfterPlugins)() + { + return S_OK; + } +}; + +class IDecalRenderImpl +: public IDecalRender +{ +public: + STDMETHOD(Render2D)() + { + return S_OK; + } + + STDMETHOD(Render3D)() + { + return S_OK; + } + + STDMETHOD(ChangeHWND)() + { + return S_OK; + } + + STDMETHOD(ChangeDirectX)() + { + return S_OK; + } +}; + +template< class ImplT, const CLSID *pClsid > +class IDecalFileSurrogateXMLImpl +: public IDecalFileSurrogate +{ +public: + static LPCTSTR getConfigGroup() + { + // This function must be overridden + _ASSERT( FALSE ); + return _T( "Error: Bad config group" ); + } + + STDMETHOD(Register)(BSTR strFilename) + { + USES_CONVERSION; + + MSXML::IXMLDOMDocumentPtr pDoc; + + pDoc.CreateInstance( __uuidof( MSXML::DOMDocument ), NULL, CLSCTX_INPROC_SERVER ); + + if( !pDoc->load( strFilename ) ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + MSXML::IXMLDOMElementPtr pRoot = pDoc->selectSingleNode( _T( "/*" ) ); + _variant_t vCLSID = pRoot->getAttribute( _T( "clsid" ) ), + vProgID = pRoot->getAttribute( _T( "progid" ) ), + vName = pRoot->getAttribute( _T( "name" ) ); + + if( vCLSID.vt != VT_BSTR ) + { + _ASSERT( FALSE ); + return E_FAIL; + } + + // Convert the clsid + CLSID clsid; + HRESULT hRes = ::CLSIDFromString( vCLSID.bstrVal, &clsid ); + if( FAILED( hRes ) ) + { + // Improperly formatted CLSID + _ASSERT( FALSE ); + return hRes; + } + + // Everything we need now, make the registry entries + LPOLESTR strKey, strSurrogate, strUninstall; + ::StringFromCLSID( clsid, &strKey ); + ::StringFromCLSID( *pClsid, &strSurrogate ); + ::StringFromCLSID( __uuidof( SurrogateRemove ), &strUninstall ); + + LPTSTR szKey = OLE2T( strKey ); + + RegKey rk; + TCHAR szPluginKey[ 255 ]; + ::_stprintf( szPluginKey, _T( "Software\\Decal\\%s\\%s" ), static_cast< ImplT * >( this )->getConfigGroup(), szKey ); + + // Open it up + rk.Create( HKEY_LOCAL_MACHINE, szPluginKey ); + + if( vName.vt == VT_BSTR ) + rk.SetStringValue (NULL, OLE2T( vName.bstrVal )); + + LPTSTR szSurrogate = OLE2T( strSurrogate ); + + rk.SetDWORDValue (_T("Enabled"), 1); + rk.SetStringValue (_T("Surrogate"), szSurrogate); + + rk.SetStringValue ( _T("Uninstall"), OLE2T( strUninstall )); + rk.SetStringValue( _T("File"), OLE2T( strFilename ) ); + + if( vProgID.vt == VT_BSTR ) + { + LPTSTR szProgID = OLE2T( vProgID.bstrVal ); + RegKey rkProgID; + rkProgID.Create( HKEY_CLASSES_ROOT, szProgID ); + + rkProgID.SetKeyValue( _T( "CLSID" ), szKey ); + + rk.SetStringValue( _T("ProgID"), szProgID ); + } + + ::CoTaskMemFree( strUninstall ); + ::CoTaskMemFree( strSurrogate ); + ::CoTaskMemFree( strKey ); + + return S_OK; + } +}; + +// Disp event dynamic is a hybrid that uses type info from a generated +// typelib (at runtime) to dispatch messages. Unlike IDispEventImpl which +// requires a registered typelib. Still, much code is copied from IDispEventImpl. +template< UINT nID, class T > +class ATL_NO_VTABLE IDispEventDynamicImpl +: public IDispEventSimpleImpl< nID, T, &GUID_NULL > +{ +public: + typedef IDispEventSimpleImpl< nID, T, &GUID_NULL > _base; + + CComPtr< ITypeInfo2 > m_pTI; + + HRESULT GetSourceInterfaceInfo( IUnknown *pUnk, ITypeInfo **ppTI ) + { + // Get provide class info + CComPtr< IProvideClassInfo > pPCI; + HRESULT hRes = pUnk->QueryInterface( &pPCI ); + if( FAILED( hRes ) ) + // Does not support IProvideClassInfo, bad + return hRes; + + CComPtr< ITypeInfo > pClassInfo; + hRes = pPCI->GetClassInfo( &pClassInfo ); + + if( FAILED( hRes ) ) + // Failed to return any class info + return hRes; + + // Iterate through the Impl types to find the default source interface + int nImplFlags; + for( UINT i = 0; SUCCEEDED( pClassInfo->GetImplTypeFlags() ); ++ i ) + { + if( nImplFlags == ( IMPLTYPEFLAG_FSOURCE | IMPLTYPEFLAG_FDEFAULT ) ) + { + // Found it - locate our type info + HREFTYPE href; + hRes = pClassInfo->GetRefTypeOfImplType( i, &href ); + + if( FAILED( hRes ) ) + // Could not access the ref type (referenced typelib not available?) + return hRes; + + return pClassInfo->GetRefTypeInfo( href, ppTI ); + } + } + + // Did not find a suitable interface + return E_FAIL; + } + + HRESULT GetSourceIID( ITypeInfo *pTI, IID *piid ) + { + TYPEATTR *pTA; + HRESULT hRes = pTI->GetTypeAttr( &pTA ); + + if( FAILED( hRes ) ) + return hRes; + + *piid = pTA->guid; + pTI->ReleaseTypeAttr( pTA ); + + return S_OK; + } + + HRESULT DispEventAdvise( IUnknown *pUnk ) + { + CComPtr< ITypeInfo > pSourceInfo; + HRESULT hRes = GetSourceInterfaceInfo( pUnk, &pSourceInfo ); + if( FAILED( hRes ) ) + return hRes; + + IID iid; + hRes = GetSourceIID( pSourceInfo, &iid ); + if( FAILED( hRes ) ) + return hRes; + + hRes = _base::DispEventAdvise( pUnk, iid ); + if( SUCCEEDED( hRes ) ) + m_pTI = pSourceInfo; + + return hRes; + } + + HRESULT DispEventUnadvise( IUnknown *pUnk ) + { + IID iid; + HRESULT hRes = GetSourceIID( pSourceInfo, &iid ); + _ASSERTE( SUCCEEDED( hRes ) ); + + _base::DispEventUnadvise( pUnk, iid ); + m_pTI.Release(); + + return S_OK; + } + + // Functions copied from IDispEventImpl + STDMETHOD(GetTypeInfoCount)(UINT* pctinfo) + { + if( pctinfo == NULL ) + return E_POINTER; + + *pctinfo = 1; + return S_OK; + } + + STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) + { + if( itinfo > 0 ) + return E_INVALIDARG; + + if( pptinfo == NULL ) + return E_POINTER; + + return m_pTI->QueryIterface( pptinfo ); + } + + STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, + LCID, DISPID* rgdispid) + { + if( !::InlineIsEqualGUID( riid, IID_NULL ) ) + // By spec + return DISP_E_UNKNOWNINTERFACE; + + return m_pTI->GetIDsOfNames( rgszNames, cNames, rgdispid ); + } + + // Helper for finding the function index for a DISPID + HRESULT GetFuncInfoFromId(const IID& /*iid*/, DISPID dispidMember, LCID lcid, _ATL_FUNC_INFO& info) + { + FUNCDESC* pFuncDesc = NULL; + UINT nIndex; + HRESULT hr = m_pTI->GetFuncIndexOfMemId(dispidMember, INVOKE_FUNC, &nIndex); + if (FAILED(hr)) + return hr; + hr = m_pTI->GetFuncDesc(nIndex, &pFuncDesc); + if (FAILED(hr)) + return hr; + + // If this assert occurs, then add a #define _ATL_MAX_VARTYPES nnnn + // before including atlcom.h + ATLASSERT(pFuncDesc->cParams <= _ATL_MAX_VARTYPES); + if (pFuncDesc->cParams > _ATL_MAX_VARTYPES) + return E_FAIL; + + for (int i=0; icParams; i++) + { + info.pVarTypes[i] = pFuncDesc->lprgelemdescParam[pFuncDesc->cParams - i - 1].tdesc.vt; + if (info.pVarTypes[i] == VT_PTR) + info.pVarTypes[i] = pFuncDesc->lprgelemdescParam[pFuncDesc->cParams - i - 1].tdesc.lptdesc->vt | VT_BYREF; + if (info.pVarTypes[i] == VT_USERDEFINED) + info.pVarTypes[i] = GetUserDefinedType(pFuncDesc->lprgelemdescParam[pFuncDesc->cParams-i-1].tdesc.hreftype); + } + + VARTYPE vtReturn = pFuncDesc->elemdescFunc.tdesc.vt; + switch(vtReturn) + { + case VT_INT: + vtReturn = VT_I4; + break; + case VT_UINT: + vtReturn = VT_UI4; + break; + case VT_VOID: + vtReturn = VT_EMPTY; // this is how DispCallFunc() represents void + break; + case VT_HRESULT: + vtReturn = VT_ERROR; + break; + } + info.vtReturn = vtReturn; + info.cc = pFuncDesc->callconv; + info.nParams = pFuncDesc->cParams; + m_pTI->ReleaseFuncDesc(pFuncDesc); + + return S_OK; + } + + VARTYPE GetUserDefinedType(HREFTYPE hrt) + { + CComPtr spTypeInfo; + VARTYPE vt = VT_USERDEFINED; + HRESULT hr = E_FAIL; + hr = m_pTI->GetRefTypeInfo(hrt, &spTypeInfo); + + if(FAILED(hr)) + return vt; + + TYPEATTR *pta=NULL; + + m_pTI->GetTypeAttr(&pta); + + if(pta && pta->typekind == TKIND_ALIAS) + { + if (pta->tdescAlias.vt == VT_USERDEFINED) + GetUserDefinedType(spTypeInfo,pta->tdescAlias.hreftype); + else + vt = pta->tdescAlias.vt; + } + + if(pta) + spTypeInfo->ReleaseTypeAttr(pta); + + return vt; + } +}; + +#endif diff --git a/Native/Include/DecalInput.idl b/Native/Include/DecalInput.idl new file mode 100644 index 0000000..a0076a6 --- /dev/null +++ b/Native/Include/DecalInput.idl @@ -0,0 +1,319 @@ +// DecalInput.idl : IDL source for DecalInput.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (DecalInput.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; +import "Decal.idl"; + + [ + object, + uuid(27A63073-10D6-4282-85CF-77E4DEB8C6B8), + dual, + helpstring("IInputService Interface"), + pointer_default(unique) + ] + interface IInputService : IDispatch + { + [propget, id(1), helpstring("property Command")] HRESULT Command(BSTR strCommandName, [out, retval] BSTR *pVal); + [propget, id(2), helpstring("property Decal")] HRESULT Decal([out, retval] IDecal * *pVal); + [propget, id(3), helpstring("property KeyByName")] HRESULT KeyByName(BSTR strName, [out, retval] long *pVal); + [propget, id(4), helpstring("property CommandKey")] HRESULT CommandKey(BSTR strCommand, [out, retval] long *pVal); + }; + + [ + object, + uuid(6CE124D7-534E-4BB6-AAF2-2BE22F69326D), + dual, + helpstring("IDecalTimer Interface"), + pointer_default(unique) + ] + interface IDecalTimer : IDispatch + { + [id(1), helpstring("method Start")] HRESULT Start(long Interval); + [id(2), helpstring("method Stop")] HRESULT Stop(); + [propget, id(3), helpstring("property Tag")] HRESULT Tag([out, retval] VARIANT *pVal); + [propput, id(3), helpstring("property Tag")] HRESULT Tag([in] VARIANT newVal); + [propget, id(4), helpstring("property Running")] HRESULT Running([out, retval] VARIANT_BOOL *pVal); + }; + + [ + object, + uuid(95AF8DF7-F2A0-476E-9D8C-B23493B1698D), + dual, + helpstring("IHotkey Interface"), + pointer_default(unique) + ] + interface IHotkey : IDispatch + { + [propget, id(1), helpstring("property Tag")] HRESULT Tag([out, retval] VARIANT *pVal); + [propput, id(1), helpstring("property Tag")] HRESULT Tag([in] VARIANT newVal); + [propget, id(2), helpstring("property Key")] HRESULT Key([out, retval] BSTR *pVal); + [propput, id(2), helpstring("property Key")] HRESULT Key([in] BSTR newVal); + [propget, id(3), helpstring("property Enabled")] HRESULT Enabled([out, retval] VARIANT_BOOL *pVal); + [propput, id(3), helpstring("property Enabled")] HRESULT Enabled([in] VARIANT_BOOL newVal); + }; + + [ + object, + uuid(F4E4EA59-0E47-4BAD-819A-722F5FFD506F), + dual, + helpstring("IWinMsgHook Interface"), + pointer_default(unique) + ] + interface IWinMsgHook : IDispatch + { + [propget, id(1), helpstring("property Tag")] HRESULT Tag([out, retval] VARIANT *pVal); + [propput, id(1), helpstring("property Tag")] HRESULT Tag([in] VARIANT newVal); + [propget, id(2), helpstring("property Enabled")] HRESULT Enabled([out, retval] VARIANT_BOOL *pVal); + [propput, id(2), helpstring("property Enabled")] HRESULT Enabled([in] VARIANT_BOOL newVal); + }; + + [ + object, + uuid(BDAD721B-7A00-440D-8964-70427167DD36), + dual, + helpstring("IWndMsg Interface"), + pointer_default(unique) + ] + interface IWndMsg : IDispatch + { + [propget, id(1), helpstring("property HWND")] HRESULT HWND([out, retval] long *pVal); + [propget, id(2), helpstring("property Message")] HRESULT Message([out, retval] long *pVal); + [propget, id(3), helpstring("property WParam")] HRESULT WParam([out, retval] long *pVal); + [propget, id(4), helpstring("property LParam")] HRESULT LParam([out, retval] long *pVal); + [propget, id(5), helpstring("property Eat")] HRESULT Eat([out, retval] VARIANT_BOOL *pVal); + [propput, id(5), helpstring("property Eat")] HRESULT Eat([in] VARIANT_BOOL newVal); + }; + + [ + object, + uuid(B772FDC3-36AD-4957-9143-5A10FBDA6D1D), + dual, + helpstring("IInputBuffer Interface"), + pointer_default(unique) + ] + interface IInputBuffer : IDispatch + { + [propget, id(1), helpstring("property Tag")] HRESULT Tag([out, retval] VARIANT *pVal); + [propput, id(1), helpstring("property Tag")] HRESULT Tag([in] VARIANT newVal); + [id(2), helpstring("method Add")] HRESULT Add(BSTR Command); + [id(3), helpstring("method Push")] HRESULT Push(BSTR Command); + [id(4), helpstring("method Pop")] HRESULT Pop(); + [propget, id(5), helpstring("property CanRun")] HRESULT CanRun([out, retval] VARIANT_BOOL *pVal); + [id(6), helpstring("method Run")] HRESULT Run(); + [id(7), helpstring("method Stop")] HRESULT Stop(); + }; + + interface IInputActionSite; + + enum eActionUse + { + eActionExecute, + eActionStack + }; + + [ + object, + uuid(C73A3F3D-8286-4250-BF97-155EE341E42F), + helpstring("IInputAction Interface"), + pointer_default(unique) + ] + interface IInputAction : IUnknown + { + [helpstring("method Initialize")] HRESULT Initialize(IInputActionSite *pSite, BSTR strData); + [helpstring("method Terminate")] HRESULT Terminate(); + [propget, helpstring("property Stackable")] HRESULT Stackable([out, retval] VARIANT_BOOL *pVal); + [helpstring("method Reset")] HRESULT Reset(); + [helpstring("method Push")] HRESULT Push(); + [helpstring("method Pop")] HRESULT Pop(); + [helpstring("method Execute")] HRESULT Execute(); + }; + + [ + object, + uuid(1751F4E5-4E11-42f1-A00F-ED5B1D899C66), + helpstring("IInputActionSite Interface"), + pointer_default(unique) + ] + interface IInputActionSite : IUnknown + { + [helpstring("method Delay")] HRESULT Delay(long Time, VARIANT_BOOL Advance); + [helpstring("method FireEvent")] HRESULT FireEvent(long nEventID, VARIANT vParam); + [helpstring("method MoveMouse")] HRESULT MoveMouse(long X, long Y); + [propget, helpstring("property Service")] HRESULT Service([out, retval] IInputService * *pVal); + }; + +[ + uuid(3A985F2B-BAD5-43BF-9008-ED4EBBB45B6E), + version(1.0), + helpstring("DecalInput 1.0 Type Library") +] +library DecalInput +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + interface IInputAction; + interface IInputActionSite; + + [ + uuid(B33307BA-706D-474A-80B9-70BB8D13EF3E), + helpstring("InputService Class") + ] + coclass InputService + { + [default] interface IInputService; + }; + + [ + uuid(BBF25010-50FE-4398-BB78-BF8B9D392915), + helpstring("ITimerEvents Interface") + ] + dispinterface ITimerEvents + { + properties: + methods: + [id(1), helpstring("method Timeout")] HRESULT Timeout(IDecalTimer *Source); + }; + + [ + uuid(79497C87-92E1-416B-AE5C-9D6C4C59133C), + helpstring("Timer Class") + ] + coclass Timer + { + [default] interface IDecalTimer; + [default, source] dispinterface ITimerEvents; + }; + + [ + uuid(15EAEB82-6EC8-4A09-8FA3-2D691BBB732F), + helpstring("IHotkeyEvents Interface") + ] + dispinterface IHotkeyEvents + { + properties: + methods: + [id(1), helpstring("method Hotkey")] HRESULT Hotkey(IHotkey *Source); + }; + + [ + uuid(F183506A-3664-49D6-8CA4-CFD295F2811D), + helpstring("Hotkey Class") + ] + coclass Hotkey + { + [default] interface IHotkey; + [default, source] dispinterface IHotkeyEvents; + }; + + [ + uuid(7E3E2EE8-1E06-4CFD-87D9-E4AEAB4CFE31), + helpstring("IWinMsgHookEvents Interface") + ] + dispinterface IWinMsgHookEvents + { + properties: + methods: + [id(1), helpstring("method Message")] HRESULT Message(IWinMsgHook *Hook, IWndMsg *Message); + }; + + [ + uuid(F3170E85-517E-43A4-B7B4-6F006A7B1B85), + helpstring("WinMsgHook Class") + ] + coclass WinMsgHook + { + [default] interface IWinMsgHook; + [default, source] dispinterface IWinMsgHookEvents; + }; + + [ + uuid(85AB0296-124E-4E68-A6A8-FCF5721AC09B), + noncreatable, + helpstring("WndMsg Class") + ] + coclass WndMsg + { + [default] interface IWndMsg; + }; + + [ + uuid(04CD59E6-672E-45A6-AE0A-454B1F59377A), + helpstring("IInputBufferEvents Interface") + ] + dispinterface IInputBufferEvents + { + properties: + methods: + [id(1), helpstring("method Begin")] HRESULT Begin(IInputBuffer *Buffer); + [id(2), helpstring("method End")] HRESULT End(IInputBuffer *Buffer); + [id(3), helpstring("method Event")] HRESULT Event(IInputBuffer *Buffer, long EventID, VARIANT Param); + }; + + [ + uuid(F0A17A04-7F8F-4A17-A41D-8C297A1E929B), + helpstring("InputBuffer Class") + ] + coclass InputBuffer + { + [default] interface IInputBuffer; + [default, source] dispinterface IInputBufferEvents; + }; + + [ + uuid(9CDCEEDC-F8AC-42D5-9A05-52B9346D00A4), + helpstring("TypeAction Class") + ] + coclass TypeAction + { + [default] interface IInputAction; + }; + + [ + uuid(57D18578-0BF0-4DE5-A0A9-E7CB531C0429), + helpstring("MouseMoveAction Class") + ] + coclass MouseMoveAction + { + [default] interface IInputAction; + }; + + [ + uuid(324D76B8-D8C7-4A81-B867-E4E1F874E488), + helpstring("DelayAction Class") + ] + coclass DelayAction + { + [default] interface IInputAction; + }; + + [ + uuid(D6E4BD19-4900-4515-BCE2-A9EA4AAE2699), + helpstring("EventAction Class") + ] + coclass EventAction + { + [default] interface IInputAction; + }; + + [ + uuid(762335B2-2274-4BB4-8B1F-F7286C949FF7), + helpstring("PolledDelayAction Class") + ] + coclass PolledDelayAction + { + [default] interface IInputAction; + }; + [ + uuid(6EE2F682-7129-44BE-84B9-787BAE35EC1C), + helpstring("RestoreAction Class") + ] + coclass RestoreAction + { + [default] interface IInputAction; + }; +}; diff --git a/Native/Include/DecalInputImpl.h b/Native/Include/DecalInputImpl.h new file mode 100644 index 0000000..dc89033 --- /dev/null +++ b/Native/Include/DecalInputImpl.h @@ -0,0 +1,68 @@ +// DecalInputImpl.h +// Declaration of classes for inputing Input Actions + +#ifndef __DECALINPUTIMPL_H +#define __DECALINPUTIMPL_H + +#include "DecalInput.h" + +template< class ImplT > +class IInputActionImpl +: public IInputAction +{ +public: + CComPtr< IInputActionSite > m_pSite; + + HRESULT onLoad( LPTSTR szData ) + { + return S_OK; + } + + STDMETHOD(Initialize)(IInputActionSite *pSite, BSTR strData) + { + USES_CONVERSION; + + m_pSite = pSite; + HRESULT hRes = static_cast< ImplT * >( this )->onLoad( OLE2T( strData ) ); + if( FAILED( hRes ) ) + m_pSite.Release(); + + return hRes; + } + + STDMETHOD(Terminate)() + { + m_pSite.Release(); + + return S_OK; + } + + // Default Implementation returns false + STDMETHOD(get_Stackable)(VARIANT_BOOL *pVal) + { + *pVal = VARIANT_FALSE; + return S_OK; + } + + STDMETHOD(Push)() + { + return S_OK; + } + + STDMETHOD(Pop)() + { + return S_OK; + } + + STDMETHOD(Execute)() + { + return S_OK; + } + + STDMETHOD(Reset)() + { + return S_OK; + } +}; + +#endif diff --git a/Native/Include/DecalKey.h b/Native/Include/DecalKey.h new file mode 100644 index 0000000..2897682 --- /dev/null +++ b/Native/Include/DecalKey.h @@ -0,0 +1,9 @@ +// DecalVersion.h +// Declaration of the Decal version resource + +#ifndef __DECALKEY_H__ +#define __DECALKEY_H__ + +#define DECAL_KEY "DECAL" + +#endif diff --git a/Native/Include/DecalNet.idl b/Native/Include/DecalNet.idl new file mode 100644 index 0000000..ce5caeb --- /dev/null +++ b/Native/Include/DecalNet.idl @@ -0,0 +1,187 @@ +// DecalNet.idl : IDL source for DecalNet.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (DecalNet.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; +import "Decal.idl"; + +interface IMessage; + + [ + object, + uuid(05D14E34-0A23-4A9F-95CF-9DB24B3CFB9F), + dual, + helpstring("IMessageMember Interface"), + pointer_default(unique) + ] + interface IMessageMember : IDispatch + { + [id(5), propget, helpstring("property Member"), defaultcollelem] HRESULT Member(VARIANT vIndex, [out, retval] VARIANT *pVal); + [id(6), propget, helpstring("property MemberName")] HRESULT MemberName(long Index, [out, retval] BSTR *pVal); + [id(7), propget, helpstring("property Count")] HRESULT Count([out, retval] long *pVal); + }; + + [ + object, + uuid(23EE0804-EAC7-493B-BB9D-2298FD44FFA1), + dual, + helpstring("IMessage Interface"), + pointer_default(unique) + ] + interface IMessage : IDispatch + { + [id(2), propget, helpstring("property Type")] HRESULT Type([out, retval] long *pVal); + [id(3), propget, helpstring("property Data")] HRESULT Data([out, retval] VARIANT *pVal); + [id(5), propget, helpstring("property Member"), defaultcollelem] HRESULT Member(VARIANT vElement, [out, retval] VARIANT *pVal); + [id(6), propget, helpstring("property MemberName")] HRESULT MemberName(long Index, [out, retval] BSTR *pVal); + [id(7), propget, helpstring("property Count")] HRESULT Count([out, retval] long *pVal); + }; + + [ + object, + uuid(853BFE61-6C14-4244-8B96-96F0C9647DE6), + dual, + helpstring("IMessageMember Interface"), + pointer_default(unique) + ] + interface IMessageIterator : IDispatch + { + [propget, id(10), helpstring("Move the cursor to the next position")] HRESULT Next([optional] VARIANT vIndex, [out, retval] VARIANT *pbValue); + [propget, id(1), helpstring("Data at the current position")] HRESULT Current([out, retval] VARIANT *pData); + [propget, id(2), helpstring("Name of a member at a particular index")] HRESULT MemberName([out, retval] BSTR *pVal); + [propget, id(3), helpstring("Current index of the iterator")] HRESULT Index([out,retval] long *pIndex); + [propget, id(4), helpstring("String member by name")] HRESULT NextString (BSTR Name, [out, retval] BSTR *pValue); + [propget, id(5), helpstring("Integer member by name")] HRESULT NextInt (BSTR Name, [out, retval] long *pValue); + [propget, id(6), helpstring("Float member by name")] HRESULT NextFloat (BSTR Name, [out, retval] float *pValue); + [propget, id(7), helpstring("Object member by name")] HRESULT NextObject (BSTR Name, [out, retval] IMessageIterator **pValue); + [propget, id(8), helpstring("Object member by index")] HRESULT NextObjectIndex ([out, retval] IMessageIterator **pValue); + [id(9), helpstring("Reset the iterator")] HRESULT Reset(); + [propget, id(11), helpstring("Parent Message Object")] HRESULT Message([out, retval] IMessage **ppMsg); + }; + + [ + object, + uuid(38AFE740-9189-4f7c-8DE2-E61087DD9F19), + dual, + helpstring("IMessage Interface"), + pointer_default(unique) + ] + interface IMessage2 : IMessage + { + [propget, id(101), helpstring("property Members")] HRESULT Begin([out, retval] IMessageIterator * *pVal); + }; + + [ + object, + uuid(AA405035-E001-4CC3-B43A-156206843D64), + helpstring("INetService Interface"), + pointer_default(unique) + ] + interface INetService : IUnknown + { + [propget, helpstring("property Decal")] HRESULT Decal([out, retval] IDecal * *pVal); + [propget, helpstring("property Filter")] HRESULT Filter(REFCLSID clsid, REFIID iid, [out, retval, iid_is(iid)] LPVOID *pVal); + [propget, helpstring("property FilterVB")] HRESULT FilterVB(BSTR strProgID, [out, retval] LPDISPATCH *pVal); + [propget, helpstring("property Hooks")] HRESULT Hooks([out, retval] IACHooks * *pVal); + }; + + [ + object, + uuid(EEB0BE9E-46BD-493F-97E2-330670C09F59), + dual, + helpstring("INetworkFilter Interface"), + pointer_default(unique) + ] + interface INetworkFilter : IDispatch + { + [id(1), helpstring("method Dispatch")] HRESULT Dispatch(IMessage *Message); + }; + + [ + object, + uuid(CE518B62-714F-4993-B0C2-C703A7062F38), + helpstring("INetworkFilter Interface"), + pointer_default(unique) + ] + interface INetworkFilter2 : IUnknown + { + [helpstring("method Dispatch")] HRESULT DispatchServer(IMessage2 *Message); + [helpstring("method Dispatch")] HRESULT DispatchClient(IMessage2 *Message); + [helpstring("method Initialize")] HRESULT Initialize(INetService *pService); + [helpstring("method Terminate")] HRESULT Terminate(); + }; + + [ + object, + uuid(03F3E2D0-7026-4C11-988A-4B3C58C71917), + dual, + helpstring("IWebRequest Interface"), + pointer_default(unique) + ] + interface IWebRequest : IDispatch + { + [id(1), helpstring("method Get")] HRESULT Get(BSTR strURL); + [id(2), helpstring("method Post")] HRESULT Post(BSTR strURL, BSTR strPostData); + }; + +[ + uuid(572B87C4-93BD-46B3-A291-CD58181D25DC), + version(1.0), + helpstring("DecalNet 1.0 Type Library") +] +library DecalNet +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + interface IMessageMember; + interface IMessage; + interface IMessage2; + interface INetworkFilter; + interface INetworkFilter2; + interface IMessageIterator; + + [ + uuid(C8C406F8-BA2E-4964-8B04-FF38394A8E0E), + helpstring("NetService Class") + ] + coclass NetService + { + [default] interface INetService; + }; + + [ + uuid(EEFA38DC-15B2-4232-B5BE-5A9ECB8E1A58), + helpstring("_IWebRequestEvents Interface") + ] + dispinterface IWebRequestEvents + { + properties: + methods: + [id(1), helpstring("method Begin")] HRESULT Begin(); + [id(2), helpstring("method End")] HRESULT End(long nResultCode, BSTR strText); + }; + + [ + uuid(15631E36-55CB-4D16-ADE7-74D9F8A5F4B6), + helpstring("WebRequest Class") + ] + coclass WebRequest + { + [default] interface IWebRequest; + [default, source] dispinterface IWebRequestEvents; + }; + + [ + uuid(7A85E352-B133-4AB5-A9DA-85978005BF88), + helpstring("MessageRoot Class"), + noncreatable + ] + coclass MessageRoot + { + [default] interface IMessageIterator; + }; +}; diff --git a/Native/Include/DecalNetImpl.h b/Native/Include/DecalNetImpl.h new file mode 100644 index 0000000..7122163 --- /dev/null +++ b/Native/Include/DecalNetImpl.h @@ -0,0 +1,87 @@ +// DecalNetImpl.h +// Declaration of class to help you implement Decal Network Filters + +#ifndef __DECALNETIMPL_H +#define __DECALNETIMPL_H + +#include + +// The solo network filter does not have any depencies and does not store +// the INetServices object - clients must implement INetworkFilter::Dispatch +template< class ImplT > +class ATL_NO_VTABLE ISoloNetworkFilterImpl +: public INetworkFilter2 +{ +public: + STDMETHOD(Initialize)(INetService *) + { + return S_OK; + } + + STDMETHOD(Terminate)() + { + return S_OK; + } + + STDMETHOD(DispatchServer)(IMessage2 *) + { + return S_OK; + } + + STDMETHOD(DispatchClient)(IMessage2 *) + { + return S_OK; + } +}; + +// This version stores the INetService pointer passed during initialization. +// A network can use this to recall back to the Decal object and get extended +// state information +template< class ImplT > +class ATL_NO_VTABLE INetworkFilterImpl +: public INetworkFilter2 +{ +public: + CComPtr< INetService > m_pService; + + HRESULT onInitialize() + { + return S_OK; + } + + void onTerminate() + { + } + + STDMETHOD(Initialize)(INetService *pService) + { + m_pService = pService; + + HRESULT hRes = static_cast< ImplT * >( this )->onInitialize(); + + if( FAILED( hRes ) ) + m_pService.Release(); + + return hRes; + } + + STDMETHOD(Terminate)() + { + static_cast< ImplT * >( this )->onTerminate(); + m_pService.Release(); + + return S_OK; + } + + STDMETHOD(DispatchServer)(IMessage2 *) + { + return S_OK; + } + + STDMETHOD(DispatchClient)(IMessage2 *) + { + return S_OK; + } +}; + +#endif diff --git a/Native/Include/DecalVersion.h b/Native/Include/DecalVersion.h new file mode 100644 index 0000000..c596a42 --- /dev/null +++ b/Native/Include/DecalVersion.h @@ -0,0 +1,14 @@ +// DecalVersion.h +// Declaration of the Decal version resource + +#ifndef __DECALVERSION_H__ +#define __DECALVERSION_H__ + +#define DECAL_MAJOR 2 +#define DECAL_MINOR 6 +#define DECAL_BUGFIX 1 +#define DECAL_RELEASE 1 + +#define DECAL_VERSION_STRING "2, 6, 1, 1" + +#endif diff --git a/Native/Include/EventsImpl.h b/Native/Include/EventsImpl.h new file mode 100644 index 0000000..942c323 --- /dev/null +++ b/Native/Include/EventsImpl.h @@ -0,0 +1,91 @@ +// EventsImpl.h +// Declaration of helper class for implementing plugins + +#ifndef _EVENTSIMPL_H_ +#define _EVENTSIMPL_H_ + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl, const IID *pIID, const GUID *pLIBID > +class IControlEventsImpl +: public IDispEventImpl< nID, cImpl, pIID, pLIBID, 1, 0 > +{ +protected: + void advise( IUnknown *pUnk ) + { + HRESULT hRes = DispEventAdvise( pUnk ); + + _ASSERTE( SUCCEEDED( hRes ) ); + } + + void unadvise( IUnknown *pUnk ) + { + HRESULT hRes = DispEventUnadvise( pUnk ); + + _ASSERTE( SUCCEEDED( hRes ) ); + } +}; + +#define DISPID_DESTROY 1 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class ICommandEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_ICommandEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_HIT 2 +#define DISPID_UNHIT 3 +#define DISPID_ACCEPTED 4 +#define DISPID_CANCELED 5 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IPagerEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IPagerEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_CHANGE 6 +#define DISPID_GETNEXTPOSITION 7 +#define DISPID_UPDATE_POSITION 6 +#define DISPID_GET_NEXT_POSITION 7 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IViewEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IViewEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_ACTIVATE 8 +#define DISPID_DEACTIVATE 9 +#define DISPID_SIZE 13 +#define DISPID_SIZING 14 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IInputEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IInputEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_BEGIN 10 +#define DISPID_END 11 +#define DISPID_PAUSE 12 + +#endif // _EVENTSIMPL_H_ diff --git a/Native/Include/FilterImpl.h b/Native/Include/FilterImpl.h new file mode 100644 index 0000000..39ebd03 --- /dev/null +++ b/Native/Include/FilterImpl.h @@ -0,0 +1,80 @@ +// FilterImpl.h +// Declaration of template classes to help network filters + +#ifndef __FILTERIMPL_H +#define __FILTERIMPL_H + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl, const IID *pIID > +class IFilterEventsImpl +: public IDispEventImpl< nID, cImpl, pIID, &LIBID_DecalFilters, 1, 0 > +{ +public: + HRESULT advise( IUnknown *pUnk ) + { + return DispEventAdvise( pUnk ); + } + + HRESULT unadvise( IUnknown *pUnk ) + { + return DispEventUnadvise( pUnk ); + } +}; + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IWorldEventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_IWorldEvents > +{ +}; + +#define DISPID_CREATE_OBJECT 1 +#define DISPID_RELEASE_OBJECT 2 +#define DISPID_CHANGE_OBJECT 3 +#define DISPID_MOVED_OBJECT 4 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IEchoEventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_IEchoSink > +{ +}; + +#define DISPID_ECHO_MESSAGE 1 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IEcho2EventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_IEchoSink2 > +{ +}; + +#define DISPID_ECHO_SERVER 1 +#define DISPID_ECHO_CLIENT 2 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class ICharacterStatsEventsImpl +: public IFilterEventsImpl< nID, cImpl, &DIID_ICharacterStatsEvents > +{ +}; + +#define DISPID_LOGIN 1 +#define DISPID_SPELLBOOK_ADD 2 +#define DISPID_SPELLBOOK_DELETE 3 + +#endif diff --git a/Native/Include/ForceLib.h b/Native/Include/ForceLib.h new file mode 100644 index 0000000..02b8e81 --- /dev/null +++ b/Native/Include/ForceLib.h @@ -0,0 +1,27 @@ +/* + +-> ForceLib.h + +ForceLibrary.dll prototypes... + +*/ + +#ifndef __ForceLibraryHeader__ +#define __ForceLibraryHeader__ + +#ifdef __cplusplus +extern "C" { +#endif + +DWORD __stdcall ForceLibrary(CHAR* szLibraryPath,PROCESS_INFORMATION* pProcInfo); +DWORD __stdcall ForceLibraryNow(DWORD dwPID, char* szDllPath); +BOOL __stdcall RemoteExec(DWORD dwPID, void* pCode, DWORD dwCodeSize, DWORD *dwCodeResult, DWORD dwMilliseconds); +BOOL __stdcall TrapEntry(DWORD dwEntryPoint,PROCESS_INFORMATION *pPI); +BOOL __stdcall ForceLibraryDBG(CHAR* szTargetLib,DWORD dwEntryPoint,PROCESS_INFORMATION *pPI); +DWORD __stdcall PerformCleanup(DWORD dwEntryPoint,PROCESS_INFORMATION *pPI); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/Native/Include/ForceLibrary.lib b/Native/Include/ForceLibrary.lib new file mode 100644 index 0000000000000000000000000000000000000000..df3a42bb597b07d0814a47255523d52c28b357fa GIT binary patch literal 3102 zcmc&$%TC)s6unM(#X%~f-L?cuCAxvci3wB{GOxCX5Kssbi%KRWrbJ3`$%AHbg8YtJNO#vxcxb)>Op&K%E~xsMr-zAQQA{W*0i;V-i@ zx~?Tt*;zlFNV0x=q#vz1>pm*$J};G4vl z!D*`XhAE-q9C`agFp&)uol;}@py?d7Sw2XdYiZ%NkN~Y}9c7VliN7VX|5&HA~|f z#~)$iEAqZEF745Pq!~O<^t-0+bulSMz$n}G1}^ksqzA69xGMJ`tt51g09qWqjS&8f9<0#p0CTKIuL!)w=fAoa!sdgPNeTH7aq|H$ zG+d=yl%RO2cw?=n5HD#CQoMZO9rmVpxz9Mbjb9(5cE>9=^y#5x<xDceUzmEIEdHT~79pXR)4cpX}gfW=^5=c+}n5pmg6# znH}1Hx^S0>ij=VmTvKG%8dcCA4{**{+e*wf)Vc`G( literal 0 HcmV?d00001 diff --git a/Native/Include/Helpers.h b/Native/Include/Helpers.h new file mode 100644 index 0000000..44d3b79 --- /dev/null +++ b/Native/Include/Helpers.h @@ -0,0 +1,67 @@ +#pragma once + +class RegKey: + public CRegKey +{ +#if _MSC_VER == 1200 +public: + inline LONG SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) + { + return SetValue(dwValue, pszValueName); + } + inline LONG SetStringValue(LPCTSTR pszValueName, LPCTSTR pszValue, DWORD dwType = REG_SZ) + { + return SetValue(pszValue, pszValueName); + } + + inline LONG QueryDWORDValue(LPCTSTR pszValueName, DWORD& dwValue) + { + return QueryValue(dwValue, pszValueName); + } + + inline LONG QueryStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) + { + return QueryValue(pszValue, pszValueName, pnChars); + } + +#endif +}; + +/* +inline LONG RegKey::QueryValue(DWORD& dwValue, LPCTSTR lpszValueName) +{ + DWORD dwType = NULL; + DWORD dwCount = sizeof(DWORD); + LONG lRes = RegQueryValueEx(m_hKey, (LPTSTR)lpszValueName, NULL, &dwType, + (LPBYTE)&dwValue, &dwCount); + ATLASSERT((lRes!=ERROR_SUCCESS) || (dwType == REG_DWORD)); + ATLASSERT((lRes!=ERROR_SUCCESS) || (dwCount == sizeof(DWORD))); + return lRes; +} + +inline LONG RegKey::QueryValue(LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount) +{ + ATLASSERT(pdwCount != NULL); + DWORD dwType = NULL; + LONG lRes = RegQueryValueEx(m_hKey, (LPTSTR)lpszValueName, NULL, &dwType, + (LPBYTE)szValue, pdwCount); + ATLASSERT((lRes!=ERROR_SUCCESS) || (dwType == REG_SZ) || + (dwType == REG_MULTI_SZ) || (dwType == REG_EXPAND_SZ)); + return lRes; +} + +inline LONG RegKey::SetValue(DWORD dwValue, LPCTSTR lpszValueName) +{ + ATLASSERT(m_hKey != NULL); + return RegSetValueEx(m_hKey, lpszValueName, NULL, REG_DWORD, + (BYTE * const)&dwValue, sizeof(DWORD)); +} + +inline LONG RegKey::SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName) +{ + ATLASSERT(lpszValue != NULL); + ATLASSERT(m_hKey != NULL); + return RegSetValueEx(m_hKey, lpszValueName, NULL, REG_SZ, + (BYTE * const)lpszValue, (lstrlen(lpszValue)+1)*sizeof(TCHAR)); +} +*/ \ No newline at end of file diff --git a/Native/Include/Inject.tlb b/Native/Include/Inject.tlb new file mode 100644 index 0000000000000000000000000000000000000000..88920ee9472de9cb8322d79fce1c23286d1d6b03 GIT binary patch literal 50336 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 G=l=!ynH{_U literal 0 HcmV?d00001 diff --git a/Native/Include/VSBridge.h b/Native/Include/VSBridge.h new file mode 100644 index 0000000..31e8091 --- /dev/null +++ b/Native/Include/VSBridge.h @@ -0,0 +1,43 @@ +#ifndef __VSBRIDGE_H_ +#define __VSBRIDGE_H_ + +namespace VSBridge +{ + +template + class auto_ptr { +public: + typedef _Ty element_type; + explicit auto_ptr(_Ty *_P = 0) _THROW0() + : _Owns(_P != 0), _Ptr(_P) {} + auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0() + : _Owns(_Y._Owns), _Ptr(_Y.release()) {} + auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0() + {if (this != &_Y) + {if (_Ptr != _Y.get()) + {if (_Owns) + delete _Ptr; + _Owns = _Y._Owns; } + else if (_Y._Owns) + _Owns = true; + _Ptr = _Y.release(); } + return (*this); } + ~auto_ptr() + {if (_Owns) + delete _Ptr; } + _Ty& operator*() const _THROW0() + {return (*get()); } + _Ty *operator->() const _THROW0() + {return (get()); } + _Ty *get() const _THROW0() + {return (_Ptr); } + _Ty *release() const _THROW0() + {((auto_ptr<_Ty> *)this)->_Owns = false; + return (_Ptr); } +private: + bool _Owns; + _Ty *_Ptr; + }; +} + +#endif \ No newline at end of file diff --git a/Native/Inject/Attic/Copy of DirectDrawHook.cpp b/Native/Inject/Attic/Copy of DirectDrawHook.cpp new file mode 100644 index 0000000..06930a7 --- /dev/null +++ b/Native/Inject/Attic/Copy of DirectDrawHook.cpp @@ -0,0 +1,282 @@ +// DirectDrawHook.cpp : Implementation of CDirectDrawHook +#include "stdafx.h" +#include "Inject.h" +#include "DirectDrawHook.h" + +#include "MaterialHook.h" +#include "DirectDrawSurfaceHook.h" + +#include "Manager.h" +//#include +///////////////////////////////////////////////////////////////////////////// +// CDirectDrawHook + +void CDirectDrawHook::setObject( IDirectDraw *pDD ) +{ + m_pDD = pDD; + m_pDD->QueryInterface( IID_IDirectDraw2, reinterpret_cast< void ** >( &m_pDD2 ) ); + m_pDD->QueryInterface( IID_IDirectDraw4, reinterpret_cast< void ** >( &m_pDD4 ) ); + + m_pDD->QueryInterface( IID_IDirect3D, reinterpret_cast< void ** >( &m_pD3D ) ); + m_pDD->QueryInterface( IID_IDirect3D2, reinterpret_cast< void ** >( &m_pD3D2 ) ); + m_pDD->QueryInterface( IID_IDirect3D3, reinterpret_cast< void ** >( &m_pD3D3 ) ); + + cManager::_p->setDirectDraw( m_pDD4, m_pD3D3, NULL); +} + +STDMETHODIMP CDirectDrawHook::SetCooperativeLevel(HWND p1, DWORD p2) +{ + cManager::_p->setWindow( p1 ); + return m_pDD->SetCooperativeLevel( p1, p2 ); +} + +STDMETHODIMP CDirectDrawHook::SetDisplayMode(DWORD p1, DWORD p2, DWORD p3) +{ + return m_pDD->SetDisplayMode( p1, p2, p3 ); +} + +HRESULT (__stdcall *pfnOldUnlock)(IDirectDrawSurface4 *pDDS, LPRECT rc); + +HRESULT __stdcall myUnlock ( IDirectDrawSurface4 *pDDS, LPRECT rc) +{ + HRESULT hRes = pfnOldUnlock(pDDS, rc); + if(rc==NULL) + cManager::_p->draw2D(); + //MessageBox(0, _bstr_t(" left: ") + _bstr_t((long)rc->left) + _bstr_t(" top: ") + _bstr_t((long)rc->top) + _bstr_t(" right: ") + _bstr_t((long)rc->right) + _bstr_t(" bottom: ") + _bstr_t((long)rc->bottom), "Asd", 0); + + return hRes; +} + + +STDMETHODIMP CDirectDrawHook::CreateSurface(LPDDSURFACEDESC2 p1, LPDIRECTDRAWSURFACE4 FAR *ppDDS, IUnknown FAR *p3) +{ + static bool bGotPrimary=false; +static sc=0; + + //static std::ofstream ass("c:\\acl.txt", std::ios::binary); + + //ass << "Flags: " << p1->dwFlags << " dwCaps: " << p1->ddsCaps.dwCaps << " Width: " << p1->dwWidth << " Height: " << p1->dwHeight << "\r\n"; + + if((cManager::_p->getSoftwareMode()))// && (!bGotPrimary)) + { + /*CComPtr< IDirectDrawSurface4 > pDDS; + + HRESULT hRes = m_pDD4->CreateSurface( p1, &pDDS, p3 ); + if( FAILED( hRes ) ) + return hRes; + + if(!(p1->ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE)))// | DDSCAPS_COMPLEX))) + { + pDDS->QueryInterface(IID_IDirectDrawSurface4, reinterpret_cast< void ** >(ppDDS)); + return hRes; + } + + m_nSurfaceCount++; + + if(m_nSurfaceCount==1)//!=4) + cManager::_p->setDirectDraw(m_pDD4, NULL, pDDS); + + CComObject< CDirectDrawSurfaceHook > *pHook; + CComObject< CDirectDrawSurfaceHook >::CreateInstance( &pHook ); + pHook->setObject( pDDS ); + pHook->setSurfaceNum( m_nSurfaceCount ); + + pHook->QueryInterface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( ppDDS ) ); +*/ + + CComPtr< IDirectDrawSurface4 > pDDS; + + HRESULT hRes = m_pDD4->CreateSurface( p1, &pDDS, p3 ); + if( FAILED( hRes ) ) + return hRes; + + // Get the configured width from the registry + /* DWORD dwConfiguredWidth; + + { + RECT rc; + ::GetClientRect( cManager::_p->m_hMain, &rc ); + dwConfiguredWidth = rc.right - rc.left; + }*/ + + /*if( p1->dwWidth < ( dwConfiguredWidth - 330 ) ) + { + + } + else*/ + + + if(p1->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)// && (p1->dwHeight==362) && (p1->dwWidth==300))//(p1->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) + { + //MessageBox(0, _bstr_t("Width: ") + _bstr_t((long)p1->dwWidth) + _bstr_t(" Height: ") + _bstr_t((long)p1->dwHeight), "asd", 0); + sc++; + if((!bGotPrimary) && (sc==2)) + { + sc=0; + HRESULT (__stdcall *&pfnUnlock)(IDirectDrawSurface4 *pDDS, LPRECT rc) = reinterpret_cast< HRESULT (__stdcall**)(IDirectDrawSurface4 *pDDS, LPRECT rc) > ( *reinterpret_cast< DWORD * > ( pDDS.p ) )[ 32 ]; + + pfnOldUnlock = *pfnUnlock; + + pfnUnlock = myUnlock; + + + //if((p1->dwHeight>=362) && (p1->dwWidth>=300)) + //{ + // cManager::_p->SurfaceList.push_back(pDDS); + //MessageBox(0, _bstr_t(CSC), "asd", 0); + //557 or 333 + //} + + //if(CSC==1) + //{ + + /* CComObject< CDirectDrawSurfaceHook > *pHook; + CComObject< CDirectDrawSurfaceHook >::CreateInstance( &pHook ); + pHook->setObject( pDDS );*/ + + bGotPrimary=true; + //if(!bGotPrimary) + //{ + cManager::_p->setDirectDraw(m_pDD4, NULL, pDDS); + cManager::_p->setSurface(NULL); + //} + } + + } + //pHook->QueryInterface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( ppDDS ) ); + // return hRes; + //} + + /* pHook->QueryInterface(IID_IDirectDrawSurface4, reinterpret_cast< void ** >(ppDDS)); + } + else*/ + pDDS->QueryInterface(IID_IDirectDrawSurface4, reinterpret_cast< void ** >(ppDDS)); + m_pPrimary = pDDS.p; + + return hRes; + } + else + return m_pDD4->CreateSurface(p1, ppDDS, p3); +} + +STDMETHODIMP CDirectDrawHook::SetDisplayMode(DWORD p1, DWORD p2, DWORD p3, DWORD p4, DWORD p5) +{ + return m_pDD2->SetDisplayMode( p1, p2, p3, p4, p5 ); +} + +STDMETHODIMP CDirectDrawHook::CreateMaterial(LPDIRECT3DMATERIAL *p1,IUnknown *p2) +{ + CComPtr< IDirect3DMaterial > pMat; + HRESULT hRes = m_pD3D->CreateMaterial( &pMat, p2 ); + + if( FAILED( hRes ) ) + return hRes; + + CComObject< CMaterialHook > *pHook; + CComObject< CMaterialHook >::CreateInstance( &pHook ); + pHook->setObject( pMat, m_pDevice2, m_pDevice3 ); + pHook->QueryInterface( IID_IDirect3DMaterial, reinterpret_cast< void ** >( p1 ) ); + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateMaterial(LPDIRECT3DMATERIAL2*p1,IUnknown*p2) +{ + CComPtr< IDirect3DMaterial2 > pMat; + HRESULT hRes = m_pD3D2->CreateMaterial( &pMat, p2 ); + + if( FAILED( hRes ) ) + return hRes; + + CComObject< CMaterialHook > *pHook; + CComObject< CMaterialHook >::CreateInstance( &pHook ); + pHook->setObject( pMat, m_pDevice2, m_pDevice3 ); + pHook->QueryInterface( IID_IDirect3DMaterial2, reinterpret_cast< void ** >( p1 ) ); + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateMaterial(LPDIRECT3DMATERIAL3*p1,LPUNKNOWN p2) +{ + CComPtr< IDirect3DMaterial3 > pMat; + HRESULT hRes = m_pD3D3->CreateMaterial( &pMat, p2 ); + + if( FAILED( hRes ) ) + return hRes; + + CComObject< CMaterialHook > *pHook; + CComObject< CMaterialHook >::CreateInstance( &pHook ); + pHook->setObject( pMat, m_pDevice2, m_pDevice3 ); + pHook->QueryInterface( IID_IDirect3DMaterial3, reinterpret_cast< void ** >( p1 ) ); + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateDevice( REFCLSID cls,LPDIRECTDRAWSURFACE pDDS,LPDIRECT3DDEVICE2 *ppD3D ) +{ + CComPtr< IDirect3DDevice2 > pD3D; + + HRESULT hRes = m_pD3D2->CreateDevice( cls, pDDS, &pD3D ); + + if( FAILED( hRes ) ) + { + ::MessageBox (NULL, "2COULDN'T CreateDevice IN D3D HOOK", "ERROR", MB_OK); + + return hRes; + } + + CComObject< CDirect3DHook > *pHook; + CComObject< CDirect3DHook >::CreateInstance( &pHook ); + pHook->setObject( pD3D ); + + pHook->QueryInterface( IID_IDirect3DDevice2, reinterpret_cast< void ** >( ppD3D ) ); + + m_pDevice2 = *ppD3D; + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateDevice(REFCLSID cls,LPDIRECTDRAWSURFACE4 pDDS,LPDIRECT3DDEVICE3* ppD3D,LPUNKNOWN pUnk) +{ + CComPtr< IDirect3DDevice3 > pD3D; + + HRESULT hRes = m_pD3D3->CreateDevice( cls, pDDS, &pD3D, pUnk ); + + if( FAILED( hRes ) ) + { + ::MessageBox (NULL, "3COULDN'T CreateDevice IN D3D HOOK", "ERROR", MB_OK); + return hRes; + } + + // Ok, figure out if this is the "primary" 3d device + DDSURFACEDESC2 ddsd; + ddsd.dwSize = sizeof( DDSURFACEDESC2 ); + pDDS->GetSurfaceDesc( &ddsd ); + + // Get the configured width from the registry + DWORD dwConfiguredWidth; + + { + RECT rc; + ::GetClientRect( cManager::_p->m_hMain, &rc ); + dwConfiguredWidth = rc.right - rc.left; + } + + if( ddsd.dwWidth < ( dwConfiguredWidth - 330 ) ) + { + // This is a secondary 3ddevice - do not hook it + return pD3D->QueryInterface( IID_IDirect3DDevice3, reinterpret_cast< void ** >( ppD3D ) ); + } + // Ok, we're past the wrong device, get to the right device + cManager::_p->setSurface( pD3D ); + + CComObject< CDirect3DHook > *pHook; + CComObject< CDirect3DHook >::CreateInstance( &pHook ); + pHook->setObject( pD3D ); + + pHook->QueryInterface( IID_IDirect3DDevice3, reinterpret_cast< void ** >( ppD3D ) ); + + m_pDevice3 = *ppD3D; + + return hRes; +} diff --git a/Native/Inject/Attic/Copy of DirectDrawHook.h b/Native/Inject/Attic/Copy of DirectDrawHook.h new file mode 100644 index 0000000..ced1854 --- /dev/null +++ b/Native/Inject/Attic/Copy of DirectDrawHook.h @@ -0,0 +1,277 @@ +// DirectDrawHook.h : Declaration of the CDirectDrawHook + +#ifndef __DIRECTDRAWHOOK_H_ +#define __DIRECTDRAWHOOK_H_ + +#include "resource.h" // main symbols + +#include "Direct3DHook.h" + +///////////////////////////////////////////////////////////////////////////// +// CDirectDrawHook +class ATL_NO_VTABLE CDirectDrawHook : + public CComObjectRootEx, + public IDirectDraw, + public IDirectDraw2, + public IDirectDraw4, + public IDirect3D, + public IDirect3D2, + public IDirect3D3 +{ +public: + CDirectDrawHook() + : m_pDevice2( NULL ), + m_pDevice3( NULL ), m_nSurfaceCount( 0 ) + { + } + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CDirectDrawHook) + COM_INTERFACE_ENTRY_IID(IID_IDirectDraw, IDirectDraw) + COM_INTERFACE_ENTRY_IID(IID_IDirectDraw2, IDirectDraw2) + COM_INTERFACE_ENTRY_IID(IID_IDirectDraw4, IDirectDraw4) + COM_INTERFACE_ENTRY_IID(IID_IDirect3D, IDirect3D) + COM_INTERFACE_ENTRY_IID(IID_IDirect3D2, IDirect3D2) + COM_INTERFACE_ENTRY_IID(IID_IDirect3D3, IDirect3D3) +END_COM_MAP() + + void setObject( IDirectDraw *pDD ); + + CComPtr< IDirectDraw > m_pDD; + CComPtr< IDirectDraw2 > m_pDD2; + CComPtr< IDirectDraw4 > m_pDD4; + + CComPtr< IDirect3D > m_pD3D; + CComPtr< IDirect3D2 > m_pD3D2; + CComPtr< IDirect3D3 > m_pD3D3; + + IDirect3DDevice2 *m_pDevice2; + IDirect3DDevice3 *m_pDevice3; + IDirectDrawSurface4 *m_pPrimary; + + long m_nSurfaceCount; + +public: + + // IDirectDraw Methods + STDMETHOD(Compact)() + { + return m_pDD->Compact(); + } + + STDMETHOD(CreateClipper)(DWORD p1, LPDIRECTDRAWCLIPPER FAR *p2, IUnknown FAR *p3 ) + { + return m_pDD->CreateClipper( p1, p2, p3 ); + } + + STDMETHOD(CreatePalette)(DWORD p1, LPPALETTEENTRY p2, LPDIRECTDRAWPALETTE FAR*p3, IUnknown FAR *p4 ) + { + return m_pDD->CreatePalette( p1, p2, p3, p4 ); + } + + STDMETHOD(CreateSurface)(LPDDSURFACEDESC p1, LPDIRECTDRAWSURFACE FAR *p2, IUnknown FAR *p3 ) + { + return m_pDD->CreateSurface( p1, p2, p3 ); + } + + STDMETHOD(DuplicateSurface)( LPDIRECTDRAWSURFACE p1, LPDIRECTDRAWSURFACE FAR *p2 ) + { + return m_pDD->DuplicateSurface( p1, p2 ); + } + + STDMETHOD(EnumDisplayModes)( DWORD p1, LPDDSURFACEDESC p2, LPVOID p3, LPDDENUMMODESCALLBACK p4 ) + { + return m_pDD->EnumDisplayModes( p1, p2, p3, p4 ); + } + + STDMETHOD(EnumSurfaces)(DWORD p1, LPDDSURFACEDESC p2, LPVOID p3, LPDDENUMSURFACESCALLBACK p4 ) + { + return m_pDD->EnumSurfaces( p1, p2, p3, p4 ); + } + + STDMETHOD(FlipToGDISurface)() + { + return m_pDD4->FlipToGDISurface(); + } + + STDMETHOD(GetCaps)( LPDDCAPS p1, LPDDCAPS p2 ) + { + return m_pDD4->GetCaps( p1, p2 ); + } + + STDMETHOD(GetDisplayMode)( LPDDSURFACEDESC p1 ) + { + return m_pDD->GetDisplayMode( p1 ); + } + + STDMETHOD(GetFourCCCodes)(LPDWORD p1, LPDWORD p2 ) + { + return m_pDD->GetFourCCCodes( p1, p2 ); + } + + STDMETHOD(GetGDISurface)(LPDIRECTDRAWSURFACE FAR *p1) + { + return m_pDD->GetGDISurface( p1 ); + } + + STDMETHOD(GetMonitorFrequency)(LPDWORD p1) + { + return m_pDD->GetMonitorFrequency( p1 ); + } + + STDMETHOD(GetScanLine)(LPDWORD p1) + { + return m_pDD->GetScanLine( p1 ); + } + + STDMETHOD(GetVerticalBlankStatus)(LPBOOL p1 ) + { + return m_pDD->GetVerticalBlankStatus( p1 ); + } + + STDMETHOD(Initialize)(GUID FAR *p1) + { + return m_pDD->Initialize( p1 ); + } + + STDMETHOD(RestoreDisplayMode)() + { + return m_pDD->RestoreDisplayMode(); + } + + STDMETHOD(SetCooperativeLevel)(HWND p1, DWORD p2); + + STDMETHOD(SetDisplayMode)(DWORD p1, DWORD p2, DWORD p3); + + STDMETHOD(WaitForVerticalBlank)(DWORD p1, HANDLE p2 ) + { + return m_pDD->WaitForVerticalBlank( p1, p2 ); + } + + /*** Added in the v2 interface ***/ + STDMETHOD(GetAvailableVidMem)(LPDDSCAPS p1, LPDWORD p2, LPDWORD p3) + { + return m_pDD2->GetAvailableVidMem( p1, p2, p3 ); + } + + /*** Added in the V4 Interface ***/ + STDMETHOD(GetAvailableVidMem)(LPDDSCAPS2 p1, LPDWORD p2, LPDWORD p3) + { + return m_pDD4->GetAvailableVidMem( p1, p2, p3 ); + } + + STDMETHOD(CreateSurface)(LPDDSURFACEDESC2 p1, LPDIRECTDRAWSURFACE4 FAR *p2, IUnknown FAR *p3); + + STDMETHOD(DuplicateSurface)( LPDIRECTDRAWSURFACE4 p1, LPDIRECTDRAWSURFACE4 FAR *p2 ) + { + return m_pDD4->DuplicateSurface( p1, p2 ); + } + + STDMETHOD(EnumDisplayModes)( DWORD p1, LPDDSURFACEDESC2 p2, LPVOID p3, LPDDENUMMODESCALLBACK2 p4 ) + { + return m_pDD4->EnumDisplayModes( p1, p2, p3, p4 ); + } + + STDMETHOD(EnumSurfaces)(DWORD p1, LPDDSURFACEDESC2 p2, LPVOID p3, LPDDENUMSURFACESCALLBACK2 p4 ) + { + return m_pDD4->EnumSurfaces( p1, p2, p3, p4 ); + } + + STDMETHOD(GetDisplayMode)( LPDDSURFACEDESC2 p1 ) + { + return m_pDD4->GetDisplayMode( p1 ); + } + + STDMETHOD(GetGDISurface)(LPDIRECTDRAWSURFACE4 FAR *p1) + { + return m_pDD4->GetGDISurface( p1 ); + } + + STDMETHOD(GetSurfaceFromDC) (HDC p1, LPDIRECTDRAWSURFACE4 *p2) + { + return m_pDD4->GetSurfaceFromDC( p1, p2 ); + } + + STDMETHOD(RestoreAllSurfaces)() + { + return m_pDD4->RestoreAllSurfaces(); + } + + STDMETHOD(TestCooperativeLevel)() + { + return m_pDD4->TestCooperativeLevel(); + } + + STDMETHOD(GetDeviceIdentifier)(LPDDDEVICEIDENTIFIER p1, DWORD p2 ) + { + return m_pDD4->GetDeviceIdentifier( p1, p2 ); + } + + // Methods for the IDirect3D Interface + STDMETHOD(Initialize)(REFCLSID p1) + { + return m_pD3D->Initialize( p1 ); + } + + STDMETHOD(EnumDevices)(LPD3DENUMDEVICESCALLBACK p1,LPVOID p2) + { + return m_pD3D->EnumDevices( p1, p2 ); + } + + STDMETHOD(CreateLight)(LPDIRECT3DLIGHT*p1,IUnknown*p2) + { + return m_pD3D->CreateLight( p1, p2 ); + } + + STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL *p1,IUnknown *p2); + + STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT*p1,IUnknown*p2) + { + return m_pD3D->CreateViewport( p1, p2 ); + } + + STDMETHOD(FindDevice)(LPD3DFINDDEVICESEARCH p1,LPD3DFINDDEVICERESULT p2) + { + return m_pD3D->FindDevice( p1, p2 ); + } + + // Methods for the IDirect3D2 Interface + STDMETHOD(SetDisplayMode)(DWORD p1, DWORD p2, DWORD p3, DWORD p4, DWORD p5); + + STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL2*p1,IUnknown*p2); + + STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT2*p1,IUnknown*p2) + { + return m_pD3D2->CreateViewport( p1, p2 ); + } + + STDMETHOD(CreateDevice)(REFCLSID cls,LPDIRECTDRAWSURFACE pDDS,LPDIRECT3DDEVICE2 *ppD3D); + + // Methods for the IDirect3D3 Interface + STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL3*p1,LPUNKNOWN p2); + + STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT3*p1,LPUNKNOWN p2) + { + return m_pD3D3->CreateViewport( p1, p2 ); + } + + STDMETHOD(CreateDevice)(REFCLSID cls,LPDIRECTDRAWSURFACE4 pDDS,LPDIRECT3DDEVICE3* ppD3D,LPUNKNOWN pUnk); + + STDMETHOD(CreateVertexBuffer)(LPD3DVERTEXBUFFERDESC p1,LPDIRECT3DVERTEXBUFFER*p2,DWORD p3,LPUNKNOWN p4) + { + return m_pD3D3->CreateVertexBuffer( p1, p2, p3, p4 ); + } + + STDMETHOD(EnumZBufferFormats)(REFCLSID p1,LPD3DENUMPIXELFORMATSCALLBACK p2,LPVOID p3) + { + return m_pD3D3->EnumZBufferFormats( p1, p2, p3 ); + } + + STDMETHOD(EvictManagedTextures)() + { + return m_pD3D3->EvictManagedTextures(); + } +}; + +#endif //__DIRECTDRAWHOOK_H_ diff --git a/Native/Inject/Attic/Copy of Panel.cpp b/Native/Inject/Attic/Copy of Panel.cpp new file mode 100644 index 0000000..c39d74b --- /dev/null +++ b/Native/Inject/Attic/Copy of Panel.cpp @@ -0,0 +1,313 @@ +// Panel.cpp : Implementation of cPanel +#include "stdafx.h" +#include "Inject.h" +#include "Panel.h" + +///////////////////////////////////////////////////////////////////////////// +// cPanel + +enum ePanelChildren +{ + eViewFirst = 1000 +}; + +cPanel::cPanel() +: m_nIcon( 0 ), +m_nIconModule( 0 ), +m_nActiveView( -1 ), +m_bDragging( false ) +{ +} + +void cPanel::hideView() +{ + m_pSite->Invalidate(); + + if( m_nActiveView == -1 ) + // No active view currently + return; + + CComPtr< ILayerSite > pActive; + m_pSite->get_Child( m_nActiveView, ePositionByID, &pActive ); + + static RECT rcHide = { 0, 0, 0, 0 }; + pActive->put_Position( &rcHide ); + + if( m_pSink.p != NULL ) + m_pSink->PanelDeactivate( m_nActiveView ); + + m_nActiveView = -1; +} + +void cPanel::onCreate() +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->LoadBitmapPortal( 0x0600126F, &m_pBackground ); + pPlugin->LoadBitmapPortal( 0x06001277, &m_pBorder ); + pPlugin->CreateFont( _bstr_t( _T( "Times New Roman" ) ), 15, eFontBold, &m_pTitle ); + + CComPtr< IButton > pRollup; + + HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_IButton, + reinterpret_cast< void ** >( &pRollup ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + CComPtr< ILayer > pBtnLayer; + pRollup->QueryInterface( &pBtnLayer ); + + LayerParams lp = { 1, { 180 - 16, 0, 180, 16 }, eRenderClipped }; + m_pSite->CreateChild( &lp, pBtnLayer ); + + pRollup->put_Matte( RGB( 0, 0, 0 ) ); + pRollup->SetImages( 0, 0x0600113C, 0x0600113B ); + ICommandEventsImpl< BUTTON_CLOSE, cPanel >::advise( pRollup ); + + m_pSite->put_Transparent( VARIANT_FALSE ); +} + +void cPanel::onDestroy() +{ + m_pBorder.Release(); + m_pBackground.Release(); + m_pTitle.Release(); +} + +STDMETHODIMP cPanel::Render( ICanvas *pCanvas ) +{ + RECT rc; + m_pSite->get_Position( &rc ); + + SIZE szBorder; + m_pBorder->get_Size( &szBorder ); + + // Draw the background + RECT rc_pat = { 0, 0, rc.right - rc.left, rc.bottom - rc.top }; + static POINT pt_pat = { 0, 0 }; + + m_pBackground->PatBlt( pCanvas, &rc_pat, &pt_pat ); + + // Draw the borders + RECT rc_border_top = { 0, 0, rc.right - rc.left, szBorder.cy }, + rc_border_bottom = { 0, rc.bottom - rc.top - szBorder.cy, + rc.right - rc.left, rc.bottom - rc.top }; + + pCanvas->Fill( &rc_border_top, RGB( 0, 0, 0 ) ); + m_pBorder->PatBlt( pCanvas, &rc_border_top, &pt_pat ); + pCanvas->Fill( &rc_border_bottom, RGB( 0, 0, 0 ) ); + m_pBorder->PatBlt( pCanvas, &rc_border_bottom, &pt_pat ); + + // Draw the title text + if( m_strTitle.length() > 0 ) + { + POINT ptText = { 24, szBorder.cy + 5 }; + m_pTitle->DrawText( &ptText, m_strTitle, 0, pCanvas ); + } + + if( m_nIcon != 0 ) + { + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + CComPtr< IIconCache > pIconCache; + static SIZE szIcon = { 16, 16 }; + pPlugin->GetIconCache( &szIcon, &pIconCache ); + + static POINT pt = { 4, szBorder.cy + 4 }; + pIconCache->DrawIcon( &pt, m_nIcon, m_nIconModule, pCanvas ); + } + + _ASSERTE( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cPanel::Reformat() +{ + // Reset the size + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + SIZE szScreen; + pPlugin->GetScreenSize( &szScreen ); + + RECT rc = { m_nLeft, m_nTop, m_nWidth+m_nLeft, m_nHeight+m_nTop }; + + m_pSite->put_Position( &rc ); + + RECT rcCloseBtn = { m_nWidth - 16, 0, m_nWidth, 16 }; + CComPtr< ILayerSite > pCloseBtnLS; + m_pSite->get_Child(1, ePositionByID, &pCloseBtnLS); + + pCloseBtnLS->put_Position(&rcCloseBtn); + + if( m_nActiveView != -1 ) + { + // Position the active view + SIZE szBorder; + m_pBorder->get_Size( &szBorder ); + + CComPtr< ILayerSite > pActive; + m_pSite->get_Child( m_nActiveView, ePositionByID, &pActive ); + + RECT rcChild = { 0, 24 + szBorder.cy, m_nWidth, m_nHeight - szBorder.cy }; + pActive->put_Position( &rcChild ); + } + + return S_OK; +} + +STDMETHODIMP cPanel::AddView(long nViewID, ILayer *pLayer) +{ + _ASSERTE( pLayer != NULL ); + + LayerParams p = { nViewID, { 0, 0, 0, 0 }, eRenderClipped }; + + // Set up the layer - note that it is not visible + return m_pSite->CreateChild( &p, pLayer ); +} + +STDMETHODIMP cPanel::ActivateView(long nViewID, ViewParams *pParams) +{ + // Hide the current view by resizing to 0,0 + hideView(); + + m_strTitle = pParams->label; + m_nIcon = pParams->icon; + m_nIconModule = pParams->iconLibrary; + m_nWidth = pParams->width; + m_nTop = pParams->top; + m_nHeight = pParams->height; + m_nLeft = pParams->left; + +#ifdef _DEBUG + // Make sure the child exists + CComPtr< ILayerSite > pChildSite; + _ASSERTE( SUCCEEDED( m_pSite->get_Child( nViewID, ePositionByID, &pChildSite ) ) ); +#endif + + // Locate the child + m_nActiveView = nViewID; + + // Trick it into reformatting next frame + static RECT rcBig = { 0, 0, 1, 1 }; + m_pSite->put_Position( &rcBig ); + + return S_OK; +} + +STDMETHODIMP cPanel::RemoveView(long nViewID) +{ + if( nViewID == m_nActiveView ) + // If this is the current view, run and hide + Deactivate(); + + CComPtr< ILayerSite > pChildSite; + HRESULT hRes = m_pSite->get_Child( nViewID, ePositionByID, &pChildSite ); + _ASSERTE( SUCCEEDED( hRes ) ); + + pChildSite->Destroy(); + + return S_OK; +} + +void cPanel::onCloseAccepted(long nID) +{ + // We should only be getting commands from the button + _ASSERTE( nID == 1 ); + + Deactivate(); +} + +STDMETHODIMP cPanel::get_ActiveView(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nActiveView; + + return S_OK; +} + +STDMETHODIMP cPanel::LoadView(long nViewID, IView *pView, IUnknown *pSchema) +{ + _ASSERTE( pView != NULL ); + _ASSERTE( pSchema != NULL ); + + long nAssigned; + + // Set up the layer - note that it is not visible + return pView->LoadControl( m_pSite, nViewID, pSchema, &nAssigned ); +} + +STDMETHODIMP cPanel::Deactivate() +{ + if( m_nActiveView == -1 ) + // No active view currently + return S_OK; + + // Hide the current view by resizing to 0,0 + hideView(); + + // Hide the entire panel + static RECT rcHide = { 0, 0, 0, 0 }; + m_pSite->put_Position( &rcHide ); + + m_nActiveView = -1; + + return S_OK; +} + +STDMETHODIMP cPanel::putref_Sink(IPanelSink *newVal) +{ + m_pSink = newVal; + + return S_OK; +} + +STDMETHODIMP cPanel::MouseEnter(MouseState *) +{ + return S_OK; +} + +STDMETHODIMP cPanel::MouseExit(MouseState *) +{ + return S_OK; +} + +STDMETHODIMP cPanel::MouseDown(MouseState *pMS) +{ + if((pMS->screen.x>=m_nLeft) && (pMS->screen.x<=m_nLeft+m_nWidth-16) && (pMS->screen.y-28>=m_nTop) && (pMS->screen.y-28<=m_nTop+28)) + { + m_DeltaX = pMS->screen.x-m_nLeft; + m_DeltaY = pMS->screen.y-m_nTop-28; + m_bDragging = true; + } + + return S_OK; +} + +STDMETHODIMP cPanel::MouseUp(MouseState *) +{ + m_bDragging = false; + return S_OK; +} + +STDMETHODIMP cPanel::MouseMove(MouseState *pMS) +{ + if(m_bDragging) + { + m_nLeft = pMS->screen.x-m_DeltaX; + m_nTop = pMS->screen.y-m_DeltaY-28; + + static RECT rcBig = { 0, 0, 1, 1 }; + m_pSite->put_Position( &rcBig ); + } + return S_OK; +} + +STDMETHODIMP cPanel::MouseEvent(long nMsg, long wParam, long lParam) +{ + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/Attic/Copy of Panel.h b/Native/Inject/Attic/Copy of Panel.h new file mode 100644 index 0000000..1c6bdba --- /dev/null +++ b/Native/Inject/Attic/Copy of Panel.h @@ -0,0 +1,88 @@ +// Panel.h : Declaration of the cPanel + +#ifndef __PANEL_H_ +#define __PANEL_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" + +#define BUTTON_CLOSE 1 + +///////////////////////////////////////////////////////////////////////////// +// cPanel +class ATL_NO_VTABLE cPanel : + public CComObjectRootEx, + public ILayerRenderImpl, + public ILayerImpl< cPanel >, + public ILayerMouseImpl, + public ICommandEventsImpl< BUTTON_CLOSE, cPanel >, + public cNoEventsImpl, + public IPanel +{ +public: + cPanel(); + + _bstr_t m_strTitle; + long m_nIcon, m_nIconModule; + + long m_nActiveView; + + CComPtr< IImageCache > m_pBorder; + CComPtr< IImageCache > m_pBackground; + CComPtr< IFontCache > m_pTitle; + CComPtr< IPanelSink > m_pSink; + + long m_nTop; + long m_nLeft; + long m_nHeight; + long m_nWidth; + + long m_DeltaX; + long m_DeltaY; + + bool m_bDragging; + + void hideView(); + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cPanel) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(IPanel) + COM_INTERFACE_ENTRY(ILayerMouse) +END_COM_MAP() + +BEGIN_SINK_MAP( cPanel ) + SINK_ENTRY_EX( BUTTON_CLOSE, DIID_ICommandEvents, DISPID_ACCEPTED, onCloseAccepted ) +END_SINK_MAP() + +// IPanel +public: + STDMETHOD(LoadView)(long nPlugin, IView *pView, IUnknown *pSchema); + STDMETHOD(get_ActiveView)(/*[out, retval]*/ long *pVal); + STDMETHOD(AddView)(long nPluginID, ILayer *pLayer); + STDMETHOD(RemoveView)(long nID); + STDMETHOD(ActivateView)(long nViewID, ViewParams *pParams); + STDMETHOD(Deactivate)(); + STDMETHOD(putref_Sink)(/*[in]*/ IPanelSink* newVal); + + // ILayerRender Methods + STDMETHOD(Render)(ICanvas *); + STDMETHOD(Reformat)(); + + // ICommandEvents Methods + void __stdcall onCloseAccepted(long nID); + + // ILayerMouse Methods + STDMETHOD(MouseEnter)(struct MouseState *); + STDMETHOD(MouseExit)(struct MouseState *); + STDMETHOD(MouseDown)(struct MouseState *pMS); + STDMETHOD(MouseUp)(struct MouseState *); + STDMETHOD(MouseMove)(struct MouseState *pMS); + STDMETHOD(MouseEvent)(long nMsg, long wParam, long lParam); +}; + +#endif //__PANEL_H_ diff --git a/Native/Inject/Attic/Copy of RootLayer.cpp b/Native/Inject/Attic/Copy of RootLayer.cpp new file mode 100644 index 0000000..8794acb --- /dev/null +++ b/Native/Inject/Attic/Copy of RootLayer.cpp @@ -0,0 +1,191 @@ +// RootLayer.cpp : Implementation of cRootLayer +#include "stdafx.h" +#include "Inject.h" +#include "RootLayer.h" + +#include "BarLayer.h" +#include "Panel.h" +#include "View.h" + +enum eChildIDs +{ + eChildBars, + eChildPanel +}; + +///////////////////////////////////////////////////////////////////////////// +// cRootLayer + +void cRootLayer::addView( cView *pView, ILayer *pRoot ) +{ + m_views.push_back( pView ); + + ViewParams vp = { pView->m_nIcon, pView->m_nIconModule, pView->m_strTitle, pView->m_nLeft, pView->m_nTop, pView->m_nWidth, pView->m_nHeight }; + + // Next, make the bar entry + m_pBars->AddBar( pView->m_nViewID, &vp ); + + // Last, make the view entry + m_pPanel->AddView( pView->m_nViewID, pRoot ); +} + +void cRootLayer::removeView( cView *pView ) +{ + for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i ) + { + if( *i == pView ) + { + m_views.erase( i ); + break; + } + } +} + +void cRootLayer::onCreate() +{ + LayerParams lpBars = { eChildBars, { 0, 0, 1, 1 }, 0 }; + + CComObject< cBarLayer > *pBars; + CComObject< cBarLayer >::CreateInstance( &pBars ); + + m_pBars = pBars; + + m_pSite->CreateChild( &lpBars, pBars ); + + LayerParams lpPanel = { eChildPanel, { 0, 0, 0, 0 }, 0 }; + + CComObject< cPanel > *pPanel; + CComObject< cPanel >::CreateInstance( &pPanel ); + + m_pPanel = pPanel; + + m_pSite->CreateChild( &lpPanel, pPanel ); + + m_pPanel->putref_Sink( this ); +} + +void cRootLayer::onDestroy() +{ + m_pBars.Release(); + m_pPanel.Release(); +} + +STDMETHODIMP cRootLayer::CreateView(ViewParams *pParams, ILayer *pLayer, IView **ppView) +{ + // First create the view object + CComObject< cView > *pView; + CComObject< cView >::CreateInstance( &pView ); + + pView->m_pRoot = this; + pView->m_nViewID = m_nNextViewID ++; + pView->m_strTitle = pParams->label; + pView->m_nIcon = pParams->icon; + pView->m_nIconModule = pParams->iconLibrary; + pView->m_nLeft = pParams->left; + pView->m_nTop = pParams->top; + pView->m_nWidth = pParams->width; + pView->m_nHeight = pParams->height; + + addView( pView, pLayer ); + + *ppView = pView; + pView->AddRef(); + + return S_OK; +} + +STDMETHODIMP cRootLayer::SelectBar(long nID) +{ + // We are given the Bar ID, find the matching view + for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i ) + { + if( ( *i )->m_nViewID == nID ) + { + long nPrevActive; + m_pPanel->get_ActiveView( &nPrevActive ); + + if( nPrevActive != nID ) + { + ViewParams p = { ( *i )->m_nIcon, ( *i )->m_nIconModule, ( *i )->m_strTitle, ( *i )->m_nLeft, ( *i )->m_nTop, ( *i )->m_nWidth, ( *i )->m_nHeight }; + m_pPanel->ActivateView( ( *i )->m_nViewID, &p ); + + ( *i )->Fire_Activate(); + } + else + { + ( *i )->Deactivate(); + } + + return S_OK; + } + } + + // Invalid return value + return E_INVALIDARG; +} + +STDMETHODIMP cRootLayer::LoadView(BSTR strXML, IView **ppView) +{ + CComObject< cView > *pView; + CComObject< cView >::CreateInstance( &pView ); + + CComPtr< IUnknown > pRootControl; + + pView->m_pRoot = this; + pView->m_nViewID = m_nNextViewID ++; + pView->loadSchema( strXML, &pRootControl ); + + ViewParams vp = { pView->m_nIcon, pView->m_nIconModule, pView->m_strTitle, pView->m_nLeft, pView->m_nTop, pView->m_nWidth, pView->m_nHeight }; + + m_views.push_back( pView ); + + *ppView = pView; + pView->AddRef(); + + // Next, make the bar entry + m_pBars->AddBar( pView->m_nViewID, &vp ); + + // Last, create all the controls + m_pPanel->LoadView( pView->m_nViewID, pView, pRootControl ); + + return S_OK; +} + +STDMETHODIMP cRootLayer::PanelDeactivate(long nViewID) +{ + // Find the view of our desires and fire it's hide message + for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i ) + { + if( ( *i )->m_nViewID == nViewID ) + ( *i )->Fire_Deactivate(); + } + + return S_OK; +} + +STDMETHODIMP cRootLayer::LoadViewObject(IUnknown *pSchema, IView **ppView) +{ + CComObject< cView > *pView; + CComObject< cView >::CreateInstance( &pView ); + + CComPtr< IUnknown > pRootControl; + + pView->m_pRoot = this; + pView->m_nViewID = m_nNextViewID ++; + pView->loadSchemaObject( pSchema, &pRootControl ); + + ViewParams vp = { pView->m_nIcon, pView->m_nIconModule, pView->m_strTitle, pView->m_nLeft, pView->m_nTop, pView->m_nWidth, pView->m_nHeight }; + + m_views.push_back( pView ); + + *ppView = pView; + pView->AddRef(); + + // Next, make the bar entry + m_pBars->AddBar( pView->m_nViewID, &vp ); + + // Last, create all the controls + m_pPanel->LoadView( pView->m_nViewID, pView, pRootControl ); + + return S_OK; +} diff --git a/Native/Inject/Attic/Copy of RootLayer.h b/Native/Inject/Attic/Copy of RootLayer.h new file mode 100644 index 0000000..1c9445f --- /dev/null +++ b/Native/Inject/Attic/Copy of RootLayer.h @@ -0,0 +1,61 @@ +// RootLayer.h : Declaration of the cRootLayer + +#ifndef __ROOTLAYER_H_ +#define __ROOTLAYER_H_ + +#include "resource.h" // main symbols + +// This special layer implements no sinks, it is merely a container +// layer for the bar manager and the window manager - it server no other purpose +// than to forward event on and avoid redundant looping in the manager object. + +#include "SinkImpl.h" + +class cView; + +///////////////////////////////////////////////////////////////////////////// +// cRootLayer +class ATL_NO_VTABLE cRootLayer : + public CComObjectRootEx, + public ILayerImpl< cRootLayer >, + public IPanelSink, + public cNoEventsImpl, + public IRootLayer +{ +public: + cRootLayer() + : m_nNextViewID( 1000 ) + { + } + + CComPtr< IBarManager > m_pBars; + CComPtr< IPanel > m_pPanel; + + typedef std::list< cView * > cViewList; + cViewList m_views; + long m_nNextViewID; + + void addView( cView *pView, ILayer *pRootLayer ); + void removeView( cView *pView ); + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cRootLayer) + COM_INTERFACE_ENTRY(IPanelSink) + COM_INTERFACE_ENTRY(IRootLayer) + COM_INTERFACE_ENTRY(ILayer) +END_COM_MAP() + +public: + // IRootLayer Methods + STDMETHOD(CreateView)(ViewParams *pParams, ILayer *pLayer, /*[out, retval]*/ IView **ppView); + STDMETHOD(SelectBar)(long nID); + STDMETHOD(LoadView)(BSTR strXML, /*[out, retval]*/ IView **ppView); + STDMETHOD(LoadViewObject)(IUnknown *pSchema, /*[out, retval]*/ IView **ppView); + + // IPanelSink Methods + STDMETHOD(PanelDeactivate)( long nViewID ); +}; + +#endif //__ROOTLAYER_H_ diff --git a/Native/Inject/Attic/Copy of View.cpp b/Native/Inject/Attic/Copy of View.cpp new file mode 100644 index 0000000..7bf6b52 --- /dev/null +++ b/Native/Inject/Attic/Copy of View.cpp @@ -0,0 +1,410 @@ +// View.cpp : Implementation of cView +#include "stdafx.h" +#include "Inject.h" +#include "View.h" + +#include "RootLayer.h" +#include "Manager.h" + +#include "InjectApi.h" + +///////////////////////////////////////////////////////////////////////////// +// cView + +cView::~cView() +{ + m_pRoot->m_pBars->RemoveBar( m_nViewID ); + m_pRoot->m_pPanel->RemoveView( m_nViewID ); + + m_pRoot->removeView( this ); +} + +void cView::loadSchema( BSTR strSchema, IUnknown **ppRootControl ) +{ + USES_CONVERSION; + + _ASSERTE( strSchema != NULL ); + + // Create a new XML document and load this up + MSXML::IXMLDOMDocumentPtr pDoc; + pDoc.CreateInstance( __uuidof( MSXML::DOMDocument ), NULL, CLSCTX_INPROC_SERVER ); + + VARIANT_BOOL bSuccess; + if( strSchema[ 0 ] == OLESTR( '<' ) ) + bSuccess = pDoc->loadXML( strSchema ); + else + { + // Load from a file source + pDoc->async = VARIANT_FALSE; + + TCHAR szPath[ MAX_PATH ]; + bSuccess = pDoc->load( ::InjectMapPath( eInjectPathAgent, OLE2T( strSchema ), szPath ) ); + } + + if( !bSuccess ) + { + USES_CONVERSION; + + // The document failed to load, get the error info for posterity + MSXML::IXMLDOMParseErrorPtr pErr = pDoc->parseError; + + long nCode = pErr->errorCode; + long nFilePos = pErr->filepos; + long nLine = pErr->line; + long nLinePos = pErr->linepos; + _bstr_t strReason = pErr->reason; + _bstr_t strText = pErr->srcText; + + TCHAR szError[ 1024 ]; + ::_stprintf( szError, _T( "0x%08X (%i, %i): %s" ), + nCode, nLine, nLinePos, OLE2T( strReason ) ); + + ::MessageBox( cManager::_p->m_hMain, szError, _T( "XML Parse Error" ), MB_ICONERROR | MB_OK ); + + // Give the user a chance to break and look at this lovely info + _ASSERTE( FALSE ); + + return; + } + + // Get the root element and check it out + loadSchemaObject( pDoc->documentElement, ppRootControl ); +} + +void cView::loadSchemaObject( IUnknown *pObject, IUnknown **ppRootControl ) +{ + MSXML::IXMLDOMElementPtr pRoot = pObject; + + _ASSERTE( pRoot->tagName == _bstr_t( _T( "view" ) ) ); + + // Get the view parameters + _variant_t vIconModule = pRoot->getAttribute( _T( "iconlibrary" ) ), + vIcon = pRoot->getAttribute( _T( "icon" ) ), + vTitle = pRoot->getAttribute( _T( "title" ) ), + vLeft = pRoot->getAttribute( _T( "left" ) ), + vTop = pRoot->getAttribute( _T( "top" ) ), + vWidth = pRoot->getAttribute( _T( "width" ) ), + vHeight = pRoot->getAttribute( _T( "height" ) ); + + // We *must* have a title + _ASSERTE( vTitle.vt == VT_BSTR ); + + // Fill this into a view param + _ASSERTE( vIcon.vt != VT_NULL ); + m_nIcon = ( vIcon.vt != VT_NULL ) ? static_cast< long >( vIcon ) + 0x06000000 : 0; + + if( vIconModule.vt == VT_BSTR ) + cManager::_p->LoadResourceModule( vIconModule.bstrVal, &m_nIconModule ); + else + m_nIconModule = 0; + + if(vLeft.vt == VT_NULL) + m_nLeft = 0; + else + m_nLeft = static_cast< long >(vLeft); + + if(vTop.vt == VT_NULL) + m_nTop = 70; + else + m_nTop = static_cast< long >(vTop); + + if(vWidth.vt == VT_NULL) + m_nWidth = 180; + else + m_nWidth = static_cast< long >(vWidth); + + if(vHeight.vt == VT_NULL) + { + SIZE szScreen; + cManager::_p->GetScreenSize( &szScreen ); + m_nHeight = szScreen.cy/2; + } + else + m_nHeight = static_cast< long >(vHeight); + + m_strTitle = vTitle.bstrVal; + + // The properly made schema should have a single control child + MSXML::IXMLDOMElementPtr pControl = pRoot->selectSingleNode( _T( "control" ) ); + + _ASSERTE( pControl.GetInterfacePtr() != NULL ); + + pControl->QueryInterface( ppRootControl ); +} + +STDMETHODIMP cView::get_Control(BSTR strName, IControl **pVal) +{ + _ASSERTE( strName != NULL ); + _ASSERTE( pVal != NULL ); + + // Search for a matching control name + for( cNamedControlList::iterator i = m_controls.begin(); i != m_controls.end(); ++ i ) + { + if( i->m_strName == _bstr_t( strName ) ) + { + *pVal = i->m_pControl; + ( *pVal )->AddRef(); + + return S_OK; + } + } + + // The name was not found + return E_INVALIDARG; +} + +STDMETHODIMP cView::putref_Control(BSTR strName, IControl *newVal) +{ + _ASSERTE( strName != NULL ); + + // First look for a matching name + for( cNamedControlList::iterator i = m_controls.begin(); i != m_controls.end(); ++ i ) + { + if( i->m_strName == _bstr_t( strName ) ) + { + if( newVal == NULL ) + m_controls.erase( i ); + else + i->m_pControl = newVal; + + return S_OK; + } + } + + if( newVal == NULL ) + // No value to set + return S_OK; + + // Add in a new record + cNamedControl nc; + nc.m_strName = strName; + nc.m_pControl = newVal; + + m_controls.push_back( nc ); + + return S_OK; +} + +STDMETHODIMP cView::LoadControl(ILayerSite *pParent, long nID, IUnknown *pSource, long *pAssignedID) +{ + // Usual parameter validation + _ASSERTE( pParent != NULL ); + _ASSERTE( pSource != NULL ); + _ASSERTE( pAssignedID != NULL ); + + MSXML::IXMLDOMElementPtr pElement = pSource; + + // Make sure we're starting from the correct tag name + _ASSERTE( pElement->tagName == _bstr_t( _T( "control" ) ) ); + + // Get the progid and make an instance + _variant_t strProgID = pElement->getAttribute( _T( "progid" ) ); + _ASSERTE( strProgID.vt == VT_BSTR ); + + CLSID clsid; + HRESULT hRes = ::CLSIDFromProgID( strProgID.bstrVal, &clsid ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + CComPtr< ILayer > pChildLayer; + hRes = ::CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, + reinterpret_cast< void ** >( &pChildLayer ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + // Get some position metrics - note, these are optional and will be + // loaded with 0s - this is for cases when the control is formatted + // entirely by the parent + _variant_t vLeft = pElement->getAttribute( _T( "left" ) ), + vTop = pElement->getAttribute( _T( "top" ) ), + vWidth = pElement->getAttribute( _T( "width" ) ), + vHeight = pElement->getAttribute( _T( "height" ) ), + vUnclipped = pElement->getAttribute( _T( "unclipped" ) ), + vID = pElement->getAttribute( _T( "ID" ) ); + + long nRealID = ( vID.vt == VT_NULL ) ? nID : static_cast< long >( vID ); + *pAssignedID = nRealID; + + POINT pt = { ( vLeft.vt != VT_NULL ) ? static_cast< long >( vLeft ) : 0, + ( vTop.vt != VT_NULL ) ? static_cast< long >( vTop ) : 0 }; + + LayerParams lp = { nRealID, { pt.x, pt.y, pt.x + ( ( vWidth.vt != VT_NULL ) ? static_cast< long >( vWidth ) : 0 ), + pt.y + ( ( vHeight.vt != VT_NULL ) ? static_cast< long >( vHeight ) : 0 ) }, + ( vUnclipped.vt != VT_NULL ) ? 0 : eRenderClipped }; + + pParent->CreateChild( &lp, pChildLayer ); + + // Check if this child is named + _variant_t vName = pElement->getAttribute( _T( "name" ) ); + + if( vName.vt == VT_BSTR ) + { + // Add the named control + CComPtr< IControl > pControl; + pChildLayer->QueryInterface( &pControl ); + putref_Control( vName.bstrVal, pControl ); + } + + // Ok, the child is made - trick it into loading it's own parameters + CComPtr< ILayerSchema > pSchema; + + if( SUCCEEDED( pChildLayer->QueryInterface( &pSchema ) ) ) + pSchema->SchemaLoad( this, pSource ); + + return S_OK; +} + +STDMETHODIMP cView::LoadSchema(BSTR strXMLSchema) +{ + long nPreviousView; + m_pRoot->m_pPanel->get_ActiveView( &nPreviousView ); + m_pRoot->m_pPanel->RemoveView( m_nViewID ); + + CComPtr< IUnknown > pRootControl; + loadSchema( strXMLSchema, &pRootControl ); + + // Set the bar params + ViewParams vp = { m_nIcon, m_nIconModule, m_strTitle, m_nLeft, m_nTop, m_nWidth, m_nHeight }; + m_pRoot->m_pBars->put_Bar( m_nViewID, &vp ); + + // Last, create all the controls + m_pRoot->m_pPanel->LoadView( m_nViewID, this, pRootControl ); + + if( nPreviousView == m_nViewID ) + // Reactivate the view + m_pRoot->SelectBar( m_nViewID ); + + return S_OK; +} + +STDMETHODIMP cView::get_Title(BSTR *pVal) +{ + USES_CONVERSION; + + *pVal = OLE2BSTR( m_strTitle ); + + return S_OK; +} + +STDMETHODIMP cView::put_Title(BSTR newVal) +{ + _ASSERTE( newVal != NULL ); + + m_strTitle = newVal; + + long nActiveView; + m_pRoot->m_pPanel->get_ActiveView( &nActiveView ); + + ViewParams vp = { m_nIcon, m_nIconModule, m_strTitle, m_nLeft, m_nTop, m_nWidth, m_nHeight }; + m_pRoot->m_pBars->put_Bar( m_nViewID, &vp ); + +// if( nActiveView == m_nViewID ) + // Reload the view +// m_pRoot->SelectBar( m_nViewID ); + + return S_OK; +} + +STDMETHODIMP cView::Alert() +{ + return S_OK; +} + +STDMETHODIMP cView::SetIcon(long icon, VARIANT iconlibrary) +{ + USES_CONVERSION; + + m_nIcon = icon; + + switch( iconlibrary.vt ) + { + case VT_ERROR: + case VT_EMPTY: + case VT_NULL: + m_nIconModule = 0; + break; + + case VT_BSTR: + m_nIconModule = reinterpret_cast< long >( ::GetModuleHandle( OLE2T( iconlibrary.bstrVal ) ) ); + break; + + default: + // Try and convert everything else to a number + try + { + _variant_t v = iconlibrary; + m_nIconModule = v; + } + catch( ... ) + { + m_nIconModule = 0; + return E_INVALIDARG; + } + + break; + } + + long nActiveView; + m_pRoot->m_pPanel->get_ActiveView( &nActiveView ); + + ViewParams vp = { m_nIcon, m_nIconModule, m_strTitle, m_nLeft, m_nTop, m_nWidth, m_nHeight}; + m_pRoot->m_pBars->put_Bar( m_nViewID, &vp ); + + if( nActiveView == m_nViewID ) + // Reload the view + m_pRoot->SelectBar( m_nViewID ); + + return S_OK; +} + +STDMETHODIMP cView::Activate() +{ + long nActiveView; + m_pRoot->m_pPanel->get_ActiveView( &nActiveView ); + if (nActiveView != m_nViewID) + { + m_pRoot->SelectBar( m_nViewID ); + } + + return S_OK; +} + +STDMETHODIMP cView::Deactivate() +{ + m_pRoot->m_pPanel->Deactivate(); + if(cManager::_p->m_pKeyboard!=NULL) + { + cManager::_p->m_pKeyboard->sendKeyboardEndCapture( VARIANT_TRUE ); + cManager::_p->m_pKeyboard=NULL; + } + return S_OK; +} + +STDMETHODIMP cView::put_Position(LPRECT pVal) +{ + + long nActiveView; + m_pRoot->m_pPanel->get_ActiveView( &nActiveView ); + + if( nActiveView == m_nViewID ) + { + m_nLeft = pVal->left; + m_nTop = pVal->top; + m_nWidth = pVal->right; + m_nHeight = pVal->bottom; + + ViewParams vp = {m_nIcon, m_nIconModule, m_strTitle, m_nLeft, m_nTop, m_nWidth, m_nHeight}; + m_pRoot->m_pPanel->ActivateView(m_nViewID, &vp ); + Fire_Activate(); + } + return S_OK; +} + +STDMETHODIMP cView::get_Position(LPRECT pVal) +{ + pVal->left = m_nLeft; + pVal->top = m_nTop; + pVal->right = m_nWidth; + pVal->bottom = m_nHeight; + return S_OK; +} diff --git a/Native/Inject/Attic/Copy of View.h b/Native/Inject/Attic/Copy of View.h new file mode 100644 index 0000000..b4432e9 --- /dev/null +++ b/Native/Inject/Attic/Copy of View.h @@ -0,0 +1,81 @@ +// View.h : Declaration of the cView + +#ifndef __VIEW_H_ +#define __VIEW_H_ + +#include "resource.h" // main symbols +#include "InjectCP.h" +#include "SinkImpl.h" +class cRootLayer; + +///////////////////////////////////////////////////////////////////////////// +// cView +class ATL_NO_VTABLE cView : + public CComObjectRootEx, + public IConnectionPointContainerImpl, + public IProvideClassInfo2Impl< &CLSID_View, &IID_IViewDisp, &LIBID_DecalPlugins >, + public IDispatchImpl< IView, &IID_IViewDisp, &LIBID_DecalPlugins >, + public CProxyIViewEvents< cView > +{ +public: + cView() + { + } + + ~cView(); + + cRootLayer *m_pRoot; + + _bstr_t m_strTitle; + long m_nIcon; + long m_nIconModule; + long m_nViewID; + long m_nWidth; + long m_nHeight; + long m_nTop; + long m_nLeft; + + // Named controls + struct cNamedControl + { + _bstr_t m_strName; + CComPtr< IControl > m_pControl; + }; + + typedef std::list< cNamedControl > cNamedControlList; + cNamedControlList m_controls; + + void loadSchema( BSTR strText, IUnknown **ppRootControl ); + void loadSchemaObject( IUnknown *pObject, IUnknown **ppRootControl ); + +BEGIN_COM_MAP(cView) + COM_INTERFACE_ENTRY(IView) + COM_INTERFACE_ENTRY(IViewDisp) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY(IConnectionPointContainer) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cView) +CONNECTION_POINT_ENTRY(DIID_IViewEvents) +END_CONNECTION_POINT_MAP() + +public: + // IView Methods + STDMETHOD(SetIcon)(long icon, /*[optional]*/ VARIANT iconlibrary); + STDMETHOD(Activate)(); + STDMETHOD(Alert)(); + STDMETHOD(get_Title)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Title)(/*[in]*/ BSTR newVal); + STDMETHOD(LoadSchema)(BSTR strXMLSchema); + STDMETHOD(LoadControl)(ILayerSite *pParent, long nID, IUnknown *pSource, long *pAssignedID); + STDMETHOD(get_Control)(BSTR strName, /*[out, retval]*/ IControl * *pVal); + STDMETHOD(putref_Control)(BSTR strName, /*[in]*/ IControl * newVal); + STDMETHOD(Deactivate)(); + STDMETHOD(put_Position)(/*[in]*/ LPRECT pVal); + STDMETHOD(get_Position)(/*[out, retval]*/ LPRECT pVal); +}; + +#endif //__VIEW_H_ diff --git a/Native/Inject/Attic/EventsImpl.h b/Native/Inject/Attic/EventsImpl.h new file mode 100644 index 0000000..942c323 --- /dev/null +++ b/Native/Inject/Attic/EventsImpl.h @@ -0,0 +1,91 @@ +// EventsImpl.h +// Declaration of helper class for implementing plugins + +#ifndef _EVENTSIMPL_H_ +#define _EVENTSIMPL_H_ + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl, const IID *pIID, const GUID *pLIBID > +class IControlEventsImpl +: public IDispEventImpl< nID, cImpl, pIID, pLIBID, 1, 0 > +{ +protected: + void advise( IUnknown *pUnk ) + { + HRESULT hRes = DispEventAdvise( pUnk ); + + _ASSERTE( SUCCEEDED( hRes ) ); + } + + void unadvise( IUnknown *pUnk ) + { + HRESULT hRes = DispEventUnadvise( pUnk ); + + _ASSERTE( SUCCEEDED( hRes ) ); + } +}; + +#define DISPID_DESTROY 1 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class ICommandEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_ICommandEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_HIT 2 +#define DISPID_UNHIT 3 +#define DISPID_ACCEPTED 4 +#define DISPID_CANCELED 5 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IPagerEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IPagerEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_CHANGE 6 +#define DISPID_GETNEXTPOSITION 7 +#define DISPID_UPDATE_POSITION 6 +#define DISPID_GET_NEXT_POSITION 7 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IViewEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IViewEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_ACTIVATE 8 +#define DISPID_DEACTIVATE 9 +#define DISPID_SIZE 13 +#define DISPID_SIZING 14 + + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +template< UINT nID, class cImpl > +class IInputEventsImpl +: public IControlEventsImpl< nID, cImpl, &DIID_IInputEvents, &LIBID_DecalPlugins > +{ +}; + +#define DISPID_BEGIN 10 +#define DISPID_END 11 +#define DISPID_PAUSE 12 + +#endif // _EVENTSIMPL_H_ diff --git a/Native/Inject/Attic/Inject.aps b/Native/Inject/Attic/Inject.aps new file mode 100644 index 0000000000000000000000000000000000000000..2a23999298828b456cad1be5d7315de4b06c9776 GIT binary patch literal 5828 zcmd5=&2JmW6@QFaSybDYZQZX!o2}}=b`i4NCB+Y;ZA$Jgt*w`&KvJ>{2%u$gDJi8% zfua-yh7lGhT-|bL|AZcL%(0gO2Es$y@Q(=49C8Ry9d#(O{k@qbcPUdJMvJ0D&e!{z z_ujmj*%=}t1=)3FMsq6NLGLE=3O%3#YS#^U_(<4m(1$mOjJumn=V;S#wzt}w2i?Qo zwzFw<-f_13UKQ_cGyT_*Q^<8PX#=H2Wzxx}H8KG4E-ixOhsYPJGRKmpM5#*s;i_p{1!YNE7w@+p3u&|gY6ax3 z8=ZJ5LB16mb3E8O)u@5eq$*k#RbYQZc%g_kr@w~(`4tg+nKN4>>$lP3#BP^1imoXB z0ze4z`qZO6>d+1qQMbu~`;f2)c^xJb8oUGSHlPZX0B_Qv(2XdKc<^Pc zgQ^E9KCen|fhQqK&10)Vj&36d<<%i+3wAm1&KBCg6&@VZRWP!N*>Rv_3-iue?14h+ z&hmaG{7~`q;TdFm#=hkq&&;$h`a|EPg1WMe9iN}C#(wUWeC030q;$$WnE;%^3KE2F1_1<$J)X+ zKRzPikHTLdu6Z2So%7dSG!g|!B%Uh;`PaxHA&+PPp4n*tBrt=4tWcs!FJ8Pr%?REm zxpHNNQtq4#yeuuyf+Uf`xg!7rGzK0Hfa8_`v;aj~IBvCex#9I`epfbI9_0CevB0+^ z#hA|PGL-=N^@1l)Qncv#Bai=sfs}K6D(Vkh7l8TJvFifRLRSD5xIQJ(b=_mp1z;rc zEt2@rhyep08-P=E0eCKTS&-e)$kQo28V!dddt|rf9|1&RduZFkkueGz^D0r*`( z5$pmm?y^@noxc6AH$J<5a&0j8A_QChXX!RZQ!tub2Qt8M3Qny9?l8@G9lSt$b{cR< zBFj+a63tg$2lJ1J@D~|#Bir++kz3spk-M&YavhnjpUfkJnt&OGN#3#VSkLoVLo&)y0gCc>tihchc&Z!#quqr(S#C89Ul2dSQR_^Q7#ixrA@%f~8JN;g_eGo4k z_WRvVTvdLl94NPBPtn_32M4znBcP7xcFi&*_NlIEg`!r}V?{NUilv%rCYIAxEtXHF zQpH?0Q7EXHXW)A_dzAm`7!m!jx9;?$%-J?cP0HP>^Q3#^D8dqHRI!V1M-O~8t7eR& zNN-^j;i$-Jue&pL)wv2qB2fBZuiLRYO=sUh(dl2t$Rk9o&VH}EU2}RzPA{oRb>1vh zj5XVQQxNcEMIuLAZKb~3bGDj$ot;v*>9jqscl*174098S+^WB~@7Q~fZ%O3S@s1IGGk4zR&3j>lBy;6X3Q|#s@2g~=^L_NH#h2f#a=6w0oCZ65^Cv{@&ua1 z*S+A?S4{o>1e_wAa$}L}miYhzmI>z=!^)MqSrB$>Y5JCgmGV}(SQT#4vh-~UH1(BA z(XwGV*mLw939VIZ%dkrMdvIwoK{q5+xS+6BEHZIY#idJ(RamRnD`nCW8eiXe^i?oc z0Z7vKi5mIUTB8gz8&$JbS*z-1V?A%LnZRf0M?t(^DV6eN!$T*vOgc+Ho+c>Q;nE4e zN;uSg`L%~7bIh$KQyiS*m>Ite;4lxZ*Ba|)wPsby4LGDiDtr;L482jS=j)bEw`1xZ zx3A2&iqV2^ zGC!wxLDBI>9giiyjUrL0i`2bCdE9K}3qo9s&hHMhzkwoAz6bX4<9C8Mr0+np+0>s> zB)STnS#~c#`^T4jEx)aTzUJj)m34c~K%|P9xCu`Mq1sGnaspM;U_2WVS9!rP1?%=_B<99~`+28Lm*&_KbYS=O9&&aRxmdNjipI^x1=@NK<M>uxQJKOoZ=JUs&zsY$$xk>R}`6138pJuXGPH1?I-@u{c K(@fU*gy!GNb;FYY literal 0 HcmV?d00001 diff --git a/Native/Inject/Attic/Inject.h b/Native/Inject/Attic/Inject.h new file mode 100644 index 0000000..a71f8a1 --- /dev/null +++ b/Native/Inject/Attic/Inject.h @@ -0,0 +1,8563 @@ + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 5.03.0280 */ +/* at Sat Aug 18 01:06:36 2001 + */ +/* Compiler settings for E:\Decal\Source\Inject\Inject.idl: + Oicf (OptLev=i2), W1, Zp8, env=Win32 (32b run), ms_ext, c_ext + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@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 __Inject_h__ +#define __Inject_h__ + +/* Forward Declarations */ + +#ifndef __IManager_FWD_DEFINED__ +#define __IManager_FWD_DEFINED__ +typedef interface IManager IManager; +#endif /* __IManager_FWD_DEFINED__ */ + + +#ifndef __IPluginSite_FWD_DEFINED__ +#define __IPluginSite_FWD_DEFINED__ +typedef interface IPluginSite IPluginSite; +#endif /* __IPluginSite_FWD_DEFINED__ */ + + +#ifndef __IPluginSink_FWD_DEFINED__ +#define __IPluginSink_FWD_DEFINED__ +typedef interface IPluginSink IPluginSink; +#endif /* __IPluginSink_FWD_DEFINED__ */ + + +#ifndef __IPlugin_FWD_DEFINED__ +#define __IPlugin_FWD_DEFINED__ +typedef interface IPlugin IPlugin; +#endif /* __IPlugin_FWD_DEFINED__ */ + + +#ifndef __IControl_FWD_DEFINED__ +#define __IControl_FWD_DEFINED__ +typedef interface IControl IControl; +#endif /* __IControl_FWD_DEFINED__ */ + + +#ifndef __IControlEvents_FWD_DEFINED__ +#define __IControlEvents_FWD_DEFINED__ +typedef interface IControlEvents IControlEvents; +#endif /* __IControlEvents_FWD_DEFINED__ */ + + +#ifndef __ILayer_FWD_DEFINED__ +#define __ILayer_FWD_DEFINED__ +typedef interface ILayer ILayer; +#endif /* __ILayer_FWD_DEFINED__ */ + + +#ifndef __ILayerRender_FWD_DEFINED__ +#define __ILayerRender_FWD_DEFINED__ +typedef interface ILayerRender ILayerRender; +#endif /* __ILayerRender_FWD_DEFINED__ */ + + +#ifndef __ILayerSite_FWD_DEFINED__ +#define __ILayerSite_FWD_DEFINED__ +typedef interface ILayerSite ILayerSite; +#endif /* __ILayerSite_FWD_DEFINED__ */ + + +#ifndef __IBarManager_FWD_DEFINED__ +#define __IBarManager_FWD_DEFINED__ +typedef interface IBarManager IBarManager; +#endif /* __IBarManager_FWD_DEFINED__ */ + + +#ifndef __IIconCache_FWD_DEFINED__ +#define __IIconCache_FWD_DEFINED__ +typedef interface IIconCache IIconCache; +#endif /* __IIconCache_FWD_DEFINED__ */ + + +#ifndef __IImageCacheDisp_FWD_DEFINED__ +#define __IImageCacheDisp_FWD_DEFINED__ +typedef interface IImageCacheDisp IImageCacheDisp; +#endif /* __IImageCacheDisp_FWD_DEFINED__ */ + + +#ifndef __IImageCache_FWD_DEFINED__ +#define __IImageCache_FWD_DEFINED__ +typedef interface IImageCache IImageCache; +#endif /* __IImageCache_FWD_DEFINED__ */ + + +#ifndef __IFontCacheDisp_FWD_DEFINED__ +#define __IFontCacheDisp_FWD_DEFINED__ +typedef interface IFontCacheDisp IFontCacheDisp; +#endif /* __IFontCacheDisp_FWD_DEFINED__ */ + + +#ifndef __IFontCache_FWD_DEFINED__ +#define __IFontCache_FWD_DEFINED__ +typedef interface IFontCache IFontCache; +#endif /* __IFontCache_FWD_DEFINED__ */ + + +#ifndef __ISimpleBar_FWD_DEFINED__ +#define __ISimpleBar_FWD_DEFINED__ +typedef interface ISimpleBar ISimpleBar; +#endif /* __ISimpleBar_FWD_DEFINED__ */ + + +#ifndef __ILayerMouse_FWD_DEFINED__ +#define __ILayerMouse_FWD_DEFINED__ +typedef interface ILayerMouse ILayerMouse; +#endif /* __ILayerMouse_FWD_DEFINED__ */ + + +#ifndef __ILayerSchema_FWD_DEFINED__ +#define __ILayerSchema_FWD_DEFINED__ +typedef interface ILayerSchema ILayerSchema; +#endif /* __ILayerSchema_FWD_DEFINED__ */ + + +#ifndef __IButton_FWD_DEFINED__ +#define __IButton_FWD_DEFINED__ +typedef interface IButton IButton; +#endif /* __IButton_FWD_DEFINED__ */ + + +#ifndef __ICommandEvents_FWD_DEFINED__ +#define __ICommandEvents_FWD_DEFINED__ +typedef interface ICommandEvents ICommandEvents; +#endif /* __ICommandEvents_FWD_DEFINED__ */ + + +#ifndef __IPager_FWD_DEFINED__ +#define __IPager_FWD_DEFINED__ +typedef interface IPager IPager; +#endif /* __IPager_FWD_DEFINED__ */ + + +#ifndef __IPagerEvents_FWD_DEFINED__ +#define __IPagerEvents_FWD_DEFINED__ +typedef interface IPagerEvents IPagerEvents; +#endif /* __IPagerEvents_FWD_DEFINED__ */ + + +#ifndef __IPanel_FWD_DEFINED__ +#define __IPanel_FWD_DEFINED__ +typedef interface IPanel IPanel; +#endif /* __IPanel_FWD_DEFINED__ */ + + +#ifndef __IPanelSink_FWD_DEFINED__ +#define __IPanelSink_FWD_DEFINED__ +typedef interface IPanelSink IPanelSink; +#endif /* __IPanelSink_FWD_DEFINED__ */ + + +#ifndef __ICanvas_FWD_DEFINED__ +#define __ICanvas_FWD_DEFINED__ +typedef interface ICanvas ICanvas; +#endif /* __ICanvas_FWD_DEFINED__ */ + + +#ifndef __IViewDisp_FWD_DEFINED__ +#define __IViewDisp_FWD_DEFINED__ +typedef interface IViewDisp IViewDisp; +#endif /* __IViewDisp_FWD_DEFINED__ */ + + +#ifndef __IView_FWD_DEFINED__ +#define __IView_FWD_DEFINED__ +typedef interface IView IView; +#endif /* __IView_FWD_DEFINED__ */ + + +#ifndef __IViewEvents_FWD_DEFINED__ +#define __IViewEvents_FWD_DEFINED__ +typedef interface IViewEvents IViewEvents; +#endif /* __IViewEvents_FWD_DEFINED__ */ + + +#ifndef __IRootLayer_FWD_DEFINED__ +#define __IRootLayer_FWD_DEFINED__ +typedef interface IRootLayer IRootLayer; +#endif /* __IRootLayer_FWD_DEFINED__ */ + + +#ifndef __IMessageMember_FWD_DEFINED__ +#define __IMessageMember_FWD_DEFINED__ +typedef interface IMessageMember IMessageMember; +#endif /* __IMessageMember_FWD_DEFINED__ */ + + +#ifndef __IMessage_FWD_DEFINED__ +#define __IMessage_FWD_DEFINED__ +typedef interface IMessage IMessage; +#endif /* __IMessage_FWD_DEFINED__ */ + + +#ifndef __INetworkFilter_FWD_DEFINED__ +#define __INetworkFilter_FWD_DEFINED__ +typedef interface INetworkFilter INetworkFilter; +#endif /* __INetworkFilter_FWD_DEFINED__ */ + + +#ifndef __ILayerKeyboard_FWD_DEFINED__ +#define __ILayerKeyboard_FWD_DEFINED__ +typedef interface ILayerKeyboard ILayerKeyboard; +#endif /* __ILayerKeyboard_FWD_DEFINED__ */ + + +#ifndef __ILayerPopup_FWD_DEFINED__ +#define __ILayerPopup_FWD_DEFINED__ +typedef interface ILayerPopup ILayerPopup; +#endif /* __ILayerPopup_FWD_DEFINED__ */ + + +#ifndef __ILayerTimer_FWD_DEFINED__ +#define __ILayerTimer_FWD_DEFINED__ +typedef interface ILayerTimer ILayerTimer; +#endif /* __ILayerTimer_FWD_DEFINED__ */ + + +#ifndef __IWindowsMessageSink_FWD_DEFINED__ +#define __IWindowsMessageSink_FWD_DEFINED__ +typedef interface IWindowsMessageSink IWindowsMessageSink; +#endif /* __IWindowsMessageSink_FWD_DEFINED__ */ + + +#ifndef __IBrushImage_FWD_DEFINED__ +#define __IBrushImage_FWD_DEFINED__ +typedef interface IBrushImage IBrushImage; +#endif /* __IBrushImage_FWD_DEFINED__ */ + + +#ifndef __IInputBuffer_FWD_DEFINED__ +#define __IInputBuffer_FWD_DEFINED__ +typedef interface IInputBuffer IInputBuffer; +#endif /* __IInputBuffer_FWD_DEFINED__ */ + + +#ifndef __IInputEvents_FWD_DEFINED__ +#define __IInputEvents_FWD_DEFINED__ +typedef interface IInputEvents IInputEvents; +#endif /* __IInputEvents_FWD_DEFINED__ */ + + +#ifndef __IInputNotify_FWD_DEFINED__ +#define __IInputNotify_FWD_DEFINED__ +typedef interface IInputNotify IInputNotify; +#endif /* __IInputNotify_FWD_DEFINED__ */ + + +#ifndef __IPlugin_FWD_DEFINED__ +#define __IPlugin_FWD_DEFINED__ +typedef interface IPlugin IPlugin; +#endif /* __IPlugin_FWD_DEFINED__ */ + + +#ifndef __IPluginSink_FWD_DEFINED__ +#define __IPluginSink_FWD_DEFINED__ +typedef interface IPluginSink IPluginSink; +#endif /* __IPluginSink_FWD_DEFINED__ */ + + +#ifndef __ILayerSite_FWD_DEFINED__ +#define __ILayerSite_FWD_DEFINED__ +typedef interface ILayerSite ILayerSite; +#endif /* __ILayerSite_FWD_DEFINED__ */ + + +#ifndef __IControl_FWD_DEFINED__ +#define __IControl_FWD_DEFINED__ +typedef interface IControl IControl; +#endif /* __IControl_FWD_DEFINED__ */ + + +#ifndef __ILayer_FWD_DEFINED__ +#define __ILayer_FWD_DEFINED__ +typedef interface ILayer ILayer; +#endif /* __ILayer_FWD_DEFINED__ */ + + +#ifndef __ILayerRender_FWD_DEFINED__ +#define __ILayerRender_FWD_DEFINED__ +typedef interface ILayerRender ILayerRender; +#endif /* __ILayerRender_FWD_DEFINED__ */ + + +#ifndef __ILayerMouse_FWD_DEFINED__ +#define __ILayerMouse_FWD_DEFINED__ +typedef interface ILayerMouse ILayerMouse; +#endif /* __ILayerMouse_FWD_DEFINED__ */ + + +#ifndef __ILayerKeyboard_FWD_DEFINED__ +#define __ILayerKeyboard_FWD_DEFINED__ +typedef interface ILayerKeyboard ILayerKeyboard; +#endif /* __ILayerKeyboard_FWD_DEFINED__ */ + + +#ifndef __ILayerPopup_FWD_DEFINED__ +#define __ILayerPopup_FWD_DEFINED__ +typedef interface ILayerPopup ILayerPopup; +#endif /* __ILayerPopup_FWD_DEFINED__ */ + + +#ifndef __ILayerSchema_FWD_DEFINED__ +#define __ILayerSchema_FWD_DEFINED__ +typedef interface ILayerSchema ILayerSchema; +#endif /* __ILayerSchema_FWD_DEFINED__ */ + + +#ifndef __ILayerTimer_FWD_DEFINED__ +#define __ILayerTimer_FWD_DEFINED__ +typedef interface ILayerTimer ILayerTimer; +#endif /* __ILayerTimer_FWD_DEFINED__ */ + + +#ifndef __IControlEvents_FWD_DEFINED__ +#define __IControlEvents_FWD_DEFINED__ +typedef interface IControlEvents IControlEvents; +#endif /* __IControlEvents_FWD_DEFINED__ */ + + +#ifndef __IIconCache_FWD_DEFINED__ +#define __IIconCache_FWD_DEFINED__ +typedef interface IIconCache IIconCache; +#endif /* __IIconCache_FWD_DEFINED__ */ + + +#ifndef __IImageCacheDisp_FWD_DEFINED__ +#define __IImageCacheDisp_FWD_DEFINED__ +typedef interface IImageCacheDisp IImageCacheDisp; +#endif /* __IImageCacheDisp_FWD_DEFINED__ */ + + +#ifndef __IImageCache_FWD_DEFINED__ +#define __IImageCache_FWD_DEFINED__ +typedef interface IImageCache IImageCache; +#endif /* __IImageCache_FWD_DEFINED__ */ + + +#ifndef __IFontCacheDisp_FWD_DEFINED__ +#define __IFontCacheDisp_FWD_DEFINED__ +typedef interface IFontCacheDisp IFontCacheDisp; +#endif /* __IFontCacheDisp_FWD_DEFINED__ */ + + +#ifndef __IFontCache_FWD_DEFINED__ +#define __IFontCache_FWD_DEFINED__ +typedef interface IFontCache IFontCache; +#endif /* __IFontCache_FWD_DEFINED__ */ + + +#ifndef __IBarManager_FWD_DEFINED__ +#define __IBarManager_FWD_DEFINED__ +typedef interface IBarManager IBarManager; +#endif /* __IBarManager_FWD_DEFINED__ */ + + +#ifndef __ISimpleBar_FWD_DEFINED__ +#define __ISimpleBar_FWD_DEFINED__ +typedef interface ISimpleBar ISimpleBar; +#endif /* __ISimpleBar_FWD_DEFINED__ */ + + +#ifndef __IRootLayer_FWD_DEFINED__ +#define __IRootLayer_FWD_DEFINED__ +typedef interface IRootLayer IRootLayer; +#endif /* __IRootLayer_FWD_DEFINED__ */ + + +#ifndef __IPanelSink_FWD_DEFINED__ +#define __IPanelSink_FWD_DEFINED__ +typedef interface IPanelSink IPanelSink; +#endif /* __IPanelSink_FWD_DEFINED__ */ + + +#ifndef __IInputNotify_FWD_DEFINED__ +#define __IInputNotify_FWD_DEFINED__ +typedef interface IInputNotify IInputNotify; +#endif /* __IInputNotify_FWD_DEFINED__ */ + + +#ifndef __IMessageMember_FWD_DEFINED__ +#define __IMessageMember_FWD_DEFINED__ +typedef interface IMessageMember IMessageMember; +#endif /* __IMessageMember_FWD_DEFINED__ */ + + +#ifndef __IMessage_FWD_DEFINED__ +#define __IMessage_FWD_DEFINED__ +typedef interface IMessage IMessage; +#endif /* __IMessage_FWD_DEFINED__ */ + + +#ifndef __IWindowsMessageSink_FWD_DEFINED__ +#define __IWindowsMessageSink_FWD_DEFINED__ +typedef interface IWindowsMessageSink IWindowsMessageSink; +#endif /* __IWindowsMessageSink_FWD_DEFINED__ */ + + +#ifndef __ICommandEvents_FWD_DEFINED__ +#define __ICommandEvents_FWD_DEFINED__ +typedef interface ICommandEvents ICommandEvents; +#endif /* __ICommandEvents_FWD_DEFINED__ */ + + +#ifndef __IPagerEvents_FWD_DEFINED__ +#define __IPagerEvents_FWD_DEFINED__ +typedef interface IPagerEvents IPagerEvents; +#endif /* __IPagerEvents_FWD_DEFINED__ */ + + +#ifndef __IViewEvents_FWD_DEFINED__ +#define __IViewEvents_FWD_DEFINED__ +typedef interface IViewEvents IViewEvents; +#endif /* __IViewEvents_FWD_DEFINED__ */ + + +#ifndef __IInputEvents_FWD_DEFINED__ +#define __IInputEvents_FWD_DEFINED__ +typedef interface IInputEvents IInputEvents; +#endif /* __IInputEvents_FWD_DEFINED__ */ + + +#ifndef __IViewDisp_FWD_DEFINED__ +#define __IViewDisp_FWD_DEFINED__ +typedef interface IViewDisp IViewDisp; +#endif /* __IViewDisp_FWD_DEFINED__ */ + + +#ifndef __Canvas_FWD_DEFINED__ +#define __Canvas_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class Canvas Canvas; +#else +typedef struct Canvas Canvas; +#endif /* __cplusplus */ + +#endif /* __Canvas_FWD_DEFINED__ */ + + +#ifndef __PluginSite_FWD_DEFINED__ +#define __PluginSite_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class PluginSite PluginSite; +#else +typedef struct PluginSite PluginSite; +#endif /* __cplusplus */ + +#endif /* __PluginSite_FWD_DEFINED__ */ + + +#ifndef __Layer_FWD_DEFINED__ +#define __Layer_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class Layer Layer; +#else +typedef struct Layer Layer; +#endif /* __cplusplus */ + +#endif /* __Layer_FWD_DEFINED__ */ + + +#ifndef __View_FWD_DEFINED__ +#define __View_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class View View; +#else +typedef struct View View; +#endif /* __cplusplus */ + +#endif /* __View_FWD_DEFINED__ */ + + +#ifndef __Button_FWD_DEFINED__ +#define __Button_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class Button Button; +#else +typedef struct Button Button; +#endif /* __cplusplus */ + +#endif /* __Button_FWD_DEFINED__ */ + + +#ifndef __Pager_FWD_DEFINED__ +#define __Pager_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class Pager Pager; +#else +typedef struct Pager Pager; +#endif /* __cplusplus */ + +#endif /* __Pager_FWD_DEFINED__ */ + + +#ifndef __BrushImage_FWD_DEFINED__ +#define __BrushImage_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class BrushImage BrushImage; +#else +typedef struct BrushImage BrushImage; +#endif /* __cplusplus */ + +#endif /* __BrushImage_FWD_DEFINED__ */ + + +#ifndef __InputBuffer_FWD_DEFINED__ +#define __InputBuffer_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class InputBuffer InputBuffer; +#else +typedef struct InputBuffer InputBuffer; +#endif /* __cplusplus */ + +#endif /* __InputBuffer_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "oaidl.h" +#include "ocidl.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); +void __RPC_USER MIDL_user_free( void __RPC_FAR * ); + +/* interface __MIDL_itf_Inject_0000 */ +/* [local] */ + + + + + + + + + + + + + + +struct ClipParams + { + RECT window; + POINT org; + VARIANT_BOOL visible; + }; + +enum eRenderOptions + { eRenderClipped = 0x1, + eRenderNext = 0x2, + eRenderTransparent = 0x8, + eRenderReformatNext = 0x20 + }; + +enum eFontOptions + { eFontBold = 0x1, + eFontItalic = 0x2, + eFontUnderline = 0x4 + }; + +enum eDefaultControlType + { eCtlButton = 0, + eCtlPager = eCtlButton + 1 + }; + +enum ePositionType + { ePositionByIndex = 0, + ePositionByID = ePositionByIndex + 1 + }; +struct LayerParams + { + long ID; + RECT pos; + long render; + }; +struct ViewParams + { + long icon; + long iconLibrary; + BSTR label; + long left; + long top; + long width; + long height; + long alpha; + }; +struct MouseState + { + ILayer __RPC_FAR *over; + POINT screen; + POINT client; + VARIANT_BOOL ctrl; + VARIANT_BOOL shift; + }; +struct KeyState + { + short vkey; + VARIANT_BOOL ctrl; + VARIANT_BOOL shift; + }; + +enum eMouseInput + { eMouseLeftClick = 0, + eMouseRightClick = eMouseLeftClick + 1, + eMouseLeftDoubleClick = eMouseRightClick + 1, + eMouseRightDoubleClick = eMouseLeftDoubleClick + 1 + }; + +enum eInputStatus + { eInputIdle = 0, + eInputWaiting = eInputIdle + 1, + eInputRunning = eInputWaiting + 1, + eInputPaused = eInputRunning + 1 + }; + + +extern RPC_IF_HANDLE __MIDL_itf_Inject_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_Inject_0000_v0_0_s_ifspec; + +#ifndef __IManager_INTERFACE_DEFINED__ +#define __IManager_INTERFACE_DEFINED__ + +/* interface IManager */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IManager; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("BC63C4A7-BE01-400D-908D-0747B06C8062") + IManager : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadPlugin( + REFCLSID clsidPlugin) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE UnloadPlugin( + REFCLSID clsidPlugin) = 0; + + }; + +#else /* C style interface */ + + typedef struct IManagerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IManager __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IManager __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IManager __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadPlugin )( + IManager __RPC_FAR * This, + REFCLSID clsidPlugin); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *UnloadPlugin )( + IManager __RPC_FAR * This, + REFCLSID clsidPlugin); + + END_INTERFACE + } IManagerVtbl; + + interface IManager + { + CONST_VTBL struct IManagerVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IManager_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IManager_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IManager_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IManager_LoadPlugin(This,clsidPlugin) \ + (This)->lpVtbl -> LoadPlugin(This,clsidPlugin) + +#define IManager_UnloadPlugin(This,clsidPlugin) \ + (This)->lpVtbl -> UnloadPlugin(This,clsidPlugin) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IManager_LoadPlugin_Proxy( + IManager __RPC_FAR * This, + REFCLSID clsidPlugin); + + +void __RPC_STUB IManager_LoadPlugin_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IManager_UnloadPlugin_Proxy( + IManager __RPC_FAR * This, + REFCLSID clsidPlugin); + + +void __RPC_STUB IManager_UnloadPlugin_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IManager_INTERFACE_DEFINED__ */ + + +#ifndef __IPluginSite_INTERFACE_DEFINED__ +#define __IPluginSite_INTERFACE_DEFINED__ + +/* interface IPluginSite */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IPluginSite; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("702D3901-C13A-448e-8871-ECDC8BC8D079") + IPluginSite : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE UnloadPlugin( + long nID) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDirectDraw( + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetPrimarySurface( + /* [retval][out] */ ICanvas __RPC_FAR *__RPC_FAR *ppPrimary) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Get3DDevice( + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadBitmapFile( + BSTR strFilename, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImage) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetIconCache( + LPSIZE psz, + /* [retval][out] */ IIconCache __RPC_FAR *__RPC_FAR *ppCache) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadBitmapPortal( + long nFile, + IImageCache __RPC_FAR *__RPC_FAR *__MIDL_0011) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateFont( + BSTR szFaceName, + long nHeight, + long dwFlags, + /* [retval][out] */ IFontCache __RPC_FAR *__RPC_FAR *ppFont) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetScreenSize( + LPSIZE sz) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateCanvas( + LPSIZE psz, + /* [retval][out] */ ICanvas __RPC_FAR *__RPC_FAR *ppCanvas) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateView( + struct ViewParams __RPC_FAR *pParams, + ILayer __RPC_FAR *pLayer, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadView( + BSTR strSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateBrushImage( + long nColor, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImg) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadImageSchema( + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImg) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateFontSchema( + long nDefHeight, + long nDefOptions, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IFontCache __RPC_FAR *__RPC_FAR *ppCache) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadResourceModule( + BSTR strLibrary, + /* [retval][out] */ long __RPC_FAR *pnModule) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ResourcePath( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Plugin( + BSTR strProgID, + /* [retval][out] */ IPlugin __RPC_FAR *__RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_NetworkFilter( + BSTR strProgID, + /* [retval][out] */ INetworkFilter __RPC_FAR *__RPC_FAR *pVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadViewObject( + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateInputBuffer( + /* [retval][out] */ IInputBuffer __RPC_FAR *__RPC_FAR *ppInput) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_HWND( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Focus( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_OldWndProc( + /* [retval][out] */ long __RPC_FAR *pOldWndProc) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_CurrentSelection( + /* [in] */ long nID) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_CurrentSelection( + /* [retval][out] */ long __RPC_FAR *nID) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_PreviousSelection( + /* [in] */ long nID) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PreviousSelection( + /* [retval][out] */ long __RPC_FAR *nID) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE WriteToChatWindow( + BSTR szText, + /* [defaultvalue][optional] */ long lColor = 0) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetCursorPosition( + long x, + long y) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryKeyboardMap( + BSTR bstrName, + long __RPC_FAR *pAsciiVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPluginSiteVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPluginSite __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPluginSite __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPluginSite __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *UnloadPlugin )( + IPluginSite __RPC_FAR * This, + long nID); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDirectDraw )( + IPluginSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetPrimarySurface )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ ICanvas __RPC_FAR *__RPC_FAR *ppPrimary); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Get3DDevice )( + IPluginSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadBitmapFile )( + IPluginSite __RPC_FAR * This, + BSTR strFilename, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImage); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIconCache )( + IPluginSite __RPC_FAR * This, + LPSIZE psz, + /* [retval][out] */ IIconCache __RPC_FAR *__RPC_FAR *ppCache); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadBitmapPortal )( + IPluginSite __RPC_FAR * This, + long nFile, + IImageCache __RPC_FAR *__RPC_FAR *__MIDL_0011); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateFont )( + IPluginSite __RPC_FAR * This, + BSTR szFaceName, + long nHeight, + long dwFlags, + /* [retval][out] */ IFontCache __RPC_FAR *__RPC_FAR *ppFont); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetScreenSize )( + IPluginSite __RPC_FAR * This, + LPSIZE sz); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateCanvas )( + IPluginSite __RPC_FAR * This, + LPSIZE psz, + /* [retval][out] */ ICanvas __RPC_FAR *__RPC_FAR *ppCanvas); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateView )( + IPluginSite __RPC_FAR * This, + struct ViewParams __RPC_FAR *pParams, + ILayer __RPC_FAR *pLayer, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadView )( + IPluginSite __RPC_FAR * This, + BSTR strSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateBrushImage )( + IPluginSite __RPC_FAR * This, + long nColor, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImg); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadImageSchema )( + IPluginSite __RPC_FAR * This, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImg); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateFontSchema )( + IPluginSite __RPC_FAR * This, + long nDefHeight, + long nDefOptions, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IFontCache __RPC_FAR *__RPC_FAR *ppCache); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadResourceModule )( + IPluginSite __RPC_FAR * This, + BSTR strLibrary, + /* [retval][out] */ long __RPC_FAR *pnModule); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ResourcePath )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Plugin )( + IPluginSite __RPC_FAR * This, + BSTR strProgID, + /* [retval][out] */ IPlugin __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_NetworkFilter )( + IPluginSite __RPC_FAR * This, + BSTR strProgID, + /* [retval][out] */ INetworkFilter __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadViewObject )( + IPluginSite __RPC_FAR * This, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateInputBuffer )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ IInputBuffer __RPC_FAR *__RPC_FAR *ppInput); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_HWND )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Focus )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_OldWndProc )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pOldWndProc); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_CurrentSelection )( + IPluginSite __RPC_FAR * This, + /* [in] */ long nID); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_CurrentSelection )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *nID); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_PreviousSelection )( + IPluginSite __RPC_FAR * This, + /* [in] */ long nID); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_PreviousSelection )( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *nID); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *WriteToChatWindow )( + IPluginSite __RPC_FAR * This, + BSTR szText, + /* [defaultvalue][optional] */ long lColor); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetCursorPosition )( + IPluginSite __RPC_FAR * This, + long x, + long y); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryKeyboardMap )( + IPluginSite __RPC_FAR * This, + BSTR bstrName, + long __RPC_FAR *pAsciiVal); + + END_INTERFACE + } IPluginSiteVtbl; + + interface IPluginSite + { + CONST_VTBL struct IPluginSiteVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPluginSite_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPluginSite_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPluginSite_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPluginSite_UnloadPlugin(This,nID) \ + (This)->lpVtbl -> UnloadPlugin(This,nID) + +#define IPluginSite_GetDirectDraw(This,iid,ppvItf) \ + (This)->lpVtbl -> GetDirectDraw(This,iid,ppvItf) + +#define IPluginSite_GetPrimarySurface(This,ppPrimary) \ + (This)->lpVtbl -> GetPrimarySurface(This,ppPrimary) + +#define IPluginSite_Get3DDevice(This,iid,ppvItf) \ + (This)->lpVtbl -> Get3DDevice(This,iid,ppvItf) + +#define IPluginSite_LoadBitmapFile(This,strFilename,ppImage) \ + (This)->lpVtbl -> LoadBitmapFile(This,strFilename,ppImage) + +#define IPluginSite_GetIconCache(This,psz,ppCache) \ + (This)->lpVtbl -> GetIconCache(This,psz,ppCache) + +#define IPluginSite_LoadBitmapPortal(This,nFile,__MIDL_0011) \ + (This)->lpVtbl -> LoadBitmapPortal(This,nFile,__MIDL_0011) + +#define IPluginSite_CreateFont(This,szFaceName,nHeight,dwFlags,ppFont) \ + (This)->lpVtbl -> CreateFont(This,szFaceName,nHeight,dwFlags,ppFont) + +#define IPluginSite_GetScreenSize(This,sz) \ + (This)->lpVtbl -> GetScreenSize(This,sz) + +#define IPluginSite_CreateCanvas(This,psz,ppCanvas) \ + (This)->lpVtbl -> CreateCanvas(This,psz,ppCanvas) + +#define IPluginSite_CreateView(This,pParams,pLayer,ppView) \ + (This)->lpVtbl -> CreateView(This,pParams,pLayer,ppView) + +#define IPluginSite_LoadView(This,strSchema,ppView) \ + (This)->lpVtbl -> LoadView(This,strSchema,ppView) + +#define IPluginSite_CreateBrushImage(This,nColor,ppImg) \ + (This)->lpVtbl -> CreateBrushImage(This,nColor,ppImg) + +#define IPluginSite_LoadImageSchema(This,pSchema,ppImg) \ + (This)->lpVtbl -> LoadImageSchema(This,pSchema,ppImg) + +#define IPluginSite_CreateFontSchema(This,nDefHeight,nDefOptions,pSchema,ppCache) \ + (This)->lpVtbl -> CreateFontSchema(This,nDefHeight,nDefOptions,pSchema,ppCache) + +#define IPluginSite_LoadResourceModule(This,strLibrary,pnModule) \ + (This)->lpVtbl -> LoadResourceModule(This,strLibrary,pnModule) + +#define IPluginSite_get_ResourcePath(This,pVal) \ + (This)->lpVtbl -> get_ResourcePath(This,pVal) + +#define IPluginSite_get_Plugin(This,strProgID,pVal) \ + (This)->lpVtbl -> get_Plugin(This,strProgID,pVal) + +#define IPluginSite_get_NetworkFilter(This,strProgID,pVal) \ + (This)->lpVtbl -> get_NetworkFilter(This,strProgID,pVal) + +#define IPluginSite_LoadViewObject(This,pSchema,ppView) \ + (This)->lpVtbl -> LoadViewObject(This,pSchema,ppView) + +#define IPluginSite_CreateInputBuffer(This,ppInput) \ + (This)->lpVtbl -> CreateInputBuffer(This,ppInput) + +#define IPluginSite_get_HWND(This,pVal) \ + (This)->lpVtbl -> get_HWND(This,pVal) + +#define IPluginSite_get_Focus(This,pVal) \ + (This)->lpVtbl -> get_Focus(This,pVal) + +#define IPluginSite_get_OldWndProc(This,pOldWndProc) \ + (This)->lpVtbl -> get_OldWndProc(This,pOldWndProc) + +#define IPluginSite_put_CurrentSelection(This,nID) \ + (This)->lpVtbl -> put_CurrentSelection(This,nID) + +#define IPluginSite_get_CurrentSelection(This,nID) \ + (This)->lpVtbl -> get_CurrentSelection(This,nID) + +#define IPluginSite_put_PreviousSelection(This,nID) \ + (This)->lpVtbl -> put_PreviousSelection(This,nID) + +#define IPluginSite_get_PreviousSelection(This,nID) \ + (This)->lpVtbl -> get_PreviousSelection(This,nID) + +#define IPluginSite_WriteToChatWindow(This,szText,lColor) \ + (This)->lpVtbl -> WriteToChatWindow(This,szText,lColor) + +#define IPluginSite_SetCursorPosition(This,x,y) \ + (This)->lpVtbl -> SetCursorPosition(This,x,y) + +#define IPluginSite_QueryKeyboardMap(This,bstrName,pAsciiVal) \ + (This)->lpVtbl -> QueryKeyboardMap(This,bstrName,pAsciiVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_UnloadPlugin_Proxy( + IPluginSite __RPC_FAR * This, + long nID); + + +void __RPC_STUB IPluginSite_UnloadPlugin_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_GetDirectDraw_Proxy( + IPluginSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + +void __RPC_STUB IPluginSite_GetDirectDraw_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_GetPrimarySurface_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ ICanvas __RPC_FAR *__RPC_FAR *ppPrimary); + + +void __RPC_STUB IPluginSite_GetPrimarySurface_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_Get3DDevice_Proxy( + IPluginSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + +void __RPC_STUB IPluginSite_Get3DDevice_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_LoadBitmapFile_Proxy( + IPluginSite __RPC_FAR * This, + BSTR strFilename, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImage); + + +void __RPC_STUB IPluginSite_LoadBitmapFile_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_GetIconCache_Proxy( + IPluginSite __RPC_FAR * This, + LPSIZE psz, + /* [retval][out] */ IIconCache __RPC_FAR *__RPC_FAR *ppCache); + + +void __RPC_STUB IPluginSite_GetIconCache_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_LoadBitmapPortal_Proxy( + IPluginSite __RPC_FAR * This, + long nFile, + IImageCache __RPC_FAR *__RPC_FAR *__MIDL_0011); + + +void __RPC_STUB IPluginSite_LoadBitmapPortal_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_CreateFont_Proxy( + IPluginSite __RPC_FAR * This, + BSTR szFaceName, + long nHeight, + long dwFlags, + /* [retval][out] */ IFontCache __RPC_FAR *__RPC_FAR *ppFont); + + +void __RPC_STUB IPluginSite_CreateFont_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_GetScreenSize_Proxy( + IPluginSite __RPC_FAR * This, + LPSIZE sz); + + +void __RPC_STUB IPluginSite_GetScreenSize_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_CreateCanvas_Proxy( + IPluginSite __RPC_FAR * This, + LPSIZE psz, + /* [retval][out] */ ICanvas __RPC_FAR *__RPC_FAR *ppCanvas); + + +void __RPC_STUB IPluginSite_CreateCanvas_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_CreateView_Proxy( + IPluginSite __RPC_FAR * This, + struct ViewParams __RPC_FAR *pParams, + ILayer __RPC_FAR *pLayer, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + +void __RPC_STUB IPluginSite_CreateView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_LoadView_Proxy( + IPluginSite __RPC_FAR * This, + BSTR strSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + +void __RPC_STUB IPluginSite_LoadView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_CreateBrushImage_Proxy( + IPluginSite __RPC_FAR * This, + long nColor, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImg); + + +void __RPC_STUB IPluginSite_CreateBrushImage_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_LoadImageSchema_Proxy( + IPluginSite __RPC_FAR * This, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IImageCache __RPC_FAR *__RPC_FAR *ppImg); + + +void __RPC_STUB IPluginSite_LoadImageSchema_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_CreateFontSchema_Proxy( + IPluginSite __RPC_FAR * This, + long nDefHeight, + long nDefOptions, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IFontCache __RPC_FAR *__RPC_FAR *ppCache); + + +void __RPC_STUB IPluginSite_CreateFontSchema_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_LoadResourceModule_Proxy( + IPluginSite __RPC_FAR * This, + BSTR strLibrary, + /* [retval][out] */ long __RPC_FAR *pnModule); + + +void __RPC_STUB IPluginSite_LoadResourceModule_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_ResourcePath_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + +void __RPC_STUB IPluginSite_get_ResourcePath_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_Plugin_Proxy( + IPluginSite __RPC_FAR * This, + BSTR strProgID, + /* [retval][out] */ IPlugin __RPC_FAR *__RPC_FAR *pVal); + + +void __RPC_STUB IPluginSite_get_Plugin_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_NetworkFilter_Proxy( + IPluginSite __RPC_FAR * This, + BSTR strProgID, + /* [retval][out] */ INetworkFilter __RPC_FAR *__RPC_FAR *pVal); + + +void __RPC_STUB IPluginSite_get_NetworkFilter_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_LoadViewObject_Proxy( + IPluginSite __RPC_FAR * This, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + +void __RPC_STUB IPluginSite_LoadViewObject_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_CreateInputBuffer_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ IInputBuffer __RPC_FAR *__RPC_FAR *ppInput); + + +void __RPC_STUB IPluginSite_CreateInputBuffer_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_HWND_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IPluginSite_get_HWND_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_Focus_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal); + + +void __RPC_STUB IPluginSite_get_Focus_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_OldWndProc_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pOldWndProc); + + +void __RPC_STUB IPluginSite_get_OldWndProc_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IPluginSite_put_CurrentSelection_Proxy( + IPluginSite __RPC_FAR * This, + /* [in] */ long nID); + + +void __RPC_STUB IPluginSite_put_CurrentSelection_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_CurrentSelection_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *nID); + + +void __RPC_STUB IPluginSite_get_CurrentSelection_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IPluginSite_put_PreviousSelection_Proxy( + IPluginSite __RPC_FAR * This, + /* [in] */ long nID); + + +void __RPC_STUB IPluginSite_put_PreviousSelection_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPluginSite_get_PreviousSelection_Proxy( + IPluginSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *nID); + + +void __RPC_STUB IPluginSite_get_PreviousSelection_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_WriteToChatWindow_Proxy( + IPluginSite __RPC_FAR * This, + BSTR szText, + /* [defaultvalue][optional] */ long lColor); + + +void __RPC_STUB IPluginSite_WriteToChatWindow_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_SetCursorPosition_Proxy( + IPluginSite __RPC_FAR * This, + long x, + long y); + + +void __RPC_STUB IPluginSite_SetCursorPosition_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSite_QueryKeyboardMap_Proxy( + IPluginSite __RPC_FAR * This, + BSTR bstrName, + long __RPC_FAR *pAsciiVal); + + +void __RPC_STUB IPluginSite_QueryKeyboardMap_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IPluginSite_INTERFACE_DEFINED__ */ + + +#ifndef __IPluginSink_INTERFACE_DEFINED__ +#define __IPluginSink_INTERFACE_DEFINED__ + +/* interface IPluginSink */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IPluginSink; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("D216BA6C-D328-4765-B40A-9BC57C96F75E") + IPluginSink : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ChatText( + BSTR bstrMsg, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ChatMessage( + BSTR bstrMsg, + long __RPC_FAR *pColor, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPluginSinkVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPluginSink __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPluginSink __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPluginSink __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ChatText )( + IPluginSink __RPC_FAR * This, + BSTR bstrMsg, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ChatMessage )( + IPluginSink __RPC_FAR * This, + BSTR bstrMsg, + long __RPC_FAR *pColor, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat); + + END_INTERFACE + } IPluginSinkVtbl; + + interface IPluginSink + { + CONST_VTBL struct IPluginSinkVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPluginSink_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPluginSink_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPluginSink_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPluginSink_ChatText(This,bstrMsg,pbEat) \ + (This)->lpVtbl -> ChatText(This,bstrMsg,pbEat) + +#define IPluginSink_ChatMessage(This,bstrMsg,pColor,pbEat) \ + (This)->lpVtbl -> ChatMessage(This,bstrMsg,pColor,pbEat) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSink_ChatText_Proxy( + IPluginSink __RPC_FAR * This, + BSTR bstrMsg, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat); + + +void __RPC_STUB IPluginSink_ChatText_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPluginSink_ChatMessage_Proxy( + IPluginSink __RPC_FAR * This, + BSTR bstrMsg, + long __RPC_FAR *pColor, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat); + + +void __RPC_STUB IPluginSink_ChatMessage_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IPluginSink_INTERFACE_DEFINED__ */ + + +#ifndef __IPlugin_INTERFACE_DEFINED__ +#define __IPlugin_INTERFACE_DEFINED__ + +/* interface IPlugin */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IPlugin; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("BA3E677F-8E44-4829-982E-58BBBC5C5F9B") + IPlugin : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Initialize( + IPluginSite __RPC_FAR *pSite, + long nID) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Terminate( void) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_FriendlyName( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPluginVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPlugin __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPlugin __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPlugin __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Initialize )( + IPlugin __RPC_FAR * This, + IPluginSite __RPC_FAR *pSite, + long nID); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Terminate )( + IPlugin __RPC_FAR * This); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_FriendlyName )( + IPlugin __RPC_FAR * This, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + END_INTERFACE + } IPluginVtbl; + + interface IPlugin + { + CONST_VTBL struct IPluginVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPlugin_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPlugin_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPlugin_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPlugin_Initialize(This,pSite,nID) \ + (This)->lpVtbl -> Initialize(This,pSite,nID) + +#define IPlugin_Terminate(This) \ + (This)->lpVtbl -> Terminate(This) + +#define IPlugin_get_FriendlyName(This,pVal) \ + (This)->lpVtbl -> get_FriendlyName(This,pVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPlugin_Initialize_Proxy( + IPlugin __RPC_FAR * This, + IPluginSite __RPC_FAR *pSite, + long nID); + + +void __RPC_STUB IPlugin_Initialize_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPlugin_Terminate_Proxy( + IPlugin __RPC_FAR * This); + + +void __RPC_STUB IPlugin_Terminate_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPlugin_get_FriendlyName_Proxy( + IPlugin __RPC_FAR * This, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + +void __RPC_STUB IPlugin_get_FriendlyName_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IPlugin_INTERFACE_DEFINED__ */ + + +#ifndef __IControl_INTERFACE_DEFINED__ +#define __IControl_INTERFACE_DEFINED__ + +/* interface IControl */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IControl; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("996B377C-1953-4db1-AAC1-157F72592D3E") + IControl : public IDispatch + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE DestroyChild( + long nIndex, + /* [defaultvalue] */ enum ePositionType posType = ePositionByIndex) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_ID( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_ChildCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Child( + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IControlVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IControl __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IControl __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IControl __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IControl __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IControl __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IControl __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IControl __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DestroyChild )( + IControl __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ID )( + IControl __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ChildCount )( + IControl __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Child )( + IControl __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal); + + END_INTERFACE + } IControlVtbl; + + interface IControl + { + CONST_VTBL struct IControlVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IControl_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IControl_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IControl_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IControl_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IControl_DestroyChild(This,nIndex,posType) \ + (This)->lpVtbl -> DestroyChild(This,nIndex,posType) + +#define IControl_get_ID(This,pVal) \ + (This)->lpVtbl -> get_ID(This,pVal) + +#define IControl_get_ChildCount(This,pVal) \ + (This)->lpVtbl -> get_ChildCount(This,pVal) + +#define IControl_get_Child(This,nIndex,posType,pVal) \ + (This)->lpVtbl -> get_Child(This,nIndex,posType,pVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IControl_DestroyChild_Proxy( + IControl __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType); + + +void __RPC_STUB IControl_DestroyChild_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IControl_get_ID_Proxy( + IControl __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IControl_get_ID_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IControl_get_ChildCount_Proxy( + IControl __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IControl_get_ChildCount_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IControl_get_Child_Proxy( + IControl __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal); + + +void __RPC_STUB IControl_get_Child_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IControl_INTERFACE_DEFINED__ */ + + +#ifndef __ILayer_INTERFACE_DEFINED__ +#define __ILayer_INTERFACE_DEFINED__ + +/* interface ILayer */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayer; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("0D63504F-DEEF-4a2d-9742-28DD1BADDA7C") + ILayer : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LayerCreate( + ILayerSite __RPC_FAR *pSite) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LayerDestroy( void) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Position( + /* [retval][out] */ RECT __RPC_FAR *__RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Position( + /* [in] */ RECT __RPC_FAR *newVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayer __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayer __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayer __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LayerCreate )( + ILayer __RPC_FAR * This, + ILayerSite __RPC_FAR *pSite); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LayerDestroy )( + ILayer __RPC_FAR * This); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Position )( + ILayer __RPC_FAR * This, + /* [retval][out] */ RECT __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Position )( + ILayer __RPC_FAR * This, + /* [in] */ RECT __RPC_FAR *newVal); + + END_INTERFACE + } ILayerVtbl; + + interface ILayer + { + CONST_VTBL struct ILayerVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayer_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayer_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayer_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayer_LayerCreate(This,pSite) \ + (This)->lpVtbl -> LayerCreate(This,pSite) + +#define ILayer_LayerDestroy(This) \ + (This)->lpVtbl -> LayerDestroy(This) + +#define ILayer_get_Position(This,pVal) \ + (This)->lpVtbl -> get_Position(This,pVal) + +#define ILayer_put_Position(This,newVal) \ + (This)->lpVtbl -> put_Position(This,newVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayer_LayerCreate_Proxy( + ILayer __RPC_FAR * This, + ILayerSite __RPC_FAR *pSite); + + +void __RPC_STUB ILayer_LayerCreate_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayer_LayerDestroy_Proxy( + ILayer __RPC_FAR * This); + + +void __RPC_STUB ILayer_LayerDestroy_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayer_get_Position_Proxy( + ILayer __RPC_FAR * This, + /* [retval][out] */ RECT __RPC_FAR *__RPC_FAR *pVal); + + +void __RPC_STUB ILayer_get_Position_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ILayer_put_Position_Proxy( + ILayer __RPC_FAR * This, + /* [in] */ RECT __RPC_FAR *newVal); + + +void __RPC_STUB ILayer_put_Position_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayer_INTERFACE_DEFINED__ */ + + +#ifndef __ILayerRender_INTERFACE_DEFINED__ +#define __ILayerRender_INTERFACE_DEFINED__ + +/* interface ILayerRender */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayerRender; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("D1C71B85-62C2-42a3-AE2E-4BF5A6BE1784") + ILayerRender : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PreRender( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Render( + ICanvas __RPC_FAR *pDest) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Reformat( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AdjustRenderArea( + ICanvas __RPC_FAR *pDest, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE HitTest( + LPPOINT pt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbHit) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerRenderVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayerRender __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayerRender __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayerRender __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PreRender )( + ILayerRender __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Render )( + ILayerRender __RPC_FAR * This, + ICanvas __RPC_FAR *pDest); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reformat )( + ILayerRender __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AdjustRenderArea )( + ILayerRender __RPC_FAR * This, + ICanvas __RPC_FAR *pDest, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HitTest )( + ILayerRender __RPC_FAR * This, + LPPOINT pt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbHit); + + END_INTERFACE + } ILayerRenderVtbl; + + interface ILayerRender + { + CONST_VTBL struct ILayerRenderVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayerRender_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayerRender_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayerRender_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayerRender_PreRender(This) \ + (This)->lpVtbl -> PreRender(This) + +#define ILayerRender_Render(This,pDest) \ + (This)->lpVtbl -> Render(This,pDest) + +#define ILayerRender_Reformat(This) \ + (This)->lpVtbl -> Reformat(This) + +#define ILayerRender_AdjustRenderArea(This,pDest,pbVisible) \ + (This)->lpVtbl -> AdjustRenderArea(This,pDest,pbVisible) + +#define ILayerRender_HitTest(This,pt,pbHit) \ + (This)->lpVtbl -> HitTest(This,pt,pbHit) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerRender_PreRender_Proxy( + ILayerRender __RPC_FAR * This); + + +void __RPC_STUB ILayerRender_PreRender_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerRender_Render_Proxy( + ILayerRender __RPC_FAR * This, + ICanvas __RPC_FAR *pDest); + + +void __RPC_STUB ILayerRender_Render_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerRender_Reformat_Proxy( + ILayerRender __RPC_FAR * This); + + +void __RPC_STUB ILayerRender_Reformat_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerRender_AdjustRenderArea_Proxy( + ILayerRender __RPC_FAR * This, + ICanvas __RPC_FAR *pDest, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + +void __RPC_STUB ILayerRender_AdjustRenderArea_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerRender_HitTest_Proxy( + ILayerRender __RPC_FAR * This, + LPPOINT pt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbHit); + + +void __RPC_STUB ILayerRender_HitTest_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayerRender_INTERFACE_DEFINED__ */ + + +#ifndef __ILayerSite_INTERFACE_DEFINED__ +#define __ILayerSite_INTERFACE_DEFINED__ + +/* interface ILayerSite */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayerSite; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("5B7E9D99-BB3A-475D-842D-43EBEA8284EA") + ILayerSite : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Destroy( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateChild( + struct LayerParams __RPC_FAR *params, + ILayer __RPC_FAR *pSink) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSink( + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Invalidate( void) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PluginSite( + /* [retval][out] */ IPluginSite __RPC_FAR *__RPC_FAR *ppSite) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Reformat( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetParentSink( + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Position( + /* [retval][out] */ LPRECT pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Position( + /* [in] */ LPRECT newVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ID( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ChildCount( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Child( + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ ILayerSite __RPC_FAR *__RPC_FAR *pVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CaptureKeyboard( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE IsChild( + ILayerSite __RPC_FAR *pSite, + /* [defaultvalue][optional] */ VARIANT_BOOL bTestUnclipped, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbIsChild) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Popup( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ScreenPosition( + /* [retval][out] */ LPRECT pVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE StartTimer( + long nID, + long nInterval) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE EndTimer( + long nID) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Transparent( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Transparent( + /* [in] */ VARIANT_BOOL newVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Alpha( + long Alpha) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerSiteVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayerSite __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayerSite __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayerSite __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Destroy )( + ILayerSite __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateChild )( + ILayerSite __RPC_FAR * This, + struct LayerParams __RPC_FAR *params, + ILayer __RPC_FAR *pSink); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSink )( + ILayerSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invalidate )( + ILayerSite __RPC_FAR * This); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_PluginSite )( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ IPluginSite __RPC_FAR *__RPC_FAR *ppSite); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reformat )( + ILayerSite __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetParentSink )( + ILayerSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Position )( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ LPRECT pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Position )( + ILayerSite __RPC_FAR * This, + /* [in] */ LPRECT newVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ID )( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ChildCount )( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Child )( + ILayerSite __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ ILayerSite __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CaptureKeyboard )( + ILayerSite __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *IsChild )( + ILayerSite __RPC_FAR * This, + ILayerSite __RPC_FAR *pSite, + /* [defaultvalue][optional] */ VARIANT_BOOL bTestUnclipped, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbIsChild); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Popup )( + ILayerSite __RPC_FAR * This, + /* [in] */ VARIANT_BOOL newVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ScreenPosition )( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ LPRECT pVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StartTimer )( + ILayerSite __RPC_FAR * This, + long nID, + long nInterval); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *EndTimer )( + ILayerSite __RPC_FAR * This, + long nID); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Transparent )( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Transparent )( + ILayerSite __RPC_FAR * This, + /* [in] */ VARIANT_BOOL newVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Alpha )( + ILayerSite __RPC_FAR * This, + long Alpha); + + END_INTERFACE + } ILayerSiteVtbl; + + interface ILayerSite + { + CONST_VTBL struct ILayerSiteVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayerSite_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayerSite_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayerSite_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayerSite_Destroy(This) \ + (This)->lpVtbl -> Destroy(This) + +#define ILayerSite_CreateChild(This,params,pSink) \ + (This)->lpVtbl -> CreateChild(This,params,pSink) + +#define ILayerSite_GetSink(This,iid,ppvItf) \ + (This)->lpVtbl -> GetSink(This,iid,ppvItf) + +#define ILayerSite_Invalidate(This) \ + (This)->lpVtbl -> Invalidate(This) + +#define ILayerSite_get_PluginSite(This,ppSite) \ + (This)->lpVtbl -> get_PluginSite(This,ppSite) + +#define ILayerSite_Reformat(This) \ + (This)->lpVtbl -> Reformat(This) + +#define ILayerSite_GetParentSink(This,iid,ppvItf) \ + (This)->lpVtbl -> GetParentSink(This,iid,ppvItf) + +#define ILayerSite_get_Position(This,pVal) \ + (This)->lpVtbl -> get_Position(This,pVal) + +#define ILayerSite_put_Position(This,newVal) \ + (This)->lpVtbl -> put_Position(This,newVal) + +#define ILayerSite_get_ID(This,pVal) \ + (This)->lpVtbl -> get_ID(This,pVal) + +#define ILayerSite_get_ChildCount(This,pVal) \ + (This)->lpVtbl -> get_ChildCount(This,pVal) + +#define ILayerSite_get_Child(This,nIndex,posType,pVal) \ + (This)->lpVtbl -> get_Child(This,nIndex,posType,pVal) + +#define ILayerSite_CaptureKeyboard(This) \ + (This)->lpVtbl -> CaptureKeyboard(This) + +#define ILayerSite_IsChild(This,pSite,bTestUnclipped,pbIsChild) \ + (This)->lpVtbl -> IsChild(This,pSite,bTestUnclipped,pbIsChild) + +#define ILayerSite_put_Popup(This,newVal) \ + (This)->lpVtbl -> put_Popup(This,newVal) + +#define ILayerSite_get_ScreenPosition(This,pVal) \ + (This)->lpVtbl -> get_ScreenPosition(This,pVal) + +#define ILayerSite_StartTimer(This,nID,nInterval) \ + (This)->lpVtbl -> StartTimer(This,nID,nInterval) + +#define ILayerSite_EndTimer(This,nID) \ + (This)->lpVtbl -> EndTimer(This,nID) + +#define ILayerSite_get_Transparent(This,pVal) \ + (This)->lpVtbl -> get_Transparent(This,pVal) + +#define ILayerSite_put_Transparent(This,newVal) \ + (This)->lpVtbl -> put_Transparent(This,newVal) + +#define ILayerSite_put_Alpha(This,Alpha) \ + (This)->lpVtbl -> put_Alpha(This,Alpha) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_Destroy_Proxy( + ILayerSite __RPC_FAR * This); + + +void __RPC_STUB ILayerSite_Destroy_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_CreateChild_Proxy( + ILayerSite __RPC_FAR * This, + struct LayerParams __RPC_FAR *params, + ILayer __RPC_FAR *pSink); + + +void __RPC_STUB ILayerSite_CreateChild_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_GetSink_Proxy( + ILayerSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + +void __RPC_STUB ILayerSite_GetSink_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_Invalidate_Proxy( + ILayerSite __RPC_FAR * This); + + +void __RPC_STUB ILayerSite_Invalidate_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayerSite_get_PluginSite_Proxy( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ IPluginSite __RPC_FAR *__RPC_FAR *ppSite); + + +void __RPC_STUB ILayerSite_get_PluginSite_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_Reformat_Proxy( + ILayerSite __RPC_FAR * This); + + +void __RPC_STUB ILayerSite_Reformat_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_GetParentSink_Proxy( + ILayerSite __RPC_FAR * This, + REFIID iid, + /* [iid_is] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + +void __RPC_STUB ILayerSite_GetParentSink_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayerSite_get_Position_Proxy( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ LPRECT pVal); + + +void __RPC_STUB ILayerSite_get_Position_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ILayerSite_put_Position_Proxy( + ILayerSite __RPC_FAR * This, + /* [in] */ LPRECT newVal); + + +void __RPC_STUB ILayerSite_put_Position_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayerSite_get_ID_Proxy( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB ILayerSite_get_ID_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayerSite_get_ChildCount_Proxy( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB ILayerSite_get_ChildCount_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayerSite_get_Child_Proxy( + ILayerSite __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ ILayerSite __RPC_FAR *__RPC_FAR *pVal); + + +void __RPC_STUB ILayerSite_get_Child_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_CaptureKeyboard_Proxy( + ILayerSite __RPC_FAR * This); + + +void __RPC_STUB ILayerSite_CaptureKeyboard_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_IsChild_Proxy( + ILayerSite __RPC_FAR * This, + ILayerSite __RPC_FAR *pSite, + /* [defaultvalue][optional] */ VARIANT_BOOL bTestUnclipped, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbIsChild); + + +void __RPC_STUB ILayerSite_IsChild_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ILayerSite_put_Popup_Proxy( + ILayerSite __RPC_FAR * This, + /* [in] */ VARIANT_BOOL newVal); + + +void __RPC_STUB ILayerSite_put_Popup_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayerSite_get_ScreenPosition_Proxy( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ LPRECT pVal); + + +void __RPC_STUB ILayerSite_get_ScreenPosition_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_StartTimer_Proxy( + ILayerSite __RPC_FAR * This, + long nID, + long nInterval); + + +void __RPC_STUB ILayerSite_StartTimer_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSite_EndTimer_Proxy( + ILayerSite __RPC_FAR * This, + long nID); + + +void __RPC_STUB ILayerSite_EndTimer_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ILayerSite_get_Transparent_Proxy( + ILayerSite __RPC_FAR * This, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal); + + +void __RPC_STUB ILayerSite_get_Transparent_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ILayerSite_put_Transparent_Proxy( + ILayerSite __RPC_FAR * This, + /* [in] */ VARIANT_BOOL newVal); + + +void __RPC_STUB ILayerSite_put_Transparent_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ILayerSite_put_Alpha_Proxy( + ILayerSite __RPC_FAR * This, + long Alpha); + + +void __RPC_STUB ILayerSite_put_Alpha_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayerSite_INTERFACE_DEFINED__ */ + + +#ifndef __IBarManager_INTERFACE_DEFINED__ +#define __IBarManager_INTERFACE_DEFINED__ + +/* interface IBarManager */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IBarManager; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("E4CCDC92-8658-4caa-8955-FB891D5BDCF7") + IBarManager : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AddBar( + long nViewID, + struct ViewParams __RPC_FAR *pParams) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RemoveBar( + long nViewID) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Bar( + long nViewID, + /* [retval][out] */ struct ViewParams __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Bar( + long nViewID, + /* [in] */ struct ViewParams __RPC_FAR *newVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IBarManagerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IBarManager __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IBarManager __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IBarManager __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddBar )( + IBarManager __RPC_FAR * This, + long nViewID, + struct ViewParams __RPC_FAR *pParams); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveBar )( + IBarManager __RPC_FAR * This, + long nViewID); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Bar )( + IBarManager __RPC_FAR * This, + long nViewID, + /* [retval][out] */ struct ViewParams __RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Bar )( + IBarManager __RPC_FAR * This, + long nViewID, + /* [in] */ struct ViewParams __RPC_FAR *newVal); + + END_INTERFACE + } IBarManagerVtbl; + + interface IBarManager + { + CONST_VTBL struct IBarManagerVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IBarManager_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IBarManager_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IBarManager_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IBarManager_AddBar(This,nViewID,pParams) \ + (This)->lpVtbl -> AddBar(This,nViewID,pParams) + +#define IBarManager_RemoveBar(This,nViewID) \ + (This)->lpVtbl -> RemoveBar(This,nViewID) + +#define IBarManager_get_Bar(This,nViewID,pVal) \ + (This)->lpVtbl -> get_Bar(This,nViewID,pVal) + +#define IBarManager_put_Bar(This,nViewID,newVal) \ + (This)->lpVtbl -> put_Bar(This,nViewID,newVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IBarManager_AddBar_Proxy( + IBarManager __RPC_FAR * This, + long nViewID, + struct ViewParams __RPC_FAR *pParams); + + +void __RPC_STUB IBarManager_AddBar_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IBarManager_RemoveBar_Proxy( + IBarManager __RPC_FAR * This, + long nViewID); + + +void __RPC_STUB IBarManager_RemoveBar_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IBarManager_get_Bar_Proxy( + IBarManager __RPC_FAR * This, + long nViewID, + /* [retval][out] */ struct ViewParams __RPC_FAR *pVal); + + +void __RPC_STUB IBarManager_get_Bar_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IBarManager_put_Bar_Proxy( + IBarManager __RPC_FAR * This, + long nViewID, + /* [in] */ struct ViewParams __RPC_FAR *newVal); + + +void __RPC_STUB IBarManager_put_Bar_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IBarManager_INTERFACE_DEFINED__ */ + + +#ifndef __IIconCache_INTERFACE_DEFINED__ +#define __IIconCache_INTERFACE_DEFINED__ + +/* interface IIconCache */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IIconCache; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("DEDCD5AA-F6CA-4DA5-A657-E82F126ABBCD") + IIconCache : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE DrawIcon( + LPPOINT ppt, + long nFile, + long nModule, + ICanvas __RPC_FAR *pTarget) = 0; + + }; + +#else /* C style interface */ + + typedef struct IIconCacheVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IIconCache __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IIconCache __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IIconCache __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DrawIcon )( + IIconCache __RPC_FAR * This, + LPPOINT ppt, + long nFile, + long nModule, + ICanvas __RPC_FAR *pTarget); + + END_INTERFACE + } IIconCacheVtbl; + + interface IIconCache + { + CONST_VTBL struct IIconCacheVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IIconCache_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IIconCache_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IIconCache_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IIconCache_DrawIcon(This,ppt,nFile,nModule,pTarget) \ + (This)->lpVtbl -> DrawIcon(This,ppt,nFile,nModule,pTarget) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IIconCache_DrawIcon_Proxy( + IIconCache __RPC_FAR * This, + LPPOINT ppt, + long nFile, + long nModule, + ICanvas __RPC_FAR *pTarget); + + +void __RPC_STUB IIconCache_DrawIcon_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IIconCache_INTERFACE_DEFINED__ */ + + +#ifndef __IImageCacheDisp_INTERFACE_DEFINED__ +#define __IImageCacheDisp_INTERFACE_DEFINED__ + +/* interface IImageCacheDisp */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IImageCacheDisp; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("F88548BC-D11E-4ac2-9A27-3607004D359F") + IImageCacheDisp : public IDispatch + { + public: + }; + +#else /* C style interface */ + + typedef struct IImageCacheDispVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IImageCacheDisp __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IImageCacheDisp __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IImageCacheDisp __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IImageCacheDisp __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IImageCacheDisp __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IImageCacheDisp __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IImageCacheDisp __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } IImageCacheDispVtbl; + + interface IImageCacheDisp + { + CONST_VTBL struct IImageCacheDispVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IImageCacheDisp_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IImageCacheDisp_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IImageCacheDisp_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IImageCacheDisp_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IImageCacheDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IImageCacheDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IImageCacheDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IImageCacheDisp_INTERFACE_DEFINED__ */ + + +#ifndef __IImageCache_INTERFACE_DEFINED__ +#define __IImageCache_INTERFACE_DEFINED__ + +/* interface IImageCache */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IImageCache; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("BE566CEC-6881-481C-A146-9F5A32576BE6") + IImageCache : public IImageCacheDisp + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PatBlt( + ICanvas __RPC_FAR *pDest, + LPRECT prcDest, + LPPOINT ptOrigin) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE StretchBlt( + ICanvas __RPC_FAR *pDest, + LPPOINT pptDest, + long nWidth, + long nStartStretch, + long nEndStretch) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Blt( + LPRECT rcSrc, + ICanvas __RPC_FAR *pDest, + LPPOINT pptDest) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Size( + /* [retval][out] */ SIZE __RPC_FAR *pVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IImageCacheVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IImageCache __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IImageCache __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IImageCache __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IImageCache __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IImageCache __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IImageCache __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IImageCache __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PatBlt )( + IImageCache __RPC_FAR * This, + ICanvas __RPC_FAR *pDest, + LPRECT prcDest, + LPPOINT ptOrigin); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *StretchBlt )( + IImageCache __RPC_FAR * This, + ICanvas __RPC_FAR *pDest, + LPPOINT pptDest, + long nWidth, + long nStartStretch, + long nEndStretch); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Blt )( + IImageCache __RPC_FAR * This, + LPRECT rcSrc, + ICanvas __RPC_FAR *pDest, + LPPOINT pptDest); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Size )( + IImageCache __RPC_FAR * This, + /* [retval][out] */ SIZE __RPC_FAR *pVal); + + END_INTERFACE + } IImageCacheVtbl; + + interface IImageCache + { + CONST_VTBL struct IImageCacheVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IImageCache_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IImageCache_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IImageCache_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IImageCache_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IImageCache_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IImageCache_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IImageCache_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + + +#define IImageCache_PatBlt(This,pDest,prcDest,ptOrigin) \ + (This)->lpVtbl -> PatBlt(This,pDest,prcDest,ptOrigin) + +#define IImageCache_StretchBlt(This,pDest,pptDest,nWidth,nStartStretch,nEndStretch) \ + (This)->lpVtbl -> StretchBlt(This,pDest,pptDest,nWidth,nStartStretch,nEndStretch) + +#define IImageCache_Blt(This,rcSrc,pDest,pptDest) \ + (This)->lpVtbl -> Blt(This,rcSrc,pDest,pptDest) + +#define IImageCache_get_Size(This,pVal) \ + (This)->lpVtbl -> get_Size(This,pVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IImageCache_PatBlt_Proxy( + IImageCache __RPC_FAR * This, + ICanvas __RPC_FAR *pDest, + LPRECT prcDest, + LPPOINT ptOrigin); + + +void __RPC_STUB IImageCache_PatBlt_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IImageCache_StretchBlt_Proxy( + IImageCache __RPC_FAR * This, + ICanvas __RPC_FAR *pDest, + LPPOINT pptDest, + long nWidth, + long nStartStretch, + long nEndStretch); + + +void __RPC_STUB IImageCache_StretchBlt_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IImageCache_Blt_Proxy( + IImageCache __RPC_FAR * This, + LPRECT rcSrc, + ICanvas __RPC_FAR *pDest, + LPPOINT pptDest); + + +void __RPC_STUB IImageCache_Blt_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IImageCache_get_Size_Proxy( + IImageCache __RPC_FAR * This, + /* [retval][out] */ SIZE __RPC_FAR *pVal); + + +void __RPC_STUB IImageCache_get_Size_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IImageCache_INTERFACE_DEFINED__ */ + + +#ifndef __IFontCacheDisp_INTERFACE_DEFINED__ +#define __IFontCacheDisp_INTERFACE_DEFINED__ + +/* interface IFontCacheDisp */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IFontCacheDisp; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("9394E96D-2B29-4c29-AF3E-DB5C476122DB") + IFontCacheDisp : public IDispatch + { + public: + }; + +#else /* C style interface */ + + typedef struct IFontCacheDispVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IFontCacheDisp __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IFontCacheDisp __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IFontCacheDisp __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IFontCacheDisp __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IFontCacheDisp __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IFontCacheDisp __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IFontCacheDisp __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } IFontCacheDispVtbl; + + interface IFontCacheDisp + { + CONST_VTBL struct IFontCacheDispVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IFontCacheDisp_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IFontCacheDisp_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IFontCacheDisp_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IFontCacheDisp_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IFontCacheDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IFontCacheDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IFontCacheDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IFontCacheDisp_INTERFACE_DEFINED__ */ + + +#ifndef __IFontCache_INTERFACE_DEFINED__ +#define __IFontCache_INTERFACE_DEFINED__ + +/* interface IFontCache */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IFontCache; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("12ECCB0F-36A6-451C-B086-1306B74AAEC2") + IFontCache : public IFontCacheDisp + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE DrawText( + LPPOINT pt, + BSTR szText, + long clr, + ICanvas __RPC_FAR *pTarget) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MeasureText( + BSTR szText, + /* [retval][out] */ LPSIZE pszExt) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE HitTest( + BSTR szText, + long nPos, + /* [retval][out] */ long __RPC_FAR *nIndex) = 0; + + }; + +#else /* C style interface */ + + typedef struct IFontCacheVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IFontCache __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IFontCache __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IFontCache __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IFontCache __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IFontCache __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IFontCache __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IFontCache __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DrawText )( + IFontCache __RPC_FAR * This, + LPPOINT pt, + BSTR szText, + long clr, + ICanvas __RPC_FAR *pTarget); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MeasureText )( + IFontCache __RPC_FAR * This, + BSTR szText, + /* [retval][out] */ LPSIZE pszExt); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HitTest )( + IFontCache __RPC_FAR * This, + BSTR szText, + long nPos, + /* [retval][out] */ long __RPC_FAR *nIndex); + + END_INTERFACE + } IFontCacheVtbl; + + interface IFontCache + { + CONST_VTBL struct IFontCacheVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IFontCache_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IFontCache_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IFontCache_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IFontCache_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IFontCache_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IFontCache_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IFontCache_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + + +#define IFontCache_DrawText(This,pt,szText,clr,pTarget) \ + (This)->lpVtbl -> DrawText(This,pt,szText,clr,pTarget) + +#define IFontCache_MeasureText(This,szText,pszExt) \ + (This)->lpVtbl -> MeasureText(This,szText,pszExt) + +#define IFontCache_HitTest(This,szText,nPos,nIndex) \ + (This)->lpVtbl -> HitTest(This,szText,nPos,nIndex) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IFontCache_DrawText_Proxy( + IFontCache __RPC_FAR * This, + LPPOINT pt, + BSTR szText, + long clr, + ICanvas __RPC_FAR *pTarget); + + +void __RPC_STUB IFontCache_DrawText_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IFontCache_MeasureText_Proxy( + IFontCache __RPC_FAR * This, + BSTR szText, + /* [retval][out] */ LPSIZE pszExt); + + +void __RPC_STUB IFontCache_MeasureText_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IFontCache_HitTest_Proxy( + IFontCache __RPC_FAR * This, + BSTR szText, + long nPos, + /* [retval][out] */ long __RPC_FAR *nIndex); + + +void __RPC_STUB IFontCache_HitTest_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IFontCache_INTERFACE_DEFINED__ */ + + +#ifndef __ISimpleBar_INTERFACE_DEFINED__ +#define __ISimpleBar_INTERFACE_DEFINED__ + +/* interface ISimpleBar */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ISimpleBar; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("4A2D87CD-BFB4-4723-B959-FFF3FDD49278") + ISimpleBar : public IUnknown + { + public: + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_RenderWidth( + /* [retval][out] */ long __RPC_FAR *nWidth) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Params( + /* [retval][out] */ struct ViewParams __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Params( + /* [in] */ struct ViewParams __RPC_FAR *newVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct ISimpleBarVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ISimpleBar __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ISimpleBar __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ISimpleBar __RPC_FAR * This); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_RenderWidth )( + ISimpleBar __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *nWidth); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Params )( + ISimpleBar __RPC_FAR * This, + /* [retval][out] */ struct ViewParams __RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Params )( + ISimpleBar __RPC_FAR * This, + /* [in] */ struct ViewParams __RPC_FAR *newVal); + + END_INTERFACE + } ISimpleBarVtbl; + + interface ISimpleBar + { + CONST_VTBL struct ISimpleBarVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ISimpleBar_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ISimpleBar_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ISimpleBar_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ISimpleBar_get_RenderWidth(This,nWidth) \ + (This)->lpVtbl -> get_RenderWidth(This,nWidth) + +#define ISimpleBar_get_Params(This,pVal) \ + (This)->lpVtbl -> get_Params(This,pVal) + +#define ISimpleBar_put_Params(This,newVal) \ + (This)->lpVtbl -> put_Params(This,newVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ISimpleBar_get_RenderWidth_Proxy( + ISimpleBar __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *nWidth); + + +void __RPC_STUB ISimpleBar_get_RenderWidth_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ISimpleBar_get_Params_Proxy( + ISimpleBar __RPC_FAR * This, + /* [retval][out] */ struct ViewParams __RPC_FAR *pVal); + + +void __RPC_STUB ISimpleBar_get_Params_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ISimpleBar_put_Params_Proxy( + ISimpleBar __RPC_FAR * This, + /* [in] */ struct ViewParams __RPC_FAR *newVal); + + +void __RPC_STUB ISimpleBar_put_Params_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ISimpleBar_INTERFACE_DEFINED__ */ + + +#ifndef __ILayerMouse_INTERFACE_DEFINED__ +#define __ILayerMouse_INTERFACE_DEFINED__ + +/* interface ILayerMouse */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayerMouse; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("5014E0B2-9156-412c-946D-9D4BAA9F4C51") + ILayerMouse : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MouseEnter( + struct MouseState __RPC_FAR *pMouse) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MouseExit( + struct MouseState __RPC_FAR *pMouse) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MouseDown( + struct MouseState __RPC_FAR *pMouse) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MouseUp( + struct MouseState __RPC_FAR *pMouse) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MouseMove( + struct MouseState __RPC_FAR *pMouse) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MouseDblClk( + struct MouseState __RPC_FAR *pMouse) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE MouseEvent( + long nMsg, + long wParam, + long lParam) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerMouseVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayerMouse __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayerMouse __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayerMouse __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseEnter )( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseExit )( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseDown )( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseUp )( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseMove )( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseDblClk )( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseEvent )( + ILayerMouse __RPC_FAR * This, + long nMsg, + long wParam, + long lParam); + + END_INTERFACE + } ILayerMouseVtbl; + + interface ILayerMouse + { + CONST_VTBL struct ILayerMouseVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayerMouse_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayerMouse_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayerMouse_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayerMouse_MouseEnter(This,pMouse) \ + (This)->lpVtbl -> MouseEnter(This,pMouse) + +#define ILayerMouse_MouseExit(This,pMouse) \ + (This)->lpVtbl -> MouseExit(This,pMouse) + +#define ILayerMouse_MouseDown(This,pMouse) \ + (This)->lpVtbl -> MouseDown(This,pMouse) + +#define ILayerMouse_MouseUp(This,pMouse) \ + (This)->lpVtbl -> MouseUp(This,pMouse) + +#define ILayerMouse_MouseMove(This,pMouse) \ + (This)->lpVtbl -> MouseMove(This,pMouse) + +#define ILayerMouse_MouseDblClk(This,pMouse) \ + (This)->lpVtbl -> MouseDblClk(This,pMouse) + +#define ILayerMouse_MouseEvent(This,nMsg,wParam,lParam) \ + (This)->lpVtbl -> MouseEvent(This,nMsg,wParam,lParam) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerMouse_MouseEnter_Proxy( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + +void __RPC_STUB ILayerMouse_MouseEnter_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerMouse_MouseExit_Proxy( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + +void __RPC_STUB ILayerMouse_MouseExit_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerMouse_MouseDown_Proxy( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + +void __RPC_STUB ILayerMouse_MouseDown_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerMouse_MouseUp_Proxy( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + +void __RPC_STUB ILayerMouse_MouseUp_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerMouse_MouseMove_Proxy( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + +void __RPC_STUB ILayerMouse_MouseMove_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerMouse_MouseDblClk_Proxy( + ILayerMouse __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse); + + +void __RPC_STUB ILayerMouse_MouseDblClk_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerMouse_MouseEvent_Proxy( + ILayerMouse __RPC_FAR * This, + long nMsg, + long wParam, + long lParam); + + +void __RPC_STUB ILayerMouse_MouseEvent_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayerMouse_INTERFACE_DEFINED__ */ + + +#ifndef __ILayerSchema_INTERFACE_DEFINED__ +#define __ILayerSchema_INTERFACE_DEFINED__ + +/* interface ILayerSchema */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayerSchema; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("829E0FB2-D0B5-4814-BCF9-6ECFA06C9AED") + ILayerSchema : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SchemaLoad( + IView __RPC_FAR *pView, + IUnknown __RPC_FAR *pXMLSchema) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerSchemaVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayerSchema __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayerSchema __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayerSchema __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SchemaLoad )( + ILayerSchema __RPC_FAR * This, + IView __RPC_FAR *pView, + IUnknown __RPC_FAR *pXMLSchema); + + END_INTERFACE + } ILayerSchemaVtbl; + + interface ILayerSchema + { + CONST_VTBL struct ILayerSchemaVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayerSchema_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayerSchema_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayerSchema_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayerSchema_SchemaLoad(This,pView,pXMLSchema) \ + (This)->lpVtbl -> SchemaLoad(This,pView,pXMLSchema) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerSchema_SchemaLoad_Proxy( + ILayerSchema __RPC_FAR * This, + IView __RPC_FAR *pView, + IUnknown __RPC_FAR *pXMLSchema); + + +void __RPC_STUB ILayerSchema_SchemaLoad_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayerSchema_INTERFACE_DEFINED__ */ + + +#ifndef __IButton_INTERFACE_DEFINED__ +#define __IButton_INTERFACE_DEFINED__ + +/* interface IButton */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IButton; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("0F5765A4-9F83-4077-8884-6CBDDCE348F7") + IButton : public IControl + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetImages( + long nModule, + long nReleased, + long nPressed) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Matte( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Matte( + /* [in] */ long newVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IButtonVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IButton __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IButton __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IButton __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IButton __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IButton __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IButton __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IButton __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DestroyChild )( + IButton __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ID )( + IButton __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ChildCount )( + IButton __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Child )( + IButton __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetImages )( + IButton __RPC_FAR * This, + long nModule, + long nReleased, + long nPressed); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Matte )( + IButton __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Matte )( + IButton __RPC_FAR * This, + /* [in] */ long newVal); + + END_INTERFACE + } IButtonVtbl; + + interface IButton + { + CONST_VTBL struct IButtonVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IButton_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IButton_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IButton_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IButton_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IButton_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IButton_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IButton_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IButton_DestroyChild(This,nIndex,posType) \ + (This)->lpVtbl -> DestroyChild(This,nIndex,posType) + +#define IButton_get_ID(This,pVal) \ + (This)->lpVtbl -> get_ID(This,pVal) + +#define IButton_get_ChildCount(This,pVal) \ + (This)->lpVtbl -> get_ChildCount(This,pVal) + +#define IButton_get_Child(This,nIndex,posType,pVal) \ + (This)->lpVtbl -> get_Child(This,nIndex,posType,pVal) + + +#define IButton_SetImages(This,nModule,nReleased,nPressed) \ + (This)->lpVtbl -> SetImages(This,nModule,nReleased,nPressed) + +#define IButton_get_Matte(This,pVal) \ + (This)->lpVtbl -> get_Matte(This,pVal) + +#define IButton_put_Matte(This,newVal) \ + (This)->lpVtbl -> put_Matte(This,newVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IButton_SetImages_Proxy( + IButton __RPC_FAR * This, + long nModule, + long nReleased, + long nPressed); + + +void __RPC_STUB IButton_SetImages_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IButton_get_Matte_Proxy( + IButton __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IButton_get_Matte_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IButton_put_Matte_Proxy( + IButton __RPC_FAR * This, + /* [in] */ long newVal); + + +void __RPC_STUB IButton_put_Matte_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IButton_INTERFACE_DEFINED__ */ + + +#ifndef __IPager_INTERFACE_DEFINED__ +#define __IPager_INTERFACE_DEFINED__ + +/* interface IPager */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IPager; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("BD9FC464-C0D8-4823-8255-E818F8836B08") + IPager : public IControl + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE FinishCommand( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ScrollTo( + LPPOINT ppt) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Command( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Command( + /* [in] */ long newVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Offset( + /* [retval][out] */ LPPOINT pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Offset( + /* [in] */ LPPOINT newVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateClient( + ILayer __RPC_FAR *pLayer) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPagerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPager __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPager __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPager __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IPager __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IPager __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IPager __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IPager __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DestroyChild )( + IPager __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ID )( + IPager __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ChildCount )( + IPager __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Child )( + IPager __RPC_FAR * This, + long nIndex, + /* [defaultvalue] */ enum ePositionType posType, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *FinishCommand )( + IPager __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ScrollTo )( + IPager __RPC_FAR * This, + LPPOINT ppt); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Command )( + IPager __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Command )( + IPager __RPC_FAR * This, + /* [in] */ long newVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Offset )( + IPager __RPC_FAR * This, + /* [retval][out] */ LPPOINT pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Offset )( + IPager __RPC_FAR * This, + /* [in] */ LPPOINT newVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateClient )( + IPager __RPC_FAR * This, + ILayer __RPC_FAR *pLayer); + + END_INTERFACE + } IPagerVtbl; + + interface IPager + { + CONST_VTBL struct IPagerVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPager_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPager_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPager_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPager_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IPager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IPager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IPager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IPager_DestroyChild(This,nIndex,posType) \ + (This)->lpVtbl -> DestroyChild(This,nIndex,posType) + +#define IPager_get_ID(This,pVal) \ + (This)->lpVtbl -> get_ID(This,pVal) + +#define IPager_get_ChildCount(This,pVal) \ + (This)->lpVtbl -> get_ChildCount(This,pVal) + +#define IPager_get_Child(This,nIndex,posType,pVal) \ + (This)->lpVtbl -> get_Child(This,nIndex,posType,pVal) + + +#define IPager_FinishCommand(This) \ + (This)->lpVtbl -> FinishCommand(This) + +#define IPager_ScrollTo(This,ppt) \ + (This)->lpVtbl -> ScrollTo(This,ppt) + +#define IPager_get_Command(This,pVal) \ + (This)->lpVtbl -> get_Command(This,pVal) + +#define IPager_put_Command(This,newVal) \ + (This)->lpVtbl -> put_Command(This,newVal) + +#define IPager_get_Offset(This,pVal) \ + (This)->lpVtbl -> get_Offset(This,pVal) + +#define IPager_put_Offset(This,newVal) \ + (This)->lpVtbl -> put_Offset(This,newVal) + +#define IPager_CreateClient(This,pLayer) \ + (This)->lpVtbl -> CreateClient(This,pLayer) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPager_FinishCommand_Proxy( + IPager __RPC_FAR * This); + + +void __RPC_STUB IPager_FinishCommand_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPager_ScrollTo_Proxy( + IPager __RPC_FAR * This, + LPPOINT ppt); + + +void __RPC_STUB IPager_ScrollTo_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPager_get_Command_Proxy( + IPager __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IPager_get_Command_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IPager_put_Command_Proxy( + IPager __RPC_FAR * This, + /* [in] */ long newVal); + + +void __RPC_STUB IPager_put_Command_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPager_get_Offset_Proxy( + IPager __RPC_FAR * This, + /* [retval][out] */ LPPOINT pVal); + + +void __RPC_STUB IPager_get_Offset_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IPager_put_Offset_Proxy( + IPager __RPC_FAR * This, + /* [in] */ LPPOINT newVal); + + +void __RPC_STUB IPager_put_Offset_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPager_CreateClient_Proxy( + IPager __RPC_FAR * This, + ILayer __RPC_FAR *pLayer); + + +void __RPC_STUB IPager_CreateClient_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IPager_INTERFACE_DEFINED__ */ + + +#ifndef __IPanel_INTERFACE_DEFINED__ +#define __IPanel_INTERFACE_DEFINED__ + +/* interface IPanel */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IPanel; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("2B52B5CB-9E10-4238-8F62-A501406E3EAB") + IPanel : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AddView( + long nViewID, + ILayer __RPC_FAR *pLayer) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ActivateView( + long nViewID, + struct ViewParams __RPC_FAR *pParams, + long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RemoveView( + long nViewID) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ActiveView( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadView( + long nViewID, + IView __RPC_FAR *pView, + IUnknown __RPC_FAR *pSchema) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Deactivate( void) = 0; + + virtual /* [helpstring][propputref] */ HRESULT STDMETHODCALLTYPE putref_Sink( + /* [in] */ IPanelSink __RPC_FAR *newVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPanelVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPanel __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPanel __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPanel __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddView )( + IPanel __RPC_FAR * This, + long nViewID, + ILayer __RPC_FAR *pLayer); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ActivateView )( + IPanel __RPC_FAR * This, + long nViewID, + struct ViewParams __RPC_FAR *pParams, + long __RPC_FAR *pVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveView )( + IPanel __RPC_FAR * This, + long nViewID); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_ActiveView )( + IPanel __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadView )( + IPanel __RPC_FAR * This, + long nViewID, + IView __RPC_FAR *pView, + IUnknown __RPC_FAR *pSchema); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Deactivate )( + IPanel __RPC_FAR * This); + + /* [helpstring][propputref] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *putref_Sink )( + IPanel __RPC_FAR * This, + /* [in] */ IPanelSink __RPC_FAR *newVal); + + END_INTERFACE + } IPanelVtbl; + + interface IPanel + { + CONST_VTBL struct IPanelVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPanel_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPanel_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPanel_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPanel_AddView(This,nViewID,pLayer) \ + (This)->lpVtbl -> AddView(This,nViewID,pLayer) + +#define IPanel_ActivateView(This,nViewID,pParams,pVal) \ + (This)->lpVtbl -> ActivateView(This,nViewID,pParams,pVal) + +#define IPanel_RemoveView(This,nViewID) \ + (This)->lpVtbl -> RemoveView(This,nViewID) + +#define IPanel_get_ActiveView(This,pVal) \ + (This)->lpVtbl -> get_ActiveView(This,pVal) + +#define IPanel_LoadView(This,nViewID,pView,pSchema) \ + (This)->lpVtbl -> LoadView(This,nViewID,pView,pSchema) + +#define IPanel_Deactivate(This) \ + (This)->lpVtbl -> Deactivate(This) + +#define IPanel_putref_Sink(This,newVal) \ + (This)->lpVtbl -> putref_Sink(This,newVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPanel_AddView_Proxy( + IPanel __RPC_FAR * This, + long nViewID, + ILayer __RPC_FAR *pLayer); + + +void __RPC_STUB IPanel_AddView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPanel_ActivateView_Proxy( + IPanel __RPC_FAR * This, + long nViewID, + struct ViewParams __RPC_FAR *pParams, + long __RPC_FAR *pVal); + + +void __RPC_STUB IPanel_ActivateView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPanel_RemoveView_Proxy( + IPanel __RPC_FAR * This, + long nViewID); + + +void __RPC_STUB IPanel_RemoveView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IPanel_get_ActiveView_Proxy( + IPanel __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IPanel_get_ActiveView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPanel_LoadView_Proxy( + IPanel __RPC_FAR * This, + long nViewID, + IView __RPC_FAR *pView, + IUnknown __RPC_FAR *pSchema); + + +void __RPC_STUB IPanel_LoadView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPanel_Deactivate_Proxy( + IPanel __RPC_FAR * This); + + +void __RPC_STUB IPanel_Deactivate_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propputref] */ HRESULT STDMETHODCALLTYPE IPanel_putref_Sink_Proxy( + IPanel __RPC_FAR * This, + /* [in] */ IPanelSink __RPC_FAR *newVal); + + +void __RPC_STUB IPanel_putref_Sink_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IPanel_INTERFACE_DEFINED__ */ + + +#ifndef __IPanelSink_INTERFACE_DEFINED__ +#define __IPanelSink_INTERFACE_DEFINED__ + +/* interface IPanelSink */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IPanelSink; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("85D70924-917D-41bb-995D-C40E6AB21C71") + IPanelSink : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PanelDeactivate( + long nViewID) = 0; + + }; + +#else /* C style interface */ + + typedef struct IPanelSinkVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPanelSink __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPanelSink __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPanelSink __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PanelDeactivate )( + IPanelSink __RPC_FAR * This, + long nViewID); + + END_INTERFACE + } IPanelSinkVtbl; + + interface IPanelSink + { + CONST_VTBL struct IPanelSinkVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPanelSink_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPanelSink_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPanelSink_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPanelSink_PanelDeactivate(This,nViewID) \ + (This)->lpVtbl -> PanelDeactivate(This,nViewID) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IPanelSink_PanelDeactivate_Proxy( + IPanelSink __RPC_FAR * This, + long nViewID); + + +void __RPC_STUB IPanelSink_PanelDeactivate_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IPanelSink_INTERFACE_DEFINED__ */ + + +#ifndef __ICanvas_INTERFACE_DEFINED__ +#define __ICanvas_INTERFACE_DEFINED__ + +/* interface ICanvas */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ICanvas; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("9241862D-BA71-4317-8166-3A3E61CE3E5F") + ICanvas : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PushClipRect( + LPRECT prc, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PopClipRect( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDC( + /* [retval][out] */ HDC __RPC_FAR *pdc) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ReleaseDC( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetSurface( + REFIID iid, + /* [iid_is][retval][out] */ void __RPC_FAR *__RPC_FAR *ppvItf) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Fill( + LPRECT prc, + long nRGB) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Frame( + LPRECT prc, + long nRGB) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetClipParams( + /* [retval][out] */ struct ClipParams __RPC_FAR *pParams) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_WasLost( + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Size( + /* [retval][out] */ LPSIZE pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Size( + /* [in] */ LPSIZE newVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Blt( + LPRECT prcSrc, + ICanvas __RPC_FAR *pSrc, + LPPOINT pptDest) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE HitTest( + LPPOINT ppt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbHit) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ToClient( + /* [out][in] */ LPPOINT pt) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE ToScreen( + /* [out][in] */ LPPOINT ppt) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OffsetOrg( + LPPOINT ppt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetClipRect( + LPRECT prcClip, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Alpha( + long Alpha) = 0; + + }; + +#else /* C style interface */ + + typedef struct ICanvasVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ICanvas __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ICanvas __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ICanvas __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PushClipRect )( + ICanvas __RPC_FAR * This, + LPRECT prc, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PopClipRect )( + ICanvas __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetDC )( + ICanvas __RPC_FAR * This, + /* [retval][out] */ HDC __RPC_FAR *pdc); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ReleaseDC )( + ICanvas __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetSurface )( + ICanvas __RPC_FAR * This, + REFIID iid, + /* [iid_is][retval][out] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Fill )( + ICanvas __RPC_FAR * This, + LPRECT prc, + long nRGB); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Frame )( + ICanvas __RPC_FAR * This, + LPRECT prc, + long nRGB); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetClipParams )( + ICanvas __RPC_FAR * This, + /* [retval][out] */ struct ClipParams __RPC_FAR *pParams); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_WasLost )( + ICanvas __RPC_FAR * This, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Size )( + ICanvas __RPC_FAR * This, + /* [retval][out] */ LPSIZE pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Size )( + ICanvas __RPC_FAR * This, + /* [in] */ LPSIZE newVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Blt )( + ICanvas __RPC_FAR * This, + LPRECT prcSrc, + ICanvas __RPC_FAR *pSrc, + LPPOINT pptDest); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HitTest )( + ICanvas __RPC_FAR * This, + LPPOINT ppt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbHit); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ToClient )( + ICanvas __RPC_FAR * This, + /* [out][in] */ LPPOINT pt); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ToScreen )( + ICanvas __RPC_FAR * This, + /* [out][in] */ LPPOINT ppt); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OffsetOrg )( + ICanvas __RPC_FAR * This, + LPPOINT ppt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetClipRect )( + ICanvas __RPC_FAR * This, + LPRECT prcClip, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Alpha )( + ICanvas __RPC_FAR * This, + long Alpha); + + END_INTERFACE + } ICanvasVtbl; + + interface ICanvas + { + CONST_VTBL struct ICanvasVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ICanvas_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ICanvas_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ICanvas_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ICanvas_PushClipRect(This,prc,pbVisible) \ + (This)->lpVtbl -> PushClipRect(This,prc,pbVisible) + +#define ICanvas_PopClipRect(This) \ + (This)->lpVtbl -> PopClipRect(This) + +#define ICanvas_GetDC(This,pdc) \ + (This)->lpVtbl -> GetDC(This,pdc) + +#define ICanvas_ReleaseDC(This) \ + (This)->lpVtbl -> ReleaseDC(This) + +#define ICanvas_GetSurface(This,iid,ppvItf) \ + (This)->lpVtbl -> GetSurface(This,iid,ppvItf) + +#define ICanvas_Fill(This,prc,nRGB) \ + (This)->lpVtbl -> Fill(This,prc,nRGB) + +#define ICanvas_Frame(This,prc,nRGB) \ + (This)->lpVtbl -> Frame(This,prc,nRGB) + +#define ICanvas_GetClipParams(This,pParams) \ + (This)->lpVtbl -> GetClipParams(This,pParams) + +#define ICanvas_get_WasLost(This,pVal) \ + (This)->lpVtbl -> get_WasLost(This,pVal) + +#define ICanvas_get_Size(This,pVal) \ + (This)->lpVtbl -> get_Size(This,pVal) + +#define ICanvas_put_Size(This,newVal) \ + (This)->lpVtbl -> put_Size(This,newVal) + +#define ICanvas_Blt(This,prcSrc,pSrc,pptDest) \ + (This)->lpVtbl -> Blt(This,prcSrc,pSrc,pptDest) + +#define ICanvas_HitTest(This,ppt,pbHit) \ + (This)->lpVtbl -> HitTest(This,ppt,pbHit) + +#define ICanvas_ToClient(This,pt) \ + (This)->lpVtbl -> ToClient(This,pt) + +#define ICanvas_ToScreen(This,ppt) \ + (This)->lpVtbl -> ToScreen(This,ppt) + +#define ICanvas_OffsetOrg(This,ppt,pbVisible) \ + (This)->lpVtbl -> OffsetOrg(This,ppt,pbVisible) + +#define ICanvas_SetClipRect(This,prcClip,pbVisible) \ + (This)->lpVtbl -> SetClipRect(This,prcClip,pbVisible) + +#define ICanvas_put_Alpha(This,Alpha) \ + (This)->lpVtbl -> put_Alpha(This,Alpha) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_PushClipRect_Proxy( + ICanvas __RPC_FAR * This, + LPRECT prc, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + +void __RPC_STUB ICanvas_PushClipRect_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_PopClipRect_Proxy( + ICanvas __RPC_FAR * This); + + +void __RPC_STUB ICanvas_PopClipRect_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_GetDC_Proxy( + ICanvas __RPC_FAR * This, + /* [retval][out] */ HDC __RPC_FAR *pdc); + + +void __RPC_STUB ICanvas_GetDC_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_ReleaseDC_Proxy( + ICanvas __RPC_FAR * This); + + +void __RPC_STUB ICanvas_ReleaseDC_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_GetSurface_Proxy( + ICanvas __RPC_FAR * This, + REFIID iid, + /* [iid_is][retval][out] */ void __RPC_FAR *__RPC_FAR *ppvItf); + + +void __RPC_STUB ICanvas_GetSurface_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_Fill_Proxy( + ICanvas __RPC_FAR * This, + LPRECT prc, + long nRGB); + + +void __RPC_STUB ICanvas_Fill_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_Frame_Proxy( + ICanvas __RPC_FAR * This, + LPRECT prc, + long nRGB); + + +void __RPC_STUB ICanvas_Frame_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_GetClipParams_Proxy( + ICanvas __RPC_FAR * This, + /* [retval][out] */ struct ClipParams __RPC_FAR *pParams); + + +void __RPC_STUB ICanvas_GetClipParams_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ICanvas_get_WasLost_Proxy( + ICanvas __RPC_FAR * This, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pVal); + + +void __RPC_STUB ICanvas_get_WasLost_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE ICanvas_get_Size_Proxy( + ICanvas __RPC_FAR * This, + /* [retval][out] */ LPSIZE pVal); + + +void __RPC_STUB ICanvas_get_Size_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ICanvas_put_Size_Proxy( + ICanvas __RPC_FAR * This, + /* [in] */ LPSIZE newVal); + + +void __RPC_STUB ICanvas_put_Size_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_Blt_Proxy( + ICanvas __RPC_FAR * This, + LPRECT prcSrc, + ICanvas __RPC_FAR *pSrc, + LPPOINT pptDest); + + +void __RPC_STUB ICanvas_Blt_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_HitTest_Proxy( + ICanvas __RPC_FAR * This, + LPPOINT ppt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbHit); + + +void __RPC_STUB ICanvas_HitTest_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_ToClient_Proxy( + ICanvas __RPC_FAR * This, + /* [out][in] */ LPPOINT pt); + + +void __RPC_STUB ICanvas_ToClient_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_ToScreen_Proxy( + ICanvas __RPC_FAR * This, + /* [out][in] */ LPPOINT ppt); + + +void __RPC_STUB ICanvas_ToScreen_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_OffsetOrg_Proxy( + ICanvas __RPC_FAR * This, + LPPOINT ppt, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + +void __RPC_STUB ICanvas_OffsetOrg_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ICanvas_SetClipRect_Proxy( + ICanvas __RPC_FAR * This, + LPRECT prcClip, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbVisible); + + +void __RPC_STUB ICanvas_SetClipRect_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ICanvas_put_Alpha_Proxy( + ICanvas __RPC_FAR * This, + long Alpha); + + +void __RPC_STUB ICanvas_put_Alpha_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ICanvas_INTERFACE_DEFINED__ */ + + +#ifndef __IViewDisp_INTERFACE_DEFINED__ +#define __IViewDisp_INTERFACE_DEFINED__ + +/* interface IViewDisp */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IViewDisp; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("F3B54A0C-61B9-4B7A-9FD8-82B0477FB7D9") + IViewDisp : public IDispatch + { + public: + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Control( + BSTR strName, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propputref] */ HRESULT STDMETHODCALLTYPE putref_Control( + BSTR strName, + /* [in] */ IControl __RPC_FAR *newVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Title( + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Title( + /* [in] */ BSTR newVal) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Alert( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SetIcon( + long icon, + /* [optional] */ VARIANT iconlibrary) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Activate( void) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Deactivate( void) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Position( + /* [in] */ LPRECT pVal) = 0; + + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Position( + /* [retval][out] */ LPRECT pVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IViewDispVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IViewDisp __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IViewDisp __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IViewDisp __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IViewDisp __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IViewDisp __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IViewDisp __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IViewDisp __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Control )( + IViewDisp __RPC_FAR * This, + BSTR strName, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring][propputref] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *putref_Control )( + IViewDisp __RPC_FAR * This, + BSTR strName, + /* [in] */ IControl __RPC_FAR *newVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Title )( + IViewDisp __RPC_FAR * This, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Title )( + IViewDisp __RPC_FAR * This, + /* [in] */ BSTR newVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Alert )( + IViewDisp __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetIcon )( + IViewDisp __RPC_FAR * This, + long icon, + /* [optional] */ VARIANT iconlibrary); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Activate )( + IViewDisp __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Deactivate )( + IViewDisp __RPC_FAR * This); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Position )( + IViewDisp __RPC_FAR * This, + /* [in] */ LPRECT pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Position )( + IViewDisp __RPC_FAR * This, + /* [retval][out] */ LPRECT pVal); + + END_INTERFACE + } IViewDispVtbl; + + interface IViewDisp + { + CONST_VTBL struct IViewDispVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IViewDisp_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IViewDisp_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IViewDisp_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IViewDisp_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IViewDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IViewDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IViewDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IViewDisp_get_Control(This,strName,pVal) \ + (This)->lpVtbl -> get_Control(This,strName,pVal) + +#define IViewDisp_putref_Control(This,strName,newVal) \ + (This)->lpVtbl -> putref_Control(This,strName,newVal) + +#define IViewDisp_get_Title(This,pVal) \ + (This)->lpVtbl -> get_Title(This,pVal) + +#define IViewDisp_put_Title(This,newVal) \ + (This)->lpVtbl -> put_Title(This,newVal) + +#define IViewDisp_Alert(This) \ + (This)->lpVtbl -> Alert(This) + +#define IViewDisp_SetIcon(This,icon,iconlibrary) \ + (This)->lpVtbl -> SetIcon(This,icon,iconlibrary) + +#define IViewDisp_Activate(This) \ + (This)->lpVtbl -> Activate(This) + +#define IViewDisp_Deactivate(This) \ + (This)->lpVtbl -> Deactivate(This) + +#define IViewDisp_put_Position(This,pVal) \ + (This)->lpVtbl -> put_Position(This,pVal) + +#define IViewDisp_get_Position(This,pVal) \ + (This)->lpVtbl -> get_Position(This,pVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IViewDisp_get_Control_Proxy( + IViewDisp __RPC_FAR * This, + BSTR strName, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal); + + +void __RPC_STUB IViewDisp_get_Control_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propputref] */ HRESULT STDMETHODCALLTYPE IViewDisp_putref_Control_Proxy( + IViewDisp __RPC_FAR * This, + BSTR strName, + /* [in] */ IControl __RPC_FAR *newVal); + + +void __RPC_STUB IViewDisp_putref_Control_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IViewDisp_get_Title_Proxy( + IViewDisp __RPC_FAR * This, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + +void __RPC_STUB IViewDisp_get_Title_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IViewDisp_put_Title_Proxy( + IViewDisp __RPC_FAR * This, + /* [in] */ BSTR newVal); + + +void __RPC_STUB IViewDisp_put_Title_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IViewDisp_Alert_Proxy( + IViewDisp __RPC_FAR * This); + + +void __RPC_STUB IViewDisp_Alert_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IViewDisp_SetIcon_Proxy( + IViewDisp __RPC_FAR * This, + long icon, + /* [optional] */ VARIANT iconlibrary); + + +void __RPC_STUB IViewDisp_SetIcon_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IViewDisp_Activate_Proxy( + IViewDisp __RPC_FAR * This); + + +void __RPC_STUB IViewDisp_Activate_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IViewDisp_Deactivate_Proxy( + IViewDisp __RPC_FAR * This); + + +void __RPC_STUB IViewDisp_Deactivate_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IViewDisp_put_Position_Proxy( + IViewDisp __RPC_FAR * This, + /* [in] */ LPRECT pVal); + + +void __RPC_STUB IViewDisp_put_Position_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IViewDisp_get_Position_Proxy( + IViewDisp __RPC_FAR * This, + /* [retval][out] */ LPRECT pVal); + + +void __RPC_STUB IViewDisp_get_Position_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IViewDisp_INTERFACE_DEFINED__ */ + + +#ifndef __IView_INTERFACE_DEFINED__ +#define __IView_INTERFACE_DEFINED__ + +/* interface IView */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IView; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A2AE18B7-85C9-451c-8CC3-D0FFE6B86EEB") + IView : public IViewDisp + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadControl( + ILayerSite __RPC_FAR *pParent, + long nID, + IUnknown __RPC_FAR *pXMLSource, + /* [retval][out] */ long __RPC_FAR *pAssignedID) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadSchema( + BSTR strXMLSchema) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Alpha( + long Alpha) = 0; + + }; + +#else /* C style interface */ + + typedef struct IViewVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IView __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IView __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IView __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IView __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IView __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IView __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IView __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Control )( + IView __RPC_FAR * This, + BSTR strName, + /* [retval][out] */ IControl __RPC_FAR *__RPC_FAR *pVal); + + /* [helpstring][propputref] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *putref_Control )( + IView __RPC_FAR * This, + BSTR strName, + /* [in] */ IControl __RPC_FAR *newVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Title )( + IView __RPC_FAR * This, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Title )( + IView __RPC_FAR * This, + /* [in] */ BSTR newVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Alert )( + IView __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetIcon )( + IView __RPC_FAR * This, + long icon, + /* [optional] */ VARIANT iconlibrary); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Activate )( + IView __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Deactivate )( + IView __RPC_FAR * This); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Position )( + IView __RPC_FAR * This, + /* [in] */ LPRECT pVal); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Position )( + IView __RPC_FAR * This, + /* [retval][out] */ LPRECT pVal); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadControl )( + IView __RPC_FAR * This, + ILayerSite __RPC_FAR *pParent, + long nID, + IUnknown __RPC_FAR *pXMLSource, + /* [retval][out] */ long __RPC_FAR *pAssignedID); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadSchema )( + IView __RPC_FAR * This, + BSTR strXMLSchema); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Alpha )( + IView __RPC_FAR * This, + long Alpha); + + END_INTERFACE + } IViewVtbl; + + interface IView + { + CONST_VTBL struct IViewVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IView_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IView_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IView_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IView_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IView_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IView_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IView_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IView_get_Control(This,strName,pVal) \ + (This)->lpVtbl -> get_Control(This,strName,pVal) + +#define IView_putref_Control(This,strName,newVal) \ + (This)->lpVtbl -> putref_Control(This,strName,newVal) + +#define IView_get_Title(This,pVal) \ + (This)->lpVtbl -> get_Title(This,pVal) + +#define IView_put_Title(This,newVal) \ + (This)->lpVtbl -> put_Title(This,newVal) + +#define IView_Alert(This) \ + (This)->lpVtbl -> Alert(This) + +#define IView_SetIcon(This,icon,iconlibrary) \ + (This)->lpVtbl -> SetIcon(This,icon,iconlibrary) + +#define IView_Activate(This) \ + (This)->lpVtbl -> Activate(This) + +#define IView_Deactivate(This) \ + (This)->lpVtbl -> Deactivate(This) + +#define IView_put_Position(This,pVal) \ + (This)->lpVtbl -> put_Position(This,pVal) + +#define IView_get_Position(This,pVal) \ + (This)->lpVtbl -> get_Position(This,pVal) + + +#define IView_LoadControl(This,pParent,nID,pXMLSource,pAssignedID) \ + (This)->lpVtbl -> LoadControl(This,pParent,nID,pXMLSource,pAssignedID) + +#define IView_LoadSchema(This,strXMLSchema) \ + (This)->lpVtbl -> LoadSchema(This,strXMLSchema) + +#define IView_put_Alpha(This,Alpha) \ + (This)->lpVtbl -> put_Alpha(This,Alpha) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IView_LoadControl_Proxy( + IView __RPC_FAR * This, + ILayerSite __RPC_FAR *pParent, + long nID, + IUnknown __RPC_FAR *pXMLSource, + /* [retval][out] */ long __RPC_FAR *pAssignedID); + + +void __RPC_STUB IView_LoadControl_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IView_LoadSchema_Proxy( + IView __RPC_FAR * This, + BSTR strXMLSchema); + + +void __RPC_STUB IView_LoadSchema_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IView_put_Alpha_Proxy( + IView __RPC_FAR * This, + long Alpha); + + +void __RPC_STUB IView_put_Alpha_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IView_INTERFACE_DEFINED__ */ + + +#ifndef __IRootLayer_INTERFACE_DEFINED__ +#define __IRootLayer_INTERFACE_DEFINED__ + +/* interface IRootLayer */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IRootLayer; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("D3006096-B293-47f5-9377-C12DEF5C1D34") + IRootLayer : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateView( + struct ViewParams __RPC_FAR *pParams, + ILayer __RPC_FAR *pLayer, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE SelectBar( + long nID) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadView( + BSTR strXML, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE LoadViewObject( + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView) = 0; + + }; + +#else /* C style interface */ + + typedef struct IRootLayerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IRootLayer __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IRootLayer __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IRootLayer __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateView )( + IRootLayer __RPC_FAR * This, + struct ViewParams __RPC_FAR *pParams, + ILayer __RPC_FAR *pLayer, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SelectBar )( + IRootLayer __RPC_FAR * This, + long nID); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadView )( + IRootLayer __RPC_FAR * This, + BSTR strXML, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *LoadViewObject )( + IRootLayer __RPC_FAR * This, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + END_INTERFACE + } IRootLayerVtbl; + + interface IRootLayer + { + CONST_VTBL struct IRootLayerVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IRootLayer_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IRootLayer_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IRootLayer_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IRootLayer_CreateView(This,pParams,pLayer,ppView) \ + (This)->lpVtbl -> CreateView(This,pParams,pLayer,ppView) + +#define IRootLayer_SelectBar(This,nID) \ + (This)->lpVtbl -> SelectBar(This,nID) + +#define IRootLayer_LoadView(This,strXML,ppView) \ + (This)->lpVtbl -> LoadView(This,strXML,ppView) + +#define IRootLayer_LoadViewObject(This,pSchema,ppView) \ + (This)->lpVtbl -> LoadViewObject(This,pSchema,ppView) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRootLayer_CreateView_Proxy( + IRootLayer __RPC_FAR * This, + struct ViewParams __RPC_FAR *pParams, + ILayer __RPC_FAR *pLayer, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + +void __RPC_STUB IRootLayer_CreateView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRootLayer_SelectBar_Proxy( + IRootLayer __RPC_FAR * This, + long nID); + + +void __RPC_STUB IRootLayer_SelectBar_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRootLayer_LoadView_Proxy( + IRootLayer __RPC_FAR * This, + BSTR strXML, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + +void __RPC_STUB IRootLayer_LoadView_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IRootLayer_LoadViewObject_Proxy( + IRootLayer __RPC_FAR * This, + IUnknown __RPC_FAR *pSchema, + /* [retval][out] */ IView __RPC_FAR *__RPC_FAR *ppView); + + +void __RPC_STUB IRootLayer_LoadViewObject_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IRootLayer_INTERFACE_DEFINED__ */ + + +#ifndef __IMessageMember_INTERFACE_DEFINED__ +#define __IMessageMember_INTERFACE_DEFINED__ + +/* interface IMessageMember */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IMessageMember; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("05D14E34-0A23-4A9F-95CF-9DB24B3CFB9F") + IMessageMember : public IDispatch + { + public: + virtual /* [defaultcollelem][helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Member( + VARIANT vIndex, + /* [retval][out] */ VARIANT __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_MemberName( + long Index, + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Count( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMessageMemberVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IMessageMember __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IMessageMember __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IMessageMember __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IMessageMember __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IMessageMember __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IMessageMember __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IMessageMember __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [defaultcollelem][helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Member )( + IMessageMember __RPC_FAR * This, + VARIANT vIndex, + /* [retval][out] */ VARIANT __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_MemberName )( + IMessageMember __RPC_FAR * This, + long Index, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Count )( + IMessageMember __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + END_INTERFACE + } IMessageMemberVtbl; + + interface IMessageMember + { + CONST_VTBL struct IMessageMemberVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMessageMember_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IMessageMember_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IMessageMember_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IMessageMember_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IMessageMember_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IMessageMember_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IMessageMember_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IMessageMember_get_Member(This,vIndex,pVal) \ + (This)->lpVtbl -> get_Member(This,vIndex,pVal) + +#define IMessageMember_get_MemberName(This,Index,pVal) \ + (This)->lpVtbl -> get_MemberName(This,Index,pVal) + +#define IMessageMember_get_Count(This,pVal) \ + (This)->lpVtbl -> get_Count(This,pVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [defaultcollelem][helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessageMember_get_Member_Proxy( + IMessageMember __RPC_FAR * This, + VARIANT vIndex, + /* [retval][out] */ VARIANT __RPC_FAR *pVal); + + +void __RPC_STUB IMessageMember_get_Member_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessageMember_get_MemberName_Proxy( + IMessageMember __RPC_FAR * This, + long Index, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + +void __RPC_STUB IMessageMember_get_MemberName_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessageMember_get_Count_Proxy( + IMessageMember __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IMessageMember_get_Count_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IMessageMember_INTERFACE_DEFINED__ */ + + +#ifndef __IMessage_INTERFACE_DEFINED__ +#define __IMessage_INTERFACE_DEFINED__ + +/* interface IMessage */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IMessage; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("23EE0804-EAC7-493B-BB9D-2298FD44FFA1") + IMessage : public IDispatch + { + public: + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Type( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Data( + /* [retval][out] */ VARIANT __RPC_FAR *pVal) = 0; + + virtual /* [defaultcollelem][helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Member( + VARIANT vElement, + /* [retval][out] */ VARIANT __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_MemberName( + long Index, + /* [retval][out] */ BSTR __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Count( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMessageVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IMessage __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IMessage __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IMessage __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IMessage __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IMessage __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IMessage __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IMessage __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Type )( + IMessage __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Data )( + IMessage __RPC_FAR * This, + /* [retval][out] */ VARIANT __RPC_FAR *pVal); + + /* [defaultcollelem][helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Member )( + IMessage __RPC_FAR * This, + VARIANT vElement, + /* [retval][out] */ VARIANT __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_MemberName )( + IMessage __RPC_FAR * This, + long Index, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Count )( + IMessage __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + END_INTERFACE + } IMessageVtbl; + + interface IMessage + { + CONST_VTBL struct IMessageVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMessage_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IMessage_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IMessage_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IMessage_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IMessage_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IMessage_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IMessage_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IMessage_get_Type(This,pVal) \ + (This)->lpVtbl -> get_Type(This,pVal) + +#define IMessage_get_Data(This,pVal) \ + (This)->lpVtbl -> get_Data(This,pVal) + +#define IMessage_get_Member(This,vElement,pVal) \ + (This)->lpVtbl -> get_Member(This,vElement,pVal) + +#define IMessage_get_MemberName(This,Index,pVal) \ + (This)->lpVtbl -> get_MemberName(This,Index,pVal) + +#define IMessage_get_Count(This,pVal) \ + (This)->lpVtbl -> get_Count(This,pVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessage_get_Type_Proxy( + IMessage __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IMessage_get_Type_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessage_get_Data_Proxy( + IMessage __RPC_FAR * This, + /* [retval][out] */ VARIANT __RPC_FAR *pVal); + + +void __RPC_STUB IMessage_get_Data_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [defaultcollelem][helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessage_get_Member_Proxy( + IMessage __RPC_FAR * This, + VARIANT vElement, + /* [retval][out] */ VARIANT __RPC_FAR *pVal); + + +void __RPC_STUB IMessage_get_Member_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessage_get_MemberName_Proxy( + IMessage __RPC_FAR * This, + long Index, + /* [retval][out] */ BSTR __RPC_FAR *pVal); + + +void __RPC_STUB IMessage_get_MemberName_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IMessage_get_Count_Proxy( + IMessage __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IMessage_get_Count_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IMessage_INTERFACE_DEFINED__ */ + + +#ifndef __INetworkFilter_INTERFACE_DEFINED__ +#define __INetworkFilter_INTERFACE_DEFINED__ + +/* interface INetworkFilter */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_INetworkFilter; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("EEB0BE9E-46BD-493F-97E2-330670C09F59") + INetworkFilter : public IDispatch + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Dispatch( + IMessage __RPC_FAR *Message) = 0; + + }; + +#else /* C style interface */ + + typedef struct INetworkFilterVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + INetworkFilter __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + INetworkFilter __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + INetworkFilter __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + INetworkFilter __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + INetworkFilter __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + INetworkFilter __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + INetworkFilter __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Dispatch )( + INetworkFilter __RPC_FAR * This, + IMessage __RPC_FAR *Message); + + END_INTERFACE + } INetworkFilterVtbl; + + interface INetworkFilter + { + CONST_VTBL struct INetworkFilterVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define INetworkFilter_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define INetworkFilter_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define INetworkFilter_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define INetworkFilter_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define INetworkFilter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define INetworkFilter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define INetworkFilter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define INetworkFilter_Dispatch(This,Message) \ + (This)->lpVtbl -> Dispatch(This,Message) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE INetworkFilter_Dispatch_Proxy( + INetworkFilter __RPC_FAR * This, + IMessage __RPC_FAR *Message); + + +void __RPC_STUB INetworkFilter_Dispatch_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __INetworkFilter_INTERFACE_DEFINED__ */ + + +#ifndef __ILayerKeyboard_INTERFACE_DEFINED__ +#define __ILayerKeyboard_INTERFACE_DEFINED__ + +/* interface ILayerKeyboard */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayerKeyboard; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("7500929F-4251-4373-B978-286A8A8BECED") + ILayerKeyboard : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE KeyboardChar( + struct KeyState __RPC_FAR *pKS) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE KeyboardEndCapture( + VARIANT_BOOL bCancel) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE KeyboardEvent( + long nMsg, + long wParam, + long lParam) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerKeyboardVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayerKeyboard __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayerKeyboard __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayerKeyboard __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *KeyboardChar )( + ILayerKeyboard __RPC_FAR * This, + struct KeyState __RPC_FAR *pKS); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *KeyboardEndCapture )( + ILayerKeyboard __RPC_FAR * This, + VARIANT_BOOL bCancel); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *KeyboardEvent )( + ILayerKeyboard __RPC_FAR * This, + long nMsg, + long wParam, + long lParam); + + END_INTERFACE + } ILayerKeyboardVtbl; + + interface ILayerKeyboard + { + CONST_VTBL struct ILayerKeyboardVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayerKeyboard_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayerKeyboard_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayerKeyboard_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayerKeyboard_KeyboardChar(This,pKS) \ + (This)->lpVtbl -> KeyboardChar(This,pKS) + +#define ILayerKeyboard_KeyboardEndCapture(This,bCancel) \ + (This)->lpVtbl -> KeyboardEndCapture(This,bCancel) + +#define ILayerKeyboard_KeyboardEvent(This,nMsg,wParam,lParam) \ + (This)->lpVtbl -> KeyboardEvent(This,nMsg,wParam,lParam) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerKeyboard_KeyboardChar_Proxy( + ILayerKeyboard __RPC_FAR * This, + struct KeyState __RPC_FAR *pKS); + + +void __RPC_STUB ILayerKeyboard_KeyboardChar_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerKeyboard_KeyboardEndCapture_Proxy( + ILayerKeyboard __RPC_FAR * This, + VARIANT_BOOL bCancel); + + +void __RPC_STUB ILayerKeyboard_KeyboardEndCapture_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerKeyboard_KeyboardEvent_Proxy( + ILayerKeyboard __RPC_FAR * This, + long nMsg, + long wParam, + long lParam); + + +void __RPC_STUB ILayerKeyboard_KeyboardEvent_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayerKeyboard_INTERFACE_DEFINED__ */ + + +#ifndef __ILayerPopup_INTERFACE_DEFINED__ +#define __ILayerPopup_INTERFACE_DEFINED__ + +/* interface ILayerPopup */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayerPopup; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("22072A97-E5E6-4d91-A344-807235BFA5D8") + ILayerPopup : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE PopupCancel( + struct MouseState __RPC_FAR *pMouse, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbContinue) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerPopupVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayerPopup __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayerPopup __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayerPopup __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PopupCancel )( + ILayerPopup __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbContinue); + + END_INTERFACE + } ILayerPopupVtbl; + + interface ILayerPopup + { + CONST_VTBL struct ILayerPopupVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayerPopup_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayerPopup_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayerPopup_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayerPopup_PopupCancel(This,pMouse,pbContinue) \ + (This)->lpVtbl -> PopupCancel(This,pMouse,pbContinue) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerPopup_PopupCancel_Proxy( + ILayerPopup __RPC_FAR * This, + struct MouseState __RPC_FAR *pMouse, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbContinue); + + +void __RPC_STUB ILayerPopup_PopupCancel_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayerPopup_INTERFACE_DEFINED__ */ + + +#ifndef __ILayerTimer_INTERFACE_DEFINED__ +#define __ILayerTimer_INTERFACE_DEFINED__ + +/* interface ILayerTimer */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_ILayerTimer; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("5D6B8A1B-321A-479f-9347-55725BDA3DA9") + ILayerTimer : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE TimerTimeout( + long nID, + long nInterval, + long nReps, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbContinue) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILayerTimerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ILayerTimer __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ILayerTimer __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ILayerTimer __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *TimerTimeout )( + ILayerTimer __RPC_FAR * This, + long nID, + long nInterval, + long nReps, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbContinue); + + END_INTERFACE + } ILayerTimerVtbl; + + interface ILayerTimer + { + CONST_VTBL struct ILayerTimerVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILayerTimer_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ILayerTimer_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ILayerTimer_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ILayerTimer_TimerTimeout(This,nID,nInterval,nReps,pbContinue) \ + (This)->lpVtbl -> TimerTimeout(This,nID,nInterval,nReps,pbContinue) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE ILayerTimer_TimerTimeout_Proxy( + ILayerTimer __RPC_FAR * This, + long nID, + long nInterval, + long nReps, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbContinue); + + +void __RPC_STUB ILayerTimer_TimerTimeout_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __ILayerTimer_INTERFACE_DEFINED__ */ + + +#ifndef __IWindowsMessageSink_INTERFACE_DEFINED__ +#define __IWindowsMessageSink_INTERFACE_DEFINED__ + +/* interface IWindowsMessageSink */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IWindowsMessageSink; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A68BE455-C241-49c5-9F8A-070E4CBE430F") + IWindowsMessageSink : public IUnknown + { + public: + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE WindowMessage( + long hWnd, + short uMsg, + long wParam, + long lParam, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat) = 0; + + virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE WindowMessageEnd( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IWindowsMessageSinkVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IWindowsMessageSink __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IWindowsMessageSink __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IWindowsMessageSink __RPC_FAR * This); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *WindowMessage )( + IWindowsMessageSink __RPC_FAR * This, + long hWnd, + short uMsg, + long wParam, + long lParam, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat); + + /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *WindowMessageEnd )( + IWindowsMessageSink __RPC_FAR * This); + + END_INTERFACE + } IWindowsMessageSinkVtbl; + + interface IWindowsMessageSink + { + CONST_VTBL struct IWindowsMessageSinkVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IWindowsMessageSink_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IWindowsMessageSink_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IWindowsMessageSink_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IWindowsMessageSink_WindowMessage(This,hWnd,uMsg,wParam,lParam,pbEat) \ + (This)->lpVtbl -> WindowMessage(This,hWnd,uMsg,wParam,lParam,pbEat) + +#define IWindowsMessageSink_WindowMessageEnd(This) \ + (This)->lpVtbl -> WindowMessageEnd(This) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IWindowsMessageSink_WindowMessage_Proxy( + IWindowsMessageSink __RPC_FAR * This, + long hWnd, + short uMsg, + long wParam, + long lParam, + /* [retval][out] */ VARIANT_BOOL __RPC_FAR *pbEat); + + +void __RPC_STUB IWindowsMessageSink_WindowMessage_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring] */ HRESULT STDMETHODCALLTYPE IWindowsMessageSink_WindowMessageEnd_Proxy( + IWindowsMessageSink __RPC_FAR * This); + + +void __RPC_STUB IWindowsMessageSink_WindowMessageEnd_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IWindowsMessageSink_INTERFACE_DEFINED__ */ + + +#ifndef __IBrushImage_INTERFACE_DEFINED__ +#define __IBrushImage_INTERFACE_DEFINED__ + +/* interface IBrushImage */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IBrushImage; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("50CDFD25-4F3B-4412-96BE-947A6C7B93A2") + IBrushImage : public IUnknown + { + public: + virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Color( + /* [retval][out] */ long __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Color( + /* [in] */ long newVal) = 0; + + }; + +#else /* C style interface */ + + typedef struct IBrushImageVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IBrushImage __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IBrushImage __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IBrushImage __RPC_FAR * This); + + /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Color )( + IBrushImage __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Color )( + IBrushImage __RPC_FAR * This, + /* [in] */ long newVal); + + END_INTERFACE + } IBrushImageVtbl; + + interface IBrushImage + { + CONST_VTBL struct IBrushImageVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IBrushImage_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IBrushImage_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IBrushImage_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IBrushImage_get_Color(This,pVal) \ + (This)->lpVtbl -> get_Color(This,pVal) + +#define IBrushImage_put_Color(This,newVal) \ + (This)->lpVtbl -> put_Color(This,newVal) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IBrushImage_get_Color_Proxy( + IBrushImage __RPC_FAR * This, + /* [retval][out] */ long __RPC_FAR *pVal); + + +void __RPC_STUB IBrushImage_get_Color_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IBrushImage_put_Color_Proxy( + IBrushImage __RPC_FAR * This, + /* [in] */ long newVal); + + +void __RPC_STUB IBrushImage_put_Color_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IBrushImage_INTERFACE_DEFINED__ */ + + +#ifndef __IInputBuffer_INTERFACE_DEFINED__ +#define __IInputBuffer_INTERFACE_DEFINED__ + +/* interface IInputBuffer */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IInputBuffer; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("634D74B8-AFED-4710-82C9-B530326E1AFA") + IInputBuffer : public IDispatch + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TypeText( + BSTR strText) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Delay( + long nMilliseconds, + /* [defaultvalue][optional] */ VARIANT_BOOL bAllowInput = 0) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE MouseClick( + long nX, + long nY, + enum eMouseInput eAction) = 0; + + virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_Status( + /* [retval][out] */ enum eInputStatus __RPC_FAR *pVal) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Run( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IInputBufferVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IInputBuffer __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IInputBuffer __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IInputBuffer __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IInputBuffer __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IInputBuffer __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IInputBuffer __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IInputBuffer __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Clear )( + IInputBuffer __RPC_FAR * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *TypeText )( + IInputBuffer __RPC_FAR * This, + BSTR strText); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Delay )( + IInputBuffer __RPC_FAR * This, + long nMilliseconds, + /* [defaultvalue][optional] */ VARIANT_BOOL bAllowInput); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *MouseClick )( + IInputBuffer __RPC_FAR * This, + long nX, + long nY, + enum eMouseInput eAction); + + /* [helpstring][id][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Status )( + IInputBuffer __RPC_FAR * This, + /* [retval][out] */ enum eInputStatus __RPC_FAR *pVal); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Run )( + IInputBuffer __RPC_FAR * This); + + END_INTERFACE + } IInputBufferVtbl; + + interface IInputBuffer + { + CONST_VTBL struct IInputBufferVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IInputBuffer_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IInputBuffer_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IInputBuffer_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IInputBuffer_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IInputBuffer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IInputBuffer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IInputBuffer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IInputBuffer_Clear(This) \ + (This)->lpVtbl -> Clear(This) + +#define IInputBuffer_TypeText(This,strText) \ + (This)->lpVtbl -> TypeText(This,strText) + +#define IInputBuffer_Delay(This,nMilliseconds,bAllowInput) \ + (This)->lpVtbl -> Delay(This,nMilliseconds,bAllowInput) + +#define IInputBuffer_MouseClick(This,nX,nY,eAction) \ + (This)->lpVtbl -> MouseClick(This,nX,nY,eAction) + +#define IInputBuffer_get_Status(This,pVal) \ + (This)->lpVtbl -> get_Status(This,pVal) + +#define IInputBuffer_Run(This) \ + (This)->lpVtbl -> Run(This) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputBuffer_Clear_Proxy( + IInputBuffer __RPC_FAR * This); + + +void __RPC_STUB IInputBuffer_Clear_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputBuffer_TypeText_Proxy( + IInputBuffer __RPC_FAR * This, + BSTR strText); + + +void __RPC_STUB IInputBuffer_TypeText_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputBuffer_Delay_Proxy( + IInputBuffer __RPC_FAR * This, + long nMilliseconds, + /* [defaultvalue][optional] */ VARIANT_BOOL bAllowInput); + + +void __RPC_STUB IInputBuffer_Delay_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputBuffer_MouseClick_Proxy( + IInputBuffer __RPC_FAR * This, + long nX, + long nY, + enum eMouseInput eAction); + + +void __RPC_STUB IInputBuffer_MouseClick_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE IInputBuffer_get_Status_Proxy( + IInputBuffer __RPC_FAR * This, + /* [retval][out] */ enum eInputStatus __RPC_FAR *pVal); + + +void __RPC_STUB IInputBuffer_get_Status_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputBuffer_Run_Proxy( + IInputBuffer __RPC_FAR * This); + + +void __RPC_STUB IInputBuffer_Run_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IInputBuffer_INTERFACE_DEFINED__ */ + + +#ifndef __IInputNotify_INTERFACE_DEFINED__ +#define __IInputNotify_INTERFACE_DEFINED__ + +/* interface IInputNotify */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IInputNotify; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("E288C465-2DD6-4fcd-95E2-5BBC1A1D2D32") + IInputNotify : public IDispatch + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE NotifyBegin( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE NotifyEnd( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetMousePos( + long nX, + long nY) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE NotifyPause( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IInputNotifyVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IInputNotify __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IInputNotify __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IInputNotify __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IInputNotify __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IInputNotify __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IInputNotify __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IInputNotify __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NotifyBegin )( + IInputNotify __RPC_FAR * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NotifyEnd )( + IInputNotify __RPC_FAR * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetMousePos )( + IInputNotify __RPC_FAR * This, + long nX, + long nY); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NotifyPause )( + IInputNotify __RPC_FAR * This); + + END_INTERFACE + } IInputNotifyVtbl; + + interface IInputNotify + { + CONST_VTBL struct IInputNotifyVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IInputNotify_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IInputNotify_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IInputNotify_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IInputNotify_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IInputNotify_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IInputNotify_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IInputNotify_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IInputNotify_NotifyBegin(This) \ + (This)->lpVtbl -> NotifyBegin(This) + +#define IInputNotify_NotifyEnd(This) \ + (This)->lpVtbl -> NotifyEnd(This) + +#define IInputNotify_SetMousePos(This,nX,nY) \ + (This)->lpVtbl -> SetMousePos(This,nX,nY) + +#define IInputNotify_NotifyPause(This) \ + (This)->lpVtbl -> NotifyPause(This) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputNotify_NotifyBegin_Proxy( + IInputNotify __RPC_FAR * This); + + +void __RPC_STUB IInputNotify_NotifyBegin_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputNotify_NotifyEnd_Proxy( + IInputNotify __RPC_FAR * This); + + +void __RPC_STUB IInputNotify_NotifyEnd_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputNotify_SetMousePos_Proxy( + IInputNotify __RPC_FAR * This, + long nX, + long nY); + + +void __RPC_STUB IInputNotify_SetMousePos_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IInputNotify_NotifyPause_Proxy( + IInputNotify __RPC_FAR * This); + + +void __RPC_STUB IInputNotify_NotifyPause_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IInputNotify_INTERFACE_DEFINED__ */ + + + +#ifndef __DecalPlugins_LIBRARY_DEFINED__ +#define __DecalPlugins_LIBRARY_DEFINED__ + +/* library DecalPlugins */ +/* [helpstring][version][uuid] */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EXTERN_C const IID LIBID_DecalPlugins; + +#ifndef __IControlEvents_DISPINTERFACE_DEFINED__ +#define __IControlEvents_DISPINTERFACE_DEFINED__ + +/* dispinterface IControlEvents */ +/* [helpstring][uuid] */ + + +EXTERN_C const IID DIID_IControlEvents; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("2FEBCBC3-488C-444f-AD08-5D3097D2D1ED") + IControlEvents : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct IControlEventsVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IControlEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IControlEvents __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IControlEvents __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IControlEvents __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IControlEvents __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IControlEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IControlEvents __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } IControlEventsVtbl; + + interface IControlEvents + { + CONST_VTBL struct IControlEventsVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IControlEvents_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IControlEvents_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IControlEvents_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IControlEvents_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IControlEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IControlEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IControlEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* __IControlEvents_DISPINTERFACE_DEFINED__ */ + + +#ifndef __ICommandEvents_DISPINTERFACE_DEFINED__ +#define __ICommandEvents_DISPINTERFACE_DEFINED__ + +/* dispinterface ICommandEvents */ +/* [helpstring][uuid] */ + + +EXTERN_C const IID DIID_ICommandEvents; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("F029D3A1-29AF-45ef-927E-729FEDD87403") + ICommandEvents : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct ICommandEventsVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + ICommandEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + ICommandEvents __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + ICommandEvents __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + ICommandEvents __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + ICommandEvents __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + ICommandEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + ICommandEvents __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } ICommandEventsVtbl; + + interface ICommandEvents + { + CONST_VTBL struct ICommandEventsVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ICommandEvents_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define ICommandEvents_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define ICommandEvents_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define ICommandEvents_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define ICommandEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define ICommandEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define ICommandEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* __ICommandEvents_DISPINTERFACE_DEFINED__ */ + + +#ifndef __IPagerEvents_DISPINTERFACE_DEFINED__ +#define __IPagerEvents_DISPINTERFACE_DEFINED__ + +/* dispinterface IPagerEvents */ +/* [helpstring][uuid] */ + + +EXTERN_C const IID DIID_IPagerEvents; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("7499EB61-6992-4e21-8A55-CF44D44C0A07") + IPagerEvents : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct IPagerEventsVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPagerEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPagerEvents __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPagerEvents __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IPagerEvents __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IPagerEvents __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IPagerEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IPagerEvents __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } IPagerEventsVtbl; + + interface IPagerEvents + { + CONST_VTBL struct IPagerEventsVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPagerEvents_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPagerEvents_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPagerEvents_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPagerEvents_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IPagerEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IPagerEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IPagerEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* __IPagerEvents_DISPINTERFACE_DEFINED__ */ + + +#ifndef __IViewEvents_DISPINTERFACE_DEFINED__ +#define __IViewEvents_DISPINTERFACE_DEFINED__ + +/* dispinterface IViewEvents */ +/* [helpstring][uuid] */ + + +EXTERN_C const IID DIID_IViewEvents; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("4B7B19D5-61A2-4ab0-8B1B-381A303A937F") + IViewEvents : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct IViewEventsVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IViewEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IViewEvents __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IViewEvents __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IViewEvents __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IViewEvents __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IViewEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IViewEvents __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } IViewEventsVtbl; + + interface IViewEvents + { + CONST_VTBL struct IViewEventsVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IViewEvents_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IViewEvents_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IViewEvents_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IViewEvents_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IViewEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IViewEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IViewEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* __IViewEvents_DISPINTERFACE_DEFINED__ */ + + +#ifndef __IInputEvents_DISPINTERFACE_DEFINED__ +#define __IInputEvents_DISPINTERFACE_DEFINED__ + +/* dispinterface IInputEvents */ +/* [helpstring][uuid] */ + + +EXTERN_C const IID DIID_IInputEvents; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("BD33BADC-F909-4eb6-AD15-B1569B58898B") + IInputEvents : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct IInputEventsVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IInputEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IInputEvents __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IInputEvents __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IInputEvents __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IInputEvents __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IInputEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IInputEvents __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } IInputEventsVtbl; + + interface IInputEvents + { + CONST_VTBL struct IInputEventsVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IInputEvents_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IInputEvents_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IInputEvents_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IInputEvents_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IInputEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IInputEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IInputEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* __IInputEvents_DISPINTERFACE_DEFINED__ */ + + +EXTERN_C const CLSID CLSID_Canvas; + +#ifdef __cplusplus + +class DECLSPEC_UUID("91892F16-31A3-4E23-9CFD-89A5A5174A59") +Canvas; +#endif + +EXTERN_C const CLSID CLSID_PluginSite; + +#ifdef __cplusplus + +class DECLSPEC_UUID("B2FBD583-B64C-4dfc-BAAA-34B8C21482F8") +PluginSite; +#endif + +EXTERN_C const CLSID CLSID_Layer; + +#ifdef __cplusplus + +class DECLSPEC_UUID("6FEA2219-7438-4f76-8165-C47AA060D811") +Layer; +#endif + +EXTERN_C const CLSID CLSID_View; + +#ifdef __cplusplus + +class DECLSPEC_UUID("19BF46E4-5CB8-4CFC-A17A-8E6673E60ABF") +View; +#endif + +EXTERN_C const CLSID CLSID_Button; + +#ifdef __cplusplus + +class DECLSPEC_UUID("C22BF2FC-F144-4d17-9C12-A344F980BB17") +Button; +#endif + +EXTERN_C const CLSID CLSID_Pager; + +#ifdef __cplusplus + +class DECLSPEC_UUID("C79E2F76-06F8-4cd0-A613-4829237D297D") +Pager; +#endif + +EXTERN_C const CLSID CLSID_BrushImage; + +#ifdef __cplusplus + +class DECLSPEC_UUID("918C0333-5714-4C8D-A95C-2C137B76D364") +BrushImage; +#endif + +EXTERN_C const CLSID CLSID_InputBuffer; + +#ifdef __cplusplus + +class DECLSPEC_UUID("2F91FC21-4D89-4B64-94AE-A124D54563AE") +InputBuffer; +#endif +#endif /* __DecalPlugins_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +unsigned long __RPC_USER BSTR_UserSize( unsigned long __RPC_FAR *, unsigned long , BSTR __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER BSTR_UserMarshal( unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER BSTR_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); +void __RPC_USER BSTR_UserFree( unsigned long __RPC_FAR *, BSTR __RPC_FAR * ); + +unsigned long __RPC_USER HDC_UserSize( unsigned long __RPC_FAR *, unsigned long , HDC __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER HDC_UserMarshal( unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, HDC __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER HDC_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, HDC __RPC_FAR * ); +void __RPC_USER HDC_UserFree( unsigned long __RPC_FAR *, HDC __RPC_FAR * ); + +unsigned long __RPC_USER VARIANT_UserSize( unsigned long __RPC_FAR *, unsigned long , VARIANT __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER VARIANT_UserMarshal( unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, VARIANT __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER VARIANT_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, VARIANT __RPC_FAR * ); +void __RPC_USER VARIANT_UserFree( unsigned long __RPC_FAR *, VARIANT __RPC_FAR * ); + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/Native/Inject/Attic/Inject.lib b/Native/Inject/Attic/Inject.lib new file mode 100644 index 0000000000000000000000000000000000000000..cca112b01c9c88d074f6f37a41562926f62c7eef GIT binary patch literal 3826 zcmcgvy;BoG6n{xTAbbpdlsX;`1vZF*kl;9S7m|TM2sa@afnnwdAwm=g1B8MG{s8|7 z8%zHHI~;2Z3u~>BDy0SZ-tBJoF1a%oL~mwqZ{Nqhx4-w1&A{{geqrlH@QGr7CZgeq zP$)DKwUd<*z8;SX&RP%vZUeNR19Vmaf*_q_5x`O+ZcJ>Sx<|NxIv72AtE~1jQv{ch@VsZI+>A+Q?j>k3T^Lu*! zaEnanTKwf$k?qcCdMu7a=_})TQ>mSxvZHTTHcPt)<}vhfZAsU11x8EkR(3MQLV15f zRn?U_U0bR*MiMRRbIZa)4G=AsGp2LNxT+fIdNa+0`JTxGs~|ePtQl#!Z~d;##aqtx z37PAZ?C0$O)lPsRT%7g+Tyz5*<2dRCSnUD0#JP$y76sgbcIbp4bU+uhfe-w3lmPHk zI%kSK7q1^)&rou~meS1{9y8x$aLk~)l-qU6o!2j`i8{z^JUei8td_Ierr$ilY~tRa zw5c=$lnXnzxDy6WLq}xf;dm;=^1oS!k30?YUcVMh`2z6n*XL(Hec0nMtA7Cax_!6s z>km&q^8A2V@BRc#77CIqz0A2bxhwt$&hSQYy|OvDC`@Viv5n`qJ}UIbhD#gy!~9@K z(C^{L2bBB7W$BD6jGS?~aUq8d0=`@1h^~TihLB-?@@|EaYYl%L-0MJJr?CD5MVYOm$r zZ|O + +

    +

    Build Log

    +

    +--------------------Configuration: Inject - Win32 Release MinDependency-------------------- +

    +

    Command Lines

    +Creating temporary file "C:\DOCUME~1\AARONP~1\LOCALS~1\Temp\RSP5AC.tmp" with contents +[ +/nologo /MD /W3 /GX /Zd /O1 /D "INJECT_IMPL" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Fp"ReleaseMinDependency/Inject.pch" /Yu"stdafx.h" /Fo"ReleaseMinDependency/" /Fd"ReleaseMinDependency/" /FD /c +"E:\Decal\Source\Inject\Canvas.cpp" +] +Creating command line "cl.exe @C:\DOCUME~1\AARONP~1\LOCALS~1\Temp\RSP5AC.tmp" +Creating temporary file "C:\DOCUME~1\AARONP~1\LOCALS~1\Temp\RSP5AD.tmp" with contents +[ +kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ddraw.lib winmm.lib ws2_32.lib /nologo /subsystem:windows /dll /incremental:no /pdb:"..\Release/Inject.pdb" /debug /machine:I386 /def:".\Inject.def" /out:"..\Release/Inject.dll" /implib:"..\Release/Inject.lib" /pdbtype:sept +.\ReleaseMinDependency\BarLayer.obj +.\ReleaseMinDependency\Button.obj +.\ReleaseMinDependency\Canvas.obj +.\ReleaseMinDependency\DatFile.obj +.\ReleaseMinDependency\Direct3DHook.obj +.\ReleaseMinDependency\DirectDrawHook.obj +.\ReleaseMinDependency\DirectDrawSurfaceHook.obj +.\ReleaseMinDependency\FontCache.obj +.\ReleaseMinDependency\Guids.obj +.\ReleaseMinDependency\IconCache.obj +.\ReleaseMinDependency\Image.obj +.\ReleaseMinDependency\Inject.obj +.\ReleaseMinDependency\InputBuffer.obj +.\ReleaseMinDependency\LayerSite.obj +.\ReleaseMinDependency\Manager.obj +.\ReleaseMinDependency\MaterialHook.obj +.\ReleaseMinDependency\Message.obj +.\ReleaseMinDependency\MessageLoaders.obj +.\ReleaseMinDependency\MessageParsers.obj +.\ReleaseMinDependency\MessageStruct.obj +.\ReleaseMinDependency\MessageVector.obj +.\ReleaseMinDependency\Pager.obj +.\ReleaseMinDependency\Panel.obj +.\ReleaseMinDependency\ProtocolStack.obj +.\ReleaseMinDependency\RootLayer.obj +.\ReleaseMinDependency\SimpleBar.obj +.\ReleaseMinDependency\SinkImpl.obj +.\ReleaseMinDependency\SolidImage.obj +.\ReleaseMinDependency\StdAfx.obj +.\ReleaseMinDependency\View.obj +.\ReleaseMinDependency\Inject.res +] +Creating command line "link.exe @C:\DOCUME~1\AARONP~1\LOCALS~1\Temp\RSP5AD.tmp" +Creating temporary file "C:\DOCUME~1\AARONP~1\LOCALS~1\Temp\RSP5AE.bat" with contents +[ +@echo off +regsvr32 /s /c "\Decal\Source\Release\Inject.dll" +echo regsvr32 exec. time > ".\..\Release\regsvr32.trg" +] +Creating command line "C:\DOCUME~1\AARONP~1\LOCALS~1\Temp\RSP5AE.bat" +Compiling... +Canvas.cpp +Linking... + Creating library ..\Release/Inject.lib and object ..\Release/Inject.exp +

    Output Window

    +Performing registration + + + +

    Results

    +Inject.dll - 0 error(s), 0 warning(s) +
    + + diff --git a/Native/Inject/Attic/Inject.tlb b/Native/Inject/Attic/Inject.tlb new file mode 100644 index 0000000000000000000000000000000000000000..33440b4406b844929b674348927eec81d6c9c2be GIT binary patch literal 405 zcmYk&FEE2~7{Kwb?PVKd!~DB*=M4*jV0YpIcg_ji?N|^5K@bE%5QGIm5ClOK76f5I z5QGIm5JW*(SP%q35Zv*7y*Ib#?(;tH^ZWhoeV+HXzPVCO&_fiN;4iUcidUc(0fof`Nbr5cpAA&=@sGNf<1$o%hljeuvLSNb*fu@S1aH@Az y3UI5*F*sIB%j0mZ?1Z!VPY34cKKwN88Rs^4>PqNbU3K7otE;Y0#rM}aU;G6~BtXUh literal 0 HcmV?d00001 diff --git a/Native/Inject/Attic/Inject_i.c b/Native/Inject/Attic/Inject_i.c new file mode 100644 index 0000000..01623c7 --- /dev/null +++ b/Native/Inject/Attic/Inject_i.c @@ -0,0 +1,448 @@ + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + +/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ + +/* link this file in with the server and any clients */ + + + /* File created by MIDL compiler version 5.03.0280 */ +/* at Sat Aug 18 01:06:36 2001 + */ +/* Compiler settings for E:\Decal\Source\Inject\Inject.idl: + Oicf (OptLev=i2), W1, Zp8, env=Win32 (32b run), ms_ext, c_ext + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#if !defined(_M_IA64) && !defined(_M_AXP64) + +#ifdef __cplusplus +extern "C"{ +#endif + + +#include +#include + +#ifdef _MIDL_USE_GUIDDEF_ + +#ifndef INITGUID +#define INITGUID +#include +#undef INITGUID +#else +#include +#endif + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) + +#else // !_MIDL_USE_GUIDDEF_ + +#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 + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} + +#endif !_MIDL_USE_GUIDDEF_ + +MIDL_DEFINE_GUID(IID, IID_IManager,0xBC63C4A7,0xBE01,0x400D,0x90,0x8D,0x07,0x47,0xB0,0x6C,0x80,0x62); + + +MIDL_DEFINE_GUID(IID, IID_IPluginSite,0x702D3901,0xC13A,0x448e,0x88,0x71,0xEC,0xDC,0x8B,0xC8,0xD0,0x79); + + +MIDL_DEFINE_GUID(IID, IID_IPluginSink,0xD216BA6C,0xD328,0x4765,0xB4,0x0A,0x9B,0xC5,0x7C,0x96,0xF7,0x5E); + + +MIDL_DEFINE_GUID(IID, IID_IPlugin,0xBA3E677F,0x8E44,0x4829,0x98,0x2E,0x58,0xBB,0xBC,0x5C,0x5F,0x9B); + + +MIDL_DEFINE_GUID(IID, IID_IControl,0x996B377C,0x1953,0x4db1,0xAA,0xC1,0x15,0x7F,0x72,0x59,0x2D,0x3E); + + +MIDL_DEFINE_GUID(IID, DIID_IControlEvents,0x2FEBCBC3,0x488C,0x444f,0xAD,0x08,0x5D,0x30,0x97,0xD2,0xD1,0xED); + + +MIDL_DEFINE_GUID(IID, IID_ILayer,0x0D63504F,0xDEEF,0x4a2d,0x97,0x42,0x28,0xDD,0x1B,0xAD,0xDA,0x7C); + + +MIDL_DEFINE_GUID(IID, IID_ILayerRender,0xD1C71B85,0x62C2,0x42a3,0xAE,0x2E,0x4B,0xF5,0xA6,0xBE,0x17,0x84); + + +MIDL_DEFINE_GUID(IID, IID_ILayerSite,0x5B7E9D99,0xBB3A,0x475D,0x84,0x2D,0x43,0xEB,0xEA,0x82,0x84,0xEA); + + +MIDL_DEFINE_GUID(IID, IID_IBarManager,0xE4CCDC92,0x8658,0x4caa,0x89,0x55,0xFB,0x89,0x1D,0x5B,0xDC,0xF7); + + +MIDL_DEFINE_GUID(IID, IID_IIconCache,0xDEDCD5AA,0xF6CA,0x4DA5,0xA6,0x57,0xE8,0x2F,0x12,0x6A,0xBB,0xCD); + + +MIDL_DEFINE_GUID(IID, IID_IImageCacheDisp,0xF88548BC,0xD11E,0x4ac2,0x9A,0x27,0x36,0x07,0x00,0x4D,0x35,0x9F); + + +MIDL_DEFINE_GUID(IID, IID_IImageCache,0xBE566CEC,0x6881,0x481C,0xA1,0x46,0x9F,0x5A,0x32,0x57,0x6B,0xE6); + + +MIDL_DEFINE_GUID(IID, IID_IFontCacheDisp,0x9394E96D,0x2B29,0x4c29,0xAF,0x3E,0xDB,0x5C,0x47,0x61,0x22,0xDB); + + +MIDL_DEFINE_GUID(IID, IID_IFontCache,0x12ECCB0F,0x36A6,0x451C,0xB0,0x86,0x13,0x06,0xB7,0x4A,0xAE,0xC2); + + +MIDL_DEFINE_GUID(IID, IID_ISimpleBar,0x4A2D87CD,0xBFB4,0x4723,0xB9,0x59,0xFF,0xF3,0xFD,0xD4,0x92,0x78); + + +MIDL_DEFINE_GUID(IID, IID_ILayerMouse,0x5014E0B2,0x9156,0x412c,0x94,0x6D,0x9D,0x4B,0xAA,0x9F,0x4C,0x51); + + +MIDL_DEFINE_GUID(IID, IID_ILayerSchema,0x829E0FB2,0xD0B5,0x4814,0xBC,0xF9,0x6E,0xCF,0xA0,0x6C,0x9A,0xED); + + +MIDL_DEFINE_GUID(IID, IID_IButton,0x0F5765A4,0x9F83,0x4077,0x88,0x84,0x6C,0xBD,0xDC,0xE3,0x48,0xF7); + + +MIDL_DEFINE_GUID(IID, DIID_ICommandEvents,0xF029D3A1,0x29AF,0x45ef,0x92,0x7E,0x72,0x9F,0xED,0xD8,0x74,0x03); + + +MIDL_DEFINE_GUID(IID, IID_IPager,0xBD9FC464,0xC0D8,0x4823,0x82,0x55,0xE8,0x18,0xF8,0x83,0x6B,0x08); + + +MIDL_DEFINE_GUID(IID, DIID_IPagerEvents,0x7499EB61,0x6992,0x4e21,0x8A,0x55,0xCF,0x44,0xD4,0x4C,0x0A,0x07); + + +MIDL_DEFINE_GUID(IID, IID_IPanel,0x2B52B5CB,0x9E10,0x4238,0x8F,0x62,0xA5,0x01,0x40,0x6E,0x3E,0xAB); + + +MIDL_DEFINE_GUID(IID, IID_IPanelSink,0x85D70924,0x917D,0x41bb,0x99,0x5D,0xC4,0x0E,0x6A,0xB2,0x1C,0x71); + + +MIDL_DEFINE_GUID(IID, IID_ICanvas,0x9241862D,0xBA71,0x4317,0x81,0x66,0x3A,0x3E,0x61,0xCE,0x3E,0x5F); + + +MIDL_DEFINE_GUID(IID, IID_IViewDisp,0xF3B54A0C,0x61B9,0x4B7A,0x9F,0xD8,0x82,0xB0,0x47,0x7F,0xB7,0xD9); + + +MIDL_DEFINE_GUID(IID, IID_IView,0xA2AE18B7,0x85C9,0x451c,0x8C,0xC3,0xD0,0xFF,0xE6,0xB8,0x6E,0xEB); + + +MIDL_DEFINE_GUID(IID, DIID_IViewEvents,0x4B7B19D5,0x61A2,0x4ab0,0x8B,0x1B,0x38,0x1A,0x30,0x3A,0x93,0x7F); + + +MIDL_DEFINE_GUID(IID, IID_IRootLayer,0xD3006096,0xB293,0x47f5,0x93,0x77,0xC1,0x2D,0xEF,0x5C,0x1D,0x34); + + +MIDL_DEFINE_GUID(IID, IID_IMessageMember,0x05D14E34,0x0A23,0x4A9F,0x95,0xCF,0x9D,0xB2,0x4B,0x3C,0xFB,0x9F); + + +MIDL_DEFINE_GUID(IID, IID_IMessage,0x23EE0804,0xEAC7,0x493B,0xBB,0x9D,0x22,0x98,0xFD,0x44,0xFF,0xA1); + + +MIDL_DEFINE_GUID(IID, IID_INetworkFilter,0xEEB0BE9E,0x46BD,0x493F,0x97,0xE2,0x33,0x06,0x70,0xC0,0x9F,0x59); + + +MIDL_DEFINE_GUID(IID, IID_ILayerKeyboard,0x7500929F,0x4251,0x4373,0xB9,0x78,0x28,0x6A,0x8A,0x8B,0xEC,0xED); + + +MIDL_DEFINE_GUID(IID, IID_ILayerPopup,0x22072A97,0xE5E6,0x4d91,0xA3,0x44,0x80,0x72,0x35,0xBF,0xA5,0xD8); + + +MIDL_DEFINE_GUID(IID, IID_ILayerTimer,0x5D6B8A1B,0x321A,0x479f,0x93,0x47,0x55,0x72,0x5B,0xDA,0x3D,0xA9); + + +MIDL_DEFINE_GUID(IID, IID_IWindowsMessageSink,0xA68BE455,0xC241,0x49c5,0x9F,0x8A,0x07,0x0E,0x4C,0xBE,0x43,0x0F); + + +MIDL_DEFINE_GUID(IID, IID_IBrushImage,0x50CDFD25,0x4F3B,0x4412,0x96,0xBE,0x94,0x7A,0x6C,0x7B,0x93,0xA2); + + +MIDL_DEFINE_GUID(IID, IID_IInputBuffer,0x634D74B8,0xAFED,0x4710,0x82,0xC9,0xB5,0x30,0x32,0x6E,0x1A,0xFA); + + +MIDL_DEFINE_GUID(IID, DIID_IInputEvents,0xBD33BADC,0xF909,0x4eb6,0xAD,0x15,0xB1,0x56,0x9B,0x58,0x89,0x8B); + + +MIDL_DEFINE_GUID(IID, IID_IInputNotify,0xE288C465,0x2DD6,0x4fcd,0x95,0xE2,0x5B,0xBC,0x1A,0x1D,0x2D,0x32); + + +MIDL_DEFINE_GUID(IID, LIBID_DecalPlugins,0x3559E08B,0x827E,0x4DFE,0x9D,0x33,0x35,0x67,0x24,0x68,0x49,0xCC); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Canvas,0x91892F16,0x31A3,0x4E23,0x9C,0xFD,0x89,0xA5,0xA5,0x17,0x4A,0x59); + + +MIDL_DEFINE_GUID(CLSID, CLSID_PluginSite,0xB2FBD583,0xB64C,0x4dfc,0xBA,0xAA,0x34,0xB8,0xC2,0x14,0x82,0xF8); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Layer,0x6FEA2219,0x7438,0x4f76,0x81,0x65,0xC4,0x7A,0xA0,0x60,0xD8,0x11); + + +MIDL_DEFINE_GUID(CLSID, CLSID_View,0x19BF46E4,0x5CB8,0x4CFC,0xA1,0x7A,0x8E,0x66,0x73,0xE6,0x0A,0xBF); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Button,0xC22BF2FC,0xF144,0x4d17,0x9C,0x12,0xA3,0x44,0xF9,0x80,0xBB,0x17); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Pager,0xC79E2F76,0x06F8,0x4cd0,0xA6,0x13,0x48,0x29,0x23,0x7D,0x29,0x7D); + + +MIDL_DEFINE_GUID(CLSID, CLSID_BrushImage,0x918C0333,0x5714,0x4C8D,0xA9,0x5C,0x2C,0x13,0x7B,0x76,0xD3,0x64); + + +MIDL_DEFINE_GUID(CLSID, CLSID_InputBuffer,0x2F91FC21,0x4D89,0x4B64,0x94,0xAE,0xA1,0x24,0xD5,0x45,0x63,0xAE); + +#undef MIDL_DEFINE_GUID + +#ifdef __cplusplus +} +#endif + + + +#endif /* !defined(_M_IA64) && !defined(_M_AXP64)*/ + + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + +/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ + +/* link this file in with the server and any clients */ + + + /* File created by MIDL compiler version 5.03.0280 */ +/* at Sat Aug 18 01:06:36 2001 + */ +/* Compiler settings for E:\Decal\Source\Inject\Inject.idl: + Oicf (OptLev=i2), W1, Zp8, env=Win64 (32b run,appending), ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#if defined(_M_IA64) || defined(_M_AXP64) + +#ifdef __cplusplus +extern "C"{ +#endif + + +#include +#include + +#ifdef _MIDL_USE_GUIDDEF_ + +#ifndef INITGUID +#define INITGUID +#include +#undef INITGUID +#else +#include +#endif + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) + +#else // !_MIDL_USE_GUIDDEF_ + +#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 + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} + +#endif !_MIDL_USE_GUIDDEF_ + +MIDL_DEFINE_GUID(IID, IID_IManager,0xBC63C4A7,0xBE01,0x400D,0x90,0x8D,0x07,0x47,0xB0,0x6C,0x80,0x62); + + +MIDL_DEFINE_GUID(IID, IID_IPluginSite,0x702D3901,0xC13A,0x448e,0x88,0x71,0xEC,0xDC,0x8B,0xC8,0xD0,0x79); + + +MIDL_DEFINE_GUID(IID, IID_IPluginSink,0xD216BA6C,0xD328,0x4765,0xB4,0x0A,0x9B,0xC5,0x7C,0x96,0xF7,0x5E); + + +MIDL_DEFINE_GUID(IID, IID_IPlugin,0xBA3E677F,0x8E44,0x4829,0x98,0x2E,0x58,0xBB,0xBC,0x5C,0x5F,0x9B); + + +MIDL_DEFINE_GUID(IID, IID_IControl,0x996B377C,0x1953,0x4db1,0xAA,0xC1,0x15,0x7F,0x72,0x59,0x2D,0x3E); + + +MIDL_DEFINE_GUID(IID, DIID_IControlEvents,0x2FEBCBC3,0x488C,0x444f,0xAD,0x08,0x5D,0x30,0x97,0xD2,0xD1,0xED); + + +MIDL_DEFINE_GUID(IID, IID_ILayer,0x0D63504F,0xDEEF,0x4a2d,0x97,0x42,0x28,0xDD,0x1B,0xAD,0xDA,0x7C); + + +MIDL_DEFINE_GUID(IID, IID_ILayerRender,0xD1C71B85,0x62C2,0x42a3,0xAE,0x2E,0x4B,0xF5,0xA6,0xBE,0x17,0x84); + + +MIDL_DEFINE_GUID(IID, IID_ILayerSite,0x5B7E9D99,0xBB3A,0x475D,0x84,0x2D,0x43,0xEB,0xEA,0x82,0x84,0xEA); + + +MIDL_DEFINE_GUID(IID, IID_IBarManager,0xE4CCDC92,0x8658,0x4caa,0x89,0x55,0xFB,0x89,0x1D,0x5B,0xDC,0xF7); + + +MIDL_DEFINE_GUID(IID, IID_IIconCache,0xDEDCD5AA,0xF6CA,0x4DA5,0xA6,0x57,0xE8,0x2F,0x12,0x6A,0xBB,0xCD); + + +MIDL_DEFINE_GUID(IID, IID_IImageCacheDisp,0xF88548BC,0xD11E,0x4ac2,0x9A,0x27,0x36,0x07,0x00,0x4D,0x35,0x9F); + + +MIDL_DEFINE_GUID(IID, IID_IImageCache,0xBE566CEC,0x6881,0x481C,0xA1,0x46,0x9F,0x5A,0x32,0x57,0x6B,0xE6); + + +MIDL_DEFINE_GUID(IID, IID_IFontCacheDisp,0x9394E96D,0x2B29,0x4c29,0xAF,0x3E,0xDB,0x5C,0x47,0x61,0x22,0xDB); + + +MIDL_DEFINE_GUID(IID, IID_IFontCache,0x12ECCB0F,0x36A6,0x451C,0xB0,0x86,0x13,0x06,0xB7,0x4A,0xAE,0xC2); + + +MIDL_DEFINE_GUID(IID, IID_ISimpleBar,0x4A2D87CD,0xBFB4,0x4723,0xB9,0x59,0xFF,0xF3,0xFD,0xD4,0x92,0x78); + + +MIDL_DEFINE_GUID(IID, IID_ILayerMouse,0x5014E0B2,0x9156,0x412c,0x94,0x6D,0x9D,0x4B,0xAA,0x9F,0x4C,0x51); + + +MIDL_DEFINE_GUID(IID, IID_ILayerSchema,0x829E0FB2,0xD0B5,0x4814,0xBC,0xF9,0x6E,0xCF,0xA0,0x6C,0x9A,0xED); + + +MIDL_DEFINE_GUID(IID, IID_IButton,0x0F5765A4,0x9F83,0x4077,0x88,0x84,0x6C,0xBD,0xDC,0xE3,0x48,0xF7); + + +MIDL_DEFINE_GUID(IID, DIID_ICommandEvents,0xF029D3A1,0x29AF,0x45ef,0x92,0x7E,0x72,0x9F,0xED,0xD8,0x74,0x03); + + +MIDL_DEFINE_GUID(IID, IID_IPager,0xBD9FC464,0xC0D8,0x4823,0x82,0x55,0xE8,0x18,0xF8,0x83,0x6B,0x08); + + +MIDL_DEFINE_GUID(IID, DIID_IPagerEvents,0x7499EB61,0x6992,0x4e21,0x8A,0x55,0xCF,0x44,0xD4,0x4C,0x0A,0x07); + + +MIDL_DEFINE_GUID(IID, IID_IPanel,0x2B52B5CB,0x9E10,0x4238,0x8F,0x62,0xA5,0x01,0x40,0x6E,0x3E,0xAB); + + +MIDL_DEFINE_GUID(IID, IID_IPanelSink,0x85D70924,0x917D,0x41bb,0x99,0x5D,0xC4,0x0E,0x6A,0xB2,0x1C,0x71); + + +MIDL_DEFINE_GUID(IID, IID_ICanvas,0x9241862D,0xBA71,0x4317,0x81,0x66,0x3A,0x3E,0x61,0xCE,0x3E,0x5F); + + +MIDL_DEFINE_GUID(IID, IID_IViewDisp,0xF3B54A0C,0x61B9,0x4B7A,0x9F,0xD8,0x82,0xB0,0x47,0x7F,0xB7,0xD9); + + +MIDL_DEFINE_GUID(IID, IID_IView,0xA2AE18B7,0x85C9,0x451c,0x8C,0xC3,0xD0,0xFF,0xE6,0xB8,0x6E,0xEB); + + +MIDL_DEFINE_GUID(IID, DIID_IViewEvents,0x4B7B19D5,0x61A2,0x4ab0,0x8B,0x1B,0x38,0x1A,0x30,0x3A,0x93,0x7F); + + +MIDL_DEFINE_GUID(IID, IID_IRootLayer,0xD3006096,0xB293,0x47f5,0x93,0x77,0xC1,0x2D,0xEF,0x5C,0x1D,0x34); + + +MIDL_DEFINE_GUID(IID, IID_IMessageMember,0x05D14E34,0x0A23,0x4A9F,0x95,0xCF,0x9D,0xB2,0x4B,0x3C,0xFB,0x9F); + + +MIDL_DEFINE_GUID(IID, IID_IMessage,0x23EE0804,0xEAC7,0x493B,0xBB,0x9D,0x22,0x98,0xFD,0x44,0xFF,0xA1); + + +MIDL_DEFINE_GUID(IID, IID_INetworkFilter,0xEEB0BE9E,0x46BD,0x493F,0x97,0xE2,0x33,0x06,0x70,0xC0,0x9F,0x59); + + +MIDL_DEFINE_GUID(IID, IID_ILayerKeyboard,0x7500929F,0x4251,0x4373,0xB9,0x78,0x28,0x6A,0x8A,0x8B,0xEC,0xED); + + +MIDL_DEFINE_GUID(IID, IID_ILayerPopup,0x22072A97,0xE5E6,0x4d91,0xA3,0x44,0x80,0x72,0x35,0xBF,0xA5,0xD8); + + +MIDL_DEFINE_GUID(IID, IID_ILayerTimer,0x5D6B8A1B,0x321A,0x479f,0x93,0x47,0x55,0x72,0x5B,0xDA,0x3D,0xA9); + + +MIDL_DEFINE_GUID(IID, IID_IWindowsMessageSink,0xA68BE455,0xC241,0x49c5,0x9F,0x8A,0x07,0x0E,0x4C,0xBE,0x43,0x0F); + + +MIDL_DEFINE_GUID(IID, IID_IBrushImage,0x50CDFD25,0x4F3B,0x4412,0x96,0xBE,0x94,0x7A,0x6C,0x7B,0x93,0xA2); + + +MIDL_DEFINE_GUID(IID, IID_IInputBuffer,0x634D74B8,0xAFED,0x4710,0x82,0xC9,0xB5,0x30,0x32,0x6E,0x1A,0xFA); + + +MIDL_DEFINE_GUID(IID, DIID_IInputEvents,0xBD33BADC,0xF909,0x4eb6,0xAD,0x15,0xB1,0x56,0x9B,0x58,0x89,0x8B); + + +MIDL_DEFINE_GUID(IID, IID_IInputNotify,0xE288C465,0x2DD6,0x4fcd,0x95,0xE2,0x5B,0xBC,0x1A,0x1D,0x2D,0x32); + + +MIDL_DEFINE_GUID(IID, LIBID_DecalPlugins,0x3559E08B,0x827E,0x4DFE,0x9D,0x33,0x35,0x67,0x24,0x68,0x49,0xCC); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Canvas,0x91892F16,0x31A3,0x4E23,0x9C,0xFD,0x89,0xA5,0xA5,0x17,0x4A,0x59); + + +MIDL_DEFINE_GUID(CLSID, CLSID_PluginSite,0xB2FBD583,0xB64C,0x4dfc,0xBA,0xAA,0x34,0xB8,0xC2,0x14,0x82,0xF8); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Layer,0x6FEA2219,0x7438,0x4f76,0x81,0x65,0xC4,0x7A,0xA0,0x60,0xD8,0x11); + + +MIDL_DEFINE_GUID(CLSID, CLSID_View,0x19BF46E4,0x5CB8,0x4CFC,0xA1,0x7A,0x8E,0x66,0x73,0xE6,0x0A,0xBF); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Button,0xC22BF2FC,0xF144,0x4d17,0x9C,0x12,0xA3,0x44,0xF9,0x80,0xBB,0x17); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Pager,0xC79E2F76,0x06F8,0x4cd0,0xA6,0x13,0x48,0x29,0x23,0x7D,0x29,0x7D); + + +MIDL_DEFINE_GUID(CLSID, CLSID_BrushImage,0x918C0333,0x5714,0x4C8D,0xA9,0x5C,0x2C,0x13,0x7B,0x76,0xD3,0x64); + + +MIDL_DEFINE_GUID(CLSID, CLSID_InputBuffer,0x2F91FC21,0x4D89,0x4B64,0x94,0xAE,0xA1,0x24,0xD5,0x45,0x63,0xAE); + +#undef MIDL_DEFINE_GUID + +#ifdef __cplusplus +} +#endif + + + +#endif /* defined(_M_IA64) || defined(_M_AXP64)*/ + diff --git a/Native/Inject/Attic/Inject_p.c b/Native/Inject/Attic/Inject_p.c new file mode 100644 index 0000000..bb4fc52 --- /dev/null +++ b/Native/Inject/Attic/Inject_p.c @@ -0,0 +1,21230 @@ + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + +/* this ALWAYS GENERATED file contains the proxy stub code */ + + + /* File created by MIDL compiler version 5.03.0280 */ +/* at Sat Aug 18 01:06:36 2001 + */ +/* Compiler settings for E:\Decal\Source\Inject\Inject.idl: + Oicf (OptLev=i2), W1, Zp8, env=Win32 (32b run), ms_ext, c_ext + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#if !defined(_M_IA64) && !defined(_M_AXP64) +#define USE_STUBLESS_PROXY + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REDQ_RPCPROXY_H_VERSION__ +#define __REQUIRED_RPCPROXY_H_VERSION__ 440 +#endif + + +#include "rpcproxy.h" +#ifndef __RPCPROXY_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCPROXY_H_VERSION__ + + +#include "Inject.h" + +#define TYPE_FORMAT_STRING_SIZE 1751 +#define PROC_FORMAT_STRING_SIZE 5029 +#define TRANSMIT_AS_TABLE_SIZE 0 +#define WIRE_MARSHAL_TABLE_SIZE 3 + +typedef struct _MIDL_TYPE_FORMAT_STRING + { + short Pad; + unsigned char Format[ TYPE_FORMAT_STRING_SIZE ]; + } MIDL_TYPE_FORMAT_STRING; + +typedef struct _MIDL_PROC_FORMAT_STRING + { + short Pad; + unsigned char Format[ PROC_FORMAT_STRING_SIZE ]; + } MIDL_PROC_FORMAT_STRING; + + +extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString; +extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString; + + +/* Standard interface: __MIDL_itf_Inject_0000, ver. 0.0, + GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */ + + +/* Object interface: IUnknown, ver. 0.0, + GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */ + + +/* Object interface: IManager, ver. 0.0, + GUID={0xBC63C4A7,0xBE01,0x400D,{0x90,0x8D,0x07,0x47,0xB0,0x6C,0x80,0x62}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IManager_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IManager_FormatStringOffsetTable[] = + { + 0, + 28 + }; + +static const MIDL_SERVER_INFO IManager_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IManager_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IManager_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IManager_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IManagerProxyVtbl = +{ + &IManager_ProxyInfo, + &IID_IManager, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IManager::LoadPlugin */ , + (void *)-1 /* IManager::UnloadPlugin */ +}; + +const CInterfaceStubVtbl _IManagerStubVtbl = +{ + &IID_IManager, + &IManager_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPluginSite, ver. 0.0, + GUID={0x702D3901,0xC13A,0x448e,{0x88,0x71,0xEC,0xDC,0x8B,0xC8,0xD0,0x79}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPluginSite_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPluginSite_FormatStringOffsetTable[] = + { + 56, + 84, + 118, + 146, + 180, + 214, + 248, + 282, + 328, + 356, + 390, + 430, + 464, + 498, + 532, + 578, + 612, + 640, + 674, + 708, + 742, + 770, + 798, + 826, + 854, + 882, + 910, + 938, + 966, + 1000, + 1034 + }; + +static const MIDL_SERVER_INFO IPluginSite_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPluginSite_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPluginSite_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPluginSite_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(34) _IPluginSiteProxyVtbl = +{ + &IPluginSite_ProxyInfo, + &IID_IPluginSite, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPluginSite::UnloadPlugin */ , + (void *)-1 /* IPluginSite::GetDirectDraw */ , + (void *)-1 /* IPluginSite::GetPrimarySurface */ , + (void *)-1 /* IPluginSite::Get3DDevice */ , + (void *)-1 /* IPluginSite::LoadBitmapFile */ , + (void *)-1 /* IPluginSite::GetIconCache */ , + (void *)-1 /* IPluginSite::LoadBitmapPortal */ , + (void *)-1 /* IPluginSite::CreateFont */ , + (void *)-1 /* IPluginSite::GetScreenSize */ , + (void *)-1 /* IPluginSite::CreateCanvas */ , + (void *)-1 /* IPluginSite::CreateView */ , + (void *)-1 /* IPluginSite::LoadView */ , + (void *)-1 /* IPluginSite::CreateBrushImage */ , + (void *)-1 /* IPluginSite::LoadImageSchema */ , + (void *)-1 /* IPluginSite::CreateFontSchema */ , + (void *)-1 /* IPluginSite::LoadResourceModule */ , + (void *)-1 /* IPluginSite::get_ResourcePath */ , + (void *)-1 /* IPluginSite::get_Plugin */ , + (void *)-1 /* IPluginSite::get_NetworkFilter */ , + (void *)-1 /* IPluginSite::LoadViewObject */ , + (void *)-1 /* IPluginSite::CreateInputBuffer */ , + (void *)-1 /* IPluginSite::get_HWND */ , + (void *)-1 /* IPluginSite::get_Focus */ , + (void *)-1 /* IPluginSite::get_OldWndProc */ , + (void *)-1 /* IPluginSite::put_CurrentSelection */ , + (void *)-1 /* IPluginSite::get_CurrentSelection */ , + (void *)-1 /* IPluginSite::put_PreviousSelection */ , + (void *)-1 /* IPluginSite::get_PreviousSelection */ , + (void *)-1 /* IPluginSite::WriteToChatWindow */ , + (void *)-1 /* IPluginSite::SetCursorPosition */ , + (void *)-1 /* IPluginSite::QueryKeyboardMap */ +}; + +const CInterfaceStubVtbl _IPluginSiteStubVtbl = +{ + &IID_IPluginSite, + &IPluginSite_ServerInfo, + 34, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPluginSink, ver. 0.0, + GUID={0xD216BA6C,0xD328,0x4765,{0xB4,0x0A,0x9B,0xC5,0x7C,0x96,0xF7,0x5E}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPluginSink_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPluginSink_FormatStringOffsetTable[] = + { + 1068, + 1102 + }; + +static const MIDL_SERVER_INFO IPluginSink_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPluginSink_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPluginSink_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPluginSink_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IPluginSinkProxyVtbl = +{ + &IPluginSink_ProxyInfo, + &IID_IPluginSink, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPluginSink::ChatText */ , + (void *)-1 /* IPluginSink::ChatMessage */ +}; + +const CInterfaceStubVtbl _IPluginSinkStubVtbl = +{ + &IID_IPluginSink, + &IPluginSink_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPlugin, ver. 0.0, + GUID={0xBA3E677F,0x8E44,0x4829,{0x98,0x2E,0x58,0xBB,0xBC,0x5C,0x5F,0x9B}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPlugin_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPlugin_FormatStringOffsetTable[] = + { + 1142, + 1176, + 1198 + }; + +static const MIDL_SERVER_INFO IPlugin_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPlugin_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPlugin_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPlugin_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(6) _IPluginProxyVtbl = +{ + &IPlugin_ProxyInfo, + &IID_IPlugin, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPlugin::Initialize */ , + (void *)-1 /* IPlugin::Terminate */ , + (void *)-1 /* IPlugin::get_FriendlyName */ +}; + +const CInterfaceStubVtbl _IPluginStubVtbl = +{ + &IID_IPlugin, + &IPlugin_ServerInfo, + 6, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IDispatch, ver. 0.0, + GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */ + + +/* Object interface: IControl, ver. 0.0, + GUID={0x996B377C,0x1953,0x4db1,{0xAA,0xC1,0x15,0x7F,0x72,0x59,0x2D,0x3E}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IControl_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IControl_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 1226, + 1260, + 1288, + 1316 + }; + +static const MIDL_SERVER_INFO IControl_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IControl_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IControl_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IControl_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(11) _IControlProxyVtbl = +{ + &IControl_ProxyInfo, + &IID_IControl, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IControl::DestroyChild */ , + (void *)-1 /* IControl::get_ID */ , + (void *)-1 /* IControl::get_ChildCount */ , + (void *)-1 /* IControl::get_Child */ +}; + + +static const PRPC_STUB_FUNCTION IControl_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IControlStubVtbl = +{ + &IID_IControl, + &IControl_ServerInfo, + 11, + &IControl_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: ILayer, ver. 0.0, + GUID={0x0D63504F,0xDEEF,0x4a2d,{0x97,0x42,0x28,0xDD,0x1B,0xAD,0xDA,0x7C}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayer_FormatStringOffsetTable[] = + { + 1356, + 1176, + 1384, + 1412 + }; + +static const MIDL_SERVER_INFO ILayer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(7) _ILayerProxyVtbl = +{ + &ILayer_ProxyInfo, + &IID_ILayer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayer::LayerCreate */ , + (void *)-1 /* ILayer::LayerDestroy */ , + (void *)-1 /* ILayer::get_Position */ , + (void *)-1 /* ILayer::put_Position */ +}; + +const CInterfaceStubVtbl _ILayerStubVtbl = +{ + &IID_ILayer, + &ILayer_ServerInfo, + 7, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerRender, ver. 0.0, + GUID={0xD1C71B85,0x62C2,0x42a3,{0xAE,0x2E,0x4B,0xF5,0xA6,0xBE,0x17,0x84}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerRender_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerRender_FormatStringOffsetTable[] = + { + 1440, + 1462, + 1490, + 1512, + 1546 + }; + +static const MIDL_SERVER_INFO ILayerRender_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerRender_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerRender_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerRender_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(8) _ILayerRenderProxyVtbl = +{ + &ILayerRender_ProxyInfo, + &IID_ILayerRender, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerRender::PreRender */ , + (void *)-1 /* ILayerRender::Render */ , + (void *)-1 /* ILayerRender::Reformat */ , + (void *)-1 /* ILayerRender::AdjustRenderArea */ , + (void *)-1 /* ILayerRender::HitTest */ +}; + +const CInterfaceStubVtbl _ILayerRenderStubVtbl = +{ + &IID_ILayerRender, + &ILayerRender_ServerInfo, + 8, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerSite, ver. 0.0, + GUID={0x5B7E9D99,0xBB3A,0x475D,{0x84,0x2D,0x43,0xEB,0xEA,0x82,0x84,0xEA}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerSite_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerSite_FormatStringOffsetTable[] = + { + 1440, + 1580, + 1614, + 1648, + 1670, + 1698, + 1720, + 1754, + 1782, + 1810, + 1838, + 1866, + 1906, + 1928, + 1968, + 1996, + 2024, + 2058, + 2086, + 2114, + 2142 + }; + +static const MIDL_SERVER_INFO ILayerSite_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerSite_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerSite_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerSite_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(24) _ILayerSiteProxyVtbl = +{ + &ILayerSite_ProxyInfo, + &IID_ILayerSite, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerSite::Destroy */ , + (void *)-1 /* ILayerSite::CreateChild */ , + (void *)-1 /* ILayerSite::GetSink */ , + (void *)-1 /* ILayerSite::Invalidate */ , + (void *)-1 /* ILayerSite::get_PluginSite */ , + (void *)-1 /* ILayerSite::Reformat */ , + (void *)-1 /* ILayerSite::GetParentSink */ , + (void *)-1 /* ILayerSite::get_Position */ , + (void *)-1 /* ILayerSite::put_Position */ , + (void *)-1 /* ILayerSite::get_ID */ , + (void *)-1 /* ILayerSite::get_ChildCount */ , + (void *)-1 /* ILayerSite::get_Child */ , + (void *)-1 /* ILayerSite::CaptureKeyboard */ , + (void *)-1 /* ILayerSite::IsChild */ , + (void *)-1 /* ILayerSite::put_Popup */ , + (void *)-1 /* ILayerSite::get_ScreenPosition */ , + (void *)-1 /* ILayerSite::StartTimer */ , + (void *)-1 /* ILayerSite::EndTimer */ , + (void *)-1 /* ILayerSite::get_Transparent */ , + (void *)-1 /* ILayerSite::put_Transparent */ , + (void *)-1 /* ILayerSite::put_Alpha */ +}; + +const CInterfaceStubVtbl _ILayerSiteStubVtbl = +{ + &IID_ILayerSite, + &ILayerSite_ServerInfo, + 24, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IBarManager, ver. 0.0, + GUID={0xE4CCDC92,0x8658,0x4caa,{0x89,0x55,0xFB,0x89,0x1D,0x5B,0xDC,0xF7}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IBarManager_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IBarManager_FormatStringOffsetTable[] = + { + 2170, + 2204, + 2232, + 2266 + }; + +static const MIDL_SERVER_INFO IBarManager_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IBarManager_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IBarManager_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IBarManager_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(7) _IBarManagerProxyVtbl = +{ + &IBarManager_ProxyInfo, + &IID_IBarManager, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IBarManager::AddBar */ , + (void *)-1 /* IBarManager::RemoveBar */ , + (void *)-1 /* IBarManager::get_Bar */ , + (void *)-1 /* IBarManager::put_Bar */ +}; + +const CInterfaceStubVtbl _IBarManagerStubVtbl = +{ + &IID_IBarManager, + &IBarManager_ServerInfo, + 7, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IIconCache, ver. 0.0, + GUID={0xDEDCD5AA,0xF6CA,0x4DA5,{0xA6,0x57,0xE8,0x2F,0x12,0x6A,0xBB,0xCD}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IIconCache_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IIconCache_FormatStringOffsetTable[] = + { + 2300 + }; + +static const MIDL_SERVER_INFO IIconCache_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IIconCache_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IIconCache_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IIconCache_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _IIconCacheProxyVtbl = +{ + &IIconCache_ProxyInfo, + &IID_IIconCache, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IIconCache::DrawIcon */ +}; + +const CInterfaceStubVtbl _IIconCacheStubVtbl = +{ + &IID_IIconCache, + &IIconCache_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IImageCacheDisp, ver. 0.0, + GUID={0xF88548BC,0xD11E,0x4ac2,{0x9A,0x27,0x36,0x07,0x00,0x4D,0x35,0x9F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +#pragma code_seg(".orpc") +CINTERFACE_PROXY_VTABLE(7) _IImageCacheDispProxyVtbl = +{ + 0, + &IID_IImageCacheDisp, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ +}; + + +static const PRPC_STUB_FUNCTION IImageCacheDisp_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION +}; + +CInterfaceStubVtbl _IImageCacheDispStubVtbl = +{ + &IID_IImageCacheDisp, + 0, + 7, + &IImageCacheDisp_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IImageCache, ver. 0.0, + GUID={0xBE566CEC,0x6881,0x481C,{0xA1,0x46,0x9F,0x5A,0x32,0x57,0x6B,0xE6}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IImageCache_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IImageCache_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 2346, + 2386, + 2438, + 2478 + }; + +static const MIDL_SERVER_INFO IImageCache_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IImageCache_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IImageCache_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IImageCache_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(11) _IImageCacheProxyVtbl = +{ + &IImageCache_ProxyInfo, + &IID_IImageCache, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IImageCache::PatBlt */ , + (void *)-1 /* IImageCache::StretchBlt */ , + (void *)-1 /* IImageCache::Blt */ , + (void *)-1 /* IImageCache::get_Size */ +}; + + +static const PRPC_STUB_FUNCTION IImageCache_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IImageCacheStubVtbl = +{ + &IID_IImageCache, + &IImageCache_ServerInfo, + 11, + &IImageCache_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IFontCacheDisp, ver. 0.0, + GUID={0x9394E96D,0x2B29,0x4c29,{0xAF,0x3E,0xDB,0x5C,0x47,0x61,0x22,0xDB}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +#pragma code_seg(".orpc") +CINTERFACE_PROXY_VTABLE(7) _IFontCacheDispProxyVtbl = +{ + 0, + &IID_IFontCacheDisp, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ +}; + + +static const PRPC_STUB_FUNCTION IFontCacheDisp_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION +}; + +CInterfaceStubVtbl _IFontCacheDispStubVtbl = +{ + &IID_IFontCacheDisp, + 0, + 7, + &IFontCacheDisp_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IFontCache, ver. 0.0, + GUID={0x12ECCB0F,0x36A6,0x451C,{0xB0,0x86,0x13,0x06,0xB7,0x4A,0xAE,0xC2}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IFontCache_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IFontCache_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 2506, + 2552, + 2586 + }; + +static const MIDL_SERVER_INFO IFontCache_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IFontCache_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IFontCache_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IFontCache_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _IFontCacheProxyVtbl = +{ + &IFontCache_ProxyInfo, + &IID_IFontCache, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IFontCache::DrawText */ , + (void *)-1 /* IFontCache::MeasureText */ , + (void *)-1 /* IFontCache::HitTest */ +}; + + +static const PRPC_STUB_FUNCTION IFontCache_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IFontCacheStubVtbl = +{ + &IID_IFontCache, + &IFontCache_ServerInfo, + 10, + &IFontCache_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: ISimpleBar, ver. 0.0, + GUID={0x4A2D87CD,0xBFB4,0x4723,{0xB9,0x59,0xFF,0xF3,0xFD,0xD4,0x92,0x78}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ISimpleBar_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ISimpleBar_FormatStringOffsetTable[] = + { + 2626, + 2654, + 2682 + }; + +static const MIDL_SERVER_INFO ISimpleBar_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ISimpleBar_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ISimpleBar_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ISimpleBar_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(6) _ISimpleBarProxyVtbl = +{ + &ISimpleBar_ProxyInfo, + &IID_ISimpleBar, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ISimpleBar::get_RenderWidth */ , + (void *)-1 /* ISimpleBar::get_Params */ , + (void *)-1 /* ISimpleBar::put_Params */ +}; + +const CInterfaceStubVtbl _ISimpleBarStubVtbl = +{ + &IID_ISimpleBar, + &ISimpleBar_ServerInfo, + 6, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerMouse, ver. 0.0, + GUID={0x5014E0B2,0x9156,0x412c,{0x94,0x6D,0x9D,0x4B,0xAA,0x9F,0x4C,0x51}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerMouse_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerMouse_FormatStringOffsetTable[] = + { + 2710, + 2738, + 2766, + 2794, + 2822, + 2850, + 2878 + }; + +static const MIDL_SERVER_INFO ILayerMouse_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerMouse_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerMouse_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerMouse_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _ILayerMouseProxyVtbl = +{ + &ILayerMouse_ProxyInfo, + &IID_ILayerMouse, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerMouse::MouseEnter */ , + (void *)-1 /* ILayerMouse::MouseExit */ , + (void *)-1 /* ILayerMouse::MouseDown */ , + (void *)-1 /* ILayerMouse::MouseUp */ , + (void *)-1 /* ILayerMouse::MouseMove */ , + (void *)-1 /* ILayerMouse::MouseDblClk */ , + (void *)-1 /* ILayerMouse::MouseEvent */ +}; + +const CInterfaceStubVtbl _ILayerMouseStubVtbl = +{ + &IID_ILayerMouse, + &ILayerMouse_ServerInfo, + 10, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerSchema, ver. 0.0, + GUID={0x829E0FB2,0xD0B5,0x4814,{0xBC,0xF9,0x6E,0xCF,0xA0,0x6C,0x9A,0xED}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerSchema_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerSchema_FormatStringOffsetTable[] = + { + 2918 + }; + +static const MIDL_SERVER_INFO ILayerSchema_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerSchema_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerSchema_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerSchema_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _ILayerSchemaProxyVtbl = +{ + &ILayerSchema_ProxyInfo, + &IID_ILayerSchema, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerSchema::SchemaLoad */ +}; + +const CInterfaceStubVtbl _ILayerSchemaStubVtbl = +{ + &IID_ILayerSchema, + &ILayerSchema_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IButton, ver. 0.0, + GUID={0x0F5765A4,0x9F83,0x4077,{0x88,0x84,0x6C,0xBD,0xDC,0xE3,0x48,0xF7}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IButton_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IButton_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 1226, + 1260, + 1288, + 1316, + 2952, + 1810, + 2992 + }; + +static const MIDL_SERVER_INFO IButton_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IButton_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IButton_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IButton_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(14) _IButtonProxyVtbl = +{ + &IButton_ProxyInfo, + &IID_IButton, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IControl::DestroyChild */ , + (void *)-1 /* IControl::get_ID */ , + (void *)-1 /* IControl::get_ChildCount */ , + (void *)-1 /* IControl::get_Child */ , + (void *)-1 /* IButton::SetImages */ , + (void *)-1 /* IButton::get_Matte */ , + (void *)-1 /* IButton::put_Matte */ +}; + + +static const PRPC_STUB_FUNCTION IButton_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IButtonStubVtbl = +{ + &IID_IButton, + &IButton_ServerInfo, + 14, + &IButton_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IPager, ver. 0.0, + GUID={0xBD9FC464,0xC0D8,0x4823,{0x82,0x55,0xE8,0x18,0xF8,0x83,0x6B,0x08}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPager_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPager_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 1226, + 1260, + 1288, + 1316, + 3020, + 3042, + 1838, + 3070, + 3098, + 3126, + 3154 + }; + +static const MIDL_SERVER_INFO IPager_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPager_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPager_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPager_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(18) _IPagerProxyVtbl = +{ + &IPager_ProxyInfo, + &IID_IPager, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IControl::DestroyChild */ , + (void *)-1 /* IControl::get_ID */ , + (void *)-1 /* IControl::get_ChildCount */ , + (void *)-1 /* IControl::get_Child */ , + (void *)-1 /* IPager::FinishCommand */ , + (void *)-1 /* IPager::ScrollTo */ , + (void *)-1 /* IPager::get_Command */ , + (void *)-1 /* IPager::put_Command */ , + (void *)-1 /* IPager::get_Offset */ , + (void *)-1 /* IPager::put_Offset */ , + (void *)-1 /* IPager::CreateClient */ +}; + + +static const PRPC_STUB_FUNCTION IPager_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IPagerStubVtbl = +{ + &IID_IPager, + &IPager_ServerInfo, + 18, + &IPager_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IPanel, ver. 0.0, + GUID={0x2B52B5CB,0x9E10,0x4238,{0x8F,0x62,0xA5,0x01,0x40,0x6E,0x3E,0xAB}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPanel_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPanel_FormatStringOffsetTable[] = + { + 3182, + 3216, + 3256, + 3284, + 3312, + 1698, + 3352 + }; + +static const MIDL_SERVER_INFO IPanel_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPanel_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPanel_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPanel_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _IPanelProxyVtbl = +{ + &IPanel_ProxyInfo, + &IID_IPanel, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPanel::AddView */ , + (void *)-1 /* IPanel::ActivateView */ , + (void *)-1 /* IPanel::RemoveView */ , + (void *)-1 /* IPanel::get_ActiveView */ , + (void *)-1 /* IPanel::LoadView */ , + (void *)-1 /* IPanel::Deactivate */ , + (void *)-1 /* IPanel::putref_Sink */ +}; + +const CInterfaceStubVtbl _IPanelStubVtbl = +{ + &IID_IPanel, + &IPanel_ServerInfo, + 10, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPanelSink, ver. 0.0, + GUID={0x85D70924,0x917D,0x41bb,{0x99,0x5D,0xC4,0x0E,0x6A,0xB2,0x1C,0x71}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPanelSink_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPanelSink_FormatStringOffsetTable[] = + { + 56 + }; + +static const MIDL_SERVER_INFO IPanelSink_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPanelSink_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPanelSink_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPanelSink_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _IPanelSinkProxyVtbl = +{ + &IPanelSink_ProxyInfo, + &IID_IPanelSink, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPanelSink::PanelDeactivate */ +}; + +const CInterfaceStubVtbl _IPanelSinkStubVtbl = +{ + &IID_IPanelSink, + &IPanelSink_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ICanvas, ver. 0.0, + GUID={0x9241862D,0xBA71,0x4317,{0x81,0x66,0x3A,0x3E,0x61,0xCE,0x3E,0x5F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ICanvas_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ICanvas_FormatStringOffsetTable[] = + { + 3380, + 1176, + 3414, + 1648, + 3442, + 3476, + 3510, + 3544, + 3572, + 3600, + 3628, + 3656, + 3696, + 3730, + 3758, + 3786, + 3820, + 2058 + }; + +static const MIDL_SERVER_INFO ICanvas_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ICanvas_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ICanvas_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ICanvas_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(21) _ICanvasProxyVtbl = +{ + &ICanvas_ProxyInfo, + &IID_ICanvas, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ICanvas::PushClipRect */ , + (void *)-1 /* ICanvas::PopClipRect */ , + (void *)-1 /* ICanvas::GetDC */ , + (void *)-1 /* ICanvas::ReleaseDC */ , + (void *)-1 /* ICanvas::GetSurface */ , + (void *)-1 /* ICanvas::Fill */ , + (void *)-1 /* ICanvas::Frame */ , + (void *)-1 /* ICanvas::GetClipParams */ , + (void *)-1 /* ICanvas::get_WasLost */ , + (void *)-1 /* ICanvas::get_Size */ , + (void *)-1 /* ICanvas::put_Size */ , + (void *)-1 /* ICanvas::Blt */ , + (void *)-1 /* ICanvas::HitTest */ , + (void *)-1 /* ICanvas::ToClient */ , + (void *)-1 /* ICanvas::ToScreen */ , + (void *)-1 /* ICanvas::OffsetOrg */ , + (void *)-1 /* ICanvas::SetClipRect */ , + (void *)-1 /* ICanvas::put_Alpha */ +}; + +const CInterfaceStubVtbl _ICanvasStubVtbl = +{ + &IID_ICanvas, + &ICanvas_ServerInfo, + 21, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IViewDisp, ver. 0.0, + GUID={0xF3B54A0C,0x61B9,0x4B7A,{0x9F,0xD8,0x82,0xB0,0x47,0x7F,0xB7,0xD9}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IViewDisp_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IViewDisp_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 3854, + 3888, + 3922, + 3950, + 3020, + 3978, + 4012, + 4034, + 4056, + 4084 + }; + +static const MIDL_SERVER_INFO IViewDisp_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IViewDisp_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IViewDisp_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IViewDisp_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(17) _IViewDispProxyVtbl = +{ + &IViewDisp_ProxyInfo, + &IID_IViewDisp, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IViewDisp::get_Control */ , + (void *)-1 /* IViewDisp::putref_Control */ , + (void *)-1 /* IViewDisp::get_Title */ , + (void *)-1 /* IViewDisp::put_Title */ , + (void *)-1 /* IViewDisp::Alert */ , + (void *)-1 /* IViewDisp::SetIcon */ , + (void *)-1 /* IViewDisp::Activate */ , + (void *)-1 /* IViewDisp::Deactivate */ , + (void *)-1 /* IViewDisp::put_Position */ , + (void *)-1 /* IViewDisp::get_Position */ +}; + + +static const PRPC_STUB_FUNCTION IViewDisp_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IViewDispStubVtbl = +{ + &IID_IViewDisp, + &IViewDisp_ServerInfo, + 17, + &IViewDisp_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IView, ver. 0.0, + GUID={0xA2AE18B7,0x85C9,0x451c,{0x8C,0xC3,0xD0,0xFF,0xE6,0xB8,0x6E,0xEB}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IView_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IView_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 3854, + 3888, + 3922, + 3950, + 3020, + 3978, + 4012, + 4034, + 4056, + 4084, + 4112, + 4158, + 4186 + }; + +static const MIDL_SERVER_INFO IView_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IView_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IView_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IView_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(20) _IViewProxyVtbl = +{ + &IView_ProxyInfo, + &IID_IView, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IViewDisp::get_Control */ , + (void *)-1 /* IViewDisp::putref_Control */ , + (void *)-1 /* IViewDisp::get_Title */ , + (void *)-1 /* IViewDisp::put_Title */ , + (void *)-1 /* IViewDisp::Alert */ , + (void *)-1 /* IViewDisp::SetIcon */ , + (void *)-1 /* IViewDisp::Activate */ , + (void *)-1 /* IViewDisp::Deactivate */ , + (void *)-1 /* IViewDisp::put_Position */ , + (void *)-1 /* IViewDisp::get_Position */ , + (void *)-1 /* IView::LoadControl */ , + (void *)-1 /* IView::LoadSchema */ , + (void *)-1 /* IView::put_Alpha */ +}; + + +static const PRPC_STUB_FUNCTION IView_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IViewStubVtbl = +{ + &IID_IView, + &IView_ServerInfo, + 20, + &IView_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IRootLayer, ver. 0.0, + GUID={0xD3006096,0xB293,0x47f5,{0x93,0x77,0xC1,0x2D,0xEF,0x5C,0x1D,0x34}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IRootLayer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IRootLayer_FormatStringOffsetTable[] = + { + 4214, + 2204, + 4254, + 4288 + }; + +static const MIDL_SERVER_INFO IRootLayer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IRootLayer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IRootLayer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IRootLayer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(7) _IRootLayerProxyVtbl = +{ + &IRootLayer_ProxyInfo, + &IID_IRootLayer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IRootLayer::CreateView */ , + (void *)-1 /* IRootLayer::SelectBar */ , + (void *)-1 /* IRootLayer::LoadView */ , + (void *)-1 /* IRootLayer::LoadViewObject */ +}; + +const CInterfaceStubVtbl _IRootLayerStubVtbl = +{ + &IID_IRootLayer, + &IRootLayer_ServerInfo, + 7, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IMessageMember, ver. 0.0, + GUID={0x05D14E34,0x0A23,0x4A9F,{0x95,0xCF,0x9D,0xB2,0x4B,0x3C,0xFB,0x9F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IMessageMember_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IMessageMember_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 4322, + 4356, + 1288 + }; + +static const MIDL_SERVER_INFO IMessageMember_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IMessageMember_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IMessageMember_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IMessageMember_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _IMessageMemberProxyVtbl = +{ + &IMessageMember_ProxyInfo, + &IID_IMessageMember, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IMessageMember::get_Member */ , + (void *)-1 /* IMessageMember::get_MemberName */ , + (void *)-1 /* IMessageMember::get_Count */ +}; + + +static const PRPC_STUB_FUNCTION IMessageMember_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IMessageMemberStubVtbl = +{ + &IID_IMessageMember, + &IMessageMember_ServerInfo, + 10, + &IMessageMember_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IMessage, ver. 0.0, + GUID={0x23EE0804,0xEAC7,0x493B,{0xBB,0x9D,0x22,0x98,0xFD,0x44,0xFF,0xA1}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IMessage_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IMessage_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 4390, + 4418, + 4446, + 4480, + 4514 + }; + +static const MIDL_SERVER_INFO IMessage_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IMessage_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IMessage_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IMessage_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(12) _IMessageProxyVtbl = +{ + &IMessage_ProxyInfo, + &IID_IMessage, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IMessage::get_Type */ , + (void *)-1 /* IMessage::get_Data */ , + (void *)-1 /* IMessage::get_Member */ , + (void *)-1 /* IMessage::get_MemberName */ , + (void *)-1 /* IMessage::get_Count */ +}; + + +static const PRPC_STUB_FUNCTION IMessage_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IMessageStubVtbl = +{ + &IID_IMessage, + &IMessage_ServerInfo, + 12, + &IMessage_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: INetworkFilter, ver. 0.0, + GUID={0xEEB0BE9E,0x46BD,0x493F,{0x97,0xE2,0x33,0x06,0x70,0xC0,0x9F,0x59}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO INetworkFilter_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short INetworkFilter_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 4542 + }; + +static const MIDL_SERVER_INFO INetworkFilter_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &INetworkFilter_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO INetworkFilter_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &INetworkFilter_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(8) _INetworkFilterProxyVtbl = +{ + &INetworkFilter_ProxyInfo, + &IID_INetworkFilter, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* INetworkFilter::Dispatch */ +}; + + +static const PRPC_STUB_FUNCTION INetworkFilter_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2 +}; + +CInterfaceStubVtbl _INetworkFilterStubVtbl = +{ + &IID_INetworkFilter, + &INetworkFilter_ServerInfo, + 8, + &INetworkFilter_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: ILayerKeyboard, ver. 0.0, + GUID={0x7500929F,0x4251,0x4373,{0xB9,0x78,0x28,0x6A,0x8A,0x8B,0xEC,0xED}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerKeyboard_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerKeyboard_FormatStringOffsetTable[] = + { + 4570, + 4598, + 4626 + }; + +static const MIDL_SERVER_INFO ILayerKeyboard_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerKeyboard_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerKeyboard_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerKeyboard_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(6) _ILayerKeyboardProxyVtbl = +{ + &ILayerKeyboard_ProxyInfo, + &IID_ILayerKeyboard, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerKeyboard::KeyboardChar */ , + (void *)-1 /* ILayerKeyboard::KeyboardEndCapture */ , + (void *)-1 /* ILayerKeyboard::KeyboardEvent */ +}; + +const CInterfaceStubVtbl _ILayerKeyboardStubVtbl = +{ + &IID_ILayerKeyboard, + &ILayerKeyboard_ServerInfo, + 6, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerPopup, ver. 0.0, + GUID={0x22072A97,0xE5E6,0x4d91,{0xA3,0x44,0x80,0x72,0x35,0xBF,0xA5,0xD8}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerPopup_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerPopup_FormatStringOffsetTable[] = + { + 4666 + }; + +static const MIDL_SERVER_INFO ILayerPopup_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerPopup_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerPopup_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerPopup_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _ILayerPopupProxyVtbl = +{ + &ILayerPopup_ProxyInfo, + &IID_ILayerPopup, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerPopup::PopupCancel */ +}; + +const CInterfaceStubVtbl _ILayerPopupStubVtbl = +{ + &IID_ILayerPopup, + &ILayerPopup_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerTimer, ver. 0.0, + GUID={0x5D6B8A1B,0x321A,0x479f,{0x93,0x47,0x55,0x72,0x5B,0xDA,0x3D,0xA9}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerTimer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerTimer_FormatStringOffsetTable[] = + { + 4700 + }; + +static const MIDL_SERVER_INFO ILayerTimer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerTimer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerTimer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerTimer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _ILayerTimerProxyVtbl = +{ + &ILayerTimer_ProxyInfo, + &IID_ILayerTimer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerTimer::TimerTimeout */ +}; + +const CInterfaceStubVtbl _ILayerTimerStubVtbl = +{ + &IID_ILayerTimer, + &ILayerTimer_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IWindowsMessageSink, ver. 0.0, + GUID={0xA68BE455,0xC241,0x49c5,{0x9F,0x8A,0x07,0x0E,0x4C,0xBE,0x43,0x0F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IWindowsMessageSink_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IWindowsMessageSink_FormatStringOffsetTable[] = + { + 4746, + 1176 + }; + +static const MIDL_SERVER_INFO IWindowsMessageSink_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IWindowsMessageSink_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IWindowsMessageSink_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IWindowsMessageSink_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IWindowsMessageSinkProxyVtbl = +{ + &IWindowsMessageSink_ProxyInfo, + &IID_IWindowsMessageSink, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IWindowsMessageSink::WindowMessage */ , + (void *)-1 /* IWindowsMessageSink::WindowMessageEnd */ +}; + +const CInterfaceStubVtbl _IWindowsMessageSinkStubVtbl = +{ + &IID_IWindowsMessageSink, + &IWindowsMessageSink_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IBrushImage, ver. 0.0, + GUID={0x50CDFD25,0x4F3B,0x4412,{0x96,0xBE,0x94,0x7A,0x6C,0x7B,0x93,0xA2}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IBrushImage_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IBrushImage_FormatStringOffsetTable[] = + { + 2626, + 2204 + }; + +static const MIDL_SERVER_INFO IBrushImage_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IBrushImage_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IBrushImage_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IBrushImage_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IBrushImageProxyVtbl = +{ + &IBrushImage_ProxyInfo, + &IID_IBrushImage, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IBrushImage::get_Color */ , + (void *)-1 /* IBrushImage::put_Color */ +}; + +const CInterfaceStubVtbl _IBrushImageStubVtbl = +{ + &IID_IBrushImage, + &IBrushImage_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IInputBuffer, ver. 0.0, + GUID={0x634D74B8,0xAFED,0x4710,{0x82,0xC9,0xB5,0x30,0x32,0x6E,0x1A,0xFA}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IInputBuffer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IInputBuffer_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 4798, + 4820, + 4848, + 4882, + 4922, + 4950 + }; + +static const MIDL_SERVER_INFO IInputBuffer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IInputBuffer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IInputBuffer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IInputBuffer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(13) _IInputBufferProxyVtbl = +{ + &IInputBuffer_ProxyInfo, + &IID_IInputBuffer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IInputBuffer::Clear */ , + (void *)-1 /* IInputBuffer::TypeText */ , + (void *)-1 /* IInputBuffer::Delay */ , + (void *)-1 /* IInputBuffer::MouseClick */ , + (void *)-1 /* IInputBuffer::get_Status */ , + (void *)-1 /* IInputBuffer::Run */ +}; + + +static const PRPC_STUB_FUNCTION IInputBuffer_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IInputBufferStubVtbl = +{ + &IID_IInputBuffer, + &IInputBuffer_ServerInfo, + 13, + &IInputBuffer_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IInputNotify, ver. 0.0, + GUID={0xE288C465,0x2DD6,0x4fcd,{0x95,0xE2,0x5B,0xBC,0x1A,0x1D,0x2D,0x32}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IInputNotify_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IInputNotify_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 4798, + 1698, + 4972, + 5006 + }; + +static const MIDL_SERVER_INFO IInputNotify_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IInputNotify_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IInputNotify_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IInputNotify_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(11) _IInputNotifyProxyVtbl = +{ + &IInputNotify_ProxyInfo, + &IID_IInputNotify, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IInputNotify::NotifyBegin */ , + (void *)-1 /* IInputNotify::NotifyEnd */ , + (void *)-1 /* IInputNotify::SetMousePos */ , + (void *)-1 /* IInputNotify::NotifyPause */ +}; + + +static const PRPC_STUB_FUNCTION IInputNotify_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IInputNotifyStubVtbl = +{ + &IID_IInputNotify, + &IInputNotify_ServerInfo, + 11, + &IInputNotify_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + +extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ]; + +static const MIDL_STUB_DESC Object_StubDesc = + { + 0, + NdrOleAllocate, + NdrOleFree, + 0, + 0, + 0, + 0, + 0, + __MIDL_TypeFormatString.Format, + 1, /* -error bounds_check flag */ + 0x20000, /* Ndr library version */ + 0, + 0x5030118, /* MIDL Version 5.3.280 */ + 0, + UserMarshalRoutines, + 0, /* notify & notify_flag routine table */ + 0x1, /* MIDL flag */ + 0, /* Reserved3 */ + 0, /* Reserved4 */ + 0 /* Reserved5 */ + }; + +#pragma data_seg(".rdata") + +static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] = + { + + { + BSTR_UserSize + ,BSTR_UserMarshal + ,BSTR_UserUnmarshal + ,BSTR_UserFree + }, + { + HDC_UserSize + ,HDC_UserMarshal + ,HDC_UserUnmarshal + ,HDC_UserFree + }, + { + VARIANT_UserSize + ,VARIANT_UserMarshal + ,VARIANT_UserUnmarshal + ,VARIANT_UserFree + } + + }; + + +#if !defined(__RPC_WIN32__) +#error Invalid build platform for this stub. +#endif + +#if !(TARGET_IS_NT40_OR_LATER) +#error You need a Windows NT 4.0 or later to run this stub because it uses these features: +#error -Oif or -Oicf, [wire_marshal] or [user_marshal] attribute. +#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems. +#error This app will die there with the RPC_X_WRONG_STUB_VERSION error. +#endif + + +static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString = + { + 0, + { + + /* Procedure LoadPlugin */ + + 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 8 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 10 */ NdrFcShort( 0x20 ), /* 32 */ +/* 12 */ NdrFcShort( 0x8 ), /* 8 */ +/* 14 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter clsidPlugin */ + +/* 16 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 18 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 20 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Return value */ + +/* 22 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 24 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 26 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure UnloadPlugin */ + +/* 28 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 30 */ NdrFcLong( 0x0 ), /* 0 */ +/* 34 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 36 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 38 */ NdrFcShort( 0x20 ), /* 32 */ +/* 40 */ NdrFcShort( 0x8 ), /* 8 */ +/* 42 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter clsidPlugin */ + +/* 44 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 46 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 48 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Return value */ + +/* 50 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 52 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 54 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PanelDeactivate */ + + + /* Procedure UnloadPlugin */ + +/* 56 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 58 */ NdrFcLong( 0x0 ), /* 0 */ +/* 62 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 64 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 66 */ NdrFcShort( 0x8 ), /* 8 */ +/* 68 */ NdrFcShort( 0x8 ), /* 8 */ +/* 70 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter nViewID */ + + + /* Parameter nID */ + +/* 72 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 74 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 76 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 78 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 80 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 82 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetDirectDraw */ + +/* 84 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 86 */ NdrFcLong( 0x0 ), /* 0 */ +/* 90 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 92 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 94 */ NdrFcShort( 0x20 ), /* 32 */ +/* 96 */ NdrFcShort( 0x8 ), /* 8 */ +/* 98 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter iid */ + +/* 100 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 102 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 104 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 106 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 108 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 110 */ NdrFcShort( 0x18 ), /* Type Offset=24 */ + + /* Return value */ + +/* 112 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 114 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 116 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetPrimarySurface */ + +/* 118 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 120 */ NdrFcLong( 0x0 ), /* 0 */ +/* 124 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 126 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 128 */ NdrFcShort( 0x0 ), /* 0 */ +/* 130 */ NdrFcShort( 0x8 ), /* 8 */ +/* 132 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter ppPrimary */ + +/* 134 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 136 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 138 */ NdrFcShort( 0x22 ), /* Type Offset=34 */ + + /* Return value */ + +/* 140 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 142 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 144 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Get3DDevice */ + +/* 146 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 148 */ NdrFcLong( 0x0 ), /* 0 */ +/* 152 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 154 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 156 */ NdrFcShort( 0x20 ), /* 32 */ +/* 158 */ NdrFcShort( 0x8 ), /* 8 */ +/* 160 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter iid */ + +/* 162 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 164 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 166 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 168 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 170 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 172 */ NdrFcShort( 0x38 ), /* Type Offset=56 */ + + /* Return value */ + +/* 174 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 176 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 178 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadBitmapFile */ + +/* 180 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 182 */ NdrFcLong( 0x0 ), /* 0 */ +/* 186 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 188 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 190 */ NdrFcShort( 0x0 ), /* 0 */ +/* 192 */ NdrFcShort( 0x8 ), /* 8 */ +/* 194 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strFilename */ + +/* 196 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 198 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 200 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter ppImage */ + +/* 202 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 204 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 206 */ NdrFcShort( 0x64 ), /* Type Offset=100 */ + + /* Return value */ + +/* 208 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 210 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 212 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetIconCache */ + +/* 214 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 216 */ NdrFcLong( 0x0 ), /* 0 */ +/* 220 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 222 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 224 */ NdrFcShort( 0x10 ), /* 16 */ +/* 226 */ NdrFcShort( 0x8 ), /* 8 */ +/* 228 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x3, /* 3 */ + + /* Parameter psz */ + +/* 230 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 232 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 234 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter ppCache */ + +/* 236 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 238 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 240 */ NdrFcShort( 0x86 ), /* Type Offset=134 */ + + /* Return value */ + +/* 242 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 244 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 246 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadBitmapPortal */ + +/* 248 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 250 */ NdrFcLong( 0x0 ), /* 0 */ +/* 254 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 256 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 258 */ NdrFcShort( 0x8 ), /* 8 */ +/* 260 */ NdrFcShort( 0x8 ), /* 8 */ +/* 262 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter nFile */ + +/* 264 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 266 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 268 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter __MIDL_0011 */ + +/* 270 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 272 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 274 */ NdrFcShort( 0x9c ), /* Type Offset=156 */ + + /* Return value */ + +/* 276 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 278 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 280 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateFont */ + +/* 282 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 284 */ NdrFcLong( 0x0 ), /* 0 */ +/* 288 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 290 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 292 */ NdrFcShort( 0x10 ), /* 16 */ +/* 294 */ NdrFcShort( 0x8 ), /* 8 */ +/* 296 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x5, /* 5 */ + + /* Parameter szFaceName */ + +/* 298 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 300 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 302 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter nHeight */ + +/* 304 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 306 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 308 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter dwFlags */ + +/* 310 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 312 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 314 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter ppFont */ + +/* 316 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 318 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 320 */ NdrFcShort( 0xa0 ), /* Type Offset=160 */ + + /* Return value */ + +/* 322 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 324 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 326 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetScreenSize */ + +/* 328 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 330 */ NdrFcLong( 0x0 ), /* 0 */ +/* 334 */ NdrFcShort( 0xb ), /* 11 */ +#ifndef _ALPHA_ +/* 336 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 338 */ NdrFcShort( 0x10 ), /* 16 */ +/* 340 */ NdrFcShort( 0x8 ), /* 8 */ +/* 342 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter sz */ + +/* 344 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 346 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 348 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 350 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 352 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 354 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateCanvas */ + +/* 356 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 358 */ NdrFcLong( 0x0 ), /* 0 */ +/* 362 */ NdrFcShort( 0xc ), /* 12 */ +#ifndef _ALPHA_ +/* 364 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 366 */ NdrFcShort( 0x10 ), /* 16 */ +/* 368 */ NdrFcShort( 0x8 ), /* 8 */ +/* 370 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x3, /* 3 */ + + /* Parameter psz */ + +/* 372 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 374 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 376 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter ppCanvas */ + +/* 378 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 380 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 382 */ NdrFcShort( 0x22 ), /* Type Offset=34 */ + + /* Return value */ + +/* 384 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 386 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 388 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateView */ + +/* 390 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 392 */ NdrFcLong( 0x0 ), /* 0 */ +/* 396 */ NdrFcShort( 0xd ), /* 13 */ +#ifndef _ALPHA_ +/* 398 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 400 */ NdrFcShort( 0x0 ), /* 0 */ +/* 402 */ NdrFcShort( 0x8 ), /* 8 */ +/* 404 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter pParams */ + +/* 406 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 408 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 410 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Parameter pLayer */ + +/* 412 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 414 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 416 */ NdrFcShort( 0xce ), /* Type Offset=206 */ + + /* Parameter ppView */ + +/* 418 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 420 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 422 */ NdrFcShort( 0xe0 ), /* Type Offset=224 */ + + /* Return value */ + +/* 424 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 426 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 428 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadView */ + +/* 430 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 432 */ NdrFcLong( 0x0 ), /* 0 */ +/* 436 */ NdrFcShort( 0xe ), /* 14 */ +#ifndef _ALPHA_ +/* 438 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 440 */ NdrFcShort( 0x0 ), /* 0 */ +/* 442 */ NdrFcShort( 0x8 ), /* 8 */ +/* 444 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strSchema */ + +/* 446 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 448 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 450 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter ppView */ + +/* 452 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 454 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 456 */ NdrFcShort( 0xe0 ), /* Type Offset=224 */ + + /* Return value */ + +/* 458 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 460 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 462 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateBrushImage */ + +/* 464 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 466 */ NdrFcLong( 0x0 ), /* 0 */ +/* 470 */ NdrFcShort( 0xf ), /* 15 */ +#ifndef _ALPHA_ +/* 472 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 474 */ NdrFcShort( 0x8 ), /* 8 */ +/* 476 */ NdrFcShort( 0x8 ), /* 8 */ +/* 478 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x3, /* 3 */ + + /* Parameter nColor */ + +/* 480 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 482 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 484 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter ppImg */ + +/* 486 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 488 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 490 */ NdrFcShort( 0x64 ), /* Type Offset=100 */ + + /* Return value */ + +/* 492 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 494 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 496 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadImageSchema */ + +/* 498 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 500 */ NdrFcLong( 0x0 ), /* 0 */ +/* 504 */ NdrFcShort( 0x10 ), /* 16 */ +#ifndef _ALPHA_ +/* 506 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 508 */ NdrFcShort( 0x0 ), /* 0 */ +/* 510 */ NdrFcShort( 0x8 ), /* 8 */ +/* 512 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter pSchema */ + +/* 514 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 516 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 518 */ NdrFcShort( 0xf6 ), /* Type Offset=246 */ + + /* Parameter ppImg */ + +/* 520 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 522 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 524 */ NdrFcShort( 0x64 ), /* Type Offset=100 */ + + /* Return value */ + +/* 526 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 528 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 530 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateFontSchema */ + +/* 532 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 534 */ NdrFcLong( 0x0 ), /* 0 */ +/* 538 */ NdrFcShort( 0x11 ), /* 17 */ +#ifndef _ALPHA_ +/* 540 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 542 */ NdrFcShort( 0x10 ), /* 16 */ +/* 544 */ NdrFcShort( 0x8 ), /* 8 */ +/* 546 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x5, /* 5 */ + + /* Parameter nDefHeight */ + +/* 548 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 550 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 552 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nDefOptions */ + +/* 554 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 556 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 558 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pSchema */ + +/* 560 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 562 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 564 */ NdrFcShort( 0xf6 ), /* Type Offset=246 */ + + /* Parameter ppCache */ + +/* 566 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 568 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 570 */ NdrFcShort( 0xa0 ), /* Type Offset=160 */ + + /* Return value */ + +/* 572 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 574 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 576 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadResourceModule */ + +/* 578 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 580 */ NdrFcLong( 0x0 ), /* 0 */ +/* 584 */ NdrFcShort( 0x12 ), /* 18 */ +#ifndef _ALPHA_ +/* 586 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 588 */ NdrFcShort( 0x0 ), /* 0 */ +/* 590 */ NdrFcShort( 0x10 ), /* 16 */ +/* 592 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strLibrary */ + +/* 594 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 596 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 598 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pnModule */ + +/* 600 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 602 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 604 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 606 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 608 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 610 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ResourcePath */ + +/* 612 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 614 */ NdrFcLong( 0x0 ), /* 0 */ +/* 618 */ NdrFcShort( 0x13 ), /* 19 */ +#ifndef _ALPHA_ +/* 620 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 622 */ NdrFcShort( 0x0 ), /* 0 */ +/* 624 */ NdrFcShort( 0x8 ), /* 8 */ +/* 626 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 628 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 630 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 632 */ NdrFcShort( 0x114 ), /* Type Offset=276 */ + + /* Return value */ + +/* 634 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 636 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 638 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Plugin */ + +/* 640 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 642 */ NdrFcLong( 0x0 ), /* 0 */ +/* 646 */ NdrFcShort( 0x14 ), /* 20 */ +#ifndef _ALPHA_ +/* 648 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 650 */ NdrFcShort( 0x0 ), /* 0 */ +/* 652 */ NdrFcShort( 0x8 ), /* 8 */ +/* 654 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strProgID */ + +/* 656 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 658 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 660 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pVal */ + +/* 662 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 664 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 666 */ NdrFcShort( 0x11e ), /* Type Offset=286 */ + + /* Return value */ + +/* 668 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 670 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 672 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_NetworkFilter */ + +/* 674 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 676 */ NdrFcLong( 0x0 ), /* 0 */ +/* 680 */ NdrFcShort( 0x15 ), /* 21 */ +#ifndef _ALPHA_ +/* 682 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 684 */ NdrFcShort( 0x0 ), /* 0 */ +/* 686 */ NdrFcShort( 0x8 ), /* 8 */ +/* 688 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strProgID */ + +/* 690 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 692 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 694 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pVal */ + +/* 696 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 698 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 700 */ NdrFcShort( 0x134 ), /* Type Offset=308 */ + + /* Return value */ + +/* 702 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 704 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 706 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadViewObject */ + +/* 708 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 710 */ NdrFcLong( 0x0 ), /* 0 */ +/* 714 */ NdrFcShort( 0x16 ), /* 22 */ +#ifndef _ALPHA_ +/* 716 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 718 */ NdrFcShort( 0x0 ), /* 0 */ +/* 720 */ NdrFcShort( 0x8 ), /* 8 */ +/* 722 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter pSchema */ + +/* 724 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 726 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 728 */ NdrFcShort( 0xf6 ), /* Type Offset=246 */ + + /* Parameter ppView */ + +/* 730 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 732 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 734 */ NdrFcShort( 0xe0 ), /* Type Offset=224 */ + + /* Return value */ + +/* 736 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 738 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 740 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateInputBuffer */ + +/* 742 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 744 */ NdrFcLong( 0x0 ), /* 0 */ +/* 748 */ NdrFcShort( 0x17 ), /* 23 */ +#ifndef _ALPHA_ +/* 750 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 752 */ NdrFcShort( 0x0 ), /* 0 */ +/* 754 */ NdrFcShort( 0x8 ), /* 8 */ +/* 756 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter ppInput */ + +/* 758 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 760 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 762 */ NdrFcShort( 0x14a ), /* Type Offset=330 */ + + /* Return value */ + +/* 764 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 766 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 768 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_HWND */ + +/* 770 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 772 */ NdrFcLong( 0x0 ), /* 0 */ +/* 776 */ NdrFcShort( 0x18 ), /* 24 */ +#ifndef _ALPHA_ +/* 778 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 780 */ NdrFcShort( 0x0 ), /* 0 */ +/* 782 */ NdrFcShort( 0x10 ), /* 16 */ +/* 784 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 786 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 788 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 790 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 792 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 794 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 796 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Focus */ + +/* 798 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 800 */ NdrFcLong( 0x0 ), /* 0 */ +/* 804 */ NdrFcShort( 0x19 ), /* 25 */ +#ifndef _ALPHA_ +/* 806 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 808 */ NdrFcShort( 0x0 ), /* 0 */ +/* 810 */ NdrFcShort( 0xe ), /* 14 */ +/* 812 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 814 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 816 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 818 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 820 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 822 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 824 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_OldWndProc */ + +/* 826 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 828 */ NdrFcLong( 0x0 ), /* 0 */ +/* 832 */ NdrFcShort( 0x1a ), /* 26 */ +#ifndef _ALPHA_ +/* 834 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 836 */ NdrFcShort( 0x0 ), /* 0 */ +/* 838 */ NdrFcShort( 0x10 ), /* 16 */ +/* 840 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pOldWndProc */ + +/* 842 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 844 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 846 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 848 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 850 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 852 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_CurrentSelection */ + +/* 854 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 856 */ NdrFcLong( 0x0 ), /* 0 */ +/* 860 */ NdrFcShort( 0x1b ), /* 27 */ +#ifndef _ALPHA_ +/* 862 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 864 */ NdrFcShort( 0x8 ), /* 8 */ +/* 866 */ NdrFcShort( 0x8 ), /* 8 */ +/* 868 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter nID */ + +/* 870 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 872 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 874 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 876 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 878 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 880 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_CurrentSelection */ + +/* 882 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 884 */ NdrFcLong( 0x0 ), /* 0 */ +/* 888 */ NdrFcShort( 0x1c ), /* 28 */ +#ifndef _ALPHA_ +/* 890 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 892 */ NdrFcShort( 0x0 ), /* 0 */ +/* 894 */ NdrFcShort( 0x10 ), /* 16 */ +/* 896 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter nID */ + +/* 898 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 900 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 902 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 904 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 906 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 908 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_PreviousSelection */ + +/* 910 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 912 */ NdrFcLong( 0x0 ), /* 0 */ +/* 916 */ NdrFcShort( 0x1d ), /* 29 */ +#ifndef _ALPHA_ +/* 918 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 920 */ NdrFcShort( 0x8 ), /* 8 */ +/* 922 */ NdrFcShort( 0x8 ), /* 8 */ +/* 924 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter nID */ + +/* 926 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 928 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 930 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 932 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 934 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 936 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_PreviousSelection */ + +/* 938 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 940 */ NdrFcLong( 0x0 ), /* 0 */ +/* 944 */ NdrFcShort( 0x1e ), /* 30 */ +#ifndef _ALPHA_ +/* 946 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 948 */ NdrFcShort( 0x0 ), /* 0 */ +/* 950 */ NdrFcShort( 0x10 ), /* 16 */ +/* 952 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter nID */ + +/* 954 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 956 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 958 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 960 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 962 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 964 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure WriteToChatWindow */ + +/* 966 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 968 */ NdrFcLong( 0x0 ), /* 0 */ +/* 972 */ NdrFcShort( 0x1f ), /* 31 */ +#ifndef _ALPHA_ +/* 974 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 976 */ NdrFcShort( 0x8 ), /* 8 */ +/* 978 */ NdrFcShort( 0x8 ), /* 8 */ +/* 980 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter szText */ + +/* 982 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 984 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 986 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter lColor */ + +/* 988 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 990 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 992 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 994 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 996 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 998 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetCursorPosition */ + +/* 1000 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1002 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1006 */ NdrFcShort( 0x20 ), /* 32 */ +#ifndef _ALPHA_ +/* 1008 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1010 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1012 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1014 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter x */ + +/* 1016 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1018 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1020 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter y */ + +/* 1022 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1024 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1026 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1028 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1030 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1032 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure QueryKeyboardMap */ + +/* 1034 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1036 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1040 */ NdrFcShort( 0x21 ), /* 33 */ +#ifndef _ALPHA_ +/* 1042 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1044 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1046 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1048 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter bstrName */ + +/* 1050 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 1052 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1054 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pAsciiVal */ + +/* 1056 */ NdrFcShort( 0x148 ), /* Flags: in, base type, simple ref, */ +#ifndef _ALPHA_ +/* 1058 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1060 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1062 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1064 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1066 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ChatText */ + +/* 1068 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1070 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1074 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 1076 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1078 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1080 */ NdrFcShort( 0xe ), /* 14 */ +/* 1082 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter bstrMsg */ + +/* 1084 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 1086 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1088 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pbEat */ + +/* 1090 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1092 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1094 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1096 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1098 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1100 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ChatMessage */ + +/* 1102 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1104 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1108 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 1110 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 1112 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1114 */ NdrFcShort( 0xe ), /* 14 */ +/* 1116 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter bstrMsg */ + +/* 1118 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 1120 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1122 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pColor */ + +/* 1124 */ NdrFcShort( 0x148 ), /* Flags: in, base type, simple ref, */ +#ifndef _ALPHA_ +/* 1126 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1128 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pbEat */ + +/* 1130 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1132 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1134 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1136 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1138 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1140 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Initialize */ + +/* 1142 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1144 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1148 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 1150 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1152 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1154 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1156 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter pSite */ + +/* 1158 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 1160 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1162 */ NdrFcShort( 0x168 ), /* Type Offset=360 */ + + /* Parameter nID */ + +/* 1164 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1166 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1168 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1170 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1172 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1174 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure WindowMessageEnd */ + + + /* Procedure PopClipRect */ + + + /* Procedure LayerDestroy */ + + + /* Procedure Terminate */ + +/* 1176 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1178 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1182 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 1184 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1186 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1188 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1190 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + +/* 1192 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1194 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1196 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_FriendlyName */ + +/* 1198 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1200 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1204 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 1206 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1208 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1210 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1212 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 1214 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1216 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1218 */ NdrFcShort( 0x114 ), /* Type Offset=276 */ + + /* Return value */ + +/* 1220 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1222 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1224 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure DestroyChild */ + +/* 1226 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1228 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1232 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 1234 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1236 */ NdrFcShort( 0xe ), /* 14 */ +/* 1238 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1240 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter nIndex */ + +/* 1242 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1244 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1246 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter posType */ + +/* 1248 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1250 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1252 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1254 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1256 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1258 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ID */ + +/* 1260 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1262 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1266 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 1268 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1270 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1272 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1274 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 1276 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1278 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1280 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1282 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1284 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1286 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Count */ + + + /* Procedure get_ChildCount */ + +/* 1288 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1290 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1294 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 1296 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1298 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1300 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1302 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + + + /* Parameter pVal */ + +/* 1304 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1306 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1308 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 1310 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1312 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1314 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Child */ + +/* 1316 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1318 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1322 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 1324 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 1326 */ NdrFcShort( 0xe ), /* 14 */ +/* 1328 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1330 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x4, /* 4 */ + + /* Parameter nIndex */ + +/* 1332 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1334 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1336 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter posType */ + +/* 1338 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1340 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1342 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 1344 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 1346 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1348 */ NdrFcShort( 0x17a ), /* Type Offset=378 */ + + /* Return value */ + +/* 1350 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1352 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1354 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LayerCreate */ + +/* 1356 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1358 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1362 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 1364 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1366 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1368 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1370 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pSite */ + +/* 1372 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 1374 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1376 */ NdrFcShort( 0x190 ), /* Type Offset=400 */ + + /* Return value */ + +/* 1378 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1380 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1382 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Position */ + +/* 1384 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1386 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1390 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 1392 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1394 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1396 */ NdrFcShort( 0x28 ), /* 40 */ +/* 1398 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 1400 */ NdrFcShort( 0x2012 ), /* Flags: must free, out, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1402 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1404 */ NdrFcShort( 0x1a2 ), /* Type Offset=418 */ + + /* Return value */ + +/* 1406 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1408 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1410 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Position */ + +/* 1412 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1414 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1418 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 1420 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1422 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1424 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1426 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 1428 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 1430 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1432 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Return value */ + +/* 1434 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1436 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1438 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Destroy */ + + + /* Procedure PreRender */ + +/* 1440 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1442 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1446 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 1448 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1450 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1452 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1454 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + + + /* Return value */ + +/* 1456 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1458 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1460 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Render */ + +/* 1462 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1464 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1468 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 1470 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1472 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1474 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1476 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pDest */ + +/* 1478 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 1480 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1482 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Return value */ + +/* 1484 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1486 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1488 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Reformat */ + +/* 1490 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1492 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1496 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 1498 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1500 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1502 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1504 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + +/* 1506 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1508 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1510 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure AdjustRenderArea */ + +/* 1512 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1514 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1518 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 1520 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1522 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1524 */ NdrFcShort( 0xe ), /* 14 */ +/* 1526 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter pDest */ + +/* 1528 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 1530 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1532 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Parameter pbVisible */ + +/* 1534 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1536 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1538 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1540 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1542 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1544 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure HitTest */ + +/* 1546 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1548 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1552 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 1554 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1556 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1558 */ NdrFcShort( 0xe ), /* 14 */ +/* 1560 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter pt */ + +/* 1562 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 1564 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1566 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter pbHit */ + +/* 1568 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1570 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1572 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1574 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1576 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1578 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateChild */ + +/* 1580 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1582 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1586 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 1588 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1590 */ NdrFcShort( 0x28 ), /* 40 */ +/* 1592 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1594 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter params */ + +/* 1596 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 1598 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1600 */ NdrFcShort( 0x1bc ), /* Type Offset=444 */ + + /* Parameter pSink */ + +/* 1602 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 1604 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1606 */ NdrFcShort( 0x1c8 ), /* Type Offset=456 */ + + /* Return value */ + +/* 1608 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1610 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1612 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetSink */ + +/* 1614 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1616 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1620 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 1622 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1624 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1626 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1628 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter iid */ + +/* 1630 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 1632 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1634 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 1636 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1638 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1640 */ NdrFcShort( 0x1da ), /* Type Offset=474 */ + + /* Return value */ + +/* 1642 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1644 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1646 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ReleaseDC */ + + + /* Procedure Invalidate */ + +/* 1648 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1650 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1654 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 1656 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1658 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1660 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1662 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + + + /* Return value */ + +/* 1664 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1666 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1668 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_PluginSite */ + +/* 1670 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1672 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1676 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 1678 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1680 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1682 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1684 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter ppSite */ + +/* 1686 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 1688 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1690 */ NdrFcShort( 0x1e4 ), /* Type Offset=484 */ + + /* Return value */ + +/* 1692 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1694 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1696 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure NotifyEnd */ + + + /* Procedure Deactivate */ + + + /* Procedure Reformat */ + +/* 1698 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1700 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1704 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 1706 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1708 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1710 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1712 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + +/* 1714 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1716 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1718 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetParentSink */ + +/* 1720 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1722 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1726 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 1728 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1730 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1732 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1734 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter iid */ + +/* 1736 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 1738 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1740 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 1742 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1744 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1746 */ NdrFcShort( 0x1e8 ), /* Type Offset=488 */ + + /* Return value */ + +/* 1748 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1750 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1752 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Position */ + +/* 1754 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1756 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1760 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 1762 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1764 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1766 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1768 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 1770 */ NdrFcShort( 0x4112 ), /* Flags: must free, out, simple ref, srv alloc size=16 */ +#ifndef _ALPHA_ +/* 1772 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1774 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Return value */ + +/* 1776 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1778 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1780 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Position */ + +/* 1782 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1784 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1788 */ NdrFcShort( 0xb ), /* 11 */ +#ifndef _ALPHA_ +/* 1790 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1792 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1794 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1796 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 1798 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 1800 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1802 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Return value */ + +/* 1804 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1806 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1808 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Matte */ + + + /* Procedure get_ID */ + +/* 1810 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1812 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1816 */ NdrFcShort( 0xc ), /* 12 */ +#ifndef _ALPHA_ +/* 1818 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1820 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1822 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1824 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + + + /* Parameter pVal */ + +/* 1826 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1828 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1830 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 1832 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1834 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1836 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Command */ + + + /* Procedure get_ChildCount */ + +/* 1838 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1840 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1844 */ NdrFcShort( 0xd ), /* 13 */ +#ifndef _ALPHA_ +/* 1846 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1848 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1850 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1852 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + + + /* Parameter pVal */ + +/* 1854 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1856 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1858 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 1860 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1862 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1864 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Child */ + +/* 1866 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1868 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1872 */ NdrFcShort( 0xe ), /* 14 */ +#ifndef _ALPHA_ +/* 1874 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 1876 */ NdrFcShort( 0xe ), /* 14 */ +/* 1878 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1880 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x4, /* 4 */ + + /* Parameter nIndex */ + +/* 1882 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1884 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1886 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter posType */ + +/* 1888 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1890 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1892 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 1894 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 1896 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1898 */ NdrFcShort( 0x1f6 ), /* Type Offset=502 */ + + /* Return value */ + +/* 1900 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1902 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1904 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CaptureKeyboard */ + +/* 1906 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1908 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1912 */ NdrFcShort( 0xf ), /* 15 */ +#ifndef _ALPHA_ +/* 1914 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1916 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1918 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1920 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + +/* 1922 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1924 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1926 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure IsChild */ + +/* 1928 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1930 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1934 */ NdrFcShort( 0x10 ), /* 16 */ +#ifndef _ALPHA_ +/* 1936 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 1938 */ NdrFcShort( 0x6 ), /* 6 */ +/* 1940 */ NdrFcShort( 0xe ), /* 14 */ +/* 1942 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter pSite */ + +/* 1944 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 1946 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1948 */ NdrFcShort( 0x190 ), /* Type Offset=400 */ + + /* Parameter bTestUnclipped */ + +/* 1950 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1952 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1954 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Parameter pbIsChild */ + +/* 1956 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 1958 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1960 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1962 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1964 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 1966 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Popup */ + +/* 1968 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1970 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1974 */ NdrFcShort( 0x11 ), /* 17 */ +#ifndef _ALPHA_ +/* 1976 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 1978 */ NdrFcShort( 0x6 ), /* 6 */ +/* 1980 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1982 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 1984 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 1986 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 1988 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1990 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 1992 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 1994 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ScreenPosition */ + +/* 1996 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1998 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2002 */ NdrFcShort( 0x12 ), /* 18 */ +#ifndef _ALPHA_ +/* 2004 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2006 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2008 */ NdrFcShort( 0x20 ), /* 32 */ +/* 2010 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 2012 */ NdrFcShort( 0x4112 ), /* Flags: must free, out, simple ref, srv alloc size=16 */ +#ifndef _ALPHA_ +/* 2014 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2016 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Return value */ + +/* 2018 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2020 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2022 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure StartTimer */ + +/* 2024 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2026 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2030 */ NdrFcShort( 0x13 ), /* 19 */ +#ifndef _ALPHA_ +/* 2032 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2034 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2036 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2038 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter nID */ + +/* 2040 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2042 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2044 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nInterval */ + +/* 2046 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2048 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2050 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2052 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2054 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2056 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Alpha */ + + + /* Procedure EndTimer */ + +/* 2058 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2060 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2064 */ NdrFcShort( 0x14 ), /* 20 */ +#ifndef _ALPHA_ +/* 2066 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2068 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2070 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2072 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter Alpha */ + + + /* Parameter nID */ + +/* 2074 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2076 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2078 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 2080 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2082 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2084 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Transparent */ + +/* 2086 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2088 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2092 */ NdrFcShort( 0x15 ), /* 21 */ +#ifndef _ALPHA_ +/* 2094 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2096 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2098 */ NdrFcShort( 0xe ), /* 14 */ +/* 2100 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 2102 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 2104 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2106 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2108 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2110 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2112 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Transparent */ + +/* 2114 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2116 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2120 */ NdrFcShort( 0x16 ), /* 22 */ +#ifndef _ALPHA_ +/* 2122 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2124 */ NdrFcShort( 0x6 ), /* 6 */ +/* 2126 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2128 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 2130 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2132 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2134 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2136 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2138 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2140 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Alpha */ + +/* 2142 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2144 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2148 */ NdrFcShort( 0x17 ), /* 23 */ +#ifndef _ALPHA_ +/* 2150 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2152 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2154 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2156 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter Alpha */ + +/* 2158 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2160 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2162 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2164 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2166 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2168 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure AddBar */ + +/* 2170 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2172 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2176 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 2178 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2180 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2182 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2184 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter nViewID */ + +/* 2186 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2188 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2190 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pParams */ + +/* 2192 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2194 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2196 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Return value */ + +/* 2198 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2200 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2202 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Color */ + + + /* Procedure SelectBar */ + + + /* Procedure RemoveBar */ + +/* 2204 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2206 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2210 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 2212 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2214 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2216 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2218 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + + + /* Parameter nID */ + + + /* Parameter nViewID */ + +/* 2220 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2222 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2224 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + +/* 2226 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2228 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2230 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Bar */ + +/* 2232 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2234 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2238 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 2240 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2242 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2244 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2246 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x3, /* 3 */ + + /* Parameter nViewID */ + +/* 2248 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2250 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2252 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 2254 */ NdrFcShort( 0x8113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=32 */ +#ifndef _ALPHA_ +/* 2256 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2258 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Return value */ + +/* 2260 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2262 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2264 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Bar */ + +/* 2266 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2268 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2272 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 2274 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2276 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2278 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2280 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter nViewID */ + +/* 2282 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2284 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2286 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter newVal */ + +/* 2288 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2290 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2292 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Return value */ + +/* 2294 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2296 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2298 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure DrawIcon */ + +/* 2300 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2302 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2306 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 2308 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 2310 */ NdrFcShort( 0x20 ), /* 32 */ +/* 2312 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2314 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x5, /* 5 */ + + /* Parameter ppt */ + +/* 2316 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2318 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2320 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter nFile */ + +/* 2322 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2324 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2326 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nModule */ + +/* 2328 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2330 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2332 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pTarget */ + +/* 2334 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 2336 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2338 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Return value */ + +/* 2340 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2342 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2344 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PatBlt */ + +/* 2346 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2348 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2352 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 2354 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2356 */ NdrFcShort( 0x28 ), /* 40 */ +/* 2358 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2360 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter pDest */ + +/* 2362 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 2364 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2366 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Parameter prcDest */ + +/* 2368 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2370 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2372 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Parameter ptOrigin */ + +/* 2374 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2376 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2378 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 2380 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2382 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2384 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure StretchBlt */ + +/* 2386 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2388 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2392 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 2394 */ NdrFcShort( 0x1c ), /* x86, MIPS, PPC Stack size/offset = 28 */ +#else + NdrFcShort( 0x38 ), /* Alpha Stack size/offset = 56 */ +#endif +/* 2396 */ NdrFcShort( 0x28 ), /* 40 */ +/* 2398 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2400 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x6, /* 6 */ + + /* Parameter pDest */ + +/* 2402 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 2404 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2406 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Parameter pptDest */ + +/* 2408 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2410 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2412 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter nWidth */ + +/* 2414 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2416 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2418 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nStartStretch */ + +/* 2420 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2422 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2424 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nEndStretch */ + +/* 2426 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2428 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2430 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2432 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2434 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 2436 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Blt */ + +/* 2438 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2440 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2444 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 2446 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2448 */ NdrFcShort( 0x28 ), /* 40 */ +/* 2450 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2452 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter rcSrc */ + +/* 2454 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2456 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2458 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Parameter pDest */ + +/* 2460 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 2462 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2464 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Parameter pptDest */ + +/* 2466 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2468 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2470 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 2472 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2474 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2476 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Size */ + +/* 2478 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2480 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2484 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 2486 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2488 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2490 */ NdrFcShort( 0x18 ), /* 24 */ +/* 2492 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 2494 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 2496 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2498 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 2500 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2502 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2504 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure DrawText */ + +/* 2506 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2508 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2512 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 2514 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 2516 */ NdrFcShort( 0x18 ), /* 24 */ +/* 2518 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2520 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x5, /* 5 */ + + /* Parameter pt */ + +/* 2522 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2524 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2526 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter szText */ + +/* 2528 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 2530 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2532 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter clr */ + +/* 2534 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2536 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2538 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pTarget */ + +/* 2540 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 2542 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2544 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Return value */ + +/* 2546 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2548 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2550 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MeasureText */ + +/* 2552 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2554 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2558 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 2560 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2562 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2564 */ NdrFcShort( 0x18 ), /* 24 */ +/* 2566 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter szText */ + +/* 2568 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 2570 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2572 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pszExt */ + +/* 2574 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 2576 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2578 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 2580 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2582 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2584 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure HitTest */ + +/* 2586 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2588 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2592 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 2594 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2596 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2598 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2600 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter szText */ + +/* 2602 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 2604 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2606 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter nPos */ + +/* 2608 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2610 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2612 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nIndex */ + +/* 2614 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 2616 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2618 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2620 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2622 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2624 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Color */ + + + /* Procedure get_RenderWidth */ + +/* 2626 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2628 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2632 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 2634 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2636 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2638 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2640 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + + + /* Parameter nWidth */ + +/* 2642 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 2644 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2646 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 2648 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2650 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2652 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Params */ + +/* 2654 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2656 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2660 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 2662 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2664 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2666 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2668 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 2670 */ NdrFcShort( 0x8113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=32 */ +#ifndef _ALPHA_ +/* 2672 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2674 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Return value */ + +/* 2676 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2678 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2680 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Params */ + +/* 2682 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2684 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2688 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 2690 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2692 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2694 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2696 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 2698 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2700 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2702 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Return value */ + +/* 2704 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2706 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2708 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseEnter */ + +/* 2710 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2712 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2716 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 2718 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2720 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2722 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2724 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pMouse */ + +/* 2726 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2728 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2730 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Return value */ + +/* 2732 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2734 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2736 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseExit */ + +/* 2738 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2740 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2744 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 2746 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2748 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2750 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2752 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pMouse */ + +/* 2754 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2756 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2758 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Return value */ + +/* 2760 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2762 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2764 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseDown */ + +/* 2766 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2768 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2772 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 2774 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2776 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2778 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2780 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pMouse */ + +/* 2782 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2784 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2786 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Return value */ + +/* 2788 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2790 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2792 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseUp */ + +/* 2794 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2796 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2800 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 2802 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2804 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2806 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2808 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pMouse */ + +/* 2810 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2812 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2814 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Return value */ + +/* 2816 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2818 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2820 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseMove */ + +/* 2822 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2824 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2828 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 2830 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2832 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2834 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2836 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pMouse */ + +/* 2838 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2840 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2842 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Return value */ + +/* 2844 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2846 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2848 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseDblClk */ + +/* 2850 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2852 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2856 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 2858 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2860 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2862 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2864 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pMouse */ + +/* 2866 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 2868 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2870 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Return value */ + +/* 2872 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2874 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2876 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseEvent */ + +/* 2878 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2880 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2884 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 2886 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2888 */ NdrFcShort( 0x18 ), /* 24 */ +/* 2890 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2892 */ 0x4, /* Oi2 Flags: has return, */ + 0x4, /* 4 */ + + /* Parameter nMsg */ + +/* 2894 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2896 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2898 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter wParam */ + +/* 2900 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2902 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2904 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter lParam */ + +/* 2906 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2908 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2910 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2912 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2914 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2916 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SchemaLoad */ + +/* 2918 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2920 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2924 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 2926 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2928 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2930 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2932 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter pView */ + +/* 2934 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 2936 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2938 */ NdrFcShort( 0xe4 ), /* Type Offset=228 */ + + /* Parameter pXMLSchema */ + +/* 2940 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 2942 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2944 */ NdrFcShort( 0xf6 ), /* Type Offset=246 */ + + /* Return value */ + +/* 2946 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2948 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2950 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetImages */ + +/* 2952 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2954 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2958 */ NdrFcShort( 0xb ), /* 11 */ +#ifndef _ALPHA_ +/* 2960 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 2962 */ NdrFcShort( 0x18 ), /* 24 */ +/* 2964 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2966 */ 0x4, /* Oi2 Flags: has return, */ + 0x4, /* 4 */ + + /* Parameter nModule */ + +/* 2968 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2970 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 2972 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nReleased */ + +/* 2974 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2976 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 2978 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nPressed */ + +/* 2980 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 2982 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 2984 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2986 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 2988 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 2990 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Matte */ + +/* 2992 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2994 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2998 */ NdrFcShort( 0xd ), /* 13 */ +#ifndef _ALPHA_ +/* 3000 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3002 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3004 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3006 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 3008 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3010 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3012 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3014 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3016 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3018 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Alert */ + + + /* Procedure FinishCommand */ + +/* 3020 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3022 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3026 */ NdrFcShort( 0xb ), /* 11 */ +#ifndef _ALPHA_ +/* 3028 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3030 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3032 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3034 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + + + /* Return value */ + +/* 3036 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3038 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3040 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ScrollTo */ + +/* 3042 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3044 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3048 */ NdrFcShort( 0xc ), /* 12 */ +#ifndef _ALPHA_ +/* 3050 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3052 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3054 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3056 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter ppt */ + +/* 3058 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3060 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3062 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3064 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3066 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3068 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Command */ + +/* 3070 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3072 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3076 */ NdrFcShort( 0xe ), /* 14 */ +#ifndef _ALPHA_ +/* 3078 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3080 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3082 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3084 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 3086 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3088 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3090 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3092 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3094 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3096 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Offset */ + +/* 3098 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3100 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3104 */ NdrFcShort( 0xf ), /* 15 */ +#ifndef _ALPHA_ +/* 3106 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3108 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3110 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3112 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 3114 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3116 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3118 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3120 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3122 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3124 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Offset */ + +/* 3126 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3128 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3132 */ NdrFcShort( 0x10 ), /* 16 */ +#ifndef _ALPHA_ +/* 3134 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3136 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3138 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3140 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 3142 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3144 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3146 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3148 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3150 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3152 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateClient */ + +/* 3154 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3156 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3160 */ NdrFcShort( 0x11 ), /* 17 */ +#ifndef _ALPHA_ +/* 3162 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3164 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3166 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3168 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pLayer */ + +/* 3170 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 3172 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3174 */ NdrFcShort( 0xce ), /* Type Offset=206 */ + + /* Return value */ + +/* 3176 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3178 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3180 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure AddView */ + +/* 3182 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3184 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3188 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 3190 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3192 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3194 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3196 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter nViewID */ + +/* 3198 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3200 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3202 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pLayer */ + +/* 3204 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 3206 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3208 */ NdrFcShort( 0xce ), /* Type Offset=206 */ + + /* Return value */ + +/* 3210 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3212 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3214 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ActivateView */ + +/* 3216 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3218 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3222 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 3224 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 3226 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3228 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3230 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter nViewID */ + +/* 3232 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3234 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3236 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pParams */ + +/* 3238 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3240 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3242 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Parameter pVal */ + +/* 3244 */ NdrFcShort( 0x148 ), /* Flags: in, base type, simple ref, */ +#ifndef _ALPHA_ +/* 3246 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3248 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3250 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3252 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3254 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure RemoveView */ + +/* 3256 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3258 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3262 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 3264 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3266 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3268 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3270 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter nViewID */ + +/* 3272 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3274 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3276 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3278 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3280 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3282 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ActiveView */ + +/* 3284 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3286 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3290 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 3292 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3294 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3296 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3298 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 3300 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3302 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3304 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3306 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3308 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3310 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadView */ + +/* 3312 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3314 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3318 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 3320 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 3322 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3324 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3326 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter nViewID */ + +/* 3328 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3330 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3332 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pView */ + +/* 3334 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 3336 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3338 */ NdrFcShort( 0xe4 ), /* Type Offset=228 */ + + /* Parameter pSchema */ + +/* 3340 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 3342 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3344 */ NdrFcShort( 0xf6 ), /* Type Offset=246 */ + + /* Return value */ + +/* 3346 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3348 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3350 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure putref_Sink */ + +/* 3352 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3354 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3358 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 3360 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3362 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3364 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3366 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 3368 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 3370 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3372 */ NdrFcShort( 0x21e ), /* Type Offset=542 */ + + /* Return value */ + +/* 3374 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3376 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3378 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PushClipRect */ + +/* 3380 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3382 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3386 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 3388 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3390 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3392 */ NdrFcShort( 0xe ), /* 14 */ +/* 3394 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter prc */ + +/* 3396 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3398 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3400 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Parameter pbVisible */ + +/* 3402 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3404 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3406 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3408 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3410 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3412 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetDC */ + +/* 3414 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3416 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3420 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 3422 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3424 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3426 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3428 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pdc */ + +/* 3430 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3432 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3434 */ NdrFcShort( 0x24c ), /* Type Offset=588 */ + + /* Return value */ + +/* 3436 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3438 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3440 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetSurface */ + +/* 3442 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3444 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3448 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 3450 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3452 */ NdrFcShort( 0x20 ), /* 32 */ +/* 3454 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3456 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x3, /* 3 */ + + /* Parameter iid */ + +/* 3458 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3460 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3462 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 3464 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 3466 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3468 */ NdrFcShort( 0x256 ), /* Type Offset=598 */ + + /* Return value */ + +/* 3470 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3472 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3474 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Fill */ + +/* 3476 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3478 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3482 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 3484 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3486 */ NdrFcShort( 0x20 ), /* 32 */ +/* 3488 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3490 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter prc */ + +/* 3492 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3494 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3496 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Parameter nRGB */ + +/* 3498 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3500 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3502 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3504 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3506 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3508 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Frame */ + +/* 3510 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3512 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3516 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 3518 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3520 */ NdrFcShort( 0x20 ), /* 32 */ +/* 3522 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3524 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter prc */ + +/* 3526 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3528 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3530 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Parameter nRGB */ + +/* 3532 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3534 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3536 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3538 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3540 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3542 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetClipParams */ + +/* 3544 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3546 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3550 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 3552 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3554 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3556 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3558 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pParams */ + +/* 3560 */ NdrFcShort( 0x8113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=32 */ +#ifndef _ALPHA_ +/* 3562 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3564 */ NdrFcShort( 0x264 ), /* Type Offset=612 */ + + /* Return value */ + +/* 3566 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3568 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3570 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_WasLost */ + +/* 3572 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3574 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3578 */ NdrFcShort( 0xb ), /* 11 */ +#ifndef _ALPHA_ +/* 3580 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3582 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3584 */ NdrFcShort( 0xe ), /* 14 */ +/* 3586 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 3588 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3590 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3592 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3594 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3596 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3598 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Size */ + +/* 3600 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3602 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3606 */ NdrFcShort( 0xc ), /* 12 */ +#ifndef _ALPHA_ +/* 3608 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3610 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3612 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3614 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 3616 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3618 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3620 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3622 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3624 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3626 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Size */ + +/* 3628 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3630 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3634 */ NdrFcShort( 0xd ), /* 13 */ +#ifndef _ALPHA_ +/* 3636 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3638 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3640 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3642 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 3644 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3646 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3648 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3650 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3652 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3654 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Blt */ + +/* 3656 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3658 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3662 */ NdrFcShort( 0xe ), /* 14 */ +#ifndef _ALPHA_ +/* 3664 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 3666 */ NdrFcShort( 0x28 ), /* 40 */ +/* 3668 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3670 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter prcSrc */ + +/* 3672 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3674 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3676 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Parameter pSrc */ + +/* 3678 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 3680 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3682 */ NdrFcShort( 0x278 ), /* Type Offset=632 */ + + /* Parameter pptDest */ + +/* 3684 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3686 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3688 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3690 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3692 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3694 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure HitTest */ + +/* 3696 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3698 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3702 */ NdrFcShort( 0xf ), /* 15 */ +#ifndef _ALPHA_ +/* 3704 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3706 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3708 */ NdrFcShort( 0xe ), /* 14 */ +/* 3710 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter ppt */ + +/* 3712 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3714 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3716 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter pbHit */ + +/* 3718 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3720 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3722 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3724 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3726 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3728 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ToClient */ + +/* 3730 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3732 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3736 */ NdrFcShort( 0x10 ), /* 16 */ +#ifndef _ALPHA_ +/* 3738 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3740 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3742 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3744 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pt */ + +/* 3746 */ NdrFcShort( 0x11a ), /* Flags: must free, in, out, simple ref, */ +#ifndef _ALPHA_ +/* 3748 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3750 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3752 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3754 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3756 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ToScreen */ + +/* 3758 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3760 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3764 */ NdrFcShort( 0x11 ), /* 17 */ +#ifndef _ALPHA_ +/* 3766 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3768 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3770 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3772 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter ppt */ + +/* 3774 */ NdrFcShort( 0x11a ), /* Flags: must free, in, out, simple ref, */ +#ifndef _ALPHA_ +/* 3776 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3778 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Return value */ + +/* 3780 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3782 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3784 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure OffsetOrg */ + +/* 3786 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3788 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3792 */ NdrFcShort( 0x12 ), /* 18 */ +#ifndef _ALPHA_ +/* 3794 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3796 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3798 */ NdrFcShort( 0xe ), /* 14 */ +/* 3800 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter ppt */ + +/* 3802 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3804 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3806 */ NdrFcShort( 0x7e ), /* Type Offset=126 */ + + /* Parameter pbVisible */ + +/* 3808 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3810 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3812 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3814 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3816 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3818 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetClipRect */ + +/* 3820 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3822 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3826 */ NdrFcShort( 0x13 ), /* 19 */ +#ifndef _ALPHA_ +/* 3828 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3830 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3832 */ NdrFcShort( 0xe ), /* 14 */ +/* 3834 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter prcClip */ + +/* 3836 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 3838 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3840 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Parameter pbVisible */ + +/* 3842 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3844 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3846 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3848 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3850 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3852 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Control */ + +/* 3854 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3856 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3860 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 3862 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3864 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3866 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3868 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strName */ + +/* 3870 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 3872 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3874 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter pVal */ + +/* 3876 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 3878 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3880 */ NdrFcShort( 0x17a ), /* Type Offset=378 */ + + /* Return value */ + +/* 3882 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3884 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3886 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure putref_Control */ + +/* 3888 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3890 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3894 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 3896 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 3898 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3900 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3902 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strName */ + +/* 3904 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 3906 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3908 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter newVal */ + +/* 3910 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 3912 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3914 */ NdrFcShort( 0x17e ), /* Type Offset=382 */ + + /* Return value */ + +/* 3916 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3918 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3920 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Title */ + +/* 3922 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3924 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3928 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 3930 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3932 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3934 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3936 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 3938 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 3940 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3942 */ NdrFcShort( 0x114 ), /* Type Offset=276 */ + + /* Return value */ + +/* 3944 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3946 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3948 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Title */ + +/* 3950 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3952 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3956 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 3958 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 3960 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3962 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3964 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter newVal */ + +/* 3966 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 3968 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3970 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Return value */ + +/* 3972 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 3974 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 3976 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetIcon */ + +/* 3978 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3980 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3984 */ NdrFcShort( 0xc ), /* 12 */ +#ifndef _ALPHA_ +/* 3986 */ NdrFcShort( 0x1c ), /* x86, MIPS, PPC Stack size/offset = 28 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 3988 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3990 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3992 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter icon */ + +/* 3994 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 3996 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 3998 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter iconlibrary */ + +/* 4000 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 4002 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4004 */ NdrFcShort( 0x65e ), /* Type Offset=1630 */ + + /* Return value */ + +/* 4006 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4008 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4010 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Activate */ + +/* 4012 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4014 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4018 */ NdrFcShort( 0xd ), /* 13 */ +#ifndef _ALPHA_ +/* 4020 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4022 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4024 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4026 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + +/* 4028 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4030 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4032 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Deactivate */ + +/* 4034 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4036 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4040 */ NdrFcShort( 0xe ), /* 14 */ +#ifndef _ALPHA_ +/* 4042 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4044 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4046 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4048 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + +/* 4050 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4052 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4054 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Position */ + +/* 4056 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4058 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4062 */ NdrFcShort( 0xf ), /* 15 */ +#ifndef _ALPHA_ +/* 4064 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4066 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4068 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4070 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 4072 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 4074 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4076 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Return value */ + +/* 4078 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4080 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4082 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Position */ + +/* 4084 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4086 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4090 */ NdrFcShort( 0x10 ), /* 16 */ +#ifndef _ALPHA_ +/* 4092 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4094 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4096 */ NdrFcShort( 0x20 ), /* 32 */ +/* 4098 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 4100 */ NdrFcShort( 0x4112 ), /* Flags: must free, out, simple ref, srv alloc size=16 */ +#ifndef _ALPHA_ +/* 4102 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4104 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Return value */ + +/* 4106 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4108 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4110 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadControl */ + +/* 4112 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4114 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4118 */ NdrFcShort( 0x11 ), /* 17 */ +#ifndef _ALPHA_ +/* 4120 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 4122 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4124 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4126 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x5, /* 5 */ + + /* Parameter pParent */ + +/* 4128 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 4130 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4132 */ NdrFcShort( 0x668 ), /* Type Offset=1640 */ + + /* Parameter nID */ + +/* 4134 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4136 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4138 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pXMLSource */ + +/* 4140 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 4142 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4144 */ NdrFcShort( 0x44c ), /* Type Offset=1100 */ + + /* Parameter pAssignedID */ + +/* 4146 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4148 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4150 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4152 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4154 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4156 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadSchema */ + +/* 4158 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4160 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4164 */ NdrFcShort( 0x12 ), /* 18 */ +#ifndef _ALPHA_ +/* 4166 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4168 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4170 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4172 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter strXMLSchema */ + +/* 4174 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 4176 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4178 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Return value */ + +/* 4180 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4182 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4184 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Alpha */ + +/* 4186 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4188 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4192 */ NdrFcShort( 0x13 ), /* 19 */ +#ifndef _ALPHA_ +/* 4194 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4196 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4198 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4200 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter Alpha */ + +/* 4202 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4204 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4206 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4208 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4210 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4212 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateView */ + +/* 4214 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4216 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4220 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 4222 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4224 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4226 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4228 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x4, /* 4 */ + + /* Parameter pParams */ + +/* 4230 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 4232 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4234 */ NdrFcShort( 0xba ), /* Type Offset=186 */ + + /* Parameter pLayer */ + +/* 4236 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 4238 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4240 */ NdrFcShort( 0x67a ), /* Type Offset=1658 */ + + /* Parameter ppView */ + +/* 4242 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 4244 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4246 */ NdrFcShort( 0x68c ), /* Type Offset=1676 */ + + /* Return value */ + +/* 4248 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4250 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4252 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadView */ + +/* 4254 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4256 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4260 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 4262 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4264 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4266 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4268 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter strXML */ + +/* 4270 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 4272 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4274 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Parameter ppView */ + +/* 4276 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 4278 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4280 */ NdrFcShort( 0x68c ), /* Type Offset=1676 */ + + /* Return value */ + +/* 4282 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4284 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4286 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadViewObject */ + +/* 4288 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4290 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4294 */ NdrFcShort( 0x6 ), /* 6 */ +#ifndef _ALPHA_ +/* 4296 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4298 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4300 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4302 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter pSchema */ + +/* 4304 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 4306 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4308 */ NdrFcShort( 0x44c ), /* Type Offset=1100 */ + + /* Parameter ppView */ + +/* 4310 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +#ifndef _ALPHA_ +/* 4312 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4314 */ NdrFcShort( 0x68c ), /* Type Offset=1676 */ + + /* Return value */ + +/* 4316 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4318 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4320 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Member */ + +/* 4322 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4324 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4328 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4330 */ NdrFcShort( 0x1c ), /* x86 Stack size/offset = 28 */ +#else + NdrFcShort( 0x20 ), /* MIPS Stack size/offset = 32 */ +#endif +#else + NdrFcShort( 0x20 ), /* PPC Stack size/offset = 32 */ +#endif +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4332 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4334 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4336 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter vIndex */ + +/* 4338 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4340 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* MIPS Stack size/offset = 8 */ +#endif +#else + NdrFcShort( 0x8 ), /* PPC Stack size/offset = 8 */ +#endif +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4342 */ NdrFcShort( 0x65e ), /* Type Offset=1630 */ + + /* Parameter pVal */ + +/* 4344 */ NdrFcShort( 0x4113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=16 */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4346 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */ +#else + NdrFcShort( 0x18 ), /* MIPS Stack size/offset = 24 */ +#endif +#else + NdrFcShort( 0x18 ), /* PPC Stack size/offset = 24 */ +#endif +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4348 */ NdrFcShort( 0x6aa ), /* Type Offset=1706 */ + + /* Return value */ + +/* 4350 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4352 */ NdrFcShort( 0x18 ), /* x86 Stack size/offset = 24 */ +#else + NdrFcShort( 0x1c ), /* MIPS Stack size/offset = 28 */ +#endif +#else + NdrFcShort( 0x1c ), /* PPC Stack size/offset = 28 */ +#endif +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4354 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_MemberName */ + +/* 4356 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4358 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4362 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 4364 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4366 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4368 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4370 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x3, /* 3 */ + + /* Parameter Index */ + +/* 4372 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4374 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4376 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 4378 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4380 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4382 */ NdrFcShort( 0x114 ), /* Type Offset=276 */ + + /* Return value */ + +/* 4384 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4386 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4388 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Type */ + +/* 4390 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4392 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4396 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 4398 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4400 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4402 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4404 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 4406 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4408 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4410 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4412 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4414 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4416 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Data */ + +/* 4418 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4420 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4424 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 4426 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4428 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4430 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4432 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 4434 */ NdrFcShort( 0x4113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=16 */ +#ifndef _ALPHA_ +/* 4436 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4438 */ NdrFcShort( 0x6aa ), /* Type Offset=1706 */ + + /* Return value */ + +/* 4440 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4442 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4444 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Member */ + +/* 4446 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4448 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4452 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4454 */ NdrFcShort( 0x1c ), /* x86 Stack size/offset = 28 */ +#else + NdrFcShort( 0x20 ), /* MIPS Stack size/offset = 32 */ +#endif +#else + NdrFcShort( 0x20 ), /* PPC Stack size/offset = 32 */ +#endif +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4456 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4458 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4460 */ 0x7, /* Oi2 Flags: srv must size, clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter vElement */ + +/* 4462 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4464 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* MIPS Stack size/offset = 8 */ +#endif +#else + NdrFcShort( 0x8 ), /* PPC Stack size/offset = 8 */ +#endif +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4466 */ NdrFcShort( 0x65e ), /* Type Offset=1630 */ + + /* Parameter pVal */ + +/* 4468 */ NdrFcShort( 0x4113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=16 */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4470 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */ +#else + NdrFcShort( 0x18 ), /* MIPS Stack size/offset = 24 */ +#endif +#else + NdrFcShort( 0x18 ), /* PPC Stack size/offset = 24 */ +#endif +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4472 */ NdrFcShort( 0x6aa ), /* Type Offset=1706 */ + + /* Return value */ + +/* 4474 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +#ifndef _PPC_ +#if !defined(_MIPS_) +/* 4476 */ NdrFcShort( 0x18 ), /* x86 Stack size/offset = 24 */ +#else + NdrFcShort( 0x1c ), /* MIPS Stack size/offset = 28 */ +#endif +#else + NdrFcShort( 0x1c ), /* PPC Stack size/offset = 28 */ +#endif +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4478 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_MemberName */ + +/* 4480 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4482 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4486 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 4488 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4490 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4492 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4494 */ 0x5, /* Oi2 Flags: srv must size, has return, */ + 0x3, /* 3 */ + + /* Parameter Index */ + +/* 4496 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4498 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4500 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 4502 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4504 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4506 */ NdrFcShort( 0x114 ), /* Type Offset=276 */ + + /* Return value */ + +/* 4508 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4510 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4512 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Count */ + +/* 4514 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4516 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4520 */ NdrFcShort( 0xb ), /* 11 */ +#ifndef _ALPHA_ +/* 4522 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4524 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4526 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4528 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 4530 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4532 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4534 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4536 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4538 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4540 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Dispatch */ + +/* 4542 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4544 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4548 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 4550 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4552 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4554 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4556 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter Message */ + +/* 4558 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +#ifndef _ALPHA_ +/* 4560 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4562 */ NdrFcShort( 0x6b4 ), /* Type Offset=1716 */ + + /* Return value */ + +/* 4564 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4566 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4568 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure KeyboardChar */ + +/* 4570 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4572 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4576 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 4578 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4580 */ NdrFcShort( 0xe ), /* 14 */ +/* 4582 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4584 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pKS */ + +/* 4586 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 4588 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4590 */ NdrFcShort( 0x6ca ), /* Type Offset=1738 */ + + /* Return value */ + +/* 4592 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4594 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4596 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure KeyboardEndCapture */ + +/* 4598 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4600 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4604 */ NdrFcShort( 0x4 ), /* 4 */ +#ifndef _ALPHA_ +/* 4606 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4608 */ NdrFcShort( 0x6 ), /* 6 */ +/* 4610 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4612 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter bCancel */ + +/* 4614 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4616 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4618 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4620 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4622 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4624 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure KeyboardEvent */ + +/* 4626 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4628 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4632 */ NdrFcShort( 0x5 ), /* 5 */ +#ifndef _ALPHA_ +/* 4634 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4636 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4638 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4640 */ 0x4, /* Oi2 Flags: has return, */ + 0x4, /* 4 */ + + /* Parameter nMsg */ + +/* 4642 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4644 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4646 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter wParam */ + +/* 4648 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4650 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4652 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter lParam */ + +/* 4654 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4656 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4658 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4660 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4662 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4664 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PopupCancel */ + +/* 4666 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4668 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4672 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 4674 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4676 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4678 */ NdrFcShort( 0xe ), /* 14 */ +/* 4680 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x3, /* 3 */ + + /* Parameter pMouse */ + +/* 4682 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +#ifndef _ALPHA_ +/* 4684 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4686 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Parameter pbContinue */ + +/* 4688 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4690 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4692 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4694 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4696 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4698 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure TimerTimeout */ + +/* 4700 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4702 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4706 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 4708 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 4710 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4712 */ NdrFcShort( 0xe ), /* 14 */ +/* 4714 */ 0x4, /* Oi2 Flags: has return, */ + 0x5, /* 5 */ + + /* Parameter nID */ + +/* 4716 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4718 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4720 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nInterval */ + +/* 4722 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4724 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4726 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nReps */ + +/* 4728 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4730 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4732 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pbContinue */ + +/* 4734 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4736 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4738 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4740 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4742 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4744 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure WindowMessage */ + +/* 4746 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4748 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4752 */ NdrFcShort( 0x3 ), /* 3 */ +#ifndef _ALPHA_ +/* 4754 */ NdrFcShort( 0x1c ), /* x86, MIPS, PPC Stack size/offset = 28 */ +#else + NdrFcShort( 0x38 ), /* Alpha Stack size/offset = 56 */ +#endif +/* 4756 */ NdrFcShort( 0x1e ), /* 30 */ +/* 4758 */ NdrFcShort( 0xe ), /* 14 */ +/* 4760 */ 0x4, /* Oi2 Flags: has return, */ + 0x6, /* 6 */ + + /* Parameter hWnd */ + +/* 4762 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4764 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4766 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter uMsg */ + +/* 4768 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4770 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4772 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Parameter wParam */ + +/* 4774 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4776 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4778 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter lParam */ + +/* 4780 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4782 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4784 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pbEat */ + +/* 4786 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4788 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4790 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4792 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4794 */ NdrFcShort( 0x18 ), /* x86, MIPS, PPC Stack size/offset = 24 */ +#else + NdrFcShort( 0x30 ), /* Alpha Stack size/offset = 48 */ +#endif +/* 4796 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure NotifyBegin */ + + + /* Procedure Clear */ + +/* 4798 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4800 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4804 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 4806 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4808 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4810 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4812 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + + + /* Return value */ + +/* 4814 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4816 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4818 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure TypeText */ + +/* 4820 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4822 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4826 */ NdrFcShort( 0x8 ), /* 8 */ +#ifndef _ALPHA_ +/* 4828 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4830 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4832 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4834 */ 0x6, /* Oi2 Flags: clt must size, has return, */ + 0x2, /* 2 */ + + /* Parameter strText */ + +/* 4836 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 4838 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4840 */ NdrFcShort( 0x5a ), /* Type Offset=90 */ + + /* Return value */ + +/* 4842 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4844 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4846 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Delay */ + +/* 4848 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4850 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4854 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 4856 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4858 */ NdrFcShort( 0xe ), /* 14 */ +/* 4860 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4862 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter nMilliseconds */ + +/* 4864 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4866 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4868 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter bAllowInput */ + +/* 4870 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4872 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4874 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4876 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4878 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4880 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseClick */ + +/* 4882 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4884 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4888 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 4890 */ NdrFcShort( 0x14 ), /* x86, MIPS, PPC Stack size/offset = 20 */ +#else + NdrFcShort( 0x28 ), /* Alpha Stack size/offset = 40 */ +#endif +/* 4892 */ NdrFcShort( 0x16 ), /* 22 */ +/* 4894 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4896 */ 0x4, /* Oi2 Flags: has return, */ + 0x4, /* 4 */ + + /* Parameter nX */ + +/* 4898 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4900 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4902 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nY */ + +/* 4904 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4906 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4908 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter eAction */ + +/* 4910 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4912 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4914 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4916 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4918 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4920 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Status */ + +/* 4922 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4924 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4928 */ NdrFcShort( 0xb ), /* 11 */ +#ifndef _ALPHA_ +/* 4930 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 4932 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4934 */ NdrFcShort( 0xe ), /* 14 */ +/* 4936 */ 0x4, /* Oi2 Flags: has return, */ + 0x2, /* 2 */ + + /* Parameter pVal */ + +/* 4938 */ NdrFcShort( 0x2010 ), /* Flags: out, srv alloc size=8 */ +#ifndef _ALPHA_ +/* 4940 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4942 */ NdrFcShort( 0x6d2 ), /* Type Offset=1746 */ + + /* Return value */ + +/* 4944 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4946 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4948 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Run */ + +/* 4950 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4952 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4956 */ NdrFcShort( 0xc ), /* 12 */ +#ifndef _ALPHA_ +/* 4958 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4960 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4962 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4964 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + +/* 4966 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 4968 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4970 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetMousePos */ + +/* 4972 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4974 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4978 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 4980 */ NdrFcShort( 0x10 ), /* x86, MIPS, PPC Stack size/offset = 16 */ +#else + NdrFcShort( 0x20 ), /* Alpha Stack size/offset = 32 */ +#endif +/* 4982 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4984 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4986 */ 0x4, /* Oi2 Flags: has return, */ + 0x3, /* 3 */ + + /* Parameter nX */ + +/* 4988 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4990 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 4992 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nY */ + +/* 4994 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +#ifndef _ALPHA_ +/* 4996 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 4998 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 5000 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 5002 */ NdrFcShort( 0xc ), /* x86, MIPS, PPC Stack size/offset = 12 */ +#else + NdrFcShort( 0x18 ), /* Alpha Stack size/offset = 24 */ +#endif +/* 5004 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure NotifyPause */ + +/* 5006 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5008 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5012 */ NdrFcShort( 0xa ), /* 10 */ +#ifndef _ALPHA_ +/* 5014 */ NdrFcShort( 0x8 ), /* x86, MIPS, PPC Stack size/offset = 8 */ +#else + NdrFcShort( 0x10 ), /* Alpha Stack size/offset = 16 */ +#endif +/* 5016 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5018 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5020 */ 0x4, /* Oi2 Flags: has return, */ + 0x1, /* 1 */ + + /* Return value */ + +/* 5022 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 5024 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 5026 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + 0x0 + } + }; + +static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString = + { + 0, + { + NdrFcShort( 0x0 ), /* 0 */ +/* 2 */ + 0x11, 0x0, /* FC_RP */ +/* 4 */ NdrFcShort( 0x8 ), /* Offset= 8 (12) */ +/* 6 */ + 0x1d, /* FC_SMFARRAY */ + 0x0, /* 0 */ +/* 8 */ NdrFcShort( 0x8 ), /* 8 */ +/* 10 */ 0x1, /* FC_BYTE */ + 0x5b, /* FC_END */ +/* 12 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 14 */ NdrFcShort( 0x10 ), /* 16 */ +/* 16 */ 0x8, /* FC_LONG */ + 0x6, /* FC_SHORT */ +/* 18 */ 0x6, /* FC_SHORT */ + 0x4c, /* FC_EMBEDDED_COMPLEX */ +/* 20 */ 0x0, /* 0 */ + NdrFcShort( 0xfffffff1 ), /* Offset= -15 (6) */ + 0x5b, /* FC_END */ +/* 24 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 26 */ NdrFcShort( 0x2 ), /* Offset= 2 (28) */ +/* 28 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 30 */ 0x28, /* Corr desc: parameter, FC_LONG */ + 0x0, /* */ +#ifndef _ALPHA_ +/* 32 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 34 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 36 */ NdrFcShort( 0x2 ), /* Offset= 2 (38) */ +/* 38 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 40 */ NdrFcLong( 0x9241862d ), /* -1841199571 */ +/* 44 */ NdrFcShort( 0xba71 ), /* -17807 */ +/* 46 */ NdrFcShort( 0x4317 ), /* 17175 */ +/* 48 */ 0x81, /* 129 */ + 0x66, /* 102 */ +/* 50 */ 0x3a, /* 58 */ + 0x3e, /* 62 */ +/* 52 */ 0x61, /* 97 */ + 0xce, /* 206 */ +/* 54 */ 0x3e, /* 62 */ + 0x5f, /* 95 */ +/* 56 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 58 */ NdrFcShort( 0x2 ), /* Offset= 2 (60) */ +/* 60 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 62 */ 0x28, /* Corr desc: parameter, FC_LONG */ + 0x0, /* */ +#ifndef _ALPHA_ +/* 64 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 66 */ + 0x12, 0x0, /* FC_UP */ +/* 68 */ NdrFcShort( 0xc ), /* Offset= 12 (80) */ +/* 70 */ + 0x1b, /* FC_CARRAY */ + 0x1, /* 1 */ +/* 72 */ NdrFcShort( 0x2 ), /* 2 */ +/* 74 */ 0x9, /* Corr desc: FC_ULONG */ + 0x0, /* */ +/* 76 */ NdrFcShort( 0xfffc ), /* -4 */ +/* 78 */ 0x6, /* FC_SHORT */ + 0x5b, /* FC_END */ +/* 80 */ + 0x17, /* FC_CSTRUCT */ + 0x3, /* 3 */ +/* 82 */ NdrFcShort( 0x8 ), /* 8 */ +/* 84 */ NdrFcShort( 0xfffffff2 ), /* Offset= -14 (70) */ +/* 86 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 88 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 90 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 92 */ NdrFcShort( 0x0 ), /* 0 */ +/* 94 */ NdrFcShort( 0x4 ), /* 4 */ +/* 96 */ NdrFcShort( 0x0 ), /* 0 */ +/* 98 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (66) */ +/* 100 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 102 */ NdrFcShort( 0x2 ), /* Offset= 2 (104) */ +/* 104 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 106 */ NdrFcLong( 0xbe566cec ), /* -1101632276 */ +/* 110 */ NdrFcShort( 0x6881 ), /* 26753 */ +/* 112 */ NdrFcShort( 0x481c ), /* 18460 */ +/* 114 */ 0xa1, /* 161 */ + 0x46, /* 70 */ +/* 116 */ 0x9f, /* 159 */ + 0x5a, /* 90 */ +/* 118 */ 0x32, /* 50 */ + 0x57, /* 87 */ +/* 120 */ 0x6b, /* 107 */ + 0xe6, /* 230 */ +/* 122 */ + 0x11, 0x0, /* FC_RP */ +/* 124 */ NdrFcShort( 0x2 ), /* Offset= 2 (126) */ +/* 126 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 128 */ NdrFcShort( 0x8 ), /* 8 */ +/* 130 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 132 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 134 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 136 */ NdrFcShort( 0x2 ), /* Offset= 2 (138) */ +/* 138 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 140 */ NdrFcLong( 0xdedcd5aa ), /* -555952726 */ +/* 144 */ NdrFcShort( 0xf6ca ), /* -2358 */ +/* 146 */ NdrFcShort( 0x4da5 ), /* 19877 */ +/* 148 */ 0xa6, /* 166 */ + 0x57, /* 87 */ +/* 150 */ 0xe8, /* 232 */ + 0x2f, /* 47 */ +/* 152 */ 0x12, /* 18 */ + 0x6a, /* 106 */ +/* 154 */ 0xbb, /* 187 */ + 0xcd, /* 205 */ +/* 156 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 158 */ NdrFcShort( 0xffffffca ), /* Offset= -54 (104) */ +/* 160 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 162 */ NdrFcShort( 0x2 ), /* Offset= 2 (164) */ +/* 164 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 166 */ NdrFcLong( 0x12eccb0f ), /* 317508367 */ +/* 170 */ NdrFcShort( 0x36a6 ), /* 13990 */ +/* 172 */ NdrFcShort( 0x451c ), /* 17692 */ +/* 174 */ 0xb0, /* 176 */ + 0x86, /* 134 */ +/* 176 */ 0x13, /* 19 */ + 0x6, /* 6 */ +/* 178 */ 0xb7, /* 183 */ + 0x4a, /* 74 */ +/* 180 */ 0xae, /* 174 */ + 0xc2, /* 194 */ +/* 182 */ + 0x11, 0x0, /* FC_RP */ +/* 184 */ NdrFcShort( 0x2 ), /* Offset= 2 (186) */ +/* 186 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 188 */ NdrFcShort( 0x20 ), /* 32 */ +/* 190 */ NdrFcShort( 0x0 ), /* 0 */ +/* 192 */ NdrFcShort( 0x0 ), /* Offset= 0 (192) */ +/* 194 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 196 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 198 */ NdrFcShort( 0xffffff94 ), /* Offset= -108 (90) */ +/* 200 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 202 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 204 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 206 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 208 */ NdrFcLong( 0xd63504f ), /* 224612431 */ +/* 212 */ NdrFcShort( 0xdeef ), /* -8465 */ +/* 214 */ NdrFcShort( 0x4a2d ), /* 18989 */ +/* 216 */ 0x97, /* 151 */ + 0x42, /* 66 */ +/* 218 */ 0x28, /* 40 */ + 0xdd, /* 221 */ +/* 220 */ 0x1b, /* 27 */ + 0xad, /* 173 */ +/* 222 */ 0xda, /* 218 */ + 0x7c, /* 124 */ +/* 224 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 226 */ NdrFcShort( 0x2 ), /* Offset= 2 (228) */ +/* 228 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 230 */ NdrFcLong( 0xa2ae18b7 ), /* -1565648713 */ +/* 234 */ NdrFcShort( 0x85c9 ), /* -31287 */ +/* 236 */ NdrFcShort( 0x451c ), /* 17692 */ +/* 238 */ 0x8c, /* 140 */ + 0xc3, /* 195 */ +/* 240 */ 0xd0, /* 208 */ + 0xff, /* 255 */ +/* 242 */ 0xe6, /* 230 */ + 0xb8, /* 184 */ +/* 244 */ 0x6e, /* 110 */ + 0xeb, /* 235 */ +/* 246 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 248 */ NdrFcLong( 0x0 ), /* 0 */ +/* 252 */ NdrFcShort( 0x0 ), /* 0 */ +/* 254 */ NdrFcShort( 0x0 ), /* 0 */ +/* 256 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 258 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 260 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 262 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 264 */ + 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */ +/* 266 */ 0x8, /* FC_LONG */ + 0x5c, /* FC_PAD */ +/* 268 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 270 */ NdrFcShort( 0x6 ), /* Offset= 6 (276) */ +/* 272 */ + 0x13, 0x0, /* FC_OP */ +/* 274 */ NdrFcShort( 0xffffff3e ), /* Offset= -194 (80) */ +/* 276 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 278 */ NdrFcShort( 0x0 ), /* 0 */ +/* 280 */ NdrFcShort( 0x4 ), /* 4 */ +/* 282 */ NdrFcShort( 0x0 ), /* 0 */ +/* 284 */ NdrFcShort( 0xfffffff4 ), /* Offset= -12 (272) */ +/* 286 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 288 */ NdrFcShort( 0x2 ), /* Offset= 2 (290) */ +/* 290 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 292 */ NdrFcLong( 0xba3e677f ), /* -1170315393 */ +/* 296 */ NdrFcShort( 0x8e44 ), /* -29116 */ +/* 298 */ NdrFcShort( 0x4829 ), /* 18473 */ +/* 300 */ 0x98, /* 152 */ + 0x2e, /* 46 */ +/* 302 */ 0x58, /* 88 */ + 0xbb, /* 187 */ +/* 304 */ 0xbc, /* 188 */ + 0x5c, /* 92 */ +/* 306 */ 0x5f, /* 95 */ + 0x9b, /* 155 */ +/* 308 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 310 */ NdrFcShort( 0x2 ), /* Offset= 2 (312) */ +/* 312 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 314 */ NdrFcLong( 0xeeb0be9e ), /* -290406754 */ +/* 318 */ NdrFcShort( 0x46bd ), /* 18109 */ +/* 320 */ NdrFcShort( 0x493f ), /* 18751 */ +/* 322 */ 0x97, /* 151 */ + 0xe2, /* 226 */ +/* 324 */ 0x33, /* 51 */ + 0x6, /* 6 */ +/* 326 */ 0x70, /* 112 */ + 0xc0, /* 192 */ +/* 328 */ 0x9f, /* 159 */ + 0x59, /* 89 */ +/* 330 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 332 */ NdrFcShort( 0x2 ), /* Offset= 2 (334) */ +/* 334 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 336 */ NdrFcLong( 0x634d74b8 ), /* 1666020536 */ +/* 340 */ NdrFcShort( 0xafed ), /* -20499 */ +/* 342 */ NdrFcShort( 0x4710 ), /* 18192 */ +/* 344 */ 0x82, /* 130 */ + 0xc9, /* 201 */ +/* 346 */ 0xb5, /* 181 */ + 0x30, /* 48 */ +/* 348 */ 0x32, /* 50 */ + 0x6e, /* 110 */ +/* 350 */ 0x1a, /* 26 */ + 0xfa, /* 250 */ +/* 352 */ + 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */ +/* 354 */ 0x6, /* FC_SHORT */ + 0x5c, /* FC_PAD */ +/* 356 */ + 0x11, 0x8, /* FC_RP [simple_pointer] */ +/* 358 */ 0x8, /* FC_LONG */ + 0x5c, /* FC_PAD */ +/* 360 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 362 */ NdrFcLong( 0x702d3901 ), /* 1882011905 */ +/* 366 */ NdrFcShort( 0xc13a ), /* -16070 */ +/* 368 */ NdrFcShort( 0x448e ), /* 17550 */ +/* 370 */ 0x88, /* 136 */ + 0x71, /* 113 */ +/* 372 */ 0xec, /* 236 */ + 0xdc, /* 220 */ +/* 374 */ 0x8b, /* 139 */ + 0xc8, /* 200 */ +/* 376 */ 0xd0, /* 208 */ + 0x79, /* 121 */ +/* 378 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 380 */ NdrFcShort( 0x2 ), /* Offset= 2 (382) */ +/* 382 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 384 */ NdrFcLong( 0x996b377c ), /* -1721026692 */ +/* 388 */ NdrFcShort( 0x1953 ), /* 6483 */ +/* 390 */ NdrFcShort( 0x4db1 ), /* 19889 */ +/* 392 */ 0xaa, /* 170 */ + 0xc1, /* 193 */ +/* 394 */ 0x15, /* 21 */ + 0x7f, /* 127 */ +/* 396 */ 0x72, /* 114 */ + 0x59, /* 89 */ +/* 398 */ 0x2d, /* 45 */ + 0x3e, /* 62 */ +/* 400 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 402 */ NdrFcLong( 0x5b7e9d99 ), /* 1535024537 */ +/* 406 */ NdrFcShort( 0xbb3a ), /* -17606 */ +/* 408 */ NdrFcShort( 0x475d ), /* 18269 */ +/* 410 */ 0x84, /* 132 */ + 0x2d, /* 45 */ +/* 412 */ 0x43, /* 67 */ + 0xeb, /* 235 */ +/* 414 */ 0xea, /* 234 */ + 0x82, /* 130 */ +/* 416 */ 0x84, /* 132 */ + 0xea, /* 234 */ +/* 418 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 420 */ NdrFcShort( 0x2 ), /* Offset= 2 (422) */ +/* 422 */ + 0x13, 0x0, /* FC_OP */ +/* 424 */ NdrFcShort( 0x2 ), /* Offset= 2 (426) */ +/* 426 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 428 */ NdrFcShort( 0x10 ), /* 16 */ +/* 430 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 432 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 434 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 436 */ + 0x11, 0x0, /* FC_RP */ +/* 438 */ NdrFcShort( 0xfffffff4 ), /* Offset= -12 (426) */ +/* 440 */ + 0x11, 0x0, /* FC_RP */ +/* 442 */ NdrFcShort( 0x2 ), /* Offset= 2 (444) */ +/* 444 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 446 */ NdrFcShort( 0x18 ), /* 24 */ +/* 448 */ 0x8, /* FC_LONG */ + 0x4c, /* FC_EMBEDDED_COMPLEX */ +/* 450 */ 0x0, /* 0 */ + NdrFcShort( 0xffffffe7 ), /* Offset= -25 (426) */ + 0x8, /* FC_LONG */ +/* 454 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 456 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 458 */ NdrFcLong( 0xd63504f ), /* 224612431 */ +/* 462 */ NdrFcShort( 0xdeef ), /* -8465 */ +/* 464 */ NdrFcShort( 0x4a2d ), /* 18989 */ +/* 466 */ 0x97, /* 151 */ + 0x42, /* 66 */ +/* 468 */ 0x28, /* 40 */ + 0xdd, /* 221 */ +/* 470 */ 0x1b, /* 27 */ + 0xad, /* 173 */ +/* 472 */ 0xda, /* 218 */ + 0x7c, /* 124 */ +/* 474 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 476 */ NdrFcShort( 0x2 ), /* Offset= 2 (478) */ +/* 478 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 480 */ 0x28, /* Corr desc: parameter, FC_LONG */ + 0x0, /* */ +#ifndef _ALPHA_ +/* 482 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 484 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 486 */ NdrFcShort( 0xffffff82 ), /* Offset= -126 (360) */ +/* 488 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 490 */ NdrFcShort( 0x2 ), /* Offset= 2 (492) */ +/* 492 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 494 */ 0x28, /* Corr desc: parameter, FC_LONG */ + 0x0, /* */ +#ifndef _ALPHA_ +/* 496 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 498 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 500 */ NdrFcShort( 0xffffffb6 ), /* Offset= -74 (426) */ +/* 502 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 504 */ NdrFcShort( 0xffffff98 ), /* Offset= -104 (400) */ +/* 506 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 508 */ NdrFcShort( 0xfffffebe ), /* Offset= -322 (186) */ +/* 510 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 512 */ NdrFcShort( 0xfffffe7e ), /* Offset= -386 (126) */ +/* 514 */ + 0x11, 0x0, /* FC_RP */ +/* 516 */ NdrFcShort( 0x2 ), /* Offset= 2 (518) */ +/* 518 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 520 */ NdrFcShort( 0x18 ), /* 24 */ +/* 522 */ NdrFcShort( 0x0 ), /* 0 */ +/* 524 */ NdrFcShort( 0x12 ), /* Offset= 18 (542) */ +/* 526 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 528 */ NdrFcShort( 0xfffffebe ), /* Offset= -322 (206) */ +/* 530 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 532 */ NdrFcShort( 0xfffffe6a ), /* Offset= -406 (126) */ +/* 534 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 536 */ NdrFcShort( 0xfffffe66 ), /* Offset= -410 (126) */ +/* 538 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 540 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 542 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 544 */ NdrFcLong( 0x85d70924 ), /* -2049504988 */ +/* 548 */ NdrFcShort( 0x917d ), /* -28291 */ +/* 550 */ NdrFcShort( 0x41bb ), /* 16827 */ +/* 552 */ 0x99, /* 153 */ + 0x5d, /* 93 */ +/* 554 */ 0xc4, /* 196 */ + 0xe, /* 14 */ +/* 556 */ 0x6a, /* 106 */ + 0xb2, /* 178 */ +/* 558 */ 0x1c, /* 28 */ + 0x71, /* 113 */ +/* 560 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 562 */ NdrFcShort( 0x1a ), /* Offset= 26 (588) */ +/* 564 */ + 0x13, 0x0, /* FC_OP */ +/* 566 */ NdrFcShort( 0x2 ), /* Offset= 2 (568) */ +/* 568 */ + 0x2a, /* FC_ENCAPSULATED_UNION */ + 0x48, /* 72 */ +/* 570 */ NdrFcShort( 0x4 ), /* 4 */ +/* 572 */ NdrFcShort( 0x2 ), /* 2 */ +/* 574 */ NdrFcLong( 0x48746457 ), /* 1215587415 */ +/* 578 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 580 */ NdrFcLong( 0x52746457 ), /* 1383359575 */ +/* 584 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 586 */ NdrFcShort( 0xffffffff ), /* Offset= -1 (585) */ +/* 588 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 590 */ NdrFcShort( 0x1 ), /* 1 */ +/* 592 */ NdrFcShort( 0x4 ), /* 4 */ +/* 594 */ NdrFcShort( 0x0 ), /* 0 */ +/* 596 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (564) */ +/* 598 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 600 */ NdrFcShort( 0x2 ), /* Offset= 2 (602) */ +/* 602 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 604 */ 0x28, /* Corr desc: parameter, FC_LONG */ + 0x0, /* */ +#ifndef _ALPHA_ +/* 606 */ NdrFcShort( 0x4 ), /* x86, MIPS, PPC Stack size/offset = 4 */ +#else + NdrFcShort( 0x8 ), /* Alpha Stack size/offset = 8 */ +#endif +/* 608 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 610 */ NdrFcShort( 0x2 ), /* Offset= 2 (612) */ +/* 612 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 614 */ NdrFcShort( 0x1c ), /* 28 */ +/* 616 */ NdrFcShort( 0x0 ), /* 0 */ +/* 618 */ NdrFcShort( 0x0 ), /* Offset= 0 (618) */ +/* 620 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 622 */ NdrFcShort( 0xffffff3c ), /* Offset= -196 (426) */ +/* 624 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 626 */ NdrFcShort( 0xfffffe0c ), /* Offset= -500 (126) */ +/* 628 */ 0x6, /* FC_SHORT */ + 0x3e, /* FC_STRUCTPAD2 */ +/* 630 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 632 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 634 */ NdrFcLong( 0x9241862d ), /* -1841199571 */ +/* 638 */ NdrFcShort( 0xba71 ), /* -17807 */ +/* 640 */ NdrFcShort( 0x4317 ), /* 17175 */ +/* 642 */ 0x81, /* 129 */ + 0x66, /* 102 */ +/* 644 */ 0x3a, /* 58 */ + 0x3e, /* 62 */ +/* 646 */ 0x61, /* 97 */ + 0xce, /* 206 */ +/* 648 */ 0x3e, /* 62 */ + 0x5f, /* 95 */ +/* 650 */ + 0x12, 0x0, /* FC_UP */ +/* 652 */ NdrFcShort( 0x3be ), /* Offset= 958 (1610) */ +/* 654 */ + 0x2b, /* FC_NON_ENCAPSULATED_UNION */ + 0x9, /* FC_ULONG */ +/* 656 */ 0x7, /* Corr desc: FC_USHORT */ + 0x0, /* */ +/* 658 */ NdrFcShort( 0xfff8 ), /* -8 */ +/* 660 */ NdrFcShort( 0x2 ), /* Offset= 2 (662) */ +/* 662 */ NdrFcShort( 0x10 ), /* 16 */ +/* 664 */ NdrFcShort( 0x2f ), /* 47 */ +/* 666 */ NdrFcLong( 0x14 ), /* 20 */ +/* 670 */ NdrFcShort( 0x800b ), /* Simple arm type: FC_HYPER */ +/* 672 */ NdrFcLong( 0x3 ), /* 3 */ +/* 676 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 678 */ NdrFcLong( 0x11 ), /* 17 */ +/* 682 */ NdrFcShort( 0x8001 ), /* Simple arm type: FC_BYTE */ +/* 684 */ NdrFcLong( 0x2 ), /* 2 */ +/* 688 */ NdrFcShort( 0x8006 ), /* Simple arm type: FC_SHORT */ +/* 690 */ NdrFcLong( 0x4 ), /* 4 */ +/* 694 */ NdrFcShort( 0x800a ), /* Simple arm type: FC_FLOAT */ +/* 696 */ NdrFcLong( 0x5 ), /* 5 */ +/* 700 */ NdrFcShort( 0x800c ), /* Simple arm type: FC_DOUBLE */ +/* 702 */ NdrFcLong( 0xb ), /* 11 */ +/* 706 */ NdrFcShort( 0x8006 ), /* Simple arm type: FC_SHORT */ +/* 708 */ NdrFcLong( 0xa ), /* 10 */ +/* 712 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 714 */ NdrFcLong( 0x6 ), /* 6 */ +/* 718 */ NdrFcShort( 0xe8 ), /* Offset= 232 (950) */ +/* 720 */ NdrFcLong( 0x7 ), /* 7 */ +/* 724 */ NdrFcShort( 0x800c ), /* Simple arm type: FC_DOUBLE */ +/* 726 */ NdrFcLong( 0x8 ), /* 8 */ +/* 730 */ NdrFcShort( 0xfffffd68 ), /* Offset= -664 (66) */ +/* 732 */ NdrFcLong( 0xd ), /* 13 */ +/* 736 */ NdrFcShort( 0xfffffe16 ), /* Offset= -490 (246) */ +/* 738 */ NdrFcLong( 0x9 ), /* 9 */ +/* 742 */ NdrFcShort( 0xd6 ), /* Offset= 214 (956) */ +/* 744 */ NdrFcLong( 0x2000 ), /* 8192 */ +/* 748 */ NdrFcShort( 0xe2 ), /* Offset= 226 (974) */ +/* 750 */ NdrFcLong( 0x24 ), /* 36 */ +/* 754 */ NdrFcShort( 0x2fa ), /* Offset= 762 (1516) */ +/* 756 */ NdrFcLong( 0x4024 ), /* 16420 */ +/* 760 */ NdrFcShort( 0x2f4 ), /* Offset= 756 (1516) */ +/* 762 */ NdrFcLong( 0x4011 ), /* 16401 */ +/* 766 */ NdrFcShort( 0x2f2 ), /* Offset= 754 (1520) */ +/* 768 */ NdrFcLong( 0x4002 ), /* 16386 */ +/* 772 */ NdrFcShort( 0x2f0 ), /* Offset= 752 (1524) */ +/* 774 */ NdrFcLong( 0x4003 ), /* 16387 */ +/* 778 */ NdrFcShort( 0x2ee ), /* Offset= 750 (1528) */ +/* 780 */ NdrFcLong( 0x4014 ), /* 16404 */ +/* 784 */ NdrFcShort( 0x2ec ), /* Offset= 748 (1532) */ +/* 786 */ NdrFcLong( 0x4004 ), /* 16388 */ +/* 790 */ NdrFcShort( 0x2ea ), /* Offset= 746 (1536) */ +/* 792 */ NdrFcLong( 0x4005 ), /* 16389 */ +/* 796 */ NdrFcShort( 0x2e8 ), /* Offset= 744 (1540) */ +/* 798 */ NdrFcLong( 0x400b ), /* 16395 */ +/* 802 */ NdrFcShort( 0x2d2 ), /* Offset= 722 (1524) */ +/* 804 */ NdrFcLong( 0x400a ), /* 16394 */ +/* 808 */ NdrFcShort( 0x2d0 ), /* Offset= 720 (1528) */ +/* 810 */ NdrFcLong( 0x4006 ), /* 16390 */ +/* 814 */ NdrFcShort( 0x2da ), /* Offset= 730 (1544) */ +/* 816 */ NdrFcLong( 0x4007 ), /* 16391 */ +/* 820 */ NdrFcShort( 0x2d0 ), /* Offset= 720 (1540) */ +/* 822 */ NdrFcLong( 0x4008 ), /* 16392 */ +/* 826 */ NdrFcShort( 0x2d2 ), /* Offset= 722 (1548) */ +/* 828 */ NdrFcLong( 0x400d ), /* 16397 */ +/* 832 */ NdrFcShort( 0x2d0 ), /* Offset= 720 (1552) */ +/* 834 */ NdrFcLong( 0x4009 ), /* 16393 */ +/* 838 */ NdrFcShort( 0x2ce ), /* Offset= 718 (1556) */ +/* 840 */ NdrFcLong( 0x6000 ), /* 24576 */ +/* 844 */ NdrFcShort( 0x2de ), /* Offset= 734 (1578) */ +/* 846 */ NdrFcLong( 0x400c ), /* 16396 */ +/* 850 */ NdrFcShort( 0x2dc ), /* Offset= 732 (1582) */ +/* 852 */ NdrFcLong( 0x10 ), /* 16 */ +/* 856 */ NdrFcShort( 0x8002 ), /* Simple arm type: FC_CHAR */ +/* 858 */ NdrFcLong( 0x12 ), /* 18 */ +/* 862 */ NdrFcShort( 0x8006 ), /* Simple arm type: FC_SHORT */ +/* 864 */ NdrFcLong( 0x13 ), /* 19 */ +/* 868 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 870 */ NdrFcLong( 0x15 ), /* 21 */ +/* 874 */ NdrFcShort( 0x800b ), /* Simple arm type: FC_HYPER */ +/* 876 */ NdrFcLong( 0x16 ), /* 22 */ +/* 880 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 882 */ NdrFcLong( 0x17 ), /* 23 */ +/* 886 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 888 */ NdrFcLong( 0xe ), /* 14 */ +/* 892 */ NdrFcShort( 0x2ba ), /* Offset= 698 (1590) */ +/* 894 */ NdrFcLong( 0x400e ), /* 16398 */ +/* 898 */ NdrFcShort( 0x2c0 ), /* Offset= 704 (1602) */ +/* 900 */ NdrFcLong( 0x4010 ), /* 16400 */ +/* 904 */ NdrFcShort( 0x2be ), /* Offset= 702 (1606) */ +/* 906 */ NdrFcLong( 0x4012 ), /* 16402 */ +/* 910 */ NdrFcShort( 0x266 ), /* Offset= 614 (1524) */ +/* 912 */ NdrFcLong( 0x4013 ), /* 16403 */ +/* 916 */ NdrFcShort( 0x264 ), /* Offset= 612 (1528) */ +/* 918 */ NdrFcLong( 0x4015 ), /* 16405 */ +/* 922 */ NdrFcShort( 0x262 ), /* Offset= 610 (1532) */ +/* 924 */ NdrFcLong( 0x4016 ), /* 16406 */ +/* 928 */ NdrFcShort( 0x258 ), /* Offset= 600 (1528) */ +/* 930 */ NdrFcLong( 0x4017 ), /* 16407 */ +/* 934 */ NdrFcShort( 0x252 ), /* Offset= 594 (1528) */ +/* 936 */ NdrFcLong( 0x0 ), /* 0 */ +/* 940 */ NdrFcShort( 0x0 ), /* Offset= 0 (940) */ +/* 942 */ NdrFcLong( 0x1 ), /* 1 */ +/* 946 */ NdrFcShort( 0x0 ), /* Offset= 0 (946) */ +/* 948 */ NdrFcShort( 0xffffffff ), /* Offset= -1 (947) */ +/* 950 */ + 0x15, /* FC_STRUCT */ + 0x7, /* 7 */ +/* 952 */ NdrFcShort( 0x8 ), /* 8 */ +/* 954 */ 0xb, /* FC_HYPER */ + 0x5b, /* FC_END */ +/* 956 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 958 */ NdrFcLong( 0x20400 ), /* 132096 */ +/* 962 */ NdrFcShort( 0x0 ), /* 0 */ +/* 964 */ NdrFcShort( 0x0 ), /* 0 */ +/* 966 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 968 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 970 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 972 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 974 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 976 */ NdrFcShort( 0x2 ), /* Offset= 2 (978) */ +/* 978 */ + 0x12, 0x0, /* FC_UP */ +/* 980 */ NdrFcShort( 0x206 ), /* Offset= 518 (1498) */ +/* 982 */ + 0x2a, /* FC_ENCAPSULATED_UNION */ + 0x49, /* 73 */ +/* 984 */ NdrFcShort( 0x18 ), /* 24 */ +/* 986 */ NdrFcShort( 0xa ), /* 10 */ +/* 988 */ NdrFcLong( 0x8 ), /* 8 */ +/* 992 */ NdrFcShort( 0x58 ), /* Offset= 88 (1080) */ +/* 994 */ NdrFcLong( 0xd ), /* 13 */ +/* 998 */ NdrFcShort( 0x8a ), /* Offset= 138 (1136) */ +/* 1000 */ NdrFcLong( 0x9 ), /* 9 */ +/* 1004 */ NdrFcShort( 0xb8 ), /* Offset= 184 (1188) */ +/* 1006 */ NdrFcLong( 0xc ), /* 12 */ +/* 1010 */ NdrFcShort( 0xe0 ), /* Offset= 224 (1234) */ +/* 1012 */ NdrFcLong( 0x24 ), /* 36 */ +/* 1016 */ NdrFcShort( 0x138 ), /* Offset= 312 (1328) */ +/* 1018 */ NdrFcLong( 0x800d ), /* 32781 */ +/* 1022 */ NdrFcShort( 0x142 ), /* Offset= 322 (1344) */ +/* 1024 */ NdrFcLong( 0x10 ), /* 16 */ +/* 1028 */ NdrFcShort( 0x15a ), /* Offset= 346 (1374) */ +/* 1030 */ NdrFcLong( 0x2 ), /* 2 */ +/* 1034 */ NdrFcShort( 0x172 ), /* Offset= 370 (1404) */ +/* 1036 */ NdrFcLong( 0x3 ), /* 3 */ +/* 1040 */ NdrFcShort( 0x18a ), /* Offset= 394 (1434) */ +/* 1042 */ NdrFcLong( 0x14 ), /* 20 */ +/* 1046 */ NdrFcShort( 0x1a2 ), /* Offset= 418 (1464) */ +/* 1048 */ NdrFcShort( 0xffffffff ), /* Offset= -1 (1047) */ +/* 1050 */ + 0x1b, /* FC_CARRAY */ + 0x3, /* 3 */ +/* 1052 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1054 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1056 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1058 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1060 */ + 0x48, /* FC_VARIABLE_REPEAT */ + 0x49, /* FC_FIXED_OFFSET */ +/* 1062 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1064 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1066 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1068 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1070 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1072 */ 0x12, 0x0, /* FC_UP */ +/* 1074 */ NdrFcShort( 0xfffffc1e ), /* Offset= -994 (80) */ +/* 1076 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1078 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1080 */ + 0x16, /* FC_PSTRUCT */ + 0x3, /* 3 */ +/* 1082 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1084 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1086 */ + 0x46, /* FC_NO_REPEAT */ + 0x5c, /* FC_PAD */ +/* 1088 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1090 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1092 */ 0x11, 0x0, /* FC_RP */ +/* 1094 */ NdrFcShort( 0xffffffd4 ), /* Offset= -44 (1050) */ +/* 1096 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1098 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 1100 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1102 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1106 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1108 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1110 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1112 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1114 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1116 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1118 */ + 0x21, /* FC_BOGUS_ARRAY */ + 0x3, /* 3 */ +/* 1120 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1122 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1124 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1126 */ NdrFcLong( 0xffffffff ), /* -1 */ +/* 1130 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1132 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (1100) */ +/* 1134 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1136 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1138 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1140 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1142 */ NdrFcShort( 0x6 ), /* Offset= 6 (1148) */ +/* 1144 */ 0x8, /* FC_LONG */ + 0x36, /* FC_POINTER */ +/* 1146 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1148 */ + 0x11, 0x0, /* FC_RP */ +/* 1150 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (1118) */ +/* 1152 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1154 */ NdrFcLong( 0x20400 ), /* 132096 */ +/* 1158 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1160 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1162 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1164 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1166 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1168 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1170 */ + 0x21, /* FC_BOGUS_ARRAY */ + 0x3, /* 3 */ +/* 1172 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1174 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1176 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1178 */ NdrFcLong( 0xffffffff ), /* -1 */ +/* 1182 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1184 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (1152) */ +/* 1186 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1188 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1190 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1192 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1194 */ NdrFcShort( 0x6 ), /* Offset= 6 (1200) */ +/* 1196 */ 0x8, /* FC_LONG */ + 0x36, /* FC_POINTER */ +/* 1198 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1200 */ + 0x11, 0x0, /* FC_RP */ +/* 1202 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (1170) */ +/* 1204 */ + 0x1b, /* FC_CARRAY */ + 0x3, /* 3 */ +/* 1206 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1208 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1210 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1212 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1214 */ + 0x48, /* FC_VARIABLE_REPEAT */ + 0x49, /* FC_FIXED_OFFSET */ +/* 1216 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1218 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1220 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1222 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1224 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1226 */ 0x12, 0x0, /* FC_UP */ +/* 1228 */ NdrFcShort( 0x17e ), /* Offset= 382 (1610) */ +/* 1230 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1232 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1234 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1236 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1238 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1240 */ NdrFcShort( 0x6 ), /* Offset= 6 (1246) */ +/* 1242 */ 0x8, /* FC_LONG */ + 0x36, /* FC_POINTER */ +/* 1244 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1246 */ + 0x11, 0x0, /* FC_RP */ +/* 1248 */ NdrFcShort( 0xffffffd4 ), /* Offset= -44 (1204) */ +/* 1250 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1252 */ NdrFcLong( 0x2f ), /* 47 */ +/* 1256 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1258 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1260 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1262 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1264 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1266 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1268 */ + 0x1b, /* FC_CARRAY */ + 0x0, /* 0 */ +/* 1270 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1272 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1274 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1276 */ 0x1, /* FC_BYTE */ + 0x5b, /* FC_END */ +/* 1278 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1280 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1282 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1284 */ NdrFcShort( 0xa ), /* Offset= 10 (1294) */ +/* 1286 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 1288 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1290 */ NdrFcShort( 0xffffffd8 ), /* Offset= -40 (1250) */ +/* 1292 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1294 */ + 0x12, 0x0, /* FC_UP */ +/* 1296 */ NdrFcShort( 0xffffffe4 ), /* Offset= -28 (1268) */ +/* 1298 */ + 0x1b, /* FC_CARRAY */ + 0x3, /* 3 */ +/* 1300 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1302 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1304 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1306 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1308 */ + 0x48, /* FC_VARIABLE_REPEAT */ + 0x49, /* FC_FIXED_OFFSET */ +/* 1310 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1312 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1314 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1316 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1318 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1320 */ 0x12, 0x0, /* FC_UP */ +/* 1322 */ NdrFcShort( 0xffffffd4 ), /* Offset= -44 (1278) */ +/* 1324 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1326 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1328 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1330 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1332 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1334 */ NdrFcShort( 0x6 ), /* Offset= 6 (1340) */ +/* 1336 */ 0x8, /* FC_LONG */ + 0x36, /* FC_POINTER */ +/* 1338 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1340 */ + 0x11, 0x0, /* FC_RP */ +/* 1342 */ NdrFcShort( 0xffffffd4 ), /* Offset= -44 (1298) */ +/* 1344 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1346 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1348 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1350 */ NdrFcShort( 0xa ), /* Offset= 10 (1360) */ +/* 1352 */ 0x8, /* FC_LONG */ + 0x36, /* FC_POINTER */ +/* 1354 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1356 */ NdrFcShort( 0xfffffac0 ), /* Offset= -1344 (12) */ +/* 1358 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1360 */ + 0x11, 0x0, /* FC_RP */ +/* 1362 */ NdrFcShort( 0xffffff0c ), /* Offset= -244 (1118) */ +/* 1364 */ + 0x1b, /* FC_CARRAY */ + 0x0, /* 0 */ +/* 1366 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1368 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1370 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1372 */ 0x1, /* FC_BYTE */ + 0x5b, /* FC_END */ +/* 1374 */ + 0x16, /* FC_PSTRUCT */ + 0x3, /* 3 */ +/* 1376 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1378 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1380 */ + 0x46, /* FC_NO_REPEAT */ + 0x5c, /* FC_PAD */ +/* 1382 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1384 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1386 */ 0x12, 0x0, /* FC_UP */ +/* 1388 */ NdrFcShort( 0xffffffe8 ), /* Offset= -24 (1364) */ +/* 1390 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1392 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 1394 */ + 0x1b, /* FC_CARRAY */ + 0x1, /* 1 */ +/* 1396 */ NdrFcShort( 0x2 ), /* 2 */ +/* 1398 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1400 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1402 */ 0x6, /* FC_SHORT */ + 0x5b, /* FC_END */ +/* 1404 */ + 0x16, /* FC_PSTRUCT */ + 0x3, /* 3 */ +/* 1406 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1408 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1410 */ + 0x46, /* FC_NO_REPEAT */ + 0x5c, /* FC_PAD */ +/* 1412 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1414 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1416 */ 0x12, 0x0, /* FC_UP */ +/* 1418 */ NdrFcShort( 0xffffffe8 ), /* Offset= -24 (1394) */ +/* 1420 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1422 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 1424 */ + 0x1b, /* FC_CARRAY */ + 0x3, /* 3 */ +/* 1426 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1428 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1430 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1432 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 1434 */ + 0x16, /* FC_PSTRUCT */ + 0x3, /* 3 */ +/* 1436 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1438 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1440 */ + 0x46, /* FC_NO_REPEAT */ + 0x5c, /* FC_PAD */ +/* 1442 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1444 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1446 */ 0x12, 0x0, /* FC_UP */ +/* 1448 */ NdrFcShort( 0xffffffe8 ), /* Offset= -24 (1424) */ +/* 1450 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1452 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 1454 */ + 0x1b, /* FC_CARRAY */ + 0x7, /* 7 */ +/* 1456 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1458 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1460 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1462 */ 0xb, /* FC_HYPER */ + 0x5b, /* FC_END */ +/* 1464 */ + 0x16, /* FC_PSTRUCT */ + 0x3, /* 3 */ +/* 1466 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1468 */ + 0x4b, /* FC_PP */ + 0x5c, /* FC_PAD */ +/* 1470 */ + 0x46, /* FC_NO_REPEAT */ + 0x5c, /* FC_PAD */ +/* 1472 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1474 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1476 */ 0x12, 0x0, /* FC_UP */ +/* 1478 */ NdrFcShort( 0xffffffe8 ), /* Offset= -24 (1454) */ +/* 1480 */ + 0x5b, /* FC_END */ + + 0x8, /* FC_LONG */ +/* 1482 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 1484 */ + 0x1b, /* FC_CARRAY */ + 0x3, /* 3 */ +/* 1486 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1488 */ 0x7, /* Corr desc: FC_USHORT */ + 0x0, /* */ +/* 1490 */ NdrFcShort( 0xffd8 ), /* -40 */ +/* 1492 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1494 */ NdrFcShort( 0xfffffaa8 ), /* Offset= -1368 (126) */ +/* 1496 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1498 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1500 */ NdrFcShort( 0x28 ), /* 40 */ +/* 1502 */ NdrFcShort( 0xffffffee ), /* Offset= -18 (1484) */ +/* 1504 */ NdrFcShort( 0x0 ), /* Offset= 0 (1504) */ +/* 1506 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1508 */ 0x38, /* FC_ALIGNM4 */ + 0x8, /* FC_LONG */ +/* 1510 */ 0x8, /* FC_LONG */ + 0x4c, /* FC_EMBEDDED_COMPLEX */ +/* 1512 */ 0x0, /* 0 */ + NdrFcShort( 0xfffffded ), /* Offset= -531 (982) */ + 0x5b, /* FC_END */ +/* 1516 */ + 0x12, 0x0, /* FC_UP */ +/* 1518 */ NdrFcShort( 0xffffff10 ), /* Offset= -240 (1278) */ +/* 1520 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1522 */ 0x1, /* FC_BYTE */ + 0x5c, /* FC_PAD */ +/* 1524 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1526 */ 0x6, /* FC_SHORT */ + 0x5c, /* FC_PAD */ +/* 1528 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1530 */ 0x8, /* FC_LONG */ + 0x5c, /* FC_PAD */ +/* 1532 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1534 */ 0xb, /* FC_HYPER */ + 0x5c, /* FC_PAD */ +/* 1536 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1538 */ 0xa, /* FC_FLOAT */ + 0x5c, /* FC_PAD */ +/* 1540 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1542 */ 0xc, /* FC_DOUBLE */ + 0x5c, /* FC_PAD */ +/* 1544 */ + 0x12, 0x0, /* FC_UP */ +/* 1546 */ NdrFcShort( 0xfffffdac ), /* Offset= -596 (950) */ +/* 1548 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1550 */ NdrFcShort( 0xfffffa34 ), /* Offset= -1484 (66) */ +/* 1552 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1554 */ NdrFcShort( 0xfffffe3a ), /* Offset= -454 (1100) */ +/* 1556 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1558 */ NdrFcShort( 0x2 ), /* Offset= 2 (1560) */ +/* 1560 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1562 */ NdrFcLong( 0x20400 ), /* 132096 */ +/* 1566 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1568 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1570 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1572 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1574 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1576 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1578 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1580 */ NdrFcShort( 0xfffffda2 ), /* Offset= -606 (974) */ +/* 1582 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1584 */ NdrFcShort( 0x2 ), /* Offset= 2 (1586) */ +/* 1586 */ + 0x12, 0x0, /* FC_UP */ +/* 1588 */ NdrFcShort( 0x16 ), /* Offset= 22 (1610) */ +/* 1590 */ + 0x15, /* FC_STRUCT */ + 0x7, /* 7 */ +/* 1592 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1594 */ 0x6, /* FC_SHORT */ + 0x1, /* FC_BYTE */ +/* 1596 */ 0x1, /* FC_BYTE */ + 0x38, /* FC_ALIGNM4 */ +/* 1598 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1600 */ 0xb, /* FC_HYPER */ + 0x5b, /* FC_END */ +/* 1602 */ + 0x12, 0x0, /* FC_UP */ +/* 1604 */ NdrFcShort( 0xfffffff2 ), /* Offset= -14 (1590) */ +/* 1606 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1608 */ 0x2, /* FC_CHAR */ + 0x5c, /* FC_PAD */ +/* 1610 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x7, /* 7 */ +/* 1612 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1614 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1616 */ NdrFcShort( 0x0 ), /* Offset= 0 (1616) */ +/* 1618 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 1620 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1622 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1624 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1626 */ NdrFcShort( 0xfffffc34 ), /* Offset= -972 (654) */ +/* 1628 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1630 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 1632 */ NdrFcShort( 0x2 ), /* 2 */ +/* 1634 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1636 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1638 */ NdrFcShort( 0xfffffc24 ), /* Offset= -988 (650) */ +/* 1640 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1642 */ NdrFcLong( 0x5b7e9d99 ), /* 1535024537 */ +/* 1646 */ NdrFcShort( 0xbb3a ), /* -17606 */ +/* 1648 */ NdrFcShort( 0x475d ), /* 18269 */ +/* 1650 */ 0x84, /* 132 */ + 0x2d, /* 45 */ +/* 1652 */ 0x43, /* 67 */ + 0xeb, /* 235 */ +/* 1654 */ 0xea, /* 234 */ + 0x82, /* 130 */ +/* 1656 */ 0x84, /* 132 */ + 0xea, /* 234 */ +/* 1658 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1660 */ NdrFcLong( 0xd63504f ), /* 224612431 */ +/* 1664 */ NdrFcShort( 0xdeef ), /* -8465 */ +/* 1666 */ NdrFcShort( 0x4a2d ), /* 18989 */ +/* 1668 */ 0x97, /* 151 */ + 0x42, /* 66 */ +/* 1670 */ 0x28, /* 40 */ + 0xdd, /* 221 */ +/* 1672 */ 0x1b, /* 27 */ + 0xad, /* 173 */ +/* 1674 */ 0xda, /* 218 */ + 0x7c, /* 124 */ +/* 1676 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 1678 */ NdrFcShort( 0x2 ), /* Offset= 2 (1680) */ +/* 1680 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1682 */ NdrFcLong( 0xa2ae18b7 ), /* -1565648713 */ +/* 1686 */ NdrFcShort( 0x85c9 ), /* -31287 */ +/* 1688 */ NdrFcShort( 0x451c ), /* 17692 */ +/* 1690 */ 0x8c, /* 140 */ + 0xc3, /* 195 */ +/* 1692 */ 0xd0, /* 208 */ + 0xff, /* 255 */ +/* 1694 */ 0xe6, /* 230 */ + 0xb8, /* 184 */ +/* 1696 */ 0x6e, /* 110 */ + 0xeb, /* 235 */ +/* 1698 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 1700 */ NdrFcShort( 0x6 ), /* Offset= 6 (1706) */ +/* 1702 */ + 0x13, 0x0, /* FC_OP */ +/* 1704 */ NdrFcShort( 0xffffffa2 ), /* Offset= -94 (1610) */ +/* 1706 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 1708 */ NdrFcShort( 0x2 ), /* 2 */ +/* 1710 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1712 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1714 */ NdrFcShort( 0xfffffff4 ), /* Offset= -12 (1702) */ +/* 1716 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1718 */ NdrFcLong( 0x23ee0804 ), /* 602802180 */ +/* 1722 */ NdrFcShort( 0xeac7 ), /* -5433 */ +/* 1724 */ NdrFcShort( 0x493b ), /* 18747 */ +/* 1726 */ 0xbb, /* 187 */ + 0x9d, /* 157 */ +/* 1728 */ 0x22, /* 34 */ + 0x98, /* 152 */ +/* 1730 */ 0xfd, /* 253 */ + 0x44, /* 68 */ +/* 1732 */ 0xff, /* 255 */ + 0xa1, /* 161 */ +/* 1734 */ + 0x11, 0x0, /* FC_RP */ +/* 1736 */ NdrFcShort( 0x2 ), /* Offset= 2 (1738) */ +/* 1738 */ + 0x15, /* FC_STRUCT */ + 0x1, /* 1 */ +/* 1740 */ NdrFcShort( 0x6 ), /* 6 */ +/* 1742 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1744 */ 0x6, /* FC_SHORT */ + 0x5b, /* FC_END */ +/* 1746 */ + 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */ +/* 1748 */ 0xd, /* FC_ENUM16 */ + 0x5c, /* FC_PAD */ + + 0x0 + } + }; + +const CInterfaceProxyVtbl * _Inject_ProxyVtblList[] = +{ + ( CInterfaceProxyVtbl *) &_IPluginSiteProxyVtbl, + ( CInterfaceProxyVtbl *) &_IMessageProxyVtbl, + ( CInterfaceProxyVtbl *) &_IViewDispProxyVtbl, + ( CInterfaceProxyVtbl *) &_IFontCacheProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerTimerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPanelSinkProxyVtbl, + ( CInterfaceProxyVtbl *) &_IBrushImageProxyVtbl, + ( CInterfaceProxyVtbl *) &_ICanvasProxyVtbl, + ( CInterfaceProxyVtbl *) &_IMessageMemberProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IWindowsMessageSinkProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPagerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IInputNotifyProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPluginSinkProxyVtbl, + ( CInterfaceProxyVtbl *) &_IFontCacheDispProxyVtbl, + ( CInterfaceProxyVtbl *) &_IControlProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPluginProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerRenderProxyVtbl, + ( CInterfaceProxyVtbl *) &_IBarManagerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IRootLayerProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerPopupProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerSiteProxyVtbl, + ( CInterfaceProxyVtbl *) &_INetworkFilterProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerKeyboardProxyVtbl, + ( CInterfaceProxyVtbl *) &_IButtonProxyVtbl, + ( CInterfaceProxyVtbl *) &_IManagerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IIconCacheProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerSchemaProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerMouseProxyVtbl, + ( CInterfaceProxyVtbl *) &_IViewProxyVtbl, + ( CInterfaceProxyVtbl *) &_IInputBufferProxyVtbl, + ( CInterfaceProxyVtbl *) &_IImageCacheDispProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPanelProxyVtbl, + ( CInterfaceProxyVtbl *) &_ISimpleBarProxyVtbl, + ( CInterfaceProxyVtbl *) &_IImageCacheProxyVtbl, + 0 +}; + +const CInterfaceStubVtbl * _Inject_StubVtblList[] = +{ + ( CInterfaceStubVtbl *) &_IPluginSiteStubVtbl, + ( CInterfaceStubVtbl *) &_IMessageStubVtbl, + ( CInterfaceStubVtbl *) &_IViewDispStubVtbl, + ( CInterfaceStubVtbl *) &_IFontCacheStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerTimerStubVtbl, + ( CInterfaceStubVtbl *) &_IPanelSinkStubVtbl, + ( CInterfaceStubVtbl *) &_IBrushImageStubVtbl, + ( CInterfaceStubVtbl *) &_ICanvasStubVtbl, + ( CInterfaceStubVtbl *) &_IMessageMemberStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerStubVtbl, + ( CInterfaceStubVtbl *) &_IWindowsMessageSinkStubVtbl, + ( CInterfaceStubVtbl *) &_IPagerStubVtbl, + ( CInterfaceStubVtbl *) &_IInputNotifyStubVtbl, + ( CInterfaceStubVtbl *) &_IPluginSinkStubVtbl, + ( CInterfaceStubVtbl *) &_IFontCacheDispStubVtbl, + ( CInterfaceStubVtbl *) &_IControlStubVtbl, + ( CInterfaceStubVtbl *) &_IPluginStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerRenderStubVtbl, + ( CInterfaceStubVtbl *) &_IBarManagerStubVtbl, + ( CInterfaceStubVtbl *) &_IRootLayerStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerPopupStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerSiteStubVtbl, + ( CInterfaceStubVtbl *) &_INetworkFilterStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerKeyboardStubVtbl, + ( CInterfaceStubVtbl *) &_IButtonStubVtbl, + ( CInterfaceStubVtbl *) &_IManagerStubVtbl, + ( CInterfaceStubVtbl *) &_IIconCacheStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerSchemaStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerMouseStubVtbl, + ( CInterfaceStubVtbl *) &_IViewStubVtbl, + ( CInterfaceStubVtbl *) &_IInputBufferStubVtbl, + ( CInterfaceStubVtbl *) &_IImageCacheDispStubVtbl, + ( CInterfaceStubVtbl *) &_IPanelStubVtbl, + ( CInterfaceStubVtbl *) &_ISimpleBarStubVtbl, + ( CInterfaceStubVtbl *) &_IImageCacheStubVtbl, + 0 +}; + +PCInterfaceName const _Inject_InterfaceNamesList[] = +{ + "IPluginSite", + "IMessage", + "IViewDisp", + "IFontCache", + "ILayerTimer", + "IPanelSink", + "IBrushImage", + "ICanvas", + "IMessageMember", + "ILayer", + "IWindowsMessageSink", + "IPager", + "IInputNotify", + "IPluginSink", + "IFontCacheDisp", + "IControl", + "IPlugin", + "ILayerRender", + "IBarManager", + "IRootLayer", + "ILayerPopup", + "ILayerSite", + "INetworkFilter", + "ILayerKeyboard", + "IButton", + "IManager", + "IIconCache", + "ILayerSchema", + "ILayerMouse", + "IView", + "IInputBuffer", + "IImageCacheDisp", + "IPanel", + "ISimpleBar", + "IImageCache", + 0 +}; + +const IID * _Inject_BaseIIDList[] = +{ + 0, + &IID_IDispatch, + &IID_IDispatch, + &IID_IDispatch, + 0, + 0, + 0, + 0, + &IID_IDispatch, + 0, + 0, + &IID_IDispatch, + &IID_IDispatch, + 0, + &IID_IDispatch, + &IID_IDispatch, + 0, + 0, + 0, + 0, + 0, + 0, + &IID_IDispatch, + 0, + &IID_IDispatch, + 0, + 0, + 0, + 0, + &IID_IDispatch, + &IID_IDispatch, + &IID_IDispatch, + 0, + 0, + &IID_IDispatch, + 0 +}; + + +#define _Inject_CHECK_IID(n) IID_GENERIC_CHECK_IID( _Inject, pIID, n) + +int __stdcall _Inject_IID_Lookup( const IID * pIID, int * pIndex ) +{ + IID_BS_LOOKUP_SETUP + + IID_BS_LOOKUP_INITIAL_TEST( _Inject, 35, 32 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 16 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 8 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 4 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 2 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 1 ) + IID_BS_LOOKUP_RETURN_RESULT( _Inject, 35, *pIndex ) + +} + +const ExtendedProxyFileInfo Inject_ProxyFileInfo = +{ + (PCInterfaceProxyVtblList *) & _Inject_ProxyVtblList, + (PCInterfaceStubVtblList *) & _Inject_StubVtblList, + (const PCInterfaceName * ) & _Inject_InterfaceNamesList, + (const IID ** ) & _Inject_BaseIIDList, + & _Inject_IID_Lookup, + 35, + 2, + 0, /* table of [async_uuid] interfaces */ + 0, /* Filler1 */ + 0, /* Filler2 */ + 0 /* Filler3 */ +}; + + +#endif /* !defined(_M_IA64) && !defined(_M_AXP64)*/ + + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + +/* this ALWAYS GENERATED file contains the proxy stub code */ + + + /* File created by MIDL compiler version 5.03.0280 */ +/* at Sat Aug 18 01:06:36 2001 + */ +/* Compiler settings for E:\Decal\Source\Inject\Inject.idl: + Oicf (OptLev=i2), W1, Zp8, env=Win64 (32b run,appending), ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#if defined(_M_IA64) || defined(_M_AXP64) +#define USE_STUBLESS_PROXY + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REDQ_RPCPROXY_H_VERSION__ +#define __REQUIRED_RPCPROXY_H_VERSION__ 475 +#endif + + +#include "rpcproxy.h" +#ifndef __RPCPROXY_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCPROXY_H_VERSION__ + + +#include "Inject.h" + +#define TYPE_FORMAT_STRING_SIZE 1767 +#define PROC_FORMAT_STRING_SIZE 6619 +#define TRANSMIT_AS_TABLE_SIZE 0 +#define WIRE_MARSHAL_TABLE_SIZE 3 + +typedef struct _MIDL_TYPE_FORMAT_STRING + { + short Pad; + unsigned char Format[ TYPE_FORMAT_STRING_SIZE ]; + } MIDL_TYPE_FORMAT_STRING; + +typedef struct _MIDL_PROC_FORMAT_STRING + { + short Pad; + unsigned char Format[ PROC_FORMAT_STRING_SIZE ]; + } MIDL_PROC_FORMAT_STRING; + + +extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString; +extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString; + + +/* Standard interface: __MIDL_itf_Inject_0000, ver. 0.0, + GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */ + + +/* Object interface: IUnknown, ver. 0.0, + GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */ + + +/* Object interface: IManager, ver. 0.0, + GUID={0xBC63C4A7,0xBE01,0x400D,{0x90,0x8D,0x07,0x47,0xB0,0x6C,0x80,0x62}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IManager_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IManager_FormatStringOffsetTable[] = + { + 0, + 38 + }; + +static const MIDL_SERVER_INFO IManager_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IManager_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IManager_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IManager_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IManagerProxyVtbl = +{ + &IManager_ProxyInfo, + &IID_IManager, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IManager::LoadPlugin */ , + (void *)-1 /* IManager::UnloadPlugin */ +}; + +const CInterfaceStubVtbl _IManagerStubVtbl = +{ + &IID_IManager, + &IManager_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPluginSite, ver. 0.0, + GUID={0x702D3901,0xC13A,0x448e,{0x88,0x71,0xEC,0xDC,0x8B,0xC8,0xD0,0x79}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPluginSite_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPluginSite_FormatStringOffsetTable[] = + { + 76, + 114, + 158, + 196, + 240, + 284, + 328, + 372, + 428, + 466, + 510, + 560, + 604, + 648, + 692, + 748, + 792, + 830, + 874, + 918, + 962, + 1000, + 1038, + 1076, + 1114, + 1152, + 1190, + 1228, + 1266, + 1310, + 1354 + }; + +static const MIDL_SERVER_INFO IPluginSite_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPluginSite_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPluginSite_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPluginSite_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(34) _IPluginSiteProxyVtbl = +{ + &IPluginSite_ProxyInfo, + &IID_IPluginSite, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPluginSite::UnloadPlugin */ , + (void *)-1 /* IPluginSite::GetDirectDraw */ , + (void *)-1 /* IPluginSite::GetPrimarySurface */ , + (void *)-1 /* IPluginSite::Get3DDevice */ , + (void *)-1 /* IPluginSite::LoadBitmapFile */ , + (void *)-1 /* IPluginSite::GetIconCache */ , + (void *)-1 /* IPluginSite::LoadBitmapPortal */ , + (void *)-1 /* IPluginSite::CreateFont */ , + (void *)-1 /* IPluginSite::GetScreenSize */ , + (void *)-1 /* IPluginSite::CreateCanvas */ , + (void *)-1 /* IPluginSite::CreateView */ , + (void *)-1 /* IPluginSite::LoadView */ , + (void *)-1 /* IPluginSite::CreateBrushImage */ , + (void *)-1 /* IPluginSite::LoadImageSchema */ , + (void *)-1 /* IPluginSite::CreateFontSchema */ , + (void *)-1 /* IPluginSite::LoadResourceModule */ , + (void *)-1 /* IPluginSite::get_ResourcePath */ , + (void *)-1 /* IPluginSite::get_Plugin */ , + (void *)-1 /* IPluginSite::get_NetworkFilter */ , + (void *)-1 /* IPluginSite::LoadViewObject */ , + (void *)-1 /* IPluginSite::CreateInputBuffer */ , + (void *)-1 /* IPluginSite::get_HWND */ , + (void *)-1 /* IPluginSite::get_Focus */ , + (void *)-1 /* IPluginSite::get_OldWndProc */ , + (void *)-1 /* IPluginSite::put_CurrentSelection */ , + (void *)-1 /* IPluginSite::get_CurrentSelection */ , + (void *)-1 /* IPluginSite::put_PreviousSelection */ , + (void *)-1 /* IPluginSite::get_PreviousSelection */ , + (void *)-1 /* IPluginSite::WriteToChatWindow */ , + (void *)-1 /* IPluginSite::SetCursorPosition */ , + (void *)-1 /* IPluginSite::QueryKeyboardMap */ +}; + +const CInterfaceStubVtbl _IPluginSiteStubVtbl = +{ + &IID_IPluginSite, + &IPluginSite_ServerInfo, + 34, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPluginSink, ver. 0.0, + GUID={0xD216BA6C,0xD328,0x4765,{0xB4,0x0A,0x9B,0xC5,0x7C,0x96,0xF7,0x5E}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPluginSink_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPluginSink_FormatStringOffsetTable[] = + { + 1398, + 1442 + }; + +static const MIDL_SERVER_INFO IPluginSink_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPluginSink_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPluginSink_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPluginSink_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IPluginSinkProxyVtbl = +{ + &IPluginSink_ProxyInfo, + &IID_IPluginSink, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPluginSink::ChatText */ , + (void *)-1 /* IPluginSink::ChatMessage */ +}; + +const CInterfaceStubVtbl _IPluginSinkStubVtbl = +{ + &IID_IPluginSink, + &IPluginSink_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPlugin, ver. 0.0, + GUID={0xBA3E677F,0x8E44,0x4829,{0x98,0x2E,0x58,0xBB,0xBC,0x5C,0x5F,0x9B}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPlugin_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPlugin_FormatStringOffsetTable[] = + { + 1492, + 1536, + 1568 + }; + +static const MIDL_SERVER_INFO IPlugin_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPlugin_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPlugin_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPlugin_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(6) _IPluginProxyVtbl = +{ + &IPlugin_ProxyInfo, + &IID_IPlugin, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPlugin::Initialize */ , + (void *)-1 /* IPlugin::Terminate */ , + (void *)-1 /* IPlugin::get_FriendlyName */ +}; + +const CInterfaceStubVtbl _IPluginStubVtbl = +{ + &IID_IPlugin, + &IPlugin_ServerInfo, + 6, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IDispatch, ver. 0.0, + GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */ + + +/* Object interface: IControl, ver. 0.0, + GUID={0x996B377C,0x1953,0x4db1,{0xAA,0xC1,0x15,0x7F,0x72,0x59,0x2D,0x3E}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IControl_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IControl_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 1606, + 1650, + 1688, + 1726 + }; + +static const MIDL_SERVER_INFO IControl_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IControl_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IControl_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IControl_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(11) _IControlProxyVtbl = +{ + &IControl_ProxyInfo, + &IID_IControl, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IControl::DestroyChild */ , + (void *)-1 /* IControl::get_ID */ , + (void *)-1 /* IControl::get_ChildCount */ , + (void *)-1 /* IControl::get_Child */ +}; + + +static const PRPC_STUB_FUNCTION IControl_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IControlStubVtbl = +{ + &IID_IControl, + &IControl_ServerInfo, + 11, + &IControl_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: ILayer, ver. 0.0, + GUID={0x0D63504F,0xDEEF,0x4a2d,{0x97,0x42,0x28,0xDD,0x1B,0xAD,0xDA,0x7C}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayer_FormatStringOffsetTable[] = + { + 1776, + 1536, + 1814, + 1852 + }; + +static const MIDL_SERVER_INFO ILayer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(7) _ILayerProxyVtbl = +{ + &ILayer_ProxyInfo, + &IID_ILayer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayer::LayerCreate */ , + (void *)-1 /* ILayer::LayerDestroy */ , + (void *)-1 /* ILayer::get_Position */ , + (void *)-1 /* ILayer::put_Position */ +}; + +const CInterfaceStubVtbl _ILayerStubVtbl = +{ + &IID_ILayer, + &ILayer_ServerInfo, + 7, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerRender, ver. 0.0, + GUID={0xD1C71B85,0x62C2,0x42a3,{0xAE,0x2E,0x4B,0xF5,0xA6,0xBE,0x17,0x84}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerRender_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerRender_FormatStringOffsetTable[] = + { + 1890, + 1922, + 1960, + 1992, + 2036 + }; + +static const MIDL_SERVER_INFO ILayerRender_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerRender_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerRender_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerRender_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(8) _ILayerRenderProxyVtbl = +{ + &ILayerRender_ProxyInfo, + &IID_ILayerRender, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerRender::PreRender */ , + (void *)-1 /* ILayerRender::Render */ , + (void *)-1 /* ILayerRender::Reformat */ , + (void *)-1 /* ILayerRender::AdjustRenderArea */ , + (void *)-1 /* ILayerRender::HitTest */ +}; + +const CInterfaceStubVtbl _ILayerRenderStubVtbl = +{ + &IID_ILayerRender, + &ILayerRender_ServerInfo, + 8, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerSite, ver. 0.0, + GUID={0x5B7E9D99,0xBB3A,0x475D,{0x84,0x2D,0x43,0xEB,0xEA,0x82,0x84,0xEA}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerSite_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerSite_FormatStringOffsetTable[] = + { + 1890, + 2080, + 2124, + 2168, + 2200, + 2238, + 2270, + 2314, + 2352, + 2390, + 2428, + 2466, + 2516, + 2548, + 2598, + 2636, + 2674, + 2718, + 2756, + 2794, + 2832 + }; + +static const MIDL_SERVER_INFO ILayerSite_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerSite_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerSite_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerSite_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(24) _ILayerSiteProxyVtbl = +{ + &ILayerSite_ProxyInfo, + &IID_ILayerSite, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerSite::Destroy */ , + (void *)-1 /* ILayerSite::CreateChild */ , + (void *)-1 /* ILayerSite::GetSink */ , + (void *)-1 /* ILayerSite::Invalidate */ , + (void *)-1 /* ILayerSite::get_PluginSite */ , + (void *)-1 /* ILayerSite::Reformat */ , + (void *)-1 /* ILayerSite::GetParentSink */ , + (void *)-1 /* ILayerSite::get_Position */ , + (void *)-1 /* ILayerSite::put_Position */ , + (void *)-1 /* ILayerSite::get_ID */ , + (void *)-1 /* ILayerSite::get_ChildCount */ , + (void *)-1 /* ILayerSite::get_Child */ , + (void *)-1 /* ILayerSite::CaptureKeyboard */ , + (void *)-1 /* ILayerSite::IsChild */ , + (void *)-1 /* ILayerSite::put_Popup */ , + (void *)-1 /* ILayerSite::get_ScreenPosition */ , + (void *)-1 /* ILayerSite::StartTimer */ , + (void *)-1 /* ILayerSite::EndTimer */ , + (void *)-1 /* ILayerSite::get_Transparent */ , + (void *)-1 /* ILayerSite::put_Transparent */ , + (void *)-1 /* ILayerSite::put_Alpha */ +}; + +const CInterfaceStubVtbl _ILayerSiteStubVtbl = +{ + &IID_ILayerSite, + &ILayerSite_ServerInfo, + 24, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IBarManager, ver. 0.0, + GUID={0xE4CCDC92,0x8658,0x4caa,{0x89,0x55,0xFB,0x89,0x1D,0x5B,0xDC,0xF7}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IBarManager_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IBarManager_FormatStringOffsetTable[] = + { + 2870, + 2914, + 2952, + 2996 + }; + +static const MIDL_SERVER_INFO IBarManager_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IBarManager_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IBarManager_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IBarManager_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(7) _IBarManagerProxyVtbl = +{ + &IBarManager_ProxyInfo, + &IID_IBarManager, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IBarManager::AddBar */ , + (void *)-1 /* IBarManager::RemoveBar */ , + (void *)-1 /* IBarManager::get_Bar */ , + (void *)-1 /* IBarManager::put_Bar */ +}; + +const CInterfaceStubVtbl _IBarManagerStubVtbl = +{ + &IID_IBarManager, + &IBarManager_ServerInfo, + 7, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IIconCache, ver. 0.0, + GUID={0xDEDCD5AA,0xF6CA,0x4DA5,{0xA6,0x57,0xE8,0x2F,0x12,0x6A,0xBB,0xCD}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IIconCache_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IIconCache_FormatStringOffsetTable[] = + { + 3040 + }; + +static const MIDL_SERVER_INFO IIconCache_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IIconCache_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IIconCache_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IIconCache_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _IIconCacheProxyVtbl = +{ + &IIconCache_ProxyInfo, + &IID_IIconCache, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IIconCache::DrawIcon */ +}; + +const CInterfaceStubVtbl _IIconCacheStubVtbl = +{ + &IID_IIconCache, + &IIconCache_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IImageCacheDisp, ver. 0.0, + GUID={0xF88548BC,0xD11E,0x4ac2,{0x9A,0x27,0x36,0x07,0x00,0x4D,0x35,0x9F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +#pragma code_seg(".orpc") +CINTERFACE_PROXY_VTABLE(7) _IImageCacheDispProxyVtbl = +{ + 0, + &IID_IImageCacheDisp, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ +}; + + +static const PRPC_STUB_FUNCTION IImageCacheDisp_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION +}; + +CInterfaceStubVtbl _IImageCacheDispStubVtbl = +{ + &IID_IImageCacheDisp, + 0, + 7, + &IImageCacheDisp_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IImageCache, ver. 0.0, + GUID={0xBE566CEC,0x6881,0x481C,{0xA1,0x46,0x9F,0x5A,0x32,0x57,0x6B,0xE6}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IImageCache_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IImageCache_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 3096, + 3146, + 3208, + 3258 + }; + +static const MIDL_SERVER_INFO IImageCache_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IImageCache_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IImageCache_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IImageCache_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(11) _IImageCacheProxyVtbl = +{ + &IImageCache_ProxyInfo, + &IID_IImageCache, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IImageCache::PatBlt */ , + (void *)-1 /* IImageCache::StretchBlt */ , + (void *)-1 /* IImageCache::Blt */ , + (void *)-1 /* IImageCache::get_Size */ +}; + + +static const PRPC_STUB_FUNCTION IImageCache_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IImageCacheStubVtbl = +{ + &IID_IImageCache, + &IImageCache_ServerInfo, + 11, + &IImageCache_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IFontCacheDisp, ver. 0.0, + GUID={0x9394E96D,0x2B29,0x4c29,{0xAF,0x3E,0xDB,0x5C,0x47,0x61,0x22,0xDB}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +#pragma code_seg(".orpc") +CINTERFACE_PROXY_VTABLE(7) _IFontCacheDispProxyVtbl = +{ + 0, + &IID_IFontCacheDisp, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ +}; + + +static const PRPC_STUB_FUNCTION IFontCacheDisp_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION +}; + +CInterfaceStubVtbl _IFontCacheDispStubVtbl = +{ + &IID_IFontCacheDisp, + 0, + 7, + &IFontCacheDisp_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IFontCache, ver. 0.0, + GUID={0x12ECCB0F,0x36A6,0x451C,{0xB0,0x86,0x13,0x06,0xB7,0x4A,0xAE,0xC2}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IFontCache_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IFontCache_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 3296, + 3352, + 3396 + }; + +static const MIDL_SERVER_INFO IFontCache_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IFontCache_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IFontCache_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IFontCache_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _IFontCacheProxyVtbl = +{ + &IFontCache_ProxyInfo, + &IID_IFontCache, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IFontCache::DrawText */ , + (void *)-1 /* IFontCache::MeasureText */ , + (void *)-1 /* IFontCache::HitTest */ +}; + + +static const PRPC_STUB_FUNCTION IFontCache_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IFontCacheStubVtbl = +{ + &IID_IFontCache, + &IFontCache_ServerInfo, + 10, + &IFontCache_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: ISimpleBar, ver. 0.0, + GUID={0x4A2D87CD,0xBFB4,0x4723,{0xB9,0x59,0xFF,0xF3,0xFD,0xD4,0x92,0x78}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ISimpleBar_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ISimpleBar_FormatStringOffsetTable[] = + { + 3446, + 3484, + 3522 + }; + +static const MIDL_SERVER_INFO ISimpleBar_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ISimpleBar_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ISimpleBar_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ISimpleBar_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(6) _ISimpleBarProxyVtbl = +{ + &ISimpleBar_ProxyInfo, + &IID_ISimpleBar, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ISimpleBar::get_RenderWidth */ , + (void *)-1 /* ISimpleBar::get_Params */ , + (void *)-1 /* ISimpleBar::put_Params */ +}; + +const CInterfaceStubVtbl _ISimpleBarStubVtbl = +{ + &IID_ISimpleBar, + &ISimpleBar_ServerInfo, + 6, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerMouse, ver. 0.0, + GUID={0x5014E0B2,0x9156,0x412c,{0x94,0x6D,0x9D,0x4B,0xAA,0x9F,0x4C,0x51}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerMouse_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerMouse_FormatStringOffsetTable[] = + { + 3560, + 3598, + 3636, + 3674, + 3712, + 3750, + 3788 + }; + +static const MIDL_SERVER_INFO ILayerMouse_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerMouse_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerMouse_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerMouse_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _ILayerMouseProxyVtbl = +{ + &ILayerMouse_ProxyInfo, + &IID_ILayerMouse, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerMouse::MouseEnter */ , + (void *)-1 /* ILayerMouse::MouseExit */ , + (void *)-1 /* ILayerMouse::MouseDown */ , + (void *)-1 /* ILayerMouse::MouseUp */ , + (void *)-1 /* ILayerMouse::MouseMove */ , + (void *)-1 /* ILayerMouse::MouseDblClk */ , + (void *)-1 /* ILayerMouse::MouseEvent */ +}; + +const CInterfaceStubVtbl _ILayerMouseStubVtbl = +{ + &IID_ILayerMouse, + &ILayerMouse_ServerInfo, + 10, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerSchema, ver. 0.0, + GUID={0x829E0FB2,0xD0B5,0x4814,{0xBC,0xF9,0x6E,0xCF,0xA0,0x6C,0x9A,0xED}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerSchema_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerSchema_FormatStringOffsetTable[] = + { + 3838 + }; + +static const MIDL_SERVER_INFO ILayerSchema_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerSchema_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerSchema_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerSchema_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _ILayerSchemaProxyVtbl = +{ + &ILayerSchema_ProxyInfo, + &IID_ILayerSchema, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerSchema::SchemaLoad */ +}; + +const CInterfaceStubVtbl _ILayerSchemaStubVtbl = +{ + &IID_ILayerSchema, + &ILayerSchema_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IButton, ver. 0.0, + GUID={0x0F5765A4,0x9F83,0x4077,{0x88,0x84,0x6C,0xBD,0xDC,0xE3,0x48,0xF7}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IButton_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IButton_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 1606, + 1650, + 1688, + 1726, + 3882, + 2390, + 3932 + }; + +static const MIDL_SERVER_INFO IButton_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IButton_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IButton_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IButton_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(14) _IButtonProxyVtbl = +{ + &IButton_ProxyInfo, + &IID_IButton, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IControl::DestroyChild */ , + (void *)-1 /* IControl::get_ID */ , + (void *)-1 /* IControl::get_ChildCount */ , + (void *)-1 /* IControl::get_Child */ , + (void *)-1 /* IButton::SetImages */ , + (void *)-1 /* IButton::get_Matte */ , + (void *)-1 /* IButton::put_Matte */ +}; + + +static const PRPC_STUB_FUNCTION IButton_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IButtonStubVtbl = +{ + &IID_IButton, + &IButton_ServerInfo, + 14, + &IButton_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IPager, ver. 0.0, + GUID={0xBD9FC464,0xC0D8,0x4823,{0x82,0x55,0xE8,0x18,0xF8,0x83,0x6B,0x08}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPager_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPager_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 1606, + 1650, + 1688, + 1726, + 3970, + 4002, + 2428, + 4040, + 4078, + 4116, + 4154 + }; + +static const MIDL_SERVER_INFO IPager_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPager_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPager_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPager_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(18) _IPagerProxyVtbl = +{ + &IPager_ProxyInfo, + &IID_IPager, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IControl::DestroyChild */ , + (void *)-1 /* IControl::get_ID */ , + (void *)-1 /* IControl::get_ChildCount */ , + (void *)-1 /* IControl::get_Child */ , + (void *)-1 /* IPager::FinishCommand */ , + (void *)-1 /* IPager::ScrollTo */ , + (void *)-1 /* IPager::get_Command */ , + (void *)-1 /* IPager::put_Command */ , + (void *)-1 /* IPager::get_Offset */ , + (void *)-1 /* IPager::put_Offset */ , + (void *)-1 /* IPager::CreateClient */ +}; + + +static const PRPC_STUB_FUNCTION IPager_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IPagerStubVtbl = +{ + &IID_IPager, + &IPager_ServerInfo, + 18, + &IPager_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IPanel, ver. 0.0, + GUID={0x2B52B5CB,0x9E10,0x4238,{0x8F,0x62,0xA5,0x01,0x40,0x6E,0x3E,0xAB}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPanel_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPanel_FormatStringOffsetTable[] = + { + 4192, + 4236, + 4286, + 4324, + 4362, + 2238, + 4412 + }; + +static const MIDL_SERVER_INFO IPanel_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPanel_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPanel_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPanel_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _IPanelProxyVtbl = +{ + &IPanel_ProxyInfo, + &IID_IPanel, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPanel::AddView */ , + (void *)-1 /* IPanel::ActivateView */ , + (void *)-1 /* IPanel::RemoveView */ , + (void *)-1 /* IPanel::get_ActiveView */ , + (void *)-1 /* IPanel::LoadView */ , + (void *)-1 /* IPanel::Deactivate */ , + (void *)-1 /* IPanel::putref_Sink */ +}; + +const CInterfaceStubVtbl _IPanelStubVtbl = +{ + &IID_IPanel, + &IPanel_ServerInfo, + 10, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IPanelSink, ver. 0.0, + GUID={0x85D70924,0x917D,0x41bb,{0x99,0x5D,0xC4,0x0E,0x6A,0xB2,0x1C,0x71}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IPanelSink_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IPanelSink_FormatStringOffsetTable[] = + { + 76 + }; + +static const MIDL_SERVER_INFO IPanelSink_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IPanelSink_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IPanelSink_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IPanelSink_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _IPanelSinkProxyVtbl = +{ + &IPanelSink_ProxyInfo, + &IID_IPanelSink, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IPanelSink::PanelDeactivate */ +}; + +const CInterfaceStubVtbl _IPanelSinkStubVtbl = +{ + &IID_IPanelSink, + &IPanelSink_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ICanvas, ver. 0.0, + GUID={0x9241862D,0xBA71,0x4317,{0x81,0x66,0x3A,0x3E,0x61,0xCE,0x3E,0x5F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ICanvas_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ICanvas_FormatStringOffsetTable[] = + { + 4450, + 1536, + 4494, + 2168, + 4532, + 4576, + 4620, + 4664, + 4702, + 4740, + 4778, + 4816, + 4866, + 4910, + 4948, + 4986, + 5030, + 2718 + }; + +static const MIDL_SERVER_INFO ICanvas_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ICanvas_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ICanvas_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ICanvas_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(21) _ICanvasProxyVtbl = +{ + &ICanvas_ProxyInfo, + &IID_ICanvas, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ICanvas::PushClipRect */ , + (void *)-1 /* ICanvas::PopClipRect */ , + (void *)-1 /* ICanvas::GetDC */ , + (void *)-1 /* ICanvas::ReleaseDC */ , + (void *)-1 /* ICanvas::GetSurface */ , + (void *)-1 /* ICanvas::Fill */ , + (void *)-1 /* ICanvas::Frame */ , + (void *)-1 /* ICanvas::GetClipParams */ , + (void *)-1 /* ICanvas::get_WasLost */ , + (void *)-1 /* ICanvas::get_Size */ , + (void *)-1 /* ICanvas::put_Size */ , + (void *)-1 /* ICanvas::Blt */ , + (void *)-1 /* ICanvas::HitTest */ , + (void *)-1 /* ICanvas::ToClient */ , + (void *)-1 /* ICanvas::ToScreen */ , + (void *)-1 /* ICanvas::OffsetOrg */ , + (void *)-1 /* ICanvas::SetClipRect */ , + (void *)-1 /* ICanvas::put_Alpha */ +}; + +const CInterfaceStubVtbl _ICanvasStubVtbl = +{ + &IID_ICanvas, + &ICanvas_ServerInfo, + 21, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IViewDisp, ver. 0.0, + GUID={0xF3B54A0C,0x61B9,0x4B7A,{0x9F,0xD8,0x82,0xB0,0x47,0x7F,0xB7,0xD9}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IViewDisp_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IViewDisp_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 5074, + 5118, + 5162, + 5200, + 3970, + 5238, + 5282, + 5314, + 5346, + 5384 + }; + +static const MIDL_SERVER_INFO IViewDisp_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IViewDisp_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IViewDisp_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IViewDisp_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(17) _IViewDispProxyVtbl = +{ + &IViewDisp_ProxyInfo, + &IID_IViewDisp, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IViewDisp::get_Control */ , + (void *)-1 /* IViewDisp::putref_Control */ , + (void *)-1 /* IViewDisp::get_Title */ , + (void *)-1 /* IViewDisp::put_Title */ , + (void *)-1 /* IViewDisp::Alert */ , + (void *)-1 /* IViewDisp::SetIcon */ , + (void *)-1 /* IViewDisp::Activate */ , + (void *)-1 /* IViewDisp::Deactivate */ , + (void *)-1 /* IViewDisp::put_Position */ , + (void *)-1 /* IViewDisp::get_Position */ +}; + + +static const PRPC_STUB_FUNCTION IViewDisp_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IViewDispStubVtbl = +{ + &IID_IViewDisp, + &IViewDisp_ServerInfo, + 17, + &IViewDisp_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IView, ver. 0.0, + GUID={0xA2AE18B7,0x85C9,0x451c,{0x8C,0xC3,0xD0,0xFF,0xE6,0xB8,0x6E,0xEB}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IView_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IView_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 5074, + 5118, + 5162, + 5200, + 3970, + 5238, + 5282, + 5314, + 5346, + 5384, + 5422, + 5478, + 5516 + }; + +static const MIDL_SERVER_INFO IView_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IView_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IView_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IView_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(20) _IViewProxyVtbl = +{ + &IView_ProxyInfo, + &IID_IView, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IViewDisp::get_Control */ , + (void *)-1 /* IViewDisp::putref_Control */ , + (void *)-1 /* IViewDisp::get_Title */ , + (void *)-1 /* IViewDisp::put_Title */ , + (void *)-1 /* IViewDisp::Alert */ , + (void *)-1 /* IViewDisp::SetIcon */ , + (void *)-1 /* IViewDisp::Activate */ , + (void *)-1 /* IViewDisp::Deactivate */ , + (void *)-1 /* IViewDisp::put_Position */ , + (void *)-1 /* IViewDisp::get_Position */ , + (void *)-1 /* IView::LoadControl */ , + (void *)-1 /* IView::LoadSchema */ , + (void *)-1 /* IView::put_Alpha */ +}; + + +static const PRPC_STUB_FUNCTION IView_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IViewStubVtbl = +{ + &IID_IView, + &IView_ServerInfo, + 20, + &IView_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IRootLayer, ver. 0.0, + GUID={0xD3006096,0xB293,0x47f5,{0x93,0x77,0xC1,0x2D,0xEF,0x5C,0x1D,0x34}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IRootLayer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IRootLayer_FormatStringOffsetTable[] = + { + 5554, + 2914, + 5604, + 5648 + }; + +static const MIDL_SERVER_INFO IRootLayer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IRootLayer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IRootLayer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IRootLayer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(7) _IRootLayerProxyVtbl = +{ + &IRootLayer_ProxyInfo, + &IID_IRootLayer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IRootLayer::CreateView */ , + (void *)-1 /* IRootLayer::SelectBar */ , + (void *)-1 /* IRootLayer::LoadView */ , + (void *)-1 /* IRootLayer::LoadViewObject */ +}; + +const CInterfaceStubVtbl _IRootLayerStubVtbl = +{ + &IID_IRootLayer, + &IRootLayer_ServerInfo, + 7, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IMessageMember, ver. 0.0, + GUID={0x05D14E34,0x0A23,0x4A9F,{0x95,0xCF,0x9D,0xB2,0x4B,0x3C,0xFB,0x9F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IMessageMember_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IMessageMember_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 5692, + 5736, + 1688 + }; + +static const MIDL_SERVER_INFO IMessageMember_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IMessageMember_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IMessageMember_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IMessageMember_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(10) _IMessageMemberProxyVtbl = +{ + &IMessageMember_ProxyInfo, + &IID_IMessageMember, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IMessageMember::get_Member */ , + (void *)-1 /* IMessageMember::get_MemberName */ , + (void *)-1 /* IMessageMember::get_Count */ +}; + + +static const PRPC_STUB_FUNCTION IMessageMember_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IMessageMemberStubVtbl = +{ + &IID_IMessageMember, + &IMessageMember_ServerInfo, + 10, + &IMessageMember_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IMessage, ver. 0.0, + GUID={0x23EE0804,0xEAC7,0x493B,{0xBB,0x9D,0x22,0x98,0xFD,0x44,0xFF,0xA1}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IMessage_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IMessage_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 5780, + 5818, + 5856, + 5900, + 5944 + }; + +static const MIDL_SERVER_INFO IMessage_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IMessage_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IMessage_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IMessage_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(12) _IMessageProxyVtbl = +{ + &IMessage_ProxyInfo, + &IID_IMessage, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IMessage::get_Type */ , + (void *)-1 /* IMessage::get_Data */ , + (void *)-1 /* IMessage::get_Member */ , + (void *)-1 /* IMessage::get_MemberName */ , + (void *)-1 /* IMessage::get_Count */ +}; + + +static const PRPC_STUB_FUNCTION IMessage_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IMessageStubVtbl = +{ + &IID_IMessage, + &IMessage_ServerInfo, + 12, + &IMessage_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: INetworkFilter, ver. 0.0, + GUID={0xEEB0BE9E,0x46BD,0x493F,{0x97,0xE2,0x33,0x06,0x70,0xC0,0x9F,0x59}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO INetworkFilter_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short INetworkFilter_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 5982 + }; + +static const MIDL_SERVER_INFO INetworkFilter_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &INetworkFilter_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO INetworkFilter_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &INetworkFilter_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(8) _INetworkFilterProxyVtbl = +{ + &INetworkFilter_ProxyInfo, + &IID_INetworkFilter, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* INetworkFilter::Dispatch */ +}; + + +static const PRPC_STUB_FUNCTION INetworkFilter_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2 +}; + +CInterfaceStubVtbl _INetworkFilterStubVtbl = +{ + &IID_INetworkFilter, + &INetworkFilter_ServerInfo, + 8, + &INetworkFilter_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: ILayerKeyboard, ver. 0.0, + GUID={0x7500929F,0x4251,0x4373,{0xB9,0x78,0x28,0x6A,0x8A,0x8B,0xEC,0xED}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerKeyboard_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerKeyboard_FormatStringOffsetTable[] = + { + 6020, + 6058, + 6096 + }; + +static const MIDL_SERVER_INFO ILayerKeyboard_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerKeyboard_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerKeyboard_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerKeyboard_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(6) _ILayerKeyboardProxyVtbl = +{ + &ILayerKeyboard_ProxyInfo, + &IID_ILayerKeyboard, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerKeyboard::KeyboardChar */ , + (void *)-1 /* ILayerKeyboard::KeyboardEndCapture */ , + (void *)-1 /* ILayerKeyboard::KeyboardEvent */ +}; + +const CInterfaceStubVtbl _ILayerKeyboardStubVtbl = +{ + &IID_ILayerKeyboard, + &ILayerKeyboard_ServerInfo, + 6, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerPopup, ver. 0.0, + GUID={0x22072A97,0xE5E6,0x4d91,{0xA3,0x44,0x80,0x72,0x35,0xBF,0xA5,0xD8}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerPopup_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerPopup_FormatStringOffsetTable[] = + { + 6146 + }; + +static const MIDL_SERVER_INFO ILayerPopup_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerPopup_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerPopup_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerPopup_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _ILayerPopupProxyVtbl = +{ + &ILayerPopup_ProxyInfo, + &IID_ILayerPopup, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerPopup::PopupCancel */ +}; + +const CInterfaceStubVtbl _ILayerPopupStubVtbl = +{ + &IID_ILayerPopup, + &ILayerPopup_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: ILayerTimer, ver. 0.0, + GUID={0x5D6B8A1B,0x321A,0x479f,{0x93,0x47,0x55,0x72,0x5B,0xDA,0x3D,0xA9}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO ILayerTimer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short ILayerTimer_FormatStringOffsetTable[] = + { + 6190 + }; + +static const MIDL_SERVER_INFO ILayerTimer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &ILayerTimer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO ILayerTimer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &ILayerTimer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(4) _ILayerTimerProxyVtbl = +{ + &ILayerTimer_ProxyInfo, + &IID_ILayerTimer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* ILayerTimer::TimerTimeout */ +}; + +const CInterfaceStubVtbl _ILayerTimerStubVtbl = +{ + &IID_ILayerTimer, + &ILayerTimer_ServerInfo, + 4, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IWindowsMessageSink, ver. 0.0, + GUID={0xA68BE455,0xC241,0x49c5,{0x9F,0x8A,0x07,0x0E,0x4C,0xBE,0x43,0x0F}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IWindowsMessageSink_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IWindowsMessageSink_FormatStringOffsetTable[] = + { + 6246, + 1536 + }; + +static const MIDL_SERVER_INFO IWindowsMessageSink_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IWindowsMessageSink_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IWindowsMessageSink_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IWindowsMessageSink_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IWindowsMessageSinkProxyVtbl = +{ + &IWindowsMessageSink_ProxyInfo, + &IID_IWindowsMessageSink, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IWindowsMessageSink::WindowMessage */ , + (void *)-1 /* IWindowsMessageSink::WindowMessageEnd */ +}; + +const CInterfaceStubVtbl _IWindowsMessageSinkStubVtbl = +{ + &IID_IWindowsMessageSink, + &IWindowsMessageSink_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IBrushImage, ver. 0.0, + GUID={0x50CDFD25,0x4F3B,0x4412,{0x96,0xBE,0x94,0x7A,0x6C,0x7B,0x93,0xA2}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IBrushImage_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IBrushImage_FormatStringOffsetTable[] = + { + 3446, + 2914 + }; + +static const MIDL_SERVER_INFO IBrushImage_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IBrushImage_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IBrushImage_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IBrushImage_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(5) _IBrushImageProxyVtbl = +{ + &IBrushImage_ProxyInfo, + &IID_IBrushImage, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + (void *)-1 /* IBrushImage::get_Color */ , + (void *)-1 /* IBrushImage::put_Color */ +}; + +const CInterfaceStubVtbl _IBrushImageStubVtbl = +{ + &IID_IBrushImage, + &IBrushImage_ServerInfo, + 5, + 0, /* pure interpreted */ + CStdStubBuffer_METHODS +}; + + +/* Object interface: IInputBuffer, ver. 0.0, + GUID={0x634D74B8,0xAFED,0x4710,{0x82,0xC9,0xB5,0x30,0x32,0x6E,0x1A,0xFA}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IInputBuffer_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IInputBuffer_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 6308, + 6340, + 6378, + 6422, + 6472, + 6510 + }; + +static const MIDL_SERVER_INFO IInputBuffer_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IInputBuffer_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IInputBuffer_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IInputBuffer_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(13) _IInputBufferProxyVtbl = +{ + &IInputBuffer_ProxyInfo, + &IID_IInputBuffer, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IInputBuffer::Clear */ , + (void *)-1 /* IInputBuffer::TypeText */ , + (void *)-1 /* IInputBuffer::Delay */ , + (void *)-1 /* IInputBuffer::MouseClick */ , + (void *)-1 /* IInputBuffer::get_Status */ , + (void *)-1 /* IInputBuffer::Run */ +}; + + +static const PRPC_STUB_FUNCTION IInputBuffer_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IInputBufferStubVtbl = +{ + &IID_IInputBuffer, + &IInputBuffer_ServerInfo, + 13, + &IInputBuffer_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + + +/* Object interface: IInputNotify, ver. 0.0, + GUID={0xE288C465,0x2DD6,0x4fcd,{0x95,0xE2,0x5B,0xBC,0x1A,0x1D,0x2D,0x32}} */ + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IInputNotify_ServerInfo; + +#pragma code_seg(".orpc") +static const unsigned short IInputNotify_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + (unsigned short) -1, + 6308, + 2238, + 6542, + 6586 + }; + +static const MIDL_SERVER_INFO IInputNotify_ServerInfo = + { + &Object_StubDesc, + 0, + __MIDL_ProcFormatString.Format, + &IInputNotify_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IInputNotify_ProxyInfo = + { + &Object_StubDesc, + __MIDL_ProcFormatString.Format, + &IInputNotify_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + +CINTERFACE_PROXY_VTABLE(11) _IInputNotifyProxyVtbl = +{ + &IInputNotify_ProxyInfo, + &IID_IInputNotify, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *)-1 /* IDispatch::GetTypeInfoCount */ , + 0 /* (void *)-1 /* IDispatch::GetTypeInfo */ , + 0 /* (void *)-1 /* IDispatch::GetIDsOfNames */ , + 0 /* IDispatch_Invoke_Proxy */ , + (void *)-1 /* IInputNotify::NotifyBegin */ , + (void *)-1 /* IInputNotify::NotifyEnd */ , + (void *)-1 /* IInputNotify::SetMousePos */ , + (void *)-1 /* IInputNotify::NotifyPause */ +}; + + +static const PRPC_STUB_FUNCTION IInputNotify_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2 +}; + +CInterfaceStubVtbl _IInputNotifyStubVtbl = +{ + &IID_IInputNotify, + &IInputNotify_ServerInfo, + 11, + &IInputNotify_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + +extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ]; + +static const MIDL_STUB_DESC Object_StubDesc = + { + 0, + NdrOleAllocate, + NdrOleFree, + 0, + 0, + 0, + 0, + 0, + __MIDL_TypeFormatString.Format, + 1, /* -error bounds_check flag */ + 0x50002, /* Ndr library version */ + 0, + 0x5030118, /* MIDL Version 5.3.280 */ + 0, + UserMarshalRoutines, + 0, /* notify & notify_flag routine table */ + 0x1, /* MIDL flag */ + 0, /* Reserved3 */ + 0, /* Reserved4 */ + 0 /* Reserved5 */ + }; + +#pragma data_seg(".rdata") + +static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] = + { + + { + BSTR_UserSize + ,BSTR_UserMarshal + ,BSTR_UserUnmarshal + ,BSTR_UserFree + }, + { + HDC_UserSize + ,HDC_UserMarshal + ,HDC_UserUnmarshal + ,HDC_UserFree + }, + { + VARIANT_UserSize + ,VARIANT_UserMarshal + ,VARIANT_UserUnmarshal + ,VARIANT_UserFree + } + + }; + + +#if !defined(__RPC_WIN64__) +#error Invalid build platform for this stub. +#endif + +static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString = + { + 0, + { + + /* Procedure LoadPlugin */ + + 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6 */ NdrFcShort( 0x3 ), /* 3 */ +/* 8 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 10 */ NdrFcShort( 0x20 ), /* 32 */ +/* 12 */ NdrFcShort( 0x8 ), /* 8 */ +/* 14 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 16 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 18 */ NdrFcShort( 0x0 ), /* 0 */ +/* 20 */ NdrFcShort( 0x0 ), /* 0 */ +/* 22 */ NdrFcShort( 0x0 ), /* 0 */ +/* 24 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter clsidPlugin */ + +/* 26 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 28 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 30 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Return value */ + +/* 32 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 34 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 36 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure UnloadPlugin */ + +/* 38 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 40 */ NdrFcLong( 0x0 ), /* 0 */ +/* 44 */ NdrFcShort( 0x4 ), /* 4 */ +/* 46 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 48 */ NdrFcShort( 0x20 ), /* 32 */ +/* 50 */ NdrFcShort( 0x8 ), /* 8 */ +/* 52 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 54 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 56 */ NdrFcShort( 0x0 ), /* 0 */ +/* 58 */ NdrFcShort( 0x0 ), /* 0 */ +/* 60 */ NdrFcShort( 0x0 ), /* 0 */ +/* 62 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter clsidPlugin */ + +/* 64 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 66 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 68 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Return value */ + +/* 70 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 72 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 74 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PanelDeactivate */ + + + /* Procedure UnloadPlugin */ + +/* 76 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 78 */ NdrFcLong( 0x0 ), /* 0 */ +/* 82 */ NdrFcShort( 0x3 ), /* 3 */ +/* 84 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 86 */ NdrFcShort( 0x8 ), /* 8 */ +/* 88 */ NdrFcShort( 0x8 ), /* 8 */ +/* 90 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 92 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 94 */ NdrFcShort( 0x0 ), /* 0 */ +/* 96 */ NdrFcShort( 0x0 ), /* 0 */ +/* 98 */ NdrFcShort( 0x0 ), /* 0 */ +/* 100 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + + + /* Parameter nID */ + +/* 102 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 104 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 106 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 108 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 110 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 112 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetDirectDraw */ + +/* 114 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 116 */ NdrFcLong( 0x0 ), /* 0 */ +/* 120 */ NdrFcShort( 0x4 ), /* 4 */ +/* 122 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 124 */ NdrFcShort( 0x20 ), /* 32 */ +/* 126 */ NdrFcShort( 0x8 ), /* 8 */ +/* 128 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 130 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 132 */ NdrFcShort( 0x0 ), /* 0 */ +/* 134 */ NdrFcShort( 0x1 ), /* 1 */ +/* 136 */ NdrFcShort( 0x0 ), /* 0 */ +/* 138 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter iid */ + +/* 140 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 142 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 144 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 146 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +/* 148 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 150 */ NdrFcShort( 0x18 ), /* Type Offset=24 */ + + /* Return value */ + +/* 152 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 154 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 156 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetPrimarySurface */ + +/* 158 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 160 */ NdrFcLong( 0x0 ), /* 0 */ +/* 164 */ NdrFcShort( 0x5 ), /* 5 */ +/* 166 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 168 */ NdrFcShort( 0x0 ), /* 0 */ +/* 170 */ NdrFcShort( 0x8 ), /* 8 */ +/* 172 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 174 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 176 */ NdrFcShort( 0x0 ), /* 0 */ +/* 178 */ NdrFcShort( 0x0 ), /* 0 */ +/* 180 */ NdrFcShort( 0x0 ), /* 0 */ +/* 182 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppPrimary */ + +/* 184 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 186 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 188 */ NdrFcShort( 0x24 ), /* Type Offset=36 */ + + /* Return value */ + +/* 190 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 192 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 194 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Get3DDevice */ + +/* 196 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 198 */ NdrFcLong( 0x0 ), /* 0 */ +/* 202 */ NdrFcShort( 0x6 ), /* 6 */ +/* 204 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 206 */ NdrFcShort( 0x20 ), /* 32 */ +/* 208 */ NdrFcShort( 0x8 ), /* 8 */ +/* 210 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 212 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 214 */ NdrFcShort( 0x0 ), /* 0 */ +/* 216 */ NdrFcShort( 0x1 ), /* 1 */ +/* 218 */ NdrFcShort( 0x0 ), /* 0 */ +/* 220 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter iid */ + +/* 222 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 224 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 226 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 228 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +/* 230 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 232 */ NdrFcShort( 0x3a ), /* Type Offset=58 */ + + /* Return value */ + +/* 234 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 236 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 238 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadBitmapFile */ + +/* 240 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 242 */ NdrFcLong( 0x0 ), /* 0 */ +/* 246 */ NdrFcShort( 0x7 ), /* 7 */ +/* 248 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 250 */ NdrFcShort( 0x0 ), /* 0 */ +/* 252 */ NdrFcShort( 0x8 ), /* 8 */ +/* 254 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 256 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 258 */ NdrFcShort( 0x0 ), /* 0 */ +/* 260 */ NdrFcShort( 0x1 ), /* 1 */ +/* 262 */ NdrFcShort( 0x0 ), /* 0 */ +/* 264 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strFilename */ + +/* 266 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 268 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 270 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter ppImage */ + +/* 272 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 274 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 276 */ NdrFcShort( 0x6a ), /* Type Offset=106 */ + + /* Return value */ + +/* 278 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 280 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 282 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetIconCache */ + +/* 284 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 286 */ NdrFcLong( 0x0 ), /* 0 */ +/* 290 */ NdrFcShort( 0x8 ), /* 8 */ +/* 292 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 294 */ NdrFcShort( 0x10 ), /* 16 */ +/* 296 */ NdrFcShort( 0x8 ), /* 8 */ +/* 298 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x3, /* 3 */ +/* 300 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 302 */ NdrFcShort( 0x0 ), /* 0 */ +/* 304 */ NdrFcShort( 0x0 ), /* 0 */ +/* 306 */ NdrFcShort( 0x0 ), /* 0 */ +/* 308 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter psz */ + +/* 310 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 312 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 314 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter ppCache */ + +/* 316 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 318 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 320 */ NdrFcShort( 0x8c ), /* Type Offset=140 */ + + /* Return value */ + +/* 322 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 324 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 326 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadBitmapPortal */ + +/* 328 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 330 */ NdrFcLong( 0x0 ), /* 0 */ +/* 334 */ NdrFcShort( 0x9 ), /* 9 */ +/* 336 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 338 */ NdrFcShort( 0x8 ), /* 8 */ +/* 340 */ NdrFcShort( 0x8 ), /* 8 */ +/* 342 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 344 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 346 */ NdrFcShort( 0x0 ), /* 0 */ +/* 348 */ NdrFcShort( 0x0 ), /* 0 */ +/* 350 */ NdrFcShort( 0x0 ), /* 0 */ +/* 352 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nFile */ + +/* 354 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 356 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 358 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter __MIDL_0011 */ + +/* 360 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +/* 362 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 364 */ NdrFcShort( 0xa2 ), /* Type Offset=162 */ + + /* Return value */ + +/* 366 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 368 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 370 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateFont */ + +/* 372 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 374 */ NdrFcLong( 0x0 ), /* 0 */ +/* 378 */ NdrFcShort( 0xa ), /* 10 */ +/* 380 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 382 */ NdrFcShort( 0x10 ), /* 16 */ +/* 384 */ NdrFcShort( 0x8 ), /* 8 */ +/* 386 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x5, /* 5 */ +/* 388 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 390 */ NdrFcShort( 0x0 ), /* 0 */ +/* 392 */ NdrFcShort( 0x1 ), /* 1 */ +/* 394 */ NdrFcShort( 0x0 ), /* 0 */ +/* 396 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter szFaceName */ + +/* 398 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 400 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 402 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter nHeight */ + +/* 404 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 406 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 408 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter dwFlags */ + +/* 410 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 412 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 414 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter ppFont */ + +/* 416 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 418 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 420 */ NdrFcShort( 0xa6 ), /* Type Offset=166 */ + + /* Return value */ + +/* 422 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 424 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 426 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetScreenSize */ + +/* 428 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 430 */ NdrFcLong( 0x0 ), /* 0 */ +/* 434 */ NdrFcShort( 0xb ), /* 11 */ +/* 436 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 438 */ NdrFcShort( 0x10 ), /* 16 */ +/* 440 */ NdrFcShort( 0x8 ), /* 8 */ +/* 442 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 444 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 446 */ NdrFcShort( 0x0 ), /* 0 */ +/* 448 */ NdrFcShort( 0x0 ), /* 0 */ +/* 450 */ NdrFcShort( 0x0 ), /* 0 */ +/* 452 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter sz */ + +/* 454 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 456 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 458 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 460 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 462 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 464 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateCanvas */ + +/* 466 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 468 */ NdrFcLong( 0x0 ), /* 0 */ +/* 472 */ NdrFcShort( 0xc ), /* 12 */ +/* 474 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 476 */ NdrFcShort( 0x10 ), /* 16 */ +/* 478 */ NdrFcShort( 0x8 ), /* 8 */ +/* 480 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x3, /* 3 */ +/* 482 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 484 */ NdrFcShort( 0x0 ), /* 0 */ +/* 486 */ NdrFcShort( 0x0 ), /* 0 */ +/* 488 */ NdrFcShort( 0x0 ), /* 0 */ +/* 490 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter psz */ + +/* 492 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 494 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 496 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter ppCanvas */ + +/* 498 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 500 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 502 */ NdrFcShort( 0x24 ), /* Type Offset=36 */ + + /* Return value */ + +/* 504 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 506 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 508 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateView */ + +/* 510 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 512 */ NdrFcLong( 0x0 ), /* 0 */ +/* 516 */ NdrFcShort( 0xd ), /* 13 */ +/* 518 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 520 */ NdrFcShort( 0x0 ), /* 0 */ +/* 522 */ NdrFcShort( 0x8 ), /* 8 */ +/* 524 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 526 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 528 */ NdrFcShort( 0x0 ), /* 0 */ +/* 530 */ NdrFcShort( 0x1 ), /* 1 */ +/* 532 */ NdrFcShort( 0x0 ), /* 0 */ +/* 534 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pParams */ + +/* 536 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 538 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 540 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Parameter pLayer */ + +/* 542 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 544 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 546 */ NdrFcShort( 0xd6 ), /* Type Offset=214 */ + + /* Parameter ppView */ + +/* 548 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 550 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 552 */ NdrFcShort( 0xe8 ), /* Type Offset=232 */ + + /* Return value */ + +/* 554 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 556 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 558 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadView */ + +/* 560 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 562 */ NdrFcLong( 0x0 ), /* 0 */ +/* 566 */ NdrFcShort( 0xe ), /* 14 */ +/* 568 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 570 */ NdrFcShort( 0x0 ), /* 0 */ +/* 572 */ NdrFcShort( 0x8 ), /* 8 */ +/* 574 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 576 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 578 */ NdrFcShort( 0x0 ), /* 0 */ +/* 580 */ NdrFcShort( 0x1 ), /* 1 */ +/* 582 */ NdrFcShort( 0x0 ), /* 0 */ +/* 584 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strSchema */ + +/* 586 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 588 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 590 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter ppView */ + +/* 592 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 594 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 596 */ NdrFcShort( 0xe8 ), /* Type Offset=232 */ + + /* Return value */ + +/* 598 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 600 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 602 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateBrushImage */ + +/* 604 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 606 */ NdrFcLong( 0x0 ), /* 0 */ +/* 610 */ NdrFcShort( 0xf ), /* 15 */ +/* 612 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 614 */ NdrFcShort( 0x8 ), /* 8 */ +/* 616 */ NdrFcShort( 0x8 ), /* 8 */ +/* 618 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x3, /* 3 */ +/* 620 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 622 */ NdrFcShort( 0x0 ), /* 0 */ +/* 624 */ NdrFcShort( 0x0 ), /* 0 */ +/* 626 */ NdrFcShort( 0x0 ), /* 0 */ +/* 628 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nColor */ + +/* 630 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 632 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 634 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter ppImg */ + +/* 636 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 638 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 640 */ NdrFcShort( 0x6a ), /* Type Offset=106 */ + + /* Return value */ + +/* 642 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 644 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 646 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadImageSchema */ + +/* 648 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 650 */ NdrFcLong( 0x0 ), /* 0 */ +/* 654 */ NdrFcShort( 0x10 ), /* 16 */ +/* 656 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 658 */ NdrFcShort( 0x0 ), /* 0 */ +/* 660 */ NdrFcShort( 0x8 ), /* 8 */ +/* 662 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 664 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 666 */ NdrFcShort( 0x0 ), /* 0 */ +/* 668 */ NdrFcShort( 0x0 ), /* 0 */ +/* 670 */ NdrFcShort( 0x0 ), /* 0 */ +/* 672 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pSchema */ + +/* 674 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 676 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 678 */ NdrFcShort( 0xfe ), /* Type Offset=254 */ + + /* Parameter ppImg */ + +/* 680 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 682 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 684 */ NdrFcShort( 0x6a ), /* Type Offset=106 */ + + /* Return value */ + +/* 686 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 688 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 690 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateFontSchema */ + +/* 692 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 694 */ NdrFcLong( 0x0 ), /* 0 */ +/* 698 */ NdrFcShort( 0x11 ), /* 17 */ +/* 700 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 702 */ NdrFcShort( 0x10 ), /* 16 */ +/* 704 */ NdrFcShort( 0x8 ), /* 8 */ +/* 706 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x5, /* 5 */ +/* 708 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 710 */ NdrFcShort( 0x0 ), /* 0 */ +/* 712 */ NdrFcShort( 0x0 ), /* 0 */ +/* 714 */ NdrFcShort( 0x0 ), /* 0 */ +/* 716 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nDefHeight */ + +/* 718 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 720 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 722 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nDefOptions */ + +/* 724 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 726 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 728 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pSchema */ + +/* 730 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 732 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 734 */ NdrFcShort( 0xfe ), /* Type Offset=254 */ + + /* Parameter ppCache */ + +/* 736 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 738 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 740 */ NdrFcShort( 0xa6 ), /* Type Offset=166 */ + + /* Return value */ + +/* 742 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 744 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 746 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadResourceModule */ + +/* 748 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 750 */ NdrFcLong( 0x0 ), /* 0 */ +/* 754 */ NdrFcShort( 0x12 ), /* 18 */ +/* 756 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 758 */ NdrFcShort( 0x0 ), /* 0 */ +/* 760 */ NdrFcShort( 0x10 ), /* 16 */ +/* 762 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 764 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 766 */ NdrFcShort( 0x0 ), /* 0 */ +/* 768 */ NdrFcShort( 0x1 ), /* 1 */ +/* 770 */ NdrFcShort( 0x0 ), /* 0 */ +/* 772 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strLibrary */ + +/* 774 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 776 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 778 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pnModule */ + +/* 780 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 782 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 784 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 786 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 788 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 790 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ResourcePath */ + +/* 792 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 794 */ NdrFcLong( 0x0 ), /* 0 */ +/* 798 */ NdrFcShort( 0x13 ), /* 19 */ +/* 800 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 802 */ NdrFcShort( 0x0 ), /* 0 */ +/* 804 */ NdrFcShort( 0x8 ), /* 8 */ +/* 806 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 808 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 810 */ NdrFcShort( 0x1 ), /* 1 */ +/* 812 */ NdrFcShort( 0x0 ), /* 0 */ +/* 814 */ NdrFcShort( 0x0 ), /* 0 */ +/* 816 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 818 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +/* 820 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 822 */ NdrFcShort( 0x11c ), /* Type Offset=284 */ + + /* Return value */ + +/* 824 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 826 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 828 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Plugin */ + +/* 830 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 832 */ NdrFcLong( 0x0 ), /* 0 */ +/* 836 */ NdrFcShort( 0x14 ), /* 20 */ +/* 838 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 840 */ NdrFcShort( 0x0 ), /* 0 */ +/* 842 */ NdrFcShort( 0x8 ), /* 8 */ +/* 844 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 846 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 848 */ NdrFcShort( 0x0 ), /* 0 */ +/* 850 */ NdrFcShort( 0x1 ), /* 1 */ +/* 852 */ NdrFcShort( 0x0 ), /* 0 */ +/* 854 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strProgID */ + +/* 856 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 858 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 860 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pVal */ + +/* 862 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 864 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 866 */ NdrFcShort( 0x126 ), /* Type Offset=294 */ + + /* Return value */ + +/* 868 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 870 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 872 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_NetworkFilter */ + +/* 874 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 876 */ NdrFcLong( 0x0 ), /* 0 */ +/* 880 */ NdrFcShort( 0x15 ), /* 21 */ +/* 882 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 884 */ NdrFcShort( 0x0 ), /* 0 */ +/* 886 */ NdrFcShort( 0x8 ), /* 8 */ +/* 888 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 890 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 892 */ NdrFcShort( 0x0 ), /* 0 */ +/* 894 */ NdrFcShort( 0x1 ), /* 1 */ +/* 896 */ NdrFcShort( 0x0 ), /* 0 */ +/* 898 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strProgID */ + +/* 900 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 902 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 904 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pVal */ + +/* 906 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 908 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 910 */ NdrFcShort( 0x13c ), /* Type Offset=316 */ + + /* Return value */ + +/* 912 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 914 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 916 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadViewObject */ + +/* 918 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 920 */ NdrFcLong( 0x0 ), /* 0 */ +/* 924 */ NdrFcShort( 0x16 ), /* 22 */ +/* 926 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 928 */ NdrFcShort( 0x0 ), /* 0 */ +/* 930 */ NdrFcShort( 0x8 ), /* 8 */ +/* 932 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 934 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 936 */ NdrFcShort( 0x0 ), /* 0 */ +/* 938 */ NdrFcShort( 0x0 ), /* 0 */ +/* 940 */ NdrFcShort( 0x0 ), /* 0 */ +/* 942 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pSchema */ + +/* 944 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 946 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 948 */ NdrFcShort( 0xfe ), /* Type Offset=254 */ + + /* Parameter ppView */ + +/* 950 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 952 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 954 */ NdrFcShort( 0xe8 ), /* Type Offset=232 */ + + /* Return value */ + +/* 956 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 958 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 960 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateInputBuffer */ + +/* 962 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 964 */ NdrFcLong( 0x0 ), /* 0 */ +/* 968 */ NdrFcShort( 0x17 ), /* 23 */ +/* 970 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 972 */ NdrFcShort( 0x0 ), /* 0 */ +/* 974 */ NdrFcShort( 0x8 ), /* 8 */ +/* 976 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 978 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 980 */ NdrFcShort( 0x0 ), /* 0 */ +/* 982 */ NdrFcShort( 0x0 ), /* 0 */ +/* 984 */ NdrFcShort( 0x0 ), /* 0 */ +/* 986 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppInput */ + +/* 988 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 990 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 992 */ NdrFcShort( 0x152 ), /* Type Offset=338 */ + + /* Return value */ + +/* 994 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 996 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 998 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_HWND */ + +/* 1000 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1002 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1006 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1008 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1010 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1012 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1014 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1016 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1018 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1020 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1022 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1024 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 1026 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1028 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1030 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1032 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1034 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1036 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Focus */ + +/* 1038 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1040 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1044 */ NdrFcShort( 0x19 ), /* 25 */ +/* 1046 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1048 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1050 */ NdrFcShort( 0xe ), /* 14 */ +/* 1052 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1054 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1056 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1058 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1060 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1062 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 1064 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1066 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1068 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1070 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1072 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1074 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_OldWndProc */ + +/* 1076 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1078 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1082 */ NdrFcShort( 0x1a ), /* 26 */ +/* 1084 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1086 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1088 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1090 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1092 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1094 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1096 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1098 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1100 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pOldWndProc */ + +/* 1102 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1104 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1106 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1108 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1110 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1112 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_CurrentSelection */ + +/* 1114 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1116 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1120 */ NdrFcShort( 0x1b ), /* 27 */ +/* 1122 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1124 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1126 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1128 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1130 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1132 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1134 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1136 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1138 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nID */ + +/* 1140 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1142 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1144 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1146 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1148 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1150 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_CurrentSelection */ + +/* 1152 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1154 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1158 */ NdrFcShort( 0x1c ), /* 28 */ +/* 1160 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1162 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1164 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1166 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1168 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1170 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1172 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1174 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1176 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nID */ + +/* 1178 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1180 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1182 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1184 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1186 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1188 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_PreviousSelection */ + +/* 1190 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1192 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1196 */ NdrFcShort( 0x1d ), /* 29 */ +/* 1198 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1200 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1202 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1204 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1206 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1208 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1210 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1212 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1214 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nID */ + +/* 1216 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1218 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1220 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1222 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1224 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1226 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_PreviousSelection */ + +/* 1228 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1230 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1234 */ NdrFcShort( 0x1e ), /* 30 */ +/* 1236 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1238 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1240 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1242 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1244 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1246 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1248 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1250 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1252 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nID */ + +/* 1254 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1256 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1258 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1260 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1262 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1264 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure WriteToChatWindow */ + +/* 1266 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1268 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1272 */ NdrFcShort( 0x1f ), /* 31 */ +/* 1274 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1276 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1278 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1280 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 1282 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 1284 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1286 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1288 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1290 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter szText */ + +/* 1292 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 1294 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1296 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter lColor */ + +/* 1298 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1300 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1302 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1304 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1306 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1308 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetCursorPosition */ + +/* 1310 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1312 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1316 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1318 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1320 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1322 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1324 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 1326 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1328 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1330 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1332 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1334 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter x */ + +/* 1336 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1338 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1340 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter y */ + +/* 1342 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1344 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1346 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1348 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1350 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1352 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure QueryKeyboardMap */ + +/* 1354 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1356 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1360 */ NdrFcShort( 0x21 ), /* 33 */ +/* 1362 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1364 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1366 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1368 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 1370 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 1372 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1374 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1376 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1378 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter bstrName */ + +/* 1380 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 1382 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1384 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pAsciiVal */ + +/* 1386 */ NdrFcShort( 0x148 ), /* Flags: in, base type, simple ref, */ +/* 1388 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1390 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1392 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1394 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1396 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ChatText */ + +/* 1398 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1400 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1404 */ NdrFcShort( 0x3 ), /* 3 */ +/* 1406 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1408 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1410 */ NdrFcShort( 0xe ), /* 14 */ +/* 1412 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 1414 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 1416 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1418 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1420 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1422 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter bstrMsg */ + +/* 1424 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 1426 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1428 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pbEat */ + +/* 1430 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1432 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1434 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1436 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1438 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1440 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ChatMessage */ + +/* 1442 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1444 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1448 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1450 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 1452 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1454 */ NdrFcShort( 0xe ), /* 14 */ +/* 1456 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 1458 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 1460 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1462 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1464 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1466 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter bstrMsg */ + +/* 1468 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 1470 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1472 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pColor */ + +/* 1474 */ NdrFcShort( 0x148 ), /* Flags: in, base type, simple ref, */ +/* 1476 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1478 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pbEat */ + +/* 1480 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1482 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1484 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1486 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1488 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1490 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Initialize */ + +/* 1492 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1494 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1498 */ NdrFcShort( 0x3 ), /* 3 */ +/* 1500 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1502 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1504 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1506 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 1508 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1510 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1512 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1514 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1516 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pSite */ + +/* 1518 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 1520 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1522 */ NdrFcShort( 0x170 ), /* Type Offset=368 */ + + /* Parameter nID */ + +/* 1524 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1526 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1528 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1530 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1532 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1534 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure WindowMessageEnd */ + + + /* Procedure PopClipRect */ + + + /* Procedure LayerDestroy */ + + + /* Procedure Terminate */ + +/* 1536 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1538 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1542 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1544 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1546 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1548 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1550 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 1552 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1554 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1556 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1558 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1560 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + +/* 1562 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1564 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1566 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_FriendlyName */ + +/* 1568 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1570 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1574 */ NdrFcShort( 0x5 ), /* 5 */ +/* 1576 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1578 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1580 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1582 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 1584 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 1586 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1588 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1590 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1592 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 1594 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +/* 1596 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1598 */ NdrFcShort( 0x11c ), /* Type Offset=284 */ + + /* Return value */ + +/* 1600 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1602 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1604 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure DestroyChild */ + +/* 1606 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1608 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1612 */ NdrFcShort( 0x7 ), /* 7 */ +/* 1614 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1616 */ NdrFcShort( 0xe ), /* 14 */ +/* 1618 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1620 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 1622 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1624 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1626 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1628 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1630 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nIndex */ + +/* 1632 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1634 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1636 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter posType */ + +/* 1638 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1640 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1642 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1644 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1646 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1648 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ID */ + +/* 1650 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1652 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1656 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1658 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1660 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1662 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1664 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1666 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1668 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1670 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1672 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1674 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 1676 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1678 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1680 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1682 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1684 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1686 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Count */ + + + /* Procedure get_ChildCount */ + +/* 1688 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1690 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1694 */ NdrFcShort( 0x9 ), /* 9 */ +/* 1696 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1698 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1700 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1702 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1704 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1706 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1708 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1710 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1712 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + + + /* Parameter pVal */ + +/* 1714 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1716 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1718 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 1720 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1722 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1724 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Child */ + +/* 1726 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1728 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1732 */ NdrFcShort( 0xa ), /* 10 */ +/* 1734 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 1736 */ NdrFcShort( 0xe ), /* 14 */ +/* 1738 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1740 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x4, /* 4 */ +/* 1742 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1744 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1746 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1748 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1750 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nIndex */ + +/* 1752 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1754 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1756 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter posType */ + +/* 1758 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 1760 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1762 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 1764 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 1766 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1768 */ NdrFcShort( 0x182 ), /* Type Offset=386 */ + + /* Return value */ + +/* 1770 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1772 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 1774 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LayerCreate */ + +/* 1776 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1778 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1782 */ NdrFcShort( 0x3 ), /* 3 */ +/* 1784 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1786 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1788 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1790 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 1792 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1794 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1796 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1798 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1800 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pSite */ + +/* 1802 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 1804 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1806 */ NdrFcShort( 0x198 ), /* Type Offset=408 */ + + /* Return value */ + +/* 1808 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1810 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1812 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Position */ + +/* 1814 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1816 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1820 */ NdrFcShort( 0x5 ), /* 5 */ +/* 1822 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1824 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1826 */ NdrFcShort( 0x28 ), /* 40 */ +/* 1828 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1830 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1832 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1834 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1836 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1838 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 1840 */ NdrFcShort( 0x2012 ), /* Flags: must free, out, srv alloc size=8 */ +/* 1842 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1844 */ NdrFcShort( 0x1aa ), /* Type Offset=426 */ + + /* Return value */ + +/* 1846 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1848 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1850 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Position */ + +/* 1852 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1854 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1858 */ NdrFcShort( 0x6 ), /* 6 */ +/* 1860 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1862 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1864 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1866 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1868 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1870 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1872 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1874 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1876 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 1878 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 1880 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1882 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Return value */ + +/* 1884 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1886 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1888 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Destroy */ + + + /* Procedure PreRender */ + +/* 1890 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1892 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1896 */ NdrFcShort( 0x3 ), /* 3 */ +/* 1898 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1900 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1902 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1904 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 1906 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1908 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1910 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1912 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1914 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 1916 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1918 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1920 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Render */ + +/* 1922 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1924 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1928 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1930 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 1932 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1934 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1936 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 1938 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1940 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1942 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1944 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1946 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pDest */ + +/* 1948 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 1950 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1952 */ NdrFcShort( 0x28 ), /* Type Offset=40 */ + + /* Return value */ + +/* 1954 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1956 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1958 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Reformat */ + +/* 1960 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1962 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1966 */ NdrFcShort( 0x5 ), /* 5 */ +/* 1968 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 1970 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1972 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1974 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 1976 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 1978 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1980 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1982 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1984 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + +/* 1986 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1988 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 1990 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure AdjustRenderArea */ + +/* 1992 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1994 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1998 */ NdrFcShort( 0x6 ), /* 6 */ +/* 2000 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2002 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2004 */ NdrFcShort( 0xe ), /* 14 */ +/* 2006 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 2008 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2010 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2012 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2014 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2016 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pDest */ + +/* 2018 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 2020 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2022 */ NdrFcShort( 0x28 ), /* Type Offset=40 */ + + /* Parameter pbVisible */ + +/* 2024 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 2026 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2028 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2030 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2032 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2034 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure HitTest */ + +/* 2036 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2038 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2042 */ NdrFcShort( 0x7 ), /* 7 */ +/* 2044 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2046 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2048 */ NdrFcShort( 0xe ), /* 14 */ +/* 2050 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 2052 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2054 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2056 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2058 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2060 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pt */ + +/* 2062 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 2064 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2066 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter pbHit */ + +/* 2068 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 2070 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2072 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2074 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2076 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2078 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateChild */ + +/* 2080 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2082 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2086 */ NdrFcShort( 0x4 ), /* 4 */ +/* 2088 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2090 */ NdrFcShort( 0x28 ), /* 40 */ +/* 2092 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2094 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 2096 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2098 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2100 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2102 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2104 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter params */ + +/* 2106 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 2108 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2110 */ NdrFcShort( 0x1c4 ), /* Type Offset=452 */ + + /* Parameter pSink */ + +/* 2112 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 2114 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2116 */ NdrFcShort( 0xd6 ), /* Type Offset=214 */ + + /* Return value */ + +/* 2118 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2120 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2122 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetSink */ + +/* 2124 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2126 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2130 */ NdrFcShort( 0x5 ), /* 5 */ +/* 2132 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2134 */ NdrFcShort( 0x20 ), /* 32 */ +/* 2136 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2138 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 2140 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 2142 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2144 */ NdrFcShort( 0x1 ), /* 1 */ +/* 2146 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2148 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter iid */ + +/* 2150 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 2152 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2154 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 2156 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +/* 2158 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2160 */ NdrFcShort( 0x1d0 ), /* Type Offset=464 */ + + /* Return value */ + +/* 2162 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2164 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2166 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ReleaseDC */ + + + /* Procedure Invalidate */ + +/* 2168 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2170 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2174 */ NdrFcShort( 0x6 ), /* 6 */ +/* 2176 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2178 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2180 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2182 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 2184 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2186 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2188 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2190 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2192 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 2194 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2196 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2198 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_PluginSite */ + +/* 2200 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2202 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2206 */ NdrFcShort( 0x7 ), /* 7 */ +/* 2208 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2210 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2212 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2214 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 2216 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2218 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2220 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2222 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2224 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppSite */ + +/* 2226 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 2228 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2230 */ NdrFcShort( 0x1dc ), /* Type Offset=476 */ + + /* Return value */ + +/* 2232 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2234 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2236 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure NotifyEnd */ + + + /* Procedure Deactivate */ + + + /* Procedure Reformat */ + +/* 2238 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2240 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2244 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2246 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2248 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2250 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2252 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 2254 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2256 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2258 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2260 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2262 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + +/* 2264 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2266 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2268 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetParentSink */ + +/* 2270 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2272 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2276 */ NdrFcShort( 0x9 ), /* 9 */ +/* 2278 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2280 */ NdrFcShort( 0x20 ), /* 32 */ +/* 2282 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2284 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 2286 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 2288 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2290 */ NdrFcShort( 0x1 ), /* 1 */ +/* 2292 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2294 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter iid */ + +/* 2296 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 2298 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2300 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 2302 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */ +/* 2304 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2306 */ NdrFcShort( 0x1f2 ), /* Type Offset=498 */ + + /* Return value */ + +/* 2308 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2310 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2312 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Position */ + +/* 2314 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2316 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2320 */ NdrFcShort( 0xa ), /* 10 */ +/* 2322 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2324 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2326 */ NdrFcShort( 0x20 ), /* 32 */ +/* 2328 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2330 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2332 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2334 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2336 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2338 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 2340 */ NdrFcShort( 0x4112 ), /* Flags: must free, out, simple ref, srv alloc size=16 */ +/* 2342 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2344 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Return value */ + +/* 2346 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2348 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2350 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Position */ + +/* 2352 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2354 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2358 */ NdrFcShort( 0xb ), /* 11 */ +/* 2360 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2362 */ NdrFcShort( 0x18 ), /* 24 */ +/* 2364 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2366 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2368 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2370 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2372 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2374 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2376 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 2378 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 2380 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2382 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Return value */ + +/* 2384 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2386 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2388 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Matte */ + + + /* Procedure get_ID */ + +/* 2390 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2392 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2396 */ NdrFcShort( 0xc ), /* 12 */ +/* 2398 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2400 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2402 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2404 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2406 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2408 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2410 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2412 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2414 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + + + /* Parameter pVal */ + +/* 2416 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 2418 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2420 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 2422 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2424 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2426 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Command */ + + + /* Procedure get_ChildCount */ + +/* 2428 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2430 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2434 */ NdrFcShort( 0xd ), /* 13 */ +/* 2436 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2438 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2440 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2442 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2444 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2446 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2448 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2450 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2452 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + + + /* Parameter pVal */ + +/* 2454 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 2456 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2458 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 2460 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2462 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2464 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Child */ + +/* 2466 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2468 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2472 */ NdrFcShort( 0xe ), /* 14 */ +/* 2474 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 2476 */ NdrFcShort( 0xe ), /* 14 */ +/* 2478 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2480 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x4, /* 4 */ +/* 2482 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2484 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2486 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2488 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2490 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nIndex */ + +/* 2492 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2494 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2496 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter posType */ + +/* 2498 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2500 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2502 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 2504 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 2506 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2508 */ NdrFcShort( 0x202 ), /* Type Offset=514 */ + + /* Return value */ + +/* 2510 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2512 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2514 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CaptureKeyboard */ + +/* 2516 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2518 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2522 */ NdrFcShort( 0xf ), /* 15 */ +/* 2524 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2526 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2528 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2530 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 2532 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2534 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2536 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2538 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2540 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + +/* 2542 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2544 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2546 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure IsChild */ + +/* 2548 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2550 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2554 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2556 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 2558 */ NdrFcShort( 0x6 ), /* 6 */ +/* 2560 */ NdrFcShort( 0xe ), /* 14 */ +/* 2562 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 2564 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2566 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2568 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2570 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2572 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pSite */ + +/* 2574 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 2576 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2578 */ NdrFcShort( 0x206 ), /* Type Offset=518 */ + + /* Parameter bTestUnclipped */ + +/* 2580 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2582 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2584 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Parameter pbIsChild */ + +/* 2586 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 2588 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2590 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2592 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2594 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2596 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Popup */ + +/* 2598 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2600 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2604 */ NdrFcShort( 0x11 ), /* 17 */ +/* 2606 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2608 */ NdrFcShort( 0x6 ), /* 6 */ +/* 2610 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2612 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2614 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2616 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2618 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2620 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2622 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 2624 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2626 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2628 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2630 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2632 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2634 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ScreenPosition */ + +/* 2636 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2638 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2642 */ NdrFcShort( 0x12 ), /* 18 */ +/* 2644 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2646 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2648 */ NdrFcShort( 0x20 ), /* 32 */ +/* 2650 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2652 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2654 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2656 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2658 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2660 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 2662 */ NdrFcShort( 0x4112 ), /* Flags: must free, out, simple ref, srv alloc size=16 */ +/* 2664 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2666 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Return value */ + +/* 2668 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2670 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2672 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure StartTimer */ + +/* 2674 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2676 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2680 */ NdrFcShort( 0x13 ), /* 19 */ +/* 2682 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2684 */ NdrFcShort( 0x10 ), /* 16 */ +/* 2686 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2688 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 2690 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2692 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2694 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2696 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2698 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nID */ + +/* 2700 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2702 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2704 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nInterval */ + +/* 2706 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2708 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2710 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2712 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2714 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2716 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Alpha */ + + + /* Procedure EndTimer */ + +/* 2718 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2720 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2724 */ NdrFcShort( 0x14 ), /* 20 */ +/* 2726 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2728 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2730 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2732 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2734 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2736 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2738 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2740 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2742 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter Alpha */ + + + /* Parameter nID */ + +/* 2744 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2746 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2748 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 2750 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2752 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2754 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Transparent */ + +/* 2756 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2758 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2762 */ NdrFcShort( 0x15 ), /* 21 */ +/* 2764 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2766 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2768 */ NdrFcShort( 0xe ), /* 14 */ +/* 2770 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2772 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2774 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2776 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2778 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2780 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 2782 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 2784 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2786 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2788 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2790 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2792 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Transparent */ + +/* 2794 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2796 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2800 */ NdrFcShort( 0x16 ), /* 22 */ +/* 2802 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2804 */ NdrFcShort( 0x6 ), /* 6 */ +/* 2806 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2808 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2810 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2812 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2814 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2816 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2818 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 2820 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2822 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2824 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2826 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2828 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2830 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Alpha */ + +/* 2832 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2834 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2838 */ NdrFcShort( 0x17 ), /* 23 */ +/* 2840 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2842 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2844 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2846 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2848 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2850 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2852 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2854 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2856 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter Alpha */ + +/* 2858 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2860 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2862 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 2864 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2866 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2868 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure AddBar */ + +/* 2870 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2872 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2876 */ NdrFcShort( 0x3 ), /* 3 */ +/* 2878 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2880 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2882 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2884 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 2886 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 2888 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2890 */ NdrFcShort( 0x1 ), /* 1 */ +/* 2892 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2894 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + +/* 2896 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2898 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2900 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pParams */ + +/* 2902 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 2904 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2906 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Return value */ + +/* 2908 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2910 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2912 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Color */ + + + /* Procedure SelectBar */ + + + /* Procedure RemoveBar */ + +/* 2914 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2916 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2920 */ NdrFcShort( 0x4 ), /* 4 */ +/* 2922 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2924 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2926 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2928 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 2930 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 2932 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2934 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2936 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2938 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + + + /* Parameter nID */ + + + /* Parameter nViewID */ + +/* 2940 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2942 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2944 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + + + /* Return value */ + +/* 2946 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2948 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2950 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Bar */ + +/* 2952 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2954 */ NdrFcLong( 0x0 ), /* 0 */ +/* 2958 */ NdrFcShort( 0x5 ), /* 5 */ +/* 2960 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 2962 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2964 */ NdrFcShort( 0x8 ), /* 8 */ +/* 2966 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x3, /* 3 */ +/* 2968 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 2970 */ NdrFcShort( 0x1 ), /* 1 */ +/* 2972 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2974 */ NdrFcShort( 0x0 ), /* 0 */ +/* 2976 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + +/* 2978 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 2980 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 2982 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 2984 */ NdrFcShort( 0xa113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=40 */ +/* 2986 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 2988 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Return value */ + +/* 2990 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 2992 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 2994 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Bar */ + +/* 2996 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 2998 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3002 */ NdrFcShort( 0x6 ), /* 6 */ +/* 3004 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3006 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3008 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3010 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 3012 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 3014 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3016 */ NdrFcShort( 0x1 ), /* 1 */ +/* 3018 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3020 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + +/* 3022 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3024 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3026 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter newVal */ + +/* 3028 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3030 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3032 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Return value */ + +/* 3034 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3036 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3038 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure DrawIcon */ + +/* 3040 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3042 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3046 */ NdrFcShort( 0x3 ), /* 3 */ +/* 3048 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 3050 */ NdrFcShort( 0x20 ), /* 32 */ +/* 3052 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3054 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x5, /* 5 */ +/* 3056 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3058 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3060 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3062 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3064 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppt */ + +/* 3066 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 3068 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3070 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter nFile */ + +/* 3072 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3074 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3076 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nModule */ + +/* 3078 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3080 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3082 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pTarget */ + +/* 3084 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 3086 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3088 */ NdrFcShort( 0x21c ), /* Type Offset=540 */ + + /* Return value */ + +/* 3090 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3092 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3094 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PatBlt */ + +/* 3096 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3098 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3102 */ NdrFcShort( 0x7 ), /* 7 */ +/* 3104 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3106 */ NdrFcShort( 0x28 ), /* 40 */ +/* 3108 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3110 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 3112 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3114 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3116 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3118 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3120 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pDest */ + +/* 3122 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 3124 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3126 */ NdrFcShort( 0x21c ), /* Type Offset=540 */ + + /* Parameter prcDest */ + +/* 3128 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 3130 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3132 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Parameter ptOrigin */ + +/* 3134 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 3136 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3138 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 3140 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3142 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3144 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure StretchBlt */ + +/* 3146 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3148 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3152 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3154 */ NdrFcShort( 0x38 ), /* ia64, axp64 Stack size/offset = 56 */ +/* 3156 */ NdrFcShort( 0x28 ), /* 40 */ +/* 3158 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3160 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x6, /* 6 */ +/* 3162 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3164 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3166 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3168 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3170 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pDest */ + +/* 3172 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 3174 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3176 */ NdrFcShort( 0x21c ), /* Type Offset=540 */ + + /* Parameter pptDest */ + +/* 3178 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 3180 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3182 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter nWidth */ + +/* 3184 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3186 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3188 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nStartStretch */ + +/* 3190 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3192 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3194 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nEndStretch */ + +/* 3196 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3198 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3200 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3202 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3204 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 3206 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Blt */ + +/* 3208 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3210 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3214 */ NdrFcShort( 0x9 ), /* 9 */ +/* 3216 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3218 */ NdrFcShort( 0x28 ), /* 40 */ +/* 3220 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3222 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 3224 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3226 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3228 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3230 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3232 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter rcSrc */ + +/* 3234 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 3236 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3238 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Parameter pDest */ + +/* 3240 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 3242 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3244 */ NdrFcShort( 0x21c ), /* Type Offset=540 */ + + /* Parameter pptDest */ + +/* 3246 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 3248 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3250 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 3252 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3254 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3256 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Size */ + +/* 3258 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3260 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3264 */ NdrFcShort( 0xa ), /* 10 */ +/* 3266 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3268 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3270 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3272 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 3274 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3276 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3278 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3280 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3282 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 3284 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +/* 3286 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3288 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 3290 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3292 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3294 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure DrawText */ + +/* 3296 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3298 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3302 */ NdrFcShort( 0x7 ), /* 7 */ +/* 3304 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 3306 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3308 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3310 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x5, /* 5 */ +/* 3312 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 3314 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3316 */ NdrFcShort( 0x1 ), /* 1 */ +/* 3318 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3320 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pt */ + +/* 3322 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 3324 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3326 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter szText */ + +/* 3328 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 3330 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3332 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter clr */ + +/* 3334 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3336 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3338 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pTarget */ + +/* 3340 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 3342 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3344 */ NdrFcShort( 0x21c ), /* Type Offset=540 */ + + /* Return value */ + +/* 3346 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3348 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3350 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MeasureText */ + +/* 3352 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3354 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3358 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3360 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3362 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3364 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3366 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 3368 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 3370 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3372 */ NdrFcShort( 0x1 ), /* 1 */ +/* 3374 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3376 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter szText */ + +/* 3378 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 3380 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3382 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pszExt */ + +/* 3384 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +/* 3386 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3388 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 3390 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3392 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3394 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure HitTest */ + +/* 3396 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3398 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3402 */ NdrFcShort( 0x9 ), /* 9 */ +/* 3404 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3406 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3408 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3410 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 3412 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 3414 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3416 */ NdrFcShort( 0x1 ), /* 1 */ +/* 3418 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3420 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter szText */ + +/* 3422 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 3424 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3426 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter nPos */ + +/* 3428 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3430 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3432 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nIndex */ + +/* 3434 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 3436 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3438 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3440 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3442 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3444 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Color */ + + + /* Procedure get_RenderWidth */ + +/* 3446 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3448 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3452 */ NdrFcShort( 0x3 ), /* 3 */ +/* 3454 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3456 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3458 */ NdrFcShort( 0x10 ), /* 16 */ +/* 3460 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 3462 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3464 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3466 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3468 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3470 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + + + /* Parameter nWidth */ + +/* 3472 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 3474 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3476 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 3478 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3480 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3482 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Params */ + +/* 3484 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3486 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3490 */ NdrFcShort( 0x4 ), /* 4 */ +/* 3492 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3494 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3496 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3498 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3500 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 3502 */ NdrFcShort( 0x1 ), /* 1 */ +/* 3504 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3506 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3508 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 3510 */ NdrFcShort( 0xa113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=40 */ +/* 3512 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3514 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Return value */ + +/* 3516 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3518 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3520 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Params */ + +/* 3522 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3524 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3528 */ NdrFcShort( 0x5 ), /* 5 */ +/* 3530 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3532 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3534 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3536 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3538 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 3540 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3542 */ NdrFcShort( 0x1 ), /* 1 */ +/* 3544 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3546 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 3548 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3550 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3552 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Return value */ + +/* 3554 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3556 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3558 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseEnter */ + +/* 3560 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3562 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3566 */ NdrFcShort( 0x3 ), /* 3 */ +/* 3568 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3570 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3572 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3574 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3576 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3578 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3580 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3582 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3584 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pMouse */ + +/* 3586 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3588 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3590 */ NdrFcShort( 0x236 ), /* Type Offset=566 */ + + /* Return value */ + +/* 3592 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3594 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3596 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseExit */ + +/* 3598 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3600 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3604 */ NdrFcShort( 0x4 ), /* 4 */ +/* 3606 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3608 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3610 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3612 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3614 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3616 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3618 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3620 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3622 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pMouse */ + +/* 3624 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3626 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3628 */ NdrFcShort( 0x236 ), /* Type Offset=566 */ + + /* Return value */ + +/* 3630 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3632 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3634 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseDown */ + +/* 3636 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3638 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3642 */ NdrFcShort( 0x5 ), /* 5 */ +/* 3644 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3646 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3648 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3650 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3652 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3654 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3656 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3658 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3660 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pMouse */ + +/* 3662 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3664 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3666 */ NdrFcShort( 0x236 ), /* Type Offset=566 */ + + /* Return value */ + +/* 3668 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3670 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3672 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseUp */ + +/* 3674 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3676 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3680 */ NdrFcShort( 0x6 ), /* 6 */ +/* 3682 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3684 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3686 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3688 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3690 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3692 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3694 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3696 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3698 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pMouse */ + +/* 3700 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3702 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3704 */ NdrFcShort( 0x236 ), /* Type Offset=566 */ + + /* Return value */ + +/* 3706 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3708 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3710 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseMove */ + +/* 3712 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3714 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3718 */ NdrFcShort( 0x7 ), /* 7 */ +/* 3720 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3722 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3724 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3726 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3728 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3730 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3732 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3734 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3736 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pMouse */ + +/* 3738 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3740 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3742 */ NdrFcShort( 0x236 ), /* Type Offset=566 */ + + /* Return value */ + +/* 3744 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3746 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3748 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseDblClk */ + +/* 3750 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3752 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3756 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3758 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3760 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3762 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3764 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 3766 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3768 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3770 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3772 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3774 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pMouse */ + +/* 3776 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 3778 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3780 */ NdrFcShort( 0x236 ), /* Type Offset=566 */ + + /* Return value */ + +/* 3782 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3784 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3786 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseEvent */ + +/* 3788 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3790 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3794 */ NdrFcShort( 0x9 ), /* 9 */ +/* 3796 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3798 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3800 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3802 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x4, /* 4 */ +/* 3804 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3806 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3808 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3810 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3812 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nMsg */ + +/* 3814 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3816 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3818 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter wParam */ + +/* 3820 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3822 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3824 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter lParam */ + +/* 3826 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3828 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3830 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3832 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3834 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3836 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SchemaLoad */ + +/* 3838 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3840 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3844 */ NdrFcShort( 0x3 ), /* 3 */ +/* 3846 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3848 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3850 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3852 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 3854 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3856 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3858 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3860 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3862 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pView */ + +/* 3864 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 3866 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3868 */ NdrFcShort( 0xec ), /* Type Offset=236 */ + + /* Parameter pXMLSchema */ + +/* 3870 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 3872 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3874 */ NdrFcShort( 0xfe ), /* Type Offset=254 */ + + /* Return value */ + +/* 3876 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3878 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3880 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetImages */ + +/* 3882 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3884 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3888 */ NdrFcShort( 0xb ), /* 11 */ +/* 3890 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 3892 */ NdrFcShort( 0x18 ), /* 24 */ +/* 3894 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3896 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x4, /* 4 */ +/* 3898 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3900 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3902 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3904 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3906 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nModule */ + +/* 3908 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3910 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3912 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nReleased */ + +/* 3914 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3916 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3918 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nPressed */ + +/* 3920 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3922 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3924 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3926 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3928 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 3930 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Matte */ + +/* 3932 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3934 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3938 */ NdrFcShort( 0xd ), /* 13 */ +/* 3940 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 3942 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3944 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3946 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 3948 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3950 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3952 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3954 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3956 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 3958 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 3960 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 3962 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 3964 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3966 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3968 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Alert */ + + + /* Procedure FinishCommand */ + +/* 3970 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 3972 */ NdrFcLong( 0x0 ), /* 0 */ +/* 3976 */ NdrFcShort( 0xb ), /* 11 */ +/* 3978 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 3980 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3982 */ NdrFcShort( 0x8 ), /* 8 */ +/* 3984 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 3986 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 3988 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3990 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3992 */ NdrFcShort( 0x0 ), /* 0 */ +/* 3994 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 3996 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 3998 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4000 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ScrollTo */ + +/* 4002 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4004 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4008 */ NdrFcShort( 0xc ), /* 12 */ +/* 4010 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4012 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4014 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4016 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4018 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4020 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4022 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4024 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4026 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppt */ + +/* 4028 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4030 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4032 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4034 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4036 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4038 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Command */ + +/* 4040 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4042 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4046 */ NdrFcShort( 0xe ), /* 14 */ +/* 4048 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4050 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4052 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4054 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4056 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4058 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4060 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4062 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4064 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 4066 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 4068 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4070 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4072 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4074 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4076 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Offset */ + +/* 4078 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4080 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4084 */ NdrFcShort( 0xf ), /* 15 */ +/* 4086 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4088 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4090 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4092 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4094 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4096 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4098 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4100 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4102 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 4104 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +/* 4106 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4108 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4110 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4112 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4114 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Offset */ + +/* 4116 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4118 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4122 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4124 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4126 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4128 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4130 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4132 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4134 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4136 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4138 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4140 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 4142 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4144 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4146 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4148 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4150 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4152 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateClient */ + +/* 4154 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4156 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4160 */ NdrFcShort( 0x11 ), /* 17 */ +/* 4162 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4164 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4166 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4168 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 4170 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4172 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4174 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4176 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4178 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pLayer */ + +/* 4180 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 4182 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4184 */ NdrFcShort( 0xd6 ), /* Type Offset=214 */ + + /* Return value */ + +/* 4186 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4188 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4190 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure AddView */ + +/* 4192 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4194 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4198 */ NdrFcShort( 0x3 ), /* 3 */ +/* 4200 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4202 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4204 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4206 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 4208 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4210 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4212 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4214 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4216 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + +/* 4218 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 4220 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4222 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pLayer */ + +/* 4224 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 4226 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4228 */ NdrFcShort( 0xd6 ), /* Type Offset=214 */ + + /* Return value */ + +/* 4230 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4232 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4234 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ActivateView */ + +/* 4236 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4238 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4242 */ NdrFcShort( 0x4 ), /* 4 */ +/* 4244 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 4246 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4248 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4250 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 4252 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 4254 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4256 */ NdrFcShort( 0x1 ), /* 1 */ +/* 4258 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4260 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + +/* 4262 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 4264 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4266 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pParams */ + +/* 4268 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 4270 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4272 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Parameter pVal */ + +/* 4274 */ NdrFcShort( 0x148 ), /* Flags: in, base type, simple ref, */ +/* 4276 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4278 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4280 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4282 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4284 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure RemoveView */ + +/* 4286 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4288 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4292 */ NdrFcShort( 0x5 ), /* 5 */ +/* 4294 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4296 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4298 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4300 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4302 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4304 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4306 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4308 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4310 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + +/* 4312 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 4314 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4316 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4318 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4320 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4322 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_ActiveView */ + +/* 4324 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4326 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4330 */ NdrFcShort( 0x6 ), /* 6 */ +/* 4332 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4334 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4336 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4338 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4340 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4342 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4344 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4346 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4348 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 4350 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 4352 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4354 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4356 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4358 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4360 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadView */ + +/* 4362 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4364 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4368 */ NdrFcShort( 0x7 ), /* 7 */ +/* 4370 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 4372 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4374 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4376 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 4378 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4380 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4382 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4384 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4386 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nViewID */ + +/* 4388 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 4390 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4392 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pView */ + +/* 4394 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 4396 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4398 */ NdrFcShort( 0xec ), /* Type Offset=236 */ + + /* Parameter pSchema */ + +/* 4400 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 4402 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4404 */ NdrFcShort( 0xfe ), /* Type Offset=254 */ + + /* Return value */ + +/* 4406 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4408 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4410 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure putref_Sink */ + +/* 4412 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4414 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4418 */ NdrFcShort( 0x9 ), /* 9 */ +/* 4420 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4422 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4424 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4426 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 4428 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4430 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4432 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4434 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4436 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 4438 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 4440 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4442 */ NdrFcShort( 0x24e ), /* Type Offset=590 */ + + /* Return value */ + +/* 4444 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4446 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4448 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PushClipRect */ + +/* 4450 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4452 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4456 */ NdrFcShort( 0x3 ), /* 3 */ +/* 4458 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4460 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4462 */ NdrFcShort( 0xe ), /* 14 */ +/* 4464 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 4466 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4468 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4470 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4472 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4474 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter prc */ + +/* 4476 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4478 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4480 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Parameter pbVisible */ + +/* 4482 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 4484 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4486 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4488 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4490 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4492 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetDC */ + +/* 4494 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4496 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4500 */ NdrFcShort( 0x5 ), /* 5 */ +/* 4502 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4504 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4506 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4508 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 4510 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 4512 */ NdrFcShort( 0x1 ), /* 1 */ +/* 4514 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4516 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4518 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pdc */ + +/* 4520 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +/* 4522 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4524 */ NdrFcShort( 0x27c ), /* Type Offset=636 */ + + /* Return value */ + +/* 4526 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4528 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4530 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetSurface */ + +/* 4532 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4534 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4538 */ NdrFcShort( 0x7 ), /* 7 */ +/* 4540 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4542 */ NdrFcShort( 0x20 ), /* 32 */ +/* 4544 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4546 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x3, /* 3 */ +/* 4548 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 4550 */ NdrFcShort( 0x1 ), /* 1 */ +/* 4552 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4554 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4556 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter iid */ + +/* 4558 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4560 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4562 */ NdrFcShort( 0xc ), /* Type Offset=12 */ + + /* Parameter ppvItf */ + +/* 4564 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 4566 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4568 */ NdrFcShort( 0x286 ), /* Type Offset=646 */ + + /* Return value */ + +/* 4570 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4572 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4574 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Fill */ + +/* 4576 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4578 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4582 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4584 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4586 */ NdrFcShort( 0x20 ), /* 32 */ +/* 4588 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4590 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 4592 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4594 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4596 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4598 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4600 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter prc */ + +/* 4602 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4604 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4606 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Parameter nRGB */ + +/* 4608 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 4610 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4612 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4614 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4616 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4618 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Frame */ + +/* 4620 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4622 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4626 */ NdrFcShort( 0x9 ), /* 9 */ +/* 4628 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4630 */ NdrFcShort( 0x20 ), /* 32 */ +/* 4632 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4634 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 4636 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4638 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4640 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4642 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4644 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter prc */ + +/* 4646 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4648 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4650 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Parameter nRGB */ + +/* 4652 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 4654 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4656 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4658 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4660 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4662 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure GetClipParams */ + +/* 4664 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4666 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4670 */ NdrFcShort( 0xa ), /* 10 */ +/* 4672 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4674 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4676 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4678 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 4680 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4682 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4684 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4686 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4688 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pParams */ + +/* 4690 */ NdrFcShort( 0x8113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=32 */ +/* 4692 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4694 */ NdrFcShort( 0x296 ), /* Type Offset=662 */ + + /* Return value */ + +/* 4696 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4698 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4700 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_WasLost */ + +/* 4702 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4704 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4708 */ NdrFcShort( 0xb ), /* 11 */ +/* 4710 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4712 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4714 */ NdrFcShort( 0xe ), /* 14 */ +/* 4716 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4718 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4720 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4722 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4724 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4726 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 4728 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 4730 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4732 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4734 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4736 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4738 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Size */ + +/* 4740 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4742 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4746 */ NdrFcShort( 0xc ), /* 12 */ +/* 4748 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4750 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4752 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4754 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4756 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4758 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4760 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4762 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4764 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 4766 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */ +/* 4768 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4770 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4772 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4774 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4776 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Size */ + +/* 4778 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4780 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4784 */ NdrFcShort( 0xd ), /* 13 */ +/* 4786 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4788 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4790 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4792 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4794 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4796 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4798 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4800 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4802 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 4804 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4806 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4808 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4810 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4812 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4814 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Blt */ + +/* 4816 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4818 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4822 */ NdrFcShort( 0xe ), /* 14 */ +/* 4824 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 4826 */ NdrFcShort( 0x28 ), /* 40 */ +/* 4828 */ NdrFcShort( 0x8 ), /* 8 */ +/* 4830 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 4832 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4834 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4836 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4838 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4840 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter prcSrc */ + +/* 4842 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4844 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4846 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Parameter pSrc */ + +/* 4848 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 4850 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4852 */ NdrFcShort( 0x21c ), /* Type Offset=540 */ + + /* Parameter pptDest */ + +/* 4854 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4856 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4858 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4860 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4862 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4864 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure HitTest */ + +/* 4866 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4868 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4872 */ NdrFcShort( 0xf ), /* 15 */ +/* 4874 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4876 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4878 */ NdrFcShort( 0xe ), /* 14 */ +/* 4880 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 4882 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4884 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4886 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4888 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4890 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppt */ + +/* 4892 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 4894 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4896 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter pbHit */ + +/* 4898 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 4900 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4902 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 4904 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4906 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4908 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ToClient */ + +/* 4910 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4912 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4916 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4918 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4920 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4922 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4924 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4926 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4928 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4930 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4932 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4934 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pt */ + +/* 4936 */ NdrFcShort( 0x11a ), /* Flags: must free, in, out, simple ref, */ +/* 4938 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4940 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4942 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4944 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4946 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure ToScreen */ + +/* 4948 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4950 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4954 */ NdrFcShort( 0x11 ), /* 17 */ +/* 4956 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 4958 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4960 */ NdrFcShort( 0x18 ), /* 24 */ +/* 4962 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 4964 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 4966 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4968 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4970 */ NdrFcShort( 0x0 ), /* 0 */ +/* 4972 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppt */ + +/* 4974 */ NdrFcShort( 0x11a ), /* Flags: must free, in, out, simple ref, */ +/* 4976 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 4978 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Return value */ + +/* 4980 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 4982 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 4984 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure OffsetOrg */ + +/* 4986 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 4988 */ NdrFcLong( 0x0 ), /* 0 */ +/* 4992 */ NdrFcShort( 0x12 ), /* 18 */ +/* 4994 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 4996 */ NdrFcShort( 0x10 ), /* 16 */ +/* 4998 */ NdrFcShort( 0xe ), /* 14 */ +/* 5000 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 5002 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5004 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5006 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5008 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5010 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter ppt */ + +/* 5012 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 5014 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5016 */ NdrFcShort( 0x84 ), /* Type Offset=132 */ + + /* Parameter pbVisible */ + +/* 5018 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 5020 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5022 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 5024 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5026 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5028 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetClipRect */ + +/* 5030 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5032 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5036 */ NdrFcShort( 0x13 ), /* 19 */ +/* 5038 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5040 */ NdrFcShort( 0x18 ), /* 24 */ +/* 5042 */ NdrFcShort( 0xe ), /* 14 */ +/* 5044 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 5046 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5048 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5050 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5052 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5054 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter prcClip */ + +/* 5056 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 5058 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5060 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Parameter pbVisible */ + +/* 5062 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 5064 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5066 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 5068 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5070 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5072 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Control */ + +/* 5074 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5076 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5080 */ NdrFcShort( 0x7 ), /* 7 */ +/* 5082 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5084 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5086 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5088 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5090 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 5092 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5094 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5096 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5098 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strName */ + +/* 5100 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 5102 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5104 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter pVal */ + +/* 5106 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 5108 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5110 */ NdrFcShort( 0x2aa ), /* Type Offset=682 */ + + /* Return value */ + +/* 5112 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5114 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5116 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure putref_Control */ + +/* 5118 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5120 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5124 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5126 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5128 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5130 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5132 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5134 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 5136 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5138 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5140 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5142 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strName */ + +/* 5144 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 5146 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5148 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter newVal */ + +/* 5150 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 5152 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5154 */ NdrFcShort( 0x2ae ), /* Type Offset=686 */ + + /* Return value */ + +/* 5156 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5158 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5160 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Title */ + +/* 5162 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5164 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5168 */ NdrFcShort( 0x9 ), /* 9 */ +/* 5170 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5172 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5174 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5176 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 5178 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 5180 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5182 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5184 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5186 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 5188 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +/* 5190 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5192 */ NdrFcShort( 0x11c ), /* Type Offset=284 */ + + /* Return value */ + +/* 5194 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5196 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5198 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Title */ + +/* 5200 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5202 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5206 */ NdrFcShort( 0xa ), /* 10 */ +/* 5208 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5210 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5212 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5214 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 5216 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 5218 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5220 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5222 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5224 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter newVal */ + +/* 5226 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 5228 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5230 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Return value */ + +/* 5232 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5234 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5236 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetIcon */ + +/* 5238 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5240 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5244 */ NdrFcShort( 0xc ), /* 12 */ +/* 5246 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 5248 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5250 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5252 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5254 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 5256 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5258 */ NdrFcShort( 0x20 ), /* 32 */ +/* 5260 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5262 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter icon */ + +/* 5264 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 5266 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5268 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter iconlibrary */ + +/* 5270 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 5272 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5274 */ NdrFcShort( 0x680 ), /* Type Offset=1664 */ + + /* Return value */ + +/* 5276 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5278 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 5280 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Activate */ + +/* 5282 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5284 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5288 */ NdrFcShort( 0xd ), /* 13 */ +/* 5290 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5292 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5294 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5296 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 5298 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5300 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5302 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5304 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5306 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + +/* 5308 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5310 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5312 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Deactivate */ + +/* 5314 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5316 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5320 */ NdrFcShort( 0xe ), /* 14 */ +/* 5322 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5324 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5326 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5328 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 5330 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5332 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5334 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5336 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5338 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + +/* 5340 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5342 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5344 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Position */ + +/* 5346 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5348 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5352 */ NdrFcShort( 0xf ), /* 15 */ +/* 5354 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5356 */ NdrFcShort( 0x18 ), /* 24 */ +/* 5358 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5360 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 5362 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5364 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5366 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5368 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5370 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 5372 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 5374 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5376 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Return value */ + +/* 5378 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5380 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5382 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Position */ + +/* 5384 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5386 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5390 */ NdrFcShort( 0x10 ), /* 16 */ +/* 5392 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5394 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5396 */ NdrFcShort( 0x20 ), /* 32 */ +/* 5398 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 5400 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5402 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5404 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5406 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5408 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 5410 */ NdrFcShort( 0x4112 ), /* Flags: must free, out, simple ref, srv alloc size=16 */ +/* 5412 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5414 */ NdrFcShort( 0x1b2 ), /* Type Offset=434 */ + + /* Return value */ + +/* 5416 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5418 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5420 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadControl */ + +/* 5422 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5424 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5428 */ NdrFcShort( 0x11 ), /* 17 */ +/* 5430 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 5432 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5434 */ NdrFcShort( 0x10 ), /* 16 */ +/* 5436 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x5, /* 5 */ +/* 5438 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5440 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5442 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5444 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5446 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pParent */ + +/* 5448 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 5450 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5452 */ NdrFcShort( 0x198 ), /* Type Offset=408 */ + + /* Parameter nID */ + +/* 5454 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 5456 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5458 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pXMLSource */ + +/* 5460 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 5462 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5464 */ NdrFcShort( 0x48a ), /* Type Offset=1162 */ + + /* Parameter pAssignedID */ + +/* 5466 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 5468 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5470 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 5472 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5474 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 5476 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadSchema */ + +/* 5478 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5480 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5484 */ NdrFcShort( 0x12 ), /* 18 */ +/* 5486 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5488 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5490 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5492 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 5494 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 5496 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5498 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5500 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5502 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strXMLSchema */ + +/* 5504 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 5506 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5508 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Return value */ + +/* 5510 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5512 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5514 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure put_Alpha */ + +/* 5516 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5518 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5522 */ NdrFcShort( 0x13 ), /* 19 */ +/* 5524 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5526 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5528 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5530 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 5532 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5534 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5536 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5538 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5540 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter Alpha */ + +/* 5542 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 5544 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5546 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 5548 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5550 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5552 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CreateView */ + +/* 5554 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5556 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5560 */ NdrFcShort( 0x3 ), /* 3 */ +/* 5562 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 5564 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5566 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5568 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x4, /* 4 */ +/* 5570 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 5572 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5574 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5576 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5578 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pParams */ + +/* 5580 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 5582 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5584 */ NdrFcShort( 0xc0 ), /* Type Offset=192 */ + + /* Parameter pLayer */ + +/* 5586 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 5588 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5590 */ NdrFcShort( 0x68a ), /* Type Offset=1674 */ + + /* Parameter ppView */ + +/* 5592 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 5594 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5596 */ NdrFcShort( 0x69c ), /* Type Offset=1692 */ + + /* Return value */ + +/* 5598 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5600 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5602 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadView */ + +/* 5604 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5606 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5610 */ NdrFcShort( 0x5 ), /* 5 */ +/* 5612 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5614 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5616 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5618 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5620 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 5622 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5624 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5626 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5628 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strXML */ + +/* 5630 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 5632 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5634 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Parameter ppView */ + +/* 5636 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 5638 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5640 */ NdrFcShort( 0x69c ), /* Type Offset=1692 */ + + /* Return value */ + +/* 5642 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5644 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5646 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure LoadViewObject */ + +/* 5648 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5650 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5654 */ NdrFcShort( 0x6 ), /* 6 */ +/* 5656 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5658 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5660 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5662 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5664 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5666 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5668 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5670 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5672 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pSchema */ + +/* 5674 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 5676 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5678 */ NdrFcShort( 0x48a ), /* Type Offset=1162 */ + + /* Parameter ppView */ + +/* 5680 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */ +/* 5682 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5684 */ NdrFcShort( 0x69c ), /* Type Offset=1692 */ + + /* Return value */ + +/* 5686 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5688 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5690 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Member */ + +/* 5692 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5694 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5698 */ NdrFcShort( 0x7 ), /* 7 */ +#ifndef _ALPHA_ +/* 5700 */ NdrFcShort( 0x38 ), /* ia64 Stack size/offset = 56 */ +#else + NdrFcShort( 0x30 ), /* axp64 Stack size/offset = 48 */ +#endif +/* 5702 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5704 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5706 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5708 */ 0xa, /* 10 */ + 0x7, /* Ext Flags: new corr desc, clt corr check, srv corr check, */ +/* 5710 */ NdrFcShort( 0x20 ), /* 32 */ +/* 5712 */ NdrFcShort( 0x20 ), /* 32 */ +/* 5714 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5716 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter vIndex */ + +/* 5718 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 5720 */ NdrFcShort( 0x10 ), /* ia64 Stack size/offset = 16 */ +#else + NdrFcShort( 0x8 ), /* axp64 Stack size/offset = 8 */ +#endif +/* 5722 */ NdrFcShort( 0x680 ), /* Type Offset=1664 */ + + /* Parameter pVal */ + +/* 5724 */ NdrFcShort( 0x6113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=24 */ +#ifndef _ALPHA_ +/* 5726 */ NdrFcShort( 0x28 ), /* ia64 Stack size/offset = 40 */ +#else + NdrFcShort( 0x20 ), /* axp64 Stack size/offset = 32 */ +#endif +/* 5728 */ NdrFcShort( 0x6ba ), /* Type Offset=1722 */ + + /* Return value */ + +/* 5730 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 5732 */ NdrFcShort( 0x30 ), /* ia64 Stack size/offset = 48 */ +#else + NdrFcShort( 0x28 ), /* axp64 Stack size/offset = 40 */ +#endif +/* 5734 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_MemberName */ + +/* 5736 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5738 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5742 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5744 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5746 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5748 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5750 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5752 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 5754 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5756 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5758 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5760 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter Index */ + +/* 5762 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 5764 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5766 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 5768 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +/* 5770 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5772 */ NdrFcShort( 0x11c ), /* Type Offset=284 */ + + /* Return value */ + +/* 5774 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5776 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5778 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Type */ + +/* 5780 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5782 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5786 */ NdrFcShort( 0x7 ), /* 7 */ +/* 5788 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5790 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5792 */ NdrFcShort( 0x10 ), /* 16 */ +/* 5794 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 5796 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5798 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5800 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5802 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5804 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 5806 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 5808 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5810 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 5812 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5814 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5816 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Data */ + +/* 5818 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5820 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5824 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5826 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5828 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5830 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5832 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x2, /* 2 */ +/* 5834 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 5836 */ NdrFcShort( 0x20 ), /* 32 */ +/* 5838 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5840 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5842 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 5844 */ NdrFcShort( 0x6113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=24 */ +/* 5846 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5848 */ NdrFcShort( 0x6ba ), /* Type Offset=1722 */ + + /* Return value */ + +/* 5850 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5852 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5854 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Member */ + +/* 5856 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5858 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5862 */ NdrFcShort( 0x9 ), /* 9 */ +#ifndef _ALPHA_ +/* 5864 */ NdrFcShort( 0x38 ), /* ia64 Stack size/offset = 56 */ +#else + NdrFcShort( 0x30 ), /* axp64 Stack size/offset = 48 */ +#endif +/* 5866 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5868 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5870 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5872 */ 0xa, /* 10 */ + 0x7, /* Ext Flags: new corr desc, clt corr check, srv corr check, */ +/* 5874 */ NdrFcShort( 0x20 ), /* 32 */ +/* 5876 */ NdrFcShort( 0x20 ), /* 32 */ +/* 5878 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5880 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter vElement */ + +/* 5882 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +#ifndef _ALPHA_ +/* 5884 */ NdrFcShort( 0x10 ), /* ia64 Stack size/offset = 16 */ +#else + NdrFcShort( 0x8 ), /* axp64 Stack size/offset = 8 */ +#endif +/* 5886 */ NdrFcShort( 0x680 ), /* Type Offset=1664 */ + + /* Parameter pVal */ + +/* 5888 */ NdrFcShort( 0x6113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=24 */ +#ifndef _ALPHA_ +/* 5890 */ NdrFcShort( 0x28 ), /* ia64 Stack size/offset = 40 */ +#else + NdrFcShort( 0x20 ), /* axp64 Stack size/offset = 32 */ +#endif +/* 5892 */ NdrFcShort( 0x6ba ), /* Type Offset=1722 */ + + /* Return value */ + +/* 5894 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +#ifndef _ALPHA_ +/* 5896 */ NdrFcShort( 0x30 ), /* ia64 Stack size/offset = 48 */ +#else + NdrFcShort( 0x28 ), /* axp64 Stack size/offset = 40 */ +#endif +/* 5898 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_MemberName */ + +/* 5900 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5902 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5906 */ NdrFcShort( 0xa ), /* 10 */ +/* 5908 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 5910 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5912 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5914 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */ + 0x3, /* 3 */ +/* 5916 */ 0xa, /* 10 */ + 0x3, /* Ext Flags: new corr desc, clt corr check, */ +/* 5918 */ NdrFcShort( 0x1 ), /* 1 */ +/* 5920 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5922 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5924 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter Index */ + +/* 5926 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 5928 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5930 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pVal */ + +/* 5932 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */ +/* 5934 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5936 */ NdrFcShort( 0x11c ), /* Type Offset=284 */ + + /* Return value */ + +/* 5938 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5940 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5942 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Count */ + +/* 5944 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5946 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5950 */ NdrFcShort( 0xb ), /* 11 */ +/* 5952 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5954 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5956 */ NdrFcShort( 0x10 ), /* 16 */ +/* 5958 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 5960 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 5962 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5964 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5966 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5968 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 5970 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 5972 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 5974 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 5976 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 5978 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 5980 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Dispatch */ + +/* 5982 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 5984 */ NdrFcLong( 0x0 ), /* 0 */ +/* 5988 */ NdrFcShort( 0x7 ), /* 7 */ +/* 5990 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 5992 */ NdrFcShort( 0x0 ), /* 0 */ +/* 5994 */ NdrFcShort( 0x8 ), /* 8 */ +/* 5996 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 5998 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6000 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6002 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6004 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6006 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter Message */ + +/* 6008 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */ +/* 6010 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6012 */ NdrFcShort( 0x6c4 ), /* Type Offset=1732 */ + + /* Return value */ + +/* 6014 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6016 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6018 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure KeyboardChar */ + +/* 6020 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6022 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6026 */ NdrFcShort( 0x3 ), /* 3 */ +/* 6028 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6030 */ NdrFcShort( 0xe ), /* 14 */ +/* 6032 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6034 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 6036 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6038 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6040 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6042 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6044 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pKS */ + +/* 6046 */ NdrFcShort( 0x10a ), /* Flags: must free, in, simple ref, */ +/* 6048 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6050 */ NdrFcShort( 0x6da ), /* Type Offset=1754 */ + + /* Return value */ + +/* 6052 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6054 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6056 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure KeyboardEndCapture */ + +/* 6058 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6060 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6064 */ NdrFcShort( 0x4 ), /* 4 */ +/* 6066 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6068 */ NdrFcShort( 0x6 ), /* 6 */ +/* 6070 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6072 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 6074 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6076 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6078 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6080 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6082 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter bCancel */ + +/* 6084 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6086 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6088 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6090 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6092 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6094 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure KeyboardEvent */ + +/* 6096 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6098 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6102 */ NdrFcShort( 0x5 ), /* 5 */ +/* 6104 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 6106 */ NdrFcShort( 0x18 ), /* 24 */ +/* 6108 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6110 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x4, /* 4 */ +/* 6112 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6114 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6116 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6118 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6120 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nMsg */ + +/* 6122 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6124 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6126 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter wParam */ + +/* 6128 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6130 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6132 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter lParam */ + +/* 6134 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6136 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6138 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6140 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6142 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 6144 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure PopupCancel */ + +/* 6146 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6148 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6152 */ NdrFcShort( 0x3 ), /* 3 */ +/* 6154 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 6156 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6158 */ NdrFcShort( 0xe ), /* 14 */ +/* 6160 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 6162 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6164 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6166 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6168 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6170 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pMouse */ + +/* 6172 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */ +/* 6174 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6176 */ NdrFcShort( 0x236 ), /* Type Offset=566 */ + + /* Parameter pbContinue */ + +/* 6178 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 6180 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6182 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6184 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6186 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6188 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure TimerTimeout */ + +/* 6190 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6192 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6196 */ NdrFcShort( 0x3 ), /* 3 */ +/* 6198 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 6200 */ NdrFcShort( 0x18 ), /* 24 */ +/* 6202 */ NdrFcShort( 0xe ), /* 14 */ +/* 6204 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x5, /* 5 */ +/* 6206 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6208 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6210 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6212 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6214 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nID */ + +/* 6216 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6218 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6220 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nInterval */ + +/* 6222 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6224 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6226 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nReps */ + +/* 6228 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6230 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6232 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pbContinue */ + +/* 6234 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 6236 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 6238 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6240 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6242 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 6244 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure WindowMessage */ + +/* 6246 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6248 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6252 */ NdrFcShort( 0x3 ), /* 3 */ +/* 6254 */ NdrFcShort( 0x38 ), /* ia64, axp64 Stack size/offset = 56 */ +/* 6256 */ NdrFcShort( 0x1e ), /* 30 */ +/* 6258 */ NdrFcShort( 0xe ), /* 14 */ +/* 6260 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x6, /* 6 */ +/* 6262 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6264 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6266 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6268 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6270 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter hWnd */ + +/* 6272 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6274 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6276 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter uMsg */ + +/* 6278 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6280 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6282 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Parameter wParam */ + +/* 6284 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6286 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6288 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter lParam */ + +/* 6290 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6292 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 6294 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter pbEat */ + +/* 6296 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 6298 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 6300 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6302 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6304 */ NdrFcShort( 0x30 ), /* ia64, axp64 Stack size/offset = 48 */ +/* 6306 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure NotifyBegin */ + + + /* Procedure Clear */ + +/* 6308 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6310 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6314 */ NdrFcShort( 0x7 ), /* 7 */ +/* 6316 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6318 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6320 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6322 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 6324 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6326 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6328 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6330 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6332 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + + + /* Return value */ + +/* 6334 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6336 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6338 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure TypeText */ + +/* 6340 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6342 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6346 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6348 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6350 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6352 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6354 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x2, /* 2 */ +/* 6356 */ 0xa, /* 10 */ + 0x5, /* Ext Flags: new corr desc, srv corr check, */ +/* 6358 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6360 */ NdrFcShort( 0x1 ), /* 1 */ +/* 6362 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6364 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter strText */ + +/* 6366 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 6368 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6370 */ NdrFcShort( 0x60 ), /* Type Offset=96 */ + + /* Return value */ + +/* 6372 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6374 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6376 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Delay */ + +/* 6378 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6380 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6384 */ NdrFcShort( 0x9 ), /* 9 */ +/* 6386 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 6388 */ NdrFcShort( 0xe ), /* 14 */ +/* 6390 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6392 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 6394 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6396 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6398 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6400 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6402 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nMilliseconds */ + +/* 6404 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6406 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6408 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter bAllowInput */ + +/* 6410 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6412 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6414 */ 0x6, /* FC_SHORT */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6416 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6418 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6420 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure MouseClick */ + +/* 6422 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6424 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6428 */ NdrFcShort( 0xa ), /* 10 */ +/* 6430 */ NdrFcShort( 0x28 ), /* ia64, axp64 Stack size/offset = 40 */ +/* 6432 */ NdrFcShort( 0x16 ), /* 22 */ +/* 6434 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6436 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x4, /* 4 */ +/* 6438 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6440 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6442 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6444 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6446 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nX */ + +/* 6448 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6450 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6452 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nY */ + +/* 6454 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6456 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6458 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter eAction */ + +/* 6460 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6462 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6464 */ 0xd, /* FC_ENUM16 */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6466 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6468 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 6470 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure get_Status */ + +/* 6472 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6474 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6478 */ NdrFcShort( 0xb ), /* 11 */ +/* 6480 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6482 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6484 */ NdrFcShort( 0xe ), /* 14 */ +/* 6486 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 6488 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6490 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6492 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6494 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6496 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter pVal */ + +/* 6498 */ NdrFcShort( 0x2010 ), /* Flags: out, srv alloc size=8 */ +/* 6500 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6502 */ NdrFcShort( 0x6e2 ), /* Type Offset=1762 */ + + /* Return value */ + +/* 6504 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6506 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6508 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure Run */ + +/* 6510 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6512 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6516 */ NdrFcShort( 0xc ), /* 12 */ +/* 6518 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6520 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6522 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6524 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 6526 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6528 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6530 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6532 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6534 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + +/* 6536 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6538 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6540 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure SetMousePos */ + +/* 6542 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6544 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6548 */ NdrFcShort( 0x9 ), /* 9 */ +/* 6550 */ NdrFcShort( 0x20 ), /* ia64, axp64 Stack size/offset = 32 */ +/* 6552 */ NdrFcShort( 0x10 ), /* 16 */ +/* 6554 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6556 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x3, /* 3 */ +/* 6558 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6560 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6562 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6564 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6566 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter nX */ + +/* 6568 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6570 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6572 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Parameter nY */ + +/* 6574 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */ +/* 6576 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6578 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 6580 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6582 */ NdrFcShort( 0x18 ), /* ia64, axp64 Stack size/offset = 24 */ +/* 6584 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure NotifyPause */ + +/* 6586 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 6588 */ NdrFcLong( 0x0 ), /* 0 */ +/* 6592 */ NdrFcShort( 0xa ), /* 10 */ +/* 6594 */ NdrFcShort( 0x10 ), /* ia64, axp64 Stack size/offset = 16 */ +/* 6596 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6598 */ NdrFcShort( 0x8 ), /* 8 */ +/* 6600 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x1, /* 1 */ +/* 6602 */ 0xa, /* 10 */ + 0x1, /* Ext Flags: new corr desc, */ +/* 6604 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6606 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6608 */ NdrFcShort( 0x0 ), /* 0 */ +/* 6610 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Return value */ + +/* 6612 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 6614 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 6616 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + 0x0 + } + }; + +static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString = + { + 0, + { + NdrFcShort( 0x0 ), /* 0 */ +/* 2 */ + 0x11, 0x0, /* FC_RP */ +/* 4 */ NdrFcShort( 0x8 ), /* Offset= 8 (12) */ +/* 6 */ + 0x1d, /* FC_SMFARRAY */ + 0x0, /* 0 */ +/* 8 */ NdrFcShort( 0x8 ), /* 8 */ +/* 10 */ 0x1, /* FC_BYTE */ + 0x5b, /* FC_END */ +/* 12 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 14 */ NdrFcShort( 0x10 ), /* 16 */ +/* 16 */ 0x8, /* FC_LONG */ + 0x6, /* FC_SHORT */ +/* 18 */ 0x6, /* FC_SHORT */ + 0x4c, /* FC_EMBEDDED_COMPLEX */ +/* 20 */ 0x0, /* 0 */ + NdrFcShort( 0xfffffff1 ), /* Offset= -15 (6) */ + 0x5b, /* FC_END */ +/* 24 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 26 */ NdrFcShort( 0x2 ), /* Offset= 2 (28) */ +/* 28 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 30 */ 0x2b, /* Corr desc: parameter, FC_HYPER */ + 0x0, /* */ +/* 32 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 34 */ NdrFcShort( 0x5 ), /* Corr flags: early, iid_is, */ +/* 36 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 38 */ NdrFcShort( 0x2 ), /* Offset= 2 (40) */ +/* 40 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 42 */ NdrFcLong( 0x9241862d ), /* -1841199571 */ +/* 46 */ NdrFcShort( 0xba71 ), /* -17807 */ +/* 48 */ NdrFcShort( 0x4317 ), /* 17175 */ +/* 50 */ 0x81, /* 129 */ + 0x66, /* 102 */ +/* 52 */ 0x3a, /* 58 */ + 0x3e, /* 62 */ +/* 54 */ 0x61, /* 97 */ + 0xce, /* 206 */ +/* 56 */ 0x3e, /* 62 */ + 0x5f, /* 95 */ +/* 58 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 60 */ NdrFcShort( 0x2 ), /* Offset= 2 (62) */ +/* 62 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 64 */ 0x2b, /* Corr desc: parameter, FC_HYPER */ + 0x0, /* */ +/* 66 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 68 */ NdrFcShort( 0x5 ), /* Corr flags: early, iid_is, */ +/* 70 */ + 0x12, 0x0, /* FC_UP */ +/* 72 */ NdrFcShort( 0xe ), /* Offset= 14 (86) */ +/* 74 */ + 0x1b, /* FC_CARRAY */ + 0x1, /* 1 */ +/* 76 */ NdrFcShort( 0x2 ), /* 2 */ +/* 78 */ 0x9, /* Corr desc: FC_ULONG */ + 0x0, /* */ +/* 80 */ NdrFcShort( 0xfffc ), /* -4 */ +/* 82 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 84 */ 0x6, /* FC_SHORT */ + 0x5b, /* FC_END */ +/* 86 */ + 0x17, /* FC_CSTRUCT */ + 0x3, /* 3 */ +/* 88 */ NdrFcShort( 0x8 ), /* 8 */ +/* 90 */ NdrFcShort( 0xfffffff0 ), /* Offset= -16 (74) */ +/* 92 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 94 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 96 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 98 */ NdrFcShort( 0x0 ), /* 0 */ +/* 100 */ NdrFcShort( 0x8 ), /* 8 */ +/* 102 */ NdrFcShort( 0x0 ), /* 0 */ +/* 104 */ NdrFcShort( 0xffffffde ), /* Offset= -34 (70) */ +/* 106 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 108 */ NdrFcShort( 0x2 ), /* Offset= 2 (110) */ +/* 110 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 112 */ NdrFcLong( 0xbe566cec ), /* -1101632276 */ +/* 116 */ NdrFcShort( 0x6881 ), /* 26753 */ +/* 118 */ NdrFcShort( 0x481c ), /* 18460 */ +/* 120 */ 0xa1, /* 161 */ + 0x46, /* 70 */ +/* 122 */ 0x9f, /* 159 */ + 0x5a, /* 90 */ +/* 124 */ 0x32, /* 50 */ + 0x57, /* 87 */ +/* 126 */ 0x6b, /* 107 */ + 0xe6, /* 230 */ +/* 128 */ + 0x11, 0x0, /* FC_RP */ +/* 130 */ NdrFcShort( 0x2 ), /* Offset= 2 (132) */ +/* 132 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 134 */ NdrFcShort( 0x8 ), /* 8 */ +/* 136 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 138 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 140 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 142 */ NdrFcShort( 0x2 ), /* Offset= 2 (144) */ +/* 144 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 146 */ NdrFcLong( 0xdedcd5aa ), /* -555952726 */ +/* 150 */ NdrFcShort( 0xf6ca ), /* -2358 */ +/* 152 */ NdrFcShort( 0x4da5 ), /* 19877 */ +/* 154 */ 0xa6, /* 166 */ + 0x57, /* 87 */ +/* 156 */ 0xe8, /* 232 */ + 0x2f, /* 47 */ +/* 158 */ 0x12, /* 18 */ + 0x6a, /* 106 */ +/* 160 */ 0xbb, /* 187 */ + 0xcd, /* 205 */ +/* 162 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 164 */ NdrFcShort( 0xffffffca ), /* Offset= -54 (110) */ +/* 166 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 168 */ NdrFcShort( 0x2 ), /* Offset= 2 (170) */ +/* 170 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 172 */ NdrFcLong( 0x12eccb0f ), /* 317508367 */ +/* 176 */ NdrFcShort( 0x36a6 ), /* 13990 */ +/* 178 */ NdrFcShort( 0x451c ), /* 17692 */ +/* 180 */ 0xb0, /* 176 */ + 0x86, /* 134 */ +/* 182 */ 0x13, /* 19 */ + 0x6, /* 6 */ +/* 184 */ 0xb7, /* 183 */ + 0x4a, /* 74 */ +/* 186 */ 0xae, /* 174 */ + 0xc2, /* 194 */ +/* 188 */ + 0x11, 0x0, /* FC_RP */ +/* 190 */ NdrFcShort( 0x2 ), /* Offset= 2 (192) */ +/* 192 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 194 */ NdrFcShort( 0x28 ), /* 40 */ +/* 196 */ NdrFcShort( 0x0 ), /* 0 */ +/* 198 */ NdrFcShort( 0x0 ), /* Offset= 0 (198) */ +/* 200 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 202 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 204 */ NdrFcShort( 0xffffff94 ), /* Offset= -108 (96) */ +/* 206 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 208 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 210 */ 0x8, /* FC_LONG */ + 0x40, /* FC_STRUCTPAD4 */ +/* 212 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 214 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 216 */ NdrFcLong( 0xd63504f ), /* 224612431 */ +/* 220 */ NdrFcShort( 0xdeef ), /* -8465 */ +/* 222 */ NdrFcShort( 0x4a2d ), /* 18989 */ +/* 224 */ 0x97, /* 151 */ + 0x42, /* 66 */ +/* 226 */ 0x28, /* 40 */ + 0xdd, /* 221 */ +/* 228 */ 0x1b, /* 27 */ + 0xad, /* 173 */ +/* 230 */ 0xda, /* 218 */ + 0x7c, /* 124 */ +/* 232 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 234 */ NdrFcShort( 0x2 ), /* Offset= 2 (236) */ +/* 236 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 238 */ NdrFcLong( 0xa2ae18b7 ), /* -1565648713 */ +/* 242 */ NdrFcShort( 0x85c9 ), /* -31287 */ +/* 244 */ NdrFcShort( 0x451c ), /* 17692 */ +/* 246 */ 0x8c, /* 140 */ + 0xc3, /* 195 */ +/* 248 */ 0xd0, /* 208 */ + 0xff, /* 255 */ +/* 250 */ 0xe6, /* 230 */ + 0xb8, /* 184 */ +/* 252 */ 0x6e, /* 110 */ + 0xeb, /* 235 */ +/* 254 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 256 */ NdrFcLong( 0x0 ), /* 0 */ +/* 260 */ NdrFcShort( 0x0 ), /* 0 */ +/* 262 */ NdrFcShort( 0x0 ), /* 0 */ +/* 264 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 266 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 268 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 270 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 272 */ + 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */ +/* 274 */ 0x8, /* FC_LONG */ + 0x5c, /* FC_PAD */ +/* 276 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 278 */ NdrFcShort( 0x6 ), /* Offset= 6 (284) */ +/* 280 */ + 0x13, 0x0, /* FC_OP */ +/* 282 */ NdrFcShort( 0xffffff3c ), /* Offset= -196 (86) */ +/* 284 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 286 */ NdrFcShort( 0x0 ), /* 0 */ +/* 288 */ NdrFcShort( 0x8 ), /* 8 */ +/* 290 */ NdrFcShort( 0x0 ), /* 0 */ +/* 292 */ NdrFcShort( 0xfffffff4 ), /* Offset= -12 (280) */ +/* 294 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 296 */ NdrFcShort( 0x2 ), /* Offset= 2 (298) */ +/* 298 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 300 */ NdrFcLong( 0xba3e677f ), /* -1170315393 */ +/* 304 */ NdrFcShort( 0x8e44 ), /* -29116 */ +/* 306 */ NdrFcShort( 0x4829 ), /* 18473 */ +/* 308 */ 0x98, /* 152 */ + 0x2e, /* 46 */ +/* 310 */ 0x58, /* 88 */ + 0xbb, /* 187 */ +/* 312 */ 0xbc, /* 188 */ + 0x5c, /* 92 */ +/* 314 */ 0x5f, /* 95 */ + 0x9b, /* 155 */ +/* 316 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 318 */ NdrFcShort( 0x2 ), /* Offset= 2 (320) */ +/* 320 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 322 */ NdrFcLong( 0xeeb0be9e ), /* -290406754 */ +/* 326 */ NdrFcShort( 0x46bd ), /* 18109 */ +/* 328 */ NdrFcShort( 0x493f ), /* 18751 */ +/* 330 */ 0x97, /* 151 */ + 0xe2, /* 226 */ +/* 332 */ 0x33, /* 51 */ + 0x6, /* 6 */ +/* 334 */ 0x70, /* 112 */ + 0xc0, /* 192 */ +/* 336 */ 0x9f, /* 159 */ + 0x59, /* 89 */ +/* 338 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 340 */ NdrFcShort( 0x2 ), /* Offset= 2 (342) */ +/* 342 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 344 */ NdrFcLong( 0x634d74b8 ), /* 1666020536 */ +/* 348 */ NdrFcShort( 0xafed ), /* -20499 */ +/* 350 */ NdrFcShort( 0x4710 ), /* 18192 */ +/* 352 */ 0x82, /* 130 */ + 0xc9, /* 201 */ +/* 354 */ 0xb5, /* 181 */ + 0x30, /* 48 */ +/* 356 */ 0x32, /* 50 */ + 0x6e, /* 110 */ +/* 358 */ 0x1a, /* 26 */ + 0xfa, /* 250 */ +/* 360 */ + 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */ +/* 362 */ 0x6, /* FC_SHORT */ + 0x5c, /* FC_PAD */ +/* 364 */ + 0x11, 0x8, /* FC_RP [simple_pointer] */ +/* 366 */ 0x8, /* FC_LONG */ + 0x5c, /* FC_PAD */ +/* 368 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 370 */ NdrFcLong( 0x702d3901 ), /* 1882011905 */ +/* 374 */ NdrFcShort( 0xc13a ), /* -16070 */ +/* 376 */ NdrFcShort( 0x448e ), /* 17550 */ +/* 378 */ 0x88, /* 136 */ + 0x71, /* 113 */ +/* 380 */ 0xec, /* 236 */ + 0xdc, /* 220 */ +/* 382 */ 0x8b, /* 139 */ + 0xc8, /* 200 */ +/* 384 */ 0xd0, /* 208 */ + 0x79, /* 121 */ +/* 386 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 388 */ NdrFcShort( 0x2 ), /* Offset= 2 (390) */ +/* 390 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 392 */ NdrFcLong( 0x996b377c ), /* -1721026692 */ +/* 396 */ NdrFcShort( 0x1953 ), /* 6483 */ +/* 398 */ NdrFcShort( 0x4db1 ), /* 19889 */ +/* 400 */ 0xaa, /* 170 */ + 0xc1, /* 193 */ +/* 402 */ 0x15, /* 21 */ + 0x7f, /* 127 */ +/* 404 */ 0x72, /* 114 */ + 0x59, /* 89 */ +/* 406 */ 0x2d, /* 45 */ + 0x3e, /* 62 */ +/* 408 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 410 */ NdrFcLong( 0x5b7e9d99 ), /* 1535024537 */ +/* 414 */ NdrFcShort( 0xbb3a ), /* -17606 */ +/* 416 */ NdrFcShort( 0x475d ), /* 18269 */ +/* 418 */ 0x84, /* 132 */ + 0x2d, /* 45 */ +/* 420 */ 0x43, /* 67 */ + 0xeb, /* 235 */ +/* 422 */ 0xea, /* 234 */ + 0x82, /* 130 */ +/* 424 */ 0x84, /* 132 */ + 0xea, /* 234 */ +/* 426 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 428 */ NdrFcShort( 0x2 ), /* Offset= 2 (430) */ +/* 430 */ + 0x13, 0x0, /* FC_OP */ +/* 432 */ NdrFcShort( 0x2 ), /* Offset= 2 (434) */ +/* 434 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 436 */ NdrFcShort( 0x10 ), /* 16 */ +/* 438 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 440 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 442 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 444 */ + 0x11, 0x0, /* FC_RP */ +/* 446 */ NdrFcShort( 0xfffffff4 ), /* Offset= -12 (434) */ +/* 448 */ + 0x11, 0x0, /* FC_RP */ +/* 450 */ NdrFcShort( 0x2 ), /* Offset= 2 (452) */ +/* 452 */ + 0x15, /* FC_STRUCT */ + 0x3, /* 3 */ +/* 454 */ NdrFcShort( 0x18 ), /* 24 */ +/* 456 */ 0x8, /* FC_LONG */ + 0x4c, /* FC_EMBEDDED_COMPLEX */ +/* 458 */ 0x0, /* 0 */ + NdrFcShort( 0xffffffe7 ), /* Offset= -25 (434) */ + 0x8, /* FC_LONG */ +/* 462 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 464 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 466 */ NdrFcShort( 0x2 ), /* Offset= 2 (468) */ +/* 468 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 470 */ 0x2b, /* Corr desc: parameter, FC_HYPER */ + 0x0, /* */ +/* 472 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 474 */ NdrFcShort( 0x5 ), /* Corr flags: early, iid_is, */ +/* 476 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 478 */ NdrFcShort( 0x2 ), /* Offset= 2 (480) */ +/* 480 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 482 */ NdrFcLong( 0x702d3901 ), /* 1882011905 */ +/* 486 */ NdrFcShort( 0xc13a ), /* -16070 */ +/* 488 */ NdrFcShort( 0x448e ), /* 17550 */ +/* 490 */ 0x88, /* 136 */ + 0x71, /* 113 */ +/* 492 */ 0xec, /* 236 */ + 0xdc, /* 220 */ +/* 494 */ 0x8b, /* 139 */ + 0xc8, /* 200 */ +/* 496 */ 0xd0, /* 208 */ + 0x79, /* 121 */ +/* 498 */ + 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */ +/* 500 */ NdrFcShort( 0x2 ), /* Offset= 2 (502) */ +/* 502 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 504 */ 0x2b, /* Corr desc: parameter, FC_HYPER */ + 0x0, /* */ +/* 506 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 508 */ NdrFcShort( 0x5 ), /* Corr flags: early, iid_is, */ +/* 510 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 512 */ NdrFcShort( 0xffffffb2 ), /* Offset= -78 (434) */ +/* 514 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 516 */ NdrFcShort( 0x2 ), /* Offset= 2 (518) */ +/* 518 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 520 */ NdrFcLong( 0x5b7e9d99 ), /* 1535024537 */ +/* 524 */ NdrFcShort( 0xbb3a ), /* -17606 */ +/* 526 */ NdrFcShort( 0x475d ), /* 18269 */ +/* 528 */ 0x84, /* 132 */ + 0x2d, /* 45 */ +/* 530 */ 0x43, /* 67 */ + 0xeb, /* 235 */ +/* 532 */ 0xea, /* 234 */ + 0x82, /* 130 */ +/* 534 */ 0x84, /* 132 */ + 0xea, /* 234 */ +/* 536 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 538 */ NdrFcShort( 0xfffffea6 ), /* Offset= -346 (192) */ +/* 540 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 542 */ NdrFcLong( 0x9241862d ), /* -1841199571 */ +/* 546 */ NdrFcShort( 0xba71 ), /* -17807 */ +/* 548 */ NdrFcShort( 0x4317 ), /* 17175 */ +/* 550 */ 0x81, /* 129 */ + 0x66, /* 102 */ +/* 552 */ 0x3a, /* 58 */ + 0x3e, /* 62 */ +/* 554 */ 0x61, /* 97 */ + 0xce, /* 206 */ +/* 556 */ 0x3e, /* 62 */ + 0x5f, /* 95 */ +/* 558 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 560 */ NdrFcShort( 0xfffffe54 ), /* Offset= -428 (132) */ +/* 562 */ + 0x11, 0x0, /* FC_RP */ +/* 564 */ NdrFcShort( 0x2 ), /* Offset= 2 (566) */ +/* 566 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 568 */ NdrFcShort( 0x20 ), /* 32 */ +/* 570 */ NdrFcShort( 0x0 ), /* 0 */ +/* 572 */ NdrFcShort( 0x12 ), /* Offset= 18 (590) */ +/* 574 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 576 */ NdrFcShort( 0xfffffe96 ), /* Offset= -362 (214) */ +/* 578 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 580 */ NdrFcShort( 0xfffffe40 ), /* Offset= -448 (132) */ +/* 582 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 584 */ NdrFcShort( 0xfffffe3c ), /* Offset= -452 (132) */ +/* 586 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 588 */ 0x40, /* FC_STRUCTPAD4 */ + 0x5b, /* FC_END */ +/* 590 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 592 */ NdrFcLong( 0x85d70924 ), /* -2049504988 */ +/* 596 */ NdrFcShort( 0x917d ), /* -28291 */ +/* 598 */ NdrFcShort( 0x41bb ), /* 16827 */ +/* 600 */ 0x99, /* 153 */ + 0x5d, /* 93 */ +/* 602 */ 0xc4, /* 196 */ + 0xe, /* 14 */ +/* 604 */ 0x6a, /* 106 */ + 0xb2, /* 178 */ +/* 606 */ 0x1c, /* 28 */ + 0x71, /* 113 */ +/* 608 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 610 */ NdrFcShort( 0x1a ), /* Offset= 26 (636) */ +/* 612 */ + 0x13, 0x0, /* FC_OP */ +/* 614 */ NdrFcShort( 0x2 ), /* Offset= 2 (616) */ +/* 616 */ + 0x2a, /* FC_ENCAPSULATED_UNION */ + 0x48, /* 72 */ +/* 618 */ NdrFcShort( 0x4 ), /* 4 */ +/* 620 */ NdrFcShort( 0x2 ), /* 2 */ +/* 622 */ NdrFcLong( 0x48746457 ), /* 1215587415 */ +/* 626 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 628 */ NdrFcLong( 0x52746457 ), /* 1383359575 */ +/* 632 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 634 */ NdrFcShort( 0xffffffff ), /* Offset= -1 (633) */ +/* 636 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 638 */ NdrFcShort( 0x1 ), /* 1 */ +/* 640 */ NdrFcShort( 0x8 ), /* 8 */ +/* 642 */ NdrFcShort( 0x0 ), /* 0 */ +/* 644 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (612) */ +/* 646 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 648 */ NdrFcShort( 0x2 ), /* Offset= 2 (650) */ +/* 650 */ + 0x2f, /* FC_IP */ + 0x5c, /* FC_PAD */ +/* 652 */ 0x2b, /* Corr desc: parameter, FC_HYPER */ + 0x0, /* */ +/* 654 */ NdrFcShort( 0x8 ), /* ia64, axp64 Stack size/offset = 8 */ +/* 656 */ NdrFcShort( 0x5 ), /* Corr flags: early, iid_is, */ +/* 658 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 660 */ NdrFcShort( 0x2 ), /* Offset= 2 (662) */ +/* 662 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 664 */ NdrFcShort( 0x1c ), /* 28 */ +/* 666 */ NdrFcShort( 0x0 ), /* 0 */ +/* 668 */ NdrFcShort( 0x0 ), /* Offset= 0 (668) */ +/* 670 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 672 */ NdrFcShort( 0xffffff12 ), /* Offset= -238 (434) */ +/* 674 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 676 */ NdrFcShort( 0xfffffde0 ), /* Offset= -544 (132) */ +/* 678 */ 0x6, /* FC_SHORT */ + 0x3e, /* FC_STRUCTPAD2 */ +/* 680 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 682 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 684 */ NdrFcShort( 0x2 ), /* Offset= 2 (686) */ +/* 686 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 688 */ NdrFcLong( 0x996b377c ), /* -1721026692 */ +/* 692 */ NdrFcShort( 0x1953 ), /* 6483 */ +/* 694 */ NdrFcShort( 0x4db1 ), /* 19889 */ +/* 696 */ 0xaa, /* 170 */ + 0xc1, /* 193 */ +/* 698 */ 0x15, /* 21 */ + 0x7f, /* 127 */ +/* 700 */ 0x72, /* 114 */ + 0x59, /* 89 */ +/* 702 */ 0x2d, /* 45 */ + 0x3e, /* 62 */ +/* 704 */ + 0x12, 0x0, /* FC_UP */ +/* 706 */ NdrFcShort( 0x3aa ), /* Offset= 938 (1644) */ +/* 708 */ + 0x2b, /* FC_NON_ENCAPSULATED_UNION */ + 0x9, /* FC_ULONG */ +/* 710 */ 0x7, /* Corr desc: FC_USHORT */ + 0x0, /* */ +/* 712 */ NdrFcShort( 0xfff8 ), /* -8 */ +/* 714 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 716 */ NdrFcShort( 0x2 ), /* Offset= 2 (718) */ +/* 718 */ NdrFcShort( 0x10 ), /* 16 */ +/* 720 */ NdrFcShort( 0x2f ), /* 47 */ +/* 722 */ NdrFcLong( 0x14 ), /* 20 */ +/* 726 */ NdrFcShort( 0x800b ), /* Simple arm type: FC_HYPER */ +/* 728 */ NdrFcLong( 0x3 ), /* 3 */ +/* 732 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 734 */ NdrFcLong( 0x11 ), /* 17 */ +/* 738 */ NdrFcShort( 0x8001 ), /* Simple arm type: FC_BYTE */ +/* 740 */ NdrFcLong( 0x2 ), /* 2 */ +/* 744 */ NdrFcShort( 0x8006 ), /* Simple arm type: FC_SHORT */ +/* 746 */ NdrFcLong( 0x4 ), /* 4 */ +/* 750 */ NdrFcShort( 0x800a ), /* Simple arm type: FC_FLOAT */ +/* 752 */ NdrFcLong( 0x5 ), /* 5 */ +/* 756 */ NdrFcShort( 0x800c ), /* Simple arm type: FC_DOUBLE */ +/* 758 */ NdrFcLong( 0xb ), /* 11 */ +/* 762 */ NdrFcShort( 0x8006 ), /* Simple arm type: FC_SHORT */ +/* 764 */ NdrFcLong( 0xa ), /* 10 */ +/* 768 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 770 */ NdrFcLong( 0x6 ), /* 6 */ +/* 774 */ NdrFcShort( 0xe8 ), /* Offset= 232 (1006) */ +/* 776 */ NdrFcLong( 0x7 ), /* 7 */ +/* 780 */ NdrFcShort( 0x800c ), /* Simple arm type: FC_DOUBLE */ +/* 782 */ NdrFcLong( 0x8 ), /* 8 */ +/* 786 */ NdrFcShort( 0xfffffd34 ), /* Offset= -716 (70) */ +/* 788 */ NdrFcLong( 0xd ), /* 13 */ +/* 792 */ NdrFcShort( 0xdc ), /* Offset= 220 (1012) */ +/* 794 */ NdrFcLong( 0x9 ), /* 9 */ +/* 798 */ NdrFcShort( 0xe8 ), /* Offset= 232 (1030) */ +/* 800 */ NdrFcLong( 0x2000 ), /* 8192 */ +/* 804 */ NdrFcShort( 0xf4 ), /* Offset= 244 (1048) */ +/* 806 */ NdrFcLong( 0x24 ), /* 36 */ +/* 810 */ NdrFcShort( 0x2f6 ), /* Offset= 758 (1568) */ +/* 812 */ NdrFcLong( 0x4024 ), /* 16420 */ +/* 816 */ NdrFcShort( 0x2f0 ), /* Offset= 752 (1568) */ +/* 818 */ NdrFcLong( 0x4011 ), /* 16401 */ +/* 822 */ NdrFcShort( 0x2ee ), /* Offset= 750 (1572) */ +/* 824 */ NdrFcLong( 0x4002 ), /* 16386 */ +/* 828 */ NdrFcShort( 0x2ec ), /* Offset= 748 (1576) */ +/* 830 */ NdrFcLong( 0x4003 ), /* 16387 */ +/* 834 */ NdrFcShort( 0x2ea ), /* Offset= 746 (1580) */ +/* 836 */ NdrFcLong( 0x4014 ), /* 16404 */ +/* 840 */ NdrFcShort( 0x2e8 ), /* Offset= 744 (1584) */ +/* 842 */ NdrFcLong( 0x4004 ), /* 16388 */ +/* 846 */ NdrFcShort( 0x2e6 ), /* Offset= 742 (1588) */ +/* 848 */ NdrFcLong( 0x4005 ), /* 16389 */ +/* 852 */ NdrFcShort( 0x2e4 ), /* Offset= 740 (1592) */ +/* 854 */ NdrFcLong( 0x400b ), /* 16395 */ +/* 858 */ NdrFcShort( 0x2ce ), /* Offset= 718 (1576) */ +/* 860 */ NdrFcLong( 0x400a ), /* 16394 */ +/* 864 */ NdrFcShort( 0x2cc ), /* Offset= 716 (1580) */ +/* 866 */ NdrFcLong( 0x4006 ), /* 16390 */ +/* 870 */ NdrFcShort( 0x2d6 ), /* Offset= 726 (1596) */ +/* 872 */ NdrFcLong( 0x4007 ), /* 16391 */ +/* 876 */ NdrFcShort( 0x2cc ), /* Offset= 716 (1592) */ +/* 878 */ NdrFcLong( 0x4008 ), /* 16392 */ +/* 882 */ NdrFcShort( 0x2ce ), /* Offset= 718 (1600) */ +/* 884 */ NdrFcLong( 0x400d ), /* 16397 */ +/* 888 */ NdrFcShort( 0x2cc ), /* Offset= 716 (1604) */ +/* 890 */ NdrFcLong( 0x4009 ), /* 16393 */ +/* 894 */ NdrFcShort( 0x2ca ), /* Offset= 714 (1608) */ +/* 896 */ NdrFcLong( 0x6000 ), /* 24576 */ +/* 900 */ NdrFcShort( 0x2c8 ), /* Offset= 712 (1612) */ +/* 902 */ NdrFcLong( 0x400c ), /* 16396 */ +/* 906 */ NdrFcShort( 0x2c6 ), /* Offset= 710 (1616) */ +/* 908 */ NdrFcLong( 0x10 ), /* 16 */ +/* 912 */ NdrFcShort( 0x8002 ), /* Simple arm type: FC_CHAR */ +/* 914 */ NdrFcLong( 0x12 ), /* 18 */ +/* 918 */ NdrFcShort( 0x8006 ), /* Simple arm type: FC_SHORT */ +/* 920 */ NdrFcLong( 0x13 ), /* 19 */ +/* 924 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 926 */ NdrFcLong( 0x15 ), /* 21 */ +/* 930 */ NdrFcShort( 0x800b ), /* Simple arm type: FC_HYPER */ +/* 932 */ NdrFcLong( 0x16 ), /* 22 */ +/* 936 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 938 */ NdrFcLong( 0x17 ), /* 23 */ +/* 942 */ NdrFcShort( 0x8008 ), /* Simple arm type: FC_LONG */ +/* 944 */ NdrFcLong( 0xe ), /* 14 */ +/* 948 */ NdrFcShort( 0x2a4 ), /* Offset= 676 (1624) */ +/* 950 */ NdrFcLong( 0x400e ), /* 16398 */ +/* 954 */ NdrFcShort( 0x2aa ), /* Offset= 682 (1636) */ +/* 956 */ NdrFcLong( 0x4010 ), /* 16400 */ +/* 960 */ NdrFcShort( 0x2a8 ), /* Offset= 680 (1640) */ +/* 962 */ NdrFcLong( 0x4012 ), /* 16402 */ +/* 966 */ NdrFcShort( 0x262 ), /* Offset= 610 (1576) */ +/* 968 */ NdrFcLong( 0x4013 ), /* 16403 */ +/* 972 */ NdrFcShort( 0x260 ), /* Offset= 608 (1580) */ +/* 974 */ NdrFcLong( 0x4015 ), /* 16405 */ +/* 978 */ NdrFcShort( 0x25e ), /* Offset= 606 (1584) */ +/* 980 */ NdrFcLong( 0x4016 ), /* 16406 */ +/* 984 */ NdrFcShort( 0x254 ), /* Offset= 596 (1580) */ +/* 986 */ NdrFcLong( 0x4017 ), /* 16407 */ +/* 990 */ NdrFcShort( 0x24e ), /* Offset= 590 (1580) */ +/* 992 */ NdrFcLong( 0x0 ), /* 0 */ +/* 996 */ NdrFcShort( 0x0 ), /* Offset= 0 (996) */ +/* 998 */ NdrFcLong( 0x1 ), /* 1 */ +/* 1002 */ NdrFcShort( 0x0 ), /* Offset= 0 (1002) */ +/* 1004 */ NdrFcShort( 0xffffffff ), /* Offset= -1 (1003) */ +/* 1006 */ + 0x15, /* FC_STRUCT */ + 0x7, /* 7 */ +/* 1008 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1010 */ 0xb, /* FC_HYPER */ + 0x5b, /* FC_END */ +/* 1012 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1014 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1018 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1020 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1022 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1024 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1026 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1028 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1030 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1032 */ NdrFcLong( 0x20400 ), /* 132096 */ +/* 1036 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1038 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1040 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1042 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1044 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1046 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1048 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1050 */ NdrFcShort( 0x2 ), /* Offset= 2 (1052) */ +/* 1052 */ + 0x12, 0x0, /* FC_UP */ +/* 1054 */ NdrFcShort( 0x1f0 ), /* Offset= 496 (1550) */ +/* 1056 */ + 0x2a, /* FC_ENCAPSULATED_UNION */ + 0x89, /* 137 */ +/* 1058 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1060 */ NdrFcShort( 0xa ), /* 10 */ +/* 1062 */ NdrFcLong( 0x8 ), /* 8 */ +/* 1066 */ NdrFcShort( 0x50 ), /* Offset= 80 (1146) */ +/* 1068 */ NdrFcLong( 0xd ), /* 13 */ +/* 1072 */ NdrFcShort( 0x82 ), /* Offset= 130 (1202) */ +/* 1074 */ NdrFcLong( 0x9 ), /* 9 */ +/* 1078 */ NdrFcShort( 0xb4 ), /* Offset= 180 (1258) */ +/* 1080 */ NdrFcLong( 0xc ), /* 12 */ +/* 1084 */ NdrFcShort( 0xd4 ), /* Offset= 212 (1296) */ +/* 1086 */ NdrFcLong( 0x24 ), /* 36 */ +/* 1090 */ NdrFcShort( 0x128 ), /* Offset= 296 (1386) */ +/* 1092 */ NdrFcLong( 0x800d ), /* 32781 */ +/* 1096 */ NdrFcShort( 0x132 ), /* Offset= 306 (1402) */ +/* 1098 */ NdrFcLong( 0x10 ), /* 16 */ +/* 1102 */ NdrFcShort( 0x14c ), /* Offset= 332 (1434) */ +/* 1104 */ NdrFcLong( 0x2 ), /* 2 */ +/* 1108 */ NdrFcShort( 0x162 ), /* Offset= 354 (1462) */ +/* 1110 */ NdrFcLong( 0x3 ), /* 3 */ +/* 1114 */ NdrFcShort( 0x178 ), /* Offset= 376 (1490) */ +/* 1116 */ NdrFcLong( 0x14 ), /* 20 */ +/* 1120 */ NdrFcShort( 0x18e ), /* Offset= 398 (1518) */ +/* 1122 */ NdrFcShort( 0xffffffff ), /* Offset= -1 (1121) */ +/* 1124 */ + 0x21, /* FC_BOGUS_ARRAY */ + 0x3, /* 3 */ +/* 1126 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1128 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1130 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1132 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1134 */ NdrFcLong( 0xffffffff ), /* -1 */ +/* 1138 */ NdrFcShort( 0x0 ), /* Corr flags: */ +/* 1140 */ + 0x12, 0x0, /* FC_UP */ +/* 1142 */ NdrFcShort( 0xfffffbe0 ), /* Offset= -1056 (86) */ +/* 1144 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1146 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1148 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1150 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1152 */ NdrFcShort( 0x6 ), /* Offset= 6 (1158) */ +/* 1154 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1156 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1158 */ + 0x11, 0x0, /* FC_RP */ +/* 1160 */ NdrFcShort( 0xffffffdc ), /* Offset= -36 (1124) */ +/* 1162 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1164 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1168 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1170 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1172 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1174 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1176 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1178 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1180 */ + 0x21, /* FC_BOGUS_ARRAY */ + 0x3, /* 3 */ +/* 1182 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1184 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1186 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1188 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1190 */ NdrFcLong( 0xffffffff ), /* -1 */ +/* 1194 */ NdrFcShort( 0x0 ), /* Corr flags: */ +/* 1196 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1198 */ NdrFcShort( 0xffffffdc ), /* Offset= -36 (1162) */ +/* 1200 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1202 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1204 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1206 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1208 */ NdrFcShort( 0x6 ), /* Offset= 6 (1214) */ +/* 1210 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1212 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1214 */ + 0x11, 0x0, /* FC_RP */ +/* 1216 */ NdrFcShort( 0xffffffdc ), /* Offset= -36 (1180) */ +/* 1218 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1220 */ NdrFcLong( 0x20400 ), /* 132096 */ +/* 1224 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1226 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1228 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1230 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1232 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1234 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1236 */ + 0x21, /* FC_BOGUS_ARRAY */ + 0x3, /* 3 */ +/* 1238 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1240 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1242 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1244 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1246 */ NdrFcLong( 0xffffffff ), /* -1 */ +/* 1250 */ NdrFcShort( 0x0 ), /* Corr flags: */ +/* 1252 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1254 */ NdrFcShort( 0xffffffdc ), /* Offset= -36 (1218) */ +/* 1256 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1258 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1260 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1262 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1264 */ NdrFcShort( 0x6 ), /* Offset= 6 (1270) */ +/* 1266 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1268 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1270 */ + 0x11, 0x0, /* FC_RP */ +/* 1272 */ NdrFcShort( 0xffffffdc ), /* Offset= -36 (1236) */ +/* 1274 */ + 0x21, /* FC_BOGUS_ARRAY */ + 0x3, /* 3 */ +/* 1276 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1278 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1280 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1282 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1284 */ NdrFcLong( 0xffffffff ), /* -1 */ +/* 1288 */ NdrFcShort( 0x0 ), /* Corr flags: */ +/* 1290 */ + 0x12, 0x0, /* FC_UP */ +/* 1292 */ NdrFcShort( 0x160 ), /* Offset= 352 (1644) */ +/* 1294 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1296 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1298 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1300 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1302 */ NdrFcShort( 0x6 ), /* Offset= 6 (1308) */ +/* 1304 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1306 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1308 */ + 0x11, 0x0, /* FC_RP */ +/* 1310 */ NdrFcShort( 0xffffffdc ), /* Offset= -36 (1274) */ +/* 1312 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1314 */ NdrFcLong( 0x2f ), /* 47 */ +/* 1318 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1320 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1322 */ 0xc0, /* 192 */ + 0x0, /* 0 */ +/* 1324 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1326 */ 0x0, /* 0 */ + 0x0, /* 0 */ +/* 1328 */ 0x0, /* 0 */ + 0x46, /* 70 */ +/* 1330 */ + 0x1b, /* FC_CARRAY */ + 0x0, /* 0 */ +/* 1332 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1334 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1336 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1338 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1340 */ 0x1, /* FC_BYTE */ + 0x5b, /* FC_END */ +/* 1342 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1344 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1346 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1348 */ NdrFcShort( 0xc ), /* Offset= 12 (1360) */ +/* 1350 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 1352 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1354 */ NdrFcShort( 0xffffffd6 ), /* Offset= -42 (1312) */ +/* 1356 */ 0x39, /* FC_ALIGNM8 */ + 0x36, /* FC_POINTER */ +/* 1358 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1360 */ + 0x12, 0x0, /* FC_UP */ +/* 1362 */ NdrFcShort( 0xffffffe0 ), /* Offset= -32 (1330) */ +/* 1364 */ + 0x21, /* FC_BOGUS_ARRAY */ + 0x3, /* 3 */ +/* 1366 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1368 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1370 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1372 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1374 */ NdrFcLong( 0xffffffff ), /* -1 */ +/* 1378 */ NdrFcShort( 0x0 ), /* Corr flags: */ +/* 1380 */ + 0x12, 0x0, /* FC_UP */ +/* 1382 */ NdrFcShort( 0xffffffd8 ), /* Offset= -40 (1342) */ +/* 1384 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1386 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1388 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1390 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1392 */ NdrFcShort( 0x6 ), /* Offset= 6 (1398) */ +/* 1394 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1396 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1398 */ + 0x11, 0x0, /* FC_RP */ +/* 1400 */ NdrFcShort( 0xffffffdc ), /* Offset= -36 (1364) */ +/* 1402 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1404 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1406 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1408 */ NdrFcShort( 0xa ), /* Offset= 10 (1418) */ +/* 1410 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1412 */ 0x36, /* FC_POINTER */ + 0x4c, /* FC_EMBEDDED_COMPLEX */ +/* 1414 */ 0x0, /* 0 */ + NdrFcShort( 0xfffffa85 ), /* Offset= -1403 (12) */ + 0x5b, /* FC_END */ +/* 1418 */ + 0x11, 0x0, /* FC_RP */ +/* 1420 */ NdrFcShort( 0xffffff10 ), /* Offset= -240 (1180) */ +/* 1422 */ + 0x1b, /* FC_CARRAY */ + 0x0, /* 0 */ +/* 1424 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1426 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1428 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1430 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1432 */ 0x1, /* FC_BYTE */ + 0x5b, /* FC_END */ +/* 1434 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1436 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1438 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1440 */ NdrFcShort( 0x6 ), /* Offset= 6 (1446) */ +/* 1442 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1444 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1446 */ + 0x12, 0x0, /* FC_UP */ +/* 1448 */ NdrFcShort( 0xffffffe6 ), /* Offset= -26 (1422) */ +/* 1450 */ + 0x1b, /* FC_CARRAY */ + 0x1, /* 1 */ +/* 1452 */ NdrFcShort( 0x2 ), /* 2 */ +/* 1454 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1456 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1458 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1460 */ 0x6, /* FC_SHORT */ + 0x5b, /* FC_END */ +/* 1462 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1464 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1466 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1468 */ NdrFcShort( 0x6 ), /* Offset= 6 (1474) */ +/* 1470 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1472 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1474 */ + 0x12, 0x0, /* FC_UP */ +/* 1476 */ NdrFcShort( 0xffffffe6 ), /* Offset= -26 (1450) */ +/* 1478 */ + 0x1b, /* FC_CARRAY */ + 0x3, /* 3 */ +/* 1480 */ NdrFcShort( 0x4 ), /* 4 */ +/* 1482 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1484 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1486 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1488 */ 0x8, /* FC_LONG */ + 0x5b, /* FC_END */ +/* 1490 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1492 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1494 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1496 */ NdrFcShort( 0x6 ), /* Offset= 6 (1502) */ +/* 1498 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1500 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1502 */ + 0x12, 0x0, /* FC_UP */ +/* 1504 */ NdrFcShort( 0xffffffe6 ), /* Offset= -26 (1478) */ +/* 1506 */ + 0x1b, /* FC_CARRAY */ + 0x7, /* 7 */ +/* 1508 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1510 */ 0x19, /* Corr desc: field pointer, FC_ULONG */ + 0x0, /* */ +/* 1512 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1514 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1516 */ 0xb, /* FC_HYPER */ + 0x5b, /* FC_END */ +/* 1518 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1520 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1522 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1524 */ NdrFcShort( 0x6 ), /* Offset= 6 (1530) */ +/* 1526 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1528 */ 0x36, /* FC_POINTER */ + 0x5b, /* FC_END */ +/* 1530 */ + 0x12, 0x0, /* FC_UP */ +/* 1532 */ NdrFcShort( 0xffffffe6 ), /* Offset= -26 (1506) */ +/* 1534 */ + 0x1b, /* FC_CARRAY */ + 0x3, /* 3 */ +/* 1536 */ NdrFcShort( 0x8 ), /* 8 */ +/* 1538 */ 0x7, /* Corr desc: FC_USHORT */ + 0x0, /* */ +/* 1540 */ NdrFcShort( 0xffc8 ), /* -56 */ +/* 1542 */ NdrFcShort( 0x1 ), /* Corr flags: early, */ +/* 1544 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1546 */ NdrFcShort( 0xfffffa7a ), /* Offset= -1414 (132) */ +/* 1548 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1550 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x3, /* 3 */ +/* 1552 */ NdrFcShort( 0x38 ), /* 56 */ +/* 1554 */ NdrFcShort( 0xffffffec ), /* Offset= -20 (1534) */ +/* 1556 */ NdrFcShort( 0x0 ), /* Offset= 0 (1556) */ +/* 1558 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1560 */ 0x38, /* FC_ALIGNM4 */ + 0x8, /* FC_LONG */ +/* 1562 */ 0x8, /* FC_LONG */ + 0x4c, /* FC_EMBEDDED_COMPLEX */ +/* 1564 */ 0x4, /* 4 */ + NdrFcShort( 0xfffffe03 ), /* Offset= -509 (1056) */ + 0x5b, /* FC_END */ +/* 1568 */ + 0x12, 0x0, /* FC_UP */ +/* 1570 */ NdrFcShort( 0xffffff1c ), /* Offset= -228 (1342) */ +/* 1572 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1574 */ 0x1, /* FC_BYTE */ + 0x5c, /* FC_PAD */ +/* 1576 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1578 */ 0x6, /* FC_SHORT */ + 0x5c, /* FC_PAD */ +/* 1580 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1582 */ 0x8, /* FC_LONG */ + 0x5c, /* FC_PAD */ +/* 1584 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1586 */ 0xb, /* FC_HYPER */ + 0x5c, /* FC_PAD */ +/* 1588 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1590 */ 0xa, /* FC_FLOAT */ + 0x5c, /* FC_PAD */ +/* 1592 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1594 */ 0xc, /* FC_DOUBLE */ + 0x5c, /* FC_PAD */ +/* 1596 */ + 0x12, 0x0, /* FC_UP */ +/* 1598 */ NdrFcShort( 0xfffffdb0 ), /* Offset= -592 (1006) */ +/* 1600 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1602 */ NdrFcShort( 0xfffffa04 ), /* Offset= -1532 (70) */ +/* 1604 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1606 */ NdrFcShort( 0xfffffe44 ), /* Offset= -444 (1162) */ +/* 1608 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1610 */ NdrFcShort( 0xfffffe78 ), /* Offset= -392 (1218) */ +/* 1612 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1614 */ NdrFcShort( 0xfffffdca ), /* Offset= -566 (1048) */ +/* 1616 */ + 0x12, 0x10, /* FC_UP [pointer_deref] */ +/* 1618 */ NdrFcShort( 0x2 ), /* Offset= 2 (1620) */ +/* 1620 */ + 0x12, 0x0, /* FC_UP */ +/* 1622 */ NdrFcShort( 0x16 ), /* Offset= 22 (1644) */ +/* 1624 */ + 0x15, /* FC_STRUCT */ + 0x7, /* 7 */ +/* 1626 */ NdrFcShort( 0x10 ), /* 16 */ +/* 1628 */ 0x6, /* FC_SHORT */ + 0x1, /* FC_BYTE */ +/* 1630 */ 0x1, /* FC_BYTE */ + 0x38, /* FC_ALIGNM4 */ +/* 1632 */ 0x8, /* FC_LONG */ + 0x39, /* FC_ALIGNM8 */ +/* 1634 */ 0xb, /* FC_HYPER */ + 0x5b, /* FC_END */ +/* 1636 */ + 0x12, 0x0, /* FC_UP */ +/* 1638 */ NdrFcShort( 0xfffffff2 ), /* Offset= -14 (1624) */ +/* 1640 */ + 0x12, 0x8, /* FC_UP [simple_pointer] */ +/* 1642 */ 0x2, /* FC_CHAR */ + 0x5c, /* FC_PAD */ +/* 1644 */ + 0x1a, /* FC_BOGUS_STRUCT */ + 0x7, /* 7 */ +/* 1646 */ NdrFcShort( 0x20 ), /* 32 */ +/* 1648 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1650 */ NdrFcShort( 0x0 ), /* Offset= 0 (1650) */ +/* 1652 */ 0x8, /* FC_LONG */ + 0x8, /* FC_LONG */ +/* 1654 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1656 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1658 */ 0x4c, /* FC_EMBEDDED_COMPLEX */ + 0x0, /* 0 */ +/* 1660 */ NdrFcShort( 0xfffffc48 ), /* Offset= -952 (708) */ +/* 1662 */ 0x5c, /* FC_PAD */ + 0x5b, /* FC_END */ +/* 1664 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 1666 */ NdrFcShort( 0x2 ), /* 2 */ +/* 1668 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1670 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1672 */ NdrFcShort( 0xfffffc38 ), /* Offset= -968 (704) */ +/* 1674 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1676 */ NdrFcLong( 0xd63504f ), /* 224612431 */ +/* 1680 */ NdrFcShort( 0xdeef ), /* -8465 */ +/* 1682 */ NdrFcShort( 0x4a2d ), /* 18989 */ +/* 1684 */ 0x97, /* 151 */ + 0x42, /* 66 */ +/* 1686 */ 0x28, /* 40 */ + 0xdd, /* 221 */ +/* 1688 */ 0x1b, /* 27 */ + 0xad, /* 173 */ +/* 1690 */ 0xda, /* 218 */ + 0x7c, /* 124 */ +/* 1692 */ + 0x11, 0x10, /* FC_RP [pointer_deref] */ +/* 1694 */ NdrFcShort( 0x2 ), /* Offset= 2 (1696) */ +/* 1696 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1698 */ NdrFcLong( 0xa2ae18b7 ), /* -1565648713 */ +/* 1702 */ NdrFcShort( 0x85c9 ), /* -31287 */ +/* 1704 */ NdrFcShort( 0x451c ), /* 17692 */ +/* 1706 */ 0x8c, /* 140 */ + 0xc3, /* 195 */ +/* 1708 */ 0xd0, /* 208 */ + 0xff, /* 255 */ +/* 1710 */ 0xe6, /* 230 */ + 0xb8, /* 184 */ +/* 1712 */ 0x6e, /* 110 */ + 0xeb, /* 235 */ +/* 1714 */ + 0x11, 0x4, /* FC_RP [alloced_on_stack] */ +/* 1716 */ NdrFcShort( 0x6 ), /* Offset= 6 (1722) */ +/* 1718 */ + 0x13, 0x0, /* FC_OP */ +/* 1720 */ NdrFcShort( 0xffffffb4 ), /* Offset= -76 (1644) */ +/* 1722 */ 0xb4, /* FC_USER_MARSHAL */ + 0x83, /* 131 */ +/* 1724 */ NdrFcShort( 0x2 ), /* 2 */ +/* 1726 */ NdrFcShort( 0x18 ), /* 24 */ +/* 1728 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1730 */ NdrFcShort( 0xfffffff4 ), /* Offset= -12 (1718) */ +/* 1732 */ + 0x2f, /* FC_IP */ + 0x5a, /* FC_CONSTANT_IID */ +/* 1734 */ NdrFcLong( 0x23ee0804 ), /* 602802180 */ +/* 1738 */ NdrFcShort( 0xeac7 ), /* -5433 */ +/* 1740 */ NdrFcShort( 0x493b ), /* 18747 */ +/* 1742 */ 0xbb, /* 187 */ + 0x9d, /* 157 */ +/* 1744 */ 0x22, /* 34 */ + 0x98, /* 152 */ +/* 1746 */ 0xfd, /* 253 */ + 0x44, /* 68 */ +/* 1748 */ 0xff, /* 255 */ + 0xa1, /* 161 */ +/* 1750 */ + 0x11, 0x0, /* FC_RP */ +/* 1752 */ NdrFcShort( 0x2 ), /* Offset= 2 (1754) */ +/* 1754 */ + 0x15, /* FC_STRUCT */ + 0x1, /* 1 */ +/* 1756 */ NdrFcShort( 0x6 ), /* 6 */ +/* 1758 */ 0x6, /* FC_SHORT */ + 0x6, /* FC_SHORT */ +/* 1760 */ 0x6, /* FC_SHORT */ + 0x5b, /* FC_END */ +/* 1762 */ + 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */ +/* 1764 */ 0xd, /* FC_ENUM16 */ + 0x5c, /* FC_PAD */ + + 0x0 + } + }; + +const CInterfaceProxyVtbl * _Inject_ProxyVtblList[] = +{ + ( CInterfaceProxyVtbl *) &_IPluginSiteProxyVtbl, + ( CInterfaceProxyVtbl *) &_IMessageProxyVtbl, + ( CInterfaceProxyVtbl *) &_IViewDispProxyVtbl, + ( CInterfaceProxyVtbl *) &_IFontCacheProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerTimerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPanelSinkProxyVtbl, + ( CInterfaceProxyVtbl *) &_IBrushImageProxyVtbl, + ( CInterfaceProxyVtbl *) &_ICanvasProxyVtbl, + ( CInterfaceProxyVtbl *) &_IMessageMemberProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IWindowsMessageSinkProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPagerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IInputNotifyProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPluginSinkProxyVtbl, + ( CInterfaceProxyVtbl *) &_IFontCacheDispProxyVtbl, + ( CInterfaceProxyVtbl *) &_IControlProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPluginProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerRenderProxyVtbl, + ( CInterfaceProxyVtbl *) &_IBarManagerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IRootLayerProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerPopupProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerSiteProxyVtbl, + ( CInterfaceProxyVtbl *) &_INetworkFilterProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerKeyboardProxyVtbl, + ( CInterfaceProxyVtbl *) &_IButtonProxyVtbl, + ( CInterfaceProxyVtbl *) &_IManagerProxyVtbl, + ( CInterfaceProxyVtbl *) &_IIconCacheProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerSchemaProxyVtbl, + ( CInterfaceProxyVtbl *) &_ILayerMouseProxyVtbl, + ( CInterfaceProxyVtbl *) &_IViewProxyVtbl, + ( CInterfaceProxyVtbl *) &_IInputBufferProxyVtbl, + ( CInterfaceProxyVtbl *) &_IImageCacheDispProxyVtbl, + ( CInterfaceProxyVtbl *) &_IPanelProxyVtbl, + ( CInterfaceProxyVtbl *) &_ISimpleBarProxyVtbl, + ( CInterfaceProxyVtbl *) &_IImageCacheProxyVtbl, + 0 +}; + +const CInterfaceStubVtbl * _Inject_StubVtblList[] = +{ + ( CInterfaceStubVtbl *) &_IPluginSiteStubVtbl, + ( CInterfaceStubVtbl *) &_IMessageStubVtbl, + ( CInterfaceStubVtbl *) &_IViewDispStubVtbl, + ( CInterfaceStubVtbl *) &_IFontCacheStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerTimerStubVtbl, + ( CInterfaceStubVtbl *) &_IPanelSinkStubVtbl, + ( CInterfaceStubVtbl *) &_IBrushImageStubVtbl, + ( CInterfaceStubVtbl *) &_ICanvasStubVtbl, + ( CInterfaceStubVtbl *) &_IMessageMemberStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerStubVtbl, + ( CInterfaceStubVtbl *) &_IWindowsMessageSinkStubVtbl, + ( CInterfaceStubVtbl *) &_IPagerStubVtbl, + ( CInterfaceStubVtbl *) &_IInputNotifyStubVtbl, + ( CInterfaceStubVtbl *) &_IPluginSinkStubVtbl, + ( CInterfaceStubVtbl *) &_IFontCacheDispStubVtbl, + ( CInterfaceStubVtbl *) &_IControlStubVtbl, + ( CInterfaceStubVtbl *) &_IPluginStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerRenderStubVtbl, + ( CInterfaceStubVtbl *) &_IBarManagerStubVtbl, + ( CInterfaceStubVtbl *) &_IRootLayerStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerPopupStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerSiteStubVtbl, + ( CInterfaceStubVtbl *) &_INetworkFilterStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerKeyboardStubVtbl, + ( CInterfaceStubVtbl *) &_IButtonStubVtbl, + ( CInterfaceStubVtbl *) &_IManagerStubVtbl, + ( CInterfaceStubVtbl *) &_IIconCacheStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerSchemaStubVtbl, + ( CInterfaceStubVtbl *) &_ILayerMouseStubVtbl, + ( CInterfaceStubVtbl *) &_IViewStubVtbl, + ( CInterfaceStubVtbl *) &_IInputBufferStubVtbl, + ( CInterfaceStubVtbl *) &_IImageCacheDispStubVtbl, + ( CInterfaceStubVtbl *) &_IPanelStubVtbl, + ( CInterfaceStubVtbl *) &_ISimpleBarStubVtbl, + ( CInterfaceStubVtbl *) &_IImageCacheStubVtbl, + 0 +}; + +PCInterfaceName const _Inject_InterfaceNamesList[] = +{ + "IPluginSite", + "IMessage", + "IViewDisp", + "IFontCache", + "ILayerTimer", + "IPanelSink", + "IBrushImage", + "ICanvas", + "IMessageMember", + "ILayer", + "IWindowsMessageSink", + "IPager", + "IInputNotify", + "IPluginSink", + "IFontCacheDisp", + "IControl", + "IPlugin", + "ILayerRender", + "IBarManager", + "IRootLayer", + "ILayerPopup", + "ILayerSite", + "INetworkFilter", + "ILayerKeyboard", + "IButton", + "IManager", + "IIconCache", + "ILayerSchema", + "ILayerMouse", + "IView", + "IInputBuffer", + "IImageCacheDisp", + "IPanel", + "ISimpleBar", + "IImageCache", + 0 +}; + +const IID * _Inject_BaseIIDList[] = +{ + 0, + &IID_IDispatch, + &IID_IDispatch, + &IID_IDispatch, + 0, + 0, + 0, + 0, + &IID_IDispatch, + 0, + 0, + &IID_IDispatch, + &IID_IDispatch, + 0, + &IID_IDispatch, + &IID_IDispatch, + 0, + 0, + 0, + 0, + 0, + 0, + &IID_IDispatch, + 0, + &IID_IDispatch, + 0, + 0, + 0, + 0, + &IID_IDispatch, + &IID_IDispatch, + &IID_IDispatch, + 0, + 0, + &IID_IDispatch, + 0 +}; + + +#define _Inject_CHECK_IID(n) IID_GENERIC_CHECK_IID( _Inject, pIID, n) + +int __stdcall _Inject_IID_Lookup( const IID * pIID, int * pIndex ) +{ + IID_BS_LOOKUP_SETUP + + IID_BS_LOOKUP_INITIAL_TEST( _Inject, 35, 32 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 16 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 8 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 4 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 2 ) + IID_BS_LOOKUP_NEXT_TEST( _Inject, 1 ) + IID_BS_LOOKUP_RETURN_RESULT( _Inject, 35, *pIndex ) + +} + +const ExtendedProxyFileInfo Inject_ProxyFileInfo = +{ + (PCInterfaceProxyVtblList *) & _Inject_ProxyVtblList, + (PCInterfaceStubVtblList *) & _Inject_StubVtblList, + (const PCInterfaceName * ) & _Inject_InterfaceNamesList, + (const IID ** ) & _Inject_BaseIIDList, + & _Inject_IID_Lookup, + 35, + 2, + 0, /* table of [async_uuid] interfaces */ + 0, /* Filler1 */ + 0, /* Filler2 */ + 0 /* Filler3 */ +}; + + +#endif /* defined(_M_IA64) || defined(_M_AXP64)*/ + diff --git a/Native/Inject/Attic/Message.cpp b/Native/Inject/Attic/Message.cpp new file mode 100644 index 0000000..3af3f69 --- /dev/null +++ b/Native/Inject/Attic/Message.cpp @@ -0,0 +1,345 @@ +// Message.cpp : Implementation of cMessage +#include "stdafx.h" +#include "Inject.h" +#include "Message.h" + +#include "InjectApi.h" +#include "MessageLoaders.h" +#include "MessageParsers.h" +// m_pParent noahb +cMessage::cFieldList::iterator cMessage::cLoadContext::lookupField( cMessage::cMessageElement *pElement ) +{ + for( cLoadContext *pContext = this; pContext != NULL; pContext = pContext->m_pParent ) + { + for( cFieldList::iterator i = m_pMessage->m_fields.begin() + m_dwOffset; i != m_pMessage->m_fields.end(); i += i->m_nOwns ) + { + if( i->m_pSchema == pElement ) + return i; + } + } + + return m_pMessage->m_fields.end(); +} + +void cMessage::cMessageSchema::loadSchema( DWORD dwSchema ) +{ + TCHAR szQuery[ 255 ]; + ::_stprintf( szQuery, _T( "/schema/messages/message[@type='%04X']" ), dwSchema ); + + MSXML::IXMLDOMElementPtr pMessage = (*g_pXML)->selectSingleNode( szQuery ); + if( pMessage.GetInterfacePtr() == NULL ) + // Nothing here, so we create a valid but empty message + return; + + cElementParser::cContext c( &m_members ); + c.parseChildren( pMessage ); +} + +MSXML::IXMLDOMDocumentPtr * cMessage::g_pXML; +cMessage::cMessageSchemaMap cMessage::g_schema; + +void cMessage::init() +{ + // Load the schema + TCHAR szPath[ MAX_PATH ]; + ::InjectMapPath( eInjectPathAgent, _T( "messages.xml" ), szPath ); + + g_pXML = new MSXML::IXMLDOMDocumentPtr; + + (*g_pXML).CreateInstance( __uuidof( MSXML::DOMDocument ) ); + (*g_pXML)->load( szPath ); + + // Initialize our schema helper objects + cFieldLoader::init(); + cElementParser::init(); + +#ifdef _DEBUG + // Load all of the message type + USES_CONVERSION; + + MSXML::IXMLDOMNodeListPtr pAllMessages = (*g_pXML)->selectNodes( _T( "/schema/messages/message" ) ); + for( MSXML::IXMLDOMElementPtr pMessage = pAllMessages->nextNode(); pMessage.GetInterfacePtr() != NULL; pMessage = pAllMessages->nextNode() ) + { + _variant_t vType = pMessage->getAttribute( _T( "type" ) ); + if( vType.vt != VT_BSTR ) + { + _ASSERTE( FALSE ); + continue; + } + + // Get the ID from the message + long nID; + if( ::_stscanf( OLE2T( vType.bstrVal ), _T( "%X" ), &nID ) != 1 ) + { + _ASSERTE( FALSE ); + continue; + } + + cMessageSchema ms; + ms.loadSchema( nID ); + } +#endif +} + +void cMessage::term() +{ + g_schema.clear(); + cElementParser::term(); + cFieldLoader::term(); + + if( (*g_pXML).GetInterfacePtr() != NULL ) + { + (*g_pXML).Release(); + delete g_pXML; + } +} + +///////////////////////////////////////////////////////////////////////////// +// cMessage + +cMessage::cMessage() +: m_nType( 0 ), +m_pStartCrack( NULL ), +m_pEndCrack( NULL ), +m_pEndData( NULL ), +m_pSchema( NULL ) +{ +} + +cMessage::cFieldList::iterator cMessage::getFieldFromElement( cMessageElement *pElement ) +{ + for( cFieldList::iterator i = m_fields.begin(); i != m_fields.end(); i += i->m_nOwns ) + { + cMessageElement *pSchema = i->m_pSchema; + if( pSchema == pElement ) + break; + } + + return i; +} + +void cMessage::crackMessage( BYTE *pBody, DWORD dwSize ) +{ + m_pStartCrack = pBody; + m_pEndData = pBody + dwSize + sizeof( DWORD ); + + m_nType = *reinterpret_cast< long * >( pBody ); + + m_fields.clear(); + + m_pEndCrack = m_pStartCrack + sizeof( long ); + + // First look up the message to see if it's already decoded + cMessageSchemaMap::iterator i_schema = g_schema.find( m_nType ); + if( i_schema == g_schema.end() ) + { + // Make a new one + m_pSchema = new cMessageSchema; + m_pSchema->loadSchema( m_nType ); + g_schema.insert( cMessageSchemaMap::value_type( m_nType, std::auto_ptr< cMessageSchema >( m_pSchema ) ) ); + } + else + m_pSchema = i_schema->second.get(); + + // At this point we have "a" schema of some quality + // set up the cursors + + // Crack all fields right awway - testing mostly + cLoadContext context( this ); + m_icracked = m_pSchema->m_members.begin(); + while( m_icracked != m_pSchema->m_members.end() ) + { + if( !m_icracked->get()->load( context ) ) + { + // Failure to load the data, abort + m_icracked = m_pSchema->m_members.end(); + break; + } + + // Carry on to the next field + ++ m_icracked; + } +} + +void cMessage::crackAll() +{ + cLoadContext context( this ); + while( m_icracked != m_pSchema->m_members.end() ) + { + if( !m_icracked->get()->load( context ) ) + { + // Failure to load the data, abort + m_icracked = m_pSchema->m_members.end(); + break; + } + + // Carry on to the next field + ++ m_icracked; + } +} + +bool cMessage::crackMember( cFieldList::iterator i ) +{ + if( i != m_fields.end() ) + // We aren't at the end yet + return true; + + if( m_icracked == m_pSchema->m_members.end() ) + // At the end now + return false; + + // Attempt to crack the next field + cLoadContext context( this ); + while( m_icracked != m_pSchema->m_members.end() ) + { + if( !m_icracked->get()->load( context ) ) + { + // Failure to load the data, abort + m_icracked = m_pSchema->m_members.end(); + break; + } + + // Carry on to the next field + ++ m_icracked; + + if( i != m_fields.end() ) + return true; + } + + return false; +} + +STDMETHODIMP cMessage::get_Type(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = *reinterpret_cast< long * >( m_pStartCrack ); + + return S_OK; +} + +STDMETHODIMP cMessage::get_Data(VARIANT *pVal) +{ + long nSize = m_pEndData - m_pStartCrack; + + if( nSize == 0 ) + { + // Special case, this message is entirely cracked - return NULL + pVal->vt = VT_NULL; + pVal->intVal = 0; + + return S_OK; + } + + // We've got some data to share + SAFEARRAYBOUND sab = { nSize, 0 }; + SAFEARRAY *pArray = ::SafeArrayCreate( VT_UI1, 1, &sab ); + + ::SafeArrayAllocData( pArray ); + LPVOID pvData; + ::SafeArrayAccessData( pArray, &pvData ); + + ::memcpy( pvData, m_pStartCrack, nSize ); + + ::SafeArrayUnaccessData( pArray ); + + pVal->vt = VT_ARRAY | VT_UI1; + pVal->parray = pArray; + + return S_OK; +} + +STDMETHODIMP cMessage::get_Member(VARIANT vName, VARIANT *pVal) +{ + ::VariantInit (pVal); + + if( vName.vt == VT_BSTR ) + { + _bstr_t bstrName = vName; + + // Iterate over the fields and return our match - in this loop we'll do incremental + // cracking, so it's a little messy. When we hit the end, we look to see if there are + // more uncracked fields + int nFieldCount = m_fields.size(); + for( int nField = 0; nField != nFieldCount; nField += m_fields[ nField ].m_nOwns ) + { + if( m_fields[ nField ].m_pSchema->m_strName == bstrName ) + { + m_fields[ nField ].m_pSchema->getValue( this, m_fields.begin() + nField, pVal ); + return S_OK; + } + } + + pVal->vt = VT_EMPTY; + + return S_OK; + } + + // Attempt to convert it into an index + HRESULT hRes = ::VariantChangeType( &vName, &vName, 0, VT_I4 ); + if( FAILED( hRes ) ) + { + _ASSERTE( FALSE ); + return hRes; + } + + // Check if the value is in range + long nIndex = vName.lVal; + if( nIndex < 0 ) + { + _ASSERTE( nIndex >= 0 ); + return E_INVALIDARG; + } + + // Now, one problem is we aren't exactly sure how big the array is, so we have to walk + // through the fields, skipping appropriately + for( cFieldList::iterator i = m_fields.begin(); crackMember( i ); i += i->m_nOwns, -- nIndex ) + { + if( nIndex == 0 ) + { + // We've found the index - extract the value + i->m_pSchema->getValue( this, i, pVal ); + return S_OK; + } + } + + // The index was too high + _ASSERTE( FALSE ); + + return E_INVALIDARG; +} + +STDMETHODIMP cMessage::get_MemberName(long nIndex, BSTR *pVal) +{ + _ASSERTE( nIndex >= 0 ); + _ASSERTE( pVal != NULL ); + + USES_CONVERSION; + + for( cFieldList::iterator i = m_fields.begin(); crackMember( i ); i += i->m_nOwns, -- nIndex ) + { + if( nIndex == 0 ) + { + // We've found the index - extract the value + *pVal = OLE2BSTR( i->m_pSchema->m_strName ); + return S_OK; + } + } + + // The index was too high + + return E_INVALIDARG; +} + +STDMETHODIMP cMessage::get_Count(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + // We must crack them all to get a count + crackAll(); + + *pVal = 0; + for( cFieldList::iterator i = m_fields.begin(); i != m_fields.end(); i += i->m_nOwns, ++ ( *pVal ) ); + + return S_OK; +} diff --git a/Native/Inject/Attic/Message.h b/Native/Inject/Attic/Message.h new file mode 100644 index 0000000..6359001 --- /dev/null +++ b/Native/Inject/Attic/Message.h @@ -0,0 +1,148 @@ +// Message.h : Declaration of the cMessage + +#ifndef __MESSAGE_H_ +#define __MESSAGE_H_ + +#include + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cMessage +class ATL_NO_VTABLE cMessage : + public CComObjectRootEx, + public IDispatchImpl< IMessage, &IID_IMessage, &LIBID_DecalPlugins > +{ +public: + class cMessageElement; + + class cField + { + public: + cMessageElement *m_pSchema; + void *m_pvData; + int m_nOwns; + CComPtr< IDispatch > m_pDisp; + }; + + typedef std::deque< cField > cFieldList; + + class cLoadContext + { + cMessage *m_pMessage; + DWORD m_dwOffset; + cLoadContext *m_pParent; + + public: + cLoadContext( cMessage *pMessage ) + : m_pMessage( pMessage ), + m_dwOffset( 0 ), + m_pParent( NULL ) + { + } + + cLoadContext( cLoadContext *pParent ) + : m_pMessage( pParent->m_pMessage ), + m_dwOffset( m_pMessage->m_fields.size() ), + m_pParent( pParent ) + { + } + + cFieldList::iterator lookupField( cMessageElement *pElement ); + + DWORD addField( cMessageElement *pElement, void *pvData ) + { + cField f; + f.m_pSchema = pElement; + f.m_pvData = pvData; + f.m_nOwns = 1; + + m_pMessage->m_fields.push_back( f ); + + return m_pMessage->m_fields.size(); + } + + void groupField( DWORD dwIndex ) + { + m_pMessage->m_fields[ dwIndex - 1 ].m_nOwns += m_pMessage->m_fields.size() - dwIndex; + } + + cMessage *getMessage() + { + return m_pMessage; + } + }; + + class cMessageElement + { + public: + _bstr_t m_strName; + + virtual ~cMessageElement() + { + } + + // Decodes from the current point and returns + // the pointer advanced by a certain number of offsets + virtual bool load( cLoadContext &context ) = 0; + virtual void getValue( cMessage *pMsg, cFieldList::iterator i, LPVARIANT pDest ) = 0; + virtual long getNumber( cFieldList::iterator i ) + { + // Default implementation fails + _ASSERTE( FALSE ); + + return 0; + } + }; + + typedef std::vector< std::auto_ptr< cMessageElement > > cElementList; + + class cMessageSchema + { + public: + cElementList m_members; + + void loadSchema( DWORD dwSchema ); + bool parseChildren( cElementList &list, MSXML::IXMLDOMElementPtr &pElement ); + }; + + typedef std::map< DWORD, std::auto_ptr< cMessageSchema > > cMessageSchemaMap; + + static MSXML::IXMLDOMDocumentPtr * g_pXML; + static cMessageSchemaMap g_schema; + + static void init(); + static void term(); + + cMessage(); + + cFieldList m_fields; + long m_nType; + cMessageSchema *m_pSchema; + cElementList::iterator m_icracked; + + cFieldList::iterator getFieldFromElement( cMessageElement *pElement ); + + BYTE *m_pStartCrack, + *m_pEndCrack, + *m_pEndData; + + void crackMessage( BYTE *pBody, DWORD dwSize ); + void crackAll(); + bool crackMember( cFieldList::iterator i ); + +BEGIN_COM_MAP(cMessage) + COM_INTERFACE_ENTRY(IMessage) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IMessage +public: + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MemberName)(long nIndex, /*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Member)(VARIANT vIndex, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(get_Data)(/*[out, retval]*/ VARIANT *pVal); + STDMETHOD(get_Type)(/*[out, retval]*/ long *pVal); +}; + +#endif //__MESSAGE_H_ diff --git a/Native/Inject/Attic/MessageLoaders.cpp b/Native/Inject/Attic/MessageLoaders.cpp new file mode 100644 index 0000000..b45168a --- /dev/null +++ b/Native/Inject/Attic/MessageLoaders.cpp @@ -0,0 +1,196 @@ +// MessageLoaders.cpp +// Implementation of message loaders for various data types + +#include "StdAfx.h" +#include "MessageLoaders.h" + +// The boatload of decoding classes +template< class ValueT > +class cVariantLoader +: public cFieldLoader +{ +public: + virtual void *skip( void *pData ) + { + return reinterpret_cast< BYTE * >( pData ) + sizeof( ValueT ); + } + + virtual void *align( void *pData, void *pStart ) + { + size_t nOffset = reinterpret_cast< BYTE * >( pData ) - reinterpret_cast< BYTE * >( pStart ); + if( ( nOffset % sizeof( ValueT ) ) == 0 ) + return pData; + + return ( reinterpret_cast< BYTE * >( pStart ) + nOffset + sizeof( ValueT ) - ( nOffset % sizeof( ValueT ) ) ); + } + + virtual bool testValue( void *pData, void *pEnd ) + { + return ( ( reinterpret_cast< BYTE * >( pData ) + sizeof( ValueT ) ) <= reinterpret_cast< BYTE * >( pEnd ) ); + } + + ValueT &valueOf( void *pvData ) + { + return *reinterpret_cast< ValueT * >( pvData ); + } +}; + +class cByteLoader +: public cVariantLoader< BYTE > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_UI1; + pDest->bVal = valueOf( pvData ); + } + + virtual long getNumber( void *pvData ) + { + return valueOf( pvData ); + } +}; + +class cShortLoader +: public cVariantLoader< short > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_I2; + pDest->iVal = valueOf( pvData ); + } + + virtual long getNumber( void *pvData ) + { + return valueOf( pvData ); + } +}; + +class cLongLoader +: public cVariantLoader< long > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_I4; + pDest->lVal = valueOf( pvData ); + } + + virtual long getNumber( void *pvData ) + { + return valueOf( pvData ); + } +}; + +class cFloatLoader +: public cVariantLoader< float > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_R4; + pDest->fltVal = valueOf( pvData ); + } +}; + +class cDoubleLoader +: public cVariantLoader< double > +{ +public: + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + pDest->vt = VT_R8; + pDest->dblVal = valueOf( pvData ); + } +}; + +class cStringLoader +: public cFieldLoader +{ +public: + virtual void *skip( void *pvData ) + { + WORD wLength = *reinterpret_cast< WORD * >( pvData ) + sizeof( WORD ); + if( ( wLength % sizeof( DWORD ) ) != 0 ) + wLength += sizeof( DWORD ) - ( wLength % sizeof( DWORD ) ); + + return reinterpret_cast< BYTE * >( pvData ) + wLength; + } + + virtual void *align( void *pvData, void * ) + { + // Error, this is not a valid alignment type + _ASSERTE( FALSE ); + + return pvData; + } + + virtual bool testValue( void *pvData, void *pvEnd ) + { + WORD wLength = *reinterpret_cast< WORD * >( pvData ) + sizeof( WORD ), + wField = wLength; + + if( ( wField % sizeof( DWORD ) ) != 0 ) + wField += sizeof( DWORD ) - ( wField % sizeof( DWORD ) ); + + // It fits inside the packet, so our field isn't too big + if( ( reinterpret_cast< BYTE * >( pvData ) + wField ) > reinterpret_cast< BYTE * >( pvEnd ) ) + return false; + + if( *( reinterpret_cast< char * >( pvData ) + wLength - 1 ) != '\0' ) + // This string is not NULL terminated + return false; + + // Anything else just makes the string ugly, but won't lead to a memory + // overrun, so let them play + return true; + } + + virtual void getValue( void *pvData, LPVARIANT pDest ) + { + USES_CONVERSION; + + pDest->vt = VT_BSTR; + pDest->bstrVal = A2BSTR( reinterpret_cast< char * >( reinterpret_cast< BYTE * >( pvData ) + sizeof( WORD ) ) ); + } +}; + +long cFieldLoader::getNumber( void *pvData ) +{ + // This default implementation does not support this conversion + _ASSERTE( FALSE ); + + return 0; +} + +cFieldLoader *cFieldLoader::lookup( const _bstr_t &strName ) +{ + cFieldLoaderMap::iterator i = g_primitives.find( strName ); + if( i == g_primitives.end() ) + return NULL; + + return i->second.get(); +} + +void cFieldLoader::init() +{ + addLoader( _T( "BYTE" ), new cByteLoader ); + addLoader( _T( "WORD" ), new cShortLoader ); + addLoader( _T( "DWORD" ), new cLongLoader ); + addLoader( _T( "float" ), new cFloatLoader ); + addLoader( _T( "double" ), new cDoubleLoader ); + addLoader( _T( "String" ), new cStringLoader ); +} + +void cFieldLoader::term() +{ + g_primitives.clear(); +} + +void cFieldLoader::addLoader( LPCTSTR szName, cFieldLoader *pLoader ) +{ + g_primitives.insert( cFieldLoaderMap::value_type( szName, std::auto_ptr< cFieldLoader >( pLoader ) ) ); +} + +cFieldLoader::cFieldLoaderMap cFieldLoader::g_primitives; diff --git a/Native/Inject/Attic/MessageLoaders.h b/Native/Inject/Attic/MessageLoaders.h new file mode 100644 index 0000000..bdcc2db --- /dev/null +++ b/Native/Inject/Attic/MessageLoaders.h @@ -0,0 +1,30 @@ +// MessageLoaders.h +// Declaration of Primitive Data Type loaders for encoded message data + +#ifndef __MESSAGELOADERS_H +#define __MESSAGELOADERS_H + +#include + +class cFieldLoader +{ +public: + virtual void *skip(void *) = 0; + virtual void *align(void *pData, void *pStart) = 0; + virtual bool testValue(void *pData, void *pEnd) = 0; + virtual void getValue( void *, LPVARIANT pDest ) = 0; + virtual long getNumber( void *pvData ); + + static cFieldLoader *lookup( const _bstr_t &strName ); + + static void init(); + static void term(); + +private: + static void addLoader( LPCTSTR szName, cFieldLoader *pLoader ); + + typedef std::map< _bstr_t, std::auto_ptr< cFieldLoader > > cFieldLoaderMap; + static cFieldLoaderMap g_primitives; +}; + +#endif diff --git a/Native/Inject/Attic/MessageParsers-Cibo.cpp b/Native/Inject/Attic/MessageParsers-Cibo.cpp new file mode 100644 index 0000000..23b1448 --- /dev/null +++ b/Native/Inject/Attic/MessageParsers-Cibo.cpp @@ -0,0 +1,701 @@ +// MessageParsers.cpp +// Implementation of parsers and runtime objects for parsing message data + +#include "StdAfx.h" +#include "Inject.h" + +#include "MessageParsers.h" +#include "MessageLoaders.h" + +#include "MessageStruct.h" +#include "MessageVector.h" + +class cStructElement + : public cMessage::cMessageElement +{ +public: + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // Walk through the list of members and have them load + int nIndex = context.addField( this, NULL ); + + for( cMessage::cElementList::iterator i = m_members.begin(); i != m_members.end(); ++ i ) + { + if( !i->get()->load( cMessage::cLoadContext( &context ) ) ) + return false; + } + + // Update the field count + context.groupField( nIndex ); + return true; + } + + virtual void getValue( cMessage *pMessage, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + if( i->m_pDisp.p == NULL ) + { + // Create the vector object + CComObject< cMessageStruct > *pVecDisp; + CComObject< cMessageStruct >::CreateInstance( &pVecDisp ); + + pVecDisp->init( pMessage, ( i - pMessage->m_fields.begin() ) ); + i->m_pDisp = pVecDisp; + } + else + i->m_pDisp->Reset(); + + pDest->vt = VT_DISPATCH; + pDest->pdispVal = i->m_pDisp; + pDest->pdispVal->AddRef(); + } +}; + +class cFieldParser +: public cElementParser +{ +public: + class cFieldElement + : public cMessage::cMessageElement + { + public: + cFieldLoader *m_pLoader; + + virtual bool load( cMessage::cLoadContext &context ) + { + if( !m_pLoader->testValue( context.getMessage()->m_pEndCrack, context.getMessage()->m_pEndData ) ) + { + // The element failed, this will usually indicate bad schema + _ASSERTE( FALSE ); + return false; + } + + context.addField( this, context.getMessage()->m_pEndCrack ); + context.getMessage()->m_pEndCrack = reinterpret_cast< BYTE * >( m_pLoader->skip( context.getMessage()->m_pEndCrack ) ); + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + m_pLoader->getValue( i->m_pvData, pDest ); + } + + virtual long getNumber( cMessage::cFieldList::iterator i ) + { + return m_pLoader->getNumber( i->m_pvData ); + } + }; + + // Strings + static _bstr_t g_strType; + static _bstr_t g_strName; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + // Locate the data type in the list + _variant_t strDataType = pElement->getAttribute( g_strType ); + + if( strDataType.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strDataType.vt == VT_BSTR ); + return NULL; + } + + _bstr_t bstrDataType = strDataType; + + cFieldLoader *pField = cFieldLoader::lookup( bstrDataType ); + if( pField == NULL ) + return parseStruct( context, pElement, bstrDataType ); + + _variant_t strName = pElement->getAttribute( g_strName ); + + if( strName.vt != VT_BSTR ) + { + _ASSERTE( strName.vt == VT_BSTR ); + return NULL; + } + + cFieldElement *pFieldElement = new cFieldElement; + + pFieldElement->m_strName = strName; + pFieldElement->m_pLoader = pField; + return pFieldElement; + } + + cMessage::cMessageElement *parseStruct( cContext &context, MSXML::IXMLDOMElementPtr &pElement, const _bstr_t &strType ) + { + // Locate the data type in the list + _variant_t strName = pElement->getAttribute( cFieldParser::g_strName ); + + if( strName.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strName.vt == VT_BSTR ); + return NULL; + } + + // We have the field name, now look up data type schema + USES_CONVERSION; + + TCHAR szQuery[ 255 ]; + ::_stprintf( szQuery, _T( "/schema/datatypes/type[@name='%s']" ), + OLE2T( strType ) ); + + MSXML::IXMLDOMElementPtr pStruct = pElement->ownerDocument->selectSingleNode( szQuery ); + if( pStruct.GetInterfacePtr() == NULL ) + { + // Could not cross reference the structure + _ASSERTE( pStruct.GetInterfacePtr() != NULL ); + return NULL; + } + + std::auto_ptr< cStructElement > pStructElement( new cStructElement() ); + pStructElement->m_strName = strName; + if( context.parseChildren( pStructElement->m_members, pStruct ) ) + return pStructElement.release(); + + return NULL; + } +}; + +_bstr_t cFieldParser::g_strType( _T( "type" ) ); +_bstr_t cFieldParser::g_strName( _T( "name" ) ); + +class cMaskParser +: public cElementParser +{ +public: + class cMaskElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pValue; + + class cMask + { + public: + DWORD m_dwValue; + DWORD m_dwFirstChild, + m_dwLastChild; + }; + + typedef std::vector< cMask > cMaskMap; + + cMaskMap m_masks; + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pValue ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return false; + } + + _ASSERT( iField->m_pSchema == m_pValue ); + + long nMaskValue = iField->m_pSchema->getNumber( iField ); + + // Walk through the mask values and load all of the fields in range + for( cMaskMap::iterator i = m_masks.begin(); i != m_masks.end(); ++ i ) + { + if( ( nMaskValue & i->m_dwValue ) == 0 ) + continue; + + // This is a valid mask load up all teh fields in range + cMessage::cElementList::iterator m_end = m_members.begin() + i->m_dwLastChild; + for( cMessage::cElementList::iterator j = m_members.begin() + i->m_dwFirstChild; j != m_end; ++ j ) + { + if( !j->get()->load( context ) ) + return false; + } + } + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator, LPVARIANT ) + { + // This element should never insert itself into the message list + _ASSERTE( FALSE ); + } + }; + + static _bstr_t g_strMask; + static _bstr_t g_strValue; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Find a matching element in the schema + cMessage::cMessageElement *pName = context.findElement( vName.bstrVal ); + if( pName == NULL ) + { + // The mask field was not found + _ASSERTE( pName != NULL ); + return NULL; + } + + // Create the mask element + std::auto_ptr< cMaskElement > pMaskElement( new cMaskElement ); + pMaskElement->m_pValue = pName; + + // Walk through each of the mask values + USES_CONVERSION; + + MSXML::IXMLDOMNodeListPtr pMaskList = pElement->selectNodes( g_strMask ); + for( MSXML::IXMLDOMElementPtr pMask = pMaskList->nextNode(); pMask.GetInterfacePtr() != NULL; pMask = pMaskList->nextNode() ) + { + _variant_t vValue = pMask->getAttribute( g_strValue ); + if( vValue.vt != VT_BSTR ) + { + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Make sure it has the 'hex' prefix + if( vValue.bstrVal[ 0 ] != OLESTR( '0' ) ) + { + _ASSERTE( vValue.bstrVal[ 0 ] == OLESTR( '0' ) ); + return NULL; + } + + if( vValue.bstrVal[ 1 ] != OLESTR( 'x' ) ) + { + _ASSERTE( vValue.bstrVal[ 1 ] == OLESTR( 'x' ) ); + return NULL; + } + + // Attempt to convert the remaining number + long nMaskValue; + if( ::_stscanf( OLE2T( vValue.bstrVal + 2 ), _T( "%X" ), &nMaskValue ) != 1 ) + { + // Could not convert value + _ASSERTE( FALSE ); + return NULL; + } + + long nStartOffset = pMaskElement->m_members.size(); + context.parseChildren( pMaskElement->m_members, pMask ); + + cMaskElement::cMask mask = { nMaskValue, nStartOffset, pMaskElement->m_members.size() }; + pMaskElement->m_masks.push_back( mask ); + } + + return pMaskElement.release(); + } +}; + +_bstr_t cMaskParser::g_strMask( _T( "mask" ) ); +_bstr_t cMaskParser::g_strValue( _T( "value" ) ); + +class cVectorParser +: public cElementParser +{ +public: + class cVectorElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pLength; + std::auto_ptr< cMessage::cMessageElement > m_pStruct; + int m_nSkip; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pLength ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return NULL; + } + + _ASSERT( iField->m_pSchema == m_pLength ); + + long nLength = iField->m_pSchema->getNumber( iField ) - m_nSkip; + + // Insert a record for ourself + DWORD dwIndex = context.addField( this, NULL ); + + for( int i = 0; i < nLength; ++ i ) + { + // Insert a record for the current struct + if( !m_pStruct->load( cMessage::cLoadContext( &context ) ) ) + return false; + } + + // Update the used field count + context.groupField( dwIndex ); + return true; + } + + virtual void getValue( cMessage *pMessage, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + if( i->m_pDisp.p == NULL ) + { + // Create the vector object + CComObject< cMessageVector > *pVecDisp; + CComObject< cMessageVector >::CreateInstance( &pVecDisp ); + + pVecDisp->init( pMessage, ( i - pMessage->m_fields.begin() ) ); + i->m_pDisp = pVecDisp; + } + else + i->m_pDisp->Reset(); + + pDest->vt = VT_DISPATCH; + pDest->pdispVal = i->m_pDisp; + pDest->pdispVal->AddRef(); + } + }; + + static _bstr_t g_strLength, + g_strSkip; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + _variant_t vLength = pElement->getAttribute( g_strLength ), + vSkip = pElement->getAttribute( g_strSkip ); + if( vLength.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vLength.vt == VT_BSTR ); + return NULL; + } + + long nSkip = 0; + if( vSkip.vt != VT_NULL ) + { + try + { + nSkip = vSkip; + } + catch( ... ) + { + // Failed to make the conversion + _ASSERT( FALSE ); + return NULL; + } + } + + cMessage::cMessageElement *pLength = context.findElement( vLength.bstrVal ); + if( pLength == NULL ) + { + // The mask field was not found + _ASSERTE( pLength != NULL ); + return NULL; + } + + std::auto_ptr< cStructElement > pStructElement( new cStructElement ); + + if( !context.parseChildren( pStructElement->m_members, pElement ) ) + return NULL; + + cVectorElement *pVector = new cVectorElement; + pVector->m_strName = vName; + pVector->m_pLength = pLength; + pVector->m_nSkip = nSkip; + pVector->m_pStruct = std::auto_ptr< cMessage::cMessageElement >( pStructElement.release() ); + + return pVector; + } +}; + +_bstr_t cVectorParser::g_strLength( _T( "length" ) ); +_bstr_t cVectorParser::g_strSkip( _T( "skip" ) ); + +class cSwitchParser +: public cElementParser +{ +public: + class cSwitchElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pValue; + + class cCase + { + public: + DWORD m_dwValue; + DWORD m_dwFirstChild, + m_dwLastChild; + }; + + typedef std::vector< cCase > cCaseMap; + + cCaseMap m_cases; + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pValue ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return NULL; + } + + _ASSERT( iField->m_pSchema == m_pValue ); + + long nCaseValue = iField->m_pSchema->getNumber( iField ); + + // Walk through the mask values and load all of the fields in range + for( cCaseMap::iterator i = m_cases.begin(); i != m_cases.end(); ++ i ) + { + if( nCaseValue != i->m_dwValue ) + continue; + + // This is a valid mask load up all teh fields in range + cMessage::cElementList::iterator m_end = m_members.begin() + i->m_dwLastChild; + for( cMessage::cElementList::iterator j = m_members.begin() + i->m_dwFirstChild; j != m_end; ++ j ) + { + if( !j->get()->load( context ) ) + return false; + } + + // For now we short circuit cases + break; + } + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator, LPVARIANT ) + { + // This element should never insert itself into the message list + _ASSERTE( FALSE ); + } + }; + + static _bstr_t g_strCase; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Find a matching element in the schema + cMessage::cMessageElement *pName = context.findElement( vName.bstrVal ); + if( pName == NULL ) + { + // The mask field was not found + _ASSERTE( pName != NULL ); + return NULL; + } + + // Create the mask element + std::auto_ptr< cSwitchElement > pSwitchElement( new cSwitchElement ); + pSwitchElement->m_pValue = pName; + + // Walk through each of the mask values + USES_CONVERSION; + + MSXML::IXMLDOMNodeListPtr pCaseList = pElement->selectNodes( g_strCase ); + for( MSXML::IXMLDOMElementPtr pCase = pCaseList->nextNode(); pCase.GetInterfacePtr() != NULL; pCase = pCaseList->nextNode() ) + { + _variant_t vValue = pCase->getAttribute( cMaskParser::g_strValue ); + if( vValue.vt != VT_BSTR ) + { + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Make sure it has the 'hex' prefix + if( vValue.bstrVal[ 0 ] != OLESTR( '0' ) ) + { + _ASSERTE( vValue.bstrVal[ 0 ] == OLESTR( '0' ) ); + return NULL; + } + + if( vValue.bstrVal[ 1 ] != OLESTR( 'x' ) ) + { + _ASSERTE( vValue.bstrVal[ 1 ] == OLESTR( 'x' ) ); + return NULL; + } + + // Attempt to convert the remaining number + long nCaseValue; + if( ::_stscanf( OLE2T( vValue.bstrVal + 2 ), _T( "%X" ), &nCaseValue ) != 1 ) + { + // Could not convert value + _ASSERTE( FALSE ); + return NULL; + } + + long nStartOffset = pSwitchElement->m_members.size(); + context.parseChildren( pSwitchElement->m_members, pCase ); + + cSwitchElement::cCase _case = { nCaseValue, nStartOffset, pSwitchElement->m_members.size() }; + pSwitchElement->m_cases.push_back( _case ); + } + + return pSwitchElement.release(); + } +}; + +_bstr_t cSwitchParser::g_strCase( _T( "case" ) ); + +class cAlignParser +: public cElementParser +{ +public: + class cAlignElement + : public cMessage::cMessageElement + { + public: + cFieldLoader *m_pLoader; + + virtual bool load( cMessage::cLoadContext &context ) + { + void *pAlign = m_pLoader->align( context.getMessage()->m_pEndCrack, context.getMessage()->m_pStartCrack ); + if( pAlign > context.getMessage()->m_pEndData ) + { + _ASSERTE( FALSE ); + return false; + } + + context.getMessage()->m_pEndCrack = reinterpret_cast< BYTE * >( pAlign ); + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + // This should never associate itself with a field + _ASSERTE( FALSE ); + } + }; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + // Locate the data type in the list + _variant_t strDataType = pElement->getAttribute( cFieldParser::g_strType ); + + if( strDataType.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strDataType.vt == VT_BSTR ); + return NULL; + } + + _bstr_t bstrDataType = strDataType; + + cFieldLoader *pField = cFieldLoader::lookup( bstrDataType ); + if( pField == NULL ) + { + _ASSERTE( FALSE ); + return NULL; + } + + cAlignElement *pAlignElement = new cAlignElement; + + pAlignElement->m_pLoader = pField; + return pAlignElement; + } +}; + +cMessage::cMessageElement *cElementParser::cContext::findElement( const _bstr_t &strElement ) +{ + for( cContext *pContext = this; pContext != NULL; pContext = pContext->m_pParent ) + { + for( cMessage::cElementList::iterator i = m_pElements->begin() + m_dwStartOffset; i != m_pElements->end(); ++ i ) + { + if( i->get()->m_strName == strElement ) + return i->get(); + } + } + + return NULL; +} + +bool cElementParser::cContext::parseChildren( MSXML::IXMLDOMElementPtr &pElement ) +{ + MSXML::IXMLDOMNodeListPtr pChildList = pElement->selectNodes( g_strAll ); + for( MSXML::IXMLDOMElementPtr pChild = pChildList->nextNode(); pChild.GetInterfacePtr() != NULL; pChild = pChildList->nextNode() ) + { + _bstr_t strElementName = pChild->tagName; + cElementParser *pParser = cElementParser::lookup( strElementName ); + if( pParser == NULL ) + { + // Could not find a parse for this element type + _ASSERTE( FALSE ); + return false; + } + + cMessage::cMessageElement *pElement = pParser->parse( *this, pChild ); + if( pElement == NULL ) + return false; + + m_pElements->push_back( cMessage::cElementList::value_type( pElement ) ); + } + + return true; +} + +_bstr_t cElementParser::cContext::g_strAll( _T( "*" ) ); + +bool cElementParser::cContext::parseChildren( cMessage::cElementList &elements, MSXML::IXMLDOMElementPtr &pElement ) +{ + cContext c( &elements, this ); + return c.parseChildren( pElement ); +} + +cElementParser *cElementParser::lookup( const _bstr_t &strElement ) +{ + cElementParserMap::iterator i = g_parsers.find( strElement ); + if( i == g_parsers.end() ) + return NULL; + + return i->second.get(); +} + +void cElementParser::init() +{ + addParser( _T( "field" ), new cFieldParser ); + addParser( _T( "maskmap" ), new cMaskParser ); + addParser( _T( "vector" ), new cVectorParser ); + addParser( _T( "switch" ), new cSwitchParser ); + addParser( _T( "align" ), new cAlignParser ); +} + +void cElementParser::term() +{ + g_parsers.clear(); +} + +void cElementParser::addParser( LPCTSTR szName, cElementParser *pParser ) +{ + g_parsers.insert( cElementParserMap::value_type( szName, std::auto_ptr< cElementParser >( pParser ) ) ); +} + +cElementParser::cElementParserMap cElementParser::g_parsers; diff --git a/Native/Inject/Attic/MessageParsers.cpp b/Native/Inject/Attic/MessageParsers.cpp new file mode 100644 index 0000000..b3470ad --- /dev/null +++ b/Native/Inject/Attic/MessageParsers.cpp @@ -0,0 +1,704 @@ +// MessageParsers.cpp +// Implementation of parsers and runtime objects for parsing message data + +#include "StdAfx.h" +#include "Inject.h" + +#include "MessageParsers.h" +#include "MessageLoaders.h" + +#include "MessageStruct.h" +#include "MessageVector.h" + +class cStructElement + : public cMessage::cMessageElement +{ +public: + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // Walk through the list of members and have them load + int nIndex = context.addField( this, NULL ); + + for( cMessage::cElementList::iterator i = m_members.begin(); i != m_members.end(); ++ i ) + { + if( !i->get()->load( cMessage::cLoadContext( &context ) ) ) + return false; + } + + // Update the field count + context.groupField( nIndex ); + return true; + } + + virtual void getValue( cMessage *pMessage, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + if( i->m_pDisp.p == NULL ) + { + // Create the vector object + CComObject< cMessageStruct > *pVecDisp; + CComObject< cMessageStruct >::CreateInstance( &pVecDisp ); + + pVecDisp->m_pSource = pMessage; + pVecDisp->m_dwStartIndex = ( i - pMessage->m_fields.begin() ); + + i->m_pDisp = pVecDisp; + } + + ::VariantInit (pDest); + pDest->vt = VT_DISPATCH; + pDest->pdispVal = i->m_pDisp; + pDest->pdispVal->AddRef(); + } +}; + +class cFieldParser +: public cElementParser +{ +public: + class cFieldElement + : public cMessage::cMessageElement + { + public: + cFieldLoader *m_pLoader; + + virtual bool load( cMessage::cLoadContext &context ) + { + if( !m_pLoader->testValue( context.getMessage()->m_pEndCrack, context.getMessage()->m_pEndData ) ) + { + // The element failed, this will usually indicate bad schema + _ASSERTE( FALSE ); + return false; + } + + context.addField( this, context.getMessage()->m_pEndCrack ); + context.getMessage()->m_pEndCrack = reinterpret_cast< BYTE * >( m_pLoader->skip( context.getMessage()->m_pEndCrack ) ); + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + m_pLoader->getValue( i->m_pvData, pDest ); + } + + virtual long getNumber( cMessage::cFieldList::iterator i ) + { + return m_pLoader->getNumber( i->m_pvData ); + } + }; + + // Strings + static _bstr_t g_strType; + static _bstr_t g_strName; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + // Locate the data type in the list + _variant_t strDataType = pElement->getAttribute( g_strType ); + + if( strDataType.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strDataType.vt == VT_BSTR ); + return NULL; + } + + _bstr_t bstrDataType = strDataType; + + cFieldLoader *pField = cFieldLoader::lookup( bstrDataType ); + if( pField == NULL ) + return parseStruct( context, pElement, bstrDataType ); + + _variant_t strName = pElement->getAttribute( g_strName ); + + if( strName.vt != VT_BSTR ) + { + _ASSERTE( strName.vt == VT_BSTR ); + return NULL; + } + + cFieldElement *pFieldElement = new cFieldElement; + + pFieldElement->m_strName = strName; + pFieldElement->m_pLoader = pField; + return pFieldElement; + } + + cMessage::cMessageElement *parseStruct( cContext &context, MSXML::IXMLDOMElementPtr &pElement, const _bstr_t &strType ) + { + // Locate the data type in the list + _variant_t strName = pElement->getAttribute( cFieldParser::g_strName ); + + if( strName.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strName.vt == VT_BSTR ); + return NULL; + } + + // We have the field name, now look up data type schema + USES_CONVERSION; + + TCHAR szQuery[ 255 ]; + ::_stprintf( szQuery, _T( "/schema/datatypes/type[@name='%s']" ), + OLE2T( strType ) ); + + MSXML::IXMLDOMElementPtr pStruct = pElement->ownerDocument->selectSingleNode( szQuery ); + if( pStruct.GetInterfacePtr() == NULL ) + { + // Could not cross reference the structure + _ASSERTE( pStruct.GetInterfacePtr() != NULL ); + return NULL; + } + + std::auto_ptr< cStructElement > pStructElement( new cStructElement() ); + pStructElement->m_strName = strName; + if( context.parseChildren( pStructElement->m_members, pStruct ) ) + return pStructElement.release(); + + return NULL; + } +}; + +_bstr_t cFieldParser::g_strType( _T( "type" ) ); +_bstr_t cFieldParser::g_strName( _T( "name" ) ); + +class cMaskParser +: public cElementParser +{ +public: + class cMaskElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pValue; + + class cMask + { + public: + DWORD m_dwValue; + DWORD m_dwFirstChild, + m_dwLastChild; + }; + + typedef std::vector< cMask > cMaskMap; + + cMaskMap m_masks; + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pValue ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return false; + } + + _ASSERT( iField->m_pSchema == m_pValue ); + + long nMaskValue = iField->m_pSchema->getNumber( iField ); + + // Walk through the mask values and load all of the fields in range + for( cMaskMap::iterator i = m_masks.begin(); i != m_masks.end(); ++ i ) + { + if( ( nMaskValue & i->m_dwValue ) == 0 ) + continue; + + // THis is a valid mask load up all teh fields in range + cMessage::cElementList::iterator m_end = m_members.begin() + i->m_dwLastChild; + for( cMessage::cElementList::iterator j = m_members.begin() + i->m_dwFirstChild; j != m_end; ++ j ) + { + if( !j->get()->load( context ) ) + return false; + } + } + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator, LPVARIANT ) + { + // This element should never insert itself into the message list + _ASSERTE( FALSE ); + } + }; + + static _bstr_t g_strMask; + static _bstr_t g_strValue; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Find a matching element in the schema + cMessage::cMessageElement *pName = context.findElement( vName.bstrVal ); + if( pName == NULL ) + { + // The mask field was not found + _ASSERTE( pName != NULL ); + return NULL; + } + + // Create the mask element + std::auto_ptr< cMaskElement > pMaskElement( new cMaskElement ); + pMaskElement->m_pValue = pName; + + // Walk through each of the mask values + USES_CONVERSION; + + MSXML::IXMLDOMNodeListPtr pMaskList = pElement->selectNodes( g_strMask ); + for( MSXML::IXMLDOMElementPtr pMask = pMaskList->nextNode(); pMask.GetInterfacePtr() != NULL; pMask = pMaskList->nextNode() ) + { + _variant_t vValue = pMask->getAttribute( g_strValue ); + if( vValue.vt != VT_BSTR ) + { + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Make sure it has the 'hex' prefix + if( vValue.bstrVal[ 0 ] != OLESTR( '0' ) ) + { + _ASSERTE( vValue.bstrVal[ 0 ] == OLESTR( '0' ) ); + return NULL; + } + + if( vValue.bstrVal[ 1 ] != OLESTR( 'x' ) ) + { + _ASSERTE( vValue.bstrVal[ 1 ] == OLESTR( 'x' ) ); + return NULL; + } + + // Attempt to convert the remaining number + long nMaskValue; + if( ::_stscanf( OLE2T( vValue.bstrVal + 2 ), _T( "%X" ), &nMaskValue ) != 1 ) + { + // Could not convert value + _ASSERTE( FALSE ); + return NULL; + } + + long nStartOffset = pMaskElement->m_members.size(); + context.parseChildren( pMaskElement->m_members, pMask ); + + cMaskElement::cMask mask = { nMaskValue, nStartOffset, pMaskElement->m_members.size() }; + pMaskElement->m_masks.push_back( mask ); + } + + return pMaskElement.release(); + } +}; + +_bstr_t cMaskParser::g_strMask( _T( "mask" ) ); +_bstr_t cMaskParser::g_strValue( _T( "value" ) ); + +class cVectorParser +: public cElementParser +{ +public: + class cVectorElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pLength; + std::auto_ptr< cMessage::cMessageElement > m_pStruct; + int m_nSkip; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pLength ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return NULL; + } + + _ASSERT( iField->m_pSchema == m_pLength ); + + long nLength = iField->m_pSchema->getNumber( iField ) - m_nSkip; + + // Insert a record for ourself + DWORD dwIndex = context.addField( this, NULL ); + + for( int i = 0; i < nLength; ++ i ) + { + // Insert a record for the current struct + if( !m_pStruct->load( cMessage::cLoadContext( &context ) ) ) + return false; + } + + // Update the used field count + context.groupField( dwIndex ); + return true; + } + + virtual void getValue( cMessage *pMessage, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + if( i->m_pDisp.p == NULL ) + { + // Create the vector object + CComObject< cMessageVector > *pVecDisp; + CComObject< cMessageVector >::CreateInstance( &pVecDisp ); + + pVecDisp->m_pSource = pMessage; + pVecDisp->m_dwStartIndex = ( i - pMessage->m_fields.begin() ); + + i->m_pDisp = pVecDisp; + } + + ::VariantInit (pDest); + + pDest->vt = VT_DISPATCH; + pDest->pdispVal = i->m_pDisp; + pDest->pdispVal->AddRef(); + } + }; + + static _bstr_t g_strLength, + g_strSkip; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + _variant_t vLength = pElement->getAttribute( g_strLength ), + vSkip = pElement->getAttribute( g_strSkip ); + if( vLength.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vLength.vt == VT_BSTR ); + return NULL; + } + + long nSkip = 0; + if( vSkip.vt != VT_NULL ) + { + try + { + nSkip = vSkip; + } + catch( ... ) + { + // Failed to make the conversion + _ASSERT( FALSE ); + return NULL; + } + } + + cMessage::cMessageElement *pLength = context.findElement( vLength.bstrVal ); + if( pLength == NULL ) + { + // The mask field was not found + _ASSERTE( pLength != NULL ); + return NULL; + } + + std::auto_ptr< cStructElement > pStructElement( new cStructElement ); + + if( !context.parseChildren( pStructElement->m_members, pElement ) ) + return NULL; + + cVectorElement *pVector = new cVectorElement; + pVector->m_strName = vName; + pVector->m_pLength = pLength; + pVector->m_nSkip = nSkip; + pVector->m_pStruct = std::auto_ptr< cMessage::cMessageElement >( pStructElement.release() ); + + return pVector; + } +}; + +_bstr_t cVectorParser::g_strLength( _T( "length" ) ); +_bstr_t cVectorParser::g_strSkip( _T( "skip" ) ); + +class cSwitchParser +: public cElementParser +{ +public: + class cSwitchElement + : public cMessage::cMessageElement + { + public: + cMessage::cMessageElement *m_pValue; + + class cCase + { + public: + DWORD m_dwValue; + DWORD m_dwFirstChild, + m_dwLastChild; + }; + + typedef std::vector< cCase > cCaseMap; + + cCaseMap m_cases; + cMessage::cElementList m_members; + + virtual bool load( cMessage::cLoadContext &context ) + { + // First, look for our value element in the message + cMessage::cFieldList::iterator iField = context.lookupField( m_pValue ); + if( iField == context.getMessage()->m_fields.end() ) + { + // Could not find a mask source - most likely a bad name of some kind + _ASSERTE( FALSE ); + return NULL; + } + + _ASSERT( iField->m_pSchema == m_pValue ); + + long nCaseValue = iField->m_pSchema->getNumber( iField ); + + // Walk through the mask values and load all of the fields in range + for( cCaseMap::iterator i = m_cases.begin(); i != m_cases.end(); ++ i ) + { + if( nCaseValue != i->m_dwValue ) + continue; + + // This is a valid mask load up all teh fields in range + cMessage::cElementList::iterator m_end = m_members.begin() + i->m_dwLastChild; + for( cMessage::cElementList::iterator j = m_members.begin() + i->m_dwFirstChild; j != m_end; ++ j ) + { + if( !j->get()->load( context ) ) + return false; + } + + // For now we short circuit cases + break; + } + + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator, LPVARIANT ) + { + // This element should never insert itself into the message list + _ASSERTE( FALSE ); + } + }; + + static _bstr_t g_strCase; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + _variant_t vName = pElement->getAttribute( cFieldParser::g_strName ); + if( vName.vt != VT_BSTR ) + { + // It must have the name field + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Find a matching element in the schema + cMessage::cMessageElement *pName = context.findElement( vName.bstrVal ); + if( pName == NULL ) + { + // The mask field was not found + _ASSERTE( pName != NULL ); + return NULL; + } + + // Create the mask element + std::auto_ptr< cSwitchElement > pSwitchElement( new cSwitchElement ); + pSwitchElement->m_pValue = pName; + + // Walk through each of the mask values + USES_CONVERSION; + + MSXML::IXMLDOMNodeListPtr pCaseList = pElement->selectNodes( g_strCase ); + for( MSXML::IXMLDOMElementPtr pCase = pCaseList->nextNode(); pCase.GetInterfacePtr() != NULL; pCase = pCaseList->nextNode() ) + { + _variant_t vValue = pCase->getAttribute( cMaskParser::g_strValue ); + if( vValue.vt != VT_BSTR ) + { + _ASSERTE( vName.vt == VT_BSTR ); + return NULL; + } + + // Make sure it has the 'hex' prefix + if( vValue.bstrVal[ 0 ] != OLESTR( '0' ) ) + { + _ASSERTE( vValue.bstrVal[ 0 ] == OLESTR( '0' ) ); + return NULL; + } + + if( vValue.bstrVal[ 1 ] != OLESTR( 'x' ) ) + { + _ASSERTE( vValue.bstrVal[ 1 ] == OLESTR( 'x' ) ); + return NULL; + } + + // Attempt to convert the remaining number + long nCaseValue; + if( ::_stscanf( OLE2T( vValue.bstrVal + 2 ), _T( "%X" ), &nCaseValue ) != 1 ) + { + // Could not convert value + _ASSERTE( FALSE ); + return NULL; + } + + long nStartOffset = pSwitchElement->m_members.size(); + context.parseChildren( pSwitchElement->m_members, pCase ); + + cSwitchElement::cCase _case = { nCaseValue, nStartOffset, pSwitchElement->m_members.size() }; + pSwitchElement->m_cases.push_back( _case ); + } + + return pSwitchElement.release(); + } +}; + +_bstr_t cSwitchParser::g_strCase( _T( "case" ) ); + +class cAlignParser +: public cElementParser +{ +public: + class cAlignElement + : public cMessage::cMessageElement + { + public: + cFieldLoader *m_pLoader; + + virtual bool load( cMessage::cLoadContext &context ) + { + void *pAlign = m_pLoader->align( context.getMessage()->m_pEndCrack, context.getMessage()->m_pStartCrack ); + if( pAlign > context.getMessage()->m_pEndData ) + { + _ASSERTE( FALSE ); + return false; + } + + context.getMessage()->m_pEndCrack = reinterpret_cast< BYTE * >( pAlign ); + return true; + } + + virtual void getValue( cMessage *, cMessage::cFieldList::iterator i, LPVARIANT pDest ) + { + // This should never associate itself with a field + _ASSERTE( FALSE ); + } + }; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) + { + // Locate the data type in the list + _variant_t strDataType = pElement->getAttribute( cFieldParser::g_strType ); + + if( strDataType.vt != VT_BSTR ) + { + // Schema error + _ASSERTE( strDataType.vt == VT_BSTR ); + return NULL; + } + + _bstr_t bstrDataType = strDataType; + + cFieldLoader *pField = cFieldLoader::lookup( bstrDataType ); + if( pField == NULL ) + { + _ASSERTE( FALSE ); + return NULL; + } + + cAlignElement *pAlignElement = new cAlignElement; + + pAlignElement->m_pLoader = pField; + return pAlignElement; + } +}; + +cMessage::cMessageElement *cElementParser::cContext::findElement( const _bstr_t &strElement ) +{ + for( cContext *pContext = this; pContext != NULL; pContext = pContext->m_pParent ) + { + for( cMessage::cElementList::iterator i = m_pElements->begin() + m_dwStartOffset; i != m_pElements->end(); ++ i ) + { + if( i->get()->m_strName == strElement ) + return i->get(); + } + } + + return NULL; +} + +bool cElementParser::cContext::parseChildren( MSXML::IXMLDOMElementPtr &pElement ) +{ + MSXML::IXMLDOMNodeListPtr pChildList = pElement->selectNodes( g_strAll ); + for( MSXML::IXMLDOMElementPtr pChild = pChildList->nextNode(); pChild.GetInterfacePtr() != NULL; pChild = pChildList->nextNode() ) + { + _bstr_t strElementName = pChild->tagName; + cElementParser *pParser = cElementParser::lookup( strElementName ); + if( pParser == NULL ) + { + // Could not find a parse for this element type + _ASSERTE( FALSE ); + return false; + } + + cMessage::cMessageElement *pElement = pParser->parse( *this, pChild ); + if( pElement == NULL ) + return false; + + m_pElements->push_back( cMessage::cElementList::value_type( pElement ) ); + } + + return true; +} + +_bstr_t cElementParser::cContext::g_strAll( _T( "*" ) ); + +bool cElementParser::cContext::parseChildren( cMessage::cElementList &elements, MSXML::IXMLDOMElementPtr &pElement ) +{ + cContext c( &elements, this ); + return c.parseChildren( pElement ); +} + +cElementParser *cElementParser::lookup( const _bstr_t &strElement ) +{ + cElementParserMap::iterator i = g_parsers.find( strElement ); + if( i == g_parsers.end() ) + return NULL; + + return i->second.get(); +} + +void cElementParser::init() +{ + addParser( _T( "field" ), new cFieldParser ); + addParser( _T( "maskmap" ), new cMaskParser ); + addParser( _T( "vector" ), new cVectorParser ); + addParser( _T( "switch" ), new cSwitchParser ); + addParser( _T( "align" ), new cAlignParser ); +} + +void cElementParser::term() +{ + g_parsers.clear(); +} + +void cElementParser::addParser( LPCTSTR szName, cElementParser *pParser ) +{ + g_parsers.insert( cElementParserMap::value_type( szName, std::auto_ptr< cElementParser >( pParser ) ) ); +} + +cElementParser::cElementParserMap cElementParser::g_parsers; diff --git a/Native/Inject/Attic/MessageParsers.h b/Native/Inject/Attic/MessageParsers.h new file mode 100644 index 0000000..faba9bb --- /dev/null +++ b/Native/Inject/Attic/MessageParsers.h @@ -0,0 +1,48 @@ +// MessageParsers.h +// Declaration of class cMessageParser - base class for parsing the +// XML Schema + +#ifndef __MESSAGEPARSERS_H +#define __MESSAGEPARSERS_H + +#include "Message.h" + +class cElementParser +{ +public: + class cContext + { + cContext *m_pParent; + cMessage::cElementList *m_pElements; + DWORD m_dwStartOffset; + + public: + cContext( cMessage::cElementList *pElements, cContext *pParent = NULL ) + : m_pParent( pParent ), + m_pElements( pElements ), + m_dwStartOffset( pElements->size() ) + { + } + + cMessage::cMessageElement *findElement( const _bstr_t &strElement ); + bool parseChildren( MSXML::IXMLDOMElementPtr &pElement ); + bool parseChildren( cMessage::cElementList &elements, MSXML::IXMLDOMElementPtr &pElement ); + + static _bstr_t g_strAll; + }; + + virtual cMessage::cMessageElement *parse( cContext &context, MSXML::IXMLDOMElementPtr &pElement ) = 0; + + static cElementParser *lookup( const _bstr_t &strElement ); + + static void init(); + static void term(); + +private: + static void addParser( LPCTSTR szElement, cElementParser *pParser ); + + typedef std::map< _bstr_t, std::auto_ptr< cElementParser > > cElementParserMap; + static cElementParserMap g_parsers; +}; + +#endif diff --git a/Native/Inject/Attic/MessageStruct.cpp b/Native/Inject/Attic/MessageStruct.cpp new file mode 100644 index 0000000..99641c8 --- /dev/null +++ b/Native/Inject/Attic/MessageStruct.cpp @@ -0,0 +1,93 @@ +// MessageStruct.cpp : Implementation of cMessageStruct +#include "stdafx.h" +#include "Inject.h" +#include "MessageStruct.h" + +#include "Message.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageStruct + + +STDMETHODIMP cMessageStruct::get_Count(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = i_begin + i_begin->m_nOwns; + + *pVal = 0; + + for( cMessage::cFieldList::iterator i = i_begin + 1; i != i_end; i += i->m_nOwns ) + ++ ( *pVal ); + + return S_OK; +} + +STDMETHODIMP cMessageStruct::get_MemberName(long Index, BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + _ASSERTE( Index >= 0 ); + + USES_CONVERSION; + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = i_begin + i_begin->m_nOwns; + + for( cMessage::cFieldList::iterator i = i_begin + 1; i != i_end; i += i->m_nOwns, -- Index ) + { + if( Index == 0 ) + { + *pVal = OLE2BSTR( i->m_pSchema->m_strName ); + return S_OK; + } + } + + _ASSERTE( FALSE ); + return E_INVALIDARG; +} + +STDMETHODIMP cMessageStruct::get_Member(VARIANT vIndex, VARIANT *pVal) +{ + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = i_begin + i_begin->m_nOwns; + + if( vIndex.vt == VT_BSTR ) + { + _bstr_t bstrIndex = vIndex; + for( cMessage::cFieldList::iterator i = i_begin + 1; i != i_end; i += i->m_nOwns ) + { + if( bstrIndex == i->m_pSchema->m_strName ) + { + i->m_pSchema->getValue( m_pSource, i, pVal ); + return S_OK; + } + } + } + + HRESULT hRes = ::VariantChangeType( &vIndex, &vIndex, 0, VT_I4 ); + if( FAILED( hRes ) ) + { + _ASSERTE( FALSE ); + return hRes; + } + + // Check if the value is in range + long nIndex = vIndex.lVal; + if( nIndex < 0 ) + { + _ASSERTE( nIndex >= 0 ); + return E_INVALIDARG; + } + + for( cMessage::cFieldList::iterator i = i_begin + 1; i != i_end; i += i->m_nOwns, -- nIndex ) + { + if( nIndex == 0 ) + { + i->m_pSchema->getValue( m_pSource, i, pVal ); + return S_OK; + } + } + + return S_OK; +} diff --git a/Native/Inject/Attic/MessageStruct.h b/Native/Inject/Attic/MessageStruct.h new file mode 100644 index 0000000..b9a7766 --- /dev/null +++ b/Native/Inject/Attic/MessageStruct.h @@ -0,0 +1,36 @@ +// MessageStruct.h : Declaration of the cMessageStruct + +#ifndef __MESSAGESTRUCT_H_ +#define __MESSAGESTRUCT_H_ + +#include "resource.h" // main symbols + +class cMessage; + +///////////////////////////////////////////////////////////////////////////// +// cMessageStruct +class ATL_NO_VTABLE cMessageStruct : + public IDispatchImpl, + public CComObjectRootEx +{ +public: + cMessageStruct() + { + } + + cMessage *m_pSource; + DWORD m_dwStartIndex; + +BEGIN_COM_MAP(cMessageStruct) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IMessageMember) +END_COM_MAP() + +// IMessageStruct +public: + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_MemberName)(long Index, /*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Member)(VARIANT vIndex, /*[out, retval]*/ VARIANT *pVal); +}; + +#endif //__MESSAGESTRUCT_H_ diff --git a/Native/Inject/Attic/MessageStruct.rgs b/Native/Inject/Attic/MessageStruct.rgs new file mode 100644 index 0000000..f66c9e3 --- /dev/null +++ b/Native/Inject/Attic/MessageStruct.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Inject.MessageStruct.1 = s 'MessageStruct Class' + { + CLSID = s '{5F1C583E-FDAB-4751-85BA-1178E9360E39}' + } + Inject.MessageStruct = s 'MessageStruct Class' + { + CLSID = s '{5F1C583E-FDAB-4751-85BA-1178E9360E39}' + CurVer = s 'Inject.MessageStruct.1' + } + NoRemove CLSID + { + ForceRemove {5F1C583E-FDAB-4751-85BA-1178E9360E39} = s 'MessageStruct Class' + { + ProgID = s 'Inject.MessageStruct.1' + VersionIndependentProgID = s 'Inject.MessageStruct' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/Inject/Attic/MessageVector.cpp b/Native/Inject/Attic/MessageVector.cpp new file mode 100644 index 0000000..8755c3a --- /dev/null +++ b/Native/Inject/Attic/MessageVector.cpp @@ -0,0 +1,75 @@ +// MessageVector.cpp : Implementation of cMessageVector + +#include "stdafx.h" +#include "Inject.h" +#include "MessageVector.h" + +#include "Message.h" + +///////////////////////////////////////////////////////////////////////////// +// cMessageVector + +STDMETHODIMP cMessageVector::get_MemberName(long nIndex, BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + _ASSERTE( nIndex >= 0 ); + + USES_CONVERSION; + + TCHAR strIndex[ 12 ]; + ::_stprintf( strIndex, _T( "%i" ), nIndex ); + + *pVal = T2BSTR( strIndex ); + + return S_OK; +} + +STDMETHODIMP cMessageVector::get_Count(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = i_begin + i_begin->m_nOwns; + + *pVal = 0; + + for( cMessage::cFieldList::iterator i = i_begin + 1; i != i_end; i += i->m_nOwns ) + ++ ( *pVal ); + + return S_OK; +} + +STDMETHODIMP cMessageVector::get_Member(VARIANT vIndex, VARIANT *pVal) +{ + _ASSERTE( pVal != NULL ); + + HRESULT hRes = ::VariantChangeType( &vIndex, &vIndex, 0, VT_I4 ); + if( FAILED( hRes ) ) + { + _ASSERTE( FALSE ); + return hRes; + } + + // Check if the value is in range + long Index = vIndex.lVal; + if( Index < 0 ) + { + _ASSERTE( Index >= 0 ); + return E_INVALIDARG; + } + + cMessage::cFieldList::iterator i_begin = m_pSource->m_fields.begin() + m_dwStartIndex; + cMessage::cFieldList::iterator i_end = i_begin + i_begin->m_nOwns; + + for( cMessage::cFieldList::iterator i = i_begin + 1; i != i_end; i += i->m_nOwns, -- Index ) + { + if( Index == 0 ) + { + i->m_pSchema->getValue( m_pSource, i, pVal ); + return S_OK; + } + } + + _ASSERTE( FALSE ); + return E_INVALIDARG; +} diff --git a/Native/Inject/Attic/MessageVector.h b/Native/Inject/Attic/MessageVector.h new file mode 100644 index 0000000..979c761 --- /dev/null +++ b/Native/Inject/Attic/MessageVector.h @@ -0,0 +1,37 @@ +// MessageVector.h : Declaration of the cMessageVector + +#ifndef __MESSAGEVECTOR_H_ +#define __MESSAGEVECTOR_H_ + +#include "resource.h" // main symbols +#include "Message.h" + +class cMessage; + +///////////////////////////////////////////////////////////////////////////// +// cMessageVector +class ATL_NO_VTABLE cMessageVector : + public IDispatchImpl, + public CComObjectRootEx +{ +public: + cMessageVector() + { + } + + cMessage *m_pSource; + DWORD m_dwStartIndex; + +BEGIN_COM_MAP(cMessageVector) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IMessageMember) +END_COM_MAP() + +// IMessageVector +public: + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Member)(VARIANT vIndex, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(get_MemberName)(long Index, BSTR *pVal); +}; + +#endif //__MESSAGEVECTOR_H_ diff --git a/Native/Inject/Attic/MessageVector.rgs b/Native/Inject/Attic/MessageVector.rgs new file mode 100644 index 0000000..11e2f6c --- /dev/null +++ b/Native/Inject/Attic/MessageVector.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Inject.MessageVector.1 = s 'MessageVector Class' + { + CLSID = s '{7D1D98C1-B850-4B7F-B0DD-CE221F3FD132}' + } + Inject.MessageVector = s 'MessageVector Class' + { + CLSID = s '{7D1D98C1-B850-4B7F-B0DD-CE221F3FD132}' + CurVer = s 'Inject.MessageVector.1' + } + NoRemove CLSID + { + ForceRemove {7D1D98C1-B850-4B7F-B0DD-CE221F3FD132} = s 'MessageVector Class' + { + ProgID = s 'Inject.MessageVector.1' + VersionIndependentProgID = s 'Inject.MessageVector' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/Inject/Attic/ProtocolStack.cpp b/Native/Inject/Attic/ProtocolStack.cpp new file mode 100644 index 0000000..45fcc4a --- /dev/null +++ b/Native/Inject/Attic/ProtocolStack.cpp @@ -0,0 +1,210 @@ +// ProtocolStack.cpp +// Implementation of class cProtocolStack + +#include "stdafx.h" +#include "ProtocolStack.h" + +cMessageStack::cMessage::cMessage( BYTE *pbData ) +: m_pbData( NULL ), +m_bOwn( false ) +{ + cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pbData ); + + if( pHeader->m_wFragmentCount == 1 ) + { + // This is the only fragment, we use a direct pointer for dispatching + m_pbData = pbData; + return; + } + + // This message has multiple fragments, create a buffer + m_pbData = new BYTE[ calcMessageLength( pbData ) ]; + + // Two initializers, with + // Copy the header into the new buffer + ::memcpy( m_pbData, pbData, sizeof( cMessageHeader ) ); + + // First calculate the number of fragments we should have + m_FragmentMask.SetSize (pHeader->m_wFragmentCount); + + insertFragment( pbData ); +} + +cMessageStack::cMessage::cMessage( const cMessage &msg ) +: m_pbData( msg.m_pbData ), +m_bOwn( msg.m_bOwn ) +{ + m_FragmentMask = msg.m_FragmentMask; + msg.m_bOwn = false; +} + +cMessageStack::cMessage::~cMessage() +{ + if( m_bOwn ) + delete[] m_pbData; +} + +cMessageStack::cMessage &cMessageStack::cMessage::operator= ( const cMessage &msg ) +{ + if( m_bOwn ) + delete[] m_pbData; + + m_pbData = msg.m_pbData; + m_FragmentMask = msg.m_FragmentMask; + m_bOwn = msg.m_bOwn; + + msg.m_bOwn = false; + + return *this; +} + +bool cMessageStack::cMessage::fragmentMatch( BYTE *pFragmentStart ) +{ + cMessageHeader *pThis = getMessageHeader(), + *pOther = reinterpret_cast< cMessageHeader * >( pFragmentStart ); + + return ( pThis->m_dwObjectID == pOther->m_dwObjectID && pThis->m_dwSequence == pOther->m_dwSequence ); +} + +#define MESSAGE_BODY 448 + +void cMessageStack::cMessage::insertFragment( BYTE *pFragmentStart ) +{ + cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart ); + + BYTE *pInsertLocation = m_pbData + sizeof( cMessageHeader ) + ( MESSAGE_BODY * pHeader->m_wFragmentIndex ); + + ::memcpy( pInsertLocation, pFragmentStart + sizeof( cMessageHeader ), pHeader->m_wFragmentLength - sizeof( cMessageHeader ) ); + + m_FragmentMask.GotFragment (pHeader->m_wFragmentIndex); + + if( pHeader->m_wFragmentIndex == ( pHeader->m_wFragmentCount - 1 ) ) + getMessageHeader()->m_wFragmentLength = ( pHeader->m_wFragmentCount - 1 ) * MESSAGE_BODY + pHeader->m_wFragmentLength; +} + +DWORD cMessageStack::cMessage::calcMessageLength( BYTE *pFragmentStart ) +{ + cMessageHeader *pHeader = reinterpret_cast< cMessageHeader * >( pFragmentStart ); + + return ( pHeader->m_wFragmentIndex == ( pHeader->m_wFragmentCount - 1 ) ) ? + ( pHeader->m_wFragmentCount - 1 ) * MESSAGE_BODY + pHeader->m_wFragmentLength : pHeader->m_wFragmentCount * MESSAGE_BODY + sizeof( cMessageHeader ); +} + +cMessageStack::cMessageStack() +: m_pCallback( NULL ) +{ +} + +cMessageStack::~cMessageStack() +{ + // Make sure we clean up and intermediate steps + stop(); +} + +void cMessageStack::start( cCallback *pCallback ) +{ + // Setting this enables messages + m_pCallback = pCallback; +} + +void cMessageStack::stop() +{ + // Clean out the message list since these will never be matched + m_messages.clear(); + m_pCallback = NULL; +} + +void cMessageStack::processPacket( DWORD dwLength, BYTE *pbPayload ) +{ + // First filter based on our status and the message type + if( m_pCallback == NULL ) + // We currently only support send or receive type messages + return; + + // AC messages must be at least as big as a packet header.+ a message header + if (dwLength < (sizeof (cPacketHeader) + sizeof (cMessageHeader))) + { + return; + } + + // Filter non-application messages + cPacketHeader *pHeader = reinterpret_cast< cPacketHeader * >( pbPayload ); + + if((pHeader->m_wTotalSize) != (dwLength - sizeof(cPacketHeader))) + { + return; + } + + DWORD dwOffset = 0; + if (pHeader->m_dwFlags & 0x00100000) + { + // 8 extra header bytes + dwOffset += 8; + } + if (pHeader->m_dwFlags & 0x00200000) + { + // 6 extra header bytes + dwOffset += 6; + } + if (pHeader->m_dwFlags & 0x00400000) + { + // 0 extra header bytes + } + if (pHeader->m_dwFlags & 0x00800000) + { + // 4 extra header bytes + dwOffset += 4; + } + + if (dwLength < (dwOffset + sizeof (cMessageHeader))) + { + return; + } + + splitPacket( dwLength - dwOffset, pbPayload + dwOffset ); +} + +void cMessageStack::splitPacket( DWORD dwLength, BYTE *pbPayload ) +{ + DWORD dwFragLength = 0; + BYTE *i_end_packet = pbPayload + dwLength; + + for( BYTE *iFrag = pbPayload + sizeof( cPacketHeader ); iFrag != i_end_packet; iFrag += dwFragLength ) + { + dwFragLength = reinterpret_cast< cMessageHeader * >( iFrag )->m_wFragmentLength; + + if( dwFragLength == 0 || ( iFrag + dwFragLength ) > i_end_packet ) + // We are off the end somehow + return; + + // First walk through our cached fragments and see if one will take this fragment + for( cMessageList::iterator i = m_messages.begin(); i != m_messages.end(); ++ i ) + { + if( i->fragmentMatch( iFrag ) ) + { + i->insertFragment( iFrag ); + if( i->isComplete() ) + { + // Remove it from the list and dispatch the message + m_pCallback->onMessage( *i ); + m_messages.erase( i ); + } + break; + } + } + + if( i != m_messages.end() ) + // The fragment was found in the list + continue; + + // Ok, we have a new fragment on our hands - generate the fragment object + cMessage msg( iFrag ); + + if( msg.isComplete() ) + // It's only one piece, dispatch right away + m_pCallback->onMessage( msg ); + else + // This requires more parts add it into the queue to wait + m_messages.push_back( msg ); + } +} diff --git a/Native/Inject/Attic/ProtocolStack.h b/Native/Inject/Attic/ProtocolStack.h new file mode 100644 index 0000000..c8a00cd --- /dev/null +++ b/Native/Inject/Attic/ProtocolStack.h @@ -0,0 +1,159 @@ +// ProtocolStack.h +// Declaration of class cProtocolStack + +#ifndef __PROTOCOLSTACK_H +#define __PROTOCOLSTACK_H + +#include // For assertions + +#define DEFAULT_HEADER_SIZE 16 +#define FRAGMENT_SIZE 448 + +#define MAX_FRAGMENT_COUNT 1024 + +#pragma pack( push, 1 ) +// The packet header +struct cPacketHeader +{ + DWORD m_dwSequence; + DWORD m_dwFlags; + DWORD m_dwCRC; + + WORD m_wUnk1; + WORD m_wUnk2; + WORD m_wTotalSize; + WORD m_wUnk3; +}; +#pragma pack( pop ) + + +class FragmentMask +{ +public: + FragmentMask () { ::memset (m_mask, 0, sizeof (m_mask)); m_size = 0; } + + void SetSize (WORD wSize) + { + _ASSERTE (wSize < MAX_FRAGMENT_COUNT); + m_size = wSize; + + ::memset (m_mask, 0, sizeof (m_mask)); + for (WORD wIndex = 0; wIndex < wSize; ++wIndex) + { + m_mask[wIndex/32] |= (1L << (wIndex % 32)); + } + } + + void GotFragment (WORD wWhich) + { + _ASSERTE (wWhich < m_size && wWhich >= 0); + + m_mask[wWhich/32] &= ~(1 << (wWhich % 32)); + } + + bool IsComplete () + { + for (WORD wLoop = 0; wLoop < (FRAGMENT_SIZE/32); ++wLoop) + { + if (m_mask[wLoop]) + { + return false; + } + } + + return true; + } + +private: + DWORD m_mask[FRAGMENT_SIZE/32]; + WORD m_size; +}; + +class cMessageStack +{ +public: +#pragma pack( push, 1 ) + struct cMessageHeader + { + DWORD m_dwSequence; + DWORD m_dwObjectID; + WORD m_wFragmentCount; + WORD m_wFragmentLength; + WORD m_wFragmentIndex, + m_wUnknown1; + }; +#pragma pack( pop ) + + class cMessage + { + protected: +// DWORD m_dwFragmentsMask; + BYTE *m_pbData; + mutable bool m_bOwn; + mutable FragmentMask m_FragmentMask; + + public: + cMessage( BYTE *pbData ); + cMessage( const cMessage &msg ); + ~cMessage(); + + cMessageHeader *getMessageHeader() const + { + return reinterpret_cast< cMessageHeader * >( m_pbData ); + } + + cMessage &operator= ( const cMessage &msg ); + + BYTE *getBody() const + { + return m_pbData + sizeof( cMessageHeader ); + } + + DWORD getBodyLength() const + { + return getMessageHeader()->m_wFragmentLength - sizeof( cMessageHeader ); + } + + bool isComplete() const + { + return m_FragmentMask.IsComplete (); + } + + DWORD getMessageCode() const + { + return *reinterpret_cast< DWORD * >( m_pbData + sizeof( cMessageHeader ) ); + } + + bool fragmentMatch( BYTE *pFragmentStart ); + void insertFragment( BYTE *pFragmentStart ); + + static DWORD calcMessageLength( BYTE *pbHeader ); + }; + + // Objects wishing to receive + class cCallback + { + public: + virtual void onMessage( cMessage & ) = 0; + }; + +private: + typedef std::list< cMessage > cMessageList; + + cCallback *m_pCallback; + cMessageList m_messages; + +public: + cMessageStack(); + ~cMessageStack(); + + void start( cCallback * ); + void stop(); + + void processPacket( DWORD dwLength, BYTE *pbPayload ); + +private: + void splitPacket( DWORD dwLength, BYTE *pbPayload ); +}; + +#endif diff --git a/Native/Inject/Attic/dlldata.c b/Native/Inject/Attic/dlldata.c new file mode 100644 index 0000000..39b253e --- /dev/null +++ b/Native/Inject/Attic/dlldata.c @@ -0,0 +1,38 @@ +/********************************************************* + DllData file -- generated by MIDL compiler + + DO NOT ALTER THIS FILE + + This file is regenerated by MIDL on every IDL file compile. + + To completely reconstruct this file, delete it and rerun MIDL + on all the IDL files in this DLL, specifying this file for the + /dlldata command line option + +*********************************************************/ + +#define PROXY_DELEGATION + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +EXTERN_PROXY_FILE( Inject ) + + +PROXYFILE_LIST_START +/* Start of list */ + REFERENCE_PROXY_FILE( Inject ), +/* End of list */ +PROXYFILE_LIST_END + + +DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID ) + +#ifdef __cplusplus +} /*extern "C" */ +#endif + +/* end of generated dlldata file */ diff --git a/Native/Inject/BarLayer.cpp b/Native/Inject/BarLayer.cpp new file mode 100644 index 0000000..64831f8 --- /dev/null +++ b/Native/Inject/BarLayer.cpp @@ -0,0 +1,1128 @@ +// BarLayer.cpp : Implementation of cBarLayer +#include "stdafx.h" +#include "Inject.h" +#include "BarLayer.h" +#include "Manager.h" +#include "SimpleBar.h" + +///////////////////////////////////////////////////////////////////////////// +// cBarLayer + +// Drakier: Added constants for Panel and Radar size +const int RADAR_SIZE = 110; +const int PANEL_SIZE = 308; +const int VITALS_SIZE = 28; +const int CHATBAR_SIZE = 101; +const int CHATBAR_MAX_SIZE = 259; +const int LOOT_SIZE = 101; +const int BUTTON_SIZE = 16; +const int MINBAR_SIZE = 20; +int MAXBAR_SIZE = 100; + +// Drakier: Added constants for docking position +const int DOCK_TOP = 0; +const int DOCK_LEFT = 1; +const int DOCK_RIGHT = 2; + +enum eChildID +{ + eBtnForwards = 1, + eBtnBackwards = 2, + ePager = 3, + eBtnMinMax = 4, + eBtnDockCycle = 5, + eChildBarFirst = 1000 +}; + +cBarLayer::cBarLayer() : m_nBarStartPos( 0 ), m_nBarDock( DOCK_TOP ), m_nScreenWidth( 0 ), m_nScreenHeight( 0 ), m_nBarLength( 0 ), m_nPosition( 0 ), m_nDragging( 0 ), m_nMinMax( eStateMax ) +{ +} + +void cBarLayer::onCreate() +{ + //::MessageBox( NULL, _T( "cBarLayer::onCreate" ), _T( "Inject.dll" ), MB_OK ); + m_pSite->get_PluginSite( &m_pPlugin ); + + if (!cManager::_p->m_bContainer) + m_pPlugin->get_Hooks( &m_pHooks ); + + _ASSERTE( m_pPlugin.p != NULL ); + + m_pPlugin->LoadBitmapPortal( 0x06001115, &m_pBackground ); + + _ASSERTE( m_pBackground.p != NULL ); + + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) ); + + DWORD dwAlpha = 255, dwRadarDraw = 1, dwBarDocked = 0; + m_bRadarDraw = true; + m_bDocked = false; + + if( key.QueryDWORDValue( "BarAlpha", dwAlpha ) == ERROR_SUCCESS ) + m_pSite->put_Alpha( dwAlpha ); + + if( key.QueryDWORDValue( "BarRadarDraw", dwRadarDraw ) == ERROR_SUCCESS ) + m_bRadarDraw = dwRadarDraw ? true : false; + + if( key.QueryDWORDValue( "BarDocked", dwBarDocked ) == ERROR_SUCCESS ) + m_bDocked = (dwBarDocked == 1) ? true : false; + + if( key.QueryDWORDValue( "BarState", m_nMinMax ) != ERROR_SUCCESS ) + m_nMinMax = eStateMax; + + // Drakier: get the bar start pos or default to left + if( key.QueryDWORDValue( "BarStart", (DWORD &)m_nBarStartPos ) != ERROR_SUCCESS ) + m_nBarStartPos = 0; + + // Drakier: get the bar length or default to 250 px + if( key.QueryDWORDValue( "BarLength", (DWORD &)m_nBarLength ) != ERROR_SUCCESS ) + m_nBarLength = 250; + + // Drakier: get the bar dock setting (top/left/right) [default to top] + if( key.QueryDWORDValue( "BarDock", (DWORD &)m_nBarDock ) != ERROR_SUCCESS ) + m_nBarDock = DOCK_TOP; + + // Drakier: TESTING for Min/Max Side Dock + //if (m_nBarDock != DOCK_TOP) + //m_nMinMax = eStateMin; + + // Ok, first create the 4 background controls + LayerParams lpChild; + lpChild.render = eRenderClipped; + //= { eBtnMinMax, { 12, 3, 28, 19 }, eRenderClipped }; + { + lpChild.ID = eBtnMinMax; + CComPtr< ILayer > pUnk; + HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + m_pSite->CreateChild( &lpChild, pUnk ); + pUnk->QueryInterface( &m_pBtnMinMax ); + + _ASSERTE( m_pBtnMinMax.p != NULL ); + + m_pBtnMinMax->SetImages( 0, 0x0600113C, 0x0600113C ); + ICommandEventsImpl< BUTTON_MINMAX, cBarLayer >::advise( m_pBtnMinMax ); + m_pBtnMinMax->put_Matte( RGB( 0, 0, 0 ) ); + } + + { + lpChild.ID = eBtnDockCycle; + CComPtr< ILayer > pUnk; + HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + m_pSite->CreateChild( &lpChild, pUnk ); + pUnk->QueryInterface( & m_pBtnDockCycle ); + + _ASSERTE ( m_pBtnDockCycle.p != NULL ); + + m_pBtnDockCycle->SetImages( 0, 0x0600129A, 0x0600129B ); + ICommandEventsImpl< BUTTON_DOCKCYCLE, cBarLayer >::advise( m_pBtnDockCycle ); + m_pBtnDockCycle->put_Matte( RGB( 0, 0, 0 ) ); + } + + { + lpChild.ID = eBtnForwards; + + CComPtr< ILayer > pUnk; + HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + m_pSite->CreateChild( &lpChild, pUnk ); + pUnk->QueryInterface( &m_pBtnForwards ); + + _ASSERTE( m_pBtnForwards.p != NULL ); + + // Drakier: Bar Dock + if (m_nBarDock != DOCK_TOP) + m_pBtnForwards->SetImages( 0, 0x0600125E, 0x0600125F ); + else + m_pBtnForwards->SetImages( 0, 0x06001298, 0x06001299 ); + ICommandEventsImpl< BUTTON_FORWARD, cBarLayer >::advise( m_pBtnForwards ); + m_pBtnForwards->put_Matte( RGB( 0, 0, 0 ) ); + } + + { + lpChild.ID = eBtnBackwards; + + CComPtr< ILayer > pUnk; + HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + m_pSite->CreateChild( &lpChild, pUnk ); + pUnk->QueryInterface( &m_pBtnBackwards ); + + _ASSERTE( m_pBtnBackwards.p != NULL ); + + // Drakier: Bar Dock + if (m_nBarDock != DOCK_TOP) + m_pBtnBackwards->SetImages( 0, 0x06001261, 0x06001262 ); + else + m_pBtnBackwards->SetImages( 0, 0x06001295, 0x06001296 ); + ICommandEventsImpl< BUTTON_BACK, cBarLayer >::advise( m_pBtnBackwards ); + m_pBtnBackwards->put_Matte( RGB( 0, 0, 0 ) ); + } + + { + lpChild.ID = ePager; + + CComPtr< ILayer > pUnk; + HRESULT hRes = ::CoCreateInstance( CLSID_Pager, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + m_pSite->CreateChild( &lpChild, pUnk ); + pUnk->QueryInterface( &m_pPager ); + + _ASSERTE( m_pPager.p != NULL ); + + IPagerEventsImpl< PAGER_CLIENT, cBarLayer >::advise( m_pPager ); + } + + m_pSite->put_Transparent( VARIANT_FALSE ); + + if( m_nMinMax == eStateMin ) + m_pBtnMinMax->SetImages( 0, 0x0600113C, 0x0600113C ); + else + m_pBtnMinMax->SetImages( 0, 0x0600113B, 0x0600113B ); + + //::MessageBox( NULL, _T( "Here" ), _T( "[Inject.dll] cBarLayer::onCreate" ), MB_OK ); +} + +void cBarLayer::onDestroy() +{ + m_pHooks.Release(); + m_pPlugin.Release(); + m_pBtnForwards.Release(); + m_pBtnBackwards.Release(); + m_pBackground.Release(); + m_pPager.Release(); +} + +STDMETHODIMP cBarLayer::Render(ICanvas *pCanvas) +{ + _ASSERTE( pCanvas != NULL ); + + SIZE sz; + m_pPlugin->GetScreenSize( &sz ); + if ( sz.cx <= 1024 ) + MAXBAR_SIZE = 80; + else + MAXBAR_SIZE = 100; + + ClipParams p; + pCanvas->GetClipParams( &p ); + + m_pBackground->PatBlt( pCanvas, &p.window, &p.org ); + + if (m_nBarDock == DOCK_TOP) // if we are top docked + { + RECT dragBarRect; + dragBarRect.left = 3; + dragBarRect.top = 4; + dragBarRect.right = 4; + dragBarRect.bottom = 19; + + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + + dragBarRect.left += 1; + dragBarRect.right += 1; + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + dragBarRect.left += 2; + dragBarRect.right += 2; + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + + dragBarRect.left += 1; + dragBarRect.right += 1; + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + // Drakier: draw the right-hand grab bars + dragBarRect.left = m_nBarLength - 4; + dragBarRect.top = 4; + dragBarRect.right = m_nBarLength - 3; + dragBarRect.bottom = 19; + + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + dragBarRect.left -= 1; + dragBarRect.right -= 1; + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + + dragBarRect.left -= 2; + dragBarRect.right -= 2; + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + dragBarRect.left -= 1; + dragBarRect.right -= 1; + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + } + else // draw on the sides + { + RECT dragBarRect; + dragBarRect.top = 3; + dragBarRect.left = 4; + dragBarRect.bottom = 4; + if (m_nMinMax == eStateMin) // Minimized + dragBarRect.right = MINBAR_SIZE - 4; + else // Maximized + dragBarRect.right = MAXBAR_SIZE - 4; + + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + + dragBarRect.top += 1; + dragBarRect.bottom += 1; + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + dragBarRect.top += 2; + dragBarRect.bottom += 2; + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + + dragBarRect.top += 1; + dragBarRect.bottom += 1; + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + // Drakier: draw the right-hand grab bars + dragBarRect.top = m_nBarLength - 4; + dragBarRect.left = 4; + dragBarRect.bottom = m_nBarLength - 3; + if (m_nMinMax == eStateMin) // Minimized + dragBarRect.right = MINBAR_SIZE - 4; + else // Maximized + dragBarRect.right = MAXBAR_SIZE - 4; + + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + dragBarRect.top -= 1; + dragBarRect.bottom -= 1; + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + + dragBarRect.top -= 2; + dragBarRect.bottom -= 2; + pCanvas->Fill(&dragBarRect, RGB(165, 82, 57)); + + dragBarRect.top -= 1; + dragBarRect.bottom -= 1; + pCanvas->Fill(&dragBarRect, RGB(214, 173, 140)); + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +#define ENUM_REFORMAT 1 +class cBarEnumFormat +{ +public: + long nCursor; +}; + +STDMETHODIMP cBarLayer::Reformat() +{ + _ASSERTE( m_pSite.p != NULL ); + + //::MessageBox( NULL, _T( "cBarLayer::reformat" ), _T( "Inject.dll" ), MB_OK ); + + SIZE sz; + m_pPlugin->GetScreenSize( &sz ); + long lX = sz.cx, lY = sz.cy; + HRESULT hW = S_FALSE, hH = S_FALSE; + + // Drakier: if we are not in the container, get the 3D Area + if ( !cManager::_p->m_bContainer ) + { + hH = m_pHooks->get_Area3DHeight( &lY ); + hW = m_pHooks->get_Area3DWidth( &lX ); + } + + // Drakier: if we are in the container, or the 3D area's are NULL + if ( (cManager::_p->m_bContainer) || (hW != S_OK) || (hH != S_OK) ) + { + m_nScreenWidth = sz.cx - PANEL_SIZE; + m_nScreenHeight = sz.cy; + } + else // Drakier: If everything comes out right and we are not in container + { + if( (hW == S_OK) && (lX > 200) && (lX < 2000) ) + m_nScreenWidth = lX; + if( (hH == S_OK) && (lY > 200) && (lY < 2000) ) + m_nScreenHeight = lY; + } + + // Drakier: set up the bar position + // Drakier: make sure bar isn't off of left side of screen + // and that the bar length is at least 112 px + if (m_nBarStartPos < 0) + m_nBarStartPos = 0; + if (m_nBarLength < 112) + m_nBarLength = 250; + // Drakier: the right edge of the 3D area is (m_nScreenWidth) + // If you include the radar (110) it is (m_nScreenWidth - RADAR_SIZE) + + // Drakier: need 2 of these sections. One for top dock and one for side dock + // Drakier: TOP DOCK + if (m_nBarDock == DOCK_TOP) + { + // make sure bar isn't off RIGHT side of screen + if (m_nBarLength > m_nScreenWidth ) + m_nBarLength = m_nScreenWidth; + + // Drakier: adjust bar start position so its not offscreen + if (m_nBarStartPos > m_nScreenWidth ) + m_nBarStartPos = m_nScreenWidth - m_nBarLength; + + // Drakier: Adjust for Panel + if ((m_nBarStartPos + m_nBarLength) > m_nScreenWidth ) + m_nBarLength = m_nScreenWidth - m_nBarStartPos; + + // Drakier: Adjust for Radar + if ( (!m_bRadarDraw) && ((m_nBarStartPos + m_nBarLength) > (m_nScreenWidth - RADAR_SIZE)) ) + m_nBarLength = m_nScreenWidth - RADAR_SIZE - m_nBarStartPos; + } + else + { + // Drakier: SIDE DOCK + // Check the Right Side if Radar is on! + if ( ( !m_bRadarDraw ) && ( m_nBarDock == DOCK_RIGHT ) && ( m_nBarStartPos < RADAR_SIZE ) ) + m_nBarStartPos = RADAR_SIZE; + + if ( cManager::_p->m_bContainer ) // Drakier: In container (use CONST sizes) + { + // Drakier: make sure bar isn't off BOTTOM of screen + if (m_nBarLength > (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) ) + m_nBarLength = (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)); + + // Drakier: adjust bar start position so its not offscreen + if (m_nBarStartPos > (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) ) + m_nBarStartPos = (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) - m_nBarLength; + + // Drakier: Adjust for Panels + if ((m_nBarStartPos + m_nBarLength) > (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) ) + m_nBarLength = (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) - m_nBarStartPos; + } + else // Drakier: Not in container + { + // Drakier: make sure bar isn't off BOTTOM of screen + if (m_nBarLength > m_nScreenHeight ) + m_nBarLength = m_nScreenHeight; + + // Drakier: Adjust for Panels + if ((m_nBarStartPos + m_nBarLength) > m_nScreenHeight ) + m_nBarLength = m_nScreenHeight - m_nBarStartPos; + + // Drakier: adjust bar start position so its not offscreen + if (m_nBarStartPos > m_nScreenHeight) + m_nBarStartPos = m_nScreenHeight - m_nBarLength; + + // Drakier: if Docked (within 10 px) then stretch to fit + if ( m_bDocked ) + m_nBarLength = m_nScreenHeight - m_nBarStartPos; + } + } + + // Drakier: Draw the bar + RECT rc; + if (m_nBarDock == DOCK_LEFT) // Left Dock + { + rc.left = 0; + rc.top = m_nBarStartPos; + rc.bottom = m_nBarStartPos + m_nBarLength; + if (m_nMinMax == eStateMin) // Minimized + rc.right = MINBAR_SIZE; + else // Maximized + rc.right = MAXBAR_SIZE; + } + else if (m_nBarDock == DOCK_RIGHT) // Right Dock + { + if (m_nMinMax == eStateMin) // Minimized + rc.left = m_nScreenWidth - MINBAR_SIZE; + else // Maximized + rc.left = m_nScreenWidth - MAXBAR_SIZE; + + rc.top = m_nBarStartPos; + rc.right = m_nScreenWidth; + rc.bottom = m_nBarStartPos + m_nBarLength; + } + else // Top Dock + { + rc.left = m_nBarStartPos; + rc.top = 0; + rc.right = m_nBarStartPos + m_nBarLength; + rc.bottom = 23; + } + m_pSite->put_Position( &rc ); + + // Now do the MinMax button + // { 12, 3, 28, 19 } + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if ( (m_nBarDock == DOCK_LEFT) || (m_nMinMax == eStateMin) ) + { + rc.left = 3; + rc.top = 12; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + else // Right Dock + { + rc.left = MAXBAR_SIZE - ( BUTTON_SIZE + 3 ); + rc.top = 12; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + } + else // Top Dock + { + rc.left = 12; + rc.top = 3; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + CComPtr< ILayerSite > pMinMaxSite; + m_pSite->get_Child( eBtnMinMax, ePositionByID, &pMinMaxSite ); + pMinMaxSite->put_Position( &rc ); + + // Now do the dock cycle + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if (m_nMinMax == eStateMin) // minimized + { + rc.left = 3; + rc.top = m_nBarLength - 28; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + else + { + if (m_nBarDock == DOCK_LEFT) + { + rc.left = MAXBAR_SIZE - ( BUTTON_SIZE + 3 ); + rc.top = 12; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + else + { + rc.left = 3; + rc.top = 12; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + } + } + else // Top Dock + { + rc.left = m_nBarLength - 28; + rc.top = 3; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + CComPtr< ILayerSite > pDockCycleSite; + m_pSite->get_Child( eBtnDockCycle, ePositionByID, &pDockCycleSite ); + pDockCycleSite->put_Position( &rc ); + + // Now the pager + CComPtr< ILayerSite > pPagerSite; + m_pSite->get_Child( ePager, ePositionByID, &pPagerSite ); + + m_offsets.clear(); + long nChildren; + long nOffset = 0; + long nDesired; + pPagerSite->get_ChildCount( &nChildren ); + + for( long nChild = 0; nChild < nChildren; ++ nChild ) + { + ViewParams pParams; + CComPtr< ILayerSite > pChildSite; + pPagerSite->get_Child( nChild, ePositionByIndex, &pChildSite ); + + long nChildID; + pChildSite->get_ID( &nChildID ); + + if( nChildID < eChildBarFirst ) + continue; + + CComPtr< ISimpleBar > pBarNative; + pChildSite->GetSink( IID_ISimpleBar, reinterpret_cast< void ** >( &pBarNative ) ); + + pBarNative->get_Params(&pParams); + pParams.state = m_nMinMax; + pBarNative->put_Params(&pParams); + + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if (m_nMinMax == eStateMin) // Minimized + { + rc.right = MINBAR_SIZE - 2; + } + else // Maximized + { + rc.right = MAXBAR_SIZE - 2; + } + nDesired = 20; // Button Height + rc.left = 0; + rc.top = nOffset; + rc.bottom = nOffset + nDesired; + } + else // Top Dock + { + // We always give bars their desired size (Width) + pBarNative->get_RenderWidth( &nDesired ); + rc.left = nOffset; + rc.top = 0; + rc.right = nOffset + nDesired; + rc.bottom = 21; + } + pChildSite->put_Position( &rc ); + + m_offsets.push_back( nOffset ); + nOffset += nDesired + 2; + } + + // Calc ViewSlots for SideDock Maximized Up/Down Visibility + long nTotalBtnHeight; + // nOffset is total button height + nTotalBtnHeight = nOffset; + + bool showPosBtns; + //showPosBtns = (nTotalBtnHeight > m_nBarLength); + + if (m_nBarDock != DOCK_TOP) // Side Dock + { + rc.left = 1; + if (m_nMinMax == eStateMin) // minimized + { + showPosBtns = ( nTotalBtnHeight > ( m_nBarLength - 58 ) ); // Viewable Height + if ( showPosBtns ) + { + rc.top = 50; + rc.bottom = m_nBarLength - 48; + } + else + { + rc.top = 30; + rc.bottom = m_nBarLength - 28; + } + rc.right = MINBAR_SIZE - 1; + } + else // maximized + { + showPosBtns = ( nTotalBtnHeight > ( m_nBarLength - 44 ) ); // Viewable Height + rc.top = 30; + rc.right = MAXBAR_SIZE - 1; + rc.bottom = m_nBarLength - 12; + } + } + else // Top Dock + { + showPosBtns = ( nTotalBtnHeight > ( m_nBarLength - 58 ) ); //Max Viewable Width + if ( showPosBtns ) + { + rc.left = 50; + rc.right = m_nBarLength - 48; + } + else + { + rc.left = 30; + rc.right = m_nBarLength - 28; + } + rc.top = 1; + rc.bottom = 22; + } + pPagerSite->put_Position( &rc ); + + // Now do the backwards + if ( showPosBtns ) + { + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if (m_nMinMax == eStateMin) // minimized + { + rc.left = 3; + rc.top = 30; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + else + { + rc.top = 12; + rc.left = (MAXBAR_SIZE / 2) - 17; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + } + else // Top Dock + { + rc.left = 30; + rc.top = 3; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + } + else + { + rc.left = -30; + rc.top = -30; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + CComPtr< ILayerSite > pBackwardsSite; + m_pSite->get_Child( eBtnBackwards, ePositionByID, &pBackwardsSite ); + pBackwardsSite->put_Position( &rc ); + + // Drakier: this is a change because of the new LENGTH system + + // Now do the forwards + if ( showPosBtns ) + { + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if (m_nMinMax == eStateMin) // minimized + { + rc.left = 3; + rc.top = m_nBarLength - 46; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + else + { + rc.top = 12; + rc.left = (MAXBAR_SIZE / 2) + 1; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + } + else // Top Dock + { + rc.left = m_nBarLength - 46; + rc.top = 3; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + } + else + { + rc.left = -30; + rc.top = -30; + rc.right = rc.left + BUTTON_SIZE; + rc.bottom = rc.top + BUTTON_SIZE; + } + CComPtr< ILayerSite > pFwdSite; + m_pSite->get_Child( eBtnForwards, ePositionByID, &pFwdSite ); + pFwdSite->put_Position( &rc ); + + /* Drakier: Testing if un-needed + // Check if the position is wrong now + if( m_nPosition >= m_offsets.size() ) + m_nPosition = m_offsets.size() - 1; + */ + if ( !showPosBtns ) + m_nPosition = 0; + + POINT pt = { ( m_nPosition <= 0 ) ? 0 : m_offsets[ m_nPosition ], 0 }; + + if (m_nBarDock != DOCK_TOP) // Side Dock + { + pt.x = 0; + pt.y = ( m_nPosition <= 0 ) ? 0 : m_offsets[ m_nPosition ]; + } + else // Top Dock + { + pt.x = ( m_nPosition <= 0 ) ? 0 : m_offsets[ m_nPosition ]; + pt.y = 0; + } + + m_pPager->ScrollTo( &pt ); + m_pSite->Invalidate(); + + return S_OK; +} + +VARIANT_BOOL cBarLayer::onClientGetNextPosition(long nID, long nCommand, long *pnX, long *pnY) +{ + switch( nCommand ) + { + case eBtnForwards: + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if( !m_bLocked && ( m_offsets.size() > 0 ) && ( ( m_nPosition + 1 ) < m_offsets.size() ) ) + { + m_bLocked = TRUE; + m_nPosition++; + *pnX = 0; + *pnY = m_offsets[ m_nPosition ]; + + return VARIANT_TRUE; + } + } + else // Top Dock + { + if( !m_bLocked && ( m_offsets.size() > 0 ) && ( ( m_nPosition + 1 ) < m_offsets.size() ) ) + { + //m_bLocked = TRUE; + m_nPosition++; + *pnX = m_offsets[ m_nPosition ]; + *pnY = 0; + + return VARIANT_TRUE; + } + } + break; + + case eBtnBackwards: + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if( !m_bLocked && m_nPosition > 0 ) + { + m_bLocked = TRUE; + m_nPosition--; + *pnX = 0; + *pnY = m_offsets[ m_nPosition ]; + + return VARIANT_TRUE; + } + } + else // Top Dock + { + if( !m_bLocked && m_nPosition > 0 ) + { + //m_bLocked = TRUE; + m_nPosition--; + *pnX = m_offsets[ m_nPosition ]; + *pnY = 0; + + return VARIANT_TRUE; + } + } + break; + + default: + // Unknown command + _ASSERT( FALSE ); + } + + // Unknown command or over/underflow - end paging + return VARIANT_FALSE; +} + +STDMETHODIMP cBarLayer::AddBar(long nViewID, ViewParams *pParams) +{ + _ASSERTE( pParams != NULL ); + _ASSERTE( pParams->label != NULL ); + + CComObject< cSimpleBar > *pNewBar; + CComObject< cSimpleBar >::CreateInstance( &pNewBar ); + + pNewBar->put_Params( pParams ); + + CComPtr< ILayerSite > pPagerSite; + m_pSite->get_Child( ePager, ePositionByID, &pPagerSite ); + + LayerParams p = { nViewID, { 0, 0, 0, 0 }, eRenderClipped }; + + pPagerSite->CreateChild( &p, pNewBar ); + + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cBarLayer::RemoveBar(long nViewID) +{ + CComPtr< ILayerSite > pPagerSite; + m_pSite->get_Child( ePager, ePositionByID, &pPagerSite ); + + CComPtr< ILayerSite > pBarSite; + HRESULT hRes = pPagerSite->get_Child( nViewID, ePositionByID, &pBarSite ); + + if( FAILED( hRes ) ) + // Probably not found + return hRes; + + m_pSite->Reformat(); + + return pBarSite->Destroy(); +} + +STDMETHODIMP cBarLayer::get_Bar(long nViewID, ViewParams *pVal) +{ + CComPtr< ILayerSite > pPagerSite; + m_pSite->get_Child( ePager, ePositionByID, &pPagerSite ); + + CComPtr< ILayerSite > pBarSite; + HRESULT hRes = pPagerSite->get_Child( nViewID, ePositionByID, &pBarSite ); + + if( FAILED( hRes ) ) + // Probably not found + return hRes; + + CComPtr< ISimpleBar > pSimpleBar; + pBarSite->GetSink( IID_ISimpleBar, reinterpret_cast< void ** >( &pSimpleBar ) ); + + pSimpleBar->get_Params( pVal ); + + return S_OK; +} + +STDMETHODIMP cBarLayer::put_Bar(long nViewID, ViewParams *newVal) +{ + CComPtr< ILayerSite > pPagerSite; + m_pSite->get_Child( ePager, ePositionByID, &pPagerSite ); + + CComPtr< ILayerSite > pBarSite; + HRESULT hRes = pPagerSite->get_Child( nViewID, ePositionByID, &pBarSite ); + + if( FAILED( hRes ) ) + // Probably not found + return hRes; + + CComPtr< ISimpleBar > pSimpleBar; + pBarSite->GetSink( IID_ISimpleBar, reinterpret_cast< void ** >( &pSimpleBar ) ); + + pSimpleBar->put_Params( newVal ); + + m_pSite->Reformat(); + + return S_OK; +} + +void __stdcall cBarLayer::onMinMaxHit(long nID) { + RegKey key; + + if (m_nMinMax == eStateMax) + { + m_nMinMax = eStateMin; + m_pBtnMinMax->SetImages(0, 0x0600113C, 0x0600113C); + } + else + { + m_nMinMax = eStateMax; + m_pBtnMinMax->SetImages(0, 0x0600113B, 0x0600113B); + } + + key.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal")); + key.SetDWORDValue("BarState", m_nMinMax); + + Reformat(); +} + +void __stdcall cBarLayer::onDockCycleHit(long nID) { + RegKey key; + key.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal")); + + m_nBarDock = (m_nBarDock + 1) % 3; + + if (m_nBarDock != DOCK_TOP) + { + m_pBtnForwards->SetImages( 0, 0x0600125E, 0x0600125F ); + m_pBtnBackwards->SetImages( 0, 0x06001261, 0x06001262 ); + //m_nMinMax = eStateMin; + if( key.QueryDWORDValue( "BarState", m_nMinMax ) != ERROR_SUCCESS ) + m_nMinMax = eStateMax; + } + else + { + m_pBtnForwards->SetImages( 0, 0x06001298, 0x06001299 ); + m_pBtnBackwards->SetImages( 0, 0x06001295, 0x06001296 ); + if( key.QueryDWORDValue( "BarState", m_nMinMax ) != ERROR_SUCCESS ) + m_nMinMax = eStateMax; + } + + key.SetDWORDValue("BarDock", m_nBarDock); + + m_pPager->FinishCommand; + Reformat(); +} + +STDMETHODIMP cBarLayer::MouseEvent(long nMsg, long wParam, long lParam) { + switch (nMsg) + { + case WM_LBUTTONDOWN: + RECT rSize; + m_pSite->get_Position(&rSize); + + POINTS pt; + pt = MAKEPOINTS(lParam); + + if( !cManager::_p->m_bContainer ) + pt.y -= 28; + + if (m_nBarDock != DOCK_TOP) // Side Dock + { + m_bDocked = FALSE; + // Drakier: Grabbing the Top drag bar + if (pt.x >= rSize.left && pt.x <= rSize.right && pt.y >= rSize.top + 1 && pt.y <= rSize.top + 8) + { + m_nDragging = -1; + m_DeltaY = pt.y; + } + + // Drakier: Grabbing the right drag bar + if (pt.x >= rSize.left && pt.x <= rSize.right && pt.y >= rSize.bottom - 8 && pt.y <= rSize.bottom - 1) + { + m_nDragging = 1; + m_DeltaY = pt.y; + } + } + else // Top Dock + { + // Drakier: Grabbing the left drag bar + if (pt.y >= rSize.top && pt.y <= rSize.bottom && pt.x >= rSize.left + 1 && pt.x <= rSize.left + 8) + { + m_nDragging = -1; + m_DeltaX = pt.x; + } + + // Drakier: Grabbing the right drag bar + if (pt.y >= rSize.top && pt.y <= rSize.bottom && pt.x >= rSize.right - 8 && pt.x <= rSize.right - 1) + { + m_nDragging = 1; + m_DeltaX = pt.x; + } + } + break; + + case WM_LBUTTONUP: + if( m_nDragging == -1 || m_nDragging == 1 ) + { + m_nDragging = 0; + + RegKey key; + key.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal")); + // Drakier: For the new bar system + key.SetDWORDValue("BarStart", (DWORD)m_nBarStartPos); + key.SetDWORDValue("BarLength", (DWORD)m_nBarLength); + + if ( m_nBarDock != DOCK_TOP ) // Drakier: Side Docked + { + // Drakier: should we keep the decal bar STUCK to bottom of screen? + if ( (m_nBarStartPos + m_nBarLength) > (m_nScreenHeight - 10) ) + m_bDocked = TRUE; + else + m_bDocked = FALSE; + + key.SetDWORDValue("BarDocked", (DWORD)m_bDocked); + Reformat(); + } + } + break; + + case WM_MOUSEMOVE: + if (m_nBarDock != DOCK_TOP) // Side Dock + { + if ( m_nDragging == -1 ) // Drakier: Drag Up + { + POINTS pt; + pt = MAKEPOINTS(lParam); + + if( !cManager::_p->m_bContainer ) + pt.y -= 28; + + if ( !m_bRadarDraw ) // Drakier: Radar On? + { + if ( ((m_nBarLength - (pt.y - m_DeltaY)) > 112 ) && (((pt.y - m_DeltaY) + m_nBarStartPos) >= 0) && (((pt.y - m_DeltaY) + m_nBarStartPos) >= (RADAR_SIZE)) ) + { + m_nBarStartPos += pt.y - m_DeltaY; + m_nBarLength += (-1) * (pt.y - m_DeltaY); + m_DeltaY = pt.y; + } + + } + else + { + if ( ((m_nBarLength - (pt.y - m_DeltaY)) > 112 ) && (((pt.y - m_DeltaY) + m_nBarStartPos) >= 0) ) + { + m_nBarStartPos += pt.y - m_DeltaY; + m_nBarLength += (-1) * (pt.y - m_DeltaY); + m_DeltaY = pt.y; + } + } + + Reformat( ); + } + else if ( m_nDragging == 1 ) // Drakier: Drag Down + { + POINTS pt; + pt = MAKEPOINTS(lParam); + + if( !cManager::_p->m_bContainer ) + pt.y -= 28; + + if ( cManager::_p->m_bContainer ) + { + if ( ((pt.y - m_DeltaY + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.y - m_DeltaY) <= (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE))) ) + { + m_nBarLength += pt.y - m_DeltaY; + m_DeltaY = pt.y; + } + } + else + { + if ( ((pt.y - m_DeltaY + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.y - m_DeltaY) <= m_nScreenHeight) ) + { + m_nBarLength += pt.y - m_DeltaY; + m_DeltaY = pt.y; + } + } + Reformat( ); + } + } + else // Top Dock + { + if ( m_nDragging == -1 ) // Drakier: Drag Left + { + POINTS pt; + pt = MAKEPOINTS(lParam); + + if( !cManager::_p->m_bContainer ) + pt.y -= 28; + + if ( ((m_nBarLength - (pt.x - m_DeltaX)) > 112 ) && (((pt.x - m_DeltaX) + m_nBarStartPos) >= 0) ) + { + m_nBarStartPos += pt.x - m_DeltaX; + m_nBarLength += (-1) * (pt.x - m_DeltaX); + m_DeltaX = pt.x; + } + + Reformat( ); + } + else if ( m_nDragging == 1 ) // Drakier: Drag Right + { + POINTS pt; + pt = MAKEPOINTS(lParam); + + if( !cManager::_p->m_bContainer ) + pt.y -= 28; + if ( !m_bRadarDraw ) // Drakier: Radar on? + { + //if ( ((pt.x - m_DeltaX + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.x - m_DeltaX) <= (*m_p3DW - RADAR_SIZE)) ) + if ( ((pt.x - m_DeltaX + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.x - m_DeltaX) <= (m_nScreenWidth - RADAR_SIZE)) ) + { + m_nBarLength += pt.x - m_DeltaX; + m_DeltaX = pt.x; + } + } + else // Drakier: Radar off! + { + if ( ((pt.x - m_DeltaX + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.x - m_DeltaX) <= m_nScreenWidth) ) + { + m_nBarLength += pt.x - m_DeltaX; + m_DeltaX = pt.x; + } + } + + Reformat( ); + } + } + break; + } + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/BarLayer.h b/Native/Inject/BarLayer.h new file mode 100644 index 0000000..4ee7827 --- /dev/null +++ b/Native/Inject/BarLayer.h @@ -0,0 +1,121 @@ +// BarLayer.h : Declaration of the cBarLayer + +#ifndef __BARLAYER_H_ +#define __BARLAYER_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" + +// Control IDs +#define PAGER_CLIENT 1 +#define BUTTON_BACK 2 +#define BUTTON_FORWARD 3 +#define BUTTON_MINMAX 4 +#define BUTTON_DOCKCYCLE 5 + +///////////////////////////////////////////////////////////////////////////// +// cBarLayer +class ATL_NO_VTABLE cBarLayer : + public CComObjectRootEx, + public ILayerImpl< cBarLayer >, + public ILayerRenderImpl, + public IBarManager, + public ICommandEventsImpl< BUTTON_BACK, cBarLayer >, + public ICommandEventsImpl< BUTTON_FORWARD, cBarLayer >, + public ICommandEventsImpl< BUTTON_MINMAX, cBarLayer >, + public ICommandEventsImpl< BUTTON_DOCKCYCLE, cBarLayer >, + public ILayerMouseImpl, + public cNoEventsImpl, + public IPagerEventsImpl< PAGER_CLIENT, cBarLayer > +{ +public: + cBarLayer(); + + // Important child objects + CComPtr< IPluginSite > m_pPlugin; + CComPtr< IACHooks > m_pHooks; + CComPtr< IPager > m_pPager; + CComPtr< IButton > m_pBtnForwards, + m_pBtnBackwards, m_pBtnMinMax, m_pBtnDockCycle; + + CComPtr< IImageCache > m_pBackground; + + // This the the list of bars + typedef std::vector< long > cOffsetList; + cOffsetList m_offsets; + unsigned long m_nPosition; + unsigned long m_nMinMax; + + long m_DeltaX; + long m_DeltaY; + long m_nScreenWidth; + long m_nScreenHeight; + //long m_TotalDelta; + long *m_p3DH; + long *m_p3DW; + + long m_nBarStartPos; + long m_nBarLength; + + int m_nDragging; + int m_nBarDock; + bool m_bRadarDraw; + bool m_bButtonDown; + bool m_bLocked; + bool m_bDocked; + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cBarLayer) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(IBarManager) +END_COM_MAP() + +BEGIN_SINK_MAP(cBarLayer) + SINK_ENTRY_EX( BUTTON_BACK, DIID_ICommandEvents, DISPID_HIT, onCommandHit ) + SINK_ENTRY_EX( BUTTON_BACK, DIID_ICommandEvents, DISPID_UNHIT, onCommandUnhit ) + SINK_ENTRY_EX( BUTTON_FORWARD, DIID_ICommandEvents, DISPID_HIT, onCommandHit ) + SINK_ENTRY_EX( BUTTON_FORWARD, DIID_ICommandEvents, DISPID_UNHIT, onCommandUnhit ) + SINK_ENTRY_EX( BUTTON_MINMAX, DIID_ICommandEvents, DISPID_HIT, onMinMaxHit ) + SINK_ENTRY_EX( BUTTON_DOCKCYCLE, DIID_ICommandEvents, DISPID_HIT, onDockCycleHit ) + SINK_ENTRY_EX( PAGER_CLIENT, DIID_IPagerEvents, DISPID_GETNEXTPOSITION, onClientGetNextPosition ) +END_SINK_MAP() + +public: + // IBarManager + STDMETHOD(get_Bar)(long nViewID, /*[out, retval]*/ ViewParams *pVal); + STDMETHOD(put_Bar)(long nViewID, /*[in]*/ ViewParams * newVal); + STDMETHOD(RemoveBar)(long nViewID); + STDMETHOD(AddBar)(long nViewID, ViewParams *pParams); + + // ILayerRender + STDMETHOD(Render)(ICanvas *pCanvas); + STDMETHOD(Reformat)(); + + // Button Back and Forward event handlers + void __stdcall onCommandHit( long nID ) + { + m_bButtonDown = TRUE; + m_pPager->put_Command( nID ); + } + + void __stdcall onCommandUnhit( long ) + { + m_bButtonDown = FALSE; + m_bLocked = FALSE; + m_pPager->FinishCommand(); + } + + void __stdcall onMinMaxHit(long nID); + void __stdcall onDockCycleHit(long nID); + + // Pager event handlers + VARIANT_BOOL __stdcall onClientGetNextPosition( long nID, long nCommand, long *pnX, long *pnY ); + STDMETHOD(MouseEvent)(long nMsg, long wParam, long lParam); +}; + +#endif //__BARLAYER_H_ diff --git a/Native/Inject/Button.cpp b/Native/Inject/Button.cpp new file mode 100644 index 0000000..601dc5c --- /dev/null +++ b/Native/Inject/Button.cpp @@ -0,0 +1,244 @@ +// Button.cpp : Implementation of cButton +#include "stdafx.h" +#include "Inject.h" +#include "Button.h" + +///////////////////////////////////////////////////////////////////////////// +// cButton + +cButton::cButton() +: m_nModule( 0 ), +m_nBackground( 0 ), +m_nPressed( 0 ), +m_nReleased( 0 ), +m_bPressed( VARIANT_FALSE ), +m_bMouseIn( VARIANT_FALSE ), +m_nMatte( RGB( 0, 255, 255 ) ) +{ +} + +STDMETHODIMP cButton::SetImages(long dwModule, long dwReleased, long dwPressed) +{ + m_nModule = dwModule; + m_nReleased = dwReleased; + m_nPressed = dwPressed; + + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cButton::Render(ICanvas *pCanvas) +{ + _ASSERTE( pCanvas != NULL ); + + // ::MessageBox( NULL, _T( "cButton::Render" ), _T( "Inject.dll" ), MB_OK ); + + _ASSERTE( m_pSite.p != NULL ); + + RECT rc; + m_pSite->get_Position( &rc ); + + if( m_nMatte != RGB( 0, 255, 255 ) ) + { + // That's the transparent color + RECT rcMatte = { 0, 0, rc.right - rc.left, rc.bottom - rc.top }; + pCanvas->Fill( &rcMatte, m_nMatte ); + } + + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + _ASSERTE( pPlugin.p != NULL ); + + CComPtr< IIconCache > pIcons; + SIZE sz = { rc.right - rc.left, rc.bottom - rc.top }; + pPlugin->GetIconCache( &sz, &pIcons ); + + _ASSERTE( pIcons.p != NULL ); + + long nImage = ( m_bPressed && m_bMouseIn ) ? m_nPressed : m_nReleased; + + POINT pt = { 0, 0 }; + + if (m_nBackground != 0) pIcons->DrawIcon( &pt, m_nBackground, 0, pCanvas ); + pIcons->DrawIcon( &pt, nImage, m_nModule, pCanvas ); + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cButton::MouseEnter(struct MouseState *) +{ + _ASSERTE( !m_bMouseIn ); + + m_bMouseIn = VARIANT_TRUE; + + if( m_bPressed ) + { + long nID; + m_pSite->get_ID( &nID ); + Fire_Hit( nID ); + + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cButton::MouseExit(struct MouseState *) +{ + _ASSERTE( m_bMouseIn ); + + m_bMouseIn = VARIANT_FALSE; + + if( m_bPressed ) + { + long nID; + m_pSite->get_ID( &nID ); + Fire_Unhit( nID ); + + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + } + + return S_OK; +} + +STDMETHODIMP cButton::MouseDown(struct MouseState *) +{ + _ASSERTE( m_pSite != NULL ); + + long nID; + m_pSite->get_ID( &nID ); + Fire_Hit( nID ); + + m_bPressed = VARIANT_TRUE; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cButton::MouseUp(struct MouseState *) +{ + m_bPressed = VARIANT_FALSE; + + long nID; + m_pSite->get_ID( &nID ); + + if( m_bMouseIn ) + { + _ASSERTE( m_pSite.p != NULL ); + + m_pSite->Invalidate(); + + // NOTE: The command may destroy the control synchronously + // so we make a stack copy of the target in case our instance is destroyed + // for the purpose of completing the command + Fire_Accepted( nID ); + Fire_Unhit( nID ); + } + else + Fire_Canceled( nID ); + + return S_OK; +} + +STDMETHODIMP cButton::get_Matte(long *pVal) +{ + *pVal = m_nMatte; + + return S_OK; +} + +STDMETHODIMP cButton::put_Matte(long newVal) +{ + m_nMatte = newVal; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cButton::SchemaLoad(IView *, IUnknown *pSchema) +{ + USES_CONVERSION; + + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + MSXML::IXMLDOMElementPtr pElement = pSchema; + + // Get the suspected variables out + _variant_t vModule = pElement->getAttribute( _T( "iconlibrary" ) ), + vReleased = pElement->getAttribute( _T( "icon" ) ), + vPressed = pElement->getAttribute( _T( "pressedicon" ) ), + vMatte = pElement->getAttribute( _T( "matte" ) ), + vBackground = pElement->getAttribute( _T( "background" ) ); + + if( vModule.vt == VT_BSTR ) + pPlugin->LoadResourceModule( vModule.bstrVal, &m_nModule ); + + if( vReleased.vt != VT_NULL ) + { + try + { + m_nReleased = static_cast< long >( vReleased ) + 0x06000000; + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vPressed.vt != VT_NULL ) + { + try + { + m_nPressed = static_cast< long >( vPressed ) + 0x06000000; + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + else + m_nPressed = m_nReleased; + + if( vMatte.vt != VT_NULL ) + { + try + { + m_nMatte = static_cast< long >( vMatte ); + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + + if( vBackground.vt != VT_NULL ) + { + try + { + m_nBackground = static_cast< long >( vBackground ) + 0x06000000; + } + catch( ... ) + { + // Type conversion error + _ASSERTE( FALSE ); + } + } + else + { + m_nBackground = 0; + } + + return S_OK; +} diff --git a/Native/Inject/Button.h b/Native/Inject/Button.h new file mode 100644 index 0000000..629ca43 --- /dev/null +++ b/Native/Inject/Button.h @@ -0,0 +1,79 @@ +// Button.h : Declaration of the cButton + +#ifndef __BUTTON_H_ +#define __BUTTON_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "InjectCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cButton +class ATL_NO_VTABLE cButton : + public CComObjectRootEx, + public CComCoClass, + public IControlImpl< cButton, IButton, &IID_IButton, &LIBID_DecalPlugins >, + public ILayerImpl< cButton >, + public ILayerRenderImpl, + public ILayerMouseImpl, + public ILayerSchema, + public IProvideClassInfo2Impl< &CLSID_Button, &DIID_ICommandEvents, &LIBID_DecalPlugins >, + public IConnectionPointContainerImpl, + public CProxyICommandEvents< cButton > +{ +public: + cButton(); + + long m_nModule; + long m_nReleased; + long m_nPressed; + long m_nBackground; + + VARIANT_BOOL m_bPressed, + m_bMouseIn; + + long m_nMatte; + +DECLARE_REGISTRY_RESOURCEID(IDR_BUTTON) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +public : +BEGIN_COM_MAP(cButton) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerSchema) + COM_INTERFACE_ENTRY(IButton) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cButton) +CONNECTION_POINT_ENTRY(DIID_ICommandEvents) +END_CONNECTION_POINT_MAP() + +// IButton +public: + // IButton Methods + STDMETHOD(SetImages)(long dwModule, long dwReleased, long dwPressed); + STDMETHOD(get_Matte)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Matte)(/*[in]*/ long newVal); + + // ILayerRender Methods + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerMouse Methods + STDMETHOD(MouseEnter)(struct MouseState *); + STDMETHOD(MouseExit)(struct MouseState *); + STDMETHOD(MouseDown)(struct MouseState *); + STDMETHOD(MouseUp)(struct MouseState *); + + // ILayerSchema Methods + STDMETHOD(SchemaLoad)(IView *, IUnknown *pSchema); +}; + +#endif //__BUTTON_H_ diff --git a/Native/Inject/Button.rgs b/Native/Inject/Button.rgs new file mode 100644 index 0000000..73b55a9 --- /dev/null +++ b/Native/Inject/Button.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Button.1 = s 'Button Class' + { + CLSID = s '{C22BF2FC-F144-4d17-9C12-A344F980BB17}' + } + DecalControls.Button = s 'Button Class' + { + CLSID = s '{C22BF2FC-F144-4d17-9C12-A344F980BB17}' + CurVer = s 'DecalControls.Button.1' + } + NoRemove CLSID + { + ForceRemove {C22BF2FC-F144-4d17-9C12-A344F980BB17} = s 'DecalControls Button' + { + ProgID = s 'DecalControls.Button.1' + VersionIndependentProgID = s 'DecalControls.Button' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/Inject/Canvas.cpp b/Native/Inject/Canvas.cpp new file mode 100644 index 0000000..8b247c5 --- /dev/null +++ b/Native/Inject/Canvas.cpp @@ -0,0 +1,748 @@ +// Canvas.cpp : Implementation of cCanvas +#include "stdafx.h" +#include "Inject.h" +#include "Canvas.h" + +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// cCanvas + +cCanvas::~cCanvas() +{ + _ASSERTE( m_hdc == NULL ); + + if( m_rgn != NULL ) + ::DeleteObject( m_rgn ); +} + +void cCanvas::testSurface() +{ + if( m_pSurface.p == NULL ) + cManager::_p->createSurface( &m_sz, &m_pSurface ); + else if( m_pSurface->IsLost() != DD_OK ) + m_pSurface->Restore(); +} + +STDMETHODIMP cCanvas::PushClipRect(LPRECT prc, VARIANT_BOOL *pbVisible) +{ + _ASSERTE( prc != NULL ); + _ASSERTE( prc->right >= prc->left && prc->bottom >= prc->top ); + _ASSERTE( pbVisible != NULL ); + + ClipParams ¤t = m_clipping.top(); + + if( !current.visible ) + { + // Not visible means just push and hope for a pop + m_clipping.push( current ); + return S_OK; + } + + int nChildLeft = prc->left + current.window.left - current.org.x, + nChildTop = prc->top + current.window.top - current.org.y, + nChildWidth = prc->right - prc->left, + nChildHeight = prc->bottom - prc->top; + + ClipParams p = { + { nChildLeft, nChildTop, nChildLeft + nChildWidth, nChildTop + nChildHeight }, + { 0, 0 }, + VARIANT_TRUE }; + + // Clip the four sides of the rectangle + if( p.window.left < current.window.left ) + { + // Clip left edge + p.org.x += current.window.left - p.window.left; + p.window.left = current.window.left; + } + + if( p.window.top < current.window.top ) + { + // Clip top edge + p.org.y += current.window.top - p.window.top; + p.window.top = current.window.top; + } + + if( p.window.right > current.window.right ) + // Clip right edge + p.window.right = current.window.right; + + if( p.window.bottom > current.window.bottom ) + // Clip bottom edge + p.window.bottom = current.window.bottom; + + // Check for clipping out of existance + if( p.window.left >= p.window.right || p.window.top >= p.window.bottom ) + // This rectangle is no longer visible + p.visible = VARIANT_FALSE; + + // Return the remainder of the rectangle + *pbVisible = p.visible; + + m_clipping.push( p ); + + return S_OK; +} + +STDMETHODIMP cCanvas::PopClipRect() +{ + _ASSERTE( m_clipping.size() > 1 ); + + m_clipping.pop(); + + return S_OK; +} + +STDMETHODIMP cCanvas::GetDC(HDC *pdc) +{ + _ASSERTE( pdc != NULL ); + + testSurface(); + + if( m_hdc != NULL ) + // Already checked out + return E_FAIL; + + m_pSurface->GetDC( &m_hdc ); + + // Create a clipping region + ClipParams ¶m = m_clipping.top(); + + if( m_rgn == NULL ) + m_rgn = ::CreateRectRgnIndirect( ¶m.window ); + else + ::SetRectRgn( m_rgn, param.window.left, param.window.top, param.window.right, param.window.bottom ); + + ::SelectObject( m_hdc, m_rgn ); + + // Set the origin + ::SetWindowOrgEx( m_hdc, -param.window.left + param.org.x, -param.window.top + param.org.y, NULL ); + + *pdc = m_hdc; + + return S_OK; +} + +STDMETHODIMP cCanvas::ReleaseDC() +{ + if( m_hdc == NULL ) + return E_FAIL; + + m_pSurface->ReleaseDC( m_hdc ); + m_hdc = NULL; + + return S_OK; +} + +STDMETHODIMP cCanvas::GetSurface(REFIID iid, void **ppvItf) +{ + _ASSERTE( iid == IID_IDirectDrawSurface4 ); + _ASSERTE( ppvItf != NULL ); + + testSurface(); + + return m_pSurface->QueryInterface( iid, ppvItf ); +} + +STDMETHODIMP cCanvas::GetClipParams(ClipParams *pParams) +{ + _ASSERTE( pParams != NULL ); + + *pParams = m_clipping.top(); + + return S_OK; +} + +STDMETHODIMP cCanvas::Fill(LPRECT prc, long nRGB) +{ + _ASSERTE( prc != NULL ); + _ASSERTE( prc->right > prc->left && prc->bottom > prc->top ); + + testSurface(); + + VARIANT_BOOL bVisible; + PushClipRect( prc, &bVisible ); + + if( bVisible ) + { + DDBLTFX fx; + ::memset( &fx, 0, sizeof( DDBLTFX ) ); + + fx.dwSize = sizeof( DDBLTFX ); + + DownMixRGB((BYTE)nRGB, (BYTE)(nRGB >> 8), (BYTE)(nRGB >> 16), (WORD *)&fx.dwFillColor); + + m_pSurface->Blt( &m_clipping.top().window, NULL, NULL, DDBLT_COLORFILL, &fx ); + } + + PopClipRect(); + + return S_OK; +} + +STDMETHODIMP cCanvas::Frame(LPRECT prc, long nRGB) +{ + _ASSERTE( prc != NULL ); + _ASSERTE( prc->right > prc->left && prc->bottom > prc->top ); + + testSurface(); + + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP cCanvas::get_WasLost(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = VARIANT_FALSE; + + if( m_pSurface.p != NULL ) + { + if( m_pSurface->IsLost() != DD_OK ) + *pVal = VARIANT_TRUE; + } + else + *pVal = VARIANT_TRUE; + + return S_OK; +} + +STDMETHODIMP cCanvas::get_Size(LPSIZE pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_sz; + + return S_OK; +} + +STDMETHODIMP cCanvas::put_Size(LPSIZE newVal) +{ + _ASSERTE( newVal->cx > 0 && newVal->cy > 0 ); + _ASSERTE( m_clipping.size() == 1 ); + + if( m_sz.cx != newVal->cx || m_sz.cy != newVal->cy ) + { + m_sz = *newVal; + if( m_pSurface.p ) + // Next frame this'll be marked as lost + m_pSurface.Release(); + + // Reset the bounds in the root clip rectangle + ClipParams &clip = m_clipping.top(); + clip.window.right = clip.window.left + newVal->cx; + clip.window.bottom = clip.window.top + newVal->cy; + } + + return S_OK; +} + +STDMETHODIMP cCanvas::Blt(LPRECT prcSrc, ICanvas *pSrc, LPPOINT pptDest) +{ + _ASSERTE( pSrc != NULL ); + _ASSERTE( prcSrc != NULL ); + _ASSERTE( prcSrc->right > prcSrc->left && prcSrc->bottom > prcSrc->top ); + _ASSERTE( pptDest != NULL ); + + testSurface(); + + // Ok, first, make up the clip rect + RECT rc = { pptDest->x, pptDest->y, pptDest->x + ( prcSrc->right - prcSrc->left ), + pptDest->y + ( prcSrc->bottom - prcSrc->top ) }; + VARIANT_BOOL bVisible; + + PushClipRect( &rc, &bVisible ); + if( bVisible ) + { + CComPtr< IDirectDrawSurface4 > pSurf; + pSrc->GetSurface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &pSurf ) ); + + _ASSERTE( pSurf.p != NULL ); + _ASSERTE( pSurf->IsLost() == DD_OK ); + + // Calculate the metrics +#ifdef _DEBUG + SIZE sz; + pSrc->get_Size( &sz ); + + _ASSERTE( prcSrc->left >= 0 && prcSrc->top >= 0 && prcSrc->right <= sz.cx && prcSrc->bottom <= sz.cy ); +#endif + + ClipParams ¤t = m_clipping.top(); + + RECT rcSrcClipped = { prcSrc->left + current.org.x, prcSrc->top + current.org.y, + prcSrc->left + current.org.x + ( current.window.right - current.window.left ), + prcSrc->top + current.org.y + ( current.window.bottom - current.window.top ) }; + + HRESULT hRes = S_OK; + + if ( sourceAlpha < 255) { + + if( cManager::_p->m_eAlphaBlendMode == eAlphaBlendSoftware ) + { + + // Software alpha blending + // It's actually plausible to implement this entirely using D3D and thus get hardware acceleration + // Perhaps we should detect device caps and use a suitable method? + // This should work on every Decal configuration though (except bank switched video cards, but who has them? :) + + //Lock and calculate metrics for destination + + DDSURFACEDESC2 ddsd; + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + int left = current.window.left; + int top = current.window.top; + int width = rcSrcClipped.right - rcSrcClipped.left; + int height = rcSrcClipped.bottom - rcSrcClipped.top; + + if (FAILED(m_pSurface->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_NOSYSLOCK, NULL))) + _ASSERTE("Failed to destination lock surface!"); + + WORD *dest = (WORD *)ddsd.lpSurface; + + int iPitch = ddsd.lPitch / 2; + int initialJump = (top * iPitch) + left; + int jump = (iPitch - (width + left)) + left + width; + + //Lock and calculate metrics for source + + DDSURFACEDESC2 srcddsd; + memset(&srcddsd, 0, sizeof(srcddsd)); + srcddsd.dwSize = sizeof(srcddsd); + + if (FAILED(pSurf->Lock(NULL, &srcddsd, DDLOCK_WAIT | DDLOCK_NOSYSLOCK, NULL))) + _ASSERTE("Failed to lock source surface!"); + + WORD *src = (WORD *)srcddsd.lpSurface; + + //Do it + + int iSrcPitch = srcddsd.lPitch / 2; + int alpha = sourceAlpha; + int ialpha = 255 - alpha; + + WORD *srcLine = new WORD[width]; + WORD *destLine = new WORD[width]; + + WORD sB, dB, sG, dG, sR, dR; + + dest += initialJump; + + for (int y = 0; y < height; y++) { + // We'll read 1 line at a time - 80% of the speed decrease here is reading/writing against the surface + + memcpy((void *)srcLine, src, width * 2); + memcpy((void *)destLine, dest, width * 2); + + for (int x = 0; x < width; x++) { + // This method is very fast, but assumes a constant 128 alpha + // destLine[x] = ( (srcLine[x] & 0xF7DE) >> 1) + ( (destLine[x] & 0xF7DE) >> 1); + + // Basically ((alpha * (src - dest) / MAXALPHA) + dest) for each component + // There's some significant room for MMX parrallelism here (~20% more FPS, methinks), but do we want to + // be writing ASM? + + sB = srcLine[x] & ddsd.ddpfPixelFormat.dwBBitMask; + dB = destLine[x] & ddsd.ddpfPixelFormat.dwBBitMask; + sG = srcLine[x] & ddsd.ddpfPixelFormat.dwGBitMask; + dG = destLine[x] & ddsd.ddpfPixelFormat.dwGBitMask; + sR = srcLine[x] & ddsd.ddpfPixelFormat.dwRBitMask; + dR = destLine[x] & ddsd.ddpfPixelFormat.dwRBitMask; + + destLine[x] = ddsd.ddpfPixelFormat.dwBBitMask & ((alpha * (sB - dB) >> 8) + dB) | + ddsd.ddpfPixelFormat.dwGBitMask & (((alpha * (sG - dG) >> 8) + dG)) | + ddsd.ddpfPixelFormat.dwRBitMask & (((alpha * (sR - dR) >> 8) + dR)); + + // The below is eversoslightly faster by assuming RGB 565 surface exposure. Some stupid old cards + // blow up however. Fiddle if you like, YMMV. I'm sticking with something that works :) + + //sB = srcLine[x] & 0x1f; + //dB = destLine[x] & 0x1f; + //sG = (srcLine[x] >> 5) & 0x3f; + //dG = (destLine[x] >> 5) & 0x3f; + //sR = (srcLine[x] >> 11) & 0x1f; + //dR = (destLine[x] >> 11) & 0x1f; + + //destLine[x] = ((alpha * (sB - dB) >> 8) + dB) | + // (((alpha * (sG - dG) >> 8) + dG) << 5) | + // (((alpha * (sR - dR) >> 8) + dR) << 11);*/ + } + + memcpy(dest, destLine, width * 2); + + src += iSrcPitch; + dest += jump; + } + + //Release + + delete srcLine; + delete destLine; + + if (FAILED(pSurf->Unlock(NULL))) + _ASSERTE("Failed to unlock source surface!"); + + if (FAILED(m_pSurface->Unlock(NULL))) + _ASSERTE("Failed to unlock destination surface!"); + } + else if ((cManager::_p->m_eAlphaBlendMode == eAlphaBlendGDIPlus) && (AlphaBlendF!=NULL)) + { + HDC hdcd; + HDC hdcs; + GetDC(&hdcd); + pSrc->GetDC(&hdcs); + + hRes = AlphaBlendF(hdcd, current.org.x, current.org.y, rcSrcClipped.right-rcSrcClipped.left, rcSrcClipped.bottom-rcSrcClipped.top, hdcs, current.org.x, current.org.y, rcSrcClipped.right-rcSrcClipped.left, rcSrcClipped.bottom-rcSrcClipped.top, m_bf); + + pSrc->ReleaseDC(); + ReleaseDC(); + } + } + else + { + hRes = m_pSurface->BltFast( current.window.left, current.window.top, pSurf, &rcSrcClipped, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT ); + } + + +/* if(!SUCCEEDED(hRes)) + { + POINT pt = { 0, 0 }; + ClientToScreen(cManager::_p->m_hMain, &pt); + + /*if((pt.x==0) || (pt.y==0)) + MessageBox(0,"asd","asd",0);*/ + //RECT rcd = {pt.x, pt.y, rcSrcClipped.right-rcSrcClipped.left, rcSrcClipped.bottom-rcSrcClipped.top}; + //m_pSurface->Blt(&rcd,pSurf,&rcSrcClipped,DDBLT_WAIT,NULL); + // RECT rcd = {0, 0, 640, 480}; + +/* rcSrcClipped.left+=current.window.left+pt.x; + rcSrcClipped.right+=current.window.left+pt.x; + rcSrcClipped.top+=current.window.top+pt.y+28; + rcSrcClipped.bottom+=current.window.top+pt.y+28; +/* + DDBLTFX ddbltfx; + + ddbltfx.dwSize=sizeof(ddbltfx); + ddbltfx.dwFillColor=5; + + m_pSurface->Blt(&rcSrcClipped,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);*/ + +/* CComPtr< ICanvas > pCan; + cManager::_p->GetPrimarySurface(&pCan); + CComPtr< IDirectDrawSurface4 > pDDS4; + pCan->GetSurface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &pDDS4 ) ); + + // if(m_pSurface.p==pDDS4.p) + + + if(cManager::_p->m_lpSurface!=NULL) + { + MessageBeep(0); + DDSURFACEDESC2 ddesc; + ddesc.dwSize=sizeof(DDSURFACEDESC2); + + pSurf->Lock(&rcSrcClipped, &ddesc, DDLOCK_SURFACEMEMORYPTR , NULL); + + //m_pSurface->Blt(&rcSrcClipped,pSurf,NULL,DDBLT_KEYSRC | DDBLT_WAIT ,NULL); + memcpy(cManager::_p->m_lpSurface, ddesc.lpSurface, 1000); + + pSurf->Unlock(&rcSrcClipped); + + SetEvent(cManager::_p->m_hDrawSync); + + } + +//m_pSurface->Blt(&rcSrcClipped,pSurf,NULL,DDBLT_KEYSRC | DDBLT_WAIT ,NULL); + + + /* RECT rc; + ::GetWindowRect( cManager::_p->m_hMain, &rc );*/ +/* + HDC hdcd; + HDC hdcs; + m_pSurface->GetDC(&hdcd); + pSurf->GetDC(&hdcs); + BitBlt(hdcd, pt.x+current.window.left, pt.y+28+current.window.top, 332, current.window.bottom-current.window.top, hdcs, rcSrcClipped.left, rcSrcClipped.top, SRCCOPY); + pSurf->ReleaseDC(hdcs); + m_pSurface->ReleaseDC(hdcd);*/ + +/* hRes=0; + } + + /*if(!SUCCEEDED(hRes)) + SetEvent(cManager::_p->m_hDrawSync);*/ + + _ASSERTE( SUCCEEDED( hRes ) ); + } + + PopClipRect(); + + _ASSERTMEM( _CrtCheckMemory() ); + + return S_OK; +} + +STDMETHODIMP cCanvas::HitTest(LPPOINT ppt, VARIANT_BOOL *pbHit) +{ + _ASSERTE( ppt != NULL ); + _ASSERTE( pbHit != NULL ); + + // Assuming we're in screen coords + ClipParams &clip = m_clipping.top(); + + if( ppt->x >= clip.window.left && ppt->y >= clip.window.top && + ppt->x <= clip.window.right && ppt->y <= clip.window.bottom ) + { + *pbHit = VARIANT_TRUE; + } + else + *pbHit = VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cCanvas::ToClient(LPPOINT pt) +{ + _ASSERTE( pt != NULL ); + + ClipParams &clip = m_clipping.top(); + pt->x -= clip.window.left - clip.org.x; + pt->y -= clip.window.top - clip.org.y; + + return S_OK; +} + +STDMETHODIMP cCanvas::ToScreen(LPPOINT ppt) +{ + _ASSERTE( ppt != NULL ); + + ClipParams &clip = m_clipping.top(); + ppt->x += clip.window.left - clip.org.x; + ppt->y += clip.window.top - clip.org.y; + + return S_OK; +} + +STDMETHODIMP cCanvas::OffsetOrg(LPPOINT ppt, VARIANT_BOOL *pbVisible) +{ + _ASSERTE( ppt != NULL ); + _ASSERTE( pbVisible != NULL ); + _ASSERTE( m_clipping.size() != 1 ); + + ClipParams &clip = m_clipping.top(); + clip.org.x += ppt->x; + clip.org.y += ppt->y; + + *pbVisible = clip.visible; + + return S_OK; +} + +STDMETHODIMP cCanvas::SetClipRect(LPRECT prc, VARIANT_BOOL *pbVisible) +{ + _ASSERTE( prc != NULL ); + _ASSERTE( prc->right >= prc->left && prc->bottom >= prc->top ); + _ASSERTE( pbVisible != NULL ); + _ASSERTE( m_clipping.size() != 1 ); + + ClipParams ¤t = m_clipping.top(); + + int nChildLeft = prc->left + current.window.left - current.org.x, + nChildTop = prc->top + current.window.top - current.org.y, + nChildWidth = prc->right - prc->left, + nChildHeight = prc->bottom - prc->top; + + ClipParams p = { + { nChildLeft, nChildTop, nChildLeft + nChildWidth, nChildTop + nChildHeight }, + { 0, 0 }, + VARIANT_TRUE }; + + // Clip the four sides of the rectangle + if( p.window.left < current.window.left ) + { + // Clip left edge + p.org.x += current.window.left - p.window.left; + p.window.left = current.window.left; + } + + if( p.window.top < current.window.top ) + { + // Clip top edge + p.org.y += current.window.top - p.window.top; + p.window.top = current.window.top; + } + + if( p.window.right > current.window.right ) + // Clip right edge + p.window.right = current.window.right; + + if( p.window.bottom > current.window.bottom ) + // Clip bottom edge + p.window.bottom = current.window.bottom; + + // Check for clipping out of existance + if( p.window.left >= p.window.right || p.window.top >= p.window.bottom ) + // This rectangle is no longer visible + p.visible = VARIANT_FALSE; + + // Return the remainder of the rectangle + *pbVisible = p.visible; + + m_clipping.top() = p; + + return S_OK; +} + +STDMETHODIMP cCanvas::put_Alpha(long Alpha) +{ + m_bf.SourceConstantAlpha = sourceAlpha = Alpha; + return S_OK; +} + +// processMask - Support function for DownMixRGB + +void cCanvas::processMask(WORD bitMask, WORD *loBit, WORD *bitCount) { + _ASSERTE(loBit); + _ASSERTE(bitCount); + + WORD mask = 1; + + for (*loBit = 0; *loBit < 16; (*loBit)++) { + if (bitMask & mask) + break; + + mask <<= 1; + } + + for (*bitCount = 1; *bitCount < 32; (*bitCount)++) { + mask <<= 1; + + if (!(bitMask & mask)) + break; + + } +} + +// DownMixRGB - Returns a 16 bit RGB value suitable for this canvas from a standard R, G, B set + +STDMETHODIMP cCanvas::DownMixRGB(WORD wRed, WORD wGreen, WORD wBlue, WORD *wDMRGB) { + _ASSERTE(wDMRGB); + + if (wRBitCount == 0) { + // We've never obtained surface information before for this canvas + DDSURFACEDESC2 desc; + desc.dwSize = sizeof( DDSURFACEDESC2 ); + + if (FAILED(m_pSurface->GetSurfaceDesc(&desc))) + return S_FALSE; + + processMask(desc.ddpfPixelFormat.dwRBitMask, &wRLoBit, &wRBitCount); + processMask(desc.ddpfPixelFormat.dwGBitMask, &wGLoBit, &wGBitCount); + processMask(desc.ddpfPixelFormat.dwBBitMask, &wBLoBit, &wBBitCount); + } + + // Transparent color handling + if (wRed == 0 && wGreen == 255 && wBlue == 255) { + // We are a transparent colour - The downmix would've destroyed it + *wDMRGB = 0x07FF; + } else { + // Safe for a normal mix + *wDMRGB = ((wRed * (1 << wRBitCount)) / 256) << wRLoBit | + ((wGreen * (1 << wGBitCount)) / 256) << wGLoBit | + ((wBlue * (1 << wBBitCount)) / 256) << wBLoBit; + } + + return S_OK; +} + +STDMETHODIMP cCanvas::GetDCLong(long *DC) +{ + HDC pdc; + GetDC(&pdc); + *DC = reinterpret_cast< long >( pdc ); + + return S_OK; +} + +STDMETHODIMP cCanvas::SetTransparentColor(long TransColor) +{ + unsigned short wDownmix; + + DownMixRGB((BYTE)TransColor, (BYTE)(TransColor >> 8), (BYTE)(TransColor >> 16), &wDownmix ); + + _DDCOLORKEY colorkey; + + colorkey.dwColorSpaceHighValue = wDownmix; + colorkey.dwColorSpaceLowValue = wDownmix; + + m_pSurface->SetColorKey( DDCKEY_SRCBLT, &colorkey ); + + return S_OK; +} + +STDMETHODIMP cCanvas::StretchBlt(LPRECT prcSrc, ICanvas *pSrc, LPRECT prcDest) +{ + _ASSERTE( pSrc != NULL ); + _ASSERTE( prcSrc != NULL ); + _ASSERTE( prcSrc->right > prcSrc->left && prcSrc->bottom > prcSrc->top ); + //_ASSERTE( pptDest != NULL ); + + testSurface(); + + //RECT rc = { pptDest->x, pptDest->y, pptDest->x + ( prcSrc->right - prcSrc->left ), pptDest->y + ( prcSrc->bottom - prcSrc->top ) }; + + // Ok, first, make up the clip rect + RECT rc = { prcDest->left, prcDest->top, prcDest->right, prcDest->bottom }; + + VARIANT_BOOL bVisible = TRUE; + + PushClipRect( &rc, &bVisible ); + + //if( bVisible ) + { + CComPtr< IDirectDrawSurface4 > pSurf; + pSrc->GetSurface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &pSurf ) ); + + _ASSERTE( pSurf.p != NULL ); + _ASSERTE( pSurf->IsLost() == DD_OK ); + + // Calculate the metrics +#ifdef _DEBUG + SIZE sz; + pSrc->get_Size( &sz ); + + _ASSERTE( prcSrc->left >= 0 && prcSrc->top >= 0 && prcSrc->right <= sz.cx && prcSrc->bottom <= sz.cy ); +#endif + + ClipParams ¤t = m_clipping.top(); + + RECT rcSrcClipped = { + prcSrc->left, + prcSrc->top, + prcSrc->right,// + ( current.window.right - current.window.left ), + prcSrc->bottom// + ( current.window.bottom - current.window.top ) + }; + + RECT rcDestClipped = { + prcDest->left + current.org.x + current.window.left, + prcDest->top + current.org.y + current.window.top, + prcDest->left + prcDest->right + current.org.x, + prcDest->top + prcDest->bottom + current.org.y + }; + + HRESULT hRes = m_pSurface->Blt( &rcDestClipped, pSurf, &rcSrcClipped, DDBLT_KEYSRC | DDBLT_WAIT, NULL ); + + _ASSERTE( SUCCEEDED( hRes ) ); + } + + PopClipRect(); + + _ASSERTMEM( _CrtCheckMemory() ); + + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/Canvas.h b/Native/Inject/Canvas.h new file mode 100644 index 0000000..f14422b --- /dev/null +++ b/Native/Inject/Canvas.h @@ -0,0 +1,79 @@ +// Canvas.h : Declaration of the cCanvas + +#ifndef __CANVAS_H_ +#define __CANVAS_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cCanvas +class ATL_NO_VTABLE cCanvas : + public CComObjectRootEx, + public ICanvas +{ +public: + cCanvas() + : m_hdc( NULL ), + m_rgn( NULL ) + { + m_bf.SourceConstantAlpha = 255; + m_bf.BlendOp = AC_SRC_OVER; + m_bf.BlendFlags = 0; + m_bf.AlphaFormat = 0; + sourceAlpha = 255; + wRBitCount = 0; + } + + ~cCanvas(); + + CComPtr< IDirectDrawSurface4 > m_pSurface; + SIZE m_sz; + + typedef std::stack< ClipParams > cClipStack; + cClipStack m_clipping; + + HDC m_hdc; + HRGN m_rgn; + + BLENDFUNCTION m_bf; + + WORD wRBitCount, wGBitCount, wBBitCount; + WORD wRLoBit, wGLoBit, wBLoBit; + + long sourceAlpha; + + void testSurface(); + void processMask(WORD bitMask, WORD *loBit, WORD *bitCount); + + +BEGIN_COM_MAP(cCanvas) + COM_INTERFACE_ENTRY(ICanvas) +END_COM_MAP() + +// ICanvas +public: + STDMETHOD(SetTransparentColor)(/*[in]*/ long TransColor); + STDMETHOD(GetDCLong)(long *DC); + STDMETHOD(SetClipRect)(LPRECT prcClip, VARIANT_BOOL *pbVisible); + STDMETHOD(OffsetOrg)(LPPOINT ppt, VARIANT_BOOL *pbVisible); + STDMETHOD(ToScreen)(/*[in, out]*/ LPPOINT ppt); + STDMETHOD(ToClient)(/*[in, out]*/ LPPOINT pt); + STDMETHOD(HitTest)(LPPOINT ppt, /*[out, retval]*/ VARIANT_BOOL *pbHit); + STDMETHOD(Blt)(LPRECT prcSrc, ICanvas *pSrc, LPPOINT pptDest); + STDMETHOD(get_Size)(/*[out, retval]*/ LPSIZE pVal); + STDMETHOD(put_Size)(/*[in]*/ LPSIZE newVal); + STDMETHOD(get_WasLost)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(Frame)(LPRECT prc, long nRGB); + STDMETHOD(Fill)(LPRECT prc, long nRGB); + STDMETHOD(GetClipParams)(/*[out, retval]*/ ClipParams *pParams); + STDMETHOD(GetSurface)(REFIID iid, /*[out, retval, iid_is(iid)]*/ void **ppvItf); + STDMETHOD(ReleaseDC)(); + STDMETHOD(GetDC)(/*[out,retval]*/ HDC *pdc); + STDMETHOD(PopClipRect)(); + STDMETHOD(PushClipRect)(LPRECT prc, /*[out, retval]*/ VARIANT_BOOL *pbVisible); + STDMETHOD(put_Alpha)(long Alpha); + STDMETHOD(DownMixRGB)(WORD wRed, WORD wGreen, WORD wBlue, /*[out, retval]*/ WORD *wDMRGB); + STDMETHOD(StretchBlt)(LPRECT prcSrc, ICanvas *pSrc, LPRECT prcDest); +}; + +#endif //__CANVAS_H_ diff --git a/Native/Inject/DatFile.cpp b/Native/Inject/DatFile.cpp new file mode 100644 index 0000000..a0b5027 --- /dev/null +++ b/Native/Inject/DatFile.cpp @@ -0,0 +1,164 @@ +// ACFile.cpp +// Implementation of class cACFile + +#include "stdafx.h" +#include "DatFile.h" + +#define AC_NUMFILELOC 0x03E +#define AC_ROOTDIRPTRLOC 0x148 + +#define new DEBUG_NEW + +cDatFile::cFile::cFile( cDatFile *pSource, BYTE *pFirstSector, DWORD dwSize ) +: m_pFirstSector( pFirstSector ), +m_pCurrentSector( pFirstSector ), +m_pCurrentByte( pFirstSector + sizeof( DWORD ) ), +m_dwSize( dwSize ), +m_dwOffset( 0 ), +m_pSource( pSource ) +{ +} + +void cDatFile::cFile::reset() +{ + m_pCurrentSector = m_pFirstSector; + m_pCurrentByte = m_pFirstSector + sizeof( DWORD ); + m_dwOffset = 0; +} + +DWORD cDatFile::cFile::read( BYTE *pbBuffer, DWORD dwSize ) +{ + // Check if we can fit + if( dwSize + m_dwOffset > m_dwSize ) + dwSize = m_dwSize - m_dwOffset; + + DWORD dwRemaining = dwSize; + while( dwRemaining > 0 ) + { + if( ( m_pCurrentByte + dwRemaining ) > m_pCurrentSector + m_pSource->m_dwSectorSize ) + { + // We are reading over a sector boundary, read what we've got and reset for the next sector + DWORD dwSection = ( m_pCurrentSector + m_pSource->m_dwSectorSize ) - m_pCurrentByte; + + ::memcpy( pbBuffer, m_pCurrentByte, dwSection ); + m_pCurrentSector = m_pSource->m_pData + *reinterpret_cast< DWORD * >( m_pCurrentSector ); + m_pCurrentByte = m_pCurrentSector + sizeof( DWORD ); + + dwRemaining -= dwSection; + pbBuffer += dwSection; + } + else + { + ::memcpy( pbBuffer, m_pCurrentByte, dwRemaining ); + m_pCurrentByte += dwRemaining; + dwRemaining = 0; + } + } + + m_dwOffset += dwSize; + return dwSize; +} + +DWORD cDatFile::cFile::skip( DWORD dwSize ) +{ + // Check if we can fit + if( dwSize + m_dwOffset > m_dwSize ) + dwSize = m_dwSize - m_dwOffset; + + DWORD dwRemaining = dwSize; + while( dwRemaining > 0 ) + { + if( ( m_pCurrentByte + dwRemaining ) > m_pCurrentSector + m_pSource->m_dwSectorSize ) + { + // We are reading over a sector boundary, read what we've got and reset for the next sector + DWORD dwSection = ( m_pCurrentSector + m_pSource->m_dwSectorSize ) - m_pCurrentByte; + + m_pCurrentSector = m_pSource->m_pData + *reinterpret_cast< DWORD * >( m_pCurrentSector ); + m_pCurrentByte = m_pCurrentSector + sizeof( DWORD ); + + dwRemaining -= dwSection; + } + else + { + m_pCurrentByte += dwRemaining; + dwRemaining = 0; + } + } + + m_dwOffset += dwSize; + return dwSize; +} + +cDatFile::cDatFile( LPCTSTR szFilename, DWORD dwSectorSize ) +: m_hFile( NULL ), +m_hMapping( NULL ), +m_pData( NULL ), +m_dwSectorSize( dwSectorSize ) +{ + m_hFile = ::CreateFile( szFilename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL ); + + if( m_hFile == INVALID_HANDLE_VALUE ) + throw std::exception(); + + // Proceed to create the file mapping + m_hMapping = ::CreateFileMapping( m_hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL ); + if( m_hMapping == NULL ) + { + ::CloseHandle( m_hFile ); + throw std::exception(); + } + + m_pData = reinterpret_cast< BYTE * >( ::MapViewOfFileEx( m_hMapping, FILE_MAP_READ, 0, 0, 0, NULL ) ); + + if( m_pData == NULL ) + { + ::CloseHandle( m_hMapping ); + ::CloseHandle( m_hFile ); + throw std::exception(); + } +} + +cDatFile::~cDatFile() +{ + ::UnmapViewOfFile( m_pData ); + ::CloseHandle( m_hMapping ); + ::CloseHandle( m_hFile ); +} + +cDatFile::cFile cDatFile::getFile( DWORD dwFileNumber ) +{ + cDirectory dir; + + // Search for our golden file + for ( DWORD dwDirStart = *reinterpret_cast< DWORD * >( m_pData + AC_ROOTDIRPTRLOC ); dwDirStart != 0; ) + { + cFile dir_entry( this, m_pData + dwDirStart, sizeof( cDirectory ) ); + dir_entry.read( reinterpret_cast< BYTE * >( &dir ), sizeof( cDirectory ) ); + + // Now, the files are located like triplets, so copy the triplets + cFileEntry *pEntry = dir.m_files, + *pEndEntry = pEntry + dir.m_dwFiles; + + for( cFileEntry *pIter = pEntry; pIter != pEndEntry && pIter->m_dwID < dwFileNumber; ++ pIter ); + + // We either got an exact match - or we attempt to further narrow down the file + if( pIter != pEndEntry ) + { + // We found some sort of match + if( pIter->m_dwID == dwFileNumber ) + // This is an exact match hooray + return cFile( this, m_pData + pIter->m_dwOffset, pIter->m_dwSize ); + } + + // We have an inexact match, but now we attempt to recurse + if( dir.m_subdirs[ 0 ] == 0 ) + // If the first entry in the directory is 0, there are no + // helpers - we lose, it's not here + break; + + dwDirStart = dir.m_subdirs[ pIter - pEntry ]; + } + + // If we get here, the file wasn't found - sniff + throw std::exception(); +} diff --git a/Native/Inject/DatFile.h b/Native/Inject/DatFile.h new file mode 100644 index 0000000..041e73a --- /dev/null +++ b/Native/Inject/DatFile.h @@ -0,0 +1,76 @@ +// DatFile.h +// Declaration of class cDatFile +// Class for extracting data from portal.dat and cell.dat + +#ifndef __ACFILE_H +#define __ACFILE_H + +#define FILE_COUNT 62 + +class cDatFile +{ + // The AC File is created as a memory mapped file + // so we let the memory manager cache manage - it's also quite a bit nicer than + // code to seek/read everything + HANDLE m_hFile, + m_hMapping; + BYTE *m_pData; + DWORD m_dwSectorSize; + +public: + class cFile + { + BYTE *m_pFirstSector, + *m_pCurrentSector, + *m_pCurrentByte; + DWORD m_dwSize, + m_dwOffset; + cDatFile *m_pSource; + + public: + // Locate the file in a directory + + cFile( cDatFile *pSource, BYTE *pFirstSector, DWORD dwSize ); + + DWORD getSize() const + { + return m_dwSize; + } + + DWORD tell() const + { + return m_dwOffset; + } + + void reset(); + DWORD read( BYTE *pbBuffer, DWORD dwSize ); + DWORD skip( DWORD dwSize ); + }; + + cDatFile( LPCTSTR szFilename, DWORD dwSectorSize = 256 ); + ~cDatFile(); + + cFile getFile( DWORD dwFileNumber ); + + // Structures +#pragma pack( push, 1 ) + struct cFileEntry + { + DWORD m_dwID, + m_dwOffset, + m_dwSize; + }; + + struct cDirectory + { + DWORD m_subdirs[ FILE_COUNT ]; + DWORD m_dwFiles; + cFileEntry m_files[ FILE_COUNT ]; + }; + +#pragma pack( pop ) + + friend cFile; +}; + +#endif diff --git a/Native/Inject/Direct3DHook.cpp b/Native/Inject/Direct3DHook.cpp new file mode 100644 index 0000000..c66b2cf --- /dev/null +++ b/Native/Inject/Direct3DHook.cpp @@ -0,0 +1,43 @@ +// Direct3DHook.cpp : Implementation of CDirect3DHook +#include "stdafx.h" +#include "Inject.h" +#include "Direct3DHook.h" + +#include "InjectApi.h" +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// CDirect3DHook + +void CDirect3DHook::setObject( IUnknown *pDevice ) +{ + pDevice->QueryInterface( IID_IDirect3DDevice, reinterpret_cast< void ** >( &m_pDevice ) ); + pDevice->QueryInterface( IID_IDirect3DDevice2, reinterpret_cast< void ** >( &m_pDevice2 ) ); + pDevice->QueryInterface( IID_IDirect3DDevice3, reinterpret_cast< void ** >( &m_pDevice3 ) ); +} + +STDMETHODIMP CDirect3DHook::BeginScene() +{ + cManager::_p->sendPreBeginScene(); + + HRESULT hRes = m_pDevice->BeginScene(); + + cManager::_p->sendPostBeginScene(); + + return hRes; +} + +STDMETHODIMP CDirect3DHook::EndScene() +{ + cManager::_p->draw3D(); + cManager::_p->sendPreEndScene(); + + HRESULT hRes = m_pDevice->EndScene(); + + // Draw the user 2D layer + cManager::_p->draw2D(); + cManager::_p->sendPostEndScene(); + + return hRes; +} + diff --git a/Native/Inject/Direct3DHook.h b/Native/Inject/Direct3DHook.h new file mode 100644 index 0000000..1563df1 --- /dev/null +++ b/Native/Inject/Direct3DHook.h @@ -0,0 +1,371 @@ +// Direct3DHook.h : Declaration of the CDirect3DHook + +#ifndef __DIRECT3DHOOK_H_ +#define __DIRECT3DHOOK_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// CDirect3DHook +class ATL_NO_VTABLE CDirect3DHook : + public CComObjectRootEx, + public IDirect3DDevice, + public IDirect3DDevice2, + public IDirect3DDevice3 +{ +public: + CDirect3DHook() + { + } + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CDirect3DHook) + COM_INTERFACE_ENTRY_IID( IID_IDirect3DDevice, IDirect3DDevice ) + COM_INTERFACE_ENTRY_IID( IID_IDirect3DDevice2, IDirect3DDevice2 ) + COM_INTERFACE_ENTRY_IID( IID_IDirect3DDevice3, IDirect3DDevice3 ) +END_COM_MAP() + + CComPtr< IDirect3DDevice > m_pDevice; + CComPtr< IDirect3DDevice2 > m_pDevice2; + CComPtr< IDirect3DDevice3 > m_pDevice3; + + void setObject( IUnknown *pDevice ); + +// IDirect3DHook +public: + // Functions from IDirect3DDevice + + STDMETHOD(Initialize)(LPDIRECT3D p1,LPGUID p2,LPD3DDEVICEDESC p3) + { + return m_pDevice->Initialize( p1, p2, p3 ); + } + + STDMETHOD(GetCaps)(LPD3DDEVICEDESC p1,LPD3DDEVICEDESC p2) + { + return m_pDevice->GetCaps( p1, p2 ); + } + + STDMETHOD(SwapTextureHandles)(LPDIRECT3DTEXTURE p1,LPDIRECT3DTEXTURE p2) + { + return m_pDevice->SwapTextureHandles( p1, p2 ); + } + + STDMETHOD(CreateExecuteBuffer)(LPD3DEXECUTEBUFFERDESC p1,LPDIRECT3DEXECUTEBUFFER*p2,IUnknown*p3) + { + return m_pDevice->CreateExecuteBuffer( p1, p2, p3 ); + } + + STDMETHOD(GetStats)(LPD3DSTATS p1) + { + return m_pDevice->GetStats( p1 ); + } + + STDMETHOD(Execute)(LPDIRECT3DEXECUTEBUFFER p1,LPDIRECT3DVIEWPORT p2,DWORD p3) + { + return m_pDevice->Execute( p1, p2, p3 ); + } + + STDMETHOD(AddViewport)(LPDIRECT3DVIEWPORT p1) + { + return m_pDevice->AddViewport( p1 ); + } + + STDMETHOD(DeleteViewport)(LPDIRECT3DVIEWPORT p1) + { + return m_pDevice->DeleteViewport( p1 ); + } + + STDMETHOD(NextViewport)(LPDIRECT3DVIEWPORT p1,LPDIRECT3DVIEWPORT*p2,DWORD p3) + { + return m_pDevice->NextViewport( p1, p2, p3 ); + } + + STDMETHOD(Pick)(LPDIRECT3DEXECUTEBUFFER p1,LPDIRECT3DVIEWPORT p2,DWORD p3,LPD3DRECT p4) + { + return m_pDevice->Pick( p1, p2, p3, p4 ); + } + + STDMETHOD(GetPickRecords)(LPDWORD p1,LPD3DPICKRECORD p2) + { + return m_pDevice->GetPickRecords( p1, p2 ); + } + + STDMETHOD(EnumTextureFormats)(LPD3DENUMTEXTUREFORMATSCALLBACK p1,LPVOID p2) + { + return m_pDevice->EnumTextureFormats( p1, p2 ); + } + + STDMETHOD(CreateMatrix)(LPD3DMATRIXHANDLE p1) + { + return m_pDevice->CreateMatrix( p1 ); + } + + STDMETHOD(SetMatrix)(D3DMATRIXHANDLE p1,const LPD3DMATRIX p2) + { + return m_pDevice->SetMatrix( p1, p2 ); + } + + STDMETHOD(GetMatrix)(D3DMATRIXHANDLE p1,LPD3DMATRIX p2) + { + return m_pDevice->GetMatrix( p1, p2 ); + } + + STDMETHOD(DeleteMatrix)(D3DMATRIXHANDLE p1) + { + return m_pDevice->DeleteMatrix( p1 ); + } + + STDMETHOD(BeginScene)(); + + STDMETHOD(EndScene)(); + + STDMETHOD(GetDirect3D)(LPDIRECT3D*p1) + { + return m_pDevice->GetDirect3D( p1 ); + } + + // Functions from IDirect3DDevice2 + STDMETHOD(SwapTextureHandles)(LPDIRECT3DTEXTURE2 p1,LPDIRECT3DTEXTURE2 p2) + { + return m_pDevice2->SwapTextureHandles( p1, p2 ); + } + + STDMETHOD(AddViewport)(LPDIRECT3DVIEWPORT2 p1) + { + return m_pDevice2->AddViewport( p1 ); + } + + STDMETHOD(DeleteViewport)(LPDIRECT3DVIEWPORT2 p1) + { + return m_pDevice2->DeleteViewport( p1 ); + } + + STDMETHOD(NextViewport)(LPDIRECT3DVIEWPORT2 p1,LPDIRECT3DVIEWPORT2*p2,DWORD p3) + { + return m_pDevice2->NextViewport( p1, p2, p3 ); + } + + STDMETHOD(GetDirect3D)(LPDIRECT3D2*p1) + { + return m_pDevice2->GetDirect3D( p1 ); + } + + STDMETHOD(SetCurrentViewport)(LPDIRECT3DVIEWPORT2 p1) + { + return m_pDevice2->SetCurrentViewport( p1 ); + } + + STDMETHOD(GetCurrentViewport)(LPDIRECT3DVIEWPORT2 *p1) + { + return m_pDevice2->GetCurrentViewport( p1 ); + } + + STDMETHOD(SetRenderTarget)(LPDIRECTDRAWSURFACE p1,DWORD p2) + { + return m_pDevice2->SetRenderTarget( p1, p2 ); + } + + STDMETHOD(GetRenderTarget)(LPDIRECTDRAWSURFACE *p1) + { + return m_pDevice2->GetRenderTarget( p1 ); + } + + STDMETHOD(Begin)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,DWORD p3) + { + return m_pDevice2->Begin( p1, p2, p3 ); + } + + STDMETHOD(BeginIndexed)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,LPVOID p3,DWORD p4,DWORD p5) + { + return m_pDevice2->BeginIndexed( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(Vertex)(LPVOID p1) + { + return m_pDevice2->Vertex( p1 ); + } + + STDMETHOD(Index)(WORD p1) + { + return m_pDevice2->Index( p1 ); + } + + STDMETHOD(End)(DWORD p1) + { + return m_pDevice2->End( p1 ); + } + + STDMETHOD(GetRenderState)(D3DRENDERSTATETYPE p1,LPDWORD p2) + { + return m_pDevice2->GetRenderState( p1, p2 ); + } + + STDMETHOD(SetRenderState)(D3DRENDERSTATETYPE p1,DWORD p2) + { + return m_pDevice2->SetRenderState( p1, p2 ); + } + + STDMETHOD(GetLightState)(D3DLIGHTSTATETYPE p1,LPDWORD p2) + { + return m_pDevice2->GetLightState( p1, p2 ); + } + + STDMETHOD(SetLightState)(D3DLIGHTSTATETYPE p1,DWORD p2) + { + return m_pDevice2->SetLightState( p1, p2 ); + } + + STDMETHOD(SetTransform)(D3DTRANSFORMSTATETYPE p1,LPD3DMATRIX p2) + { + return m_pDevice2->SetTransform( p1, p2 ); + } + + STDMETHOD(GetTransform)(D3DTRANSFORMSTATETYPE p1,LPD3DMATRIX p2) + { + return m_pDevice2->GetTransform( p1, p2 ); + } + + STDMETHOD(MultiplyTransform)(D3DTRANSFORMSTATETYPE p1,LPD3DMATRIX p2) + { + return m_pDevice2->MultiplyTransform( p1, p2 ); + } + + STDMETHOD(DrawPrimitive)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,LPVOID p3,DWORD p4,DWORD p5) + { + return m_pDevice2->DrawPrimitive( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(DrawIndexedPrimitive)(D3DPRIMITIVETYPE p1,D3DVERTEXTYPE p2,LPVOID p3,DWORD p4,LPWORD p5, DWORD p6, DWORD p7) + { + return m_pDevice2->DrawIndexedPrimitive( p1, p2, p3, p4, p5, p6, p7 ); + } + + STDMETHOD(SetClipStatus)(LPD3DCLIPSTATUS p1) + { + return m_pDevice2->SetClipStatus( p1 ); + } + + STDMETHOD(GetClipStatus)(LPD3DCLIPSTATUS p1) + { + return m_pDevice2->GetClipStatus( p1 ); + } + + // Functions from IDirect3DDevice3 + STDMETHOD(AddViewport)(LPDIRECT3DVIEWPORT3 p1) + { + return m_pDevice3->AddViewport( p1 ); + } + + STDMETHOD(DeleteViewport)(LPDIRECT3DVIEWPORT3 p1) + { + return m_pDevice3->DeleteViewport( p1 ); + } + + STDMETHOD(NextViewport)(LPDIRECT3DVIEWPORT3 p1,LPDIRECT3DVIEWPORT3*p2,DWORD p3) + { + return m_pDevice3->NextViewport( p1, p2, p3 ); + } + + STDMETHOD(EnumTextureFormats)(LPD3DENUMPIXELFORMATSCALLBACK p1,LPVOID p2) + { + return m_pDevice3->EnumTextureFormats( p1, p2 ); + } + + STDMETHOD(GetDirect3D)(LPDIRECT3D3* p1) + { + return m_pDevice3->GetDirect3D( p1 ); + } + + STDMETHOD(SetCurrentViewport)(LPDIRECT3DVIEWPORT3 p1) + { + return m_pDevice3->SetCurrentViewport( p1 ); + } + + STDMETHOD(GetCurrentViewport)(LPDIRECT3DVIEWPORT3 *p1) + { + return m_pDevice3->GetCurrentViewport( p1 ); + } + + STDMETHOD(SetRenderTarget)(LPDIRECTDRAWSURFACE4 p1,DWORD p2) + { + return m_pDevice3->SetRenderTarget( p1, p2 ); + } + + STDMETHOD(GetRenderTarget)(LPDIRECTDRAWSURFACE4 *p1) + { + return m_pDevice3->GetRenderTarget( p1 ); + } + + STDMETHOD(Begin)(D3DPRIMITIVETYPE p1,DWORD p2,DWORD p3) + { + return m_pDevice3->Begin( p1, p2, p3 ); + } + + STDMETHOD(BeginIndexed)(D3DPRIMITIVETYPE p1,DWORD p2,LPVOID p3,DWORD p4,DWORD p5) + { + return m_pDevice3->BeginIndexed( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(DrawPrimitive)(D3DPRIMITIVETYPE p1,DWORD p2,LPVOID p3,DWORD p4,DWORD p5) + { + return m_pDevice3->DrawPrimitive( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(DrawIndexedPrimitive)(D3DPRIMITIVETYPE p1,DWORD p2,LPVOID p3,DWORD p4,LPWORD p5,DWORD p6,DWORD p7) + { + return m_pDevice3->DrawIndexedPrimitive( p1, p2, p3, p4, p5, p6, p7 ); + } + + STDMETHOD(DrawPrimitiveStrided)(D3DPRIMITIVETYPE p1,DWORD p2,LPD3DDRAWPRIMITIVESTRIDEDDATA p3,DWORD p4,DWORD p5) + { + return m_pDevice3->DrawPrimitiveStrided( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(DrawIndexedPrimitiveStrided)(D3DPRIMITIVETYPE p1,DWORD p2,LPD3DDRAWPRIMITIVESTRIDEDDATA p3,DWORD p4 ,LPWORD p5,DWORD p6,DWORD p7) + { + return m_pDevice3->DrawIndexedPrimitiveStrided( p1, p2, p3, p4, p5, p6, p7 ); + } + + STDMETHOD(DrawPrimitiveVB)(D3DPRIMITIVETYPE p1,LPDIRECT3DVERTEXBUFFER p2,DWORD p3,DWORD p4,DWORD p5) + { + return m_pDevice3->DrawPrimitiveVB( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(DrawIndexedPrimitiveVB)(D3DPRIMITIVETYPE p1,LPDIRECT3DVERTEXBUFFER p2,LPWORD p3,DWORD p4,DWORD p5) + { + return m_pDevice3->DrawIndexedPrimitiveVB( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(ComputeSphereVisibility)(LPD3DVECTOR p1,LPD3DVALUE p2,DWORD p3,DWORD p4,LPDWORD p5) + { + return m_pDevice3->ComputeSphereVisibility( p1, p2, p3, p4, p5 ); + } + + STDMETHOD(GetTexture)(DWORD p1,LPDIRECT3DTEXTURE2 *p2) + { + return m_pDevice3->GetTexture( p1, p2 ); + } + + STDMETHOD(SetTexture)(DWORD p1,LPDIRECT3DTEXTURE2 p2) + { + return m_pDevice3->SetTexture( p1, p2 ); + } + + STDMETHOD(GetTextureStageState)(DWORD p1,D3DTEXTURESTAGESTATETYPE p2,LPDWORD p3) + { + return m_pDevice3->GetTextureStageState( p1, p2, p3 ); + } + + STDMETHOD(SetTextureStageState)(DWORD p1,D3DTEXTURESTAGESTATETYPE p2,DWORD p3) + { + return m_pDevice3->SetTextureStageState( p1, p2, p3 ); + } + + STDMETHOD(ValidateDevice)(LPDWORD p1) + { + return m_pDevice3->ValidateDevice( p1 ); + } +}; + +#endif //__DIRECT3DHOOK_H_ diff --git a/Native/Inject/DirectDrawHook.cpp b/Native/Inject/DirectDrawHook.cpp new file mode 100644 index 0000000..a296dca --- /dev/null +++ b/Native/Inject/DirectDrawHook.cpp @@ -0,0 +1,284 @@ +// DirectDrawHook.cpp : Implementation of CDirectDrawHook +#include "stdafx.h" +#include "Inject.h" +#include "DirectDrawHook.h" + +#include "MaterialHook.h" +#include "DirectDrawSurfaceHook.h" + +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// CDirectDrawHook + +void CDirectDrawHook::setObject( IDirectDraw *pDD ) +{ + m_pDD = pDD; + m_pDD->QueryInterface( IID_IDirectDraw2, reinterpret_cast< void ** >( &m_pDD2 ) ); + m_pDD->QueryInterface( IID_IDirectDraw4, reinterpret_cast< void ** >( &m_pDD4 ) ); + + m_pDD->QueryInterface( IID_IDirect3D, reinterpret_cast< void ** >( &m_pD3D ) ); + m_pDD->QueryInterface( IID_IDirect3D2, reinterpret_cast< void ** >( &m_pD3D2 ) ); + m_pDD->QueryInterface( IID_IDirect3D3, reinterpret_cast< void ** >( &m_pD3D3 ) ); + + cManager::_p->setDirectDraw( m_pDD4, m_pD3D3, NULL); +} + +STDMETHODIMP CDirectDrawHook::SetCooperativeLevel(HWND p1, DWORD p2) +{ + cManager::_p->setWindow( p1 ); + return m_pDD->SetCooperativeLevel( p1, p2 ); +} + +STDMETHODIMP CDirectDrawHook::SetDisplayMode(DWORD p1, DWORD p2, DWORD p3) +{ + return m_pDD->SetDisplayMode( p1, p2, p3 ); +} + +HRESULT (__stdcall *pfnOldLock)(IDirectDrawSurface4 *pDDS, LPRECT rc, LPDDSURFACEDESC2 *pddesc, DWORD dwFlags, HANDLE hEvent); +HRESULT (__stdcall *pfnOldUnlock)(IDirectDrawSurface4 *pDDS, LPRECT rc); + +HRESULT __stdcall myLock (IDirectDrawSurface4 *pDDS, LPRECT rc, LPDDSURFACEDESC2 *pddesc, DWORD dwFlags, HANDLE hEvent) +{ + HRESULT hRes = pfnOldLock(pDDS, rc, pddesc, dwFlags, hEvent); + + //if(rc==NULL) + cManager::_p->m_lpSurface = (*pddesc)->lpSurface; + + return hRes; +} + +HRESULT __stdcall myUnlock ( IDirectDrawSurface4 *pDDS, LPRECT rc) +{ + + if(rc==NULL) + { + cManager::_p->draw2D(); + + //WaitForSingleObject(cManager::_p->m_hDrawSync, INFINITE); + //ResetEvent(cManager::_p->m_hDrawSync); + + cManager::_p->m_lpSurface = NULL; + } + // EnterCriticalSection(&cs); + + HRESULT hRes = pfnOldUnlock(pDDS, rc); +// LeaveCriticalSection(&cs); + + //MessageBox(0, _bstr_t(" left: ") + _bstr_t((long)rc->left) + _bstr_t(" top: ") + _bstr_t((long)rc->top) + _bstr_t(" right: ") + _bstr_t((long)rc->right) + _bstr_t(" bottom: ") + _bstr_t((long)rc->bottom), "Asd", 0); + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateSurface(LPDDSURFACEDESC2 p1, LPDIRECTDRAWSURFACE4 FAR *ppDDS, IUnknown FAR *p3) +{ + static long sc = 0; + //static bool bGotPrimary=false; + //static DWORD dwCaps=-1; + + //I have no idea if this serves any purpose anymore, but its causing freezing on software clients. 'Removed' for now. +#if 0 + if(cManager::_p->getSoftwareMode())// && (!bGotPrimary)) + { + CComPtr< IDirectDrawSurface4 > pDDS; + + HRESULT hRes = m_pDD4->CreateSurface( p1, &pDDS, p3 ); + if( FAILED( hRes ) ) + return hRes; + + pDDS->QueryInterface(IID_IDirectDrawSurface4, reinterpret_cast< void ** >(ppDDS)); + + // Get the configured width from the registry + /* DWORD dwConfiguredWidth; + + { + RECT rc; + ::GetClientRect( cManager::_p->m_hMain, &rc ); + dwConfiguredWidth = rc.right - rc.left; + }*/ + + /*if( p1->dwWidth < ( dwConfiguredWidth - 330 ) ) + { + + } +*/ + + if(p1->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + //MessageBox(0, _bstr_t("Width: ") + _bstr_t((long)p1->dwWidth) + _bstr_t(" Height: ") + _bstr_t((long)p1->dwHeight), "asd", 0); + sc++; + /*if(dwCaps!=-1) + if(dwCaps!=p1->ddsCaps.dwCaps) + MessageBox(0, "Diff", "asd", 0);*/ + + // dwCaps = p1->ddsCaps.dwCaps; + + + //if(/*(((sc%2)==0) && (bGotPrimary)) || */(sc==3) || (sc==4)) + { + /*if(sc==1) + InitializeCriticalSection(&cs);*/ + + /*if(bGotPrimary) + { + if(m_pDDS4.p!=NULL) + { + HRESULT (__stdcall *&pfnUnlockPrev)(IDirectDrawSurface4 *pDDS, LPRECT rc) = reinterpret_cast< HRESULT (__stdcall**)(IDirectDrawSurface4 *pDDS, LPRECT rc) > ( *reinterpret_cast< DWORD * > ( m_pDDS4.p ) )[ 32 ]; + + pfnUnlockPrev = pfnOldUnlock; + } + }*/ + + + //EnterCriticalSection(&cs); + + + if(sc==1) + { + HRESULT (__stdcall *&pfnLock)(IDirectDrawSurface4 *, LPRECT, LPDDSURFACEDESC2, DWORD, HANDLE) = reinterpret_cast< HRESULT (__stdcall**)(IDirectDrawSurface4 *, LPRECT, LPDDSURFACEDESC2, DWORD, HANDLE) > ( *reinterpret_cast< DWORD * > ( pDDS.p ) )[ 25 ]; + + HRESULT (__stdcall *&pfnUnlock)(IDirectDrawSurface4 *, LPRECT) = reinterpret_cast< HRESULT (__stdcall**)(IDirectDrawSurface4 *, LPRECT) > ( *reinterpret_cast< DWORD * > ( pDDS.p ) )[ 32 ]; + + pfnOldUnlock = *pfnUnlock; + pfnUnlock = myUnlock; + + cManager::_p->setDirectDraw(m_pDD4, NULL, pDDS); + cManager::_p->setSurface(NULL); + } + + + //bGotPrimary=true; + + //m_pDDS4 = pDDS; + + //LeaveCriticalSection(&cs); + } + } + + return hRes; + } + else +#endif + return m_pDD4->CreateSurface(p1, ppDDS, p3); +} + +STDMETHODIMP CDirectDrawHook::SetDisplayMode(DWORD p1, DWORD p2, DWORD p3, DWORD p4, DWORD p5) +{ + return m_pDD2->SetDisplayMode( p1, p2, p3, p4, p5 ); +} + +STDMETHODIMP CDirectDrawHook::CreateMaterial(LPDIRECT3DMATERIAL *p1,IUnknown *p2) +{ + CComPtr< IDirect3DMaterial > pMat; + HRESULT hRes = m_pD3D->CreateMaterial( &pMat, p2 ); + + if( FAILED( hRes ) ) + return hRes; + + CComObject< CMaterialHook > *pHook; + CComObject< CMaterialHook >::CreateInstance( &pHook ); + pHook->setObject( pMat, m_pDevice2, m_pDevice3 ); + pHook->QueryInterface( IID_IDirect3DMaterial, reinterpret_cast< void ** >( p1 ) ); + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateMaterial(LPDIRECT3DMATERIAL2*p1,IUnknown*p2) +{ + CComPtr< IDirect3DMaterial2 > pMat; + HRESULT hRes = m_pD3D2->CreateMaterial( &pMat, p2 ); + + if( FAILED( hRes ) ) + return hRes; + + CComObject< CMaterialHook > *pHook; + CComObject< CMaterialHook >::CreateInstance( &pHook ); + pHook->setObject( pMat, m_pDevice2, m_pDevice3 ); + pHook->QueryInterface( IID_IDirect3DMaterial2, reinterpret_cast< void ** >( p1 ) ); + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateMaterial(LPDIRECT3DMATERIAL3*p1,LPUNKNOWN p2) +{ + CComPtr< IDirect3DMaterial3 > pMat; + HRESULT hRes = m_pD3D3->CreateMaterial( &pMat, p2 ); + + if( FAILED( hRes ) ) + return hRes; + + CComObject< CMaterialHook > *pHook; + CComObject< CMaterialHook >::CreateInstance( &pHook ); + pHook->setObject( pMat, m_pDevice2, m_pDevice3 ); + pHook->QueryInterface( IID_IDirect3DMaterial3, reinterpret_cast< void ** >( p1 ) ); + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateDevice( REFCLSID cls,LPDIRECTDRAWSURFACE pDDS,LPDIRECT3DDEVICE2 *ppD3D ) +{ + CComPtr< IDirect3DDevice2 > pD3D; + + HRESULT hRes = m_pD3D2->CreateDevice( cls, pDDS, &pD3D ); + + if( FAILED( hRes ) ) + { + //::MessageBox (NULL, "2COULDN'T CreateDevice IN D3D HOOK", "ERROR", MB_OK); + + return hRes; + } + + CComObject< CDirect3DHook > *pHook; + CComObject< CDirect3DHook >::CreateInstance( &pHook ); + pHook->setObject( pD3D ); + + pHook->QueryInterface( IID_IDirect3DDevice2, reinterpret_cast< void ** >( ppD3D ) ); + + m_pDevice2 = *ppD3D; + + return hRes; +} + +STDMETHODIMP CDirectDrawHook::CreateDevice(REFCLSID cls,LPDIRECTDRAWSURFACE4 pDDS,LPDIRECT3DDEVICE3* ppD3D,LPUNKNOWN pUnk) +{ + CComPtr< IDirect3DDevice3 > pD3D; + + HRESULT hRes = m_pD3D3->CreateDevice( cls, pDDS, &pD3D, pUnk ); + + if( FAILED( hRes ) ) + { + //::MessageBox (NULL, "3COULDN'T CreateDevice IN D3D HOOK", "ERROR", MB_OK); + return hRes; + } + + // Ok, figure out if this is the "primary" 3d device + DDSURFACEDESC2 ddsd; + ddsd.dwSize = sizeof( DDSURFACEDESC2 ); + pDDS->GetSurfaceDesc( &ddsd ); + + // Get the configured width from the registry + DWORD dwConfiguredWidth; + + { + RECT rc; + ::GetClientRect( cManager::_p->m_hMain, &rc ); + dwConfiguredWidth = rc.right - rc.left; + } + + if( ddsd.dwWidth < ( dwConfiguredWidth - 330 ) ) + { + // This is a secondary 3ddevice - do not hook it + return pD3D->QueryInterface( IID_IDirect3DDevice3, reinterpret_cast< void ** >( ppD3D ) ); + } + // Ok, we're past the wrong device, get to the right device + cManager::_p->setSurface( pD3D ); + + CComObject< CDirect3DHook > *pHook; + CComObject< CDirect3DHook >::CreateInstance( &pHook ); + pHook->setObject( pD3D ); + + pHook->QueryInterface( IID_IDirect3DDevice3, reinterpret_cast< void ** >( ppD3D ) ); + + m_pDevice3 = *ppD3D; + return hRes; +} diff --git a/Native/Inject/DirectDrawHook.h b/Native/Inject/DirectDrawHook.h new file mode 100644 index 0000000..4fffa03 --- /dev/null +++ b/Native/Inject/DirectDrawHook.h @@ -0,0 +1,278 @@ +// DirectDrawHook.h : Declaration of the CDirectDrawHook + +#ifndef __DIRECTDRAWHOOK_H_ +#define __DIRECTDRAWHOOK_H_ + +#include "resource.h" // main symbols + +#include "Direct3DHook.h" + +///////////////////////////////////////////////////////////////////////////// +// CDirectDrawHook +class ATL_NO_VTABLE CDirectDrawHook : + public CComObjectRootEx, + public IDirectDraw, + public IDirectDraw2, + public IDirectDraw4, + public IDirect3D, + public IDirect3D2, + public IDirect3D3 +{ +public: + CDirectDrawHook() + : m_pDevice2( NULL ), + m_pDevice3( NULL ), m_nSurfaceCount( 0 ) + { + } + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CDirectDrawHook) + COM_INTERFACE_ENTRY_IID(IID_IDirectDraw, IDirectDraw) + COM_INTERFACE_ENTRY_IID(IID_IDirectDraw2, IDirectDraw2) + COM_INTERFACE_ENTRY_IID(IID_IDirectDraw4, IDirectDraw4) + COM_INTERFACE_ENTRY_IID(IID_IDirect3D, IDirect3D) + COM_INTERFACE_ENTRY_IID(IID_IDirect3D2, IDirect3D2) + COM_INTERFACE_ENTRY_IID(IID_IDirect3D3, IDirect3D3) +END_COM_MAP() + + void setObject( IDirectDraw *pDD ); + + CComPtr< IDirectDraw > m_pDD; + CComPtr< IDirectDraw2 > m_pDD2; + CComPtr< IDirectDraw4 > m_pDD4; + + CComPtr< IDirect3D > m_pD3D; + CComPtr< IDirect3D2 > m_pD3D2; + CComPtr< IDirect3D3 > m_pD3D3; + + IDirect3DDevice2 *m_pDevice2; + IDirect3DDevice3 *m_pDevice3; + + CComPtr< IDirectDrawSurface4 > m_pDDS4; + + long m_nSurfaceCount; + +public: + + // IDirectDraw Methods + STDMETHOD(Compact)() + { + return m_pDD->Compact(); + } + + STDMETHOD(CreateClipper)(DWORD p1, LPDIRECTDRAWCLIPPER FAR *p2, IUnknown FAR *p3 ) + { + return m_pDD->CreateClipper( p1, p2, p3 ); + } + + STDMETHOD(CreatePalette)(DWORD p1, LPPALETTEENTRY p2, LPDIRECTDRAWPALETTE FAR*p3, IUnknown FAR *p4 ) + { + return m_pDD->CreatePalette( p1, p2, p3, p4 ); + } + + STDMETHOD(CreateSurface)(LPDDSURFACEDESC p1, LPDIRECTDRAWSURFACE FAR *p2, IUnknown FAR *p3 ) + { + return m_pDD->CreateSurface( p1, p2, p3 ); + } + + STDMETHOD(DuplicateSurface)( LPDIRECTDRAWSURFACE p1, LPDIRECTDRAWSURFACE FAR *p2 ) + { + return m_pDD->DuplicateSurface( p1, p2 ); + } + + STDMETHOD(EnumDisplayModes)( DWORD p1, LPDDSURFACEDESC p2, LPVOID p3, LPDDENUMMODESCALLBACK p4 ) + { + return m_pDD->EnumDisplayModes( p1, p2, p3, p4 ); + } + + STDMETHOD(EnumSurfaces)(DWORD p1, LPDDSURFACEDESC p2, LPVOID p3, LPDDENUMSURFACESCALLBACK p4 ) + { + return m_pDD->EnumSurfaces( p1, p2, p3, p4 ); + } + + STDMETHOD(FlipToGDISurface)() + { + return m_pDD4->FlipToGDISurface(); + } + + STDMETHOD(GetCaps)( LPDDCAPS p1, LPDDCAPS p2 ) + { + return m_pDD4->GetCaps( p1, p2 ); + } + + STDMETHOD(GetDisplayMode)( LPDDSURFACEDESC p1 ) + { + return m_pDD->GetDisplayMode( p1 ); + } + + STDMETHOD(GetFourCCCodes)(LPDWORD p1, LPDWORD p2 ) + { + return m_pDD->GetFourCCCodes( p1, p2 ); + } + + STDMETHOD(GetGDISurface)(LPDIRECTDRAWSURFACE FAR *p1) + { + return m_pDD->GetGDISurface( p1 ); + } + + STDMETHOD(GetMonitorFrequency)(LPDWORD p1) + { + return m_pDD->GetMonitorFrequency( p1 ); + } + + STDMETHOD(GetScanLine)(LPDWORD p1) + { + return m_pDD->GetScanLine( p1 ); + } + + STDMETHOD(GetVerticalBlankStatus)(LPBOOL p1 ) + { + return m_pDD->GetVerticalBlankStatus( p1 ); + } + + STDMETHOD(Initialize)(GUID FAR *p1) + { + return m_pDD->Initialize( p1 ); + } + + STDMETHOD(RestoreDisplayMode)() + { + return m_pDD->RestoreDisplayMode(); + } + + STDMETHOD(SetCooperativeLevel)(HWND p1, DWORD p2); + + STDMETHOD(SetDisplayMode)(DWORD p1, DWORD p2, DWORD p3); + + STDMETHOD(WaitForVerticalBlank)(DWORD p1, HANDLE p2 ) + { + return m_pDD->WaitForVerticalBlank( p1, p2 ); + } + + /*** Added in the v2 interface ***/ + STDMETHOD(GetAvailableVidMem)(LPDDSCAPS p1, LPDWORD p2, LPDWORD p3) + { + return m_pDD2->GetAvailableVidMem( p1, p2, p3 ); + } + + /*** Added in the V4 Interface ***/ + STDMETHOD(GetAvailableVidMem)(LPDDSCAPS2 p1, LPDWORD p2, LPDWORD p3) + { + return m_pDD4->GetAvailableVidMem( p1, p2, p3 ); + } + + STDMETHOD(CreateSurface)(LPDDSURFACEDESC2 p1, LPDIRECTDRAWSURFACE4 FAR *p2, IUnknown FAR *p3); + + STDMETHOD(DuplicateSurface)( LPDIRECTDRAWSURFACE4 p1, LPDIRECTDRAWSURFACE4 FAR *p2 ) + { + return m_pDD4->DuplicateSurface( p1, p2 ); + } + + STDMETHOD(EnumDisplayModes)( DWORD p1, LPDDSURFACEDESC2 p2, LPVOID p3, LPDDENUMMODESCALLBACK2 p4 ) + { + return m_pDD4->EnumDisplayModes( p1, p2, p3, p4 ); + } + + STDMETHOD(EnumSurfaces)(DWORD p1, LPDDSURFACEDESC2 p2, LPVOID p3, LPDDENUMSURFACESCALLBACK2 p4 ) + { + return m_pDD4->EnumSurfaces( p1, p2, p3, p4 ); + } + + STDMETHOD(GetDisplayMode)( LPDDSURFACEDESC2 p1 ) + { + return m_pDD4->GetDisplayMode( p1 ); + } + + STDMETHOD(GetGDISurface)(LPDIRECTDRAWSURFACE4 FAR *p1) + { + return m_pDD4->GetGDISurface( p1 ); + } + + STDMETHOD(GetSurfaceFromDC) (HDC p1, LPDIRECTDRAWSURFACE4 *p2) + { + return m_pDD4->GetSurfaceFromDC( p1, p2 ); + } + + STDMETHOD(RestoreAllSurfaces)() + { + return m_pDD4->RestoreAllSurfaces(); + } + + STDMETHOD(TestCooperativeLevel)() + { + return m_pDD4->TestCooperativeLevel(); + } + + STDMETHOD(GetDeviceIdentifier)(LPDDDEVICEIDENTIFIER p1, DWORD p2 ) + { + return m_pDD4->GetDeviceIdentifier( p1, p2 ); + } + + // Methods for the IDirect3D Interface + STDMETHOD(Initialize)(REFCLSID p1) + { + return m_pD3D->Initialize( p1 ); + } + + STDMETHOD(EnumDevices)(LPD3DENUMDEVICESCALLBACK p1,LPVOID p2) + { + return m_pD3D->EnumDevices( p1, p2 ); + } + + STDMETHOD(CreateLight)(LPDIRECT3DLIGHT*p1,IUnknown*p2) + { + return m_pD3D->CreateLight( p1, p2 ); + } + + STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL *p1,IUnknown *p2); + + STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT*p1,IUnknown*p2) + { + return m_pD3D->CreateViewport( p1, p2 ); + } + + STDMETHOD(FindDevice)(LPD3DFINDDEVICESEARCH p1,LPD3DFINDDEVICERESULT p2) + { + return m_pD3D->FindDevice( p1, p2 ); + } + + // Methods for the IDirect3D2 Interface + STDMETHOD(SetDisplayMode)(DWORD p1, DWORD p2, DWORD p3, DWORD p4, DWORD p5); + + STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL2*p1,IUnknown*p2); + + STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT2*p1,IUnknown*p2) + { + return m_pD3D2->CreateViewport( p1, p2 ); + } + + STDMETHOD(CreateDevice)(REFCLSID cls,LPDIRECTDRAWSURFACE pDDS,LPDIRECT3DDEVICE2 *ppD3D); + + // Methods for the IDirect3D3 Interface + STDMETHOD(CreateMaterial)(LPDIRECT3DMATERIAL3*p1,LPUNKNOWN p2); + + STDMETHOD(CreateViewport)(LPDIRECT3DVIEWPORT3*p1,LPUNKNOWN p2) + { + return m_pD3D3->CreateViewport( p1, p2 ); + } + + STDMETHOD(CreateDevice)(REFCLSID cls,LPDIRECTDRAWSURFACE4 pDDS,LPDIRECT3DDEVICE3* ppD3D,LPUNKNOWN pUnk); + + STDMETHOD(CreateVertexBuffer)(LPD3DVERTEXBUFFERDESC p1,LPDIRECT3DVERTEXBUFFER*p2,DWORD p3,LPUNKNOWN p4) + { + return m_pD3D3->CreateVertexBuffer( p1, p2, p3, p4 ); + } + + STDMETHOD(EnumZBufferFormats)(REFCLSID p1,LPD3DENUMPIXELFORMATSCALLBACK p2,LPVOID p3) + { + return m_pD3D3->EnumZBufferFormats( p1, p2, p3 ); + } + + STDMETHOD(EvictManagedTextures)() + { + return m_pD3D3->EvictManagedTextures(); + } +}; + +#endif //__DIRECTDRAWHOOK_H_ diff --git a/Native/Inject/DirectDrawSurfaceHook.cpp b/Native/Inject/DirectDrawSurfaceHook.cpp new file mode 100644 index 0000000..8a0c035 --- /dev/null +++ b/Native/Inject/DirectDrawSurfaceHook.cpp @@ -0,0 +1,85 @@ +// DirectDrawSurfaceHook.cpp : Implementation of CDirectDrawSurfaceHook +#include "stdafx.h" +#include "Inject.h" +#include "DirectDrawSurfaceHook.h" + +#include "InjectApi.h" +#include "Manager.h" + +void CDirectDrawSurfaceHook::setObject( IUnknown *pDevice ) +{ + pDevice->QueryInterface( IID_IDirectDrawSurface, reinterpret_cast< void ** >( &m_pDDS ) ); + pDevice->QueryInterface( IID_IDirectDrawSurface2, reinterpret_cast< void ** >( &m_pDDS2 ) ); + pDevice->QueryInterface( IID_IDirectDrawSurface3, reinterpret_cast< void ** >( &m_pDDS3 ) ); + pDevice->QueryInterface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &m_pDDS4 ) ); +} + +void CDirectDrawSurfaceHook::setSurfaceNum( long nSurfaceNum ) +{ + m_nSurfaceNum = nSurfaceNum; +} + +STDMETHODIMP CDirectDrawSurfaceHook::Blt(LPRECT p1,LPDIRECTDRAWSURFACE4 p2, LPRECT p3,DWORD p4, LPDDBLTFX p5) +{ +// MessageBeep(0); + // MessageBox(0, "I AM FROM DIRECTDRAWSURFACEHOOK BLT", "YAY!", 0); + // cManager::_p->draw2D(); + + /* DDSURFACEDESC2 ddsd; + ddsd.dwSize = sizeof( DDSURFACEDESC2 ); + m_pDDS4->GetSurfaceDesc( &ddsd ); +*/ +/* HANDLE hFile; +hFile = CreateFile("c:\\acpoo72.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); +SetFilePointer(hFile, 0, 0, FILE_END); +DWORD lpbw; +char tmp[1024]; +//if(p1 != NULL && p3 != NULL) +if(p5==NULL) +wsprintf(tmp, "%d left:%d top:%d right:%d bottom:%d -> left:%d top:%d right:%d bottom:%d\r\n", m_pDDS4, p1->left, p1->top, p1->right, p1->bottom, p3->left, p3->top, p3->right, p3->bottom); + +WriteFile(hFile, tmp, strlen(tmp), &lpbw, NULL); +//WriteFile(hFile, (char*)(_bstr_t((long)ddsd.dwWidth) + _bstr_t("\r\n")), _bstr_t((long)ddsd.dwWidth).length() + 2, &lpbw, NULL); +CloseHandle(hFile); +*//* +if(p3!=NULL) + if(p3->right-p3->left==640) + MessageBeep(0); +*/ + +/* DDBLTFX ddbltfx; + + ddbltfx.dwSize=sizeof(ddbltfx); + ddbltfx.dwFillColor=2; + + HRESULT hRes = m_pDDS4->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&ddbltfx);*/ + +/* if(p3!=NULL) + if((p3->right-p3->left)==332) + MessageBox(0, _bstr_t(m_nSurfaceNum), "asd", 0); +*/ +// MessageBeep(0); + //HRESULT hRes = m_pDDS4->Blt(p1, p2, p3, p4, p5); + +// cManager::_p->draw2D(); +// MessageBeep(0); + return m_pDDS4->Blt(p1, p2, p3, p4, p5); +// return 0;//hRes; +} + +STDMETHODIMP CDirectDrawSurfaceHook::Flip( LPDIRECTDRAWSURFACE4 p1, DWORD p2) +{ +/* + DDSURFACEDESC2 ddsd; + ddsd.dwSize = sizeof( DDSURFACEDESC2 ); + m_pDDS4->GetSurfaceDesc( &ddsd ); + +HANDLE hFile; +hFile = CreateFile("c:\\acpoo4.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); +SetFilePointer(hFile, 0, 0, FILE_END); +DWORD lpbw; +WriteFile(hFile, (char*)(_bstr_t((long)ddsd.dwWidth) + _bstr_t("\r\n")), _bstr_t((long)ddsd.dwWidth).length() + 2, &lpbw, NULL); +CloseHandle(hFile);*/ + + return m_pDDS4->Flip(p1, p2); +} diff --git a/Native/Inject/DirectDrawSurfaceHook.h b/Native/Inject/DirectDrawSurfaceHook.h new file mode 100644 index 0000000..f06016e --- /dev/null +++ b/Native/Inject/DirectDrawSurfaceHook.h @@ -0,0 +1,879 @@ +#ifndef __DIRECTDRAWSURFACEHOOK_H_ +#define __DIRECTDRAWSURFACEHOOK_H_ + +#include "resource.h" + +#define BEGIN_COM_MAP_EX(x) \ +public: typedef x _ComMapClass; \ +static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD dw) \ +{ \ + _ComMapClass* p = (_ComMapClass*)pv; \ + HRESULT hRes = CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); \ + return hRes; \ +} \ +IUnknown* _GetRawUnknown() \ +{ ATLASSERT(_GetEntries()[0].pFunc == _ATL_SIMPLEMAPENTRY); return (IUnknown*)((int)this+_GetEntries()->dw); } \ +_ATL_DECLARE_GET_UNKNOWN(x) \ +HRESULT _InternalQueryInterface(REFIID iid, void** ppvObject) \ +{ return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } \ +const static _ATL_INTMAP_ENTRY* WINAPI _GetEntries() { \ +static const _ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x) + +/* + +#define BEGIN_COM_MAP(x) public: \ + typedef x _ComMapClass; \ + static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw)\ + {\ + _ComMapClass* p = (_ComMapClass*)pv;\ + p->Lock();\ + HRESULT hRes = CComObjectRootBase::_Cache(pv, iid, ppvObject, dw);\ + p->Unlock();\ + return hRes;\ + }\ + IUnknown* _GetRawUnknown() \ + { ATLASSERT(_GetEntries()[0].pFunc == _ATL_SIMPLEMAPENTRY); return (IUnknown*)((DWORD_PTR)this+_GetEntries()->dw); } \ + _ATL_DECLARE_GET_UNKNOWN(x)\ + HRESULT _InternalQueryInterface(REFIID iid, void** ppvObject) \ + { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } \ + const static _ATL_INTMAP_ENTRY* WINAPI _GetEntries() { \ + static const _ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x) + + +///// +public: typedef CDirectDrawSurfaceHook _ComMapClass; +static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD dw) +{ + _ComMapClass* p = (_ComMapClass*)pv; + HRESULT hRes = CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); + return hRes; +} + +IUnknown* _GetRawUnknown() +{ + ATLASSERT(_GetEntries()[0].pFunc == _ATL_SIMPLEMAPENTRY); + return (IUnknown*)((int)this+_GetEntries()->dw); +} + +_ATL_DECLARE_GET_UNKNOWN(x) +HRESULT _InternalQueryInterface(REFIID iid, void** ppvObject) +{ + return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); +} +const static _ATL_INTMAP_ENTRY* WINAPI _GetEntries() +{ + static const _ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x) +///// + +*/ +class ATL_NO_VTABLE CDirectDrawSurfaceHook : + public CComObjectRootEx, + public IDirectDrawSurface, + public IDirectDrawSurface2, + public IDirectDrawSurface3, + public IDirectDrawSurface4 +{ +public: + CDirectDrawSurfaceHook() + { + } + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP_EX(CDirectDrawSurfaceHook) + COM_INTERFACE_ENTRY_IID( IID_IDirectDrawSurface, IDirectDrawSurface ) + COM_INTERFACE_ENTRY_IID( IID_IDirectDrawSurface2, IDirectDrawSurface2 ) + COM_INTERFACE_ENTRY_IID( IID_IDirectDrawSurface3, IDirectDrawSurface3 ) + COM_INTERFACE_ENTRY_IID( IID_IDirectDrawSurface4, IDirectDrawSurface4 ) +END_COM_MAP() + + CComPtr< IDirectDrawSurface > m_pDDS; + CComPtr< IDirectDrawSurface2 > m_pDDS2; + CComPtr< IDirectDrawSurface3 > m_pDDS3; + CComPtr< IDirectDrawSurface4 > m_pDDS4; + + void setObject( IUnknown *pDevice ); + void setSurfaceNum( long nSurfaceNum ); + long m_nSurfaceNum; + +public: + + /* IDirectDrawSurface */ + + STDMETHOD(AddAttachedSurface)(LPDIRECTDRAWSURFACE p1) + { + return m_pDDS->AddAttachedSurface(p1); + } + + STDMETHOD(AddOverlayDirtyRect)(LPRECT p1) + { + return m_pDDS4->AddOverlayDirtyRect(p1); + //return m_pDDS->AddOverlayDirtyRect(p1); + } + + STDMETHOD(Blt)(LPRECT p1,LPDIRECTDRAWSURFACE p2, LPRECT p3,DWORD p4, LPDDBLTFX p5) + { + return m_pDDS->Blt(p1, p2, p3, p4, p5); + } + + STDMETHOD(BltBatch)(LPDDBLTBATCH p1, DWORD p2, DWORD p3) + { + return m_pDDS4->BltBatch(p1, p2, p3); + //return m_pDDS->BltBatch(p1, p2, p3); + } + + STDMETHOD(BltFast)(DWORD p1,DWORD p2,LPDIRECTDRAWSURFACE p3, LPRECT p4,DWORD p5) + { + return m_pDDS->BltFast(p1,p2,p3,p4,p5); + } + + STDMETHOD(DeleteAttachedSurface)(DWORD p1,LPDIRECTDRAWSURFACE p2) + { + return m_pDDS->DeleteAttachedSurface(p1,p2); + } + + STDMETHOD(EnumAttachedSurfaces)(LPVOID p1,LPDDENUMSURFACESCALLBACK p2) + { + return m_pDDS->EnumAttachedSurfaces(p1, p2); + } + + STDMETHOD(EnumOverlayZOrders)(DWORD p1,LPVOID p2,LPDDENUMSURFACESCALLBACK p3) + { + return m_pDDS->EnumOverlayZOrders(p1, p2, p3); + } + + STDMETHOD(Flip)(LPDIRECTDRAWSURFACE p1, DWORD p2) + { + return m_pDDS->Flip(p1, p2); + } + + STDMETHOD(GetAttachedSurface)(LPDDSCAPS p1, LPDIRECTDRAWSURFACE FAR *p2) + { + return m_pDDS->GetAttachedSurface(p1, p2); + } + + STDMETHOD(GetBltStatus)(DWORD p1) + { + return m_pDDS4->GetBltStatus(p1); + } //turn m_pDDS->GetBltStatus(p1); + + STDMETHOD(GetCaps)(LPDDSCAPS p1) + { + return m_pDDS->GetCaps(p1); + } + + STDMETHOD(GetClipper)(LPDIRECTDRAWCLIPPER FAR* p1) + { + return m_pDDS4->GetClipper(p1); + //turn m_pDDS->GetClipper(p1); + } + + STDMETHOD(GetColorKey)(DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS4->GetColorKey(p1, p2); + //return m_pDDS->GetColorKey(p1, p2); + } + + STDMETHOD(GetDC)(HDC FAR *p1) + { + //MessageBox(0, "I gota DC", "asd", 0); + return m_pDDS4->GetDC(p1); + //return m_pDDS->GetDC(p1); + } + + STDMETHOD(GetFlipStatus)(DWORD p1) + { + return m_pDDS4->GetFlipStatus(p1); + //return m_pDDS->GetFlipStatus(p1); + } + + STDMETHOD(GetOverlayPosition)(LPLONG p1, LPLONG p2) + { + return m_pDDS4->GetOverlayPosition(p1, p2); + //return m_pDDS->GetOverlayPosition(p1, p2); + } + + STDMETHOD(GetPalette)(LPDIRECTDRAWPALETTE FAR* p1) + { + return m_pDDS4->GetPalette(p1); + //return m_pDDS->GetPalette(p1); + } + + STDMETHOD(GetPixelFormat)(LPDDPIXELFORMAT p1) + { + return m_pDDS4->GetPixelFormat(p1); + //return m_pDDS->GetPixelFormat(p1); + } + + STDMETHOD(GetSurfaceDesc)(LPDDSURFACEDESC p1) + { + return m_pDDS->GetSurfaceDesc(p1); + } + + STDMETHOD(Initialize)(LPDIRECTDRAW p1, LPDDSURFACEDESC p2) + { + return m_pDDS->Initialize(p1, p2); + } + + STDMETHOD(IsLost)() + { + return m_pDDS4->IsLost(); + //return m_pDDS->IsLost(); + } + + STDMETHOD(Lock)(LPRECT p1,LPDDSURFACEDESC p2,DWORD p3,HANDLE p4) + { + return m_pDDS->Lock(p1, p2, p3, p4); + } + + STDMETHOD(ReleaseDC)(HDC p1) + { + return m_pDDS4->ReleaseDC(p1); + //return m_pDDS->ReleaseDC(p1); + } + + STDMETHOD(Restore)() + { + return m_pDDS4->Restore(); + //return m_pDDS->Restore(); + } + + STDMETHOD(SetClipper)(LPDIRECTDRAWCLIPPER p1) + { + return m_pDDS4->SetClipper(p1); + //return m_pDDS->SetClipper(p1); + } + + STDMETHOD(SetColorKey)(DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS4->SetColorKey(p1, p2); + //return m_pDDS->SetColorKey(p1, p2); + } + + STDMETHOD(SetOverlayPosition)(LONG p1, LONG p2) + { + return m_pDDS4->SetOverlayPosition(p1, p2); + //return m_pDDS->SetOverlayPosition(p1, p2); + } + + STDMETHOD(SetPalette)(LPDIRECTDRAWPALETTE p1) + { + return m_pDDS4->SetPalette(p1); + //return m_pDDS->SetPalette(p1); + } + + STDMETHOD(Unlock)(LPVOID p1) + { + return m_pDDS->Unlock(p1); + } + + STDMETHOD(UpdateOverlay)(LPRECT p1, LPDIRECTDRAWSURFACE p2,LPRECT p3,DWORD p4, LPDDOVERLAYFX p5) + { + return m_pDDS->UpdateOverlay(p1,p2,p3,p4,p5); + } + + STDMETHOD(UpdateOverlayDisplay)(DWORD p1) + { + return m_pDDS4->UpdateOverlayDisplay(p1); + //return m_pDDS->UpdateOverlayDisplay(p1); + } + + STDMETHOD(UpdateOverlayZOrder)(DWORD p1, LPDIRECTDRAWSURFACE p2) + { + return m_pDDS->UpdateOverlayZOrder(p1, p2); + } + + + + + + /* IDirectDrawSurface2*/ + + STDMETHOD(AddAttachedSurface)(LPDIRECTDRAWSURFACE2 p1) + { + return m_pDDS2->AddAttachedSurface(p1); + } +/* + STDMETHOD(AddOverlayDirtyRect)(LPRECT p1) + { + return m_pDDS2->AddOverlayDirtyRect(p1); + } + */ + STDMETHOD(Blt)(LPRECT p1,LPDIRECTDRAWSURFACE2 p2, LPRECT p3,DWORD p4, LPDDBLTFX p5) + { + return m_pDDS2->Blt(p1,p2,p3,p4,p5); + } + +/* STDMETHOD(BltBatch)(LPDDBLTBATCH p1, DWORD p2, DWORD p3) + { + return m_pDDS2->BltBatch(p1,p2,p3); + } +*/ + STDMETHOD(BltFast)(DWORD p1,DWORD p2,LPDIRECTDRAWSURFACE2 p3, LPRECT p4,DWORD p5) + { + return m_pDDS2->BltFast(p1,p2,p3,p4,p5); + } + + STDMETHOD(DeleteAttachedSurface)(DWORD p1,LPDIRECTDRAWSURFACE2 p2) + { + return m_pDDS2->DeleteAttachedSurface(p1,p2); + } + +/* STDMETHOD(EnumAttachedSurfaces)(LPVOID p1,LPDDENUMSURFACESCALLBACK p2) + { + return m_pDDS2->EnumAttachedSurfaces(p1,p2); + } +*/ +/* STDMETHOD(EnumOverlayZOrders)(DWORD p1,LPVOID p2,LPDDENUMSURFACESCALLBACK p3) + { + return m_pDDS2->EnumOverlayZOrders(p1,p2,p3); + } +*/ + STDMETHOD(Flip)(LPDIRECTDRAWSURFACE2 p1, DWORD p2) + { + return m_pDDS2->Flip(p1, p2); + } + + STDMETHOD(GetAttachedSurface)(LPDDSCAPS p1, LPDIRECTDRAWSURFACE2 FAR *p2) + { + return m_pDDS2->GetAttachedSurface(p1, p2); + } + +/* STDMETHOD(GetBltStatus)(DWORD p1) + + { + return m_pDDS2->GetBltStatus(p1); + } +*/ +/* STDMETHOD(GetCaps)(LPDDSCAPS p1) + { + return m_pDDS2->GetCaps(p1); + } +*/ +/* STDMETHOD(GetClipper)(LPDIRECTDRAWCLIPPER FAR* p1) + { + return m_pDDS2->GetClipper(p1); + } +*/ +/* STDMETHOD(GetColorKey)(DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS2->GetColorKey(p1, p2); + } +*/ +/* STDMETHOD(GetDC)(HDC FAR *p1) + { + return m_pDDS2->GetDC(p1); + } +*/ +/* STDMETHOD(GetFlipStatus)(DWORD p1) + { + return m_pDDS2->GetFlipStatus(p1); + } +*/ +/* STDMETHOD(GetOverlayPosition)(LPLONG p1, LPLONG p2) + { + return m_pDDS2->GetOverlayPosition(p1,p2); + } +*/ +/* STDMETHOD(GetPalette)(LPDIRECTDRAWPALETTE FAR* p1) + { + return m_pDDS2->GetPalette(p1); + } +*/ +/* STDMETHOD(GetPixelFormat)(LPDDPIXELFORMAT p1) + { + return m_pDDS2->GetPixelFormat(p1); + } +*/ +/* STDMETHOD(GetSurfaceDesc)(LPDDSURFACEDESC p1) + { + return m_pDDS2->GetSurfaceDesc(p1); + } +*/ +/* STDMETHOD(Initialize)(LPDIRECTDRAW p1, LPDDSURFACEDESC p2) + { + return m_pDDS2->Initialize(p1, p2); + } +*/ +/* STDMETHOD(IsLost)() + { + return m_pDDS2->IsLost(); + } +*/ +/* STDMETHOD(Lock)(LPRECT p1,LPDDSURFACEDESC p2,DWORD p3,HANDLE p4) + { + return m_pDDS2->Lock(p1, p2, p3, p4); + } +*/ +/* STDMETHOD(ReleaseDC)(HDC p1) + { + return m_pDDS2->ReleaseDC(p1); + } +*/ +/* STDMETHOD(Restore)() + { + return m_pDDS2->Restore(); + } +*/ +/* STDMETHOD(SetClipper)(LPDIRECTDRAWCLIPPER p1) + { + return m_pDDS2->SetClipper(p1); + } +*/ +/* STDMETHOD(SetColorKey)(DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS2->SetColorKey(p1, p2); + } +*/ +/* STDMETHOD(SetOverlayPosition)(LONG p1, LONG p2) + { + return m_pDDS2->SetOverlayPosition(p1, p2); + } +*/ +/* STDMETHOD(SetPalette)(LPDIRECTDRAWPALETTE p1) + { + return m_pDDS2->SetPalette(p1); + } +*/ +/* STDMETHOD(Unlock)(LPVOID p1) + { + return m_pDDS2->Unlock(p1); + } +*/ + STDMETHOD(UpdateOverlay)(LPRECT p1, LPDIRECTDRAWSURFACE2 p2,LPRECT p3,DWORD p4, LPDDOVERLAYFX p5) + { + return m_pDDS2->UpdateOverlay(p1, p2, p3, p4, p5); + } + +/* STDMETHOD(UpdateOverlayDisplay)(DWORD p1) + { + return m_pDDS2->UpdateOverlayDisplay(p1); + } +*/ + STDMETHOD(UpdateOverlayZOrder)(DWORD p1, LPDIRECTDRAWSURFACE2 p2) + { + return m_pDDS2->UpdateOverlayZOrder(p1, p2); + } + + STDMETHOD(GetDDInterface)(LPVOID FAR *p1) + { + return m_pDDS4->GetDDInterface(p1); + //return m_pDDS2->GetDDInterface(p1); + } + + STDMETHOD(PageLock)(DWORD p1) + { + return m_pDDS4->PageLock(p1); + //return m_pDDS2->PageLock(p1); + } + + STDMETHOD(PageUnlock)(DWORD p1) + { + return m_pDDS4->PageUnlock(p1); + //return m_pDDS2->PageUnlock(p1); + } + + + /* IDirectDrawSurface3 */ + + STDMETHOD(AddAttachedSurface)(LPDIRECTDRAWSURFACE3 p1) + { + return m_pDDS3->AddAttachedSurface(p1); + } + +/* STDMETHOD(AddOverlayDirtyRect)(LPRECT p1) + { + return m_pDDS3->AddOverlayDirtyRect(p1); + } +*/ + STDMETHOD(Blt)(LPRECT p1,LPDIRECTDRAWSURFACE3 p2, LPRECT p3,DWORD p4, LPDDBLTFX p5) + { + return m_pDDS3->Blt(p1,p2,p3,p4,p5); + } + +/* STDMETHOD(BltBatch)(LPDDBLTBATCH p1, DWORD p2, DWORD p3) + { + return m_pDDS3->BltBatch(p1, p2, p3); + } +*/ + STDMETHOD(BltFast)(DWORD p1,DWORD p2,LPDIRECTDRAWSURFACE3 p3, LPRECT p4,DWORD p5) + { + return m_pDDS3->BltFast(p1,p2,p3,p4,p5); + } + + STDMETHOD(DeleteAttachedSurface)(DWORD p1,LPDIRECTDRAWSURFACE3 p2) + { + return m_pDDS3->DeleteAttachedSurface(p1,p2); + } + +/* STDMETHOD(EnumAttachedSurfaces)(LPVOID p1,LPDDENUMSURFACESCALLBACK p2) + { + return m_pDDS3->EnumAttachedSurfaces(p1, p2); + } +*/ +/* STDMETHOD(EnumOverlayZOrders)(DWORD p1,LPVOID p2,LPDDENUMSURFACESCALLBACK p3) + { + return m_pDDS3->EnumOverlayZOrders(p1,p2,p3); + } +*/ + STDMETHOD(Flip)(LPDIRECTDRAWSURFACE3 p1, DWORD p2) + { + return m_pDDS3->Flip(p1,p2); + } + + STDMETHOD(GetAttachedSurface)(LPDDSCAPS p1, LPDIRECTDRAWSURFACE3 FAR *p2) + { + return m_pDDS3->GetAttachedSurface(p1,p2); + } + +/* STDMETHOD(GetBltStatus)(DWORD p1) + { + return m_pDDS3->GetBltStatus(p1); + } +*/ +/* STDMETHOD(GetCaps)(LPDDSCAPS p1) + { + return m_pDDS3->GetCaps(p1); + } +*/ +/* STDMETHOD(GetClipper)(LPDIRECTDRAWCLIPPER FAR* p1) + { + return m_pDDS3->GetClipper(p1); + } +*/ +/* STDMETHOD(GetColorKey)(DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS3->GetColorKey(p1, p2); + } +*/ +/* STDMETHOD(GetDC)(HDC FAR *p1) + { + return m_pDDS3->GetDC(p1); + } +*/ +/* STDMETHOD(GetFlipStatus)(DWORD p1) + { + return m_pDDS3->GetFlipStatus(p1); + } +*/ +/* STDMETHOD(GetOverlayPosition)(LPLONG p1, LPLONG p2) + { + return m_pDDS3->GetOverlayPosition(p1, p2); + } +*/ +/* STDMETHOD(GetPalette)(LPDIRECTDRAWPALETTE FAR* p1) + { + return m_pDDS3->GetPalette(p1); + } +*/ +/* STDMETHOD(GetPixelFormat)(LPDDPIXELFORMAT p1) + { + return m_pDDS3->GetPixelFormat(p1); + } +*/ +/* STDMETHOD(GetSurfaceDesc)(LPDDSURFACEDESC p1) + { + return m_pDDS3->GetSurfaceDesc(p1); + } +*/ +/* STDMETHOD(Initialize)(LPDIRECTDRAW p1, LPDDSURFACEDESC p2) + { + return m_pDDS3->Initialize(p1, p2); + } +*/ +/* STDMETHOD(IsLost)() + { + return m_pDDS3->IsLost(); + } +*/ +/* STDMETHOD(Lock)(LPRECT p1,LPDDSURFACEDESC p2,DWORD p3,HANDLE p4) + { + return m_pDDS3->Lock(p1, p2, p3, p4); + } +*/ +/* STDMETHOD(ReleaseDC)(HDC p1) + { + return m_pDDS3->ReleaseDC(p1); + } +*/ +/* STDMETHOD(Restore)() + { + return m_pDDS3->Restore(); + } +*/ +/* STDMETHOD(SetClipper)(LPDIRECTDRAWCLIPPER p1) + { + return m_pDDS3->SetClipper(p1); + } +*/ +/* STDMETHOD(SetColorKey)(DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS3->SetColorKey(p1, p2); + } +*/ +/* STDMETHOD(SetOverlayPosition)(LONG p1, LONG p2) + { + return m_pDDS3->SetOverlayPosition(p1,p2); + } +*/ +/* STDMETHOD(SetPalette)(LPDIRECTDRAWPALETTE p1) + { + return m_pDDS3->SetPalette(p1); + } +*/ +/* STDMETHOD(Unlock)(LPVOID p1) + { + return m_pDDS3->Unlock(p1); + } +*/ + STDMETHOD(UpdateOverlay)(LPRECT p1, LPDIRECTDRAWSURFACE3 p2, LPRECT p3,DWORD p4, LPDDOVERLAYFX p5) + { + return m_pDDS3->UpdateOverlay(p1,p2,p3,p4,p5); + } + +/* STDMETHOD(UpdateOverlayDisplay)(DWORD p1) + { + return m_pDDS3->UpdateOverlayDisplay(p1); + } +*/ + STDMETHOD(UpdateOverlayZOrder)(DWORD p1, LPDIRECTDRAWSURFACE3 p2) + { + return m_pDDS3->UpdateOverlayZOrder(p1, p2); + } + +/* STDMETHOD(GetDDInterface)(LPVOID FAR *p1) + { + return m_pDDS3->GetDDInterface(p1); + } +*/ +/* STDMETHOD(PageLock)(DWORD p1) + { + return m_pDDS3->PageLock(p1); + } +*/ +/* STDMETHOD(PageUnlock)(DWORD p1) + { + return m_pDDS3->PageUnlock(p1); + } +*/ + STDMETHOD(SetSurfaceDesc)(LPDDSURFACEDESC p1, DWORD p2) + { + return m_pDDS3->SetSurfaceDesc(p1, p2); + } + + + + + + + + /* IDirectDrawSurface4 */ + STDMETHOD(AddAttachedSurface)(LPDIRECTDRAWSURFACE4 p1) + { + return m_pDDS4->AddAttachedSurface(p1); + } + +/* STDMETHOD(AddOverlayDirtyRect)(LPRECT p1) + { + return m_pDDS4->AddOverlayDirtyRect(p1); + } +*/ + STDMETHOD(Blt)(LPRECT p1, LPDIRECTDRAWSURFACE4 p2, LPRECT p3, DWORD p4, LPDDBLTFX p5); + +/* STDMETHOD(BltBatch)( LPDDBLTBATCH p1, DWORD p2, DWORD p3) + { + return m_pDDS4->BltBatch(p1, p2, p3); + } +*/ + STDMETHOD(BltFast)( DWORD p1,DWORD p2,LPDIRECTDRAWSURFACE4 p3, LPRECT p4,DWORD p5) + { + MessageBeep(0); + return m_pDDS4->BltFast(p1, p2, p3, p4, p5); + } + + STDMETHOD(DeleteAttachedSurface)( DWORD p1,LPDIRECTDRAWSURFACE4 p2) + { + return m_pDDS4->DeleteAttachedSurface(p1, p2); + } + + STDMETHOD(EnumAttachedSurfaces)( LPVOID p1,LPDDENUMSURFACESCALLBACK2 p2) + { + return m_pDDS4->EnumAttachedSurfaces(p1, p2); + } + + STDMETHOD(EnumOverlayZOrders)( DWORD p1,LPVOID p2,LPDDENUMSURFACESCALLBACK2 p3) + { + return m_pDDS4->EnumOverlayZOrders(p1, p2, p3); + } + + STDMETHOD(Flip)( LPDIRECTDRAWSURFACE4 p1, DWORD p2); + + STDMETHOD(GetAttachedSurface)( LPDDSCAPS2 p1, LPDIRECTDRAWSURFACE4 FAR *p2) + { + return m_pDDS4->GetAttachedSurface(p1, p2); + } + +/* STDMETHOD(GetBltStatus)( DWORD p1) + { + return m_pDDS4->GetBltStatus(p1); + } +*/ + STDMETHOD(GetCaps)( LPDDSCAPS2 p1) + { + return m_pDDS4->GetCaps(p1); + } + +/* STDMETHOD(GetClipper)( LPDIRECTDRAWCLIPPER FAR* p1) + { + return m_pDDS4->GetClipper(p1); + } +*/ +/* STDMETHOD(GetColorKey)( DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS4->GetColorKey(p1, p2); + } +*/ +/* STDMETHOD(GetDC)( HDC FAR *p1) + { + return m_pDDS4->GetDC(p1); + } +*/ +/* STDMETHOD(GetFlipStatus)( DWORD p1) + { + return m_pDDS4->GetFlipStatus(p1); + } +*/ +/* STDMETHOD(GetOverlayPosition)( LPLONG p1, LPLONG p2) + { + return m_pDDS4->GetOverlayPosition(p1, p2); + } +*/ +/* STDMETHOD(GetPalette)( LPDIRECTDRAWPALETTE FAR* p1) + { + return m_pDDS4->GetPalette(p1); + } +*/ +/* STDMETHOD(GetPixelFormat)( LPDDPIXELFORMAT p1) + { + return m_pDDS4->GetPixelFormat(p1); + } +*/ + STDMETHOD(GetSurfaceDesc)( LPDDSURFACEDESC2 p1) + { + return m_pDDS4->GetSurfaceDesc(p1); + } + + STDMETHOD(Initialize)( LPDIRECTDRAW p1, LPDDSURFACEDESC2 p2) + { + return m_pDDS4->Initialize(p1, p2); + } + +/* STDMETHOD(IsLost)() + { + return m_pDDS4->IsLost(); + } +*/ + STDMETHOD(Lock)(LPRECT p1,LPDDSURFACEDESC2 p2,DWORD p3,HANDLE p4) + { + return m_pDDS4->Lock(p1, p2, p3, p4); + } + +/* STDMETHOD(ReleaseDC)( HDC p1) + { + return m_pDDS4->ReleaseDC(p1); + } +*/ +/* STDMETHOD(Restore)() + { + return m_pDDS4->Restore(); + } +*/ +/* STDMETHOD(SetClipper)( LPDIRECTDRAWCLIPPER p1) + { + return m_pDDS4->SetClipper(p1); + } +*/ +/* STDMETHOD(SetColorKey)( DWORD p1, LPDDCOLORKEY p2) + { + return m_pDDS4->SetColorKey(p1, p2); + } +*/ +/* STDMETHOD(SetOverlayPosition)( LONG p1, LONG p2) + { + return m_pDDS4->SetOverlayPosition(p1, p2); + } +*/ +/* STDMETHOD(SetPalette)( LPDIRECTDRAWPALETTE p1) + { + return m_pDDS4->SetPalette(p1); + } +*/ + STDMETHOD(Unlock)(LPRECT p1) + { + return m_pDDS4->Unlock(p1); + } + + STDMETHOD(UpdateOverlay)( LPRECT p1, LPDIRECTDRAWSURFACE4 p2,LPRECT p3,DWORD p4, LPDDOVERLAYFX p5) + { + return m_pDDS4->UpdateOverlay(p1, p2, p3, p4, p5); + } + +/* STDMETHOD(UpdateOverlayDisplay)( DWORD p1) + { + return m_pDDS4->UpdateOverlayDisplay(p1); + } +*/ + STDMETHOD(UpdateOverlayZOrder)( DWORD p1, LPDIRECTDRAWSURFACE4 p2) + { + return m_pDDS4->UpdateOverlayZOrder(p1, p2); + } + +/* STDMETHOD(GetDDInterface)( LPVOID FAR *p1) + { + return m_pDDS4->GetDDInterface(p1); + } +*/ +/* STDMETHOD(PageLock)( DWORD p1) + { + return m_pDDS4->PageLock(p1); + } +*/ +/* STDMETHOD(PageUnlock)( DWORD p1) + { + return m_pDDS4->PageUnlock(p1); + } +*/ + STDMETHOD(SetSurfaceDesc)( LPDDSURFACEDESC2 p1, DWORD p2) + { + return m_pDDS4->SetSurfaceDesc(p1, p2); + } + + STDMETHOD(SetPrivateData)( REFGUID p1, LPVOID p2, DWORD p3, DWORD p4) + { + return m_pDDS4->SetPrivateData(p1, p2, p3, p4); + } + + STDMETHOD(GetPrivateData)( REFGUID p1, LPVOID p2, LPDWORD p3) + { + return m_pDDS4->GetPrivateData(p1, p2, p3); + } + + STDMETHOD(FreePrivateData)( REFGUID p1) + { + return m_pDDS4->FreePrivateData(p1); + } + + STDMETHOD(GetUniquenessValue)( LPDWORD p1) + { + return m_pDDS4->GetUniquenessValue(p1); + } + + STDMETHOD(ChangeUniquenessValue)() + { + return m_pDDS4->ChangeUniquenessValue(); + } + +}; + +#endif //__DIRECTDRAWSURFACEHOOK_H_ + diff --git a/Native/Inject/FileStuffs.cpp b/Native/Inject/FileStuffs.cpp new file mode 100644 index 0000000..3b371a8 --- /dev/null +++ b/Native/Inject/FileStuffs.cpp @@ -0,0 +1,26 @@ + /* HANDLE hFile; + hFile = CreateFile("aclogs.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + SetFilePointer(hFile, 0, 0, FILE_END); + DWORD lpbw; + WriteFile(hFile, buf, iRes, &lpbw, NULL); + CloseHandle(hFile);*/ + + +void InitManager() +{ + cManager::_p->init(); + return; +} + +void TermManager() +{ + cManager::_p->term(); + return; +} + +void SendOnMessage() +{ + BYTE buf[] = { "\x07\xF4\x24\x00\x00\x00\x00\x80\x01\x00\x14\x00\x00\x00\x04\x00\xC7\xF7\x00\x00\xC8\xF7\x00\x00\x6D\x65\x2E\x20\x54\x68\x65\x20\x61\x72\x74\x69\x63\x6C\x65\x73" }; + cManager::_p->m_stack.processPacket( static_cast< DWORD >( sizeof(buf) ), reinterpret_cast< BYTE * >( buf ) ); + return; +} diff --git a/Native/Inject/FontCache.cpp b/Native/Inject/FontCache.cpp new file mode 100644 index 0000000..ecfd60d --- /dev/null +++ b/Native/Inject/FontCache.cpp @@ -0,0 +1,284 @@ +// FontCache.cpp : Implementation of cFontCache +#include "stdafx.h" +#include "Inject.h" +#include "FontCache.h" + +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// cFontCache + +cFontCache::~cFontCache() +{ + cManager::_p->removeFont( this ); +} + +#define BUFFER_WIDTHCHARS 32 +#define BUFFER_HEIGHTCHARS 8 +#define BUFFER_CHARCOUNT (BUFFER_WIDTHCHARS * BUFFER_HEIGHTCHARS) + +bool cFontCache::checkBuffer() +{ + if( m_pBuffer.p ) + { + VARIANT_BOOL bWasLost; + m_pBuffer->get_WasLost( &bWasLost ); + if( bWasLost ) + m_pBuffer.Release(); + } + + if( m_pBuffer.p ) + // The character buff is intact + return true; + + // Get a dummy DC from the primary surface + CComPtr< ICanvas > pSurf; + + if( FAILED(cManager::_p->GetPrimarySurface( &pSurf )) ) + return false; + + // Madar: This can happen if you set an edit-text during plugin initialization. + if (!pSurf) + { + return false; + } + + HDC hdc; + pSurf->GetDC( &hdc ); + + // Drakier: reset error, try to create font, then check for error. + SetLastError(ERROR_SUCCESS); + HFONT hfnt = ::CreateFontIndirect( &m_lf ); + if (GetLastError() != ERROR_SUCCESS) + { + _ASSERTE(GetLastError()); + // Drakier: try arial instead + strcpy(m_lf.lfFaceName, "Arial"); + SetLastError(ERROR_SUCCESS); + HFONT hfnt = ::CreateFontIndirect( &m_lf ); + if (GetLastError() != ERROR_SUCCESS) + return false; + } + + HFONT hfntOld = reinterpret_cast< HFONT >( ::SelectObject( hdc, hfnt ) ); + + + TEXTMETRIC tm; + ::GetTextMetrics( hdc, &tm ); + + m_szCharCell.cy = tm.tmHeight; + m_szCharCell.cx = tm.tmMaxCharWidth; + + // Create the buffer + SIZE szBuffer = { m_szCharCell.cx * BUFFER_WIDTHCHARS, m_szCharCell.cy * BUFFER_HEIGHTCHARS }; + cManager::_p->CreateCanvas( &szBuffer, &m_pBuffer ); + + INT widths[ BUFFER_CHARCOUNT ]; + BOOL b = ::GetCharWidth( hdc, 0, ( BUFFER_CHARCOUNT - 1 ), widths ); + _ASSERTE( b ); + DWORD dwError = ::GetLastError(); + + for( short nChar = 0; nChar < BUFFER_CHARCOUNT; ++ nChar ) + { + // TODO: Render the chars + // Figure out the character cell size + m_nWidths[ nChar ].m_nWidth = widths[ nChar ]; + } + + // TODO: Render all the chars into the buffer + + ::SelectObject( hdc, hfntOld ); + ::DeleteObject( hfnt ); + + pSurf->ReleaseDC(); + + return true; +} + +STDMETHODIMP cFontCache::DrawText( LPPOINT ppt, BSTR strText, long clr, ICanvas *pCanvas ) +{ +/* _ASSERTE( ppt != NULL ); + _ASSERTE( strText != NULL ); + _ASSERTE( pCanvas != NULL ); + + if( !checkBuffer() ) + return E_FAIL; + + USES_CONVERSION; + + LPCTSTR szText = OLE2T( strText ); + + // TODO: Draw this a lot faster from a cached bitmap value + + HDC hdc; + pCanvas->GetDC( &hdc ); + + // Draw the text + HFONT hfnt = ::CreateFontIndirect( &m_lf ), + hfntOld = reinterpret_cast< HFONT >( ::SelectObject( hdc, hfnt ) ); + + ::SetBkMode( hdc, TRANSPARENT ); + ::SetTextColor( hdc, clr ); + ::SetTextAlign( hdc, TA_TOP | TA_LEFT ); + + LPCSTR szAnsi = OLE2A( strText ); + int cbLength = ::strlen( szAnsi ); + + INT *pDeltas = new INT[ cbLength ]; + + // Fill in the character deltas + const char *i_src = szAnsi; + INT *i_end_deltas = pDeltas + cbLength; + for( INT *i_delta = pDeltas; i_delta != i_end_deltas; ++ i_delta, ++ i_src ) + *i_delta = m_nWidths[ *i_src ].m_nWidth; + + if( m_bFontSmoothing ) + SystemParametersInfo( SPI_SETFONTSMOOTHING, FALSE, NULL, 0 ); + + ::ExtTextOut( hdc, ppt->x, ppt->y, 0, NULL, szAnsi, cbLength, pDeltas ); + + if( m_bFontSmoothing ) + SystemParametersInfo( SPI_SETFONTSMOOTHING, TRUE, NULL, 0 ); + + delete[] pDeltas; + + ::SelectObject( hdc, hfntOld ); + ::DeleteObject( hfnt ); + + pCanvas->ReleaseDC(); + + return S_OK;*/ + return DrawTextEx( ppt, strText, clr, 0, 0, pCanvas ); +} + +STDMETHODIMP cFontCache::DrawTextEx( LPPOINT ppt, BSTR strText, long clr1, long clr2, long lFlags, ICanvas *pCanvas ) +{ + _ASSERTE( ppt != NULL ); + _ASSERTE( strText != NULL ); + _ASSERTE( pCanvas != NULL ); + + if( !checkBuffer() ) + return E_FAIL; + + USES_CONVERSION; + + LPCTSTR szText = OLE2T( strText ); + + // TODO: Draw this a lot faster from a cached bitmap value + + HDC hdc; + pCanvas->GetDC( &hdc ); + + // Draw the text + // Drakier: reset error, try to create font, then check for error. + SetLastError(ERROR_SUCCESS); + HFONT hfnt = ::CreateFontIndirect( &m_lf ); + if (GetLastError() != ERROR_SUCCESS) + { + _ASSERTE(GetLastError()); + // Drakier: try arial instead + strcpy(m_lf.lfFaceName, "Arial"); + SetLastError(ERROR_SUCCESS); + HFONT hfnt = ::CreateFontIndirect( &m_lf ); + if (GetLastError() != ERROR_SUCCESS) + return E_FAIL; + } + + HFONT hfntOld = reinterpret_cast< HFONT >( ::SelectObject( hdc, hfnt ) ); + + ::SetBkMode( hdc, TRANSPARENT ); + ::SetTextAlign( hdc, TA_TOP | TA_LEFT ); + + LPCSTR szAnsi = OLE2A( strText ); + int cbLength = ::strlen( szAnsi ); + + INT *pDeltas = new INT[ cbLength ]; + + // Fill in the character deltas + const char *i_src = szAnsi; + INT *i_end_deltas = pDeltas + cbLength; + for( INT *i_delta = pDeltas; i_delta != i_end_deltas; ++ i_delta, ++ i_src ) + *i_delta = m_nWidths[ *i_src ].m_nWidth; + + if( !(lFlags & eAA) ) + if( m_bFontSmoothing ) + SystemParametersInfo( SPI_SETFONTSMOOTHING, FALSE, NULL, 0 ); + + if( lFlags & eOutlined ) + { + ::SetTextColor( hdc, clr2 ); + + ::ExtTextOut( hdc, ppt->x - 1, ppt->y - 1, 0, NULL, szAnsi, cbLength, pDeltas ); + ::ExtTextOut( hdc, ppt->x - 1, ppt->y + 1, 0, NULL, szAnsi, cbLength, pDeltas ); + ::ExtTextOut( hdc, ppt->x + 1, ppt->y - 1, 0, NULL, szAnsi, cbLength, pDeltas ); + ::ExtTextOut( hdc, ppt->x + 1, ppt->y + 1, 0, NULL, szAnsi, cbLength, pDeltas ); + } + + ::SetTextColor( hdc, clr1 ); + ::ExtTextOut( hdc, ppt->x, ppt->y, 0, NULL, szAnsi, cbLength, pDeltas ); + + if( !(lFlags & eAA) ) + if( m_bFontSmoothing ) + SystemParametersInfo( SPI_SETFONTSMOOTHING, TRUE, NULL, 0 ); + + delete[] pDeltas; + + ::SelectObject( hdc, hfntOld ); + ::DeleteObject( hfnt ); + + pCanvas->ReleaseDC(); + + return S_OK; +} + +STDMETHODIMP cFontCache::MeasureText( BSTR strText, LPSIZE pszExt ) +{ + _ASSERTE( strText != NULL ); + _ASSERTE( pszExt != NULL ); + + if( !checkBuffer() ) + return E_FAIL; + + USES_CONVERSION; + + LPCSTR szText = OLE2T( strText ), + i_end_text = szText + strlen( szText ); + + pszExt->cy = m_szCharCell.cy; + pszExt->cx = 0; + + for( LPCSTR i_text = szText; i_text != i_end_text; ++ i_text ) + pszExt->cx += m_nWidths[ *i_text ].m_nWidth; + + return S_OK; +} + +STDMETHODIMP cFontCache::HitTest(BSTR szText, long nPos, long *nIndex) +{ + _ASSERTE( szText != NULL ); + _ASSERTE( nIndex != NULL ); + + if( !checkBuffer() ) + return E_FAIL; + + USES_CONVERSION; + + LPCSTR szAText = OLE2T( szText ), + i_end_text = szAText + strlen( szAText ); + + for( LPCSTR i_text = szAText; i_text != i_end_text; ++ i_text ) + { + short nWidth = m_nWidths[ *i_text ].m_nWidth; + if( nPos < nWidth ) + { + *nIndex = ( i_text - szAText ); + return S_OK; + } + + nPos -= nWidth; + } + + *nIndex = -1; + + return S_OK; +} diff --git a/Native/Inject/FontCache.h b/Native/Inject/FontCache.h new file mode 100644 index 0000000..38fd575 --- /dev/null +++ b/Native/Inject/FontCache.h @@ -0,0 +1,50 @@ +// FontCache.h : Declaration of the cFontCache + +#ifndef __FONTCACHE_H_ +#define __FONTCACHE_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cFontCache +class ATL_NO_VTABLE cFontCache : + public CComObjectRootEx, + public IDispatchImpl< IFontCache, &IID_IFontCacheDisp, &LIBID_DecalPlugins > +{ +public: + cFontCache() + { + m_bFontSmoothing = FALSE; + SystemParametersInfo( SPI_GETFONTSMOOTHING, 0, &m_bFontSmoothing, 0 ); + } + + ~cFontCache(); + + struct cCharMetrics + { + short m_nWidth; + }; + + BOOL m_bFontSmoothing; + SIZE m_szCharCell; + cCharMetrics m_nWidths[ 256 ]; + LOGFONT m_lf; + CComPtr< ICanvas > m_pBuffer; + + bool checkBuffer(); + +BEGIN_COM_MAP(cFontCache) + COM_INTERFACE_ENTRY(IFontCache) + COM_INTERFACE_ENTRY(IFontCacheDisp) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IFontCache +public: + STDMETHOD(HitTest)(BSTR szText, long nPos, /*[out, retval]*/ long *nIndex); + STDMETHOD(MeasureText)( BSTR szText, /*[out]*/ LPSIZE pszExt ); + STDMETHOD(DrawText)( LPPOINT pt, BSTR szText, long clr, ICanvas *pCanvas ); + STDMETHOD(DrawTextEx)( LPPOINT pt, BSTR szText, long clr1, long clr2, long lFlags, ICanvas *pCanvas ); +}; + +#endif //__FONTCACHE_H_ diff --git a/Native/Inject/Guids.cpp b/Native/Inject/Guids.cpp new file mode 100644 index 0000000..6df2bc0 --- /dev/null +++ b/Native/Inject/Guids.cpp @@ -0,0 +1,7 @@ + +#include +#include +#include + +#define DIRECTINPUT_VERSION 0x600 +#include diff --git a/Native/Inject/HookedFunctions.cpp b/Native/Inject/HookedFunctions.cpp new file mode 100644 index 0000000..e78f3f8 --- /dev/null +++ b/Native/Inject/HookedFunctions.cpp @@ -0,0 +1,104 @@ +extern void (*pfnOldChatMessage)(char*, unsigned long); +extern void (*pfnOldChatText)(void); + +bool DispatchChatMessage ( char *pText, long *pdwColor ); +bool DispatchChatText ( char *pText ); + +void __declspec(naked) OnChatMessage(char* pText, long dwColor) +{ +/* __asm + { + //int 3 + + push ecx + push esi + + lea esi, dwColor + push esi + push pText + call DispatchChatMessage + + // Pop the two arguments + add esp, 8 + + test al, al + jz dont_kill_text + + mov esi, pText + mov BYTE PTR [esi], 0 + +dont_kill_text: + pop esi + pop ecx + + jmp pfnOldChatMessage + }*/ + + __asm + { + push ebp + mov ebp, esp + sub esp, 20h + push esi + + push ecx + + lea esi, dwColor + push esi + push pText + call DispatchChatMessage + + add esp, 8 + + test al, al + jz dont_kill_text + + mov DWORD PTR [pText], 0 + +dont_kill_text: + + pop ecx + + push dwColor + push pText + call pfnOldChatMessage + + pop esi + mov esp, ebp + pop ebp + retn 8 + } +} + +void __declspec(naked) OnChatText() +{ + __asm + { + push ebp + mov ebp, esp + sub esp, 0xC + + call pfnOldChatText + + mov [ebp-4], ecx + mov [ebp-8], eax + + push eax + + call DispatchChatText + + mov edx, eax + mov ecx, [ebp-4] + mov eax, [ebp-8] + + test dl, dl + jz dont_eat_chat_text + + mov BYTE PTR [eax], 0 + +dont_eat_chat_text: + mov esp, ebp + pop ebp + ret + } +} \ No newline at end of file diff --git a/Native/Inject/IconCache.cpp b/Native/Inject/IconCache.cpp new file mode 100644 index 0000000..09498bb --- /dev/null +++ b/Native/Inject/IconCache.cpp @@ -0,0 +1,291 @@ +// IconCache.cpp : Implementation of cIconCache +#include "stdafx.h" +#include "Inject.h" +#include "IconCache.h" + +#include "Manager.h" +//Moputu - 05172002: Added long lColor to make icons with different colored borders unique. +bool cIconCache::findIcon( HMODULE hMod, DWORD dwFile, cIconCache::cIconBuffer *&pBuffer, int &nIndex, long lColor ) +{ + for( cIconBufferList::iterator i = m_icons.begin(); i != m_icons.end(); ) + { + VARIANT_BOOL bLost; + i->m_pSurface->get_WasLost( &bLost ); + if( bLost ) + { + i = m_icons.erase( i ); + continue; + } + + // Search inside this buffer + for( cIDList::iterator j = i->m_icons.begin(); j != i->m_icons.end(); ++ j ) + { + //if( j->m_hMod == hMod && j->m_dwID == dwFile ) // Original Code + if( j->m_hMod == hMod && j->m_dwID == dwFile && j->m_lBColor == lColor ) + { + // We found the icon, return happy + pBuffer = &( *i ); + nIndex = j - i->m_icons.begin(); + return true; + } + } + + ++ i; + } + + // Icon not found + return false; +} + +void cIconCache::findFreeSlot( cIconBuffer *&pBuffer, int &nIndex ) +{ + // First find a buffer with an unused icon slot, note that we test + // the buffers + for( cIconBufferList::iterator i = m_icons.begin(); i != m_icons.end(); ) + { + VARIANT_BOOL bLost; + i->m_pSurface->get_WasLost( &bLost ); + if( bLost ) + { + i = m_icons.erase( i ); + continue; + } + + if( i->m_icons.size() < ( m_nEdge * m_nEdge ) ) + break; + + ++ i; + } + + if( i == m_icons.end() ) + { + // There were no surfaces with free slots, make a new one + cIconBuffer buf; + buf.m_icons.reserve( m_nEdge * m_nEdge ); + + SIZE sz = { m_szIcon.cx * m_nEdge, m_szIcon.cy * m_nEdge }; + + cManager::_p->CreateCanvas( &sz, &buf.m_pSurface ); + m_icons.push_back( buf ); + + // Reset to last entry + i = -- m_icons.end(); + } + + pBuffer = &( *i ); + nIndex = i->m_icons.size(); +} + +//Modified by Moputu 05/12/2002 to allow the replacement of icon border colors. +bool cIconCache::loadIcon( DWORD dwFile, cIconCache::cIconBuffer *&pBuffer, int &nIndex, long lColor ) +{ + findFreeSlot( pBuffer, nIndex ); + + struct cColorImage + { + DWORD m_dwID, + m_dwX, + m_dwY; + }; + + try + { + cDatFile::cFile icon = cManager::_p->m_portal.getFile( dwFile ); + cColorImage header; + + icon.read( reinterpret_cast< BYTE * >( &header ), sizeof( cColorImage ) ); + + int nXScale, nYScale; + + if( header.m_dwX % m_szIcon.cx != 0 ) + { + // Bad size - only linear filtering here + _ASSERT( FALSE ); + return false; + } + + nXScale = header.m_dwX / m_szIcon.cx; + + if( header.m_dwY % m_szIcon.cy != 0 ) + { + // Bad size - only linear filtering here + _ASSERT( FALSE ); + return false; + } + + nYScale = header.m_dwY / m_szIcon.cy; + + // Can't fail now, transfering bits to the buffer + POINT ptIconOrg = { ( nIndex % m_nEdge ) * m_szIcon.cx, ( nIndex / m_nEdge ) * m_szIcon.cy }; + RECT rcSrc = { ptIconOrg.x, ptIconOrg.y, ptIconOrg.x + m_szIcon.cx, ptIconOrg.y + m_szIcon.cy }; + + DDSURFACEDESC2 desc; + desc.dwSize = sizeof( DDSURFACEDESC2 ); + + CComPtr< IDirectDrawSurface4 > pSurface; + pBuffer->m_pSurface->GetSurface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &pSurface ) ); + + pSurface->Lock( &rcSrc, &desc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL ); + + BYTE srcLine[ 3 * 64 ], + *pEndLine = srcLine + 3 * header.m_dwX; + + { + for( int i = 0; i < m_szIcon.cy; ++ i ) + { + // Read in a line + icon.read( srcLine, 3 * header.m_dwX ); + icon.skip( 3 * header.m_dwX * ( nYScale - 1 ) ); + WORD *pwDest = reinterpret_cast< WORD * >( reinterpret_cast< BYTE * >( desc.lpSurface ) + desc.lPitch * i ); + + for( BYTE *pbSrc = srcLine; pbSrc != pEndLine; pbSrc += 3 * nXScale, ++ pwDest ) + { + // Check for black (transparent) + if( ( pbSrc[ 0 ] == 0 && pbSrc[ 1 ] == 0 && pbSrc[ 2 ] == 0 ) || + ( pbSrc[ 0 ] == 255 && pbSrc[ 1 ] == 255 && pbSrc[ 2 ] == 255 ) ) + // *pwDest = 0x07FF; // Original code + if( pbSrc[ 0 ] == 255 && pbSrc[ 1 ] == 255 && pbSrc[ 2 ] == 255 ) //Check for White (border) + { + if ( lColor == -1 ) // No argument was passed, treat it like the original code would have. + { + *pwDest = 0x07FF; + } + else //Replace with specified color. + { + pBuffer->m_pSurface->DownMixRGB((BYTE)lColor, (BYTE)(lColor >> 8), (BYTE)(lColor >> 16), pwDest); + } + } + else + { + *pwDest = 0x07FF; + } + else + { + pBuffer->m_pSurface->DownMixRGB(pbSrc[0], pbSrc[1], pbSrc[2], pwDest); + } + } + } + } + + pSurface->Unlock( &rcSrc ); + cIconID iid = { NULL, dwFile, lColor }; //Moputu - 05172002: Added lColor to make icons with different colored borders unique. + pBuffer->m_icons.push_back( iid ); + + // Survived the encounter + return true; + } + catch( ... ) + { + // Failure, return false at end + } + + // File not found, fail + _ASSERT( FALSE ); + return false; +} + +bool cIconCache::loadIconResource( HMODULE hMod, DWORD dwResourceID, cIconBuffer *&pBuffer, int &nIndex, long lColor ) +{ + HICON hIcon = reinterpret_cast< HICON >( ::LoadImage( hMod, MAKEINTRESOURCE( dwResourceID ), IMAGE_ICON, m_szIcon.cx, m_szIcon.cy, LR_DEFAULTCOLOR ) ); + if( hIcon == NULL ) + return false; + + findFreeSlot( pBuffer, nIndex ); + + // TODO: Write a fast version of this function, use GDI for now + + HDC hdc; + pBuffer->m_pSurface->GetDC( &hdc ); + + HBRUSH br = ::CreateSolidBrush( RGB( 0, 255, 255 ) ); + POINT ptIconOrg = { ( nIndex % m_nEdge ) * m_szIcon.cx, ( nIndex / m_nEdge ) * m_szIcon.cy }; + RECT rcSrc = { ptIconOrg.x, ptIconOrg.y, ptIconOrg.x + m_szIcon.cx, ptIconOrg.y + m_szIcon.cy }; + + ::FillRect( hdc, &rcSrc, br ); + ::DrawIconEx( hdc, ptIconOrg.x, ptIconOrg.y, hIcon, m_szIcon.cx, m_szIcon.cy, 0, NULL, DI_NORMAL ); + + ::DeleteObject( br ); + + pBuffer->m_pSurface->ReleaseDC(); + + ::DestroyIcon( hIcon ); + + cIconID iid = { hMod, dwResourceID, lColor }; //Moputu - 05172002: Added long lColor to make icons with different colored borders unique. + pBuffer->m_icons.push_back( iid ); + + return true; +} + +void cIconCache::drawIcon( LPPOINT pPos, ICanvas *pDest, cIconBuffer *pBuffer, int nIndex ) +{ + _ASSERTE( pPos != NULL ); + _ASSERTE( pDest != NULL ); + _ASSERTE( pBuffer != NULL ); + _ASSERTE( nIndex >= 0 && nIndex < ( m_nEdge * m_nEdge ) ); + + POINT ptIconOrg = { ( nIndex % m_nEdge ) * m_szIcon.cx, ( nIndex / m_nEdge ) * m_szIcon.cy }; + RECT rcSrc = { ptIconOrg.x, ptIconOrg.y, ptIconOrg.x + m_szIcon.cx, ptIconOrg.y + m_szIcon.cy }; + + pDest->Blt( &rcSrc, pBuffer->m_pSurface, pPos ); +} + +///////////////////////////////////////////////////////////////////////////// +// cIconCache + + +STDMETHODIMP cIconCache::DrawIcon( LPPOINT ppt, long nFile, long nModule, ICanvas *pCanvas ) +{ + _ASSERTE( ppt != NULL ); + _ASSERTE( pCanvas != NULL ); + + cIconBuffer *pBuffer; + int nIndex; + +// GKusnick: Handle no-icon case without asserting. + if (nModule == 0 && nFile == 0) return S_OK; + + if( !findIcon( reinterpret_cast< HMODULE >( nModule ), *reinterpret_cast< DWORD* >( &nFile ), pBuffer, nIndex ) ) + { + if( nModule == 0 ) + { + if( !loadIcon( *reinterpret_cast< DWORD* >( &nFile ), pBuffer, nIndex ) ) + return E_FAIL; + } + else + { + if( !loadIconResource( reinterpret_cast< HMODULE >( nModule ), *reinterpret_cast< DWORD* >( &nFile ), pBuffer, nIndex ) ) + return E_FAIL; + } + } + + drawIcon( ppt, pCanvas, pBuffer, nIndex ); + + return S_OK; +} + +STDMETHODIMP cIconCache::DrawIconEx( LPPOINT ppt, long nFile, long nModule, ICanvas *pCanvas, long lColor ) +{ + _ASSERTE( ppt != NULL ); + _ASSERTE( pCanvas != NULL ); + + cIconBuffer *pBuffer; + int nIndex; + + if( !findIcon( reinterpret_cast< HMODULE >( nModule ), *reinterpret_cast< DWORD* >( &nFile ), pBuffer, nIndex, lColor ) ) //Moputu - 05172002: Added long lColor to make icons with different colored borders unique. + { + if( nModule == 0 ) + { + if( !loadIcon( *reinterpret_cast< DWORD* >( &nFile ), pBuffer, nIndex, lColor ) ) + return E_FAIL; + } + else + { + if( !loadIconResource( reinterpret_cast< HMODULE >( nModule ), *reinterpret_cast< DWORD* >( &nFile ), pBuffer, nIndex, lColor ) ) //Moputu - 05172002: Added long lColor to make icons with different colored borders unique. + return E_FAIL; + } + } + + drawIcon( ppt, pCanvas, pBuffer, nIndex ); + + return S_OK; +} diff --git a/Native/Inject/IconCache.h b/Native/Inject/IconCache.h new file mode 100644 index 0000000..6dd520b --- /dev/null +++ b/Native/Inject/IconCache.h @@ -0,0 +1,59 @@ +// IconCache.h : Declaration of the cIconCache + +#ifndef __ICONCACHE_H_ +#define __ICONCACHE_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cIconCache +class ATL_NO_VTABLE cIconCache : + public CComObjectRootEx, + public IIconCache +{ +public: + cIconCache() + { + } + + SIZE m_szIcon; + long m_nEdge; + + struct cIconID + { + HMODULE m_hMod; + DWORD m_dwID; + long m_lBColor; //Moputu - 05172002: Added to make icons with different colored bordered unique. + }; + + typedef std::vector< cIconID > cIDList; + + class cIconBuffer + { + public: + cIDList m_icons; + CComPtr< ICanvas > m_pSurface; + }; + + typedef std::list< cIconBuffer > cIconBufferList; + cIconBufferList m_icons; + + bool findIcon( HMODULE hMod, DWORD dwFile, cIconBuffer *&pBuffer, int &nIndex, long lColor = -1 ); //Moputu - 05172002: Added long lColor = -1 to make icons with different colored borders unique. + void findFreeSlot( cIconBuffer *&pBuffer, int &nIndex ); + + bool loadIcon( DWORD dwFile, cIconBuffer *&pBuffer, int &nIndex, long lColor = -1 ); + bool loadIconResource( HMODULE hMod, DWORD dwResourceID, cIconBuffer *&pBuffer, int &nIndex, long lColor = -1 ); //Moputu - 05172002: Added long lColor = -1 to make icons with different colored borders unique. + + void drawIcon( LPPOINT pPos, ICanvas *pDest, cIconBuffer *pBuffer, int nIndex ); + +BEGIN_COM_MAP(cIconCache) + COM_INTERFACE_ENTRY(IIconCache) +END_COM_MAP() + +// IIconCache +public: + STDMETHOD(DrawIcon)( LPPOINT ppt, long nFile, long nModule, ICanvas *pTarget ); + STDMETHOD(DrawIconEx)( LPPOINT ppt, long nFile, long nModule, ICanvas *pTarget, long lColor ); +}; + +#endif //__ICONCACHE_H_ diff --git a/Native/Inject/Image.cpp b/Native/Inject/Image.cpp new file mode 100644 index 0000000..252661e --- /dev/null +++ b/Native/Inject/Image.cpp @@ -0,0 +1,344 @@ +// Image.cpp : Implementation of cImage +#include "stdafx.h" +#include "Inject.h" +#include "Image.h" + +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// cImage + +cImage::~cImage() +{ + cManager::_p->removeImage( this ); +} + +void cImage::loadFile() +{ + // ::MessageBox( NULL, _T( "cImage::loadFile" ), _T( "Inject.dll" ), MB_OK ); + + HANDLE hBitmap = ::CreateFile( m_szFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + if( hBitmap == INVALID_HANDLE_VALUE ) + { + int nError = ::GetLastError(); + return; + } + + BITMAPFILEHEADER bfh; + DWORD dwRead; + ::ReadFile( hBitmap, &bfh, sizeof( BITMAPFILEHEADER ), &dwRead, NULL ); + + BITMAPINFOHEADER bih; + ::ReadFile( hBitmap, &bih, sizeof( BITMAPINFOHEADER ), &dwRead, NULL ); + + RGBQUAD pal[ 256 ]; + ::memset( pal, 0, sizeof( RGBQUAD[ 256 ] ) ); + // Figure out the number of colors used + int nEntries = 1 << ( bih.biBitCount ); + + if( bih.biClrUsed != 0 ) + nEntries = bih.biClrUsed; + + ::ReadFile( hBitmap, pal, sizeof( RGBQUAD ) * nEntries, &dwRead, NULL ); + + SIZE szImage = { bih.biWidth, bih.biHeight }; + cManager::_p->CreateCanvas( &szImage, &m_pImage ); + + CComPtr< IDirectDrawSurface4 > pSurface; + m_pImage->GetSurface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &pSurface ) ); + + DDSURFACEDESC2 desc; + desc.dwSize = sizeof( DDSURFACEDESC2 ); + + pSurface->Lock( NULL, &desc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL ); + + WORD wDownMixed[ 256 ]; + RGBQUAD *pSrc = pal; + for( WORD *pDest = wDownMixed; pDest != wDownMixed + ( nEntries - 1 ); ++ pDest, ++ pSrc ) { + m_pImage->DownMixRGB(pSrc->rgbRed, pSrc->rgbGreen, pSrc->rgbBlue, pDest); + } + + *pDest = 0x07FF; + + // Mekle: Added the (bih.biWidth % 4) sections below, as BMP rows MUST end on a 32bit boundry + BYTE *pbSurf = reinterpret_cast< BYTE * >( desc.lpSurface ) + ( desc.dwHeight - 1 ) * desc.lPitch; + BYTE *pbRow = new BYTE[ bih.biWidth + (bih.biWidth % 4) ]; + + for( int nRow = 0; nRow < bih.biHeight; ++ nRow ) + { + ::ReadFile( hBitmap, pbRow, bih.biWidth + (bih.biWidth % 4), &dwRead, NULL ); + + WORD *pwDest = reinterpret_cast< WORD * >( pbSurf ); + for( BYTE *pbSrc = pbRow; pbSrc != pbRow + bih.biWidth; ++ pbSrc, ++ pwDest ) + // Lookup the color in the downmixed palette + *pwDest = wDownMixed[ *pbSrc ]; + + pbSurf -= desc.lPitch; + } + + delete[] pbRow; + + pSurface->Unlock( NULL ); + ::CloseHandle( hBitmap ); +} + +void cImage::loadResource() +{ +} + +void cImage::loadPortal() +{ + // ::MessageBox( NULL, _T( "cImage::loadPortal" ), _T( "Inject.dll" ), MB_OK ); + + struct cColorImage + { + DWORD m_dwID, + m_dwX, + m_dwY; + }; + + try + { + cDatFile::cFile icon = cManager::_p->m_portal.getFile( m_dwID ); + cColorImage header; + + icon.read( reinterpret_cast< BYTE * >( &header ), sizeof( cColorImage ) ); + + SIZE szImage = { header.m_dwX, header.m_dwY }; + + cManager::_p->CreateCanvas( &szImage, &m_pImage ); + + CComPtr< IDirectDrawSurface4 > pSurface; + m_pImage->GetSurface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &pSurface ) ); + + DDSURFACEDESC2 desc; + desc.dwSize = sizeof( DDSURFACEDESC2 ); + + pSurface->Lock( NULL, &desc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL ); + + BYTE *pSrcLine = new BYTE[ 3 * header.m_dwX ], + *pEndLine = pSrcLine + 3 * header.m_dwX; + + for( int i = 0; i < header.m_dwY; ++ i ) + { + // Read in a line + icon.read( pSrcLine, 3 * header.m_dwX ); + WORD *pwDest = reinterpret_cast< WORD * >( reinterpret_cast< BYTE * >( desc.lpSurface ) + desc.lPitch * i ); + + for( BYTE *pbSrc = pSrcLine; pbSrc != pEndLine; pbSrc += 3, ++ pwDest ) + { + // Check for black (transparent) + if( pbSrc[ 0 ] == 0 && pbSrc[ 1 ] == 0 && pbSrc[ 2 ] == 0 ) + *pwDest = 0x07FF; + else + { + // Downmix the pixel value + m_pImage->DownMixRGB(pbSrc[0], pbSrc[1], pbSrc[2], pwDest); + } + } + } + + delete[] pSrcLine; + + pSurface->Unlock( NULL ); + } + catch( ... ) + { + // Failure, file not found + } +} + +bool cImage::testImage() +{ + bool bReload = false; + + if( m_pImage.p == NULL ) + bReload = true; + else + { + VARIANT_BOOL bLost; + m_pImage->get_WasLost( &bLost ); + + if( bLost ) + { + m_pImage.Release(); + bReload = true; + } + } + + if( bReload ) + { + // Reload the image + switch( m_source ) + { + case eFile: + loadFile(); + break; + + case eResource: + loadResource(); + break; + + case ePortal: + loadPortal(); + break; + } + } + return ( m_pImage.p != NULL ); +} + +STDMETHODIMP cImage::PatBlt(ICanvas *pDest, LPRECT prcDest, LPPOINT ptOrigin) +{ + // ::MessageBox( NULL, _T( "cImage::PatBlt" ), _T( "Inject.dll" ), MB_OK ); + + if( !testImage() ) + return E_FAIL; + + SIZE sz; + m_pImage->get_Size( &sz ); + + POINT ptAdjOrigin = { ptOrigin->x % sz.cx, ptOrigin->y % sz.cy }; + + if( ptAdjOrigin.x > 0 ) + ptAdjOrigin.x -= sz.cx; + if( ptAdjOrigin.y > 0 ) + ptAdjOrigin.y -= sz.cy; + + RECT rcPlacement; + RECT rcSrc; + POINT ptSrcOrigin; + + // Scan down + for( int y = prcDest->top + ptAdjOrigin.y; y < prcDest->bottom; y += sz.cy ) + { + rcPlacement.top = y; + rcPlacement.bottom = y + sz.cy; + + if( rcPlacement.top < prcDest->top ) + rcPlacement.top = prcDest->top; + + if( rcPlacement.bottom > prcDest->bottom ) + rcPlacement.bottom = prcDest->bottom; + + ptSrcOrigin.y = ( rcPlacement.top - prcDest->top - ptAdjOrigin.y ) % sz.cy; + + rcSrc.top = ptSrcOrigin.y; + rcSrc.bottom = rcSrc.top + ( rcPlacement.bottom - rcPlacement.top ); + + // Scan across + for( int x = prcDest->left + ptAdjOrigin.x; x < prcDest->right; x += sz.cx ) + { + rcPlacement.left = x; + rcPlacement.right = x + sz.cx; + + if( rcPlacement.left < prcDest->left ) + rcPlacement.left = prcDest->left; + if( rcPlacement.right > prcDest->right ) + rcPlacement.right = prcDest->right; + + ptSrcOrigin.x = ( rcPlacement.left - prcDest->left - ptAdjOrigin.x ) % sz.cx; + + rcSrc.left = ptSrcOrigin.x; + rcSrc.right = rcSrc.left + ( rcPlacement.right - rcPlacement.left ); + + POINT pt = { rcPlacement.left, rcPlacement.top }; + pDest->Blt( &rcSrc, m_pImage, &pt ); + } + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cImage::StretchBlt(ICanvas *pDest, LPPOINT pptDest, long nWidth, long nStartStretch, long nEndStretch) +{ + if( !testImage() ) + return E_FAIL; + + // Ok, the image is getting placed in three sections, fixed beginning and end + // and variable length middle sections (delimited by nStartStretch and nEndStretch) + + // First we place the fixed beginning and end lengths + SIZE sz; + m_pImage->get_Size( &sz ); + + RECT rcSrcHead = { 0, 0, nStartStretch, sz.cy }, + rcSrcTail = { nEndStretch, 0, sz.cx, sz.cy }, + rcSrcMiddle = { nStartStretch, 0, nEndStretch, sz.cy }; + + int nTailPlacement = pptDest->x + nWidth - ( sz.cx - nEndStretch ); + + POINT ptHead = { pptDest->x, pptDest->y }, + ptTail = { nTailPlacement, pptDest->y }, + ptStretch = { 0, pptDest->y }; + + // Do the first Blts + pDest->Blt( &rcSrcHead, m_pImage, &ptHead ); + pDest->Blt( &rcSrcTail, m_pImage, &ptTail ); + + // Now do the middle sections + for( ptStretch.x = pptDest->x + nStartStretch; ptStretch.x < nTailPlacement; ptStretch.x += ( nEndStretch - nStartStretch ) ) + { + if( ( nTailPlacement - ptStretch.x ) < ( rcSrcMiddle.right - rcSrcMiddle.left ) ) + rcSrcMiddle.right = rcSrcMiddle.left + ( nTailPlacement - ptStretch.x ); + + pDest->Blt( &rcSrcMiddle, m_pImage, &ptStretch ); + } + + return S_OK; +} + +STDMETHODIMP cImage::Blt(LPRECT rcSrc, ICanvas *pDest, LPPOINT pptDest) +{ + if( !testImage() ) + return E_FAIL; + + SIZE sz; + m_pImage->get_Size( &sz ); + RECT rcImage = { 0, 0, sz.cx, sz.cy }; + + pDest->Blt( &rcImage, m_pImage, pptDest ); + + return S_OK; +} + +STDMETHODIMP cImage::get_Size(SIZE *pVal) +{ + if( !testImage() ) + return E_FAIL; + + m_pImage->get_Size( pVal ); + + return S_OK; +} + +STDMETHODIMP cImage::StretchBltArea(LPRECT prcSrc, ICanvas *pDest, LPRECT prcDest) +{ + if( !testImage() ) + return E_FAIL; + + SIZE sizeImage; + get_Size( &sizeImage ); + + if( prcSrc->right > sizeImage.cx ) + prcSrc->right = sizeImage.cx ; + + if( prcSrc->bottom > sizeImage.cy ) + prcSrc->bottom = sizeImage.cy; + + if( prcSrc->left < 0 ) + prcSrc->left = 0; + + if( prcSrc->top < 0 ) + prcSrc->top = 0; + + if( prcSrc->left >= prcSrc->right ) + prcSrc->left = prcSrc->right - 1; + + if( prcSrc->top >= prcSrc->bottom ) + prcSrc->top = prcSrc->bottom - 1; + + pDest->StretchBlt( prcSrc, m_pImage, prcDest ); + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/Image.h b/Native/Inject/Image.h new file mode 100644 index 0000000..8e47507 --- /dev/null +++ b/Native/Inject/Image.h @@ -0,0 +1,56 @@ +// Image.h : Declaration of the cImage + +#ifndef __IMAGE_H_ +#define __IMAGE_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cImage +class ATL_NO_VTABLE cImage : + public CComObjectRootEx, + public IDispatchImpl< IImageCache, &IID_IImageCacheDisp, &LIBID_DecalPlugins > +{ +public: + cImage() + { + } + + ~cImage(); + + enum eSourceType + { + eFile, + eResource, + ePortal + }; + + eSourceType m_source; + TCHAR m_szFilename[ MAX_PATH ]; + HMODULE m_hLibrary; + DWORD m_dwID; + + CComPtr< ICanvas > m_pImage; + + void loadFile(); + void loadResource(); + void loadPortal(); + + bool testImage(); + +BEGIN_COM_MAP(cImage) + COM_INTERFACE_ENTRY(IImageCache) + COM_INTERFACE_ENTRY(IImageCacheDisp) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IImage +public: + STDMETHOD(get_Size)(/*[out, retval]*/ SIZE *pVal); + STDMETHOD(Blt)(LPRECT rcSrc, ICanvas *pDest, LPPOINT pptDest); + STDMETHOD(StretchBlt)(ICanvas *pDest, LPPOINT pptDest, long nWidth, long nStartStretch, long nEndStretch); + STDMETHOD(PatBlt)(ICanvas *pDest, LPRECT prcDest, LPPOINT ptOrigin); + STDMETHOD(StretchBltArea)(LPRECT prcSrc, ICanvas *pDest, LPRECT prcDest); +}; + +#endif //__IMAGE_H_ diff --git a/Native/Inject/Inject.cpp b/Native/Inject/Inject.cpp new file mode 100644 index 0000000..91e5dcb --- /dev/null +++ b/Native/Inject/Inject.cpp @@ -0,0 +1,1029 @@ +// Inject.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f Injectps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "Inject.h" +#include "InjectApi.h" + +#include "Inject_i.c" +#include "DirectDrawHook.h" +#include "Manager.h" + +#include "Button.h" +#include "Pager.h" +#include "InjectService.h" +#include "PluginAdapterV1.h" +#include "RootLayer.h" + +// one instance for all processes +#pragma data_seg( ".InjectDll" ) +HHOOK g_hHook = NULL; +#pragma data_seg() + +CComModule _Module; + +LPFNDLLFUNCALPHABLEND AlphaBlendF; + +BEGIN_OBJECT_MAP(ObjectMap) + OBJECT_ENTRY(CLSID_Button, cButton) + OBJECT_ENTRY(CLSID_Pager, cPager) + OBJECT_ENTRY(CLSID_InjectService, cInjectService) + OBJECT_ENTRY(CLSID_PluginAdapterV1, cPluginAdapterV1) +END_OBJECT_MAP() + +// These functions and structures are used for hooking functions +struct cHookDescriptor; +bool hookFunctions( cHookDescriptor *pHook, DWORD nCount ); + +// Functions for hooking from ddraw.dll +HRESULT WINAPI DirectDrawCreateF( GUID *lpGuid, LPDIRECTDRAW *lplpDD, IUnknown *pUnkOut ); + +// Functions for hooking from kernel32.dll +HANDLE WINAPI CreateFileF( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); + +// Function for dual logging +HANDLE WINAPI Replacement_CreateSemaphoreA( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); + +// Function for no movies +HFILE WINAPI Replacement_OpenFile( LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle ); + +enum eAddressing +{ + eByName, + eByOrdinal +}; + +struct cHookDescriptor +{ + eAddressing m_addr; + LPCTSTR m_szModule, + m_szFunction; + DWORD m_dwOrdinal, + m_pNewFunction, + m_pOldFunction; +}; + +static bool bRegisteredInAC = false; +HANDLE _hUpdateEnabled = NULL; + +static cHookDescriptor _hooks[] = { + { eByName, _T( "ddraw.dll" ), _T( "DirectDrawCreate" ), 0, reinterpret_cast< DWORD >( DirectDrawCreateF ), 0 }, + { eByName, _T( "kernel32.dll" ), _T( "CreateFileA" ), 0, reinterpret_cast< DWORD >( CreateFileF ), 0 }, +}; + +static bool bDualLog = false; +static bool bWindowed = false; +static bool bNoSplash = false; +static bool bNoMovies = false; + +static cHookDescriptor _hooksDualLog[] = { + { eByName, _T( "kernel32.dll" ), _T( "CreateSemaphoreA" ), 102, reinterpret_cast< DWORD >( Replacement_CreateSemaphoreA ), 0 }, +}; + +static cHookDescriptor _hooksNoMovies[] = { + { eByName, _T( "kernel32.dll" ), _T( "OpenFile" ), 630, reinterpret_cast< DWORD >( Replacement_OpenFile ), 0 }, +}; + +bool CheckClientVersion( MSXML::IXMLDOMDocument *pDoc ); +bool PatchWindowMode( MSXML::IXMLDOMDocument *pDoc ); +bool PatchNoSplash( MSXML::IXMLDOMDocument *pDoc ); + +HINSTANCE hAlphaBlendDLL; + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_DecalPlugins); + DisableThreadLibraryCalls(hInstance); + + // Check out the project we're in - if it's client.exe, hook stuff up + TCHAR szFilename[ MAX_PATH ]; + ::GetModuleFileName( NULL, szFilename, MAX_PATH ); + + LPTSTR strProcessName = ::_tcsrchr( szFilename, _T( '\\' ) ); + + strProcessName[ 7 ] = _T( '\0' ); + + if( ::_tcsicmp( strProcessName + 1, _T( "client" ) ) == 0 ) + { + hookFunctions( _hooks, 2 ); + bRegisteredInAC = true; + + RegKey key; + if( key.Open( HKEY_LOCAL_MACHINE, "SOFTWARE\\Decal" ) == ERROR_SUCCESS ) + { + // Check if dual logging is enabled + DWORD dwReg = 0; + if( key.QueryDWORDValue( "AllowDualLog", dwReg ) == ERROR_SUCCESS ) + { + if( dwReg ) + { + bDualLog = true; + hookFunctions( _hooksDualLog, 1 ); + } + } + + // Check if movies are disabled + dwReg = 0; + if( key.QueryDWORDValue( "NoMovies", dwReg ) == ERROR_SUCCESS ) + { + if( dwReg ) + { + bNoMovies = true; + hookFunctions( _hooksNoMovies, 1 ); + } + } + + } + + key.Close(); + + // Get decal path + char szPath[ MAX_PATH ]; + DWORD dwCount = MAX_PATH; + key.Open( HKEY_LOCAL_MACHINE, "SOFTWARE\\Decal\\Agent" ); + key.QueryStringValue( "AgentPath", szPath, &dwCount ); + key.Close(); + + strncat( szPath, "clientpatches.xml", MAX_PATH ); + + ::CoInitialize( NULL ); + MSXML::IXMLDOMDocumentPtr pPatchesDoc; + pPatchesDoc.CreateInstance( __uuidof( MSXML::DOMDocument ) ); + pPatchesDoc->async = false; + + bool bSuccess = (pPatchesDoc->load( szPath )) ? true : false; + if( bSuccess ) + { + if( CheckClientVersion( pPatchesDoc ) ) + { + RegKey key; + if( key.Open( HKEY_LOCAL_MACHINE, "SOFTWARE\\Decal" ) == ERROR_SUCCESS ) + { + // Windowed Mode patch + DWORD dwReg = 0; + if( key.QueryDWORDValue( "AllowWindowed", dwReg ) == ERROR_SUCCESS ) + { + if( dwReg ) + bWindowed = PatchWindowMode( pPatchesDoc ); + } + + + // Splash hax patches + dwReg = 0; + if( key.QueryDWORDValue( "NoSplash", dwReg ) == ERROR_SUCCESS ) + { + if( dwReg ) + bNoSplash = PatchNoSplash( pPatchesDoc ); + } + + + } + } + } + } + + FlushInstructionCache( GetCurrentProcess( ), NULL, NULL ); + + _hUpdateEnabled = ::CreateMutex( NULL, FALSE, _T( "InjectEnablePlugins" ) ); + + hAlphaBlendDLL = LoadLibrary("Msimg32.dll"); + + if (hAlphaBlendDLL != NULL) + { + AlphaBlendF = (LPFNDLLFUNCALPHABLEND)GetProcAddress(hAlphaBlendDLL,"AlphaBlend"); + if (!AlphaBlendF) + AlphaBlendF=NULL; + } + } + else if (dwReason == DLL_PROCESS_DETACH) + { + ::CloseHandle( _hUpdateEnabled ); + ::CoUninitialize(); + + if( hAlphaBlendDLL ) + FreeLibrary( hAlphaBlendDLL ); + + _Module.Term(); + } + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + +// The hook function - all it does is continue calls +LRESULT CALLBACK hookCBTProc( int nCode, WPARAM wParam, LPARAM lParam ) +{ + return ::CallNextHookEx( g_hHook, nCode, wParam, lParam ); +} + +// Functions from inject api +void InjectEnable() +{ + // Get the image path (path of parent executable) + TCHAR szImagePath[ MAX_PATH ]; + ::GetModuleFileName( NULL, szImagePath, MAX_PATH ); + + LPTSTR strProcessName = ::_tcsrchr( szImagePath, _T( '\\' ) ); + *( strProcessName + 1 ) = _T( '\0' ); + + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal\\Agent" ) ); + key.SetStringValue( _T( "AgentPath" ), szImagePath ); + + // Install the global hook, injecting this DLL into every other process + g_hHook = ::SetWindowsHookEx( WH_CBT, hookCBTProc, _Module.m_hInst, 0 ); +} + +void InjectDisable() +{ + ::UnhookWindowsHookEx( g_hHook ); + g_hHook = NULL; + // Send a broadcast message, this forces the hook to trigger, and thus unload + SendMessage(HWND_BROADCAST,WM_NULL,0,0); +} + +struct cPathRegistry +{ + eInjectPath ePathType; + LPCTSTR szKey, + szValue; +}; + +LPTSTR InjectMapPath( eInjectPath pathType, LPCTSTR szFilename, LPTSTR szBuffer ) +{ + static cPathRegistry _paths[] = { + { eInjectPathDatFile, _T( "SOFTWARE\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00" ), _T( "Portal Dat" ) }, + { eInjectPathAgent, _T( "SOFTWARE\\Decal\\Agent" ), _T( "AgentPath" ) } }; + + // Validate the szFilename path - If it is already complete, just pass it into the buffer and return + // FIXME? : The will also "fall through" for files on our path(es)/working directory (which may later be changed...) + + OFSTRUCT fileDetails; + + if (OpenFile(szFilename, &fileDetails, OF_EXIST) != HFILE_ERROR) { + ::_tcscpy(szBuffer, szFilename); + } else { + DWORD dwCount = MAX_PATH; + RegKey key; + key.Open( HKEY_LOCAL_MACHINE, _paths[ pathType ].szKey ); + key.QueryStringValue( _paths[ pathType ].szValue, szBuffer, &dwCount ); + ::_tcscat( szBuffer, _T( "\\" ) ); + ::_tcscat( szBuffer, szFilename ); + } + + return szBuffer; +} + +bool CheckForHardwareMode () +{ + RegKey key; + + if (key.Open (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00", KEY_READ) != ERROR_SUCCESS) + { + return false; + } + + DWORD dwValue = 0; + + if (key.QueryDWORDValue ("UseHardware", dwValue) != ERROR_SUCCESS) + { + return false; + } + + return dwValue ? true : false; +} + +HRESULT WINAPI DirectDrawCreateF( GUID *lpGuid, LPDIRECTDRAW *lplpDD, IUnknown *pUnkOut ) +{ + // Add another instance of the library + TCHAR szModule[ MAX_PATH ]; + ::GetModuleFileName( _Module.GetModuleInstance(), szModule, MAX_PATH ); + ::LoadLibrary( szModule ); + + if( cManager::_p == NULL ) + { + CComObject< cManager >::CreateInstance( &cManager::_p ); + cManager::_p->AddRef(); + } + + CComPtr< IDirectDraw > pDD; + HRESULT hRes = ::DirectDrawCreate( lpGuid, &pDD, pUnkOut ); + if( FAILED( hRes ) ) + // Boo - failure + return hRes; + + CComObject< CDirectDrawHook > *pDDHook; + CComObject< CDirectDrawHook >::CreateInstance( &pDDHook ); + pDDHook->setObject( pDD ); + + pDDHook->QueryInterface( IID_IDirectDraw, reinterpret_cast< void ** >( lplpDD ) ); + + if( !CheckForHardwareMode( ) ) + cManager::_p->enableSoftwareMode( ); + + return hRes; +} + +// Just call to CreateFile but supplement the share modes to allow more handles to the file +HANDLE WINAPI CreateFileF( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) +{ + // ::MessageBox( NULL, _T( "CreateFileF" ), _T( "Inject.dll" ), MB_OK ); + HANDLE hFile = CreateFile( lpFileName, dwDesiredAccess, dwShareMode | FILE_SHARE_READ, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); + DWORD dwError = GetLastError(); + + return hFile; +} + +HANDLE __stdcall Replacement_CreateSemaphoreA( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ) +{ + if( stricmp( lpName, "Empyrean Client" ) == 0 ) + { + HANDLE hSem = CreateSemaphore( lpSemaphoreAttributes, lInitialCount, /* lMaximumCount */ 0x7F, lpName ); + SetLastError( 0 ); + return hSem; + } + + else + return CreateSemaphore( lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName ); +} + +HFILE WINAPI Replacement_OpenFile( LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle ) +{ + if( strstr( lpFileName, "\\movies\\" ) != NULL ) + return HFILE_ERROR; + + else + return OpenFile( lpFileName, lpReOpenBuff, uStyle ); +} + +bool CheckClientVersion( MSXML::IXMLDOMDocument *pDoc ) +{ + USES_CONVERSION; + + MSXML::IXMLDOMElementPtr pNode = pDoc->selectSingleNode( _bstr_t( "patches" ) ); + + long lVerMajor = 0, lVerMinor = 0, lVerRelease = 0; + + _variant_t vVersion = pNode->getAttribute( _bstr_t( "version" ) ); + char *szVersion = OLE2A( vVersion.bstrVal ); + + sscanf( szVersion, "%d.%d.%d", &lVerMajor, &lVerMinor, &lVerRelease ); + + RegKey rk; + if( rk.Open( HKEY_LOCAL_MACHINE, _T( "Software\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00" ) ) == ERROR_SUCCESS ) + { + TCHAR szClientPath[ MAX_PATH ]; + DWORD dwPathLength = MAX_PATH; + if( rk.QueryStringValue ( _T( "path" ), szClientPath, &dwPathLength ) == ERROR_SUCCESS ) + { + ::_tcscpy( szClientPath + ( dwPathLength - 1 ), _T( "\\client.exe" ) ); + + DWORD dwDummy, + dwVerSize = ::GetFileVersionInfoSize( const_cast< LPTSTR > ( szClientPath ), &dwDummy ); + if( dwVerSize != 0 ) + { + BYTE *pbVersionInfo = reinterpret_cast< BYTE * >( ::_alloca( dwVerSize ) ); + + ::GetFileVersionInfo( const_cast< LPTSTR > ( szClientPath ), 0, dwVerSize, pbVersionInfo ); + + VS_FIXEDFILEINFO *vffi; + UINT nLength = sizeof( VS_FIXEDFILEINFO ); + if( ::VerQueryValue( pbVersionInfo, _T( "\\" ), reinterpret_cast< LPVOID * >( &vffi ), &nLength ) ) + { + if( (static_cast< long >( HIWORD( vffi->dwFileVersionMS ) ) == lVerMajor) && + (static_cast< long >( LOWORD( vffi->dwFileVersionMS ) ) == lVerMinor) && + (static_cast< long >( HIWORD( vffi->dwFileVersionLS ) ) == lVerRelease) ) + { + return true; + } + } + } + } + } + + return false; +} + +bool PatchWindowMode( MSXML::IXMLDOMDocument *pDoc ) +{ + if( pDoc == NULL ) + return false; + + USES_CONVERSION; + + MSXML::IXMLDOMElementPtr pNode; + MSXML::IXMLDOMNodeListPtr pNodes = pDoc->selectNodes( _bstr_t( "/patches/patch" ) ); + + bool bWindowPattern = false, + bWindowReplaceOffset = false, + bWindowReplace = false, + bWindowMaxOffset = false; + + char *szPatchPattern; + + unsigned char byteReplace; + + long lReplaceOffset, + lMaxOffset; + + for( pNode = pNodes->nextNode(); pNode.GetInterfacePtr() != NULL; pNode = pNodes->nextNode() ) + { + if( bWindowPattern && bWindowReplace && bWindowReplaceOffset && bWindowMaxOffset ) + break; + + _variant_t vName = pNode->getAttribute( _bstr_t( "name" ) ); + char *szName = OLE2A( vName.bstrVal ); + + if( stricmp( szName, "WindowedModePattern" ) == 0 ) + { + _variant_t vPatchPattern = pNode->getAttribute( _bstr_t( "value" ) ); + szPatchPattern = OLE2A( vPatchPattern.bstrVal ); + bWindowPattern = true; + continue; + } + + if( stricmp( szName, "WindowedModeReplace" ) == 0 ) + { + _variant_t vReplace = pNode->getAttribute( _bstr_t( "value" ) ); + byteReplace = wcstoul( vReplace.bstrVal, NULL, 16 ); + bWindowReplace = true; + continue; + } + + if( stricmp( szName, "WindowedModeReplaceOffset" ) == 0 ) + { + _variant_t vReplaceOffset = pNode->getAttribute( _bstr_t( "value" ) ); + lReplaceOffset = wcstoul( vReplaceOffset.bstrVal, NULL, 16 ) - 1; // Arrays are 0 indexed in c++ + bWindowReplaceOffset = true; + continue; + } + + if( stricmp( szName, "WindowedModeMaxOffset" ) == 0 ) + { + _variant_t vMaxOffset = pNode->getAttribute( _bstr_t( "value" ) ); + lMaxOffset = wcstoul( vMaxOffset.bstrVal, NULL, 16 ); + bWindowMaxOffset = true; + continue; + } + } + + if( !(bWindowPattern && bWindowReplace && bWindowReplaceOffset && bWindowMaxOffset) ) + return false; + + unsigned char *pAddy = reinterpret_cast< unsigned char * >( 0x400000 ); + + int iLen = strlen( szPatchPattern + 1 ) / 3 + 1; + unsigned char *szPatternArray = new unsigned char[ iLen ]; + memset( szPatternArray, 0, iLen ); + + int i; + for( i = 0; i < iLen; ++i ) + szPatternArray[ i ] = strtoul( szPatchPattern + (i*3), NULL, 16 ); + + bool bAbort = true; + + for( i = 0; i < lMaxOffset; ++i, ++pAddy ) + { + // peek at current byte + if( *pAddy == szPatternArray[ 0 ] ) + { + // see if entire pattern matches. + if( memcmp( reinterpret_cast< const char * >( szPatternArray ) + 1, reinterpret_cast< char * >( pAddy ) + 1, iLen - 1 ) == 0 ) + { + // yahoo? ... + bAbort = false; + pAddy += lReplaceOffset; + break; + } + } + } + + if( bAbort ) + return false; + + DWORD dwOldProtect, dwNewProtect; + VirtualProtect( reinterpret_cast< void * >( pAddy ), 1, PAGE_READWRITE, &dwOldProtect ); + pAddy[ 0 ] = byteReplace; + VirtualProtect( reinterpret_cast< void * >( pAddy ), 1, dwOldProtect, &dwNewProtect ); + + return true; +} + +bool PatchNoSplash( MSXML::IXMLDOMDocument *pDoc ) +{ + if( pDoc == NULL ) + return false; + + USES_CONVERSION; + + MSXML::IXMLDOMElementPtr pNode; + MSXML::IXMLDOMNodeListPtr pNodes = pDoc->selectNodes( _bstr_t( "/patches/patch" ) ); + + bool bNoSplashPattern1 = false, + bNoSplashPattern2 = false, + bNoSplashReplaceOffset1 = false, + bNoSplashReplaceOffset2 = false, + bNoSplashReplace1 = false, + bNoSplashReplace2 = false, + bNoSplashMaxOffset1 = false, + bNoSplashMaxOffset2 = false; + + char *szPatchPattern1, + *szPatchPattern2; + + unsigned char byteReplace1, + byteReplace2; + + long lReplaceOffset1, + lReplaceOffset2, + lMaxOffset1, + lMaxOffset2; + + for( pNode = pNodes->nextNode(); pNode.GetInterfacePtr() != NULL; pNode = pNodes->nextNode() ) + { + if( bNoSplashPattern1 && bNoSplashPattern2 && bNoSplashReplaceOffset1 && bNoSplashReplaceOffset2 && bNoSplashReplace1 && bNoSplashReplace2 && bNoSplashMaxOffset1 && bNoSplashMaxOffset2 ) + break; + + _variant_t vName = pNode->getAttribute( _bstr_t( "name" ) ); + char *szName = OLE2A( vName.bstrVal ); + + if( stricmp( szName, "SplashHax1Pattern" ) == 0 ) + { + _variant_t vPatchPattern = pNode->getAttribute( _bstr_t( "value" ) ); + szPatchPattern1 = OLE2A( vPatchPattern.bstrVal ); + bNoSplashPattern1 = true; + continue; + } + + if( stricmp( szName, "SplashHax2Pattern" ) == 0 ) + { + _variant_t vPatchPattern = pNode->getAttribute( _bstr_t( "value" ) ); + szPatchPattern2 = OLE2A( vPatchPattern.bstrVal ); + bNoSplashPattern2 = true; + continue; + } + + if( stricmp( szName, "SplashHax1Replace" ) == 0 ) + { + _variant_t vReplace = pNode->getAttribute( _bstr_t( "value" ) ); + byteReplace1 = wcstoul( vReplace.bstrVal, NULL, 16 ); + bNoSplashReplace1 = true; + continue; + } + + if( stricmp( szName, "SplashHax2Replace" ) == 0 ) + { + _variant_t vReplace = pNode->getAttribute( _bstr_t( "value" ) ); + byteReplace2 = wcstoul( vReplace.bstrVal, NULL, 16 ); + bNoSplashReplace2 = true; + continue; + } + + if( stricmp( szName, "SplashHax1ReplaceOffset" ) == 0 ) + { + _variant_t vReplaceOffset = pNode->getAttribute( _bstr_t( "value" ) ); + lReplaceOffset1 = wcstoul( vReplaceOffset.bstrVal, NULL, 16 ) - 1; // Arrays are 0 indexed in c++ + bNoSplashReplaceOffset1 = true; + continue; + } + + if( stricmp( szName, "SplashHax2ReplaceOffset" ) == 0 ) + { + _variant_t vReplaceOffset = pNode->getAttribute( _bstr_t( "value" ) ); + lReplaceOffset2 = wcstoul( vReplaceOffset.bstrVal, NULL, 16 ) - 1; // Arrays are 0 indexed in c++ + bNoSplashReplaceOffset2 = true; + continue; + } + + if( stricmp( szName, "SplashHax1MaxOffset" ) == 0 ) + { + _variant_t vMaxOffset = pNode->getAttribute( _bstr_t( "value" ) ); + lMaxOffset1 = wcstoul( vMaxOffset.bstrVal, NULL, 16 ); + bNoSplashMaxOffset1 = true; + continue; + } + + if( stricmp( szName, "SplashHax2MaxOffset" ) == 0 ) + { + _variant_t vMaxOffset = pNode->getAttribute( _bstr_t( "value" ) ); + lMaxOffset2 = wcstoul( vMaxOffset.bstrVal, NULL, 16 ); + bNoSplashMaxOffset2 = true; + continue; + } + } + + if( !(bNoSplashPattern1 && bNoSplashPattern2 && bNoSplashReplaceOffset1 && bNoSplashReplaceOffset2 && bNoSplashReplace1 && bNoSplashReplace2 && bNoSplashMaxOffset1 && bNoSplashMaxOffset2) ) + return false; + + unsigned char *pAddy = reinterpret_cast< unsigned char * >( 0x400000 ); + + int iLen = strlen( szPatchPattern1 + 1 ) / 3 + 1; + unsigned char *szPatternArray1 = new unsigned char[ iLen ]; + memset( szPatternArray1, 0, iLen ); + + int i; + for( i = 0; i < iLen; ++i ) + szPatternArray1[ i ] = strtoul( szPatchPattern1 + (i*3), NULL, 16 ); + + bool bAbort1 = true; + + for( i = 0; i < lMaxOffset1; ++i, ++pAddy ) + { + // peek at current byte + if( *pAddy == szPatternArray1[ 0 ] ) + { + // see if entire pattern matches. + if( memcmp( reinterpret_cast< const char * >( szPatternArray1 ) + 1, reinterpret_cast< char * >( pAddy ) + 1, iLen - 1 ) == 0 ) + { + // yahoo? ... + bAbort1 = false; + pAddy += lReplaceOffset1; + break; + } + } + } + + if( bAbort1 ) + return false; + + DWORD dwOldProtect, dwNewProtect; + VirtualProtect( reinterpret_cast< void * >( pAddy ), 1, PAGE_READWRITE, &dwOldProtect ); + pAddy[ 0 ] = byteReplace1; + VirtualProtect( reinterpret_cast< void * >( pAddy ), 1, dwOldProtect, &dwNewProtect ); + + + pAddy = reinterpret_cast< unsigned char * >( 0x400000 ); + + iLen = strlen( szPatchPattern2 + 1 ) / 3 + 1; + unsigned char *szPatternArray2 = new unsigned char[ iLen ]; + memset( szPatternArray2, 0, iLen ); + + for( i = 0; i < iLen; ++i ) + szPatternArray2[ i ] = strtoul( szPatchPattern2 + (i*3), NULL, 16 ); + + bool bAbort2 = true; + + for( i = 0; i < lMaxOffset2; ++i, ++pAddy ) + { + // peek at current byte + if( *pAddy == szPatternArray2[ 0 ] ) + { + // see if entire pattern matches. + if( memcmp( reinterpret_cast< const char * >( szPatternArray2 ) + 1, reinterpret_cast< char * >( pAddy ) + 1, iLen - 1 ) == 0 ) + { + // yahoo? ... + bAbort2 = false; + pAddy += lReplaceOffset2; + break; + } + } + } + + if( bAbort2 ) + return false; + + VirtualProtect( reinterpret_cast< void * >( pAddy ), 1, PAGE_READWRITE, &dwOldProtect ); + pAddy[ 0 ] = byteReplace2; + VirtualProtect( reinterpret_cast< void * >( pAddy ), 1, dwOldProtect, &dwNewProtect ); + + return true; +} + +PIMAGE_IMPORT_DESCRIPTOR getNamedImportDescriptor( HMODULE hModule, LPCSTR szImportMod ) +{ + PIMAGE_DOS_HEADER pDOSHeader = reinterpret_cast< PIMAGE_DOS_HEADER >( hModule ); + + // Get the PE header. + PIMAGE_NT_HEADERS pNTHeader = MakePtr( PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew ); + + // If there is no imports section, leave now. + if( pNTHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT ].VirtualAddress == NULL ) + return NULL; + + // Get the pointer to the imports section. + PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr ( PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader, + pNTHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT ].VirtualAddress ); + + // Loop through the import module descriptors looking for the + // module whose name matches szImportMod. + while( pImportDesc->Name != NULL ) + { + PSTR szCurrMod = MakePtr( PSTR, pDOSHeader, pImportDesc->Name ); + if( stricmp( szCurrMod, szImportMod ) == 0 ) + // Found it. + break; + + // Look at the next one. + pImportDesc ++; + } + + // If the name is NULL, then the module is not imported. + if ( pImportDesc->Name == NULL ) + return ( NULL ) ; + + // All OK, Jumpmaster! + return pImportDesc; + +} + +bool hookFunctions( cHookDescriptor *pHook, DWORD nCount ) +{ + HMODULE hProcess = ::GetModuleHandle( NULL ); + for( cHookDescriptor *i = pHook; i != pHook + nCount; ++ i ) + { + // Get the specific import descriptor. + PIMAGE_IMPORT_DESCRIPTOR pImportDesc = getNamedImportDescriptor( hProcess, i->m_szModule ); + + if ( pImportDesc == NULL ) + continue; + + // Get the original thunk information for this DLL. I cannot use + // the thunk information stored in the pImportDesc->FirstThunk + // because the that is the array that the loader has already + // bashed to fix up all the imports. This pointer gives us acess + // to the function names. + PIMAGE_THUNK_DATA pOrigThunk = MakePtr( PIMAGE_THUNK_DATA, hProcess, pImportDesc->OriginalFirstThunk ); + + // Get the array pointed to by the pImportDesc->FirstThunk. This is + // where I will do the actual bash. + PIMAGE_THUNK_DATA pRealThunk = MakePtr( PIMAGE_THUNK_DATA, hProcess, pImportDesc->FirstThunk ); + + // Loop through and look for the one that matches the name. + for( ; pOrigThunk->u1.Function != NULL; ++ pOrigThunk, ++ pRealThunk ) + { + if( i->m_addr == eByName ) + { + if( pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) + // Only look at those that are imported by name, not ordinal. + continue; + + // Look get the name of this imported function. + PIMAGE_IMPORT_BY_NAME pByName = MakePtr( PIMAGE_IMPORT_BY_NAME, hProcess, pOrigThunk->u1.AddressOfData ); + + // If the name starts with NULL, then just skip out now. + if( pByName->Name[ 0 ] == '\0' ) + continue; + + if ( ::_tcsicmp( reinterpret_cast< char * >( pByName->Name ), i->m_szFunction ) != 0 ) + // This name dosen't match + continue; + } + else + { + if( !( pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) ) + // The import must be by ordinal + continue; + + if( ( pOrigThunk->u1.Ordinal & ~IMAGE_ORDINAL_FLAG ) != i->m_dwOrdinal ) + // Ordinal does not match + continue; + } + + // I found it. Now I need to change the protection to + // writable before I do the blast. Note that I am now + // blasting into the real thunk area! + MEMORY_BASIC_INFORMATION mbi_thunk; + + ::VirtualQuery( pRealThunk, &mbi_thunk, sizeof ( MEMORY_BASIC_INFORMATION ) ); + ::VirtualProtect( mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect ); + + // Save the original address if requested. + i->m_pOldFunction = pRealThunk->u1.Function; + pRealThunk->u1.Function = i->m_pNewFunction; + + DWORD dwOldProtect; + + ::VirtualProtect( mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect ); + + break; + } + } + + return true; +} + +void DisplayErrorMessage( DWORD dwError, char* szFrom ) +{ + char szBuffer[1024]; + char *lpMsgBuf; + + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, + MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), reinterpret_cast< LPTSTR > ( &lpMsgBuf ), 0, NULL ); + + wsprintf( szBuffer, "%s %ld: %s", szFrom, dwError, lpMsgBuf ); + + MessageBox( 0, szBuffer, "Error", MB_OK | MB_ICONERROR ); + LocalFree( lpMsgBuf ); +} + +// Checksum - Added for my test container +void Container_Initialize( HWND hWnd, IDirectDraw4* pDD4, IDirectDrawSurface4 *pDDS4 ) +{ + if( cManager::_p ) + return; + + HRESULT hRes = CComObject< cManager >::CreateInstance( &cManager::_p ); + if( FAILED( hRes ) ) + { + DisplayErrorMessage( hRes, "Creating cManager Object" ); + return; + } + + cManager::_p->AddRef( ); + + cManager::_p->setWindow( hWnd ); + cManager::_p->m_pD = pDD4; + cManager::_p->m_pPrimarySurface = pDDS4; + cManager::_p->m_pDecal->InitGraphics( pDD4, NULL ); + cManager::_p->m_bContainer = true; + cManager::_p->m_bXMLViewViewer = false; +} + +void Container_StartPlugins( ) +{ + if( !cManager::_p ) + return; + + cManager::_p->m_pDecal->StartPlugins( ); +} + +void Container_StopPlugins( ) +{ + if( !cManager::_p ) + return; + + cManager::_p->m_pDecal->StopPlugins( ); +} + +void Container_Terminate( ) +{ + if( !cManager::_p ) + return; + + Container_StopPlugins( ); + + cManager::_p->Release( ); + cManager::_p = NULL; +} + +void Container_SetSurface( IDirectDrawSurface4 *pDDS4 ) +{ + if( !cManager::_p ) + return; + + cManager::_p->m_pPrimarySurface = pDDS4; +} + +void Container_Draw( ) +{ + if( !cManager::_p ) + return; + + if( cManager::_p->m_bInitialized ) + cManager::_p->m_pRootLayer->m_pBars->Reformat( ); + + cManager::_p->draw2D( ); +} + +std::set< IView* > g_pViews; + +void XMLViewer_Initialize( HWND hWnd, IDirectDraw4* pDD4, IDirectDrawSurface4 *pDDS4 ) +{ + if( cManager::_p ) + return; + + HRESULT hRes = CComObject< cManager >::CreateInstance( &cManager::_p ); + if( FAILED( hRes ) ) + { + DisplayErrorMessage( hRes, "Creating cManager Object" ); + return; + } + cManager::_p->AddRef( ); + + cManager::_p->setWindow( hWnd ); + cManager::_p->m_pD = pDD4; + cManager::_p->m_pPrimarySurface = pDDS4; + cManager::_p->m_pDecal->InitGraphics( pDD4, NULL ); + cManager::_p->m_bContainer = true; + cManager::_p->m_bXMLViewViewer = true; + cManager::_p->init( ); +} + +void XMLViewer_LoadView( BSTR bstrSchema ) +{ + if( !cManager::_p ) + return; + + static _bstr_t strSchema( + _T( "" ) + + _T( "" ) + + _T( "" ) + + _T( "" ) + _T( "" ) + _T( "" ) + _T( "" ) + _T( "" ) + _T( "" ) + _T( "" ) + _T( "" ) + + _T("") + _T( "" ) + _T( "" ) + _T("") + + _T( "" ) + _T( "" ) + ); + + IView* pView; + cManager::_p->LoadView( bstrSchema ? bstrSchema : strSchema, &pView ); + g_pViews.insert( pView ); +} + +void XMLViewer_RemoveView( IView* pView ) +{ + try{ + if( !pView ) + return; + + g_pViews.erase( pView ); + + pView->Release( ); + pView = NULL; + } + catch( ... ) + { + pView = NULL; + } +} + +void XMLViewer_Terminate( ) +{ + if( !cManager::_p ) + return; + + if( cManager::_p->m_bInitialized ) + { + for( std::set< IView* >::iterator it = g_pViews.begin( ); it != g_pViews.end( ); ++it ) + XMLViewer_RemoveView( *it ); + + g_pViews.clear( ); + + cManager::_p->term( ); + } + + cManager::_p->Release( ); + cManager::_p = NULL; +} + +void XMLViewer_Draw( ) +{ + Container_Draw( ); +} \ No newline at end of file diff --git a/Native/Inject/Inject.def b/Native/Inject/Inject.def new file mode 100644 index 0000000..787d29a --- /dev/null +++ b/Native/Inject/Inject.def @@ -0,0 +1,24 @@ +; Inject.def : Declares the module parameters. + +LIBRARY "Inject.DLL" + +SECTIONS + .InjectDll READ WRITE SHARED + + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + Container_Initialize @6 + Container_StartPlugins @7 + Container_StopPlugins @8 + Container_Terminate @9 + Container_SetSurface @10 + Container_Draw @11 + XMLViewer_Initialize @12 + XMLViewer_LoadView @13 + XMLViewer_RemoveView @14 + XMLViewer_Terminate @15 + XMLViewer_Draw @16 \ No newline at end of file diff --git a/Native/Inject/Inject.dsp b/Native/Inject/Inject.dsp new file mode 100644 index 0000000..9a859fa --- /dev/null +++ b/Native/Inject/Inject.dsp @@ -0,0 +1,401 @@ +# Microsoft Developer Studio Project File - Name="Inject" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=Inject - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Inject.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Inject.mak" CFG="Inject - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Inject - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "Inject - Win32 Release MinDependency" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Inject - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\Include" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "INJECT_IMPL" /Yu"stdafx.h" /FD /GZ /c +# SUBTRACT CPP /u +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ddraw.lib winmm.lib ws2_32.lib version.lib /nologo /subsystem:windows /dll /debug /machine:I386 +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\Code\source\Debug\Inject.dll +InputPath=\Code\source\Debug\Inject.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "Inject - Win32 Release MinDependency" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinDependency" +# PROP BASE Intermediate_Dir "ReleaseMinDependency" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinDependency" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "INJECT_IMPL" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# SUBTRACT CPP /u +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ddraw.lib winmm.lib ws2_32.lib version.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# SUBTRACT LINK32 /nodefaultlib +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\Code\source\Release\Inject.dll +InputPath=\Code\source\Release\Inject.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "Inject - Win32 Debug" +# Name "Inject - Win32 Release MinDependency" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\BarLayer.cpp +# End Source File +# Begin Source File + +SOURCE=.\Button.cpp +# End Source File +# Begin Source File + +SOURCE=.\Canvas.cpp +# End Source File +# Begin Source File + +SOURCE=.\DatFile.cpp +# End Source File +# Begin Source File + +SOURCE=.\Direct3DHook.cpp +# End Source File +# Begin Source File + +SOURCE=.\DirectDrawHook.cpp +# End Source File +# Begin Source File + +SOURCE=.\DirectDrawSurfaceHook.cpp +# End Source File +# Begin Source File + +SOURCE=.\FontCache.cpp +# End Source File +# Begin Source File + +SOURCE=.\Guids.cpp +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\IconCache.cpp +# End Source File +# Begin Source File + +SOURCE=.\Image.cpp +# End Source File +# Begin Source File + +SOURCE=.\Inject.cpp +# End Source File +# Begin Source File + +SOURCE=.\Inject.def +# End Source File +# Begin Source File + +SOURCE=.\Inject.idl +# ADD MTL /tlb ".\Inject.tlb" /h "Inject.h" /iid "Inject_i.c" /Oicf +# End Source File +# Begin Source File + +SOURCE=.\Inject.rc +# End Source File +# Begin Source File + +SOURCE=.\InjectService.cpp +# End Source File +# Begin Source File + +SOURCE=.\InputBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=.\LayerSite.cpp +# End Source File +# Begin Source File + +SOURCE=.\Manager.cpp +# End Source File +# Begin Source File + +SOURCE=.\MaterialHook.cpp +# End Source File +# Begin Source File + +SOURCE=.\Pager.cpp +# End Source File +# Begin Source File + +SOURCE=.\Panel.cpp +# End Source File +# Begin Source File + +SOURCE=.\PluginAdapterV1.cpp +# End Source File +# Begin Source File + +SOURCE=.\RootLayer.cpp +# End Source File +# Begin Source File + +SOURCE=.\SimpleBar.cpp +# End Source File +# Begin Source File + +SOURCE=.\SinkImpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\SolidImage.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\View.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\BarLayer.h +# End Source File +# Begin Source File + +SOURCE=.\Button.h +# End Source File +# Begin Source File + +SOURCE=.\Canvas.h +# End Source File +# Begin Source File + +SOURCE=.\DatFile.h +# End Source File +# Begin Source File + +SOURCE=.\Direct3DHook.h +# End Source File +# Begin Source File + +SOURCE=.\DirectDrawHook.h +# End Source File +# Begin Source File + +SOURCE=.\DirectDrawSurfaceHook.h +# End Source File +# Begin Source File + +SOURCE=.\EventsImpl.h +# End Source File +# Begin Source File + +SOURCE=.\FontCache.h +# End Source File +# Begin Source File + +SOURCE=.\IconCache.h +# End Source File +# Begin Source File + +SOURCE=.\Image.h +# End Source File +# Begin Source File + +SOURCE=.\InjectApi.h +# End Source File +# Begin Source File + +SOURCE=.\InjectCP.h +# End Source File +# Begin Source File + +SOURCE=.\InjectService.h +# End Source File +# Begin Source File + +SOURCE=.\InputBuffer.h +# End Source File +# Begin Source File + +SOURCE=.\LayerSite.h +# End Source File +# Begin Source File + +SOURCE=.\Manager.h +# End Source File +# Begin Source File + +SOURCE=.\MaterialHook.h +# End Source File +# Begin Source File + +SOURCE=.\Pager.h +# End Source File +# Begin Source File + +SOURCE=.\Panel.h +# End Source File +# Begin Source File + +SOURCE=.\Plugin2Impl.h +# End Source File +# Begin Source File + +SOURCE=.\PluginAdapterV1.h +# End Source File +# Begin Source File + +SOURCE=.\PluginImpl.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\RootLayer.h +# End Source File +# Begin Source File + +SOURCE=.\SimpleBar.h +# End Source File +# Begin Source File + +SOURCE=.\SinkImpl.h +# End Source File +# Begin Source File + +SOURCE=.\SolidImage.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\View.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\Button.rgs +# End Source File +# Begin Source File + +SOURCE=.\res\DenAgent.ico +# End Source File +# Begin Source File + +SOURCE=.\InjectService.rgs +# End Source File +# Begin Source File + +SOURCE=.\InputBuffer.rgs +# End Source File +# Begin Source File + +SOURCE=.\MessageStruct.rgs +# End Source File +# Begin Source File + +SOURCE=.\MessageVector.rgs +# End Source File +# Begin Source File + +SOURCE=.\Pager.rgs +# End Source File +# Begin Source File + +SOURCE=.\PluginAdapterV1.rgs +# End Source File +# Begin Source File + +SOURCE=.\SolidImage.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/Inject/Inject.idl b/Native/Inject/Inject.idl new file mode 100644 index 0000000..43ec3cd --- /dev/null +++ b/Native/Inject/Inject.idl @@ -0,0 +1,960 @@ +// Inject.idl : IDL source for Inject.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (Inject.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; +import "decal.idl"; +import "unknwn.idl"; + +interface IBarManager; +interface ILayerSite; +interface IIconCache; +interface IImageCache; +interface IFontCache; +interface ISimpleBar; +interface ICanvas; +interface IView; +interface ILayer; +interface IPanelSink; +interface IInputBuffer; + +struct ClipParams +{ + RECT window; + POINT org; + VARIANT_BOOL visible; +}; + +enum eAlphaBlendOptions +{ + eAlphaBlendSoftware = 0x01, + eAlphaBlendGDIPlus = 0x02 +}; + +enum eRenderOptions +{ + eRenderClipped = 0x01, + eRenderNext = 0x02, + eRenderTransparent = 0x08, + eRenderReformatNext = 0x20 +}; + +enum eViewFlags +{ + eTransparent = 0x01, +}; + +enum eFontOptions +{ + eFontBold = 0x01, + eFontItalic = 0x02, + eFontUnderline = 0x04 +}; + +enum eFontJustify +{ + eFontLeft, + eFontRight, + eFontCenter +}; + +enum eDrawTextExFlags +{ + eAA = 0x1, + eOutlined = 0x2, +}; + +enum eDefaultControlType +{ + eCtlButton, + eCtlPager +}; + +enum ePositionType +{ + ePositionByIndex, + ePositionByID +}; + +enum eMinMaxState +{ + eStateMax = 0, + eStateMin = 1 +}; + +enum eCombatState +{ + ePeace = 1, + eMelee = 2, + eMissile = 3, + eMagic = 4 +}; + +struct LayerParams +{ + long ID; + RECT pos; + long render; +}; + +struct ViewParams +{ + long icon; + long iconLibrary; + BSTR label; + long left; + long top; + long width; + long height; + long alpha; + long state; +}; + +struct MouseState +{ + ILayer *over; + POINT screen, + client; + VARIANT_BOOL ctrl; + VARIANT_BOOL shift; +}; + +struct KeyState +{ + short vkey; + VARIANT_BOOL ctrl; + VARIANT_BOOL shift; +}; + +enum eMouseInput +{ + eMouseLeftClick, + eMouseRightClick, + eMouseLeftDoubleClick, + eMouseRightDoubleClick +}; + +enum eInputStatus +{ + eInputIdle, + eInputWaiting, + eInputRunning, + eInputPaused +}; + +enum eManagerSinkCaps +{ + eManagerSinkCapWindowMessage = 0x01, + eManagerSinkCapPlugin = 0x02, + eManagerSinkCapRender = 0x04, + eManagerSinkCapRender3D = 0x08, +}; + + [ + object, + uuid(702D3901-C13A-448e-8871-ECDC8BC8D079), + helpstring("Interface passed to plugins for access to global services."), + pointer_default(unique) + ] + interface IPluginSite : IUnknown + { + [helpstring("Unloads a plugin by ID - used by plugins that want to unload themselves")] HRESULT UnloadPlugin(long nID); + [helpstring("The DirectDraw object used by AC")] HRESULT GetDirectDraw(REFIID iid, [iid_is(iid)] void **ppvItf); + [helpstring("The current surface used for 3d drawing - the offscreen buff in windowed mode or the backbuffer in fullscreen mode")] HRESULT GetPrimarySurface([out, retval] ICanvas **ppPrimary); + [helpstring("The Direct3DDevice used by AC")] HRESULT Get3DDevice(REFIID iid, [iid_is(iid)] void **ppvItf); + [helpstring("Loads a bitmap into a surface from a file. Do not use of measure the bitmap until in a rendering pass.")] HRESULT LoadBitmapFile(BSTR strFilename, [out, retval] IImageCache **ppImage); + [helpstring("Returns an icon cache for a particular size")] HRESULT GetIconCache(LPSIZE psz, [out, retval] IIconCache **ppCache); + [helpstring("Loads a bitmap into a surface directly from portal.dat. Do not use of measure the bitmap until in a rendering pass.")] HRESULT LoadBitmapPortal(long nFile, IImageCache **); + [helpstring("Create a cached font for drawing and measuring text")] HRESULT CreateFont(BSTR szFaceName, long nHeight, long dwFlags, [out, retval] IFontCache **ppFont); + [helpstring("Returns the current resolution, in windowed mode it is the client area")] HRESULT GetScreenSize(LPSIZE sz); + [helpstring("Creates an offscreen buffer for drawing. Drawing is not guaranteed to be successful outside of the rendering pass.")] HRESULT CreateCanvas(LPSIZE psz, [out, retval] ICanvas **ppCanvas); + [helpstring("Creates a new view (icon and panel surface) using the control as the panel root")] HRESULT CreateView(struct ViewParams *pParams, ILayer *pLayer, [out, retval] IView **ppView); + [helpstring("Creates a new view from a view schema, if the text is an XML document (beginning with ) it is loaded directly, otherwise it is interpretted as a moniker (file or URL source).")] HRESULT LoadView(BSTR strSchema, [out, retval] IView **ppView); + [helpstring("method CreateBrushImage")] HRESULT CreateBrushImage(long nColor, [out, retval] IImageCache **ppImg); + [helpstring("method LoadImageSchema")] HRESULT LoadImageSchema(IUnknown *pSchema, [out, retval] IImageCache **ppImg); + [helpstring("method CreateFontSchema")] HRESULT CreateFontSchema(long nDefHeight, long nDefOptions, IUnknown *pSchema, [out, retval] IFontCache **ppCache); + [helpstring("method LoadResourceModule")] HRESULT LoadResourceModule(BSTR strLibrary, [out, retval] long *pnModule); + [propget, helpstring("property ResourcePath")] HRESULT ResourcePath([out, retval] BSTR *pVal); + [propget, helpstring("property Plugin")] HRESULT Plugin(BSTR strProgID, [out, retval] LPDISPATCH *pVal); + [propget, helpstring("property NetworkFilter")] HRESULT NetworkFilter(BSTR strProgID, [out, retval] LPDISPATCH *pVal); + [helpstring("method LoadViewObject")] HRESULT LoadViewObject(IUnknown *pSchema, [out, retval] IView **ppView); + [helpstring("method CreateInputBuffer")] HRESULT CreateInputBuffer([out, retval] IInputBuffer **ppInput); + [propget, helpstring("property HWND")] HRESULT HWND([out, retval] long *pVal); + [propget, helpstring("property Focus")] HRESULT Focus([out, retval] VARIANT_BOOL *pVal); + [propget, helpstring("property OldWndProc")] HRESULT OldWndProc([out, retval] long *pOldWndProc); + + [propput, helpstring("property Current Selection")] HRESULT CurrentSelection([in] long nID); + [propget, helpstring("property Current Selection")] HRESULT CurrentSelection([out, retval] long *nID); + + [propput, helpstring("property Previous Selection")] HRESULT PreviousSelection([in] long nID); + [propget, helpstring("property Previous Selection")] HRESULT PreviousSelection([out, retval] long *nID); + + [helpstring("Writes text to AC's Chat Window")] HRESULT WriteToChatWindow(BSTR szText, [defaultvalue(0)] long lColor); + [helpstring("Sets the Current Mouse Position")] HRESULT SetCursorPosition(long x, long y); + [helpstring("Gets a key's binding from the current keymap")] HRESULT QueryKeyboardMap([in] BSTR bstrName, [out, retval] long *pAsciiVal); + [helpstring("Gets known MemLocs from the xml.")] HRESULT QueryMemLoc([in] BSTR bstrName, [out, retval] long *pVal); + + [helpstring("Writes raw text to AC's Chat Window (Doesn't include a newline)")] HRESULT RawWriteToChatWindow(BSTR szText, [defaultvalue(0)] long lColor); + + [helpstring("Casts a specific Spell on the Object specified")] HRESULT CastSpell(long lSpellID, long lObjectID); + + [helpstring("Moves items within your inventory")] HRESULT MoveItem(long lObjectID, long lPackID, long lSlot, long lStack); + + [helpstring("Selects an item")] HRESULT SelectItem(long lObjectID); + + [helpstring("Uses an item")] HRESULT UseItem(long lObjectID, long lUseOnSelectedItem); + + [propget, helpstring("property CombatState")] HRESULT CombatState([out, retval] long *pVal); + [propget, helpstring("property ChatState")] HRESULT ChatState([out, retval] VARIANT_BOOL *pVal); + [helpstring("method UseItemEx")] HRESULT UseItemEx(long Use, long UseOn); + + [helpstring("Decal itself")] HRESULT get_Decal([out, retval] IDecal **pVal); + [helpstring("Gets the vital stats of a member of your fellowship")] HRESULT GetFellowStats(long charID); + [propget, helpstring("property Hooks")] HRESULT Hooks([out, retval] IACHooks **pVal); + [helpstring("Force redraw of the Decal bar")] HRESULT RedrawBar(); + + [propget, helpstring("Fetch the font set in DenAgent")] HRESULT FontName([out, retval] BSTR *pFontName); + }; + + [ + object, + uuid(BA3E677F-8E44-4829-982E-58BBBC5C5F9B), + helpstring("IPlugin Interface - All plugin components are required to implement this interface"), + pointer_default(unique) + ] + interface IPlugin : IUnknown + { + [helpstring("Create all objects and views within your plugin. The assigned ID can be used for self termiantion and the plugin site should be stored.")] HRESULT Initialize(IPluginSite *pSite, long nID); + [helpstring("Release all your objects including the stored IPluginSite")] HRESULT Terminate(); + [propget, helpstring("Return a short text string describing your plugin.")] HRESULT FriendlyName([out, retval] BSTR *pVal); + }; + + [ + object, + uuid(D216BA6C-D328-4765-B40A-9BC57C96F75E), + helpstring("IPluginSink Interface"), + pointer_default(unique) + ] + interface IPluginSink : IUnknown + { + [helpstring("method ChatText")] HRESULT ChatText(BSTR bstrMsg, [out, retval] VARIANT_BOOL *pbEat); + [helpstring("method ChatMessage")] HRESULT ChatMessage(BSTR bstrMsg, long *pColor, [out, retval] VARIANT_BOOL *pbEat); + }; + + [ + object, + uuid(65C6CE3D-B66B-4B64-8EA3-18AB2328484E), + helpstring("IRenderSink Interface"), + pointer_default(unique) + ] + interface IRenderSink : IUnknown + { + [helpstring("method CustomDraw")] HRESULT CustomDraw(ICanvas* pCanvas); + }; + + [ + object, + uuid(E4FBF228-D2AA-4298-96EC-6D89A1960731), + helpstring("IRender3DSink Interface"), + pointer_default(unique) + ] + interface IRender3DSink : IUnknown + { + [helpstring("method PreBeginScene")] HRESULT PreBeginScene(IUnknown* pD3D); + [helpstring("method PostBeginScene")] HRESULT PostBeginScene(IUnknown* pD3D); + [helpstring("method PreEndScene")] HRESULT PreEndScene(IUnknown* pD3D); + [helpstring("method PostEndScene")] HRESULT PostEndScene(IUnknown* pD3D); + }; + + [ + object, + uuid(996B377C-1953-4db1-AAC1-157F72592D3E), + dual, + helpstring("Base interface for all controls."), + pointer_default(unique) + ] + interface IControl : IDispatch + { + [id(1), helpstring("Remove this control from the hierarchy.")] HRESULT DestroyChild(long nIndex, [defaultvalue(ePositionByIndex)] enum ePositionType posType); + [id(2), propget, helpstring("Returns the numerical ID used by this control for events.")] HRESULT ID([out, retval] long *pVal); + [id(3), propget, helpstring("The number of direct children.")] HRESULT ChildCount([out, retval] long *pVal); + [id(4), propget, helpstring("Select a child by ID (ePositionByID) or index (ePositionByIndex).")] HRESULT Child(long nIndex, [defaultvalue(ePositionByIndex)] enum ePositionType posType, [out, retval] IControl* *pVal); + + //[id(5), propget, helpstring("property Position")] HRESULT Position([out, retval] RECT *pVal); + //[id(5), propput, helpstring("property Position")] HRESULT Position([in] RECT *newVal); + + }; + + [ + uuid(2FEBCBC3-488C-444f-AD08-5D3097D2D1ED), + helpstring("Base events interface for all controls, copy these member(s) into the specific control interface.") + ] + dispinterface IControlEvents + { + properties: + methods: + [id(1), helpstring("This control is about to be destroyed, release any references to this object.")] void Destroy(long nID); + }; + + [ + object, + uuid(0D63504F-DEEF-4a2d-9742-28DD1BADDA7C), + helpstring("Base interface for Layers, all control must implement this interface."), + pointer_default(unique) + ] + interface ILayer : IUnknown + { + [helpstring("Initialize your layer and you must store the ILayerSite.")] HRESULT LayerCreate(ILayerSite *pSite); + [helpstring("Release all objects including the ILayerSite")] HRESULT LayerDestroy(); + [propget, helpstring("property Position")] HRESULT Position([out, retval] RECT *pVal); + [propput, helpstring("property Position")] HRESULT Position([in, out] RECT *newVal); + [helpstring("Invalidate the layer through ILayerSite")] HRESULT Invalidate(); + }; + + [ + object, + uuid(D1C71B85-62C2-42a3-AE2E-4BF5A6BE1784), + helpstring("Layers that perform drawing should implement this interface."), + pointer_default(unique) + ] + interface ILayerRender : IUnknown + { + [helpstring("Sent to every layer before the drawing cycle. It can use this opportunity to invalidate.")] HRESULT PreRender(); + [helpstring("Draw your layer into the provided canvas.")] HRESULT Render(ICanvas *pDest); + [helpstring("Perform any formatting before drawing.")] HRESULT Reformat(); + [helpstring("Use either ICanvas::OffsetOrg or ICanvas::SetClipRect to adjust the clipping area before clipped child layers draw. The visibility return value from those commands should be returned from this function.")] HRESULT AdjustRenderArea(ICanvas *pDest, [out, retval] VARIANT_BOOL *pbVisible); + [helpstring("For non-square layers - do a fine level of hit testing.")] HRESULT HitTest(LPPOINT pt, [out, retval] VARIANT_BOOL *pbHit); + }; + + [ + object, + uuid(5B7E9D99-BB3A-475D-842D-43EBEA8284EA), + helpstring("Base windowing interface. Through here, a layer can manipualte itself and it's children."), + pointer_default(unique) + ] + interface ILayerSite : IUnknown + { + [helpstring("Destroy this layer, all of it's children and release the controls.")] HRESULT Destroy(); + [helpstring("Append a child layer to the list and create an associated Layer Site.")] HRESULT CreateChild(struct LayerParams *params, ILayer *pSink); + [helpstring("Returns a specific interface from the layer sink.")] HRESULT GetSink(REFIID iid, [iid_is(iid)] void **ppvItf); + [helpstring("Redraw this layer for the next render pass. If the layer is transparent, the parent will be invalidated.")] HRESULT Invalidate(); + [propget, helpstring("Returns the default PluginSite - this is used for loading bitmaps and fonts.")] HRESULT PluginSite([out, retval] IPluginSite **ppSite); + [helpstring("Marks this layer for formatting, this function will also Invalidate.")] HRESULT Reformat(); + [helpstring("Walks up the parent list until it find a parent that implements a particular interface.")] HRESULT GetParentSink(REFIID iid, [iid_is(iid)] void **ppvItf); + [propget, helpstring("The layer render area, if clipped it is relative parent coordinates, if unclipped it's in screen coordinates.")] HRESULT Position([out, retval] LPRECT pVal); + [propput, helpstring("The layer render area, if clipped it is relative parent coordinates, if unclipped it's in screen coordinates.")] HRESULT Position([in] LPRECT newVal); + [propget, helpstring("The layer ID assigned at layer creation - this is used in callbacks.")] HRESULT ID([out, retval] long *pVal); + [propget, helpstring("The number of direct child layers (clipped and unclipped).")] HRESULT ChildCount([out, retval] long *pVal); + [propget, helpstring("Returns a direct child by ID or by index.")] HRESULT Child(long nIndex, [defaultvalue(ePositionByIndex)] enum ePositionType posType, [out, retval] ILayerSite* *pVal); + [helpstring("Captures keyboard input from AC until an event happens. The layer must implement ILayerKeyboard to receive these events.")] HRESULT CaptureKeyboard(); + [helpstring("Determines if a layer is either equal or a descendant of the current layer. If bTextUnclipped is false, the method will only test clipped layers.")] HRESULT IsChild(ILayerSite *pSite, [defaultvalue(0)] VARIANT_BOOL bTestUnclipped, [out, retval] VARIANT_BOOL *pbIsChild); + [propput, helpstring("Sets the layer to receive notification when an action that cancels popups occurs. Layers that self-terminate popup mode should set this to False when complete. The layer must implement ILayerPopup to receive notifications.")] HRESULT Popup([in] VARIANT_BOOL newVal); + [propget, helpstring("Returns the position of this layer in screen coordinates.")] HRESULT ScreenPosition([out, retval] LPRECT pVal); + [helpstring("Begins a timer with a particular ID (first notification is in nInterval ms). The layer must implement ILayerTimer to receive these notifications.")] HRESULT StartTimer(long nID, long nInterval); + [helpstring("Kill this timer.")] HRESULT EndTimer(long nID); + [propget, helpstring("property Transparent")] HRESULT Transparent([out, retval] VARIANT_BOOL *pVal); + [propput, helpstring("property Transparent")] HRESULT Transparent([in] VARIANT_BOOL newVal); + [propput, helpstring("property Alpha")] HRESULT Alpha(long Alpha); + [helpstring("Moves the view to the front of the list")] HRESULT moveToFront(); + }; + + [ + object, + uuid(E4CCDC92-8658-4caa-8955-FB891D5BDCF7), + helpstring("Internal interface for accessing the switch-bar at the top of the screen."), + pointer_default(unique) + ] + interface IBarManager : IUnknown + { + [helpstring("Appends a bar on the bar maanger.")] HRESULT AddBar(long nViewID, struct ViewParams *pParams); + [helpstring("Deletes a bar from the manager.")] HRESULT RemoveBar(long nViewID); + [propget, helpstring("The properties of a particular bar.")] HRESULT Bar(long nViewID, [out, retval] struct ViewParams *pVal); + [propput, helpstring("The properties of a particular bar.")] HRESULT Bar(long nViewID, [in] struct ViewParams *newVal); + [helpstring("Force redraw of the Decal bar.")] HRESULT Reformat() ; + }; + + [ + object, + uuid(DEDCD5AA-F6CA-4DA5-A657-E82F126ABBCD), + helpstring("Icon cache, this object is a tileset for icon images"), + pointer_default(unique) + ] + interface IIconCache : IUnknown + { + [helpstring("Renders an icon to a canvas. This function is only guarnateed to work in the rendering cycle.")] HRESULT DrawIcon(LPPOINT ppt, long nFile, long nModule, ICanvas *pTarget); + [helpstring("Renders an icon to a canvas, Replacing any white pixels with the specified lColor. This function is only guarnateed to work in the rendering cycle.")] HRESULT DrawIconEx(LPPOINT ppt, long nFile, long nModule, ICanvas *pTarget, long lColor); + }; + + [ + object, + uuid(F88548BC-D11E-4ac2-9A27-3607004D359F), + dual, + helpstring("Stores a bitmap loaded from a variety of sources"), + pointer_default(unique) + ] + interface IImageCacheDisp : IDispatch + { + }; + + [ + object, + uuid(BE566CEC-6881-481C-A146-9F5A32576BE6), + helpstring("Stores a bitmap loaded from a variety of sources"), + pointer_default(unique) + ] + interface IImageCache : IImageCacheDisp + { + [helpstring("Uses the image to fill an area on the canvas. The origin is the offset of the image at the top/left corner of the fill area.")] HRESULT PatBlt(ICanvas *pDest, LPRECT prcDest, LPPOINT ptOrigin); + [helpstring("Stretches an image to a particular width by drawing the head and tail, then pattern filling the middle area. nStartStretch and nEndStretch indicate the area to replicate.")] HRESULT StretchBlt(ICanvas *pDest, LPPOINT pptDest, long nWidth, long nStartStretch, long nEndStretch); + [helpstring("Copies a portion of an image to a canvas.")] HRESULT Blt(LPRECT rcSrc, ICanvas *pDest, LPPOINT pptDest); + [propget, helpstring("Returns the dimension of the currently loaded image.")] HRESULT Size([out, retval] SIZE *pVal); + [helpstring("Copies a portion of an image to a canvas and stretches it.")] HRESULT StretchBltArea(LPRECT prcSrc, ICanvas *pDest, LPRECT prcDest); + }; + + [ + object, + uuid(9394E96D-2B29-4c29-AF3E-DB5C476122DB), + dual, + helpstring("IFontCache Interface"), + pointer_default(unique) + ] + interface IFontCacheDisp : IDispatch + { + }; + + [ + object, + uuid(12ECCB0F-36A6-451C-B086-1306B74AAEC2), + helpstring("IFontCache Interface"), + pointer_default(unique) + ] + interface IFontCache : IFontCacheDisp + { + [helpstring("Renders text to a canvas. Only guaranteed to work within the render cycle.")] HRESULT DrawText( LPPOINT pt, BSTR szText, long clr, ICanvas *pTarget ); + [helpstring("Returns the width and height of a string of text.")] HRESULT MeasureText(BSTR szText, [out, retval] LPSIZE pszExt); + [helpstring("method HitTest")] HRESULT HitTest(BSTR szText, long nPos, [out, retval] long *nIndex); + [helpstring("Renders text to a canvas. Only guaranteed to work within the render cycle.")] HRESULT DrawTextEx( LPPOINT pt, BSTR szText, long clr1, long clr2, long flags, ICanvas *pTarget ); + }; + + [ + object, + uuid(4A2D87CD-BFB4-4723-B959-FFF3FDD49278), + helpstring("ISimpleBar Interface"), + pointer_default(unique) + ] + interface ISimpleBar : IUnknown + { + [propget, helpstring("The horizontal area required by this tab.")] HRESULT RenderWidth([out, retval] long *nWidth); + [propget, helpstring("The text and icon.")] HRESULT Params([out, retval] struct ViewParams *pVal); + [propput, helpstring("The text and icon.")] HRESULT Params([in] struct ViewParams *newVal); + }; + + [ + object, + uuid(5014E0B2-9156-412c-946D-9D4BAA9F4C51), + helpstring("ILayerMouse Interface"), + pointer_default(unique) + ] + interface ILayerMouse : IUnknown + { + [helpstring("The mouse has entered the control")] HRESULT MouseEnter(struct MouseState *pMouse); + [helpstring("The mouse has left the control")] HRESULT MouseExit(struct MouseState *pMouse); + [helpstring("The user pressed the mouse button within the control. This control will have capture until the button is released.")] HRESULT MouseDown(struct MouseState *pMouse); + [helpstring("The user released the mouse button. Capture is also released.")] HRESULT MouseUp(struct MouseState *pMouse); + [helpstring("The mouse moved within the area of the layer.")] HRESULT MouseMove(struct MouseState *pMouse); + [helpstring("The user double clicked inside the layer.")] HRESULT MouseDblClk(struct MouseState *pMouse); + [helpstring("Generic Mouse Message, parameters are uninterpretted.")] HRESULT MouseEvent(long nMsg, long wParam, long lParam); + }; + + [ + object, + uuid(829E0FB2-D0B5-4814-BCF9-6ECFA06C9AED), + helpstring("ILayerSchema Interface"), + pointer_default(unique) + ] + interface ILayerSchema : IUnknown + { + [helpstring("Load schema from an XML DOM source. Query IXMLDOMElement from the IUnknown pointer.")] HRESULT SchemaLoad(IView *pView, IUnknown *pXMLSchema); + }; + + [ + object, + uuid(0F5765A4-9F83-4077-8884-6CBDDCE348F7), + dual, + helpstring("IButton Interface"), + pointer_default(unique) + ] + interface IButton : IControl + { + [id(101), helpstring("Set the pressed and released images.")] HRESULT SetImages(long nModule, long nReleased, long nPressed); + [id(102), propget, helpstring("The background color for this button - usually black (#000000).")] HRESULT Matte([out, retval] long *pVal); + [id(102), propput, helpstring("The background color for this button - usually black (#000000).")] HRESULT Matte([in] long newVal); + }; + + [ + uuid(F029D3A1-29AF-45ef-927E-729FEDD87403), + helpstring("ICommandEvents Interface") + ] + dispinterface ICommandEvents + { + properties: + methods: + [id(1), helpstring("method Destroy")] void Destroy(long nID); + [id(2), helpstring("method CommandHit")] void Hit(long nID); + [id(3), helpstring("method CommandUnhit")] void Unhit(long nID); + [id(4), helpstring("method CommandAccepted")] void Accepted(long nID); + [id(5), helpstring("method CommandCanceled")] void Canceled(long nID); + }; + + [ + object, + uuid(BD9FC464-C0D8-4823-8255-E818F8836B08), + helpstring("IPager Interface"), + pointer_default(unique) + ] + interface IPager : IControl + { + [helpstring("method FinishCommand")] HRESULT FinishCommand(); + [helpstring("method ScrollTo")] HRESULT ScrollTo(LPPOINT ppt); + [propget, helpstring("property Command")] HRESULT Command([out, retval] long *pVal); + [propput, helpstring("property Command")] HRESULT Command([in] long newVal); + [propget, helpstring("property Offset")] HRESULT Offset([out, retval] LPPOINT pVal); + [propput, helpstring("property Offset")] HRESULT Offset([in] LPPOINT newVal); + [helpstring("method CreateClient")] HRESULT CreateClient(ILayer *pLayer); + }; + + [ + uuid(7499EB61-6992-4e21-8A55-CF44D44C0A07), + helpstring("IPagerEvents Interface") + ] + dispinterface IPagerEvents + { + properties: + methods: + [id(1), helpstring("method Destroy")] void Destroy(long nID); + [id(6), helpstring("method PagerUpdatePosition")] void Change(long nID, long nCommand, long nX, long nY); + [id(7), helpstring("method PagerGetNextPosition")] VARIANT_BOOL GetNextPosition(long nID, long nCommand, [in, out] long *nX, [in, out] long *nY); + }; + + [ + object, + uuid(2B52B5CB-9E10-4238-8F62-A501406E3EAB), + helpstring("IPanel Interface"), + pointer_default(unique) + ] + interface IPanel : IUnknown + { + [helpstring("method AddView")] HRESULT AddView(long nViewID, ILayer *pLayer); + [helpstring("method ActivateView")] HRESULT ActivateView(long nViewID, struct ViewParams *pParams, long *pVal); + [helpstring("method RemoveView")] HRESULT RemoveView(long nViewID); + [propget, helpstring("property ActiveView")] HRESULT ActiveView([out, retval] long *pVal); + [helpstring("method LoadView")] HRESULT LoadView(long nViewID, IView *pView, IUnknown *pSchema); + [helpstring("method Deactivate")] HRESULT Deactivate(); + [propputref, helpstring("property Sink")] HRESULT Sink([in] IPanelSink* newVal); + [helpstring("method LoadViewEx")] HRESULT LoadViewEx(long nViewID, IView *pView, IUnknown *pSchema, long lViewFlags); + [propget, helpstring("property Transparent")] HRESULT Transparent([out, retval] VARIANT_BOOL* pVal); + [propput, helpstring("property Transparent")] HRESULT Transparent([in] VARIANT_BOOL newVal); + [propput, helpstring("property Params")] HRESULT Params([in] struct ViewParams *newVal); + }; + + [ + object, + uuid(85D70924-917D-41bb-995D-C40E6AB21C71), + helpstring("IPanelSink Interface"), + pointer_default(unique) + ] + interface IPanelSink : IUnknown + { + [helpstring("method PanelDeactivate")] HRESULT PanelDeactivate( long nViewID ); + }; + + [ + object, + uuid(9241862D-BA71-4317-8166-3A3E61CE3E5F), + helpstring("ICanvas Interface"), + pointer_default(unique) + ] + interface ICanvas : IUnknown + { + [helpstring("method PushClipRect")] HRESULT PushClipRect(LPRECT prc, [out, retval] VARIANT_BOOL *pbVisible); + [helpstring("method PopClipRect")] HRESULT PopClipRect(); + [helpstring("method GetDC")] HRESULT GetDC([out,retval] HDC *pdc); + [helpstring("method ReleaseDC")] HRESULT ReleaseDC(); + [helpstring("method GetSurface")] HRESULT GetSurface(REFIID iid, [out, retval, iid_is(iid)] void **ppvItf); + [helpstring("method Fill")] HRESULT Fill(LPRECT prc, long nRGB); + [helpstring("method Frame")] HRESULT Frame(LPRECT prc, long nRGB); + [helpstring("method GetClipParams")] HRESULT GetClipParams([out, retval] struct ClipParams *pParams); + [propget, helpstring("property WasLost")] HRESULT WasLost([out, retval] VARIANT_BOOL *pVal); + [propget, helpstring("property Size")] HRESULT Size([out, retval] LPSIZE pVal); + [propput, helpstring("property Size")] HRESULT Size([in] LPSIZE newVal); + [helpstring("method Blt")] HRESULT Blt(LPRECT prcSrc, ICanvas *pSrc, LPPOINT pptDest); + [helpstring("method HitTest")] HRESULT HitTest(LPPOINT ppt, [out, retval] VARIANT_BOOL *pbHit); + [helpstring("method ToClient")] HRESULT ToClient([in, out] LPPOINT pt); + [helpstring("method ToScreen")] HRESULT ToScreen([in, out] LPPOINT ppt); + [helpstring("method OffsetOrg")] HRESULT OffsetOrg(LPPOINT ppt, [out, retval] VARIANT_BOOL *pbVisible); + [helpstring("method SetClipRect")] HRESULT SetClipRect(LPRECT prcClip, [out, retval] VARIANT_BOOL *pbVisible); + [propput, helpstring("method Alpha")] HRESULT Alpha(long Alpha); + [helpstring("method DownMixRGB")] HRESULT DownMixRGB(WORD wRed, WORD wGreen, WORD wBlue, [out, retval] WORD *wDMRGB); + [helpstring("method GetDCLong")] HRESULT GetDCLong([out, retval] long *DC); + [helpstring("method SetTransparentColor")] HRESULT SetTransparentColor([in] long TransColor); + [helpstring("method StretchBlt")] HRESULT StretchBlt(LPRECT prcSrc, ICanvas *pSrc, LPRECT prcDest); + }; + + [ + object, + uuid(F3B54A0C-61B9-4B7A-9FD8-82B0477FB7D9), + dual, + helpstring("IView Interface"), + pointer_default(unique) + ] + interface IViewDisp : IDispatch + { + [propget, helpstring("property Control")] HRESULT Control(BSTR strName, [out, retval] IControl * *pVal); + [propputref, helpstring("property Control")] HRESULT Control(BSTR strName, [in] IControl * newVal); + [propget, helpstring("property Title")] HRESULT Title([out, retval] BSTR *pVal); + [propput, helpstring("property Title")] HRESULT Title([in] BSTR newVal); + [helpstring("property Alert")] HRESULT Alert(); + [helpstring("method SetIcon")] HRESULT SetIcon(long icon, [optional] VARIANT iconlibrary); + [helpstring("method Activate")] HRESULT Activate(); + [helpstring("method Deactivate")] HRESULT Deactivate(); + [propput, helpstring("property Position")] HRESULT Position([in, out] RECT *newVal); + [propget, helpstring("property Position")] HRESULT Position([out, retval] RECT *pVal); + }; + + [ + object, + uuid(A2AE18B7-85C9-451c-8CC3-D0FFE6B86EEB), + helpstring("IView Interface"), + pointer_default(unique) + ] + interface IView : IViewDisp + { + [helpstring("method LoadControl")] HRESULT LoadControl(ILayerSite *pParent, long nID, IUnknown *pXMLSource, [out, retval] long *pAssignedID); + [helpstring("method LoadSchema")] HRESULT LoadSchema(BSTR strXMLSchema); + [propput, helpstring("property Alpha")] HRESULT Alpha(long Alpha); + [propget, helpstring("property Activated")] HRESULT Activated([out, retval] VARIANT_BOOL* pVal); + [propput, helpstring("property Activated")] HRESULT Activated([in] VARIANT_BOOL newVal); + [propget, helpstring("property Transparent")] HRESULT Transparent([out, retval] VARIANT_BOOL* pVal); + [propput, helpstring("property Transparent")] HRESULT Transparent([in] VARIANT_BOOL newVal); + [propget, helpstring("property Alpha")] HRESULT Alpha([out, retval] long *pVal); + }; + + [ + uuid(4B7B19D5-61A2-4ab0-8B1B-381A303A937F), + helpstring("IViewEvents Interface") + ] + dispinterface IViewEvents + { + properties: + methods: + [id(8), helpstring("method ViewActivate")] void Activate(); + [id(9), helpstring("method ViewDeactivate")] void Deactivate(); + [id(13), helpstring("method ViewSize")] VARIANT_BOOL Size(); + [id(14), helpstring("method ViewSizing")] void Sizing([in] /*IView *pView*/ /*struct ViewParams *pViewParams RECT *pRect*/ long left, long top, long width, long height); + }; + + [ + object, + uuid(D3006096-B293-47f5-9377-C12DEF5C1D34), + helpstring("IRootLayer Interface"), + pointer_default(unique) + ] + interface IRootLayer : IUnknown + { + [helpstring("method CreateView")] HRESULT CreateView(struct ViewParams *pParams, ILayer *pLayer, [out, retval] IView **ppView); + [helpstring("method SelectBar")] HRESULT SelectBar(long nID); + [helpstring("method LoadView")] HRESULT LoadView(BSTR strXML, [out, retval] IView **ppView); + [helpstring("method LoadViewObject")] HRESULT LoadViewObject(IUnknown *pSchema, [out, retval] IView **ppView); + }; + + [ + object, + uuid(7500929F-4251-4373-B978-286A8A8BECED), + helpstring("ILayerKeyboard Interface"), + pointer_default(unique) + ] + interface ILayerKeyboard : IUnknown + { + [helpstring("method KeyboardChar")] HRESULT KeyboardChar(struct KeyState *pKS); + [helpstring("method KeyboardEndCapture")] HRESULT KeyboardEndCapture(VARIANT_BOOL bCancel); + [helpstring("method KeyboardEvent")] HRESULT KeyboardEvent(long nMsg, long wParam, long lParam); + }; + + [ + object, + uuid(22072A97-E5E6-4d91-A344-807235BFA5D8), + helpstring("ILayerPopup Interface"), + pointer_default(unique) + ] + interface ILayerPopup : IUnknown + { + [helpstring("method PopupCancel")] HRESULT PopupCancel(struct MouseState *pMouse, [out, retval] VARIANT_BOOL *pbContinue); + }; + + [ + object, + uuid(5D6B8A1B-321A-479f-9347-55725BDA3DA9), + helpstring("ILayerTimer Interface"), + pointer_default(unique) + ] + interface ILayerTimer : IUnknown + { + [helpstring("method TimerTimeout")] HRESULT TimerTimeout(long nID, long nInterval, long nReps, [out, retval] VARIANT_BOOL *pbContinue); + }; + + [ + object, + uuid(EDB7EE44-2368-4382-97A4-D4F55C63D818), + helpstring("IDecalTimer Interface"), + pointer_default(unique) + ] + interface IDecalTimer : IUnknown + { + [helpstring("method TimerTimeout")] HRESULT TimerTimeout(long nID, long nInterval, long nReps, [out, retval] VARIANT_BOOL *pbContinue); + }; + + [ + object, + uuid(A68BE455-C241-49c5-9F8A-070E4CBE430F), + helpstring("IWindowsMessageSink Interface"), + pointer_default(unique) + ] + interface IWindowsMessageSink : IUnknown + { + [helpstring("method WindowsMessage")] HRESULT WindowMessage(long hWnd, short uMsg, long wParam, long lParam, [out, retval] VARIANT_BOOL *pbEat); + [helpstring("method WindowsMessageEnd")] HRESULT WindowMessageEnd(); + }; + + [ + object, + uuid(50CDFD25-4F3B-4412-96BE-947A6C7B93A2), + + helpstring("IBrushImage Interface"), + pointer_default(unique) + ] + interface IBrushImage : IUnknown + { + [propget, helpstring("property Color")] HRESULT Color([out, retval] long *pVal); + [propput, helpstring("property Color")] HRESULT Color([in] long newVal); + }; + + [ + object, + uuid(634D74B8-AFED-4710-82C9-B530326E1AFA), + dual, + helpstring("IInputBuffer Interface"), + pointer_default(unique) + ] + interface IInputBuffer : IDispatch + { + [id(1), helpstring("method Clear")] HRESULT Clear(); + [id(2), helpstring("method Input")] HRESULT TypeText(BSTR strText); + [id(3), helpstring("method Delay")] HRESULT Delay(long nMilliseconds, [defaultvalue( 0 )] VARIANT_BOOL bAllowInput ); + [id(4), helpstring("method MouseClick")] HRESULT MouseClick(long nX, long nY, enum eMouseInput eAction); + [propget, id(5), helpstring("property Status")] HRESULT Status([out, retval] enum eInputStatus *pVal); + [id(6), helpstring("method Run")] HRESULT Run(); + }; + + [ + uuid(BD33BADC-F909-4eb6-AD15-B1569B58898B), + helpstring("IInputEvents event interface") + ] + dispinterface IInputEvents + { + properties: + methods: + [id(10), helpstring("method Begin")] HRESULT Begin(); + [id(11), helpstring("method End")] HRESULT End(); + [id(12), helpstring("method Pause")] HRESULT Pause(); + }; + + [ + object, + uuid(E288C465-2DD6-4fcd-95E2-5BBC1A1D2D32), + dual, + helpstring("IInputNotify Interface"), + pointer_default(unique) + ] + interface IInputNotify : IDispatch + { + [id(1), helpstring("method NotifyBegin")] HRESULT NotifyBegin(); + [id(2), helpstring("method NotifyEnd")] HRESULT NotifyEnd(); + [id(3), helpstring("method SetMousePos")] HRESULT SetMousePos(long nX, long nY); + [id(4), helpstring("method NotifyPause")] HRESULT NotifyPause(); + }; + [ + object, + uuid(47761792-2520-4802-8548-5CA580697614), + helpstring("IInjectService Interface"), + pointer_default(unique) + ] + interface IInjectService : IUnknown + { + [propget, id(1), helpstring("property Site")] HRESULT Site([out, retval] IPluginSite **pVal); + [helpstring("method InitPlugin")] HRESULT InitPlugin(IUnknown *pUnk); + }; + + [ + object, + uuid(93D72C31-CBC3-4471-AE4B-395FBB4D3B45), + helpstring("IPluginAdapterV1 Interface"), + pointer_default(unique) + ] + interface IPluginAdapterV1 : IUnknown + { + }; + +[ + uuid(3559E08B-827E-4DFE-9D33-3567246849CC), + version(1.0), + helpstring("Decal Plugins Type Library") +] +library DecalPlugins +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + interface IPlugin; + interface IPluginSink; + interface IRenderSink; + interface IRender3DSink; + + interface ILayerSite; + interface IControl; + + interface ILayer; + interface ILayerRender; + interface ILayerMouse; + interface ILayerKeyboard; + interface ILayerPopup; + interface ILayerSchema; + interface ILayerTimer; + + interface IControlEvents; + + interface IIconCache; + interface IImageCache; + interface IFontCache; + + interface IBarManager; + interface ISimpleBar; + interface IRootLayer; + interface IPanelSink; + interface IInputNotify; + + interface IWindowsMessageSink; + + dispinterface IControlEvents; + dispinterface ICommandEvents; + dispinterface IPagerEvents; + dispinterface IViewEvents; + dispinterface IInputEvents; + + interface IFontCacheDisp; + interface IImageCacheDisp; + interface IViewDisp; + + [ + uuid(91892F16-31A3-4E23-9CFD-89A5A5174A59), + helpstring("Canvas Class"), + noncreatable + ] + coclass Canvas + { + [default] interface ICanvas; + }; + + [ + uuid(B2FBD583-B64C-4dfc-BAAA-34B8C21482F8), + helpstring("PluginSite Class"), + noncreatable + ] + coclass PluginSite + { + [default] interface IPluginSite; + }; + + [ + uuid(6FEA2219-7438-4f76-8165-C47AA060D811), + helpstring("Layer Class"), + noncreatable + ] + coclass Layer + { + [default] interface ILayerSite; + }; + + [ + uuid(19BF46E4-5CB8-4CFC-A17A-8E6673E60ABF), + helpstring("View Class"), + noncreatable + ] + coclass View + { + [default] interface IViewDisp; + [default, source] interface IViewEvents; + }; + + [ + uuid(C22BF2FC-F144-4d17-9C12-A344F980BB17), + helpstring("Button Class") + ] + coclass Button + { + [default] interface IButton; + [default, source] interface ICommandEvents; + }; + + [ + uuid(C79E2F76-06F8-4cd0-A613-4829237D297D), + helpstring("Pager Class") + ] + coclass Pager + { + [default] interface IControl; + [default, source] interface IPagerEvents; + }; + + [ + uuid(918C0333-5714-4C8D-A95C-2C137B76D364), + noncreatable, + helpstring("SolidImage Class") + ] + coclass BrushImage + { + [default] interface IBrushImage; + interface IImageCache; + }; + + [ + uuid(2F91FC21-4D89-4B64-94AE-A124D54563AE), + helpstring("InputBuffer Class"), + noncreatable + ] + coclass InputBuffer + { + [default] interface IInputBuffer; + [default, source] interface IInputEvents; + }; + + [ + uuid(FEFE5CAB-10E4-404F-AD4D-184BCB506099), + helpstring("DecalPlugins Inject Service Gateway") + ] + coclass InjectService + { + [default] interface IInjectService; + }; + + [ + uuid(3D837F6E-B5CA-4604-885F-7AB45FCFA62A), + helpstring("Version 1 Plugin Surrogate") + ] + coclass PluginAdapterV1 + { + [default] interface IPluginAdapterV1; + }; +}; diff --git a/Native/Inject/Inject.rc b/Native/Inject/Inject.rc new file mode 100644 index 0000000..d050a04 --- /dev/null +++ b/Native/Inject/Inject.rc @@ -0,0 +1,163 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_PLUGINADAPTERV1 REGISTRY "PluginAdapterV1.rgs" +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// 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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""Inject.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "Inject is the heart of Decal, it places itself within the memory space of the AC Client and is responsible for drawing the UI on the screen" + VALUE "FileDescription", "Inject Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "Inject" + VALUE "LegalCopyright", "Copyright 2000, 2001" + VALUE "OriginalFilename", "Inject.DLL" + VALUE "ProductName", "Inject Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "Decal" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_BUTTON REGISTRY "Button.rgs" +IDR_PAGER REGISTRY "Pager.rgs" +IDR_INJECTSERVICE REGISTRY "InjectService.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON "res\\DenAgent.ico" +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "Inject.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/Inject/Inject.vcproj b/Native/Inject/Inject.vcproj new file mode 100644 index 0000000..b1ad3ea --- /dev/null +++ b/Native/Inject/Inject.vcproj @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/Inject/InjectApi.h b/Native/Inject/InjectApi.h new file mode 100644 index 0000000..a85b21f --- /dev/null +++ b/Native/Inject/InjectApi.h @@ -0,0 +1,47 @@ +// InjectApi.h +// Declaration of global injection functions +#include +#include + +#ifndef __INJECTAPI_H +#define __INJECTAPI_H + +#ifdef INJECT_IMPL +#define INJECT_API __declspec(dllexport) +#else +#define INJECT_API __declspec(dllimport) +#endif + +#include "Inject.h" + +// Enumerations +enum eInjectPath +{ + eInjectPathDatFile, + eInjectPathAgent +}; + +// Exported functions from Inject.dll +// Adds a reference to the registered hook function +void INJECT_API InjectEnable(); + +// Removes a reference to the registered hook function +void INJECT_API InjectDisable(); + +// Prepends a path to your filename, returns szBuffer +LPTSTR INJECT_API InjectMapPath( eInjectPath pathType, LPCTSTR szFilename, LPTSTR szBuffer ); + +// Checksum - Added for my test container +void INJECT_API Container_Initialize( HWND hWnd, IDirectDraw4* pDD4, IDirectDrawSurface4 *pDDS4 ); +void INJECT_API Container_StartPlugins( ); +void INJECT_API Container_StopPlugins( ); +void INJECT_API Container_Terminate( ); +void INJECT_API Container_SetSurface( IDirectDrawSurface4 *pDDS4 ); +void INJECT_API Container_Draw( ); + +void INJECT_API XMLViewer_Initialize( HWND hWnd, IDirectDraw4* pDD4, IDirectDrawSurface4 *pDDS4 ); +void INJECT_API XMLViewer_LoadView( BSTR bstrSchema ); +void INJECT_API XMLViewer_RemoveView( IView* pView ); +void INJECT_API XMLViewer_Terminate( ); +void INJECT_API XMLViewer_Draw( ); +#endif diff --git a/Native/Inject/InjectCP.h b/Native/Inject/InjectCP.h new file mode 100644 index 0000000..1147b87 --- /dev/null +++ b/Native/Inject/InjectCP.h @@ -0,0 +1,390 @@ +#ifndef _INJECTCP_H_ +#define _INJECTCP_H_ + +template +class CProxyICommandEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VOID Fire_Hit(LONG nID) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VOID Fire_Unhit(LONG nID) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VOID Fire_Accepted(LONG nID) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x4, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VOID Fire_Canceled(LONG nID) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x5, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } +}; + + + +template +class CProxyIPagerEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Destroy(LONG nID) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[0] = nID; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VOID Fire_Change(LONG nID, LONG nCommand, LONG nX, LONG nY) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[4]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[3] = nID; + pvars[2] = nCommand; + pvars[1] = nX; + pvars[0] = nY; + DISPPARAMS disp = { pvars, NULL, 4, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + + } + VARIANT_BOOL Fire_GetNextPosition(LONG nID, LONG nCommand, LONG * nX, LONG * nY) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[4]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[3] = nID; + pvars[2] = nCommand; + pvars[1].vt = VT_BYREF | VT_I4; + pvars[1].plVal = nX; + pvars[0].vt = VT_BYREF | VT_I4; + pvars[0].plVal = nY; + DISPPARAMS disp = { pvars, NULL, 4, 0 }; + pDispatch->Invoke(0x7, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + + delete[] pvars; + return varResult.boolVal; + + } +}; + + +template +class CProxyIViewEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Activate() + { + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x8, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + + } + VOID Fire_Deactivate() + { + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x9, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + + } + VARIANT_BOOL Fire_Size() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0xd, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + return varResult.boolVal; + } + VOID Fire_Sizing(/*IView *pView */ /*ViewParams *pViewParams*/ LONG left, LONG top, LONG width, LONG height) + { + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[4]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + pvars[3] = left; + pvars[2] = top; + pvars[1] = width; + pvars[0] = height; + + //pvars[0].plVal = reinterpret_cast(pViewParams); + //pvars[0] = pView; + DISPPARAMS disp = { pvars, NULL, 4, 0 }; + HRESULT ass = pDispatch->Invoke(0xe, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + delete[] pvars; + } +}; + + +template +class CProxyIInputEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Begin() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0xa, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + return varResult.scode; + + } + HRESULT Fire_End() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0xb, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + return varResult.scode; + + } + HRESULT Fire_Pause() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0xc, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + return varResult.scode; + + } +}; +#endif diff --git a/Native/Inject/InjectService.cpp b/Native/Inject/InjectService.cpp new file mode 100644 index 0000000..c2e441f --- /dev/null +++ b/Native/Inject/InjectService.cpp @@ -0,0 +1,42 @@ +// InjectService.cpp : Implementation of cInjectService +#include "stdafx.h" +#include "Inject.h" +#include "InjectService.h" + +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// cInjectService + +STDMETHODIMP cInjectService::BeforePlugins () +{ + _ASSERTE ( cManager::_p != NULL ); + cManager::_p->init (); + + return S_OK; +} + +STDMETHODIMP cInjectService::AfterPlugins () +{ + _ASSERTE ( cManager::_p != NULL ); + + cManager::_p->unloadPlugins (); + cManager::_p->term (); + + return S_OK; +} + +STDMETHODIMP cInjectService::get_Site(IPluginSite **pVal) +{ + _ASSERTE ( cManager::_p != NULL ); + return static_cast< IPluginSite * > ( cManager::_p )->QueryInterface ( pVal ); +} + +STDMETHODIMP cInjectService::InitPlugin(IUnknown *pUnk) +{ + _ASSERTE ( cManager::_p != NULL ); + + cManager::_p->loadPlugin ( pUnk ); + + return S_OK; +} diff --git a/Native/Inject/InjectService.h b/Native/Inject/InjectService.h new file mode 100644 index 0000000..a678452 --- /dev/null +++ b/Native/Inject/InjectService.h @@ -0,0 +1,52 @@ +// InjectService.h : Declaration of the cInjectService + +#ifndef __INJECTSERVICE_H_ +#define __INJECTSERVICE_H_ + +#include "resource.h" // main symbols +#include + +///////////////////////////////////////////////////////////////////////////// +// cInjectService +class ATL_NO_VTABLE cInjectService : + public CComObjectRootEx, + public CComCoClass, + public IInjectService, + public IDecalServiceImpl, + public IDecalDirectory +{ +public: + cInjectService() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_INJECTSERVICE) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cInjectService) + COM_INTERFACE_ENTRY(IInjectService) + COM_INTERFACE_ENTRY(IDecalService) + COM_INTERFACE_ENTRY(IDecalDirectory) +END_COM_MAP() + +// IDecalService + STDMETHOD(BeforePlugins)(); + STDMETHOD(AfterPlugins)(); + +// IDecalDirectory + STDMETHOD(Lookup)(BSTR strName, IUnknown **ppvItf) + { + if ( ::wcsicmp ( strName, L"site" ) != 0 ) + return E_INVALIDARG; + + return get_Site ( reinterpret_cast< IPluginSite ** > ( ppvItf ) ); + } + +// IInjectService +public: + STDMETHOD(InitPlugin)(IUnknown *pUnk); + STDMETHOD(get_Site)(/*[out, retval]*/ IPluginSite **pVal); +}; + +#endif //__INJECTSERVICE_H_ diff --git a/Native/Inject/InjectService.rgs b/Native/Inject/InjectService.rgs new file mode 100644 index 0000000..fafb269 --- /dev/null +++ b/Native/Inject/InjectService.rgs @@ -0,0 +1,43 @@ +HKCR +{ + DecalPlugins.InjectService.1 = s 'DecalPlugins Inject Service Gateway' + { + CLSID = s '{FEFE5CAB-10E4-404F-AD4D-184BCB506099}' + } + DecalPlugins.InjectService = s 'DecalPlugins Inject Service Gateway' + { + CLSID = s '{FEFE5CAB-10E4-404F-AD4D-184BCB506099}' + CurVer = s 'DecalPlugins.InjectService.1' + } + NoRemove CLSID + { + ForceRemove {FEFE5CAB-10E4-404F-AD4D-184BCB506099} = s 'DecalPlugins Inject Service Gateway' + { + ProgID = s 'DecalPlugins.InjectService.1' + VersionIndependentProgID = s 'DecalPlugins.InjectService' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Services + { + ForceRemove {FEFE5CAB-10E4-404F-AD4D-184BCB506099} = s 'Decal Inject Gateway Service' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/Inject/Injectps.def b/Native/Inject/Injectps.def new file mode 100644 index 0000000..33f81d0 --- /dev/null +++ b/Native/Inject/Injectps.def @@ -0,0 +1,11 @@ + +LIBRARY "InjectPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/Inject/Injectps.mk b/Native/Inject/Injectps.mk new file mode 100644 index 0000000..c0d5fd0 --- /dev/null +++ b/Native/Inject/Injectps.mk @@ -0,0 +1,16 @@ + +Injectps.dll: dlldata.obj Inject_p.obj Inject_i.obj + link /dll /out:Injectps.dll /def:Injectps.def /entry:DllMain dlldata.obj Inject_p.obj Inject_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del Injectps.dll + @del Injectps.lib + @del Injectps.exp + @del dlldata.obj + @del Inject_p.obj + @del Inject_i.obj diff --git a/Native/Inject/InputBuffer.cpp b/Native/Inject/InputBuffer.cpp new file mode 100644 index 0000000..62890e9 --- /dev/null +++ b/Native/Inject/InputBuffer.cpp @@ -0,0 +1,530 @@ +// InputBuffer.cpp : Implementation of cInputBuffer +#include "stdafx.h" +#include "Inject.h" +#include "InputBuffer.h" + +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// cInputBuffer + +struct cCharNames +{ + LPCTSTR szName; + WORD m_nVKey; +}; + +static cCharNames _charnames[] = { + { _T( "BACKSPACE" ), VK_BACK }, + { _T( "BS" ), VK_BACK }, + { _T( "BKSP" ), VK_BACK }, + { _T( "CAPSLOCK" ), VK_CAPITAL }, + { _T( "DELETE" ), VK_DELETE }, + { _T( "DEL" ), VK_DELETE }, + { _T( "DOWN" ), VK_DOWN }, + { _T( "END" ), VK_END }, + { _T( "ENTER" ), VK_RETURN }, + { _T( "ESC" ), VK_ESCAPE }, + { _T( "HELP" ), VK_HELP }, + { _T( "HOME" ), VK_HOME }, + { _T( "INS" ), VK_INSERT }, + { _T( "INSERT" ), VK_INSERT }, + { _T( "LEFT" ), VK_LEFT }, + { _T( "NUMLOCK" ), VK_NUMLOCK }, + { _T( "PGDN" ), VK_NEXT }, + { _T( "PGUP" ), VK_PRIOR }, + { _T( "PRTSC" ), VK_SNAPSHOT }, + { _T( "RIGHT" ), VK_RIGHT }, + { _T( "SCROLLLOCK" ), VK_SCROLL }, + { _T( "TAB" ), VK_TAB }, + { _T( "UP" ), VK_UP }, + { _T( "F1" ), VK_F1 }, + { _T( "F2" ), VK_F2 }, + { _T( "F3" ), VK_F3 }, + { _T( "F4" ), VK_F4 }, + { _T( "F5" ), VK_F5 }, + { _T( "F6" ), VK_F6 }, + { _T( "F7" ), VK_F7 }, + { _T( "F8" ), VK_F8 }, + { _T( "F9" ), VK_F9 }, + { _T( "F10" ), VK_F10 }, + { _T( "F11" ), VK_F11 }, + { _T( "F12" ), VK_F12 }, + { _T( "F13" ), VK_F13 }, + { _T( "F14" ), VK_F14 }, + { _T( "F15" ), VK_F15 }, + { _T( "F16" ), VK_F16 }, + { _T( "+" ), VK_ADD } }, + *_end_charnames = _charnames + ( sizeof(_charnames ) / sizeof( cCharNames ) ); + +#define MASK_SHIFT 0x0100 +#define MASK_CTRL 0x0200 +#define MASK_ALT 0x0400 + +#define SHIFT_MASK 0x0700 +#define VKEY_MASK 0x00FF + +void pushVirtualKey( WORD vk, cInputVec &vec, bool bDown ) +{ + INPUT i; + ::memset( &i, 0, sizeof( INPUT ) ); + i.type = INPUT_KEYBOARD; + i.ki.wVk = vk; + i.ki.wScan = MapVirtualKey( vk, 0 ); + i.ki.dwFlags = ( bDown ) ? 0 : KEYEVENTF_KEYUP; + + vec.push_back( i ); +} + +void processKeyboardChars( BSTR strChars, cInputVec &vec ) +{ + USES_CONVERSION; + + typedef std::stack< WORD > cMaskStack; + cMaskStack mask; + + WORD wCurrentMask = 0; + + std::string strParse = OLE2T( strChars ); + + for( std::string::iterator i = strParse.begin(); i != strParse.end(); ) + { + switch( *i ) + { + case _T( '+' ): + _ASSERTE( ( i + 2 ) < strParse.end() ); + _ASSERTE( *( i + 1 ) == _T( '(' ) ); + _ASSERTE( !( wCurrentMask & MASK_SHIFT ) ); + + wCurrentMask |= MASK_SHIFT; + mask.push( MASK_SHIFT ); + + // Send the keydown + pushVirtualKey( VK_SHIFT, vec, true ); + + i += 2; + break; + + case _T( '^' ): + _ASSERTE( ( i + 2 ) < strParse.end() ); + _ASSERTE( *( i + 1 ) == _T( '(' ) ); + _ASSERTE( !( wCurrentMask & MASK_CTRL ) ); + + wCurrentMask |= MASK_CTRL; + mask.push( MASK_CTRL ); + + // Send the keydown + pushVirtualKey( VK_CONTROL, vec, true ); + + i += 2; + break; + + case _T( '%' ): + _ASSERTE( ( i + 2 ) < strParse.end() ); + _ASSERTE( *( i + 1 ) == _T( '(' ) ); + _ASSERTE( !( wCurrentMask & MASK_ALT ) ); + + wCurrentMask |= MASK_ALT; + mask.push( MASK_ALT ); + + // Send the keydown + pushVirtualKey( VK_MENU, vec, true ); + + i += 2; + break; + + case _T( ')' ): + _ASSERTE( mask.size() > 0 ); + + { + DWORD wMask = mask.top(); + mask.pop(); + + switch( wMask ) + { + case MASK_SHIFT: + pushVirtualKey( VK_SHIFT, vec, false ); + break; + + case MASK_CTRL: + pushVirtualKey( VK_CONTROL, vec, false ); + break; + + case MASK_ALT: + pushVirtualKey( VK_MENU, vec, false ); + break; + + default: + // Bad value in the stack + _ASSERTE( FALSE ); + break; + } + + wCurrentMask &= ~wMask; + } + + ++ i; + break; + + case _T( '{' ): + // This is a special key + ++ i; + { + for( std::string::iterator j = i; *j != _T( '}' ); ++ j ) + { + _ASSERTE( j != strParse.end() ); + } + + std::string strSpecial( i, j ); + for( cCharNames *i_name = _charnames; i_name != _end_charnames; ++ i_name ) + { + if( strSpecial.compare( i_name->szName ) == 0 ) + { + // We found the match, push and release the vkey + pushVirtualKey( i_name->m_nVKey, vec, true ); + pushVirtualKey( i_name->m_nVKey, vec, false ); + break; + } + } + + // The special key was not found in the list + _ASSERTE( i_name != _end_charnames ); + + i = j + 1; + } + break; + + default: + // Assume everything else is a text character but may require additional + // shifting + { + WORD wVkScan = VkKeyScan( *i ), + wAdditionalShift = ( wVkScan & SHIFT_MASK ) & ~wCurrentMask, + wVKey = wVkScan & VKEY_MASK; + + if( wAdditionalShift & MASK_SHIFT ) + pushVirtualKey( VK_SHIFT, vec, true ); + if( wAdditionalShift & MASK_CTRL ) + pushVirtualKey( VK_CONTROL, vec, true ); + if( wAdditionalShift & MASK_ALT ) + pushVirtualKey( VK_MENU, vec, true ); + + pushVirtualKey( wVKey, vec, true ); + pushVirtualKey( wVKey, vec, false ); + + if( wAdditionalShift & MASK_ALT ) + pushVirtualKey( VK_MENU, vec, false ); + if( wAdditionalShift & MASK_CTRL ) + pushVirtualKey( VK_CONTROL, vec, false ); + if( wAdditionalShift & MASK_SHIFT ) + pushVirtualKey( VK_SHIFT, vec, false ); + } + + ++ i; + break; + } + } + + // Make sure we released all shifts + _ASSERTE( wCurrentMask == 0 ); +} + +void pushMouseEvent( DWORD dwFlags, cInputVec &vec ) +{ + INPUT i; + ::memset( &i, 0, sizeof( INPUT ) ); + i.type = INPUT_MOUSE; + i.mi.dwFlags = dwFlags; + + vec.push_back( i ); +} + +void processMouseInput( eMouseInput eType, cInputVec &vec ) +{ + DWORD dwError = ::GetLastError(); + + switch( eType ) + { + case eMouseLeftDoubleClick: + pushMouseEvent( MOUSEEVENTF_LEFTDOWN, vec ); + pushMouseEvent( MOUSEEVENTF_LEFTUP, vec ); + case eMouseLeftClick: + pushMouseEvent( MOUSEEVENTF_LEFTDOWN, vec ); + pushMouseEvent( MOUSEEVENTF_LEFTUP, vec ); + break; + + case eMouseRightDoubleClick: + pushMouseEvent( MOUSEEVENTF_RIGHTDOWN, vec ); + pushMouseEvent( MOUSEEVENTF_RIGHTUP, vec ); + case eMouseRightClick: + pushMouseEvent( MOUSEEVENTF_RIGHTDOWN, vec ); + pushMouseEvent( MOUSEEVENTF_RIGHTUP, vec ); + break; + + default: + _ASSERTE( FALSE ); + break; + } +} + +HANDLE cInputBuffer::m_hThread = NULL; +HANDLE cInputBuffer::m_hInputWaiting = NULL; +HANDLE cInputBuffer::m_hTerm = NULL; + +CRITICAL_SECTION cInputBuffer::m_csQueue; +cInputBuffer::cInputQueue cInputBuffer::m_queue; + +DWORD WINAPI inputThreadProc( LPVOID pvParam ); + +void cInputBuffer::init() +{ + ::InitializeCriticalSection( &m_csQueue ); + m_hTerm = ::CreateEvent( NULL, TRUE, FALSE, NULL ); + m_hInputWaiting = ::CreateEvent( NULL, TRUE, FALSE, NULL ); + + DWORD dwThreadID; + m_hThread = ::CreateThread( NULL, 0, inputThreadProc, NULL, 0, &dwThreadID ); +} + +void cInputBuffer::term() +{ + // Clear out the queue + ::EnterCriticalSection( &m_csQueue ); + while( m_queue.size() > 0 ) + m_queue.pop_front(); + ::SetEvent( m_hTerm ); + ::LeaveCriticalSection( &m_csQueue ); + + ::WaitForSingleObject( m_hThread, INFINITE ); + + ::CloseHandle( m_hThread ); + ::CloseHandle( m_hInputWaiting ); + ::CloseHandle( m_hTerm ); + ::DeleteCriticalSection( &m_csQueue ); +} + +void cInputBuffer::postBuffer() +{ + ::EnterCriticalSection( &m_csQueue ); + if( m_queue.empty() ) + ::SetEvent( m_hInputWaiting ); + + // Marshal our interface into a drop in in the queue + IStream *pStream; + ::CoMarshalInterThreadInterfaceInStream( IID_IInputNotify, static_cast< IInputNotify * >( this ), &pStream ); + m_queue.push_back( cInputQueue::value_type( this, pStream ) ); + + m_status = eInputWaiting; + + ::LeaveCriticalSection( &m_csQueue ); +} + +cInputVec *cInputBuffer::getLastInput() +{ + if( m_actions.size() == 0 || m_actions.back().first != eActionInput ) + // Add in a new buffer + m_actions.push_back( cActionList::value_type( eActionInput, VSBridge::auto_ptr< cAction >( new cInput ) ) ); + + // Return the last buffer + return &( static_cast< cInput * >( m_actions.back().second.get() )->m_input ); +} + +DWORD WINAPI inputThreadProc( LPVOID pvParam ) +{ + // This thread must join the mult-threaded apartment becasue it does + // not create a message loop + ::CoInitializeEx( NULL, COINIT_MULTITHREADED ); + + BYTE prevKeyboard[ 256 ], + blankKeyboard[ 256 ]; + + ::memset( blankKeyboard, 0, sizeof( blankKeyboard ) ); + + HANDLE hEvent[2] = { cInputBuffer::m_hInputWaiting, cInputBuffer::m_hTerm }; + + while( ::WaitForMultipleObjects( 2, hEvent, FALSE, INFINITE ) == WAIT_OBJECT_0 ) + { + // Extract the next item from the stream + ::EnterCriticalSection( &cInputBuffer::m_csQueue ); + + cInputBuffer *pBuffer = cInputBuffer::m_queue.front().first; + CComPtr< IInputNotify > pNotify; + ::CoGetInterfaceAndReleaseStream( cInputBuffer::m_queue.front().second, IID_IInputNotify, reinterpret_cast< void ** >( &pNotify ) ); + + cInputBuffer::m_queue.pop_front(); + + if( cInputBuffer::m_queue.empty() ) + ::ResetEvent( cInputBuffer::m_hInputWaiting ); + + ::LeaveCriticalSection( &cInputBuffer::m_csQueue ); + + // Save the keyboard state and take control of the input queue + ::BlockInput( TRUE ); + ::GetKeyboardState( prevKeyboard ); + ::SetKeyboardState( blankKeyboard ); + + // Looking good, process the messages + pNotify->NotifyBegin(); + + // The delay list contains the breaks in the input, so we use the delay list as a master + // and use segments of the input queue + for( cInputBuffer::cActionList::iterator i = pBuffer->m_actions.begin(); i != pBuffer->m_actions.end(); ++ i ) + i->second->execute( pNotify ); + + // Restore keyboard state + ::SetKeyboardState( prevKeyboard ); + pNotify->NotifyEnd(); + + ::BlockInput( FALSE ); + } + + ::CoUninitialize(); + return 0; +} + +// The action execution functions +void cInputBuffer::cInput::execute( IInputNotify * ) +{ + UINT nSent = SendInput( m_input.size(), &(*(m_input.begin())), sizeof( INPUT ) ); + DWORD dwError = GetLastError(); + _ASSERTE( nSent == m_input.size() ); +} + +void cInputBuffer::cDelay::execute( IInputNotify *pNotify ) +{ + if( m_bAllowInput ) + { + BlockInput( FALSE ); + pNotify->NotifyPause(); + } + + ::Sleep( m_nMillis ); + + if( m_bAllowInput ) + { + BlockInput( TRUE ); + pNotify->NotifyBegin(); + } +} + +void cInputBuffer::cMouseMove::execute( IInputNotify *pib ) +{ + pib->SetMousePos( m_ptClient.x, m_ptClient.y ); +} + +STDMETHODIMP cInputBuffer::Clear() +{ + if( m_status != eInputIdle ) + { + _ASSERTE( FALSE ); + return E_FAIL; + } + + m_actions.clear(); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::TypeText(BSTR strText) +{ + if( m_status != eInputIdle ) + { + _ASSERTE( FALSE ); + return E_FAIL; + } + + processKeyboardChars( strText, *getLastInput() ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Delay(long nMilliseconds, VARIANT_BOOL bAllowInput ) +{ + if( m_status != eInputIdle ) + { + _ASSERTE( FALSE ); + return E_FAIL; + } + + cDelay *pDelay = new cDelay; + pDelay->m_bAllowInput = !!bAllowInput; + pDelay->m_nMillis = nMilliseconds; + + m_actions.push_back( cActionList::value_type( eActionDelay, VSBridge::auto_ptr< cAction >( pDelay ) ) ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::MouseClick(long nX, long nY, eMouseInput eAction) +{ + if( m_status != eInputIdle ) + { + _ASSERTE( FALSE ); + return E_FAIL; + } + + // First insert a mouse movement + cMouseMove *pMM = new cMouseMove; + pMM->m_ptClient.x = nX; + pMM->m_ptClient.y = nY; + + m_actions.push_back( cActionList::value_type( eActionMouseMove, VSBridge::auto_ptr< cAction >( pMM ) ) ); + processMouseInput( eAction, *getLastInput() ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::get_Status(eInputStatus *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_status; + + return S_OK; +} + +STDMETHODIMP cInputBuffer::Run() +{ + postBuffer(); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::NotifyBegin() +{ + m_status = eInputRunning; + + Fire_Begin(); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::NotifyEnd() +{ + m_status = eInputIdle; + + Fire_End(); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::SetMousePos(long nX, long nY) +{ + // Convert to screen coords + POINT pt = { nX, nY }; + ::ClientToScreen( cManager::_p->m_hMain, &pt ); + ::SetCursorPos( pt.x, pt.y ); + + // Force the mouse message on the into the window proc + // This updates AC to be the new message location + cManager::_p->m_pfnOld( cManager::_p->m_hMain, WM_MOUSEMOVE, 0, MAKELONG( nX, nY ) ); + + return S_OK; +} + +STDMETHODIMP cInputBuffer::NotifyPause() +{ + Fire_Pause(); + + return S_OK; +} diff --git a/Native/Inject/InputBuffer.h b/Native/Inject/InputBuffer.h new file mode 100644 index 0000000..70cd1d3 --- /dev/null +++ b/Native/Inject/InputBuffer.h @@ -0,0 +1,123 @@ +// InputBuffer.h : Declaration of the cInputBuffer + +#ifndef __INPUTBUFFER_H_ +#define __INPUTBUFFER_H_ + +#include "resource.h" // main symbols +#include "InjectCP.h" + +typedef std::vector< INPUT > cInputVec; + +///////////////////////////////////////////////////////////////////////////// +// cInputBuffer +class ATL_NO_VTABLE cInputBuffer : + public CComObjectRootEx, + public IDispatchImpl, + public IDispatchImpl, + public IProvideClassInfo2Impl< &CLSID_InputBuffer, &DIID_IInputEvents, &LIBID_DecalPlugins >, + public CProxyIInputEvents< cInputBuffer >, + public IConnectionPointContainerImpl +{ +public: + cInputBuffer() + : m_status( eInputIdle ) + { + } + +BEGIN_COM_MAP(cInputBuffer) + COM_INTERFACE_ENTRY(IInputNotify) + COM_INTERFACE_ENTRY(IInputBuffer) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY2(IDispatch, IInputBuffer) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cInputBuffer) + CONNECTION_POINT_ENTRY(DIID_IInputEvents) +END_CONNECTION_POINT_MAP() + + // Global functions to set up the input processing + // thread + static HANDLE m_hThread; + static HANDLE m_hTerm; + static HANDLE m_hInputWaiting; + + static CRITICAL_SECTION m_csQueue; + + typedef std::deque< std::pair< cInputBuffer *, LPSTREAM > > cInputQueue; + static cInputQueue m_queue; + + static void init(); + static void term(); + + void postBuffer(); + + cInputVec *getLastInput(); + + // Quick and dirty class hierarchy for input operations + + class cAction + { + public: + // Run the action + virtual void execute( IInputNotify *pib ) = 0; + }; + + enum eActionType + { + eActionInput, + eActionDelay, + eActionMouseMove + }; + + class cInput + : public cAction + { + public: + cInputVec m_input; + + virtual void execute( IInputNotify *pib ); + }; + + class cDelay + : public cAction + { + public: + long m_nMillis; + bool m_bAllowInput; + + virtual void execute( IInputNotify *pib ); + }; + + class cMouseMove + : public cAction + { + public: + POINT m_ptClient; + + virtual void execute( IInputNotify *pib ); + }; + + typedef std::list< std::pair< eActionType, VSBridge::auto_ptr< cAction > > > cActionList; + cActionList m_actions; + + eInputStatus m_status; + +public: + // IInputBuffer Methods + STDMETHOD(Run)(); + STDMETHOD(get_Status)(/*[out, retval]*/ eInputStatus *pVal); + STDMETHOD(MouseClick)(long nX, long nY, eMouseInput eAction); + STDMETHOD(Delay)(long nMilliseconds, VARIANT_BOOL bAllowInput); + STDMETHOD(TypeText)(BSTR strText); + STDMETHOD(Clear)(); + + // IInputNotify Methods + STDMETHOD(NotifyBegin)(); + STDMETHOD(NotifyEnd)(); + STDMETHOD(SetMousePos)(long nX, long nY); + STDMETHOD(NotifyPause)(); +}; + +#endif //__INPUTBUFFER_H_ diff --git a/Native/Inject/InputBuffer.rgs b/Native/Inject/InputBuffer.rgs new file mode 100644 index 0000000..c1d3e9a --- /dev/null +++ b/Native/Inject/InputBuffer.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Inject.InputBuffer.1 = s 'InputBuffer Class' + { + CLSID = s '{2F91FC21-4D89-4B64-94AE-A124D54563AE}' + } + Inject.InputBuffer = s 'InputBuffer Class' + { + CLSID = s '{2F91FC21-4D89-4B64-94AE-A124D54563AE}' + CurVer = s 'Inject.InputBuffer.1' + } + NoRemove CLSID + { + ForceRemove {2F91FC21-4D89-4B64-94AE-A124D54563AE} = s 'InputBuffer Class' + { + ProgID = s 'Inject.InputBuffer.1' + VersionIndependentProgID = s 'Inject.InputBuffer' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/Inject/LayerSite.cpp b/Native/Inject/LayerSite.cpp new file mode 100644 index 0000000..745093c --- /dev/null +++ b/Native/Inject/LayerSite.cpp @@ -0,0 +1,992 @@ +// BarSite.cpp : Implementation of cBarSite +#include "stdafx.h" +#include "Inject.h" +#include "LayerSite.h" + +#include "Manager.h" + +#include "Button.h" +#include "Pager.h" + +///////////////////////////////////////////////////////////////////////////// +// cBarSite + +enum eSinkCaps +{ + eSinkCapRender = 0x01, + eSinkCapMouse = 0x02, + eSinkCapKeyboard = 0x04, + eSinkCapPopup = 0x08, + eSinkCapTimer = 0x10 +}; + +cLayerSite::cLayerSite() +: m_pParent( NULL ), +m_dwSinkCaps( 0 ), +m_Alpha( 255 ) +{ +} + +cLayerSite::~cLayerSite() +{ + // Make sure we're really destroyed + _ASSERTE( m_pParent == NULL ); + _ASSERTE( m_children.size() == 0 ); +} + +void cLayerSite::removeChild( cLayerSite *pChild ) +{ + for( cChildList::iterator i = m_children.begin(); i != m_children.end(); ++ i ) + { + if( *i == pChild ) + { + m_children.erase( i ); + break; + } + } +} + +struct cSinkCapTest +{ + eSinkCaps m_mask; + const IID *m_iid; +}; + +void cLayerSite::create( LayerParams *pParams, cLayerSite *pParent, ILayer *pSink ) +{ + // First copy all the relevant data + m_params = *pParams; + m_pParent = pParent; + + static cSinkCapTest _capstest[] = { + { eSinkCapRender, &IID_ILayerRender }, + { eSinkCapMouse, &IID_ILayerMouse }, + { eSinkCapKeyboard, &IID_ILayerKeyboard }, + { eSinkCapPopup, &IID_ILayerPopup }, + { eSinkCapTimer, &IID_ILayerTimer }, + }; + + static cSinkCapTest *_end_caps = _capstest + ( sizeof( _capstest ) / sizeof( cSinkCapTest ) ); + + m_pSink = pSink; + + // Probe for relevant interfaces + for( cSinkCapTest *i = _capstest; i != _end_caps; ++ i ) + { + CComPtr< IUnknown > pUnk; + if( SUCCEEDED( pSink->QueryInterface( *( i->m_iid ), reinterpret_cast< void ** >( &pUnk ) ) ) ) + m_dwSinkCaps |= i->m_mask; + } + + // Do initialization activities + if( !( m_params.render & eRenderClipped ) ) + { + // Create the back buffer + SIZE sz = { m_params.pos.right - m_params.pos.left, m_params.pos.bottom - m_params.pos.top }; + if( sz.cx > 0 && sz.cy > 0 ) + cManager::_p->CreateCanvas( &sz, &m_pBuffer ); + } + + // Add in the default render flags + // All layer begin their life transparent until set otherwise + m_params.render |= eRenderTransparent; + + // Make this control format itself next round + Reformat(); + Invalidate(); + + m_pSink->LayerCreate( this ); +} + +void cLayerSite::destroy() +{ + // First destroy all of our children + while( !m_children.empty() ) + { +#ifdef _DEBUG + int nChildren = m_children.size(); + m_children.front()->destroy(); + _ASSERTE( m_children.size() == ( nChildren - 1 ) ); +#else + m_children.front()->destroy(); +#endif + } + + // Remove from parent + if( m_pParent != NULL ) + { + m_pParent->removeChild( this ); + m_pParent = NULL; + } + + // The child now releases the reference - this should trick our reference count to 0 + m_pSink->LayerDestroy(); + + // After LayerDestroy returns this object has already been deleted - + // do not touch any data members and we're OK + + // Reset capture pointers + if( cManager::_p->m_pMouseDown == this ) + cManager::_p->m_pMouseDown = NULL; + + if( cManager::_p->m_pMouseOver == this ) + cManager::_p->m_pMouseOver = NULL; + + if( cManager::_p->m_pKeyboard == this ) + cManager::_p->m_pKeyboard = NULL; + + for( cManager::cLayerList::iterator i = cManager::_p->m_popups.begin(); i != cManager::_p->m_popups.end(); ++ i ) + { + if( *i == this ) + { + cManager::_p->m_popups.erase( i ); + break; + } + } +} + +void cLayerSite::format() +{ + // ::MessageBox( NULL, _T( "cLayerSite::format" ), _T( "Inject.dll" ), MB_OK ); + + // This is no longer recursive - in all cases, parents position their children + formatLayer(); +} + +void cLayerSite::formatLayer() +{ + // Check for timers + if( m_timers.size() > 0 ) + { + long nCurrentTime = ::timeGetTime(); + for( cTimerList::iterator i = m_timers.begin(); i != m_timers.end(); ) + { + if( ( i->m_nLastTimeout + i->m_nInterval ) <= nCurrentTime ) + { + // Default to false, prevent the assert from going off *lots* + VARIANT_BOOL bContinue = VARIANT_FALSE; + + ++ i->m_nRepetitions; + + if( m_dwSinkCaps & eSinkCapTimer ) + { + CComPtr< ILayerTimer > pTimer; + m_pSink->QueryInterface( &pTimer ); + + pTimer->TimerTimeout( i->m_nID, nCurrentTime - i->m_nLastTimeout, i->m_nRepetitions, &bContinue ); + } + + if( bContinue ) + i->m_nLastTimeout = nCurrentTime; + else + { + // Do not continue timing + i = m_timers.erase( i ); + continue; + } + } + + ++ i; + } + } + + // When reformatting - never reformat a surface that's 0,0 size + if( ( m_params.render & eRenderReformatNext ) && + m_params.pos.right > m_params.pos.left && + m_params.pos.bottom > m_params.pos.top ) + { + // Do a reformat - NOTE: it's done here becasue a reformat will almost + // always destroy the surface + + if( m_dwSinkCaps & eSinkCapRender ) + { + CComPtr< ILayerRender > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->Reformat(); + } + + // Clear the reformat flag + m_params.render &= ~eRenderReformatNext; + } + + // Iterate over the children + for( cChildList::iterator i = m_children.begin(); i != m_children.end(); ++ i ) + ( *i )->formatLayer(); +} + +void cLayerSite::prerender() +{ + if( m_dwSinkCaps & eSinkCapRender ) + { + CComPtr< ILayerRender > pRender; + m_pSink->QueryInterface( &pRender ); + + pRender->PreRender(); + } + + // Iterate over the children + for( cChildList::iterator i = m_children.begin(); i != m_children.end(); ++ i ) + ( *i )->prerender(); +} + +void cLayerSite::render(ICanvas *pPrimary) +{ + if( !( m_params.render & eRenderClipped ) ) + { + // Check for 0,0 size + if( m_params.pos.right > m_params.pos.left && m_params.pos.bottom > m_params.pos.top ) + { + // ::MessageBox( NULL, _T( "cLayerSite::render" ), _T( "Inject.dll" ), MB_OK ); + _ASSERTE( m_pBuffer.p != NULL ); + + VARIANT_BOOL bRedraw; + m_pBuffer->get_WasLost( &bRedraw ); + + // Here we push a scratch clip rect for the entire area + // This is intended for unclipped layers that modfiy their + // child clipping area. + RECT rcAll = { 0, 0, m_params.pos.right - m_params.pos.left, m_params.pos.bottom - m_params.pos.top }; + VARIANT_BOOL bDrawChildren; + m_pBuffer->PushClipRect( &rcAll, &bDrawChildren ); + + // Assuming this area is non-0 size + _ASSERTE( bDrawChildren ); + + renderBuffer( m_pBuffer, !!bRedraw ); + + m_pBuffer->PopClipRect(); + + // Place it on the screen + POINT pt = { m_params.pos.left, m_params.pos.top }; + RECT rc = { 0, 0, m_params.pos.right - m_params.pos.left, m_params.pos.bottom - m_params.pos.top }; + + pPrimary->put_Alpha(m_Alpha); + pPrimary->Blt( &rc, m_pBuffer, &pt ); + } + else + // This object has no size, it should have no canvas + _ASSERTE( m_pBuffer.p == NULL ); + } + + // Iterate through children - look for more non-clipped layers to render + for( cChildList::iterator i = m_children.begin(); i != m_children.end(); ++ i ) + ( *i )->render( pPrimary ); +} + +void cLayerSite::renderBuffer( ICanvas *pBuffer, bool bForce ) +{ + // Remove the next flag + VARIANT_BOOL bRenderChildren = VARIANT_TRUE; + bool bRendered = bForce; + + if( m_dwSinkCaps & eSinkCapRender ) + { + CComPtr< ILayerRender > pLayer; + m_pSink->QueryInterface( &pLayer ); + + if( bForce || ( m_params.render & eRenderNext ) ) + { + if( !( m_params.render & eRenderClipped ) ) + { + RECT rcClient = { 0, 0, m_params.pos.right - m_params.pos.left, m_params.pos.bottom - m_params.pos.top }; + // Unclipped layers all get an inital transparent fill + m_pBuffer->Fill( &rcClient, RGB( 0, 255, 255 ) ); + } + + bRendered = true; + pLayer->Render( pBuffer ); + } + + pLayer->AdjustRenderArea( pBuffer, &bRenderChildren ); + } + + m_params.render &= ~eRenderNext; + + if( !bRenderChildren ) + // While adjusting the render parameters, the rectangle got clipped out of existance + return; + + // Walk through the children and transform the surface params + for( cChildList::iterator i = m_children.begin(); i != m_children.end(); ++ i ) + { + if( !( ( *i )->m_params.render & eRenderClipped ) ) + // Only clipped children + continue; + + // Clip the child rectangle + VARIANT_BOOL bRenderChild; + pBuffer->PushClipRect( &( *i )->m_params.pos, &bRenderChild ); + + if( bRenderChild ) + // Iterate + ( *i )->renderBuffer( pBuffer, bRendered ); + + pBuffer->PopClipRect(); + } +} + +void cLayerSite::reformat() +{ + if( m_dwSinkCaps & eSinkCapRender ) + // Schedule a reformat for next render cycle + m_params.render |= eRenderReformatNext; + + // Propagate reformat to children + for( cChildList::iterator i = m_children.begin(); i != m_children.end(); ++ i ) + ( *i )->reformat(); +} + +cLayerSite *cLayerSite::hitTestUnclipped( POINTS pt, ICanvas *pCanvas ) +{ + // First test if any children have been hit and delegate to them + // as children have a higher z-order value + cLayerSite *pSite; + for( cChildList::reverse_iterator i = m_children.rbegin(); i != m_children.rend(); ++ i ) + { + pSite = ( *i )->hitTestUnclipped( pt, pCanvas ); + if( pSite != NULL ) + // Found a child hit - overlapping children are not tested + // as there is no sibling clipping + return pSite; + } + + // Children are not hit, check if we hit ourselves + if( !( m_params.render & eRenderClipped ) ) + { + POINT ptl = { pt.x, pt.y }; + VARIANT_BOOL bVisible; + pCanvas->PushClipRect( &m_params.pos, &bVisible ); + + cLayerSite *pHit = NULL; + + if( bVisible ) + { + VARIANT_BOOL bHit; + pCanvas->HitTest( &ptl, &bHit ); + if( bHit ) + { + // Check for transparent area hitting + if( ( m_dwSinkCaps & eSinkCapRender ) && ( m_params.render & eRenderTransparent ) ) + { + // This may contain transparent areas + // TODO: Check for transparent areas + pHit = this; + } + else + pHit = this; + } + } + + pCanvas->PopClipRect(); + + return pHit; + } + + // Nothing hit in this branch + return NULL; +} + +cLayerSite *cLayerSite::hitTestClipped( POINTS pt, LPPOINT pptHit, ICanvas *pCanvas ) +{ + // ::MessageBox( NULL, _T( "cLayerSite::hitTestClipped" ), _T( "Inject.dll" ), MB_OK ); + + // Convert the render params + VARIANT_BOOL bRenderChildren = VARIANT_TRUE; + if( m_dwSinkCaps & eSinkCapRender ) + { + CComPtr< ILayerRender > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->AdjustRenderArea( pCanvas, &bRenderChildren ); + } + + POINT ptm = { pt.x, pt.y }; + + if( bRenderChildren ) + { + for( cChildList::reverse_iterator i = m_children.rbegin(); i != m_children.rend(); ++ i ) + { + if( !( ( *i )->m_params.render & eRenderClipped ) ) + // Only clipped children + continue; + + // Clip the child rectangle + VARIANT_BOOL bVisible; + pCanvas->PushClipRect( &( *i )->m_params.pos, &bVisible ); + + if( bVisible ) + { + VARIANT_BOOL bHit; + pCanvas->HitTest( &ptm, &bHit ); + + if( bHit ) + { + cLayerSite *pRet = ( *i )->hitTestClipped( pt, pptHit, pCanvas ); + pCanvas->PopClipRect(); + + return pRet; + } + } + + pCanvas->PopClipRect(); + } + } + + *pptHit = ptm; + pCanvas->ToClient( pptHit ); + + return this; +} + +cLayerSite *cLayerSite::hitTest( POINTS pt, LPPOINT pptHit, ICanvas *pCanvas ) +{ + // First, find the unclipped parent + cLayerSite *pHitUnclipped = hitTestUnclipped( pt, pCanvas ); + + if( pHitUnclipped == NULL ) + // Absolutely nothing hit + return NULL; + + VARIANT_BOOL bVisible; + pCanvas->PushClipRect( &pHitUnclipped->m_params.pos, &bVisible ); + + cLayerSite *pHitClipped = pHitUnclipped->hitTestClipped( pt, pptHit, pCanvas ); + pCanvas->PopClipRect(); + + return pHitClipped; +} + +void cLayerSite::clipCanvas(ICanvas *pCanvas) +{ + if( m_params.render & eRenderClipped ) + m_pParent->clipCanvas( pCanvas ); + + VARIANT_BOOL bVisible; + pCanvas->PushClipRect( &m_params.pos, &bVisible ); + + if( m_dwSinkCaps & eSinkCapRender ) + { + CComPtr< ILayerRender > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->AdjustRenderArea( pCanvas, &bVisible ); + } +} + +bool cLayerSite::isClippedChild( cLayerSite *pChild ) +{ + for( cLayerSite *pChildLayer = pChild; pChild != NULL; pChild = pChild->m_pParent ) + { + if( pChildLayer == this ) + return true; + + if( !( pChildLayer->m_params.render & eRenderClipped ) ) + break; + } + + return false; +} + +bool cLayerSite::isChild( cLayerSite *pChild ) +{ + for( cLayerSite *pChildLayer = pChild; pChildLayer != NULL; pChildLayer = pChildLayer->m_pParent ) + { + if( pChildLayer == this ) + return true; + } + + return false; +} + +cLayerSite *cLayerSite::getCommonClippedParent( cLayerSite *pHit ) +{ + for( cLayerSite *pCurrentParent = this; pCurrentParent != NULL; pCurrentParent = pCurrentParent->m_pParent ) + { + for( cLayerSite *pHitParent = pHit; pHitParent != NULL; pHitParent = pHitParent->m_pParent ) + { + if( pHitParent == pCurrentParent ) + return pHitParent; + + if( !( pCurrentParent->m_params.render & eRenderClipped ) ) + break; + } + + if( !( pCurrentParent->m_params.render & eRenderClipped ) ) + break; + } + + return NULL; +} + +void cLayerSite::sendMouseEnter( cLayerSite *pCommonParent, MouseState *pMS ) +{ + if( pCommonParent != this && ( m_params.render & eRenderClipped ) ) + // Enter our parent first - note that we stop at the unclipped parent + m_pParent->sendMouseEnter( pCommonParent, pMS ); + + if( m_dwSinkCaps & eSinkCapMouse ) + { + CComPtr< ILayerMouse > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->MouseEnter( pMS ); + } +} + +void cLayerSite::sendMouseExit( cLayerSite *pCommonParent, MouseState *pMS ) +{ + for( cLayerSite *pExit = this; pExit != pCommonParent; pExit = pExit->m_pParent ) + { + if( !( pExit->m_params.render & eRenderClipped ) ) + // Common parent may be set to NULL if we're switching + // to another unclipped parent + break; + + if( pExit->m_dwSinkCaps & eSinkCapMouse ) + { + CComPtr< ILayerMouse > pLayer; + pExit->m_pSink->QueryInterface( &pLayer ); + + pLayer->MouseExit( pMS ); + } + } +} + +void cLayerSite::sendMouseDown( MouseState *pMS ) +{ + if( m_dwSinkCaps & eSinkCapMouse ) + { + CComPtr< ILayerMouse > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->MouseDown( pMS ); + } +} + +void cLayerSite::sendMouseUp( MouseState *pMS ) +{ + if( m_dwSinkCaps & eSinkCapMouse ) + { + CComPtr< ILayerMouse > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->MouseUp( pMS ); + } +} + +void cLayerSite::sendMouseMove( MouseState *pMS ) +{ + if( m_dwSinkCaps & eSinkCapMouse ) + { + CComPtr< ILayerMouse > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->MouseMove( pMS ); + } +} + +void cLayerSite::sendMouseDblClk( MouseState *pMS ) +{ + if( m_dwSinkCaps & eSinkCapMouse ) + { + CComPtr< ILayerMouse > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->MouseDblClk( pMS ); + } +} + +void cLayerSite::sendMouseEvent( long nMsg, long wParam, long lParam ) +{ + if( m_dwSinkCaps & eSinkCapMouse ) + { + CComPtr< ILayerMouse > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->MouseEvent( nMsg, wParam, lParam ); + } +} + +void cLayerSite::sendKeyboardEndCapture( VARIANT_BOOL bCancel ) +{ + if( m_dwSinkCaps & eSinkCapKeyboard ) + { + CComPtr< ILayerKeyboard > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->KeyboardEndCapture( bCancel ); + } +} + +void cLayerSite::sendKeyboardChar( KeyState *pKS ) +{ + if( m_dwSinkCaps & eSinkCapKeyboard ) + { + CComPtr< ILayerKeyboard > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->KeyboardChar( pKS ); + } +} + +void cLayerSite::sendKeyboardEvent( long nMsg, long wParam, long lParam ) +{ + if( m_dwSinkCaps & eSinkCapKeyboard ) + { + CComPtr< ILayerKeyboard > pLayer; + m_pSink->QueryInterface( &pLayer ); + + pLayer->KeyboardEvent( nMsg, wParam, lParam ); + } +} + +bool cLayerSite::sendPopupCancel( MouseState *pMS ) +{ + if( m_dwSinkCaps & eSinkCapPopup ) + { + CComPtr< ILayerPopup > pLayer; + m_pSink->QueryInterface( &pLayer ); + + VARIANT_BOOL bContinue; + pLayer->PopupCancel( pMS, &bContinue ); + + return !!bContinue; + } + + // Default action is to cancel the popup + return false; +} + +STDMETHODIMP cLayerSite::Destroy() +{ + cManager::_p->m_destroy.push_back( this ); + AddRef(); + return S_OK; +} + +STDMETHODIMP cLayerSite::CreateChild(LayerParams *params, ILayer *pSink) +{ + CComObject< cLayerSite > *pChild; + CComObject< cLayerSite >::CreateInstance( &pChild ); + + pChild->create( params, this, pSink ); + m_children.push_back( pChild ); + + return S_OK; +} + +STDMETHODIMP cLayerSite::GetSink(REFIID iid, void **ppvItf) +{ + return m_pSink->QueryInterface( iid, ppvItf ); +} + +STDMETHODIMP cLayerSite::Invalidate() +{ + for( cLayerSite *pSite = this; pSite != NULL; pSite = pSite->m_pParent ) + { + if( !( pSite->m_params.render & eRenderTransparent ) || !( pSite->m_params.render & eRenderClipped ) || pSite->m_pParent == NULL ) + break; + } + + pSite->m_params.render |= eRenderNext; + + return S_OK; +} + +STDMETHODIMP cLayerSite::get_PluginSite(IPluginSite **ppSite) +{ + *ppSite = cManager::_p; + ( *ppSite )->AddRef(); + + return S_OK; +} + +STDMETHODIMP cLayerSite::Reformat() +{ + if( m_params.pos.right != m_params.pos.left && m_params.pos.top != m_params.pos.bottom && + m_dwSinkCaps & eSinkCapRender ) + m_params.render |= eRenderReformatNext; + + return S_OK; +} + +STDMETHODIMP cLayerSite::GetParentSink(REFIID iid, void **ppvItf) +{ + for( cLayerSite *pSite = m_pParent; pSite != NULL; pSite = pSite->m_pParent ) + { + HRESULT hRes = pSite->m_pSink->QueryInterface( iid, ppvItf ); + if( SUCCEEDED( hRes ) ) + // Found our requested interface, return happy + return hRes; + } + + return E_NOINTERFACE; +} + +STDMETHODIMP cLayerSite::get_Position(LPRECT pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_params.pos; + + return S_OK; +} + +STDMETHODIMP cLayerSite::put_Position(LPRECT newVal) +{ + _ASSERTE( newVal != NULL ); + _ASSERTE( newVal->right >= newVal->left && newVal->bottom >= newVal->top ); + + m_params.pos = *newVal; + + if( !( m_params.render & eRenderClipped ) ) + { + // This is unclipped, check the buffer size + bool bHasBuffer = ( m_params.pos.right > m_params.pos.left && m_params.pos.bottom > m_params.pos.top ); + if( bHasBuffer ) + { + SIZE sz = { m_params.pos.right - m_params.pos.left, m_params.pos.bottom - m_params.pos.top }; + if( m_pBuffer.p == NULL ) + cManager::_p->CreateCanvas( &sz, &m_pBuffer ); + else + m_pBuffer->put_Size( &sz ); + } + else + { + if( m_pBuffer.p != NULL ) + m_pBuffer.Release(); + } + } + + // Mark for format change only if area > 0 + Reformat(); + + return S_OK; +} + +STDMETHODIMP cLayerSite::get_ID(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_params.ID; + + return S_OK; +} + +STDMETHODIMP cLayerSite::get_ChildCount(long *pVal) +{ + _ASSERTE( pVal != NULL ); + *pVal = m_children.size(); + + return S_OK; +} + +STDMETHODIMP cLayerSite::get_Child(long nIndex, ePositionType posType, ILayerSite **pVal) +{ + _ASSERTE( pVal != NULL ); + + if( posType == ePositionByIndex ) + { + if( nIndex < 0 || nIndex >= m_children.size() ) + // Out of range + return E_INVALIDARG; + + *pVal = m_children[ nIndex ]; + ( *pVal )->AddRef(); + + return S_OK; + } + + if( posType != ePositionByID ) + // Invalid position type + return E_INVALIDARG; + + // Scan for child by ID + for( cChildList::iterator i = m_children.begin(); i != m_children.end(); ++ i ) + { + if( ( *i )->m_params.ID == nIndex ) + { + *pVal = *i; + ( *pVal )->AddRef(); + + return S_OK; + } + } + + // Invalid Index + return E_INVALIDARG; +} + +void cLayerSite::moveChildToFront(long nIndex) { + // TODO : Fix this, it doesn't properly move the Z order of the children if they are at the front + + if( m_children.back()->m_params.ID == nIndex ) + return; + + for (cChildList::iterator i = m_children.begin(); i != m_children.end(); ++i) { + if((*i)->m_params.ID == nIndex) { + cLayerSite *layerSite = *i; + m_children.erase(i); + m_children.push_back(layerSite); + + break; + } + } +} + +STDMETHODIMP cLayerSite::moveToFront() { + _ASSERTE(m_pParent); + + m_pParent->moveChildToFront(m_params.ID); + + return S_OK; +} + +STDMETHODIMP cLayerSite::CaptureKeyboard() +{ + // Cancel capture in the existing keyboard capture- if any + // Don't fire EndCapture if we already have the capture. cyn -- 15/10/2002 + if( ( cManager::_p->m_pKeyboard != NULL ) && ( cManager::_p->m_pKeyboard != this ) ) + cManager::_p->m_pKeyboard->sendKeyboardEndCapture( VARIANT_TRUE ); + + // Start capturing + cManager::_p->m_pKeyboard = this; + + return S_OK; +} + +STDMETHODIMP cLayerSite::IsChild(ILayerSite *pSite, VARIANT_BOOL bTestUnclipped, VARIANT_BOOL *pbIsChild) +{ + cLayerSite *pInternalSite = static_cast< cLayerSite * >( pSite ); + + *pbIsChild = ( ( bTestUnclipped ) ? isChild( pInternalSite ) : isClippedChild( pInternalSite ) ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cLayerSite::put_Popup(VARIANT_BOOL newVal) +{ + if( newVal ) + { +#ifdef _DEBUG + // Check for an existing popup record + for( cManager::cLayerList::iterator i = cManager::_p->m_popups.begin(); i != cManager::_p->m_popups.end(); ++ i ) + _ASSERTE( *i != this ); +#endif + + // Ok, add it into the list + cManager::_p->m_popups.push_back( this ); + } + else + { + for( cManager::cLayerList::iterator i = cManager::_p->m_popups.begin(); i != cManager::_p->m_popups.end(); ++ i ) + { + if( *i == this ) + { + cManager::_p->m_popups.erase( i ); + return S_OK; + } + } + + // This popup is not in the list + _ASSERTE( FALSE ); + } + + return S_OK; +} + +STDMETHODIMP cLayerSite::get_ScreenPosition(LPRECT pVal) +{ + CComPtr< ICanvas > pPrimary; + + cManager::_p->GetPrimarySurface( &pPrimary ); + + { + ClipParams cp; + pPrimary->GetClipParams( &cp ); + + // First push the identity RECT + RECT rcIdentity = { 0, 0, cp.window.right - cp.window.left, cp.window.bottom - cp.window.top }; + VARIANT_BOOL bVisible; + pPrimary->PushClipRect( &rcIdentity, &bVisible ); + + // Now set the origin + POINT pt = { cp.window.left, cp.window.top }; + pPrimary->OffsetOrg( &pt, &bVisible ); + } + + // ::MessageBox( NULL, _T( "cLayerSite::get_ScreenPosition" ), _T( "Inject.dll" ), MB_OK ); + + clipCanvas( pPrimary ); + + // Extract the bounds + ClipParams cp; + pPrimary->GetClipParams( &cp ); + + *pVal = cp.window; + + return S_OK; +} + +STDMETHODIMP cLayerSite::StartTimer(long nID, long nInterval) +{ +#ifdef _DEBUG + // Walk through the list of timers to make sure the ID isn't in use + for( cTimerList::iterator i = m_timers.begin(); i != m_timers.end(); ++ i ) + _ASSERTE( i->m_nID != nID ); +#endif + + // NOTE: An interval of 0 is valid in that it'll fire every frame, this would be an + // alternate method to creating an animated layer + _ASSERTE( nInterval >= 0 ); + + // The layer should implement ILayerTimer + _ASSERTE( m_dwSinkCaps & eSinkCapTimer ); + + // Add in the timer + cTimer t = { ::timeGetTime(), nID, nInterval, 0 }; + m_timers.push_back( t ); + + return S_OK; +} + +STDMETHODIMP cLayerSite::EndTimer(long nID) +{ + // Find the timer by ID + for( cTimerList::iterator i = m_timers.begin(); i != m_timers.end(); ++ i ) + { + if( i->m_nID == nID ) + { + m_timers.erase( i ); + return S_OK; + } + } + + return E_INVALIDARG; +} + +STDMETHODIMP cLayerSite::get_Transparent(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = ( m_params.render & eRenderTransparent ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cLayerSite::put_Transparent(VARIANT_BOOL newVal) +{ + if( newVal ) + m_params.render |= eRenderTransparent; + else + m_params.render &= ~eRenderTransparent; + + return S_OK; +} + +STDMETHODIMP cLayerSite::put_Alpha(long Alpha) +{ + m_Alpha = Alpha; + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/LayerSite.h b/Native/Inject/LayerSite.h new file mode 100644 index 0000000..174018f --- /dev/null +++ b/Native/Inject/LayerSite.h @@ -0,0 +1,126 @@ +// LayerSite.h : Declaration of the cLayerSite + +#ifndef __LAYERSITE_H +#define __LAYERSITE_H + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cBarSite +class ATL_NO_VTABLE cLayerSite : + public CComObjectRootEx, + public ILayerSite +{ +public: + typedef std::vector< cLayerSite * > cChildList; + cChildList m_children; + + cLayerSite *m_pParent; + + CComPtr< ICanvas > m_pBuffer; + + DWORD m_dwSinkCaps; + CComPtr< ILayer > m_pSink; + + LayerParams m_params; + + struct cTimer + { + long m_nLastTimeout, + m_nID, + m_nInterval, + m_nRepetitions; + }; + + long m_Alpha; + + typedef std::list< cTimer > cTimerList; + cTimerList m_timers; + + cLayerSite(); + ~cLayerSite(); + + // Child notification of destruction, remove the child + // from the list. + void removeChild( cLayerSite *pChild ); + + // Scan our callback for capabilities - also perform some internal + // initialization + void create( LayerParams *pParams, cLayerSite *pParent, ILayer *pSink ); + void destroy(); + + // Rendering operations + void format(); + void formatLayer(); + + void prerender(); + void render( ICanvas *pPrimary ); + void renderBuffer( ICanvas *pCanvas, bool bForceDraw ); + + // Force a reformat for all layers - this usually occurs only + // on a video-mode change + void reformat(); + + void moveChildToFront(long nIndex); + + // Mouse operations + cLayerSite *hitTestUnclipped( POINTS pt, ICanvas *pCanvas ); + cLayerSite *hitTestClipped( POINTS pt, LPPOINT pptHit, ICanvas *pCanvas ); + cLayerSite *hitTest( POINTS pt, LPPOINT pptHit, ICanvas *pCanvas ); + void clipCanvas( ICanvas *pCanvas ); + bool isClippedChild( cLayerSite *pChild ); + bool isChild( cLayerSite *pChild ); + cLayerSite *getCommonClippedParent( cLayerSite *pOther ); + + void sendMouseEnter( cLayerSite *pCommonParent, MouseState *pMS ); + void sendMouseExit( cLayerSite *pCommonParent, MouseState *pMS ); + void sendMouseMove( MouseState *pMS ); + void sendMouseDown( MouseState *pMS ); + void sendMouseUp( MouseState *pMS ); + void sendMouseDblClk( MouseState *pMS ); + void sendMouseEvent( long nMsg, long wParam, long lParam ); + + void sendKeyboardEndCapture( VARIANT_BOOL bCancel ); + void sendKeyboardChar( KeyState *pKS ); + void sendKeyboardEvent( long nMsg, long wParam, long lParam ); + + bool sendPopupCancel( MouseState *pMS ); + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cLayerSite) + COM_INTERFACE_ENTRY(ILayerSite) +END_COM_MAP() + +// ILayerSite +public: + STDMETHOD(CreateChild)(LayerParams *params, ILayer *pSink); + + STDMETHOD(get_Position)(/*[out, retval]*/ RECT *pVal); + STDMETHOD(put_Position)(/*[in]*/ RECT *newVal); + STDMETHOD(get_ScreenPosition)(/*[out, retval]*/ RECT *pVal); + + STDMETHOD(Reformat)(); + STDMETHOD(Destroy)(); + STDMETHOD(Invalidate)(); + STDMETHOD(get_Transparent)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Transparent)(/*[in]*/ VARIANT_BOOL newVal); + + STDMETHOD(get_PluginSite)(IPluginSite **ppSite); + STDMETHOD(GetSink)(REFIID iid, void **ppvItf); + STDMETHOD(GetParentSink)(REFIID iid, /*[iid_is(iid)]*/ void **ppvItf); + STDMETHOD(get_Child)(long nIndex, /*[defaultvalue(ePositionByIndex)]*/ ePositionType posType, /*[out, retval]*/ ILayerSite* *pVal); + STDMETHOD(get_ChildCount)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_ID)(/*[out, retval]*/ long *pVal); + STDMETHOD(IsChild)(ILayerSite *pSite, /*[optional, defaultvalue(VARIANT_FALSE)]*/ VARIANT_BOOL bTestUnclipped, /*[out, retval]*/ VARIANT_BOOL *pbIsChild); + STDMETHOD(moveToFront)(); + + STDMETHOD(CaptureKeyboard)(); + STDMETHOD(put_Popup)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(StartTimer)(long nID, long nInterval); + STDMETHOD(EndTimer)(long nID); + + STDMETHOD(put_Alpha)(long Alpha); +}; + +#endif //__LAYERSITE_H \ No newline at end of file diff --git a/Native/Inject/Manager.cpp b/Native/Inject/Manager.cpp new file mode 100644 index 0000000..d589671 --- /dev/null +++ b/Native/Inject/Manager.cpp @@ -0,0 +1,1632 @@ +// Manager.cpp : Implementation of cManager +#include "stdafx.h" +#include +#include "Inject.h" +#include "Manager.h" + +#include "InjectApi.h" + +#include "LayerSite.h" +#include "RootLayer.h" + +#include "Canvas.h" + +#include "IconCache.h" +#include "Image.h" +#include "FontCache.h" +#include "SolidImage.h" + +#include "InputBuffer.h" + +#include + + +const IID EVTID_AcHooks = { 0xEB282FE5, 0x7170, 0x4a37, { 0xA2, 0x6E, 0x92, 0xAF, 0x36, 0x38, 0x5D, 0x2C } }; +const IID LIBID_Decal = { 0xFF7F5F6D, 0x34E0, 0x4B6F, { 0xB3, 0xBB, 0x81, 0x41, 0xDE, 0x2E, 0xF7, 0x32 } }; +const IID IID_Plugins = { 0x702D3901, 0xC13A, 0x448e, { 0x88, 0x71, 0xEC, 0xDC, 0x8B, 0xC8, 0xD0, 0x79 } }; + +///////////////////////////////////////////////////////////////////////////// +// cManager + +extern HANDLE _hUpdateEnabled; +CComObject< cManager > *cManager::_p = NULL; + +static TCHAR szPathBuffer[ MAX_PATH ]; + +cManager::cManager() + : m_nNextPlugin( 1000 ), + m_pRootSite( NULL ), + m_pMouseOver( NULL ), + m_pMouseDown( NULL ), + m_pKeyboard( NULL ), + m_portal( ::InjectMapPath( eInjectPathDatFile, _T( "portal.dat" ), szPathBuffer ), 1024 ), + m_hMain( NULL ), + m_pfnOld( NULL ), + m_pD( NULL ), + m_p3D( NULL ), + m_p3DDevice( NULL ), + m_pPrimarySurface( NULL ), + m_lpSurface( NULL ), + m_bInitialized( false ), + m_lPrevSelKey( NULL ), + m_bContainer( false ), + m_bXMLViewViewer( false ), + m_hDecalDLL( NULL ), + m_eAlphaBlendMode( eAlphaBlendSoftware ), + m_bSoftware( false ) +{ + // Start the decal object + ::CoInitialize( NULL ); + HRESULT hRes = ::CoCreateInstance( __uuidof( Decal ), NULL, CLSCTX_INPROC_SERVER, __uuidof( IDecal ), + reinterpret_cast< void ** >( &m_pDecal ) ); + + // Load the Decal.dll lib to keep CoFreeAllLibraries from destroying it + m_hDecalDLL = ::LoadLibrary ( _T( "Decal.dll" ) ); + + if( SUCCEEDED( hRes ) ) + hRes = m_pDecal->StartServices( ); +} + +cManager::~cManager() +{ + if( m_pDecal.p ) + { + m_pDecal->StopServices( ); + m_pDecal.Release( ); + } + + _ASSERTE ( ::GetWindowLong ( m_hMain, GWL_WNDPROC ) == reinterpret_cast< LONG > ( wndProc ) ); + ::SetWindowLong( m_hMain, GWL_WNDPROC, reinterpret_cast< LONG >( m_pfnOld ) ); + m_pfnOld = NULL; + + FreeLibrary( m_hDecalDLL ); + + if( m_bContainer ) + ::CoUninitialize( ); + + _p = NULL; +} + +void cManager::setDirectDraw( IDirectDraw4 *pDD, IDirect3D3 *pD3D, IDirectDrawSurface4 *pDDS) +{ + if( pDD != NULL ) + m_pD = pDD; + + m_p3D = pD3D; + + m_p3DDevice = NULL; + + m_pPrimarySurface = pDDS; + + setWindow( NULL ); +} + +void cManager::setSurface( IDirect3DDevice3 *pDevice ) +{ + m_p3DDevice = pDevice; + + m_pDecal->InitGraphics ( m_pD, pDevice ); + + // Cascade the reformat + if( m_pRootSite != NULL ) + m_pRootSite->reformat(); +} + +struct cManagerSinkCapTest +{ + eManagerSinkCaps m_mask; + const IID *m_iid; +}; + +void (*pfnOldChatMessage)(char*, DWORD) = NULL; +void (*pfnOldChatText)(void) = NULL; + +void cManager::convertVersion( LPTSTR szVersion, DWORD &dwVersionMajor, DWORD &dwVersionMinor ) +{ + int wVersionParts[ 4 ], + *i_ver = wVersionParts; + + for( TCHAR *szVersionPart = ::_tcstok( szVersion, _T( "." ) ); szVersionPart != NULL; szVersionPart = ::_tcstok( NULL, _T( "." ) ), ++ i_ver ) + ::_stscanf( szVersionPart, _T( "%i" ), i_ver ); + + dwVersionMajor = MAKELONG( wVersionParts[ 1 ], wVersionParts[ 0 ] ); + dwVersionMinor = MAKELONG( wVersionParts[ 3 ], wVersionParts[ 2 ] ); + +} + +void cManager::init() +{ + USES_CONVERSION; + + // Obtain ACHooks Ref & start ACHooks events if we're not in Checksum's Container + if(!m_bContainer) + { + m_pDecal->get_Hooks( &m_pHooks ); + IACHooksEventsImpl::advise( m_pHooks ); + IACHooksEventsImpl::advise( m_pHooks ); + } + + // Prepare the root layer and bar manager before loading plugins + // We have to manually create the root site + CComObject< cLayerSite > *pRootSite; + CComObject< cLayerSite >::CreateInstance( &pRootSite ); + + m_pRootSite = pRootSite; + + // Create the paired root layer + CComObject< cRootLayer > *pRootLayer; + CComObject< cRootLayer >::CreateInstance( &pRootLayer ); + m_pRootLayer = pRootLayer; + + // To circular reference keeps it all intact + LayerParams lp = { 0, { 0, 0, 0, 0 }, eRenderClipped }; + m_pRootSite->create( &lp, NULL, pRootLayer ); + + m_bInitialized = true; + + // Set the blending Mode from the Registry + { + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) ); + + if(key.QueryDWORDValue(_T("AlphaBlendMode"), reinterpret_cast(m_eAlphaBlendMode))!=ERROR_SUCCESS) + m_eAlphaBlendMode = eAlphaBlendSoftware; + } + + // Install the input filter + cInputBuffer::init(); + + long Val=NULL; + + // Ok, enumerate all of the plugins and load them + ::ReleaseMutex( _hUpdateEnabled ); +} + +void cManager::term() +{ + // Remove the object from the ROT + ::WaitForSingleObject( _hUpdateEnabled, INFINITE ); + + CComPtr< IRunningObjectTable > pROT; + if( SUCCEEDED( ::GetRunningObjectTable( 0, &pROT ) ) ) + pROT->Revoke( m_dwROT ); + + if( m_pRootSite != NULL ) + { + m_pRootSite->Destroy( ); + clearDestroyList( ); + m_pRootSite = NULL; + } + + // Terminate the input buffer + cInputBuffer::term( ); + + m_bInitialized = false; + + // Release the ACHooks interface and event connection points + if( !m_bContainer ) + { + IACHooksEventsImpl::unadvise( m_pHooks ); + IACHooksEventsImpl::unadvise( m_pHooks ); + m_pHooks.Release(); + } + + // Now Destroy the window structure (NOTE: This reference is weak - + // so the destroy method should free memory) +/* if( m_pRootSite != NULL ) + { + m_pRootSite->Destroy(); + clearDestroyList(); + m_pRootSite = NULL; + } +*/ + // Make sure the captures are cleared + _ASSERTE( m_pMouseOver == NULL ); + _ASSERTE( m_pMouseDown == NULL ); + _ASSERTE( m_pKeyboard == NULL ); + + ::ReleaseMutex( _hUpdateEnabled ); +} + +void cManager::clearDestroyList() +{ + { + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++ i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapWindowMessage ) + { + // I can't figure out how to stop this from AVing. Spent way too much time on it already. + try + { + CComPtr< IWindowsMessageSink > pSink; + i->m_pPlugin->QueryInterface( &pSink ); + pSink->WindowMessageEnd(); + } + catch( ... ) + { + } + } + } + } + + { + for( cLayerList::iterator i = m_destroy.begin(); i != m_destroy.end(); i = m_destroy.erase( i ) ) + { + // Do internal destruction + ( *i )->destroy(); + ( *i )->Release(); + } + } +} + +void cManager::loadPlugin( IUnknown *pUnkPlugin ) +{ + cPlugin p; + p.m_pPlugin = pUnkPlugin; + p.m_dwSinkCaps = 0; + + // Test for sink caps + static cManagerSinkCapTest _capstest[] = { + { eManagerSinkCapWindowMessage, &IID_IWindowsMessageSink }, + { eManagerSinkCapPlugin, &IID_IPluginSink}, + { eManagerSinkCapRender, &IID_IRenderSink }, + { eManagerSinkCapRender3D, &IID_IRender3DSink }, + }; + + static cManagerSinkCapTest *_end_caps = _capstest + ( sizeof( _capstest ) / sizeof( cManagerSinkCapTest ) ); + + for( cManagerSinkCapTest *i = _capstest; i != _end_caps; ++ i ) + { + CComPtr< IUnknown > pUnk; + if( SUCCEEDED( pUnkPlugin->QueryInterface( *( i->m_iid ), reinterpret_cast< void ** >( &pUnk ) ) ) ) + p.m_dwSinkCaps |= i->m_mask; + } + + // Don't bother adding plugins without any sink interfaces + if ( p.m_dwSinkCaps != 0 ) + m_plugins.push_back( p ); +} + +void cManager::unloadPlugins () +{ + m_plugins.clear (); +} + +void cManager::setWindow( HWND hWnd ) +{ + // ::MessageBox( NULL, _T( "cManager::setWindow" ), _T( "Inject.dll" ), MB_OK ); + + // Subclass the window + if( hWnd == m_hMain || hWnd == NULL ) + // Do not subclass the window twice + return; + + if( m_hMain != NULL ) + { + // Unhook the window proc + _ASSERTE ( ::GetWindowLong ( m_hMain, GWL_WNDPROC ) == reinterpret_cast< LONG > ( wndProc ) ); + ::SetWindowLong( m_hMain, GWL_WNDPROC, reinterpret_cast< LONG >( m_pfnOld ) ); + m_pfnOld = NULL; + } + + m_hMain = hWnd; + + if( m_hMain != NULL ) + // Hook the window proc + m_pfnOld = reinterpret_cast< WNDPROC >( ::SetWindowLong( hWnd, GWL_WNDPROC, reinterpret_cast< LONG >( wndProc ) ) ); + + m_pDecal->put_HWND ( reinterpret_cast< long > ( hWnd ) ); +} + +void cManager::draw2D( ) +{ + m_pDecal->Render2D( ); + + if( m_pRootSite != NULL ) + { + _ASSERTMEM( _CrtCheckMemory( ) ); + m_pRootSite->format( ); + m_pRootSite->prerender( ); + + _ASSERTMEM( _CrtCheckMemory( ) ); + + CComPtr< ICanvas > pCanvas; + if (SUCCEEDED (GetPrimarySurface( &pCanvas ))) + { + m_pRootSite->render( pCanvas ); + + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++ i ) + { + // Reset the pCanvas alpha + pCanvas->put_Alpha( 255 ); + + if( i->m_dwSinkCaps & eManagerSinkCapRender ) + { + CComPtr< IRenderSink > pSink; + i->m_pPlugin->QueryInterface( &pSink ); + pSink->CustomDraw( pCanvas ); + } + } + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + } +} + +void cManager::draw3D() +{ + if( m_pRootSite != NULL ) + { + } +} + +void cManager::sendPreBeginScene() +{ + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapRender3D ) + { + CComPtr< IRender3DSink > pSink; + i->m_pPlugin->QueryInterface( &pSink ); + pSink->PreBeginScene( m_p3DDevice ); + } + } +} + +void cManager::sendPostBeginScene() +{ + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapRender3D ) + { + CComPtr< IRender3DSink > pSink; + i->m_pPlugin->QueryInterface( &pSink ); + pSink->PostBeginScene( m_p3DDevice ); + } + } +} + +void cManager::sendPreEndScene() +{ + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapRender3D ) + { + CComPtr< IRender3DSink > pSink; + i->m_pPlugin->QueryInterface( &pSink ); + pSink->PreEndScene( m_p3DDevice ); + } + } +} + +void cManager::sendPostEndScene() +{ + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapRender3D ) + { + CComPtr< IRender3DSink > pSink; + i->m_pPlugin->QueryInterface( &pSink ); + pSink->PostEndScene( m_p3DDevice ); + } + } +} + +void cManager::removeImage( cImage *pImage ) +{ + for( cImagesList::iterator i = m_images.begin(); i != m_images.end(); ++ i ) + { + if( *i == pImage ) + { + m_images.erase( i ); + return; + } + } + + // Not found - boo! + _ASSERTE( FALSE ); +} + +void cManager::removeFont( cFontCache *pFont ) +{ + for( cFontsList::iterator i = m_fonts.begin(); i != m_fonts.end(); ++ i ) + { + if( *i == pFont ) + { + m_fonts.erase( i ); + return; + } + } + + // Not found - boo! + _ASSERTE( FALSE ); +} + +void cManager::enableSoftwareMode( ) +{ + m_bSoftware = true; +} + +LRESULT cManager::localWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ +/* if((uMsg==WM_NCACTIVATE))/* || (uMsg==WM_ACTIVATE) || (uMsg==WM_ACTIVATEAPP) || (uMsg==WM_KILLFOCUS)) + return 0;*/ + + // When destory comes through, shut down the decal object + if ( uMsg == WM_DESTROY ) + { + m_pDecal->StopServices (); + m_pDecal.Release (); + + return ::CallWindowProc( m_pfnOld, m_hMain, uMsg, wParam, lParam ); + } + + if( ( m_pRootSite == NULL ) || ( ( m_p3DDevice == NULL ) && ( !m_bContainer ) && ( !m_bSoftware ) ) ) + // Quick return when we aren't initialized + return ::CallWindowProc( m_pfnOld, m_hMain, uMsg, wParam, lParam ); + + // Forwards messages to the sinks accepting the windows messages + for( cPluginList::iterator i = m_plugins.begin(); i != m_plugins.end(); ++ i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapWindowMessage ) + { + CComPtr< IWindowsMessageSink > pSink; + if( i->m_pPlugin->QueryInterface( &pSink ) == S_OK ) + { + VARIANT_BOOL bEat = VARIANT_FALSE; + pSink->WindowMessage( reinterpret_cast< long >( hWnd ), uMsg, wParam, lParam, &bEat ); + + if( bEat ) + // This message was eaten stop processing + return 0; + } + } + } + + // Return if there is no 3D Device + if( m_p3DDevice == NULL && !m_bContainer ) + return ::CallWindowProc( m_pfnOld, m_hMain, uMsg, wParam, lParam ); + + if( uMsg >= WM_MOUSEFIRST && uMsg < WM_MOUSELAST ) + { + // Process enter/exit messages + POINTS ptm = MAKEPOINTS( lParam ); + + if( !m_bContainer ) + { + D3DCLIPSTATUS cs; + m_p3DDevice->GetClipStatus( &cs ); + + ptm.y -= ( 28 - static_cast< short >( cs.miny ) ); + } + + POINT ptLocal; + CComPtr< ICanvas > pPrimary; + cLayerSite *pHit = NULL; + if (SUCCEEDED (GetPrimarySurface( &pPrimary ))) + { + pHit = m_pRootSite->hitTest( ptm, &ptLocal, pPrimary ); + + if( m_pMouseDown != NULL || pHit != NULL ) + { + if( m_pMouseDown != NULL ) + m_pMouseDown->sendMouseEvent( uMsg, wParam, lParam ); + else + pHit->sendMouseEvent( uMsg, wParam, lParam ); + } + } + + // Ok - fill out the structure with our fancy info + MouseState ms = { ( pHit == NULL ) ? NULL : pHit->m_pSink, { ptm.x, ptm.y }, { ( pHit == NULL ) ? 0 : ptLocal.x, ( pHit == NULL ) ? 0 : ptLocal.y }, + ( ::GetAsyncKeyState( VK_CONTROL ) & 0x80000000 ) ? VARIANT_TRUE : VARIANT_FALSE, + ( ::GetAsyncKeyState( VK_SHIFT ) & 0x80000000 ) ? VARIANT_TRUE : VARIANT_FALSE }; + + bool bEat = false; + + // First we check for button up messages which end capture + if( uMsg == WM_LBUTTONUP ) + { + if( m_pMouseDown != NULL ) + { + // Send the mouse up message and end capture + m_pMouseDown->sendMouseUp( &ms ); + + // Reset the mouse in, so enter/exit messages get sent properly + + // First, check if enter/exit messages are + if( m_pMouseDown->isClippedChild( pHit ) ) + m_pMouseOver = m_pMouseDown; + else + { + // We have not hit a child of the mouse down, reset the mouse over + // to our parent (which has not received the mouse out message) + if( m_pMouseDown->m_params.render & eRenderClipped ) + m_pMouseOver = m_pMouseDown->m_pParent; + else + // If the item is unclipped, then we must send all enter messages + m_pMouseOver = NULL; + } + + bEat = true; + m_pMouseDown = NULL; + } + } + + // Next, send enter/exit messages + if( pHit != m_pMouseOver ) + { + if( m_pMouseDown != NULL ) + { + // There is a capture, send enter/exit messages only to the one with capture + bool bPreviousHit = m_pMouseDown->isClippedChild( m_pMouseOver ); + if( bPreviousHit != m_pMouseDown->isClippedChild( pHit ) ) + { + if( bPreviousHit ) + m_pMouseDown->sendMouseExit( m_pMouseDown->m_pParent, &ms ); + else + m_pMouseDown->sendMouseEnter( m_pMouseDown->m_pParent, &ms ); + } + } + else + { + // Find the common parent + cLayerSite *pCommonParent; + if( pHit == NULL || m_pMouseOver == NULL ) + pCommonParent = NULL; + else + pCommonParent = m_pMouseOver->getCommonClippedParent( pHit ); + + if( m_pMouseOver != NULL ) + m_pMouseOver->sendMouseExit( pCommonParent, &ms ); + + if( pHit != NULL ) + pHit->sendMouseEnter( pCommonParent, &ms ); + } + + m_pMouseOver = pHit; + } + + // Next, send movement messages + if( m_pMouseDown != NULL ) + m_pMouseDown->sendMouseMove( &ms ); + else if( m_pMouseOver != NULL ) + m_pMouseOver->sendMouseMove( &ms ); + + // Last, send mouse capture messages + if( uMsg == WM_LBUTTONDOWN ) + { + if( m_pMouseOver != NULL ) + { + m_pMouseDown = m_pMouseOver; + m_pMouseDown->sendMouseDown( &ms ); + + bEat = true; + } + + // Check for popups that require closing + for( cLayerList::iterator i = m_popups.begin(); i != m_popups.end(); ) + { + if( !( *i )->isChild( m_pMouseOver ) && !( *i )->sendPopupCancel( &ms ) ) + { + i = m_popups.erase( i ); + continue; + } + + ++ i; + } + + // Check if we should be cancelling a keyboard capture + if( m_pKeyboard != NULL ) + { + if( !m_pKeyboard->isClippedChild( m_pMouseDown ) ) + { + // The user is clicking on something other than the keyboard capture, + // so end capture + m_pKeyboard->sendKeyboardEndCapture( VARIANT_TRUE ); + m_pKeyboard = NULL; + } + } + } + + if( uMsg == WM_LBUTTONDBLCLK ) + { + if( m_pMouseOver != NULL ) + { + m_pMouseOver->sendMouseDblClk( &ms ); + bEat = true; + } + } + + if( bEat ) + { + clearDestroyList(); + return 0; + } + } + + if( uMsg >= WM_KEYFIRST && uMsg <= WM_KEYLAST ) + { + // We ahve a keyboard message that might be filtered + if(( m_pKeyboard != NULL ) && (uMsg != WM_KEYUP)) + { + m_pKeyboard->sendKeyboardEvent( uMsg, wParam, lParam ); + + // Check if the message is clearing + if( uMsg == WM_CHAR ) + { + if( wParam == VK_RETURN ) + { + // End with success + // cyn, 15/10/2002 + // Clear m_pKeyboard before triggering KeyboardEndCapture, + // This allows KeyboardEndCapture to re-capture the keyboard + // Edit will only allow recapture if VARIANT_FALSE is passed + // I believe Edit is the only control in DecalControls.* that captures the keyboard + cLayerSite *Keyboard = m_pKeyboard; + m_pKeyboard = NULL; + Keyboard->sendKeyboardEndCapture( VARIANT_FALSE ); + Keyboard = NULL; // I don't know if it does some smart pointer reference counting or whatever.. can't hurt + + clearDestroyList(); + return 0; + } + else if( wParam == VK_ESCAPE || wParam == VK_TAB ) + { + // End with cancel + m_pKeyboard->sendKeyboardEndCapture( VARIANT_TRUE ); + m_pKeyboard = NULL; + + clearDestroyList(); + return 0; + } + + // Send the key message + KeyState ks = { wParam, + ( ::GetAsyncKeyState( VK_CONTROL ) & 0x80000000 ) ? VARIANT_TRUE : VARIANT_FALSE, + ( ::GetAsyncKeyState( VK_SHIFT ) & 0x80000000 ) ? VARIANT_TRUE : VARIANT_FALSE }; + + m_pKeyboard->sendKeyboardChar( &ks ); + } + + // Eat all other keyboard messages when there's a capture + clearDestroyList(); + return 0; + } + + // Carry on, nothing special here + } + + if( uMsg == WM_ACTIVATEAPP && !wParam ) + { + // The application is being deactivated - clear all mouse and keyboard captures + MouseState ms = { NULL, { 0, 0 }, { 0, 0 }, VARIANT_FALSE, VARIANT_FALSE }; + + if( m_pMouseDown ) + { + cLayerSite *pMouseDownParent = ( m_pMouseDown->m_params.render & eRenderClipped ) ? + m_pMouseDown->m_pParent : NULL; + + // Do a mouse exit from the captured control + if( m_pMouseDown->isClippedChild( m_pMouseOver ) ) + { + // First exit the mouse down layer + m_pMouseDown->sendMouseExit( pMouseDownParent, &ms ); + m_pMouseOver = pMouseDownParent; + } + else + m_pMouseOver = pMouseDownParent; + + // Send the mouse up message + m_pMouseDown->sendMouseUp( &ms ); + m_pMouseDown = NULL; + } + + // Do an exit for any remaining mouse overs + if( m_pMouseOver != NULL ) + { + m_pMouseOver->sendMouseExit( NULL, &ms ); + m_pMouseOver = NULL; + } + + // Attempt to close all popups + for( cLayerList::iterator i = m_popups.begin(); i != m_popups.end(); ) + { + if( !( *i )->sendPopupCancel( &ms ) ) + i = m_popups.erase( i ); + else + ++ i; + } + + if( m_pKeyboard ) + { + m_pKeyboard->sendKeyboardEndCapture( VARIANT_TRUE ); + m_pKeyboard = NULL; + } + } + + clearDestroyList( ); + + return ::CallWindowProc( m_pfnOld, m_hMain, uMsg, wParam, lParam ); +} + +LRESULT cManager::wndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + _ASSERTE ( cManager::_p != NULL ); + return cManager::_p->localWndProc( hWnd, uMsg, wParam, lParam ); +} + +void cManager::createSurface( LPSIZE psz, IDirectDrawSurface4 **ppSurf ) +{ + DDSURFACEDESC2 ddsd; + + ::memset( &ddsd, 0, sizeof( DDSURFACEDESC2 ) ); + ddsd.dwSize = sizeof( DDSURFACEDESC2 ); + + ddsd.ddpfPixelFormat.dwSize = sizeof( DDPIXELFORMAT ); + + // Set the pixel format to the same as the primary surface + CComPtr< ICanvas > pCanvas; + if (SUCCEEDED (GetPrimarySurface( &pCanvas ))) + { + CComPtr< IDirectDrawSurface4 > pPrimary; + + + pCanvas->GetSurface( IID_IDirectDrawSurface4, reinterpret_cast< void ** >( &pPrimary ) ); + + pPrimary->GetPixelFormat( &ddsd.ddpfPixelFormat ); + + // Now make a drawing surface of the same size as our client area + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + ddsd.dwWidth = psz->cx; + ddsd.dwHeight = psz->cy; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + + HRESULT hRes = m_pD->CreateSurface( &ddsd, ppSurf, NULL ); + _ASSERTE( SUCCEEDED( hRes ) ); + + DDCOLORKEY ddc = { 0x07FF, 0x07FF }; + ( *ppSurf )->SetColorKey( DDCKEY_SRCBLT, &ddc ); + } + + _ASSERTMEM( _CrtCheckMemory( ) ); +} + +STDMETHODIMP cManager::UnloadPlugin(long nID) +{ + return E_NOTIMPL; +} + +STDMETHODIMP cManager::GetDirectDraw(REFIID iid, void **ppvItf) +{ + _ASSERTE( ppvItf != NULL ); + + return m_pD->QueryInterface( iid, ppvItf ); +} + +STDMETHODIMP cManager::GetPrimarySurface(ICanvas **ppCanvas) +{ + _ASSERTE( ppCanvas != NULL ); +// _ASSERTE( m_p3DDevice != NULL ); + + if ( m_bContainer ) + { + // Create a canvas object + CComObject< cCanvas > *pPrimCanvas; + CComObject< cCanvas >::CreateInstance( &pPrimCanvas ); + + GetScreenSize( &pPrimCanvas->m_sz ); + pPrimCanvas->m_pSurface = m_pPrimarySurface; + + RECT rc; + + GetWindowRect(m_hMain, &rc); + + ClipParams cClip = { { static_cast< long >( 0 ), static_cast< long >( 0 ), static_cast< long >( rc.right - rc.left ), static_cast< long >( rc.bottom - rc.top ) }, { 0, 0 }, VARIANT_TRUE }; + pPrimCanvas->m_clipping.push( cClip ); + + pPrimCanvas->AddRef( ); + *ppCanvas = pPrimCanvas; + } + else + { + CComPtr< IDirectDrawSurface4 > pPrimary; + + HRESULT hRes = m_p3DDevice->GetRenderTarget( &pPrimary ); + if( FAILED( hRes ) ) + return E_FAIL; + + // Create a canvas object + CComObject< cCanvas > *pPrimCanvas; + CComObject< cCanvas >::CreateInstance( &pPrimCanvas ); + + GetScreenSize( &pPrimCanvas->m_sz ); + pPrimCanvas->m_pSurface = pPrimary; + + D3DCLIPSTATUS cs; + m_p3DDevice->GetClipStatus( &cs ); + + // Set up the clipping parameters (depends on the 3d clipping area) + ClipParams cClip = { { static_cast< long >( cs.minx ), static_cast< long >( cs.miny ), static_cast< long >( cs.maxx ), static_cast< long >( cs.maxy ) }, + { 0, 0 }, VARIANT_TRUE }; + + pPrimCanvas->m_clipping.push( cClip ); + + pPrimCanvas->AddRef(); + *ppCanvas = pPrimCanvas; + } + return S_OK; +} + +STDMETHODIMP cManager::Get3DDevice(REFIID iid, void **ppvItf) +{ + _ASSERTE( ppvItf != NULL ); + + return m_p3DDevice->QueryInterface( iid, ppvItf ); +} + +STDMETHODIMP cManager::LoadBitmapFile(BSTR strFilename, IImageCache **ppImage) +{ + _ASSERTE( strFilename != NULL ); + _ASSERTE( ppImage != NULL ); + + USES_CONVERSION; + + LPCTSTR szFilename = OLE2T( strFilename ); + + TCHAR szPath[ MAX_PATH ]; + ::InjectMapPath( eInjectPathAgent, szFilename, szPath ); + + // First search the image cache for a matching file + for( cImagesList::iterator i = m_images.begin(); i != m_images.end(); ++ i ) + { + if( ( *i )->m_source == cImage::eFile && ::_tcsicmp( ( *i )->m_szFilename, szPath ) == 0 ) + { + // Here's the match - return the existing image with another reference + ( *i )->AddRef(); + *ppImage = *i; + + return S_OK; + } + } + + // The image wasn't found, so make a new entry + CComObject< cImage > *pNewImage; + CComObject< cImage >::CreateInstance( &pNewImage ); + + pNewImage->m_source = cImage::eFile; + ::_tcscpy( pNewImage->m_szFilename, szPath ); + + m_images.push_back( pNewImage ); + + pNewImage->AddRef(); + + *ppImage = pNewImage; + return S_OK; +} + +STDMETHODIMP cManager::GetIconCache(LPSIZE psz, IIconCache **ppCache) +{ + _ASSERTE( psz != NULL ); + _ASSERTE( psz->cx > 0 && psz->cy > 0 ); + _ASSERTE( ppCache != NULL ); + + for( cIconsList::iterator i = m_icons.begin(); i != m_icons.end(); ++ i ) + { + if( ( *i )->m_szIcon.cx == psz->cx && ( *i )->m_szIcon.cy == psz->cy ) + { + *ppCache = ( *i ); + ( *i )->AddRef(); + + return S_OK; + } + } + + // Not found, so create a new cache + CComObject< cIconCache > *pNewCache; + CComObject< cIconCache >::CreateInstance( &pNewCache ); + + pNewCache->m_szIcon = *psz; + pNewCache->m_nEdge = 8; + pNewCache->AddRef(); + + m_icons.push_back( pNewCache ); + + *ppCache = pNewCache; + + // Make the icon cache actually cache + pNewCache->AddRef(); + + return S_OK; +} + +STDMETHODIMP cManager::LoadBitmapPortal(long nFile, IImageCache **ppImage) +{ + _ASSERTE( ppImage != NULL ); + + DWORD dwFile = *reinterpret_cast< DWORD* >( &nFile ); + for( cImagesList::iterator i = m_images.begin(); i != m_images.end(); ++ i ) + { + if( ( *i )->m_source == cImage::ePortal && ( *i )->m_dwID == dwFile ) + return ( *i )->QueryInterface( IID_IImageCache, reinterpret_cast< void ** >( ppImage ) ); + } + + // The image wasn't found, so make a new entry + CComObject< cImage > *pNewImage; + CComObject< cImage >::CreateInstance( &pNewImage ); + + pNewImage->m_source = cImage::ePortal; + pNewImage->m_dwID = dwFile; + pNewImage->AddRef(); + + m_images.push_back( pNewImage ); + + *ppImage = pNewImage; + return S_OK; +} + +STDMETHODIMP cManager::CreateFont(BSTR strFaceName, long nHeight, long nFlags, IFontCache **ppFont) +{ + _ASSERTE( strFaceName != NULL ); + _ASSERTE( ppFont != NULL ); + _ASSERTE( nHeight > 0 ); + + USES_CONVERSION; + + LPCTSTR szFaceName = OLE2T( strFaceName ); + + // Iterate through existing foonts to see if there's a match + for( cFontsList::iterator i = m_fonts.begin(); i != m_fonts.end(); ++ i ) + { + if( ( *i )->m_lf.lfHeight == nHeight && + ::_tcscmp( szFaceName, ( *i )->m_lf.lfFaceName ) == 0 && + ( ( *i )->m_lf.lfWeight == FW_BOLD ) == !!( nFlags & eFontBold ) && + !!( ( *i )->m_lf.lfItalic ) == !!( nFlags & eFontItalic ) && + !!( ( *i )->m_lf.lfUnderline ) == !!( nFlags &eFontUnderline ) ) + // Here's the match + return ( *i )->QueryInterface( IID_IFontCache, reinterpret_cast< void ** >( ppFont ) ); + } + + // Not Found, create a new font + CComObject< cFontCache > *pNewFont; + CComObject< cFontCache >::CreateInstance( &pNewFont ); + + ::memset( &pNewFont->m_lf, '\0', sizeof( LOGFONT ) ); + pNewFont->m_lf.lfHeight = nHeight; + ::_tcscpy( pNewFont->m_lf.lfFaceName, szFaceName ); + + if( nFlags & eFontBold ) + pNewFont->m_lf.lfWeight = FW_BOLD; + + if( nFlags & eFontItalic ) + pNewFont->m_lf.lfItalic = TRUE; + + if( nFlags & eFontUnderline ) + pNewFont->m_lf.lfUnderline = TRUE; + + // Commit the font + m_fonts.push_back( pNewFont ); + pNewFont->AddRef(); + + *ppFont = pNewFont; + return S_OK; +} + +STDMETHODIMP cManager::GetScreenSize(LPSIZE sz) +{ + _ASSERTE( sz != NULL ); + + RECT rc; + ::GetClientRect( m_hMain, &rc ); + + sz->cx = rc.right - rc.left; + sz->cy = rc.bottom - rc.top; + + return S_OK; +} + +STDMETHODIMP cManager::CreateCanvas(LPSIZE psz, ICanvas **ppCanvas) +{ + _ASSERTE( psz != NULL ); + _ASSERTE( psz->cx > 0 && psz->cy > 0 ); + _ASSERTE( ppCanvas != NULL ); + + CComObject< cCanvas > *pCanvas; + CComObject< cCanvas >::CreateInstance( &pCanvas ); + + pCanvas->m_sz = *psz; + + // Set the root clipper + ClipParams cClip = { { 0, 0, psz->cx, psz->cy }, + { 0, 0 }, VARIANT_TRUE }; + + pCanvas->m_clipping.push( cClip ); + + *ppCanvas = pCanvas; + pCanvas->AddRef(); + + return S_OK; +} + +STDMETHODIMP cManager::CreateView(ViewParams *pParams, ILayer *pLayer, IView **ppView) +{ + CComPtr< IRootLayer > pRoot; + m_pRootSite->m_pSink->QueryInterface( &pRoot ); + + return pRoot->CreateView( pParams, pLayer, ppView ); +} + +STDMETHODIMP cManager::LoadView(BSTR strSchema, IView **ppView) +{ + CComPtr< IRootLayer > pRoot; + m_pRootSite->m_pSink->QueryInterface( &pRoot ); + + return pRoot->LoadView( strSchema, ppView ); +} + +STDMETHODIMP cManager::CreateBrushImage(long nColor, IImageCache **ppImg) +{ + CComObject< cBrushImage > *pBrush; + CComObject< cBrushImage >::CreateInstance( &pBrush ); + + pBrush->put_Color( nColor ); + + *ppImg = pBrush; + pBrush->AddRef(); + + return S_OK; +} + +STDMETHODIMP cManager::LoadImageSchema(IUnknown *pSchema, IImageCache **ppImg) +{ + MSXML::IXMLDOMElementPtr pElement = pSchema; + + // Look for elements that specify a background image + _variant_t vFileSrc = pElement->getAttribute( _T( "imagefilesrc" ) ), + vPortalSrc = pElement->getAttribute( _T( "imageportalsrc" ) ), + vBrushSrc = pElement->getAttribute( _T( "imagebrushsrc" ) ); + + if( vFileSrc.vt != VT_NULL ) + { + _ASSERTE( vFileSrc.vt = VT_BSTR ); + + // We has a file source, attempt to create an image + HRESULT hRes = LoadBitmapFile( vFileSrc.bstrVal, ppImg ); + _ASSERTE( SUCCEEDED( hRes ) ); + } + else if( vPortalSrc.vt != VT_NULL ) + { + try + { + long nFileID = static_cast< long >( vPortalSrc ); + _ASSERTE( nFileID > 0 ); + _ASSERTE( nFileID < 0xFFFFL ); + + long nPortalID = 0x06000000 + nFileID; + + // It certainly converted properly - attempt to load the bitmap + HRESULT hRes = LoadBitmapPortal( nPortalID, ppImg ); + _ASSERTE( SUCCEEDED( hRes ) ); + } + catch( ... ) + { + // It must be possible to convert the portal src into + // a long int value. + _ASSERTE( FALSE ); + } + } + else if( vBrushSrc.vt != VT_NULL ) + { + try + { + long nColor = vBrushSrc; + CreateBrushImage( nColor, ppImg ); + } + catch( ... ) + { + // Failed to convert to long + _ASSERTE( FALSE ); + } + } + else + // Otherwise, this background is transparent + *ppImg = NULL; + + return S_OK; +} + +STDMETHODIMP cManager::CreateFontSchema(long nDefHeight, long nDefOptions, IUnknown *pSchema, IFontCache **ppCache) +{ + MSXML::IXMLDOMElementPtr pElement = pSchema; + + _variant_t vFacename = pElement->getAttribute( _T( "fontface" ) ), + vSize = pElement->getAttribute( _T( "fontsize" ) ), + vStyle = pElement->getAttribute( _T( "fontstyle" ) ); + + _bstr_t strFacename; + long nHeight = nDefHeight, + nStyle = nDefOptions; + + if( vFacename.vt != VT_NULL ) + { + _ASSERTE( vFacename.vt == VT_BSTR ); + strFacename = vFacename.bstrVal; + } + else + { + BSTR bstrFontName; + get_FontName(&bstrFontName); + strFacename = bstrFontName;//_T( "Times New Roman" ); + } + + if( vSize.vt != VT_NULL ) + nHeight = static_cast< long >( vSize ); + + if( vStyle.vt != VT_NULL ) + { + _ASSERTE( vStyle.vt == VT_BSTR ); + + nStyle = 0; + + // Make a copy of the value since strtok will destroy it nicely + _bstr_t strStyle = vStyle.bstrVal; + + for( wchar_t *pTok = ::wcstok( strStyle, L" " ); pTok != NULL; pTok = ::wcstok( NULL, L" " ) ) + { + if( ::_wcsicmp( L"bold", pTok ) == 0 ) + nStyle |= eFontBold; + else if( ::_wcsicmp( L"italic", pTok ) == 0 ) + nStyle |= eFontItalic; + else if( ::_wcsicmp( L"underline", pTok ) == 0 ) + nStyle |= eFontUnderline; + else + // Unknown token value, data problem + _ASSERTE( FALSE ); + } + } + + return CreateFont( strFacename, nHeight, nStyle, ppCache ); +} + +STDMETHODIMP cManager::LoadResourceModule(BSTR strLibrary, long *pnModule) +{ + USES_CONVERSION; + + LPCTSTR szLibrary = OLE2T( strLibrary ); + + HMODULE hLoaded = GetModuleHandle( szLibrary ); + if( hLoaded == NULL ) + { + TCHAR szPath[ MAX_PATH ]; + *pnModule = reinterpret_cast< long >( ::LoadLibrary( ::InjectMapPath( eInjectPathAgent, szLibrary, szPath ) ) ); + + _ASSERTE( *pnModule != NULL ); + } + else + *pnModule = reinterpret_cast< long >( hLoaded ); + + return S_OK; +} + +STDMETHODIMP cManager::get_ResourcePath(BSTR *pVal) +{ + _ASSERTE( pVal != NULL ); + TCHAR szPath[ MAX_PATH ]; + + *pVal = T2BSTR( ::InjectMapPath( eInjectPathAgent, _T( "" ), szPath ) ); + + return S_OK; +} + +STDMETHODIMP cManager::get_Plugin(BSTR strProgID, LPDISPATCH *pVal) +{ + _ASSERTE( strProgID != NULL ); + _ASSERTE( pVal != NULL ); + + // Prepend a fully-qualified service id + _bstr_t strPath ( _T( "plugins\\" ) ); + strPath += strProgID; + + return m_pDecal->get_Object ( strPath, IID_IDispatch, reinterpret_cast< LPVOID * > ( pVal ) ); +} + +STDMETHODIMP cManager::get_NetworkFilter(BSTR strProgID, LPDISPATCH *pVal) +{ + _ASSERTE( strProgID != NULL ); + _ASSERTE( pVal != NULL ); + + // Prepend a fully-qualified service id + _bstr_t strPath ( _T( "services\\DecalNet.NetService\\" ) ); + strPath += strProgID; + + return m_pDecal->get_Object ( strPath, IID_IDispatch, reinterpret_cast< LPVOID * > ( pVal ) ); +} + +STDMETHODIMP cManager::LoadViewObject(IUnknown *pSchema, IView **ppView) +{ + CComPtr< IRootLayer > pRoot; + m_pRootSite->m_pSink->QueryInterface( &pRoot ); + + return pRoot->LoadViewObject( pSchema, ppView ); +} + +STDMETHODIMP cManager::CreateInputBuffer(IInputBuffer **ppInput) +{ + CComObject< cInputBuffer > *pNew; + CComObject< cInputBuffer >::CreateInstance( &pNew ); + + return pNew->QueryInterface( ppInput ); +} + +STDMETHODIMP cManager::get_HWND(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = reinterpret_cast< long >( m_hMain ); + + return S_OK; +} + +STDMETHODIMP cManager::get_Focus(VARIANT_BOOL *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = ( m_pKeyboard != NULL ) ? VARIANT_TRUE : VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cManager::get_OldWndProc(long *pOldWndProc) +{ + _ASSERTE( pOldWndProc != NULL ); + + *pOldWndProc = reinterpret_cast< long > (m_pfnOld); + + return S_OK; +} + +STDMETHODIMP cManager::put_CurrentSelection( long nID) +{ + return m_pHooks->put_CurrentSelection( nID ); +} + +STDMETHODIMP cManager::get_CurrentSelection(long *nID) +{ + return m_pHooks->get_CurrentSelection( nID ); +} + +STDMETHODIMP cManager::put_PreviousSelection(long nID) +{ + return m_pHooks->put_PreviousSelection( nID ); +} + +STDMETHODIMP cManager::get_PreviousSelection(long *nID) +{ + return m_pHooks->get_PreviousSelection( nID ); +} + +STDMETHODIMP cManager::WriteToChatWindow(BSTR szText, long lColor) +{ + return m_pHooks->ChatOut( szText, lColor ); +} + +STDMETHODIMP cManager::RawWriteToChatWindow(BSTR szText, long lColor) +{ + return m_pHooks->RawChatOut( szText, lColor ); +} + +STDMETHODIMP cManager::SetCursorPosition(long x, long y) +{ + return m_pHooks->SetCursorPosition( x, y ); +} + +STDMETHODIMP cManager::QueryMemLoc(BSTR bstrTag, long *pVal) +{ + if( m_bContainer ) + { + *pVal = NULL; + return S_OK; + } + + return m_pHooks->QueryMemLoc( bstrTag, pVal ); +} + +STDMETHODIMP cManager::QueryKeyboardMap(BSTR bstrName, long *pAsciiVal) +{ + USES_CONVERSION; + // Para > this damned proc + + RegKey key; + + //HANDLE hFile; + + DWORD dwType = REG_EXPAND_SZ; + DWORD dwLengthPath = MAX_PATH; + DWORD dwLengthMap; + //DWORD dwFileSize; + //DWORD lpdwBytesRead; + + //int count = 0; + + //char* pDest; + //char *pEnd; + TCHAR tempbuf[MAX_PATH]; + TCHAR tempfile[MAX_PATH]; + + *pAsciiVal = 0; + + if (key.Open(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00"), KEY_QUERY_VALUE) == ERROR_SUCCESS) + { + ZeroMemory(tempbuf, sizeof(tempbuf)); + if (key.QueryStringValue(_T("Path"), tempbuf, &dwLengthPath) == ERROR_SUCCESS) + { + dwLengthMap = MAX_PATH; + ZeroMemory(tempfile, sizeof(tempfile)); + if (key.QueryValue(_T("CurrentInputMap"), &dwType, tempfile, &dwLengthMap) != ERROR_SUCCESS) + lstrcat(tempbuf, _T("\\default.map")); + else + { + // someone less peaved than me can choose a better answer to the 2 strcat's + lstrcat(tempbuf, _T("\\")); + lstrcat(tempbuf, tempfile); + } + } + else + return E_FAIL; + } + else + return E_FAIL; + + //::MessageBox(NULL, tempbuf, "QKM Path", 0); + // The following requires more testing than what i've given it. + + FILE * fKeyMap = fopen(tempbuf, "r"); + if (fKeyMap == NULL) + return S_FALSE; + + DWORD dwNumMaps; + fscanf(fKeyMap, "%i\r\n", &dwNumMaps); + + DWORD dwBlah1; + DWORD dwChar; + DWORD dwBlah3; + char szName[256]; + DWORD dwBlah5; + DWORD dwBlah6; + + // Not sure if this method is faster than the code below, + // but it's a bit easier to tell what's going on + while (fscanf(fKeyMap, "%i\t%i\t%i\t%s\t%i\t%i\r\n", &dwBlah1, &dwChar, &dwBlah3, szName, &dwBlah5, &dwBlah6) != 0) + { + if (stricmp(szName, OLE2A(bstrName)) == 0) + break; + + memset(szName, 0, 256); + dwChar = 0; + } + *pAsciiVal = (long)dwChar; + fclose(fKeyMap); + return S_OK; +/* + hFile = CreateFile(tempbuf, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + if(hFile==INVALID_HANDLE_VALUE) + { + return E_FAIL; + } + + dwFileSize = GetFileSize(hFile, NULL); + + char* pBuffer; + pBuffer = new char[dwFileSize+1]; + + BOOL bSuccess = ReadFile (hFile, pBuffer, dwFileSize, &lpdwBytesRead, 0); + + ::CloseHandle (hFile); + + if (!bSuccess) + { + delete[] pBuffer; + return E_FAIL; + } + + pBuffer [lpdwBytesRead] = 0; + + pDest = strstr(pBuffer, OLE2T(bstrName)); + + if(pDest != NULL) + { + while(pDest != pBuffer) + { + pDest--; + if(*pDest=='\t') + { + count++; + if(count==3) + { + *pEnd=0; + pDest++; + *pAsciiVal = atoi(pDest); + break; + } + pEnd = pDest; + } + } + } + delete[] pBuffer; + + return S_OK; + */ +} + +STDMETHODIMP cManager::CastSpell(long lSpellID, long lObjectID) +{ + return m_pHooks->CastSpell( lSpellID, lObjectID ); +} + +STDMETHODIMP cManager::MoveItem(long lObjectID, long lPackID, long lSlot, long lStack) +{ + if( lStack == 0 ) + return m_pHooks->MoveItem( lObjectID, lPackID, lSlot, VARIANT_FALSE ); + else + return m_pHooks->MoveItem( lObjectID, lPackID, lSlot, VARIANT_TRUE ); +} + +STDMETHODIMP cManager::SelectItem(long lObjectID) +{ + return m_pHooks->SelectItem( lObjectID ); +} + +STDMETHODIMP cManager::UseItem(long lObjectID, long lUseOnSelectedItem) +{ + return m_pHooks->UseItem( lObjectID, lUseOnSelectedItem ); +} + +STDMETHODIMP cManager::get_CombatState(long *pVal) +{ + return m_pHooks->get_CombatState( pVal ); +} + +STDMETHODIMP cManager::get_ChatState(VARIANT_BOOL *pVal) +{ + HRESULT HRes = m_pHooks->get_ChatState( pVal ); + + if( m_pKeyboard != NULL ) + *pVal = VARIANT_TRUE; + + return HRes; +} + +STDMETHODIMP cManager::UseItemEx(long Use, long UseOn) +{ + return m_pHooks->UseItemEx( Use, UseOn ); +} + +STDMETHODIMP cManager::get_Decal(IDecal **pVal) { + return m_pDecal->QueryInterface(pVal); +} + +STDMETHODIMP cManager::GetFellowStats(long charID) +{ + return m_pHooks->GetFellowStats( charID ); +} + +STDMETHODIMP cManager::get_Hooks(IACHooks **pVal) +{ + return m_pHooks->QueryInterface(pVal); +} + +STDMETHODIMP cManager::RedrawBar() +{ + m_pRootSite->reformat() ; + return S_OK ; +} + + +///////////////////////////////////////////////////////////////////////////// +// Used to determine the font to use in Decal +///////////////////////////////////////////////////////////////////////////// + +static _bstr_t g_bstrDecalFontName = "Times New Roman"; +static bool g_bDecalFontRead = false; + +STDMETHODIMP cManager::get_FontName(BSTR *pFontName) +{ + // Do we need to read the font name??? + if (!g_bDecalFontRead) + { + RegKey key; + + // Open the main Decal Key + if (key.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal")) == ERROR_SUCCESS) + { + // Get font type + DWORD dwFontType; + if (key.QueryDWORDValue("FontType", dwFontType) == ERROR_SUCCESS) + { + // Act on type + switch (dwFontType) + { + case 0: // Default Font + { + // No-op + } + break; + + case 1: // Current AC Client Font + { + RegKey k; + TCHAR szFontName[512]; + DWORD dwCount = 512; + + // Get the AC Client font + k.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00")); + if (k.QueryStringValue("Font", szFontName, &dwCount) == ERROR_SUCCESS) + { + g_bstrDecalFontName = _bstr_t(szFontName); + } + + k.Close(); + } + break; + + case 2: // Custom Font Name + { + TCHAR szFontName[512]; + DWORD dwCount = 512; + + // Get the custom font + if (key.QueryStringValue("FontName", szFontName, &dwCount) == ERROR_SUCCESS) + { + g_bstrDecalFontName = _bstr_t(szFontName); + } + } + break; + } + } + } + + key.Close(); + + // Assume its found (don't try again) + g_bDecalFontRead = true; + + //MessageBox(NULL, (LPCTSTR) g_bstrDecalFontName, NULL, MB_OK); + } + + // Pass back the font name + *pFontName = g_bstrDecalFontName; + + return S_OK; +} + +void cManager::onChatMessage( BSTR bstrText, long lColor, VARIANT_BOOL *pbEat ) +{ + VARIANT_BOOL bEat = VARIANT_FALSE; + for( cPluginList::iterator i = _p->m_plugins.begin(); i != _p->m_plugins.end(); ++i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapPlugin ) + { + CComPtr pPluginSink; + i->m_pPlugin->QueryInterface( &pPluginSink ); + pPluginSink->ChatMessage( bstrText, &lColor, &bEat ); + if( bEat == VARIANT_TRUE ) + *pbEat = VARIANT_TRUE; + } + } +} + +void cManager::onChatText( BSTR bstrText, VARIANT_BOOL *pbEat ) +{ + VARIANT_BOOL bEat = VARIANT_FALSE; + for( cPluginList::iterator i = _p->m_plugins.begin(); i != _p->m_plugins.end(); ++i ) + { + if( i->m_dwSinkCaps & eManagerSinkCapPlugin ) + { + CComPtr pPluginSink; + i->m_pPlugin->QueryInterface( &pPluginSink ); + pPluginSink->ChatText( bstrText, &bEat ); + if( bEat == VARIANT_TRUE ) + *pbEat = VARIANT_TRUE; + } + } +} diff --git a/Native/Inject/Manager.h b/Native/Inject/Manager.h new file mode 100644 index 0000000..98c9deb --- /dev/null +++ b/Native/Inject/Manager.h @@ -0,0 +1,237 @@ +// Manager.h : Declaration of the cManager + +#ifndef __MANAGER_H_ +#define __MANAGER_H_ + +#include "resource.h" // main symbols + +#include "LayerSite.h" +#include "BarLayer.h" +#include "DatFile.h" +#include "Panel.h" +#include +#include "..\Decal\ACHooks.h" + +class cIconCache; +class cImage; +class cFontCache; + + +#define ChatTextHook 102 +#define ChatMessageHook 103 +extern const IID EVTID_AcHooks ; +// Template class used to connect ACHooks events +templateclass IACHooksEventsImpl +:public IDispEventImpl +{ +public: HRESULT advise(IUnknown *pUnk){return DispEventAdvise(pUnk);} + HRESULT unadvise(IUnknown *pUnk){return DispEventUnadvise(pUnk);} +}; + +///////////////////////////////////////////////////////////////////////////// +// cManager +class ATL_NO_VTABLE cManager : + public CComObjectRootEx, + public IACHooksEventsImpl, + public IACHooksEventsImpl, + public IPluginSite +{ +public: + cManager(); + ~cManager(); + + void setDirectDraw( IDirectDraw4 *pDD, IDirect3D3 *pD3D, IDirectDrawSurface4 *pDDS ); + void setSurface( IDirect3DDevice3 *pDevice ); + + void init(); + void term(); + + void loadPlugin ( IUnknown *pUnk ); + void unloadPlugins (); + void setWindow( HWND hWnd ); + + void draw2D(); + void draw3D(); + void sendPreBeginScene(); + void sendPostBeginScene(); + void sendPreEndScene(); + void sendPostEndScene(); + void clearDestroyList(); + + void __stdcall onChatMessage(BSTR bstrText, long lColor, VARIANT_BOOL *pbEat); + void __stdcall onChatText(BSTR bstrText, VARIANT_BOOL *pbEat); + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cManager) + COM_INTERFACE_ENTRY(IPluginSite) +END_COM_MAP() + +BEGIN_SINK_MAP(cManager) + SINK_ENTRY_EX( ChatMessageHook, EVTID_AcHooks, 2, onChatMessage) + SINK_ENTRY_EX( ChatTextHook, EVTID_AcHooks, 3, onChatText) +END_SINK_MAP() + + class cMemLocs + { + public: + _bstr_t bstrName; + DWORD dwValue; + }; + + // Data members for the plugin objects + class cPlugin + { + public: + DWORD m_dwSinkCaps; + IUnknown *m_pPlugin; + }; + + long m_nNextPlugin; + typedef std::list< cPlugin > cPluginList; + cPluginList m_plugins; + + // Data for windowing + + // The root window pair + cLayerSite *m_pRootSite; + + // Various capture information + cLayerSite *m_pMouseOver, + *m_pMouseDown, + *m_pKeyboard; + + // Popup recoil structures + typedef std::list< cLayerSite * > cLayerList; + cLayerList m_popups; + + // Destruction queue + cLayerList m_destroy; + + // Icon Cache Management + typedef std::list< cIconCache * > cIconsList; + cIconsList m_icons; + + // Image Cache Management + typedef std::list< cImage * > cImagesList; + cImagesList m_images; + + void removeImage( cImage * ); + + // Font Cache Management + typedef std::list< cFontCache * > cFontsList; + cFontsList m_fonts; + + void removeFont( cFontCache * ); + + // AC Data Files + cDatFile m_portal; + + // Hooked stuff + HWND m_hMain; + WNDPROC m_pfnOld; + DWORD m_dwROT; + //HANDLE m_hDrawSync; + bool m_bInitialized; + bool m_bContainer; + bool m_bXMLViewViewer; + cRootLayer* m_pRootLayer; + + DWORD m_dwChatMessageAddy; + + long m_lPrevSelKey; + + CComPtr< IACHooks > m_pHooks; + + eAlphaBlendOptions m_eAlphaBlendMode; + + // std::list< LPDIRECTDRAWSURFACE4 > SurfaceList; + + IDirectDraw4 *m_pD; + IDirect3D3 *m_p3D; + IDirect3DDevice3 *m_p3DDevice; + IDirectDrawSurface4 *m_pPrimarySurface; + + LPVOID m_lpSurface; + + HMODULE m_hDecalDLL; + bool m_bSoftware; + +public: + static CComObject< cManager > *_p; + CComPtr< IDecal > m_pDecal; + +public: + LRESULT localWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + static LRESULT CALLBACK wndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + void createSurface( LPSIZE psz, IDirectDrawSurface4 **ppSurf ); + void convertVersion( LPTSTR szVersion, DWORD &dwVersionMajor, DWORD &dwVersionMinor ); + void enableSoftwareMode( ); + +public: + STDMETHOD(get_Hooks)(/*[out, retval]*/ IACHooks * *pVal); + STDMETHOD(get_Focus)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(get_HWND)(/*[out, retval]*/ long *pVal); + + // IPluginSite Methods + STDMETHOD(CreateCanvas)(LPSIZE psz, /*[out, retval]*/ ICanvas **ppCanvas); + STDMETHOD(GetScreenSize)(LPSIZE sz); + STDMETHOD(CreateFont)(BSTR strFaceName, long nHeight, long nFlags, /*[out, retval]*/ IFontCache **ppFont); + STDMETHOD(LoadBitmapPortal)(long nFile, IImageCache **); + STDMETHOD(GetIconCache)(LPSIZE sz, /*[out, retval]*/ IIconCache **ppCache); + STDMETHOD(LoadBitmapFile)(BSTR strFilename, IImageCache **ppImage); + STDMETHOD(Get3DDevice)(REFIID iid, void **ppvItf); + STDMETHOD(GetPrimarySurface)(/*[out, retval]*/ ICanvas **ppCanvas); + STDMETHOD(GetDirectDraw)(REFIID iid, void **ppvItf); + STDMETHOD(UnloadPlugin)(long nID); + STDMETHOD(CreateView)(ViewParams *pParams, ILayer *pLayer, /*[out, retval]*/ IView **ppView); + STDMETHOD(LoadView)(BSTR strSchema, /*[out, retval]*/ IView **ppView); + STDMETHOD(CreateFontSchema)(long nDefHeight, long nDefOptions, IUnknown *pSchema, /*[out, retval]*/ IFontCache **ppCache); + STDMETHOD(LoadImageSchema)(IUnknown *pSchema, /*[out, retval]*/ IImageCache **ppImg); + STDMETHOD(CreateBrushImage)(long nColor, /*[out, retval]*/ IImageCache **ppImg); + STDMETHOD(LoadViewObject)(IUnknown *pSchema, /*[out, retval]*/ IView **ppView); + STDMETHOD(get_NetworkFilter)(BSTR strProgID, /*[out, retval]*/ LPDISPATCH *pVal); + STDMETHOD(get_Plugin)(BSTR strProgID, /*[out, retval]*/ LPDISPATCH *pVal); + STDMETHOD(get_ResourcePath)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(LoadResourceModule)(BSTR strLibrary, /*[out, retval]*/ long *pnModule); + STDMETHOD(CreateInputBuffer)(/*[out, retval]*/ IInputBuffer **ppInput); + STDMETHOD(get_OldWndProc)(/*[out, retval]*/ long *pOldWndProc); + + STDMETHOD(put_CurrentSelection)(long nID); + STDMETHOD(get_CurrentSelection)(long *nID); + + STDMETHOD(put_PreviousSelection)(long nID); + STDMETHOD(get_PreviousSelection)(long *nID); + + STDMETHOD(WriteToChatWindow)(BSTR szText, long lColor); + + STDMETHOD(SetCursorPosition)(long x, long y); + + STDMETHOD(QueryKeyboardMap)(BSTR bstrName, long *pAsciiVal); + + STDMETHOD(QueryMemLoc)(BSTR bstrTag, long *pVal); + + STDMETHOD(RawWriteToChatWindow)(BSTR szText, long lColor); + + STDMETHOD(CastSpell)(long lSpellID, long lObjectID); //0x004EFB10 + + STDMETHOD(MoveItem)(long lObjectID, long lPackID, long lSlot, long lStack); //0x4F9E80 + + STDMETHOD(SelectItem)(long lObjectID); //0x4CF850 + + STDMETHOD(UseItem)(long lObjectID, long lUseOnSelectedItem); //0x4FA9F0 + + STDMETHOD(get_CombatState)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_ChatState)(/*[out, retval]*/ VARIANT_BOOL *pVal); + + STDMETHOD(UseItemEx)(long Use, long UseOn); + STDMETHOD(GetFellowStats)(long charID); + + STDMETHOD(get_Decal)(IDecal **pVal); + STDMETHOD(RedrawBar)(); + + STDMETHOD(get_FontName)(BSTR *pFontName); +}; + +#endif //__MANAGER_H_ diff --git a/Native/Inject/MaterialHook.cpp b/Native/Inject/MaterialHook.cpp new file mode 100644 index 0000000..93c99a5 --- /dev/null +++ b/Native/Inject/MaterialHook.cpp @@ -0,0 +1,8 @@ +// MaterialHook.cpp : Implementation of CMaterialHook +#include "stdafx.h" +#include "Inject.h" +#include "MaterialHook.h" + +///////////////////////////////////////////////////////////////////////////// +// CMaterialHook + diff --git a/Native/Inject/MaterialHook.h b/Native/Inject/MaterialHook.h new file mode 100644 index 0000000..35d490b --- /dev/null +++ b/Native/Inject/MaterialHook.h @@ -0,0 +1,115 @@ +// MaterialHook.h : Declaration of the CMaterialHook + +#ifndef __MATERIALHOOK_H_ +#define __MATERIALHOOK_H_ + +#include "resource.h" // main symbols + +#include "Direct3DHook.h" +#include "DirectDrawHook.h" + +///////////////////////////////////////////////////////////////////////////// +// CMaterialHook +class ATL_NO_VTABLE CMaterialHook : + public CComObjectRootEx, + public IDirect3DMaterial, + public IDirect3DMaterial2, + public IDirect3DMaterial3 +{ +public: + CMaterialHook() + { + } + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CMaterialHook) + COM_INTERFACE_ENTRY_IID(IID_IDirect3DMaterial, IDirect3DMaterial) + COM_INTERFACE_ENTRY_IID(IID_IDirect3DMaterial2, IDirect3DMaterial2) + COM_INTERFACE_ENTRY_IID(IID_IDirect3DMaterial3, IDirect3DMaterial3) +END_COM_MAP() + + CComPtr< IDirect3DMaterial > m_pMaterial; + CComPtr< IDirect3DMaterial2 > m_pMaterial2; + CComPtr< IDirect3DMaterial3 > m_pMaterial3; + + D3DMATERIALHANDLE m_hMaterial; + + void setObject( IUnknown *pUnk, IDirect3DDevice2 *pDevice2, IDirect3DDevice3 *pDevice3 ) + { + pUnk->QueryInterface( IID_IDirect3DMaterial, reinterpret_cast< void ** >( &m_pMaterial ) ); + pUnk->QueryInterface( IID_IDirect3DMaterial2, reinterpret_cast< void ** >( &m_pMaterial2 ) ); + pUnk->QueryInterface( IID_IDirect3DMaterial3, reinterpret_cast< void ** >( &m_pMaterial3 ) ); + + if( pDevice2 != NULL ) + m_pMaterial2->GetHandle( pDevice2, &m_hMaterial ); + else if( pDevice3 != NULL ) + m_pMaterial3->GetHandle( pDevice3, &m_hMaterial ); + } + +// IMaterialHook +public: + + // Methods from IDirect3DMaterial + STDMETHOD(Initialize)(LPDIRECT3D p1) + { + CDirectDrawHook *pHook = static_cast< CDirectDrawHook * >( p1 ); + return m_pMaterial->Initialize( pHook->m_pD3D ); + } + + STDMETHOD(SetMaterial)(LPD3DMATERIAL p1) + { + return m_pMaterial->SetMaterial( p1 ); + } + + STDMETHOD(GetMaterial)(LPD3DMATERIAL p1) + { + return m_pMaterial->GetMaterial( p1 ); + } + + STDMETHOD(GetHandle)(LPDIRECT3DDEVICE p1,LPD3DMATERIALHANDLE p2) + { + *p2 = m_hMaterial; + return S_OK; + /* + CDirect3DHook *pHook = dynamic_cast< CDirect3DHook * >( p1 ); + if( pHook != NULL ) + return m_pMaterial->GetHandle( pHook->m_pDevice, p2 ); + return m_pMaterial->GetHandle( p1, p2 ); + */ + } + + STDMETHOD(Reserve)() + { + return m_pMaterial->Reserve(); + } + + STDMETHOD(Unreserve)() + { + return m_pMaterial->Unreserve(); + } + + // Methods from IDirect3DMaterial2 + STDMETHOD(GetHandle)(LPDIRECT3DDEVICE2 p1,LPD3DMATERIALHANDLE p2) + { + *p2 = m_hMaterial; + return S_OK; + /* + CDirect3DHook *pHook = dynamic_cast< CDirect3DHook * >( p1 ); + return m_pMaterial2->GetHandle( pHook->m_pDevice2, p2 ); + */ + } + + // Methods from IDirect3DMaterial3 + STDMETHOD(GetHandle)(LPDIRECT3DDEVICE3 p1,LPD3DMATERIALHANDLE p2) + { + *p2 = m_hMaterial; + return S_OK; + /* + CDirect3DHook *pHook = dynamic_cast< CDirect3DHook * >( p1 ); + return m_pMaterial3->GetHandle( pHook->m_pDevice3, p2 ); + */ + } +}; + +#endif //__MATERIALHOOK_H_ diff --git a/Native/Inject/Pager.cpp b/Native/Inject/Pager.cpp new file mode 100644 index 0000000..97f15e2 --- /dev/null +++ b/Native/Inject/Pager.cpp @@ -0,0 +1,215 @@ +// Pager.cpp : Implementation of cPager +#include "stdafx.h" +#include "Inject.h" +#include "Pager.h" + +///////////////////////////////////////////////////////////////////////////// +// cPager + +// The velocity of the scroll in pixels/sec +#define VELOCITY 500 + +void cPager::setupScroll( long nCommand, LPPOINT pptDest ) +{ + _ASSERTE( pptDest != NULL ); + + m_ptScrollFrom = m_ptCurrent; + m_dwTimeStart = ::timeGetTime(); + + m_ptScrollTo = *pptDest; + + // Figure out the time to completion + int dx = m_ptScrollTo.x - m_ptScrollFrom.x, + dy = m_ptScrollTo.y - m_ptScrollFrom.y; + + m_dwTimeEnd = m_dwTimeStart + static_cast< DWORD >( sqrt( static_cast< double >( dx * dx + dy * dy ) ) ) * 1000 / VELOCITY; + + // Clear command options + m_nCommand = nCommand; + m_bContinue = ( nCommand == 0 ) ? VARIANT_FALSE : VARIANT_TRUE; + + m_bScrolling = VARIANT_TRUE; +} + +void cPager::updatePosition() +{ + long nID; + m_pSite->get_ID( &nID ); + Fire_Change( nID, m_nCommand, m_ptCurrent.x, m_ptCurrent.y ); + + m_pSite->Invalidate(); +} + +void cPager::endScroll() +{ + if( m_bScrolling ) + { + m_bScrolling = VARIANT_FALSE; + m_ptCurrent = m_ptScrollTo; + } + + updatePosition(); + m_nCommand = 0; +} + +void cPager::onCreate() +{ + m_ptCurrent.x = 0; + m_ptCurrent.y = 0; + + m_dwTimeStart = 0; + m_dwTimeEnd = 0; + + m_bScrolling = VARIANT_FALSE; + m_bContinue = VARIANT_FALSE; + m_nCommand = 0; +} + +STDMETHODIMP cPager::ScrollTo(LPPOINT pVal) +{ + setupScroll( 0, pVal ); + + return S_OK; +} + +STDMETHODIMP cPager::get_Command(long *pVal) +{ + _ASSERTE( pVal != NULL ); + *pVal = m_nCommand; + + return S_OK; +} + +STDMETHODIMP cPager::put_Command(long nCommand) +{ + // ::MessageBox( NULL, _T( "cPager::SetCommand" ), _T( "Inject.dll" ), MB_OK ); + m_bContinue = VARIANT_TRUE; + + if( nCommand != m_nCommand ) + { + // Prompt the callback to get a destination + long nID; + m_pSite->get_ID( &nID ); + + POINT ptDest; + VARIANT_BOOL bContinue; + + bContinue = Fire_GetNextPosition( nID, nCommand, &ptDest.x, &ptDest.y ); + + if( !bContinue ) + endScroll(); + else + setupScroll( nCommand, &ptDest ); + } + + return S_OK; +} + +STDMETHODIMP cPager::FinishCommand() +{ + m_bContinue = VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP cPager::PreRender() +{ + if( !m_bScrolling ) + // No scrolling means no drawing + return S_OK; + + // Calculate the new position + DWORD dwTime = ::timeGetTime(); + + // We loop until we've used up our animation time + // so animations with short steps - a single frame + // may exceed a small step. + while( dwTime >= m_dwTimeEnd ) + { + long nCommand = m_nCommand; + endScroll(); + + // This section of the scroll is complete + if( !m_bContinue ) + { + _ASSERTMEM( _CrtCheckMemory( ) ); + return S_OK; + } + + // Check for a next destination + POINT ptDest; + + long nID; + m_pSite->get_ID( &nID ); + + VARIANT_BOOL bContinue = VARIANT_FALSE; + + bContinue = Fire_GetNextPosition( nID, nCommand, &ptDest.x, &ptDest.y ); + + if( bContinue ) + { + DWORD dwLastEnd = m_dwTimeEnd; + + // ::MessageBox( NULL, _T( "cPager::Render" ), _T( "Inject.dll" ), MB_OK ); + setupScroll( nCommand, &ptDest ); + + DWORD dwOver = m_dwTimeStart - dwLastEnd; + + // Adjust the time to eliminate the stutter for the next section + m_dwTimeStart -= dwOver; + m_dwTimeEnd -= dwOver; + } + else + { + _ASSERTMEM( _CrtCheckMemory( ) ); + return S_OK; + } + } + + // Do a time linear interpolation to figure out the current position + long nTotalTime = m_dwTimeEnd - m_dwTimeStart, + nCurrentTime = dwTime - m_dwTimeStart; + + m_ptCurrent.x = m_ptScrollFrom.x + ( m_ptScrollTo.x - m_ptScrollFrom.x ) * nCurrentTime / nTotalTime; + m_ptCurrent.y = m_ptScrollFrom.y + ( m_ptScrollTo.y - m_ptScrollFrom.y ) * nCurrentTime / nTotalTime; + + updatePosition(); + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cPager::AdjustRenderArea( ICanvas *pCanvas, VARIANT_BOOL *pbDrawChildren ) +{ + pCanvas->OffsetOrg( &m_ptCurrent, pbDrawChildren ); + + return S_OK; +} + +STDMETHODIMP cPager::get_Offset(LPPOINT pVal) +{ + _ASSERTE( pVal != NULL ); + *pVal = m_ptCurrent; + + return S_OK; +} + +STDMETHODIMP cPager::put_Offset(LPPOINT newVal) +{ + // Terminate scrolling + endScroll(); + m_ptCurrent = *newVal; + + // Dispatch changes + updatePosition(); + + return S_OK; +} + +STDMETHODIMP cPager::CreateClient(ILayer *pLayer) +{ + // TODO: Add your implementation code here + + return S_OK; +} diff --git a/Native/Inject/Pager.h b/Native/Inject/Pager.h new file mode 100644 index 0000000..52ec39c --- /dev/null +++ b/Native/Inject/Pager.h @@ -0,0 +1,79 @@ +// Pager.h : Declaration of the cPager + +#ifndef __PAGER_H_ +#define __PAGER_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "InjectCP.h" + +///////////////////////////////////////////////////////////////////////////// +// cPager +class ATL_NO_VTABLE cPager : + public CComObjectRootEx, + public CComCoClass, + public ILayerImpl< cPager >, + public ILayerRenderImpl, + public IControlImpl< cPager, IPager, &IID_IControl, &LIBID_DecalPlugins >, + public IProvideClassInfo2Impl< &CLSID_Pager, &DIID_IPagerEvents, &LIBID_DecalPlugins >, + public IConnectionPointContainerImpl, + public CProxyIPagerEvents< cPager > +{ +public: + cPager() + { + } + + POINT m_ptScrollFrom; + DWORD m_dwTimeStart; + + POINT m_ptScrollTo; + DWORD m_dwTimeEnd; + + POINT m_ptCurrent; + + long m_nCommand; + VARIANT_BOOL m_bContinue, m_bScrolling; + + void onCreate(); + +DECLARE_REGISTRY_RESOURCEID(IDR_PAGER) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cPager) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(IPager) + COM_INTERFACE_ENTRY(IControl) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cPager) +CONNECTION_POINT_ENTRY(DIID_IPagerEvents) +END_CONNECTION_POINT_MAP() + + void setupScroll( long dwCommand, LPPOINT pptDest ); + void updatePosition(); + void endScroll(); + +// IPager +public: + // IPager Methods + STDMETHOD(get_Command)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Command)(/*[in]*/ long newVal); + STDMETHOD(ScrollTo)(LPPOINT pVal); + STDMETHOD(FinishCommand)(); + STDMETHOD(get_Offset)(/*[out, retval]*/ LPPOINT pVal); + STDMETHOD(put_Offset)(/*[in]*/ LPPOINT newVal); + STDMETHOD(CreateClient)(ILayer *pLayer); + + // ILayerRenderMethods + STDMETHOD(PreRender)(); + STDMETHOD(AdjustRenderArea)( ICanvas *pCanvas, VARIANT_BOOL *pbDrawChildren ); +}; + +#endif //__PAGER_H_ diff --git a/Native/Inject/Pager.rgs b/Native/Inject/Pager.rgs new file mode 100644 index 0000000..3ffe0db --- /dev/null +++ b/Native/Inject/Pager.rgs @@ -0,0 +1,25 @@ +HKCR +{ + DecalControls.Pager.1 = s 'DecalControls Pager' + { + CLSID = s '{C79E2F76-06F8-4cd0-A613-4829237D297D}' + } + DecalControls.Pager = s 'DecalControls Pager' + { + CLSID = s '{C79E2F76-06F8-4cd0-A613-4829237D297D}' + CurVer = s 'DecalControls.Pager.1' + } + NoRemove CLSID + { + ForceRemove {C79E2F76-06F8-4cd0-A613-4829237D297D} = s 'DecalControls Pager' + { + ProgID = s 'DecalControls.Pager.1' + VersionIndependentProgID = s 'DecalControls.Pager' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/Inject/Panel.cpp b/Native/Inject/Panel.cpp new file mode 100644 index 0000000..342c4e9 --- /dev/null +++ b/Native/Inject/Panel.cpp @@ -0,0 +1,647 @@ +// Panel.cpp : Implementation of cPanel +#include "stdafx.h" +#include "Inject.h" +#include "Panel.h" +#include "Manager.h" +///////////////////////////////////////////////////////////////////////////// +// cPanel + +enum ePanelChildren +{ + eViewFirst = 1000 +}; + +cPanel::cPanel() +: m_nActiveView( -1 ), +m_bDragging( false ), +m_bSizingXL( false ), +m_bSizingXR( false ), +m_bSizingYT( false ), +m_bSizingYB( false ), +m_bTransparent( false ), +m_pcView( NULL ), +m_Alpha( 255 ) +{ +} + +void cPanel::hideView() +{ + m_pSite->Invalidate(); + + if( m_nActiveView == -1 ) + // No active view currently + return; + + CComPtr< ILayerSite > pActive; + m_pSite->get_Child( m_nActiveView, ePositionByID, &pActive ); + + static RECT rcHide = { 0, 0, 0, 0 }; + pActive->put_Position( &rcHide ); + + if( m_pSink.p != NULL ) + m_pSink->PanelDeactivate( m_nActiveView ); + + m_nActiveView = -1; +} + +void cPanel::onCreate() +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->LoadBitmapPortal( 0x0600126F, &m_pBackground ); + pPlugin->LoadBitmapPortal( 0x06001277, &m_pBorder ); + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 15, eFontBold, &m_pTitle ); + + // Create the Button + CComPtr< IButton > pRollup; + + HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_IButton, + reinterpret_cast< void ** >( &pRollup ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + CComPtr< ILayer > pBtnLayer; + pRollup->QueryInterface( &pBtnLayer ); + + LayerParams lp = { 1, { 180 - 16, 0, 180, 16 }, eRenderClipped }; + m_pSite->CreateChild( &lp, pBtnLayer ); + + pRollup->put_Matte( RGB( 0, 0, 0 ) ); + pRollup->SetImages( 0, 0x0600113C, 0x0600113B ); + ICommandEventsImpl< BUTTON_CLOSE, cPanel >::advise( pRollup ); + + // Create the Increment Button + hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_IButton, + reinterpret_cast< void ** >( &m_pButtonInc ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + CComPtr< ILayer > pBtnIncLayer; + m_pButtonInc->QueryInterface( &pBtnIncLayer ); + + LayerParams lpInc = { 2, { 180 - 32, 0, 180 - 32 + 16, 16 }, eRenderClipped }; + m_pSite->CreateChild( &lpInc, pBtnIncLayer ); + + m_pButtonInc->put_Matte( RGB( 0, 0, 0 ) ); + m_pButtonInc->SetImages( 0, 0x06001298, 0x06001299 ); + + ICommandEventsImpl< BUTTON_INC, cPanel >::advise( m_pButtonInc ); + + // Create the Decrement Button + hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_IButton, + reinterpret_cast< void ** >( &m_pButtonDec ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + CComPtr< ILayer > pBtnDecLayer; + m_pButtonDec->QueryInterface( &pBtnDecLayer ); + + LayerParams lpDec = { 3, { 180 - 48, 0, 180 - 48 + 16, 16 }, eRenderClipped }; + m_pSite->CreateChild( &lpDec, pBtnDecLayer ); + + m_pButtonDec->put_Matte( RGB( 0, 0, 0 ) ); + m_pButtonDec->SetImages( 0, 0x06001295, 0x06001296 ); + + ICommandEventsImpl< BUTTON_DEC, cPanel >::advise( m_pButtonDec ); + + // Set this layer not transparent to be transparent + m_pSite->put_Transparent( VARIANT_FALSE ); + + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) ); + + if(key.QueryDWORDValue("ViewAlpha", m_Alpha) != ERROR_SUCCESS) + m_Alpha = 255; +} + +void cPanel::onDestroy() +{ + m_pBorder.Release(); + m_pBackground.Release(); + m_pTitle.Release(); + m_pButtonInc.Release(); + m_pButtonDec.Release(); +} + +STDMETHODIMP cPanel::Render( ICanvas *pCanvas ) +{ + RECT rc; + m_pSite->get_Position( &rc ); + + SIZE szBorder; + m_pBorder->get_Size( &szBorder ); + + // Draw the background + RECT rc_pat = { 0, 0, rc.right - rc.left, rc.bottom - rc.top }; + static POINT pt_pat = { 0, 0 }; + + if( ! m_bTransparent ) + m_pBackground->PatBlt( pCanvas, &rc_pat, &pt_pat ); + + // Draw the borders + RECT rc_border_top = { 0, 0, rc.right - rc.left, szBorder.cy }, + rc_border_bottom = { 0, rc.bottom - rc.top - szBorder.cy, + rc.right - rc.left, rc.bottom - rc.top }; + + pCanvas->Fill( &rc_border_top, RGB( 0, 0, 0 ) ); + m_pBorder->PatBlt( pCanvas, &rc_border_top, &pt_pat ); + pCanvas->Fill( &rc_border_bottom, RGB( 0, 0, 0 ) ); + m_pBorder->PatBlt( pCanvas, &rc_border_bottom, &pt_pat ); + + // Draw the title text + if( _bstr_t(m_pVP->label).length() > 0 ) + { + POINT ptText = { 24, szBorder.cy + 5 }; + m_pTitle->DrawText( &ptText, m_pVP->label, 0, pCanvas ); + } + + if( m_pVP->icon != 0 ) + { + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + CComPtr< IIconCache > pIconCache; + static SIZE szIcon = { 16, 16 }; + pPlugin->GetIconCache( &szIcon, &pIconCache ); + + static POINT pt = { 4, szBorder.cy + 4 }; + pIconCache->DrawIcon( &pt, m_pVP->icon, m_pVP->iconLibrary, pCanvas ); + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cPanel::Reformat() +{ + // Reset the size + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + SIZE szScreen; + pPlugin->GetScreenSize( &szScreen ); + + RECT rc = { m_pVP->left, m_pVP->top, m_pVP->left + m_pVP->width, m_pVP->top + m_pVP->height }; + + m_pSite->put_Position( &rc ); + + RECT rcCloseBtn = { m_pVP->width - 16, 0, m_pVP->width, 16 }; + CComPtr< ILayerSite > pCloseBtnLS; + m_pSite->get_Child(1, ePositionByID, &pCloseBtnLS); + + pCloseBtnLS->put_Position(&rcCloseBtn); + + RECT rcIncBtn = { m_pVP->width - 32, 0, m_pVP->width - 32 + 16, 16 }; + CComPtr< ILayerSite > pButtonInc; + m_pSite->get_Child(2, ePositionByID, &pButtonInc); + pButtonInc->put_Position( &rcIncBtn ); + + RECT rcDecBtn = { m_pVP->width - 48, 0, m_pVP->width - 48 + 16, 16 }; + CComPtr< ILayerSite > pButtonDec; + m_pSite->get_Child(3, ePositionByID, &pButtonDec); + pButtonDec->put_Position( &rcDecBtn ); + + if( m_nActiveView != -1 ) + { + // Position the active view + SIZE szBorder; + m_pBorder->get_Size( &szBorder ); + + CComPtr< ILayerSite > pActive; + m_pSite->get_Child( m_nActiveView, ePositionByID, &pActive ); + + RECT rcChild = { 0, 24 + szBorder.cy, m_pVP->width, m_pVP->height - szBorder.cy }; + pActive->put_Position( &rcChild ); + } + + return S_OK; +} + +STDMETHODIMP cPanel::AddView(long nViewID, ILayer *pLayer) +{ + _ASSERTE( pLayer != NULL ); + + LayerParams p = { nViewID, { 0, 0, 0, 0 }, eRenderClipped }; + + // Set up the layer - note that it is not visible + return m_pSite->CreateChild( &p, pLayer ); +} + +STDMETHODIMP cPanel::ActivateView(long nViewID, ViewParams *pParams, long *pView) +{ + // Hide the current view by resizing to 0,0 + hideView(); + + m_pVP = pParams; + + m_pcView = (cView*)pView; + + VARIANT_BOOL isTransparent=VARIANT_FALSE ; + if (m_pcView) m_pcView->get_Transparent(&isTransparent) ; + put_Transparent(isTransparent) ; + + if( m_pVP->alpha == -1 ) + m_pSite->put_Alpha( m_Alpha ); + else + m_pSite->put_Alpha( m_pVP->alpha ); + + +#ifdef _DEBUG + // Make sure the child exists + CComPtr< ILayerSite > pChildSite; + _ASSERTE( SUCCEEDED( m_pSite->get_Child( nViewID, ePositionByID, &pChildSite ) ) ); +#endif + + // Locate the child + m_nActiveView = nViewID; + + // Trick it into reformatting next frame + static RECT rcBig = { 0, 0, 1, 1 }; + m_pSite->put_Position( &rcBig ); + + // Pop us to the front + m_pSite->moveToFront(); + + return S_OK; +} + +STDMETHODIMP cPanel::RemoveView( long nViewID ) +{ + if( nViewID == m_nActiveView ) + // If this is the current view, run and hide + Deactivate(); + + CComPtr< ILayerSite > pChildSite; + HRESULT hRes = m_pSite->get_Child( nViewID, ePositionByID, &pChildSite ); + _ASSERTE( SUCCEEDED( hRes ) ); + if( SUCCEEDED( hRes ) ) + pChildSite->Destroy(); + else + return E_FAIL; + + return S_OK; +} + +void cPanel::onCloseAccepted(long nID) +{ + // We should only be getting commands from the button + _ASSERTE( nID == 1 ); + + Deactivate(); +} + +void cPanel::onAlphaInc(long nID) +{ + // We should only be getting commands from the button + _ASSERTE( nID == 2 ); + + if(m_pVP->alpha == -1 ) + { + m_pVP->alpha = m_Alpha + 5; + m_pSite->put_Alpha( m_pVP->alpha ); + } + else + { + m_pVP->alpha += 5; + + if( m_pVP->alpha > 255 ) + m_pVP->alpha = 255; + + m_pSite->put_Alpha( m_pVP->alpha ); + } +} + +void cPanel::onAlphaDec(long nID) +{ + // We should only be getting commands from the button + _ASSERTE( nID == 3 ); + + if(m_pVP->alpha == -1 ) + { + m_pVP->alpha = m_Alpha - 5; + m_pSite->put_Alpha( m_pVP->alpha ); + } + else + { + m_pVP->alpha -= 5; + + if( m_pVP->alpha < 0 ) + m_pVP->alpha = 0; + + m_pSite->put_Alpha( m_pVP->alpha ); + } +} + +STDMETHODIMP cPanel::get_ActiveView(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nActiveView; + + return S_OK; +} + +STDMETHODIMP cPanel::LoadView(long nViewID, IView *pView, IUnknown *pSchema) +{ + _ASSERTE( pView != NULL ); + _ASSERTE( pSchema != NULL ); + + long nAssigned; + + // Set up the layer - note that it is not visible + return pView->LoadControl( m_pSite, nViewID, pSchema, &nAssigned ); +} + +STDMETHODIMP cPanel::LoadViewEx(long nViewID, IView *pView, IUnknown *pSchema, long lViewFlags) +{ + _ASSERTE( pView != NULL ); + _ASSERTE( pSchema != NULL ); + + long nAssigned; + + if( lViewFlags & eTransparent ) + m_bTransparent = true; + + // Set up the layer - note that it is not visible + return pView->LoadControl( m_pSite, nViewID, pSchema, &nAssigned ); +} + +STDMETHODIMP cPanel::Deactivate() +{ + if( m_nActiveView == -1 ) + // No active view currently + return S_OK; + + // Hide the current view by resizing to 0,0 + hideView(); + + // Hide the entire panel + static RECT rcHide = { 0, 0, 0, 0 }; + m_pSite->put_Position( &rcHide ); + + m_nActiveView = -1; + + return S_OK; +} + +STDMETHODIMP cPanel::putref_Sink(IPanelSink *newVal) +{ + m_pSink = newVal; + + return S_OK; +} + +STDMETHODIMP cPanel::MouseEvent(long nMsg, long wParam, long lParam) +{ + static RECT rcTemp; + static SIZE size; + + switch(nMsg) + { + case WM_LBUTTONDOWN: + { + + // Pop us to the front + m_pSite->moveToFront(); + + SIZE szBorder; + m_pBorder->get_Size( &szBorder ); + + POINTS ptm; + ptm = MAKEPOINTS(lParam); + + if( !cManager::_p->m_bContainer ) + ptm.y-=28; + + if((ptm.x>=m_pVP->left+szBorder.cy) && (ptm.x<=m_pVP->left+m_pVP->width-szBorder.cy) && (ptm.y>=m_pVP->top+szBorder.cy) && (ptm.y<=m_pVP->top+28)) + { + m_DeltaX = ptm.x-m_pVP->left; + m_DeltaY = ptm.y-m_pVP->top; + m_bDragging = true; + } + else + { + if(m_pcView->Fire_Size()==VARIANT_TRUE) + { + if((ptm.x>=m_pVP->left) && (ptm.x<=m_pVP->left+m_pVP->width)) + { + if((ptm.y>=m_pVP->top) && (ptm.y<=m_pVP->top+szBorder.cy)) + { + m_bSizingYT = true; + m_DeltaY = ptm.y-m_pVP->top; + } else if((ptm.y>=m_pVP->top+m_pVP->height-szBorder.cy) && (ptm.y<=m_pVP->top+m_pVP->height)) + { + m_bSizingYB = true; + m_DeltaY = m_pVP->top+m_pVP->height-ptm.y; + } + } + + if((ptm.y>=m_pVP->top) && (ptm.y<=m_pVP->top+m_pVP->height)) + { + if((ptm.x>=m_pVP->left) && (ptm.x<=m_pVP->left+szBorder.cy)) + { + m_bSizingXL = true; + m_DeltaX = ptm.x-m_pVP->left; + } else if((ptm.x>=m_pVP->left+m_pVP->width-szBorder.cy) && (ptm.x<=m_pVP->left+m_pVP->width)) + { + m_bSizingXR = true; + m_DeltaX = m_pVP->left+m_pVP->width-ptm.x; + } + } + } + } + break; + } + + case WM_LBUTTONUP: + { + m_bDragging = m_bSizingXL = m_bSizingXR = m_bSizingYT = m_bSizingYB = false; + break; + } + + case WM_MOUSEMOVE: + { + if(wParam==MK_LBUTTON) + { + bool bUpdate = false; + POINTS ptm; + ptm = MAKEPOINTS(lParam); + + if( !cManager::_p->m_bContainer ) + ptm.y-=28; + + if(m_bDragging) + { + m_pVP->left = ptm.x-m_DeltaX; + m_pVP->top = ptm.y-m_DeltaY; + + /* Drakier: make sure they aren't being bad little kittens and + moving the view offscreen! */ + // Drakier: Get the pSite and Screen Size + + CComPtr< IPluginSite > pPlugin; + CComPtr< IACHooks > pHooks; + m_pSite->get_PluginSite( &pPlugin ); + + SIZE szScreen, sz; + pPlugin->GetScreenSize( &sz ); + szScreen.cx = sz.cx; + szScreen.cy = sz.cy; + + long lX = sz.cx, lY = sz.cy; + + // Drakier: if we are not in the container, get the 3D Area + if ( !cManager::_p->m_bContainer ) + { + pPlugin->get_Hooks( &pHooks ); + pHooks->get_Area3DHeight( &lY ); + pHooks->get_Area3DWidth( &lX ); + pHooks.Release(); + } + pPlugin.Release(); + + // Drakier: if we are in the container, or the 3D area's are NULL + if ( (cManager::_p->m_bContainer) || (&lX == NULL) || (&lY == NULL) ) + { + szScreen.cx = sz.cx - 308; // 308 = PANEL_SIZE + szScreen.cy = sz.cy; + } + else // Drakier: If everything comes out right and we are not in container + { + if( (&lX != NULL) && (lX > 0) && (lX < 5000) ) + szScreen.cx = lX; + if( (&lY != NULL) && (lY > 0) && (lY < 5000) ) + szScreen.cy = lY; + } + + if ( m_pVP->left < 0 ) + m_pVP->left = 0; + if ( m_pVP->top < 0 ) + m_pVP->top = 0; + if ( (m_pVP->left + m_pVP->width) > szScreen.cx ) + m_pVP->left = szScreen.cx - m_pVP->width; + if ( (m_pVP->top + m_pVP->height) > szScreen.cy ) + m_pVP->top = szScreen.cy - m_pVP->height; + + bUpdate = true; + } + else + { + if(m_bSizingYT) + { + rcTemp.bottom = m_pVP->height + m_pVP->top - (ptm.y-m_DeltaY); + rcTemp.top = ptm.y-m_DeltaY; + + if(rcTemp.bottom > 34) + { + m_pVP->height = rcTemp.bottom; + m_pVP->top = rcTemp.top; + } + else + { + m_pVP->top = (m_pVP->top + m_pVP->height) - 34; + m_pVP->height = 34; + } + + bUpdate = true; + } + else if(m_bSizingYB) + { + rcTemp.bottom = ptm.y-m_pVP->top+m_DeltaY; + + if(rcTemp.bottom > 34) + m_pVP->height = rcTemp.bottom; + else + m_pVP->height = 34; + + bUpdate = true; + } + + if(m_bSizingXL) + { + rcTemp.right = m_pVP->width + m_pVP->left - (ptm.x-m_DeltaX); + rcTemp.left = ptm.x-m_DeltaX; + + m_pTitle->MeasureText(m_pVP->label, &size); + + if(rcTemp.right > size.cx + 48) + { + m_pVP->width = rcTemp.right; + m_pVP->left = rcTemp.left; + } + else + { + m_pVP->left = (m_pVP->left + m_pVP->width) - (size.cx + 48); + m_pVP->width = size.cx+48; + } + + bUpdate = true; + } + else if(m_bSizingXR) + { + rcTemp.right = ptm.x-m_pVP->left+m_DeltaX; + + m_pTitle->MeasureText(m_pVP->label, &size); + + if(rcTemp.right > size.cx + 48) + m_pVP->width = rcTemp.right; + else + m_pVP->width = size.cx + 48; + + bUpdate = true; + } + } + + if(bUpdate) + { + if(!m_bDragging) + { + //RECT rc = { m_pcView->m_VP.left, m_pcView->m_VP.top, m_pcView->m_VP.width, m_pcView->m_VP.height }; + m_pcView->Fire_Sizing(/*m_pcView*//*&m_pcView->m_VP*//*m_pcView->m_VP.left, m_pcView->m_VP.top,*/ 0, 0, m_pcView->m_VP.width, m_pcView->m_VP.height-34); + } + static RECT rcBig = { 0, 0, 1, 1 }; + m_pSite->put_Position( &rcBig ); + } + } + break; + } + } + return S_OK; +} + +STDMETHODIMP cPanel::get_Transparent(VARIANT_BOOL *pVal) +{ + *pVal = ( m_bTransparent ? VARIANT_TRUE : VARIANT_FALSE ); + return S_OK; +} + +STDMETHODIMP cPanel::put_Transparent(VARIANT_BOOL newVal) +{ + if( newVal == VARIANT_FALSE ) + m_bTransparent = false; + else + m_bTransparent = true; + + if( m_pVP->alpha == -1 ) + m_pSite->put_Alpha( m_Alpha ); + else + m_pSite->put_Alpha( m_pVP->alpha ); + + m_pSite->Invalidate(); + m_pSite->Reformat(); + + return S_OK; +} + +STDMETHODIMP cPanel::put_Params(ViewParams *newVal) +{ + if( newVal == NULL ) + return E_POINTER; + + m_pVP = newVal; + return S_OK; +} diff --git a/Native/Inject/Panel.h b/Native/Inject/Panel.h new file mode 100644 index 0000000..1cd62f3 --- /dev/null +++ b/Native/Inject/Panel.h @@ -0,0 +1,100 @@ +// Panel.h : Declaration of the cPanel + +#ifndef __PANEL_H_ +#define __PANEL_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" +#include "View.h" + +#define BUTTON_CLOSE 1 +#define BUTTON_INC 2 +#define BUTTON_DEC 3 + +///////////////////////////////////////////////////////////////////////////// +// cPanel +class ATL_NO_VTABLE cPanel : + public CComObjectRootEx, + public ILayerRenderImpl, + public ILayerImpl< cPanel >, + public ILayerMouseImpl, + public ICommandEventsImpl< BUTTON_CLOSE, cPanel >, + public ICommandEventsImpl< BUTTON_INC, cPanel >, + public ICommandEventsImpl< BUTTON_DEC, cPanel >, + public cNoEventsImpl, + public IPanel +{ +public: + cPanel(); + + long m_nActiveView; + + CComPtr< IImageCache > m_pBorder; + CComPtr< IImageCache > m_pBackground; + CComPtr< IFontCache > m_pTitle; + CComPtr< IPanelSink > m_pSink; + CComPtr< IButton > m_pButtonInc; + CComPtr< IButton > m_pButtonDec; + + ViewParams* m_pVP; + cView* m_pcView; + + DWORD m_Alpha; + + long m_DeltaX; + long m_DeltaY; + + bool m_bDragging; + bool m_bSizingXL; + bool m_bSizingXR; + bool m_bSizingYT; + bool m_bSizingYB; + bool m_bTransparent; + + void hideView(); + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cPanel) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(IPanel) + COM_INTERFACE_ENTRY(ILayerMouse) +END_COM_MAP() + +BEGIN_SINK_MAP( cPanel ) + SINK_ENTRY_EX( BUTTON_CLOSE, DIID_ICommandEvents, DISPID_ACCEPTED, onCloseAccepted ) + SINK_ENTRY_EX( BUTTON_INC, DIID_ICommandEvents, DISPID_ACCEPTED, onAlphaInc ) + SINK_ENTRY_EX( BUTTON_DEC, DIID_ICommandEvents, DISPID_ACCEPTED, onAlphaDec ) +END_SINK_MAP() + +// IPanel +public: + STDMETHOD(LoadView)(long nPlugin, IView *pView, IUnknown *pSchema); + STDMETHOD(LoadViewEx)(long nPlugin, IView *pView, IUnknown *pSchema, long lViewFlags); + STDMETHOD(get_ActiveView)(/*[out, retval]*/ long *pVal); + STDMETHOD(AddView)(long nPluginID, ILayer *pLayer); + STDMETHOD(RemoveView)(long nID); + STDMETHOD(ActivateView)(long nViewID, ViewParams *pParams, long *pVal); + STDMETHOD(Deactivate)(); + STDMETHOD(putref_Sink)(/*[in]*/ IPanelSink* newVal); + STDMETHOD(get_Transparent)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Transparent)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(put_Params)(ViewParams *Params); + + // ILayerRender Methods + STDMETHOD(Render)(ICanvas *); + STDMETHOD(Reformat)(); + + // ICommandEvents Methods + void __stdcall onCloseAccepted(long nID); + void __stdcall onAlphaInc(long nID); + void __stdcall onAlphaDec(long nID); + + // ILayerMouse Methods + STDMETHOD(MouseEvent)(long nMsg, long wParam, long lParam); +}; + +#endif //__PANEL_H_ diff --git a/Native/Inject/Plugin2Impl.h b/Native/Inject/Plugin2Impl.h new file mode 100644 index 0000000..a5b93d1 --- /dev/null +++ b/Native/Inject/Plugin2Impl.h @@ -0,0 +1,58 @@ +// Plugin2Impl.h +// +// Declaration of helper class for implementing type 2 plugins + +#ifndef _PLUGIN2IMPL_H_ +#define _PLUGIN2IMPL_H_ + +template class IPlugin2Impl : public IPlugin2 +{ +public: + CComPtr m_pSite; + CComPtr m_pSite2; + CComPtr m_pDecal; + + virtual HRESULT onInitialize() = 0; + virtual HRESULT onTerminate() = 0; + + STDMETHOD(Initialize)(IPluginSite2 *pSite2) + { + HRESULT hRes; + + // Store the Type 2 (Decal) Plugin Site + m_pSite2 = pSite2; + + // Get Decal from Type 2 Plugin Site + hRes = m_pSite2->get_Decal(&m_pDecal); + if (!SUCCEEDED(hRes)) + return hRes; + + // Get Type 1 (Inject) Plugin Site + hRes = m_pDecal->get_Object(_bstr_t("services\\DecalPlugins.InjectService\\site"), + __uuidof(IPluginSite), reinterpret_cast (&m_pSite)); + if (!SUCCEEDED(hRes)) + return hRes; + + // Initialize things + hRes = static_cast(this)->onInitialize(); + + return hRes; + } + + STDMETHOD(Terminate)() + { + HRESULT hRes; + + // Terminate the works + hRes = static_cast(this)->onTerminate(); + + // Release the elements + m_pSite.Release(); + m_pDecal.Release(); + m_pSite2.Release(); + + return hRes; + } +}; + +#endif // _PLUGIN2IMPL_H_ diff --git a/Native/Inject/PluginAdapterV1.cpp b/Native/Inject/PluginAdapterV1.cpp new file mode 100644 index 0000000..9fcd051 --- /dev/null +++ b/Native/Inject/PluginAdapterV1.cpp @@ -0,0 +1,74 @@ +// PluginAdapterV1.cpp : Implementation of cPluginAdapterV1 +#include "stdafx.h" +#include "Inject.h" +#include "PluginAdapterV1.h" + +#include "Manager.h" + +///////////////////////////////////////////////////////////////////////////// +// cPluginAdapterV1 + +STDMETHODIMP cPluginAdapterV1::Initialize(IPluginSite2 *pSite2) +{ + // First retreive the Inject service + CComPtr< IDecal > pDecal; + pSite2->get_Decal ( &pDecal ); + + CComPtr< IInjectService > pInject; + HRESULT hRes = pDecal->get_Object ( _bstr_t ( _T( "services\\DecalPlugins.InjectService" ) ), + __uuidof ( IInjectService ), reinterpret_cast< LPVOID * > ( &pInject ) ); + + if ( FAILED ( hRes ) ) + return hRes; + + // Try to initialize our plugin + CComPtr< IPlugin > pPlugin; + hRes = m_pUnkPlugin->QueryInterface ( &pPlugin ); + if ( FAILED ( hRes ) ) + return hRes; + + CComPtr< IPluginSite > pSite; + pInject->get_Site ( &pSite ); + + try + { + pPlugin->Initialize ( pSite, 0 ); + } + catch ( ... ) + { + return E_FAIL; + } + + pInject->InitPlugin ( m_pUnkPlugin ); + + // Store the site if everything is OK + m_pSite2 = pSite2; + return S_OK; +} + +STDMETHODIMP cPluginAdapterV1::Terminate() +{ + CComPtr< IPlugin > pPlugin; + + if ( SUCCEEDED ( m_pUnkPlugin->QueryInterface ( &pPlugin ) ) ) + pPlugin->Terminate (); + + m_pUnkPlugin.Release (); + m_pSite2.Release (); + + return S_OK; +} + +STDMETHODIMP cPluginAdapterV1::CreateInstance(IDecalEnum *pEnum, REFIID riid, LPVOID *ppvItf) +{ + CLSID clsidV1; + HRESULT hRes = pEnum->get_ComClass ( &clsidV1 ); + if ( FAILED( hRes ) ) + return hRes; + + hRes = ::CoCreateInstance ( clsidV1, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, reinterpret_cast< LPVOID * > ( &m_pUnkPlugin ) ); + if ( FAILED ( hRes ) ) + return hRes; + + return static_cast< IDecalSurrogate * > ( this )->QueryInterface ( riid, ppvItf ); +} diff --git a/Native/Inject/PluginAdapterV1.h b/Native/Inject/PluginAdapterV1.h new file mode 100644 index 0000000..528a60a --- /dev/null +++ b/Native/Inject/PluginAdapterV1.h @@ -0,0 +1,48 @@ +// PluginAdapterV1.h : Declaration of the cPluginAdapterV1 + +#ifndef __PLUGINADAPTERV1_H_ +#define __PLUGINADAPTERV1_H_ + +#include "resource.h" // main symbols +#include + +///////////////////////////////////////////////////////////////////////////// +// cPluginAdapterV1 +class ATL_NO_VTABLE cPluginAdapterV1 : + public CComObjectRootEx, + public CComCoClass, + public IPluginAdapterV1, + public IPlugin2, + public IDecalSurrogate +{ +public: + cPluginAdapterV1() + { + } + + CComPtr m_pSite2; + CComPtr m_pUnkPlugin; + +DECLARE_REGISTRY_RESOURCEID(IDR_PLUGINADAPTERV1) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cPluginAdapterV1) + COM_INTERFACE_ENTRY(IDecalSurrogate) + COM_INTERFACE_ENTRY(IPlugin2) + COM_INTERFACE_ENTRY(IPluginAdapterV1) + COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_pUnkPlugin.p) +END_COM_MAP() + +// IPluginAdapterV1 +public: + + // IPlugin2 + STDMETHOD(Initialize)(IPluginSite2 *pSite2); + STDMETHOD(Terminate)(); + + // IDecalSurrogate + STDMETHOD(CreateInstance)(IDecalEnum *pEnum, REFIID riid, LPVOID *ppvItf); +}; + +#endif //__PLUGINADAPTERV1_H_ diff --git a/Native/Inject/PluginAdapterV1.rgs b/Native/Inject/PluginAdapterV1.rgs new file mode 100644 index 0000000..db71fc7 --- /dev/null +++ b/Native/Inject/PluginAdapterV1.rgs @@ -0,0 +1,42 @@ +HKCR +{ + Decal.PluginAdapterV1.1 = s 'Version 1 Plugin Surrogate' + { + CLSID = s '{3D837F6E-B5CA-4604-885F-7AB45FCFA62A}' + } + Decal.PluginAdapterV1 = s 'Version 1 Plugin Surrogate' + { + CLSID = s '{3D837F6E-B5CA-4604-885F-7AB45FCFA62A}' + CurVer = s 'Decal.PluginAdapterV1.1' + } + NoRemove CLSID + { + ForceRemove {3D837F6E-B5CA-4604-885F-7AB45FCFA62A} = s 'Version 1 Plugin Surrogate' + { + ProgID = s 'Decal.PluginAdapterV1.1' + VersionIndependentProgID = s 'Decal.PluginAdapterV1' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{FF7F5F6D-34E0-4B6F-B3BB-8141DE2EF732}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Surrogates + { + ForceRemove {3D837F6E-B5CA-4604-885F-7AB45FCFA62A} = s 'Version 1 Plugin Surrogate' + { + val Enabled = d '1' + } + } + } + } +} diff --git a/Native/Inject/PluginImpl.h b/Native/Inject/PluginImpl.h new file mode 100644 index 0000000..d8a8639 --- /dev/null +++ b/Native/Inject/PluginImpl.h @@ -0,0 +1,60 @@ +// PluginImpl.h +// Declaration of helper class for implementing plugins + +#ifndef __PLUGINIMPL_H +#define __PLUGINIMPL_H + +template< class cImpl > +class IPluginImpl +: public IPlugin +{ +public: + CComPtr< IPluginSite > m_pSite; + + void onInitialize() + { + } + + void onTerminate() + { + } + + static LPCTSTR name() + { + // You must implement this function in the derived class + _ASSERTE( FALSE ); + + return _T( "ERROR: " ); + } + + STDMETHOD(Initialize)( IPluginSite *pSite, long nID ) + { + m_pSite = pSite; + + static_cast< cImpl * >( this )->onInitialize(); + + return S_OK; + } + + STDMETHOD(Terminate)() + { + static_cast< cImpl * >( this )->onTerminate(); + + m_pSite.Release(); + + return S_OK; + } + + STDMETHOD(get_FriendlyName)( BSTR *pbstrName ) + { + _ASSERTE( pbstrName != NULL ); + + *pbstrName = T2BSTR( cImpl::name() ); + return S_OK; + } +}; + +// Included here for backward compatibility +#include + +#endif // __PLUGINIMPL_H diff --git a/Native/Inject/RootLayer.cpp b/Native/Inject/RootLayer.cpp new file mode 100644 index 0000000..078cafb --- /dev/null +++ b/Native/Inject/RootLayer.cpp @@ -0,0 +1,251 @@ +// RootLayer.cpp : Implementation of cRootLayer +#include "stdafx.h" +#include "Inject.h" +#include "RootLayer.h" +#include "Manager.h" +#include "BarLayer.h" +#include "Panel.h" +#include "View.h" + +enum eChildIDs +{ + eChildBars, + eChildPanel +}; + +///////////////////////////////////////////////////////////////////////////// +// cRootLayer + +void cRootLayer::addView( cView *pView, ILayer *pRoot ) +{ + m_views.push_back( pView ); + + // Next, make the bar entry + m_pBars->AddBar( pView->m_nViewID, &pView->m_VP ); + + // Last, make the view entry + pView->m_pPanel->AddView( pView->m_nViewID, pRoot ); +} + +void cRootLayer::removeView( cView *pView ) +{ + for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i ) + { + if( *i == pView ) + { + m_views.erase( i ); + break; + } + } +} + +void cRootLayer::onCreate() +{ + LayerParams lpBars = { eChildBars, { 0, 0, 1, 1 }, 0 }; + + CComObject< cBarLayer > *pBars; + CComObject< cBarLayer >::CreateInstance( &pBars ); + + m_pBars = pBars; + + m_pSite->CreateChild( &lpBars, pBars ); + + if( m_nViewMode == 0 ) // Single Mode + { + LayerParams lpPanel = { eChildPanel, { 0, 0, 0, 0 }, 0 }; + + CComObject< cPanel > *pPanel; + CComObject< cPanel >::CreateInstance( &pPanel ); + + m_pSite->CreateChild( &lpPanel, pPanel ); + pPanel->putref_Sink( this ); + + m_pPanel = pPanel; + } +} + +void cRootLayer::onDestroy() +{ + m_pBars.Release(); +} + +STDMETHODIMP cRootLayer::CreateView(ViewParams *pParams, ILayer *pLayer, IView **ppView) +{ + // First create the view object + CComObject< cView > *pView; + CComObject< cView >::CreateInstance( &pView ); + + if( m_nViewMode == 1 ) // Multi Mode + { + LayerParams lpPanel = { m_nNextViewID, { 0, 0, 0, 0 }, 0 }; + + CComObject< cPanel > *pPanel; + CComObject< cPanel >::CreateInstance( &pPanel ); + + m_pSite->CreateChild( &lpPanel, pPanel ); + + pPanel->putref_Sink( this ); + pView->m_pPanel = pPanel; + } + else + pView->m_pPanel = m_pPanel; + + pView->m_pRoot = this; + pView->m_nViewID = m_nNextViewID ++; + pView->m_VP.label = _bstr_t(pParams->label).copy(); + pView->m_VP.icon = pParams->icon; + pView->m_VP.iconLibrary = pParams->iconLibrary; + pView->m_VP.left = pParams->left; + pView->m_VP.top = pParams->top; + pView->m_VP.width = pParams->width; + pView->m_VP.height = pParams->height; + + addView( pView, pLayer ); + + *ppView = pView; + pView->AddRef(); + + return S_OK; +} + +STDMETHODIMP cRootLayer::SelectBar(long nID) +{ +// We are given the Bar ID, find the matching view + for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i ) + { + if( ( *i )->m_nViewID == nID ) + { + long nPrevActive; + ( *i )->m_pPanel->get_ActiveView( &nPrevActive ); + + if( nPrevActive != nID ) + { + ( *i )->m_pPanel->ActivateView( ( *i )->m_nViewID, & (*i)->m_VP, (long*)(*i)); + + ( *i )->Fire_Activate(); + ( *i )->m_bActivated = true; + } + else + { + ( *i )->Deactivate(); + ( *i )->m_bActivated = false; + } + + return S_OK; + } + } + + // Invalid return value + return E_INVALIDARG; +} + +STDMETHODIMP cRootLayer::LoadView(BSTR strXML, IView **ppView) +{ + CComObject< cView > *pView; + CComObject< cView >::CreateInstance( &pView ); + + if( m_nViewMode == 1 ) // Multi Mode + { + LayerParams lpPanel = { m_nNextViewID, { 0, 0, 0, 0 }, 0 }; + + CComObject< cPanel > *pPanel; + CComObject< cPanel >::CreateInstance( &pPanel ); + + m_pSite->CreateChild( &lpPanel, pPanel ); + + pPanel->putref_Sink( this ); + pView->m_pPanel = pPanel; + pPanel->put_Params( &pView->m_VP ); + } + else + { + pView->m_pPanel = m_pPanel; + m_pPanel->put_Params( &pView->m_VP ); + } + + CComPtr< IUnknown > pRootControl; + + pView->m_pRoot = this; + pView->m_nViewID = m_nNextViewID ++; + + long lViewFlags = pView->loadSchema( strXML, &pRootControl ); + + if( pRootControl.p ) + { + m_views.push_back( pView ); + + *ppView = pView; + pView->AddRef(); + + // Next, make the bar entry + m_pBars->AddBar( pView->m_nViewID, &pView->m_VP ); + + // Last, create all the controls + pView->m_pPanel->LoadViewEx( pView->m_nViewID, pView, pRootControl, lViewFlags ); + + if( cManager::_p->m_bXMLViewViewer ) + { + pView->m_VP.top = 24; + pView->Activate( ); + } + } + + else + { + pView->Release( ); + *ppView = NULL; + return E_FAIL; + } + return S_OK; +} + +STDMETHODIMP cRootLayer::PanelDeactivate(long nViewID) +{ + // Find the view of our desires and fire it's hide message + for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i ) + { + if( ( *i )->m_nViewID == nViewID ) + ( *i )->Fire_Deactivate(),( *i )->m_bActivated = false; + } + + return S_OK; +} + +STDMETHODIMP cRootLayer::LoadViewObject(IUnknown *pSchema, IView **ppView) +{ + CComObject< cView > *pView; + CComObject< cView >::CreateInstance( &pView ); + + if( m_nViewMode == 1 ) // Multi Mode + { + LayerParams lpPanel = { m_nNextViewID, { 0, 0, 0, 0 }, 0 }; + + CComObject< cPanel > *pPanel; + CComObject< cPanel >::CreateInstance( &pPanel ); + + m_pSite->CreateChild( &lpPanel, pPanel ); + + pPanel->putref_Sink( this ); + pView->m_pPanel = pPanel; + } + else + pView->m_pPanel = m_pPanel; + + CComPtr< IUnknown > pRootControl; + + pView->m_pRoot = this; + pView->m_nViewID = m_nNextViewID ++; + pView->loadSchemaObject( pSchema, &pRootControl ); + + m_views.push_back( pView ); + + *ppView = pView; + pView->AddRef(); + + // Next, make the bar entry + m_pBars->AddBar( pView->m_nViewID, &pView->m_VP ); + + // Last, create all the controls + pView->m_pPanel->LoadView( pView->m_nViewID, pView, pRootControl ); + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/RootLayer.h b/Native/Inject/RootLayer.h new file mode 100644 index 0000000..34db5c0 --- /dev/null +++ b/Native/Inject/RootLayer.h @@ -0,0 +1,67 @@ +// RootLayer.h : Declaration of the cRootLayer + +#ifndef __ROOTLAYER_H_ +#define __ROOTLAYER_H_ + +#include "resource.h" // main symbols + +// This special layer implements no sinks, it is merely a container +// layer for the bar manager and the window manager - it server no other purpose +// than to forward event on and avoid redundant looping in the manager object. + +#include "SinkImpl.h" + +class cView; + +///////////////////////////////////////////////////////////////////////////// +// cRootLayer +class ATL_NO_VTABLE cRootLayer : + public CComObjectRootEx, + public ILayerImpl< cRootLayer >, + public IPanelSink, + public cNoEventsImpl, + public IRootLayer +{ +public: + cRootLayer() : m_nNextViewID( 1000 ), m_nViewMode( 0 ) + { + RegKey key; + key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) ); + if( key.QueryDWORDValue( _T("ViewMode"), m_nViewMode ) != ERROR_SUCCESS) + m_nViewMode = 0; + } + + DWORD m_nViewMode; + + CComPtr< IBarManager > m_pBars; + CComPtr< IPanel > m_pPanel; + + typedef std::list< cView * > cViewList; + cViewList m_views; + long m_nNextViewID; + long m_lDefaultX; + long m_lDefaultY; + + void addView( cView *pView, ILayer *pRootLayer ); + void removeView( cView *pView ); + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cRootLayer) + COM_INTERFACE_ENTRY(IPanelSink) + COM_INTERFACE_ENTRY(IRootLayer) + COM_INTERFACE_ENTRY(ILayer) +END_COM_MAP() + +public: + // IRootLayer Methods + STDMETHOD(CreateView)(ViewParams *pParams, ILayer *pLayer, /*[out, retval]*/ IView **ppView); + STDMETHOD(SelectBar)(long nID); + STDMETHOD(LoadView)(BSTR strXML, /*[out, retval]*/ IView **ppView); + STDMETHOD(LoadViewObject)(IUnknown *pSchema, /*[out, retval]*/ IView **ppView); + // IPanelSink Methods + STDMETHOD(PanelDeactivate)( long nViewID ); +}; + +#endif //__ROOTLAYER_H_ diff --git a/Native/Inject/SimpleBar.cpp b/Native/Inject/SimpleBar.cpp new file mode 100644 index 0000000..5638604 --- /dev/null +++ b/Native/Inject/SimpleBar.cpp @@ -0,0 +1,146 @@ +// SimpleBar.cpp : Implementation of cSimpleBar +#include "stdafx.h" +#include "Inject.h" +#include "SimpleBar.h" + +///////////////////////////////////////////////////////////////////////////// +// cSimpleBar + +void cSimpleBar::onCreate() +{ + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + pPlugin->LoadBitmapFile( _bstr_t( _T( "Switch-Active.bmp" ) ), &m_pSwitch ); + pPlugin->LoadBitmapFile( _bstr_t( _T( "Switch-Inactive.bmp" ) ), &m_pSwitchDisabled ); + BSTR bstrFontName; + pPlugin->get_FontName(&bstrFontName); + pPlugin->CreateFont( bstrFontName /*_bstr_t( _T( "Times New Roman" ) )*/, 14, 0, &m_pFont ); + m_nMinMax = 0; + + m_pSite->put_Transparent( VARIANT_FALSE ); +} + +void cSimpleBar::onDestroy() +{ + m_pSwitch.Release(); + m_pSwitchDisabled.Release(); + m_pFont.Release(); +} + +#define SWITCH_STRETCH_START 25 +#define SWITCH_STRETCH_END 55 + +#define TEXT_ICON_GAP 4 +#define END_GAP 8 + +#define ICON_TOP 2 +#define TEXT_TOP 2 + +#define ICON_SIZE 16 + +STDMETHODIMP cSimpleBar::Render(ICanvas *pCanvas) +{ + RECT rc; + m_pSite->get_Position( &rc ); + + int nWidth = rc.right - rc.left; + + // First draw the background image + static POINT ptOrg = { 0, 0 }; + if( m_bSelected ) + m_pSwitch->StretchBlt( pCanvas, &ptOrg, nWidth, SWITCH_STRETCH_START, SWITCH_STRETCH_END ); + else + m_pSwitchDisabled->StretchBlt( pCanvas, &ptOrg, nWidth, SWITCH_STRETCH_START, SWITCH_STRETCH_END ); + + // Next the icon + CComPtr< IPluginSite > pPlugin; + m_pSite->get_PluginSite( &pPlugin ); + + CComPtr< IIconCache > pIcons; + static SIZE szIcon = { ICON_SIZE, ICON_SIZE }; + pPlugin->GetIconCache( &szIcon, &pIcons ); + + static POINT ptIcon = { 0, ICON_TOP }; + pIcons->DrawIcon( &ptIcon, m_nIconID, m_nIconModule, pCanvas ); + + if (m_nMinMax == eStateMax) + { + static POINT ptText = { ICON_SIZE + TEXT_ICON_GAP, TEXT_TOP }; + m_pFont->DrawText( &ptText, m_strLabel, ( m_bSelected ) ? RGB( 0, 0, 0 ) : RGB( 255, 255, 255 ), pCanvas ); + } + + _ASSERTMEM( _CrtCheckMemory( ) ); + + return S_OK; +} + +STDMETHODIMP cSimpleBar::MouseEnter(MouseState *) +{ + m_bSelected = VARIANT_TRUE; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cSimpleBar::MouseExit(MouseState *) +{ + m_bSelected = VARIANT_FALSE; + m_pSite->Invalidate(); + + return S_OK; +} + +STDMETHODIMP cSimpleBar::MouseDown(MouseState *) +{ + CComPtr< IRootLayer > pRoot; + + m_pSite->GetParentSink( IID_IRootLayer, reinterpret_cast< void ** >( &pRoot ) ); + + _ASSERTE( pRoot.p != NULL ); + + long nID; + m_pSite->get_ID( &nID ); + pRoot->SelectBar( nID ); + + return S_OK; +} + +STDMETHODIMP cSimpleBar::get_RenderWidth(long *nWidth) +{ + if (m_nMinMax == eStateMin) + { + *nWidth = 20; + } + else + { + SIZE sz; + m_pFont->MeasureText( m_strLabel, &sz ); + + // Add in the requested size to the parent + *nWidth = sz.cx + TEXT_ICON_GAP + END_GAP + ICON_SIZE; + } + return S_OK; +} + +STDMETHODIMP cSimpleBar::get_Params(ViewParams *pVal) +{ + USES_CONVERSION; + + pVal->icon = m_nIconID; + pVal->iconLibrary = m_nIconModule; + pVal->label = OLE2BSTR( m_strLabel ); + pVal->state = m_nMinMax; + + return S_OK; +} + +STDMETHODIMP cSimpleBar::put_Params(ViewParams *newVal) +{ + m_nIconID = newVal->icon; + m_nIconModule = newVal->iconLibrary; + m_strLabel = newVal->label; + m_nMinMax = newVal->state; + + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/SimpleBar.h b/Native/Inject/SimpleBar.h new file mode 100644 index 0000000..6e82379 --- /dev/null +++ b/Native/Inject/SimpleBar.h @@ -0,0 +1,63 @@ +// SimpleBar.h : Declaration of the cSimpleBar + +#ifndef __SIMPLEBAR_H_ +#define __SIMPLEBAR_H_ + +#include "resource.h" // main symbols + +#include "SinkImpl.h" + +///////////////////////////////////////////////////////////////////////////// +// cSimpleBar +class ATL_NO_VTABLE cSimpleBar : + public CComObjectRootEx, + public ISimpleBar, + public cNoEventsImpl, + public ILayerImpl< cSimpleBar >, + public ILayerRenderImpl, + public ILayerMouseImpl +{ +public: + cSimpleBar() + : m_bSelected( VARIANT_FALSE ) + { + } + + _bstr_t m_strLabel; + long m_nIconModule; + long m_nIconID; + long m_nMinMax; + + VARIANT_BOOL m_bSelected; + + CComPtr< IImageCache > m_pSwitch; + CComPtr< IImageCache > m_pSwitchDisabled; + CComPtr< IFontCache > m_pFont; + + void onCreate(); + void onDestroy(); + +BEGIN_COM_MAP(cSimpleBar) + COM_INTERFACE_ENTRY(ILayerRender) + COM_INTERFACE_ENTRY(ILayerMouse) + COM_INTERFACE_ENTRY(ILayer) + COM_INTERFACE_ENTRY(ISimpleBar) +END_COM_MAP() + +// ISimpleBar +public: + // ISimpleBar Functions + STDMETHOD(get_Params)(/*[out, retval]*/ ViewParams *pVal); + STDMETHOD(put_Params)(/*[in]*/ ViewParams * newVal); + STDMETHOD(get_RenderWidth)(long *nWidth); + + // ILayerRender Functions + STDMETHOD(Render)(ICanvas *pCanvas); + + // ILayerMouse Functions + STDMETHOD(MouseEnter)(MouseState *); + STDMETHOD(MouseExit)(MouseState *); + STDMETHOD(MouseDown)(MouseState *); +}; + +#endif //__SIMPLEBAR_H_ diff --git a/Native/Inject/SinkImpl.cpp b/Native/Inject/SinkImpl.cpp new file mode 100644 index 0000000..4a42946 --- /dev/null +++ b/Native/Inject/SinkImpl.cpp @@ -0,0 +1,69 @@ +// SinkImpl.cpp +// Implementation of empty functions + +#include "stdafx.h" +#include "Inject.h" +#include "SinkImpl.h" + +STDMETHODIMP ILayerRenderImpl::PreRender() +{ + return S_OK; +} + +STDMETHODIMP ILayerRenderImpl::Render(ICanvas *) +{ + return S_OK; +} + +STDMETHODIMP ILayerRenderImpl::Reformat() +{ + return S_OK; +} + +STDMETHODIMP ILayerRenderImpl::AdjustRenderArea(ICanvas *, VARIANT_BOOL *pbDrawChildren) +{ + *pbDrawChildren = VARIANT_TRUE; + return S_OK; +} + +STDMETHODIMP ILayerRenderImpl::HitTest(LPPOINT pt, VARIANT_BOOL *pbHit) +{ + *pbHit = VARIANT_TRUE; + + return S_OK; +} + +STDMETHODIMP ILayerMouseImpl::MouseEnter(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP ILayerMouseImpl::MouseExit(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP ILayerMouseImpl::MouseDown(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP ILayerMouseImpl::MouseUp(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP ILayerMouseImpl::MouseMove(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP ILayerMouseImpl::MouseDblClk(struct MouseState *) +{ + return S_OK; +} + +STDMETHODIMP ILayerMouseImpl::MouseEvent(long nMsg, long wParam, long lParam) +{ + return S_OK; +} diff --git a/Native/Inject/SinkImpl.h b/Native/Inject/SinkImpl.h new file mode 100644 index 0000000..490fb2f --- /dev/null +++ b/Native/Inject/SinkImpl.h @@ -0,0 +1,176 @@ +// SinkImpl.h +// Declaration of interface helpers that provide default empty implementations +// for all of the sinks defined in the IDL file. +// This can help reduce the number of functions you have to write, +// to use, derived from the *Impl class instead of the interface directly then +// implement the functions you care about. + +// These function are guaranteed never to do anything at all useful, +// so never call them. If you implement all the functions in the interface +// there is no reason to use these classes. + +#ifndef __SINKIMPL_H +#define __SINKIMPL_H + +#include "PluginImpl.h" + +class ATL_NO_VTABLE ILayerRenderImpl : public ILayerRender +{ +public: + STDMETHOD(PreRender)(); + STDMETHOD(Render)( ICanvas *pCanvas ); + STDMETHOD(Reformat)(); + STDMETHOD(AdjustRenderArea)( ICanvas *pCanvas, VARIANT_BOOL *pbDrawChildren ); + STDMETHOD(HitTest)(LPPOINT pt, VARIANT_BOOL *pbHit); +}; + +template< class cImpl > +class ATL_NO_VTABLE ILayerImpl : public ILayer +{ +public: + // Override these methods + CComPtr< ILayerSite > m_pSite; + + void onCreate() + { + // Override this function to initialize the control + } + + void onDestroy() + { + // Override this function to release all stored objects + } + + STDMETHOD(LayerCreate)(ILayerSite *pSite) + { + _ASSERTE( m_pSite.p == NULL ); + _ASSERTE( pSite != NULL ); + + m_pSite = pSite; + + static_cast< cImpl * >( this )->onCreate(); + + return S_OK; + } + + STDMETHOD(LayerDestroy)() + { + _ASSERTE( m_pSite.p != NULL ); + + long nID; + m_pSite->get_ID( &nID ); + + static_cast< cImpl * >( this )->Fire_Destroy( nID ); + static_cast< cImpl * >( this )->onDestroy(); + + m_pSite.Release(); + + return S_OK; + } + + STDMETHOD(put_Position)(RECT *newVal) + { + return m_pSite->put_Position(newVal); + } + + STDMETHOD(get_Position)(RECT *pVal) + { + return m_pSite->get_Position(pVal); + } + + STDMETHOD(Invalidate)() + { + return m_pSite->Invalidate(); + } +}; + +class ATL_NO_VTABLE ILayerMouseImpl : public ILayerMouse +{ +public: + STDMETHOD(MouseEnter)(struct MouseState *pMouse); + STDMETHOD(MouseExit)(struct MouseState *pMouse); + STDMETHOD(MouseDown)(struct MouseState *pMouse); + STDMETHOD(MouseUp)(struct MouseState *pMouse); + STDMETHOD(MouseMove)(struct MouseState *pMouse); + STDMETHOD(MouseDblClk)(struct MouseState *pMouse); + STDMETHOD(MouseEvent)(long nMsg, long wParam, long lParam); +}; + +// This class implements the code IControl functions, to use this implementation, +// derive your control interface from IControl and pass your derived interface as +// IControlItf + +// In your interface map, makes sure both IControl and your control interface +// are included. +template< class cImpl, class IControlItf, const IID *pDispItf, const GUID *pbLib > +class ATL_NO_VTABLE IControlImpl +: public IDispatchImpl< IControlItf, pDispItf, pbLib > +{ +public: + // Override this function if you care about child destruction + void onChildDestroy( long nID ) + { + } + + STDMETHOD(DestroyChild)(long nIndex, /*[defaultvalue(ePositionByIndex)]*/ enum ePositionType posType) + { + CComPtr< ILayerSite > pChildSite; + HRESULT hRes = static_cast< cImpl * >( this )->m_pSite->get_Child( nIndex, posType, &pChildSite ); + if( !SUCCEEDED( hRes ) ) + return hRes; + + long nID; + pChildSite->get_ID( &nID ); + + // Do destroy preprocessing + static_cast< cImpl * >( this )->onChildDestroy( nID ); + + // Kill the child and return + return pChildSite->Destroy(); + } + + STDMETHOD(get_ID)(/*[out, retval]*/ long *pnID ) + { + return static_cast< cImpl * >( this )->m_pSite->get_ID( pnID ); + } + + STDMETHOD(get_ChildCount)(/*[out, retval]*/ long *pnChildCount ) + { + return static_cast< cImpl * >( this )->m_pSite->get_ChildCount( pnChildCount ); + } + + STDMETHOD(get_Child)(long nIndex, /*[optional, defaultvalue(ePositionByIndex)]*/ ePositionType ePosType, /*[out, retval]*/ IControl **ppChild ) + { + CComPtr< ILayerSite > pChildSite; + HRESULT hRes = static_cast< cImpl * >( this )->m_pSite->get_Child( nIndex, ePosType, &pChildSite ); + if( FAILED( hRes ) ) + return hRes; + + return pChildSite->GetSink( IID_IControl, reinterpret_cast< void ** >( ppChild ) ); + } + + STDMETHOD(put_Position)(RECT *newVal) + { + return static_cast< cImpl * >( this )->m_pSite->put_Position(newVal); + } + + STDMETHOD(get_Position)(RECT *pVal) + { + return static_cast< cImpl * >( this )->m_pSite->get_Position(pVal); + } + +}; + +// Derive from this class if your layer does not use an IControlEvents +// derived source interface. This is mainly intereded for internal framework +// classes. +class cNoEventsImpl +{ +public: + HRESULT Fire_Destroy( long ) + { + return E_NOTIMPL; + } +}; + +#endif diff --git a/Native/Inject/SolidImage.cpp b/Native/Inject/SolidImage.cpp new file mode 100644 index 0000000..c0a55fc --- /dev/null +++ b/Native/Inject/SolidImage.cpp @@ -0,0 +1,27 @@ +// SolidImage.cpp : Implementation of cSolidImage +#include "stdafx.h" +#include "Inject.h" +#include "SolidImage.h" + +///////////////////////////////////////////////////////////////////////////// +// cSolidImage + + +STDMETHODIMP cBrushImage::get_Color(long *pVal) +{ + _ASSERTE( pVal != NULL ); + + *pVal = m_nColor; + + return S_OK; +} + +STDMETHODIMP cBrushImage::put_Color(long newVal) +{ + // Make sure the color is in range + _ASSERTE( ( newVal & 0xFF000000 ) == 0 ); + + m_nColor = newVal; + + return S_OK; +} diff --git a/Native/Inject/SolidImage.h b/Native/Inject/SolidImage.h new file mode 100644 index 0000000..6809e8f --- /dev/null +++ b/Native/Inject/SolidImage.h @@ -0,0 +1,79 @@ +// SolidImage.h : Declaration of the cSolidImage + +#ifndef __SOLIDIMAGE_H_ +#define __SOLIDIMAGE_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// cSolidImage +class ATL_NO_VTABLE cBrushImage : + public CComObjectRootEx, + public IBrushImage, + public IDispatchImpl< IImageCache, &IID_IImageCacheDisp, &LIBID_DecalPlugins > +{ +public: + cBrushImage() + : m_nColor( RGB( 0, 255, 255 ) ) + { + } + + long m_nColor; + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cBrushImage) + COM_INTERFACE_ENTRY(IBrushImage) + COM_INTERFACE_ENTRY(IImageCache) + COM_INTERFACE_ENTRY(IImageCacheDisp) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +public: + // IBrushImage Methods + STDMETHOD(get_Color)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Color)(/*[in]*/ long newVal); + + // IImageCache Methods + STDMETHOD(PatBlt)(ICanvas * pDest, tagRECT * prcDest, tagPOINT * ptOrigin) + { + if( m_nColor != RGB( 0, 255, 255 ) ) + pDest->Fill( prcDest, m_nColor ); + + return S_OK; + } + + STDMETHOD(StretchBlt)(ICanvas * pDest, tagPOINT * pptDest, LONG nWidth, LONG nStartStretch, LONG nEndStretch) + { + // Not implemented, not a real image + _ASSERTE( FALSE ); + return E_NOTIMPL; + } + + STDMETHOD(Blt)(tagRECT * rcSrc, ICanvas * pDest, tagPOINT * pptDest) + { + // Not implemented, not a real image + _ASSERTE( FALSE ); + return E_NOTIMPL; + } + + STDMETHOD(get_Size)(tagSIZE * pVal) + { + _ASSERTE( pVal != NULL ); + if (pVal == NULL) + return E_POINTER; + + // Not implemented, not a real image + _ASSERTE( FALSE ); + return E_NOTIMPL; + } + + STDMETHOD(StretchBltArea)(tagRECT * prcSrc, ICanvas * pDest, tagRECT * prcDest) + { + // Not implemented, not a real image + _ASSERTE( FALSE ); + return E_NOTIMPL; + } +}; + +#endif //__SOLIDIMAGE_H_ diff --git a/Native/Inject/SolidImage.rgs b/Native/Inject/SolidImage.rgs new file mode 100644 index 0000000..74532ec --- /dev/null +++ b/Native/Inject/SolidImage.rgs @@ -0,0 +1,25 @@ +HKCR +{ + Inject.SolidImage.1 = s 'SolidImage Class' + { + CLSID = s '{918C0333-5714-4C8D-A95C-2C137B76D364}' + } + Inject.SolidImage = s 'SolidImage Class' + { + CLSID = s '{918C0333-5714-4C8D-A95C-2C137B76D364}' + CurVer = s 'Inject.SolidImage.1' + } + NoRemove CLSID + { + ForceRemove {918C0333-5714-4C8D-A95C-2C137B76D364} = s 'SolidImage Class' + { + ProgID = s 'Inject.SolidImage.1' + VersionIndependentProgID = s 'Inject.SolidImage' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{3559E08B-827E-4DFE-9D33-3567246849CC}' + } + } +} diff --git a/Native/Inject/StdAfx.cpp b/Native/Inject/StdAfx.cpp new file mode 100644 index 0000000..07f7b46 --- /dev/null +++ b/Native/Inject/StdAfx.cpp @@ -0,0 +1,5 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" diff --git a/Native/Inject/StdAfx.h b/Native/Inject/StdAfx.h new file mode 100644 index 0000000..e343079 --- /dev/null +++ b/Native/Inject/StdAfx.h @@ -0,0 +1,54 @@ +// 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__F572112C_DAE7_4CC4_9843_056AF6606BEF__INCLUDED_) +#define AFX_STDAFX_H__F572112C_DAE7_4CC4_9843_056AF6606BEF__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _WIN32_DCOM + +#define _ATL_APARTMENT_THREADED +#define D3D_OVERLOADS +#define DIRECTINPUT_VERSION 0x600 + +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +typedef UINT (CALLBACK* LPFNDLLFUNCALPHABLEND)(HDC, int, int, int, int, HDC, int, int, int, int, BLENDFUNCTION); +extern LPFNDLLFUNCALPHABLEND AlphaBlendF; +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#import +#include "../Include/Helpers.h" +#include "../Include/VSBridge.h" +#define MakePtr( cast, ptr, AddValue ) (cast)( (DWORD)(ptr)+(DWORD)(AddValue)) + +#ifdef _CHECKMEM +#define _ASSERTMEM(a) _ASSERTE(a) +#else +#define _ASSERTMEM(a) +#endif + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__F572112C_DAE7_4CC4_9843_056AF6606BEF__INCLUDED) diff --git a/Native/Inject/View.cpp b/Native/Inject/View.cpp new file mode 100644 index 0000000..a6c532c --- /dev/null +++ b/Native/Inject/View.cpp @@ -0,0 +1,567 @@ +// View.cpp : Implementation of cView +#include "stdafx.h" +#include +#include "Inject.h" +#include "View.h" + +#include "RootLayer.h" +#include "Manager.h" + +#include "InjectApi.h" + +///////////////////////////////////////////////////////////////////////////// +// cView + +cView::~cView( ) +{ + m_bActivated = false; + m_pRoot->m_pBars->RemoveBar( m_nViewID ); + m_pPanel->RemoveView( m_nViewID ); + m_pRoot->removeView( this ); + + long nActiveView; + m_pPanel->get_ActiveView( &nActiveView ); + m_pRoot->SelectBar( nActiveView ); + m_pRoot->SelectBar( nActiveView ); + + m_pPanel.Release(); + + if( cManager::_p->m_bContainer ) + cManager::_p->clearDestroyList( ); +} + +long cView::loadSchema( BSTR strSchema, IUnknown **ppRootControl ) +{ + USES_CONVERSION; + + _ASSERTE( strSchema != NULL ); + + // Create a new XML document and load this up + MSXML::IXMLDOMDocumentPtr pDoc; + pDoc.CreateInstance( __uuidof( MSXML::DOMDocument ), NULL, CLSCTX_INPROC_SERVER ); + + VARIANT_BOOL bSuccess; + if( strSchema[ 0 ] == OLESTR( '<' ) ) + bSuccess = pDoc->loadXML( strSchema ); + else + { + // Load from a file source + pDoc->async = VARIANT_FALSE; + + TCHAR szPath[ MAX_PATH ]; + bSuccess = pDoc->load( ::InjectMapPath( eInjectPathAgent, OLE2T( strSchema ), szPath ) ); + } + + if( !bSuccess ) + { + USES_CONVERSION; + + // The document failed to load, get the error info for posterity + MSXML::IXMLDOMParseErrorPtr pErr = pDoc->parseError; + + long nCode = pErr->errorCode; + long nFilePos = pErr->filepos; + long nLine = pErr->line; + long nLinePos = pErr->linepos; + _bstr_t strReason = pErr->reason; + _bstr_t strText = pErr->srcText; + + TCHAR szError[ 1024 ]; + ::_stprintf( szError, _T( "0x%08X (%i, %i): %s" ), + nCode, nLine, nLinePos, OLE2T( strReason ) ); + + ::MessageBox( cManager::_p->m_hMain, szError, _T( "XML Parse Error" ), MB_ICONERROR | MB_OK ); + + // Give the user a chance to break and look at this lovely info + _ASSERTE( FALSE ); + pDoc.Release( ); + + return 0; + } + + // Get the root element and check it out + long lViewFlags = loadSchemaObject( pDoc->documentElement, ppRootControl ); + pDoc.Release( ); + + return lViewFlags; +} + +long cView::loadSchemaObject( IUnknown *pObject, IUnknown **ppRootControl ) +{ + MSXML::IXMLDOMElementPtr pRoot = pObject; + + _ASSERTE( pRoot->tagName == _bstr_t( _T( "view" ) ) ); + + // Get the view parameters + _variant_t vIconModule = pRoot->getAttribute( _T( "iconlibrary" ) ), + vIcon = pRoot->getAttribute( _T( "icon" ) ), + vTitle = pRoot->getAttribute( _T( "title" ) ), + vLeft = pRoot->getAttribute( _T( "left" ) ), + vTop = pRoot->getAttribute( _T( "top" ) ), + vWidth = pRoot->getAttribute( _T( "width" ) ), + vHeight = pRoot->getAttribute( _T( "height" ) ), + vTrans = pRoot->getAttribute( _T( "transparent" ) ); + + // We *must* have a title + _ASSERTE( vTitle.vt == VT_BSTR ); + + // Fill this into a view param + if( vIconModule.vt == VT_BSTR ) + cManager::_p->LoadResourceModule( vIconModule.bstrVal, &m_VP.iconLibrary ); + else + m_VP.iconLibrary = 0; + +// GKusnick: Handle no-icon case without asserting. +// _ASSERTE( vIcon.vt != VT_NULL ); + m_VP.icon = ( vIcon.vt != VT_NULL ) ? static_cast< long >( vIcon ) : 0; + // Para: shouldn't add 0x06000000 if there's an iconlibrary + if (m_VP.iconLibrary == 0 && m_VP.icon != 0) + m_VP.icon += 0x06000000; + + if(vLeft.vt != VT_NULL) + m_VP.left = static_cast< long >(vLeft); + else + m_VP.left = 25; + + if(vTop.vt != VT_NULL) + m_VP.top = static_cast< long >(vTop); + else + m_VP.top = 25; + + if(vWidth.vt == VT_NULL) + m_VP.width = 180; + else + m_VP.width = static_cast< long >(vWidth); + + if(vHeight.vt == VT_NULL) + { + SIZE szScreen; + cManager::_p->GetScreenSize( &szScreen ); + m_VP.height = szScreen.cy/2; + } + else + m_VP.height = static_cast< long >(vHeight); + + if(vTrans.vt == VT_NULL) + m_bTransparent = false; + else + m_bTransparent = static_cast< bool >( vTrans ); + + if( m_bTransparent ) + m_VP.alpha = 255; + else + m_VP.alpha = -1; + + m_VP.label = _bstr_t(vTitle.bstrVal).copy(); + + // The properly made schema should have a single control child + MSXML::IXMLDOMElementPtr pControl = pRoot->selectSingleNode( _T( "control" ) ); + + _ASSERTE( pControl.GetInterfacePtr() != NULL ); + + pControl->QueryInterface( ppRootControl ); + + long lViewFlags = 0; + + if( m_bTransparent ) + lViewFlags |= eTransparent; + + return lViewFlags; +} + +STDMETHODIMP cView::get_Control(BSTR strName, IControl **pVal) +{ + _ASSERTE( strName != NULL ); + _ASSERTE( pVal != NULL ); + + // Search for a matching control name + for( cNamedControlList::iterator i = m_controls.begin(); i != m_controls.end(); ++ i ) + { + if( i->m_strName == _bstr_t( strName ) ) + { + *pVal = i->m_pControl; + ( *pVal )->AddRef(); + + return S_OK; + } + } + + // The name was not found + return E_INVALIDARG; +} + +STDMETHODIMP cView::putref_Control(BSTR strName, IControl *newVal) +{ + _ASSERTE( strName != NULL ); + + // First look for a matching name + for( cNamedControlList::iterator i = m_controls.begin(); i != m_controls.end(); ++ i ) + { + if( i->m_strName == _bstr_t( strName ) ) + { + if( newVal == NULL ) + m_controls.erase( i ); + else + i->m_pControl = newVal; + + return S_OK; + } + } + + if( newVal == NULL ) + // No value to set + return S_OK; + + // Add in a new record + cNamedControl nc; + nc.m_strName = strName; + nc.m_pControl = newVal; + + m_controls.push_back( nc ); + + return S_OK; +} + +STDMETHODIMP cView::LoadControl(ILayerSite *pParent, long nID, IUnknown *pSource, long *pAssignedID) +{ + // Usual parameter validation + _ASSERTE( pParent != NULL ); + _ASSERTE( pSource != NULL ); + _ASSERTE( pAssignedID != NULL ); + + MSXML::IXMLDOMElementPtr pElement = pSource; + + // Make sure we're starting from the correct tag name + _ASSERTE( pElement->tagName == _bstr_t( _T( "control" ) ) ); + + // Get the progid and make an instance + _variant_t strProgID = pElement->getAttribute( _T( "progid" ) ); + _ASSERTE( strProgID.vt == VT_BSTR ); + + CLSID clsid; + HRESULT hRes = ::CLSIDFromProgID( strProgID.bstrVal, &clsid ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + CComPtr< ILayer > pChildLayer; + hRes = ::CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, + reinterpret_cast< void ** >( &pChildLayer ) ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + // Get some position metrics - note, these are optional and will be + // loaded with 0s - this is for cases when the control is formatted + // entirely by the parent + _variant_t vLeft = pElement->getAttribute( _T( "left" ) ), + vTop = pElement->getAttribute( _T( "top" ) ), + vWidth = pElement->getAttribute( _T( "width" ) ), + vHeight = pElement->getAttribute( _T( "height" ) ), + vUnclipped = pElement->getAttribute( _T( "unclipped" ) ), + vID = pElement->getAttribute( _T( "ID" ) ); + // check for lower case, since all other attributes are lower case. And + // Legiondale_Superman can't seem to get it right... + if (vID.vt == VT_NULL ) { + vID = pElement->getAttribute( _T( "id" ) ); + } + + long nRealID = ( vID.vt == VT_NULL ) ? nID : static_cast< long >( vID ); + *pAssignedID = nRealID; + + POINT pt = { ( vLeft.vt != VT_NULL ) ? static_cast< long >( vLeft ) : 0, + ( vTop.vt != VT_NULL ) ? static_cast< long >( vTop ) : 0 }; + + LayerParams lp = { nRealID, { pt.x, pt.y, pt.x + ( ( vWidth.vt != VT_NULL ) ? static_cast< long >( vWidth ) : 0 ), + pt.y + ( ( vHeight.vt != VT_NULL ) ? static_cast< long >( vHeight ) : 0 ) }, + ( vUnclipped.vt != VT_NULL ) ? 0 : eRenderClipped }; + + pParent->CreateChild( &lp, pChildLayer ); + + // Check if this child is named + _variant_t vName = pElement->getAttribute( _T( "name" ) ); + + if( vName.vt == VT_BSTR ) + { + // Add the named control + CComPtr< IControl > pControl; + pChildLayer->QueryInterface( &pControl ); + putref_Control( vName.bstrVal, pControl ); + } + + // Ok, the child is made - trick it into loading it's own parameters + CComPtr< ILayerSchema > pSchema; + + if( SUCCEEDED( pChildLayer->QueryInterface( &pSchema ) ) ) + pSchema->SchemaLoad( this, pSource ); + + return S_OK; +} + +STDMETHODIMP cView::LoadSchema(BSTR strXMLSchema) +{ + long nPreviousView; + m_pPanel->get_ActiveView( &nPreviousView ); + m_pPanel->RemoveView( m_nViewID ); + + CComPtr< IUnknown > pRootControl; + loadSchema( strXMLSchema, &pRootControl ); + + // Set the bar params + m_pRoot->m_pBars->put_Bar( m_nViewID, &m_VP ); + + long lViewFlags = 0; + + if( m_bTransparent ) + lViewFlags |= eTransparent; + + // Last, create all the controls + m_pPanel->LoadViewEx( m_nViewID, this, pRootControl, lViewFlags ); + + if( nPreviousView == m_nViewID ) + // Reactivate the view + m_pRoot->SelectBar( m_nViewID ); + + return S_OK; +} + +STDMETHODIMP cView::get_Title(BSTR *pVal) +{ + USES_CONVERSION; + + *pVal = OLE2BSTR( m_VP.label ); + + return S_OK; +} + +STDMETHODIMP cView::put_Title(BSTR newVal) +{ + _ASSERTE( newVal != NULL ); + + bool bActivated = m_bActivated; + + m_VP.label = _bstr_t( newVal ).copy( ); + m_pRoot->m_pBars->put_Bar( m_nViewID, &m_VP ); + + if( bActivated ) + m_pPanel->Deactivate(), m_pRoot->SelectBar( m_nViewID ); + + return S_OK; +} + +STDMETHODIMP cView::Alert() +{ + return S_OK; +} + +STDMETHODIMP cView::SetIcon(long icon, VARIANT iconlibrary) +{ + USES_CONVERSION; + + m_VP.icon = icon; + + switch( iconlibrary.vt ) + { + case VT_ERROR: + case VT_EMPTY: + case VT_NULL: + m_VP.iconLibrary = 0; + break; + + case VT_BSTR: + m_VP.iconLibrary = reinterpret_cast< long >( ::GetModuleHandle( OLE2T( iconlibrary.bstrVal ) ) ); + break; + + default: + // Try and convert everything else to a number + try + { + _variant_t v = iconlibrary; + m_VP.iconLibrary = v; + } + catch( ... ) + { + m_VP.iconLibrary = 0; + return E_INVALIDARG; + } + + break; + } + + m_pRoot->m_pBars->put_Bar( m_nViewID, &m_VP ); + + return S_OK; +} + +STDMETHODIMP cView::Activate() +{ + long nActiveView; + m_pPanel->get_ActiveView( &nActiveView ); + + if (nActiveView != m_nViewID) + m_pRoot->SelectBar( m_nViewID ); + + return S_OK; +} + +STDMETHODIMP cView::Deactivate() +{ + m_pPanel->Deactivate(); + if(cManager::_p->m_pKeyboard!=NULL) + { + cManager::_p->m_pKeyboard->sendKeyboardEndCapture( VARIANT_TRUE ); + cManager::_p->m_pKeyboard=NULL; + } + return S_OK; +} + +STDMETHODIMP cView::put_Position(RECT *newVal) +{ + m_VP.left = newVal->left; + m_VP.top = newVal->top; + m_VP.width = newVal->right; + m_VP.height = newVal->bottom; + + /* Drakier: make sure they aren't being bad little kittens and + moving the view offscreen! */ + // Drakier: Get the pSite and Screen Size + + CComPtr< IPluginSite > pPlugin; + CComPtr< IACHooks > pHooks; + m_pRoot->m_pSite->get_PluginSite( &pPlugin ); + + SIZE szScreen, sz; + pPlugin->GetScreenSize( &sz ); + szScreen.cx = sz.cx; + szScreen.cy = sz.cy; + + long lX = sz.cx, lY = sz.cy; + HRESULT hW = S_FALSE, hH = S_FALSE; + + // Drakier: if we are not in the container, get the 3D Area + if ( !cManager::_p->m_bContainer ) + { + pPlugin->get_Hooks( &pHooks ); + hH = pHooks->get_Area3DHeight( &lY ); + hW = pHooks->get_Area3DWidth( &lX ); + pHooks.Release(); + } + pPlugin.Release(); + + // Drakier: if we are in the container, or the 3D area's are NULL + if ( (cManager::_p->m_bContainer) || (hW != S_OK) || (hH != S_OK) ) + { + szScreen.cx = sz.cx - 308; // 308 = PANEL_SIZE + szScreen.cy = sz.cy; + } + else // Drakier: If everything comes out right and we are not in container + { + if( (hW == S_OK) && (lX > 200) && (lX < 2000) ) + szScreen.cx = lX; + if( (hH == S_OK) && (lY > 200) && (lY < 2000) ) + szScreen.cy = lY; + } + + if ( (szScreen.cx > 200) && (szScreen.cx < 2000) && (szScreen.cy > 200) && (szScreen.cy < 2000) ) + { + if ( (m_VP.left + m_VP.width) > szScreen.cx ) + m_VP.left = szScreen.cx - m_VP.width; + if ( (m_VP.top + m_VP.height) > szScreen.cy ) + m_VP.top = szScreen.cy - m_VP.height; + if ( m_VP.left < 0 ) + m_VP.left = 0; + if ( m_VP.top < 0 ) + m_VP.top = 0; + + long nActiveView; + m_pPanel->get_ActiveView( &nActiveView ); + + if( nActiveView == m_nViewID ) + m_pPanel->ActivateView(m_nViewID, &m_VP, (long*)this); + } + + return S_OK; +} + +STDMETHODIMP cView::get_Position(RECT *pVal) +{ + pVal->left = m_VP.left; + pVal->top = m_VP.top; + pVal->right = m_VP.width; + pVal->bottom = m_VP.height; + + return S_OK; +} + +STDMETHODIMP cView::get_Alpha(long *pVal) +{ + if( pVal == NULL ) + return E_POINTER; + + if (m_bTransparent) { + *pVal = m_lOldAlpha ; + } else { + *pVal = m_VP.alpha; + } + return S_OK; +} + +STDMETHODIMP cView::put_Alpha(long Alpha) +{ + if( m_bTransparent ) + return S_FALSE; + + m_VP.alpha = Alpha; + + long nActiveView; + m_pPanel->get_ActiveView( &nActiveView ); + + if( nActiveView == m_nViewID ) + m_pPanel->ActivateView(m_nViewID, &m_VP, (long*)this); + + return S_OK; +} + +STDMETHODIMP cView::get_Activated(VARIANT_BOOL *pVal) +{ + *pVal = ( m_bActivated ? VARIANT_TRUE : VARIANT_FALSE ); + return S_OK; +} + +STDMETHODIMP cView::put_Activated(VARIANT_BOOL newVal) +{ + if( newVal == VARIANT_FALSE ) + return Deactivate(); + + else + return Activate(); +} + +STDMETHODIMP cView::get_Transparent(VARIANT_BOOL *pVal) +{ + *pVal = ( m_bTransparent ? VARIANT_TRUE : VARIANT_FALSE ); + return S_OK; +} + +STDMETHODIMP cView::put_Transparent(VARIANT_BOOL newVal) +{ + if( newVal == VARIANT_FALSE ) + { + if( !m_bTransparent ) + return S_OK; + + m_bTransparent = false; + m_VP.alpha = m_lOldAlpha; + m_pPanel->put_Transparent( VARIANT_FALSE ); + } + else + { + if( m_bTransparent ) + return S_OK; + + m_bTransparent = true; + m_lOldAlpha = m_VP.alpha; + m_VP.alpha = 255; + m_pPanel->put_Transparent( VARIANT_TRUE ); + } + + return S_OK; +} \ No newline at end of file diff --git a/Native/Inject/View.h b/Native/Inject/View.h new file mode 100644 index 0000000..001f5cc --- /dev/null +++ b/Native/Inject/View.h @@ -0,0 +1,92 @@ +// View.h : Declaration of the cView + +#ifndef __VIEW_H_ +#define __VIEW_H_ + +#include "resource.h" // main symbols +#include "InjectCP.h" + +class cPanel; +class cRootLayer; + +///////////////////////////////////////////////////////////////////////////// +// cView +class ATL_NO_VTABLE cView : + public CComObjectRootEx, + public IConnectionPointContainerImpl, + public IProvideClassInfo2Impl< &CLSID_View, &DIID_IViewEvents, &LIBID_DecalPlugins >, + public IDispatchImpl< IView, &IID_IViewDisp, &LIBID_DecalPlugins >, + public CProxyIViewEvents< cView > +{ +public: + cView( ) + { + m_VP.alpha = -1; + m_lOldAlpha = 255; + } + + ~cView(); + + cRootLayer *m_pRoot; + + long m_nViewID; + + bool m_bActivated; + + CComPtr< IPanel > m_pPanel; + + ViewParams m_VP; + long m_lOldAlpha; + bool m_bTransparent; + + // Named controls + struct cNamedControl + { + _bstr_t m_strName; + CComPtr< IControl > m_pControl; + }; + + typedef std::list< cNamedControl > cNamedControlList; + cNamedControlList m_controls; + + long loadSchema( BSTR strText, IUnknown **ppRootControl ); + long loadSchemaObject( IUnknown *pObject, IUnknown **ppRootControl ); + +BEGIN_COM_MAP(cView) + COM_INTERFACE_ENTRY(IView) + COM_INTERFACE_ENTRY(IViewDisp) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY(IConnectionPointContainer) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cView) +CONNECTION_POINT_ENTRY(DIID_IViewEvents) +END_CONNECTION_POINT_MAP() + +public: + // IView Methods + STDMETHOD(SetIcon)(long icon, /*[optional]*/ VARIANT iconlibrary); + STDMETHOD(Activate)(); + STDMETHOD(Alert)(); + STDMETHOD(get_Title)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Title)(/*[in]*/ BSTR newVal); + STDMETHOD(LoadSchema)(BSTR strXMLSchema); + STDMETHOD(LoadControl)(ILayerSite *pParent, long nID, IUnknown *pSource, long *pAssignedID); + STDMETHOD(get_Control)(BSTR strName, /*[out, retval]*/ IControl * *pVal); + STDMETHOD(putref_Control)(BSTR strName, /*[in]*/ IControl * newVal); + STDMETHOD(Deactivate)(); + STDMETHOD(put_Position)(/*[in]*/ RECT *newVal); + STDMETHOD(get_Position)(/*[out, retval]*/ RECT *pVal); + STDMETHOD(put_Alpha)(long Alpha); + STDMETHOD(get_Alpha)(long *pVal); + STDMETHOD(get_Activated)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Activated)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_Transparent)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_Transparent)(/*[in]*/ VARIANT_BOOL newVal); +}; + +#endif //__VIEW_H_ + diff --git a/Native/Inject/res/DenAgent.ico b/Native/Inject/res/DenAgent.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea423d8683ada2ee41ec765b70e664355c9e9ee1 GIT binary patch literal 4710 zcmeI0O=ufO6o8+*Y26}6vZURE(?YC+LN5Wwx&%^NIThO{UmV|kDi};bm*9&9h2&;~ z4>_helv3o2g&}n?G)@9G^pKM%k?SAXhP20xs}%wnPrtXjvSe2xIhV}(&CHwk&70Yo z)yzvodgO}q_xFpYuX{wkr3_X1?o*LD+6D&$``@34{PCIUN{jsRxyWx{(2u$jgNXXm zwCU$T7W8g5awQoJ(A1}QO0|Q z#A4JT3ned>Uy4|(5v8$FaryPM+v{l zizOqoTSms#jid{#lgje0$ow;rnMWcMIg#N>DILRa!>_ETN@Qd)X@MG|4SUE%B1zz9kyC!mM%e+<73zXHDmpM#%6soYfp*HTm#zX;yOp-i1GcFTroYufrGM3-HVE^YAn96Y#_O z8-X|Q2HwCMc*A_yu3fh48Qb-U?aHxTlanGY{1JQ!ehYpbz5w6l^O0ltZTJ=VCHNft zG<=uO2frmL!Y{(l!jHkH;kzwR$sEIP!>_|S)48l zRN@RNB8$i@GKQp)ZVPmBaw2cvzLlMw9eMrwwY+@!Ql372DuqHp9zT98%gf91;K2i# zpP!exxjC7cnUQ<E0z>yhbc$H+fGS+fK&pu)z^0SrtizKr$s!R8nA%dQCm({~x_7eeVL3pGQR+4Rzpz ze4kVsja14>g;1l9O2YO+6`GexHZ?8#_7jPAUCyr+(KA*>&&)dKsLL5!LG+w`VFJ;* zfA(UpTo2A!J(sngp0k6Nsszg%6C0yKjc1Y`DxXH+oesvIG{u>>n)V| zl2%&{dJnC&bZbcD&c@og{Z7AFnYFb{vw=$HP9~EHt}n5Q(vzXh$^=7lA6otm>1TTJ z$(^M3Rlg+AHNO&M+=daF&J#*-L53}Azsz6IS0(am!213b4sO(NJan_Fz)&zg^NAs1 z>BUXbx@nMwx?cO%#@bLgeTk_pvZ1dSB;VVYtvUEWIG7TV=jyU8#Y|&JU;8{o&hPxN ziH3GNt&w^~2MJcdyP6V-6o8bn#2A zKQ!6HS7+IGFHW;=<$l(6>2qI9eU$z&%bZ#GlU@P~M1Kf%gfTCE=RrJ?zjFR2`ti4= zeAn;%V?6OOp7Jd){TlCg{<@?PMYrk6VXwk*Fp$6slr%G;%7JD;Fl=*|v6f z5((dnNV&Wp*3>KEmEWD-zDia(2rn(ap^{XC-75^S*}DyLgSKH>)j#zv94tlKI zdgoR!h@rB#uS4&b%l|aHrThgAHK(zo(cnp~wx@nbx}9x5j3~*RIOI_SKq5T@k^1ZPdT+(EeKgt z@s7)g9U$SP?9O(z2@|OkEwr8tWl8#w<5$KF0n{Gd-%g?wk1He1hraG@ W%hbP$nbRmf1^+7gpCA>40RCU+e?Ec$ literal 0 HcmV?d00001 diff --git a/Native/Inject/resource.h b/Native/Inject/resource.h new file mode 100644 index 0000000..99b3833 --- /dev/null +++ b/Native/Inject/resource.h @@ -0,0 +1,37 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Inject.rc +// +#define IDS_PROJNAME 100 +#define IDR_DIRECTDRAWHOOK 101 +#define IDR_DIRECT3DHOOK 102 +#define IDR_MATERIALHOOK 103 +#define IDR_DIRECTINPUTHOOK 104 +#define IDR_GENINDEXDEVICEHOOK 105 +#define IDR_PLUGINADAPTERV1 110 +#define IDR_SCROLLER 120 +#define IDR_LIST 121 +#define IDR_TEXTCOLUMN 122 +#define IDR_ICONCOLUMN 123 +#define IDR_CHECKCOLUMN 124 +#define IDR_LISTVIEW 125 +#define IDR_NOTEBOOK 126 +#define IDR_MAINFRAME 128 +#define IDR_ECHOFILTER 129 +#define IDR_SOLIDIMAGE 130 +#define IDR_INPUTBUFFER 131 +#define IDR_INJECTSERVICE 134 +#define IDR_XMLVIEWVIEWER 135 +#define IDR_BUTTON 202 +#define IDR_PAGER 203 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 207 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 136 +#endif +#endif diff --git a/Native/InjectModern/CMakeLists.txt b/Native/InjectModern/CMakeLists.txt new file mode 100644 index 0000000..3a2fe71 --- /dev/null +++ b/Native/InjectModern/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.20) +project(Inject LANGUAGES CXX) + +# Force x86 (32-bit) build +if(NOT CMAKE_SIZEOF_VOID_P EQUAL 4) + message(WARNING "Inject.DLL must be built as x86 (32-bit). Use -A Win32 with Visual Studio generator.") +endif() + +add_library(Inject SHARED + Inject.cpp + Inject.h + Inject.def +) + +target_compile_definitions(Inject PRIVATE + WIN32 + _WINDOWS + INJECT_EXPORTS + _USRDLL + UNICODE + _UNICODE +) + +target_link_libraries(Inject PRIVATE + d3d9 + advapi32 + user32 + kernel32 + ole32 + oleaut32 +) + +# MSVC-specific settings +if(MSVC) + target_compile_options(Inject PRIVATE /W3 /GR- /EHsc) + set_target_properties(Inject PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL" + ) +endif() + +set_target_properties(Inject PROPERTIES + OUTPUT_NAME "Inject" + SUFFIX ".DLL" +) diff --git a/Native/InjectModern/Inject.cpp b/Native/InjectModern/Inject.cpp new file mode 100644 index 0000000..02707f0 --- /dev/null +++ b/Native/InjectModern/Inject.cpp @@ -0,0 +1,495 @@ +// Inject.cpp - Modern D3D9 implementation of Inject.DLL for Decal +// +// This DLL gets injected into the Asheron's Call game client process. +// It hooks the D3D9 rendering pipeline to enable Decal's overlay system, +// manages the plugin lifecycle, and provides vtable hooking utilities. + +#define WIN32_LEAN_AND_MEAN +#define INJECT_EXPORTS +#include +#include +#include +#include + +#include "Inject.h" + +#pragma comment(lib, "d3d9.lib") + +// --------------------------------------------------------------------------- +// Shared data section - accessible across processes using this DLL +// --------------------------------------------------------------------------- +#pragma data_seg(".InjectDll") +static HHOOK g_hHook = NULL; +#pragma data_seg() +#pragma comment(linker, "/SECTION:.InjectDll,RWS") + +// --------------------------------------------------------------------------- +// Globals +// --------------------------------------------------------------------------- +static HINSTANCE g_hInstance = NULL; +static HWND g_hGameWindow = NULL; +static IDirect3DDevice9* g_pDevice = NULL; +static WNDPROC g_pfnOrigWndProc = NULL; +static bool g_bInitialized = false; +static bool g_bContainerMode = false; + +// COM interface pointers for managed Decal core +typedef HRESULT(__stdcall* PFN_CO_CREATE)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); +static IUnknown* g_pDecalCore = NULL; + +// Original D3D9 method pointers (saved before hooking) +extern "C" INJECT_API void* BeginSceneO = NULL; +extern "C" INJECT_API void* EndSceneO = NULL; + +// Saved vtable entries for unhooking +struct VTablePatch +{ + void* pInterface; + int nIndex; + void* pOriginal; +}; +static VTablePatch g_patches[64]; +static int g_nPatchCount = 0; + +// Registry path constants +static const TCHAR* REG_DECAL_KEY = _T("SOFTWARE\\Decal"); +static const TCHAR* REG_AGENT_KEY = _T("SOFTWARE\\Decal\\Agent"); + +// --------------------------------------------------------------------------- +// Path mapping +// --------------------------------------------------------------------------- +static std::basic_string GetAgentPath() +{ + HKEY hKey; + TCHAR szPath[MAX_PATH] = {}; + DWORD dwSize = MAX_PATH * sizeof(TCHAR); + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_AGENT_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + RegQueryValueEx(hKey, _T("AgentPath"), NULL, NULL, (LPBYTE)szPath, &dwSize); + RegCloseKey(hKey); + } + + return szPath; +} + +extern "C" INJECT_API LPTSTR __stdcall InjectMapPath(int pathType, LPCTSTR szFilename, LPTSTR szBuffer) +{ + std::basic_string base; + + if (pathType == 0) // eInjectPathDatFile - AC installation directory + { + HKEY hKey; + TCHAR szPath[MAX_PATH] = {}; + DWORD dwSize = MAX_PATH * sizeof(TCHAR); + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Microsoft Games\\Asheron's Call\\1.00"), + 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + RegQueryValueEx(hKey, _T("GamePath"), NULL, NULL, (LPBYTE)szPath, &dwSize); + RegCloseKey(hKey); + } + base = szPath; + } + else // eInjectPathAgent - Decal agent directory + { + base = GetAgentPath(); + } + + // Ensure trailing backslash + if (!base.empty() && base.back() != _T('\\')) + base += _T('\\'); + + _tcscpy(szBuffer, (base + szFilename).c_str()); + return szBuffer; +} + +// --------------------------------------------------------------------------- +// VTable hooking utilities +// --------------------------------------------------------------------------- +extern "C" INJECT_API void* __stdcall GetVTableEntry(void* pInterface, int nIndex) +{ + if (!pInterface) + return NULL; + + // COM interface vtable: first DWORD at *pInterface is pointer to vtable array + void** vtable = *(void***)pInterface; + return vtable[nIndex]; +} + +extern "C" INJECT_API BOOL __stdcall HookVTable(void* pInterface, int nIndex, void* pNewFunction) +{ + if (!pInterface || !pNewFunction) + return FALSE; + + void** vtable = *(void***)pInterface; + void* pOriginal = vtable[nIndex]; + + // Change page protection to allow write + DWORD dwOldProtect; + if (!VirtualProtect(&vtable[nIndex], sizeof(void*), PAGE_READWRITE, &dwOldProtect)) + return FALSE; + + // Patch the vtable entry + vtable[nIndex] = pNewFunction; + + // Restore protection + VirtualProtect(&vtable[nIndex], sizeof(void*), dwOldProtect, &dwOldProtect); + + // Save for unhooking + if (g_nPatchCount < _countof(g_patches)) + { + g_patches[g_nPatchCount].pInterface = pInterface; + g_patches[g_nPatchCount].nIndex = nIndex; + g_patches[g_nPatchCount].pOriginal = pOriginal; + g_nPatchCount++; + } + + return TRUE; +} + +extern "C" INJECT_API BOOL __stdcall UnhookVTable(void* pInterface, int nIndex) +{ + // Find the saved original and restore it + for (int i = 0; i < g_nPatchCount; i++) + { + if (g_patches[i].pInterface == pInterface && g_patches[i].nIndex == nIndex) + { + void** vtable = *(void***)pInterface; + + DWORD dwOldProtect; + if (!VirtualProtect(&vtable[nIndex], sizeof(void*), PAGE_READWRITE, &dwOldProtect)) + return FALSE; + + vtable[nIndex] = g_patches[i].pOriginal; + VirtualProtect(&vtable[nIndex], sizeof(void*), dwOldProtect, &dwOldProtect); + + // Remove from patch list + g_patches[i] = g_patches[g_nPatchCount - 1]; + g_nPatchCount--; + + return TRUE; + } + } + + return FALSE; +} + +// --------------------------------------------------------------------------- +// Memory patching +// --------------------------------------------------------------------------- +extern "C" INJECT_API BOOL __stdcall PatchMemory(void* pAddress, const void* pData, DWORD dwSize) +{ + DWORD dwOldProtect; + if (!VirtualProtect(pAddress, dwSize, PAGE_EXECUTE_READWRITE, &dwOldProtect)) + return FALSE; + + memcpy(pAddress, pData, dwSize); + + VirtualProtect(pAddress, dwSize, dwOldProtect, &dwOldProtect); + FlushInstructionCache(GetCurrentProcess(), pAddress, dwSize); + + return TRUE; +} + +// --------------------------------------------------------------------------- +// D3D9 hook trampolines +// --------------------------------------------------------------------------- +typedef HRESULT(__stdcall* PFN_BeginScene)(IDirect3DDevice9*); +typedef HRESULT(__stdcall* PFN_EndScene)(IDirect3DDevice9*); +typedef HRESULT(__stdcall* PFN_Reset)(IDirect3DDevice9*, D3DPRESENT_PARAMETERS*); + +static PFN_Reset g_pfnOrigReset = NULL; + +// Forward declarations for managed-layer callbacks +typedef void(__stdcall* PFN_DecalCallback)(); +static PFN_DecalCallback g_pfnRender3D = NULL; +static PFN_DecalCallback g_pfnRender2D = NULL; +static PFN_DecalCallback g_pfnPreReset = NULL; +static PFN_DecalCallback g_pfnPostReset = NULL; + +// Hooked BeginScene - called every frame before rendering +static HRESULT __stdcall Hooked_BeginScene(IDirect3DDevice9* pDevice) +{ + PFN_BeginScene pfnOrig = (PFN_BeginScene)BeginSceneO; + HRESULT hr = pfnOrig(pDevice); + + // Store device reference on first call + if (!g_pDevice) + { + g_pDevice = pDevice; + } + + return hr; +} + +// Hooked EndScene - called every frame after rendering; we draw our overlay here +static HRESULT __stdcall Hooked_EndScene(IDirect3DDevice9* pDevice) +{ + // Render 3D overlays (D3DService markers) before EndScene + if (g_pfnRender3D) + g_pfnRender3D(); + + // Render 2D overlays (HUDs, UI) before EndScene + if (g_pfnRender2D) + g_pfnRender2D(); + + PFN_EndScene pfnOrig = (PFN_EndScene)EndSceneO; + return pfnOrig(pDevice); +} + +// Hooked Reset - device lost/restore cycle +static HRESULT __stdcall Hooked_Reset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pParams) +{ + // Notify managed layer to release D3D resources + if (g_pfnPreReset) + g_pfnPreReset(); + + HRESULT hr = g_pfnOrigReset(pDevice, pParams); + + // Notify managed layer to recreate D3D resources + if (g_pfnPostReset) + g_pfnPostReset(); + + return hr; +} + +// --------------------------------------------------------------------------- +// D3D9 device discovery and hooking +// --------------------------------------------------------------------------- +static bool HookD3D9Device() +{ + // Create a temporary D3D9 device to get its vtable + IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION); + if (!pD3D) + return false; + + D3DPRESENT_PARAMETERS pp = {}; + pp.Windowed = TRUE; + pp.SwapEffect = D3DSWAPEFFECT_DISCARD; + pp.BackBufferFormat = D3DFMT_UNKNOWN; + pp.hDeviceWindow = g_hGameWindow; + + IDirect3DDevice9* pTempDevice = NULL; + HRESULT hr = pD3D->CreateDevice( + D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF, g_hGameWindow, + D3DCREATE_SOFTWARE_VERTEXPROCESSING, + &pp, &pTempDevice); + + if (FAILED(hr) || !pTempDevice) + { + pD3D->Release(); + return false; + } + + // Get vtable pointers from the temporary device + void** vtable = *(void***)pTempDevice; + + // IDirect3DDevice9 vtable indices: + // [41] = BeginScene + // [42] = EndScene + // [16] = Reset + BeginSceneO = vtable[41]; + EndSceneO = vtable[42]; + g_pfnOrigReset = (PFN_Reset)vtable[16]; + + pTempDevice->Release(); + pD3D->Release(); + + // Now hook the actual game's D3D9 device vtable + // We patch the device class vtable (shared by all D3D9 devices of the same type) + // The temp device gave us the vtable layout; actual hooking happens via HookVTable + // when the real device is discovered. + + return true; +} + +// --------------------------------------------------------------------------- +// Window subclass procedure +// --------------------------------------------------------------------------- +static LRESULT CALLBACK InjectWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (uMsg == WM_DESTROY) + { + // Game is shutting down - clean up + Container_StopPlugins(); + Container_Terminate(); + } + + return CallWindowProc(g_pfnOrigWndProc, hWnd, uMsg, wParam, lParam); +} + +// --------------------------------------------------------------------------- +// Startup / lifecycle +// --------------------------------------------------------------------------- +extern "C" INJECT_API void __stdcall DecalStartup() +{ + if (g_bInitialized) + return; + + // Find the game window + g_hGameWindow = FindWindow(NULL, _T("Asheron's Call")); + if (!g_hGameWindow) + return; + + // Subclass the game window to intercept messages + g_pfnOrigWndProc = (WNDPROC)SetWindowLongPtr(g_hGameWindow, GWLP_WNDPROC, (LONG_PTR)InjectWndProc); + + // Initialize COM + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + + // Discover D3D9 vtable layout for hooking + HookD3D9Device(); + + // Create the managed Decal core (Decal.Core COM server) + // CLSID_DecalCore = {4557D5A1-...} + CLSID clsidDecal; + CLSIDFromProgID(L"Decal.Core", &clsidDecal); + + HRESULT hr = CoCreateInstance(clsidDecal, NULL, CLSCTX_INPROC_SERVER, + IID_IUnknown, (void**)&g_pDecalCore); + + if (SUCCEEDED(hr) && g_pDecalCore) + { + // The managed Decal.Core will enumerate and start services/plugins + // via registry entries under HKLM\SOFTWARE\Decal\Services and \Plugins + } + + g_bInitialized = true; +} + +extern "C" INJECT_API void __stdcall Container_Initialize(HWND hWnd, void* pDevice) +{ + g_hGameWindow = hWnd; + g_pDevice = (IDirect3DDevice9*)pDevice; + g_bContainerMode = true; + + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + + CLSID clsidDecal; + CLSIDFromProgID(L"Decal.Core", &clsidDecal); + CoCreateInstance(clsidDecal, NULL, CLSCTX_INPROC_SERVER, + IID_IUnknown, (void**)&g_pDecalCore); +} + +extern "C" INJECT_API void __stdcall Container_StartPlugins() +{ + // Delegate to managed layer + // The managed Decal.Core handles plugin enumeration and loading +} + +extern "C" INJECT_API void __stdcall Container_StopPlugins() +{ + // Delegate to managed layer +} + +extern "C" INJECT_API void __stdcall Container_Terminate() +{ + if (g_pDecalCore) + { + g_pDecalCore->Release(); + g_pDecalCore = NULL; + } + + // Restore window procedure + if (g_hGameWindow && g_pfnOrigWndProc) + { + SetWindowLongPtr(g_hGameWindow, GWLP_WNDPROC, (LONG_PTR)g_pfnOrigWndProc); + g_pfnOrigWndProc = NULL; + } + + // Unhook all vtable patches + while (g_nPatchCount > 0) + { + int i = g_nPatchCount - 1; + void** vtable = *(void***)g_patches[i].pInterface; + + DWORD dwOldProtect; + VirtualProtect(&vtable[g_patches[i].nIndex], sizeof(void*), PAGE_READWRITE, &dwOldProtect); + vtable[g_patches[i].nIndex] = g_patches[i].pOriginal; + VirtualProtect(&vtable[g_patches[i].nIndex], sizeof(void*), dwOldProtect, &dwOldProtect); + + g_nPatchCount--; + } + + g_pDevice = NULL; + g_bInitialized = false; +} + +extern "C" INJECT_API void __stdcall Container_Draw() +{ + if (g_pfnRender2D) + g_pfnRender2D(); +} + +// --------------------------------------------------------------------------- +// COM server stubs (ATL-free, minimal) +// --------------------------------------------------------------------------- +static LONG g_lLockCount = 0; + +STDAPI DllCanUnloadNow() +{ + return (g_lLockCount == 0 && !g_bInitialized) ? S_OK : S_FALSE; +} + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + *ppv = NULL; + return CLASS_E_CLASSNOTAVAILABLE; +} + +STDAPI DllRegisterServer() +{ + return S_OK; +} + +STDAPI DllUnregisterServer() +{ + return S_OK; +} + +// --------------------------------------------------------------------------- +// DllMain +// --------------------------------------------------------------------------- +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + g_hInstance = hInstance; + DisableThreadLibraryCalls(hInstance); + + // Check if we're in the AC client process + { + TCHAR szFilename[MAX_PATH]; + GetModuleFileName(NULL, szFilename, MAX_PATH); + + // Extract just the filename + LPTSTR pName = _tcsrchr(szFilename, _T('\\')); + if (pName) + pName++; + else + pName = szFilename; + + // If running inside client.exe, auto-start Decal + if (_tcsnicmp(pName, _T("client"), 6) == 0 || + _tcsnicmp(pName, _T("acclient"), 8) == 0) + { + // Increment our own ref count to prevent premature unloading + TCHAR szModule[MAX_PATH]; + GetModuleFileName(hInstance, szModule, MAX_PATH); + LoadLibrary(szModule); + + // Start Decal hooking + DecalStartup(); + } + } + break; + + case DLL_PROCESS_DETACH: + Container_Terminate(); + break; + } + + return TRUE; +} diff --git a/Native/InjectModern/Inject.def b/Native/InjectModern/Inject.def new file mode 100644 index 0000000..79fdeca --- /dev/null +++ b/Native/InjectModern/Inject.def @@ -0,0 +1,37 @@ +; Inject.def - Module definition for Inject.DLL +; Matches the exports of the original v2.9.8.3 Inject.DLL + +LIBRARY "Inject" + +SECTIONS + .InjectDll READ WRITE SHARED + +EXPORTS + ; COM server + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + + ; D3D9 original function pointers (data exports) + BeginSceneO DATA + EndSceneO DATA + + ; Lifecycle + DecalStartup + Container_Initialize + Container_StartPlugins + Container_StopPlugins + Container_Terminate + Container_Draw + + ; VTable hooking utilities + HookVTable + UnhookVTable + GetVTableEntry + + ; Memory patching + PatchMemory + + ; Path mapping + InjectMapPath diff --git a/Native/InjectModern/Inject.h b/Native/InjectModern/Inject.h new file mode 100644 index 0000000..28157e7 --- /dev/null +++ b/Native/InjectModern/Inject.h @@ -0,0 +1,37 @@ +// Inject.h - Public declarations for Inject.DLL +#pragma once + +#ifdef INJECT_EXPORTS +#define INJECT_API __declspec(dllexport) +#else +#define INJECT_API __declspec(dllimport) +#endif + +// Lifecycle exports +extern "C" INJECT_API void __stdcall DecalStartup(); +extern "C" INJECT_API void __stdcall Container_Initialize(HWND hWnd, void* pDevice); +extern "C" INJECT_API void __stdcall Container_StartPlugins(); +extern "C" INJECT_API void __stdcall Container_StopPlugins(); +extern "C" INJECT_API void __stdcall Container_Terminate(); +extern "C" INJECT_API void __stdcall Container_Draw(); + +// D3D9 vtable hooking utilities +extern "C" INJECT_API BOOL __stdcall HookVTable(void* pInterface, int nIndex, void* pNewFunction); +extern "C" INJECT_API BOOL __stdcall UnhookVTable(void* pInterface, int nIndex); +extern "C" INJECT_API void* __stdcall GetVTableEntry(void* pInterface, int nIndex); + +// Memory patching +extern "C" INJECT_API BOOL __stdcall PatchMemory(void* pAddress, const void* pData, DWORD dwSize); + +// Original D3D9 function pointers (for DecalRender/D3DService to call through) +extern "C" INJECT_API void* BeginSceneO; +extern "C" INJECT_API void* EndSceneO; + +// Path mapping +extern "C" INJECT_API LPTSTR __stdcall InjectMapPath(int pathType, LPCTSTR szFilename, LPTSTR szBuffer); + +// COM server standard exports +STDAPI DllCanUnloadNow(); +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv); +STDAPI DllRegisterServer(); +STDAPI DllUnregisterServer(); diff --git a/Native/LauncherHookModern/CMakeLists.txt b/Native/LauncherHookModern/CMakeLists.txt new file mode 100644 index 0000000..563caba --- /dev/null +++ b/Native/LauncherHookModern/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.20) +project(LauncherHook LANGUAGES CXX) + +# Force x86 (32-bit) build +if(NOT CMAKE_SIZEOF_VOID_P EQUAL 4) + message(WARNING "LauncherHook.DLL must be built as x86 (32-bit). Use -A Win32 with Visual Studio generator.") +endif() + +add_library(LauncherHook SHARED + LauncherHook.cpp + LauncherHook.def +) + +target_compile_definitions(LauncherHook PRIVATE + WIN32 + _WINDOWS + _USRDLL + UNICODE + _UNICODE +) + +target_link_libraries(LauncherHook PRIVATE + advapi32 + user32 + kernel32 +) + +# MSVC-specific settings +if(MSVC) + target_compile_options(LauncherHook PRIVATE /W3 /GR- /EHsc) + set_target_properties(LauncherHook PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL" + ) +endif() + +set_target_properties(LauncherHook PROPERTIES + OUTPUT_NAME "LauncherHook" + SUFFIX ".DLL" +) diff --git a/Native/LauncherHookModern/LauncherHook.cpp b/Native/LauncherHookModern/LauncherHook.cpp new file mode 100644 index 0000000..57a9f24 --- /dev/null +++ b/Native/LauncherHookModern/LauncherHook.cpp @@ -0,0 +1,327 @@ +// LauncherHook.cpp - Modern implementation of LauncherHook.DLL for Decal +// +// This DLL is loaded into the Asheron's Call launcher/lobby process. +// It intercepts CreateProcessW to detect when client.exe is launched, +// then injects Inject.DLL into the suspended game process before resuming it. +// +// Exported functions: +// LauncherHookEnable - Install the CBT hook for injection into launcher +// LauncherHookDisable - Remove the CBT hook +// LauncherHookLauncherStartup - Called when launcher starts (no-op placeholder) + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +// --------------------------------------------------------------------------- +// Shared data section - persists across all processes that load this DLL +// --------------------------------------------------------------------------- +#pragma data_seg(".LHookDll") +static HHOOK g_hHook = NULL; +static HINSTANCE g_hInstance = NULL; +#pragma data_seg() +#pragma comment(linker, "/SECTION:.LHookDll,RWS") + +// --------------------------------------------------------------------------- +// Import Address Table hooking infrastructure +// (Simplified from ApiHook.h for this single-purpose DLL) +// --------------------------------------------------------------------------- +#define MakePtr(cast, ptr, addValue) (cast)((DWORD_PTR)(ptr) + (DWORD_PTR)(addValue)) + +typedef BOOL(WINAPI* PFN_CreateProcessW)( + LPCWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, + BOOL, DWORD, LPVOID, LPCWSTR, LPSTARTUPINFOW, LPPROCESS_INFORMATION); + +static PFN_CreateProcessW g_pfnOrigCreateProcessW = NULL; + +// --------------------------------------------------------------------------- +// DLL injection via CreateRemoteThread + LoadLibraryW +// --------------------------------------------------------------------------- +static BOOL InjectDLL(HANDLE hProcess, const WCHAR* szDllPath) +{ + SIZE_T cbPath = (wcslen(szDllPath) + 1) * sizeof(WCHAR); + + // Allocate memory in target process for the DLL path string + LPVOID pRemotePath = VirtualAllocEx(hProcess, NULL, cbPath, MEM_COMMIT, PAGE_READWRITE); + if (!pRemotePath) + return FALSE; + + // Write the DLL path into the target process + if (!WriteProcessMemory(hProcess, pRemotePath, szDllPath, cbPath, NULL)) + { + VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE); + return FALSE; + } + + // Get LoadLibraryW address (same in all processes due to ASLR kernel32 sharing) + LPTHREAD_START_ROUTINE pfnLoadLibrary = + (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW"); + + if (!pfnLoadLibrary) + { + VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE); + return FALSE; + } + + // Create remote thread that calls LoadLibraryW(dllPath) + HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, pfnLoadLibrary, pRemotePath, 0, NULL); + if (!hThread) + { + VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE); + return FALSE; + } + + // Wait for the remote LoadLibrary to complete + WaitForSingleObject(hThread, 10000); + + CloseHandle(hThread); + VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE); + + return TRUE; +} + +// --------------------------------------------------------------------------- +// Hooked CreateProcessW - intercepts game client launch +// --------------------------------------------------------------------------- +static BOOL WINAPI Hooked_CreateProcessW( + LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation) +{ + static LONG s_recursion = 0; + + // Check if this is launching client.exe / acclient.exe + bool bIsClient = false; + if (lpCommandLine) + { + std::wstring cmd(lpCommandLine); + // Case-insensitive search for client.exe in command line + for (auto& c : cmd) c = towlower(c); + bIsClient = (cmd.find(L"client.exe") != std::wstring::npos); + } + if (!bIsClient && lpApplicationName) + { + std::wstring app(lpApplicationName); + for (auto& c : app) c = towlower(c); + bIsClient = (app.find(L"client.exe") != std::wstring::npos); + } + + if (InterlockedIncrement(&s_recursion) == 1 && bIsClient) + { + // Read the Inject.DLL path from registry + WCHAR szDllPath[MAX_PATH] = {}; + HKEY hKey = NULL; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Decal\\Agent", + 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + DWORD dwSize = (MAX_PATH - 20) * sizeof(WCHAR); + if (RegQueryValueExW(hKey, L"AgentPath", NULL, NULL, + (LPBYTE)szDllPath, &dwSize) == ERROR_SUCCESS) + { + // Ensure trailing backslash + size_t len = wcslen(szDllPath); + if (len > 0 && szDllPath[len - 1] != L'\\') + wcscat_s(szDllPath, L"\\"); + wcscat_s(szDllPath, L"Inject.dll"); + } + RegCloseKey(hKey); + } + + // Create the process in SUSPENDED state + PROCESS_INFORMATION localPI = {}; + LPPROCESS_INFORMATION pPI = lpProcessInformation ? lpProcessInformation : &localPI; + + BOOL bResult = g_pfnOrigCreateProcessW( + lpApplicationName, lpCommandLine, + lpProcessAttributes, lpThreadAttributes, + bInheritHandles, + dwCreationFlags | CREATE_SUSPENDED, + lpEnvironment, lpCurrentDirectory, + lpStartupInfo, pPI); + + if (bResult) + { + // Only inject if Decal Agent window is running + if (FindWindowW(NULL, L"Decal Agent") != NULL && szDllPath[0] != L'\0') + { + InjectDLL(pPI->hProcess, szDllPath); + } + + // Resume the process (unless caller originally wanted it suspended) + if (!(dwCreationFlags & CREATE_SUSPENDED)) + { + ResumeThread(pPI->hThread); + } + } + + InterlockedDecrement(&s_recursion); + return bResult; + } + else + { + // Not client.exe or recursive call - pass through + BOOL bResult = g_pfnOrigCreateProcessW( + lpApplicationName, lpCommandLine, + lpProcessAttributes, lpThreadAttributes, + bInheritHandles, dwCreationFlags, + lpEnvironment, lpCurrentDirectory, + lpStartupInfo, lpProcessInformation); + + InterlockedDecrement(&s_recursion); + return bResult; + } +} + +// --------------------------------------------------------------------------- +// IAT patching - hook CreateProcessW in the current process +// --------------------------------------------------------------------------- +static PIMAGE_IMPORT_DESCRIPTOR FindImportDescriptor(HMODULE hModule, LPCSTR szImportMod) +{ + PIMAGE_DOS_HEADER pDOS = (PIMAGE_DOS_HEADER)hModule; + PIMAGE_NT_HEADERS pNT = MakePtr(PIMAGE_NT_HEADERS, pDOS, pDOS->e_lfanew); + + if (pNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0) + return NULL; + + PIMAGE_IMPORT_DESCRIPTOR pImport = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOS, + pNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); + + while (pImport->Name) + { + LPCSTR szName = MakePtr(LPCSTR, pDOS, pImport->Name); + if (_stricmp(szName, szImportMod) == 0) + return pImport; + pImport++; + } + + return NULL; +} + +static bool PatchIAT(HMODULE hTarget, LPCSTR szModule, LPCSTR szFunction, + void* pNewFunc, void** ppOrigFunc, bool bInstall) +{ + PIMAGE_IMPORT_DESCRIPTOR pImport = FindImportDescriptor(hTarget, szModule); + if (!pImport) + return false; + + PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hTarget, pImport->OriginalFirstThunk); + PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hTarget, pImport->FirstThunk); + + for (; pOrigThunk->u1.Function; pOrigThunk++, pRealThunk++) + { + if (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) + continue; + + PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hTarget, pOrigThunk->u1.AddressOfData); + if (pByName->Name[0] == '\0') + continue; + + if (_stricmp((const char*)pByName->Name, szFunction) != 0) + continue; + + // Found it - patch + MEMORY_BASIC_INFORMATION mbi; + VirtualQuery(pRealThunk, &mbi, sizeof(mbi)); + VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, &mbi.Protect); + + if (bInstall) + { + if (ppOrigFunc) + *ppOrigFunc = (void*)pRealThunk->u1.Function; + pRealThunk->u1.Function = (DWORD_PTR)pNewFunc; + } + else if (ppOrigFunc && *ppOrigFunc) + { + pRealThunk->u1.Function = (DWORD_PTR)*ppOrigFunc; + } + + DWORD dwOld; + VirtualProtect(mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &dwOld); + return true; + } + + return false; +} + +static void InstallHooks(bool bInstall) +{ + // Hook CreateProcessW in the main executable + HMODULE hExe = GetModuleHandle(NULL); + PatchIAT(hExe, "kernel32.dll", "CreateProcessW", + (void*)Hooked_CreateProcessW, (void**)&g_pfnOrigCreateProcessW, bInstall); + + // Also try hooking in AsheronsCall.dll if loaded (legacy launcher) + HMODULE hAC = GetModuleHandleA("AsheronsCall.dll"); + if (hAC) + { + PatchIAT(hAC, "kernel32.dll", "CreateProcessW", + (void*)Hooked_CreateProcessW, (void**)&g_pfnOrigCreateProcessW, bInstall); + } +} + +// --------------------------------------------------------------------------- +// CBT hook procedure - gets us loaded into the launcher process +// --------------------------------------------------------------------------- +static LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + return CallNextHookEx(g_hHook, nCode, wParam, lParam); +} + +// --------------------------------------------------------------------------- +// Exported functions +// --------------------------------------------------------------------------- +extern "C" __declspec(dllexport) void __stdcall LauncherHookEnable() +{ + if (!g_hHook) + { + g_hHook = SetWindowsHookExW(WH_CBT, CBTHookProc, g_hInstance, 0); + } +} + +extern "C" __declspec(dllexport) void __stdcall LauncherHookDisable() +{ + if (g_hHook) + { + UnhookWindowsHookEx(g_hHook); + g_hHook = NULL; + } +} + +extern "C" __declspec(dllexport) void __stdcall LauncherHookLauncherStartup() +{ + // Placeholder - called by DenAgent when launcher starts + // The actual hooking is done in DllMain when we detect the launcher process +} + +// --------------------------------------------------------------------------- +// DllMain +// --------------------------------------------------------------------------- +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + g_hInstance = hInstance; + DisableThreadLibraryCalls(hInstance); + + // Install IAT hooks to intercept CreateProcessW + InstallHooks(true); + break; + + case DLL_PROCESS_DETACH: + // Remove IAT hooks + InstallHooks(false); + break; + } + + return TRUE; +} diff --git a/Native/LauncherHookModern/LauncherHook.def b/Native/LauncherHookModern/LauncherHook.def new file mode 100644 index 0000000..f443086 --- /dev/null +++ b/Native/LauncherHookModern/LauncherHook.def @@ -0,0 +1,11 @@ +; LauncherHook.def - Module definition for LauncherHook.DLL + +LIBRARY "LauncherHook" + +SECTIONS + .LHookDll READ WRITE SHARED + +EXPORTS + LauncherHookEnable + LauncherHookDisable + LauncherHookLauncherStartup diff --git a/Native/LobbyHook/DecalNet.dsp b/Native/LobbyHook/DecalNet.dsp new file mode 100644 index 0000000..be825b1 --- /dev/null +++ b/Native/LobbyHook/DecalNet.dsp @@ -0,0 +1,112 @@ +# Microsoft Developer Studio Project File - Name="LobbyHook" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=LobbyHook - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "LobbyHook.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "LobbyHook.mak" CFG="LobbyHook - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "LobbyHook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "LobbyHook - Win32 Unicode Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "LobbyHook - Win32 Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "LobbyHook - Win32 Unicode Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "LobbyHook - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /Ob0 /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "LobbyHook - Win32 Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinSize" +# PROP BASE Intermediate_Dir "ReleaseMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX- /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "_MBCS" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +!ENDIF + +# Begin Target + +# Name "LobbyHook - Win32 Debug" +# Name "LobbyHook - Win32 Release MinSize" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\LobbyHook.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +# End Group +# End Target +# End Project diff --git a/Native/LobbyHook/LobbyHook.cpp b/Native/LobbyHook/LobbyHook.cpp new file mode 100644 index 0000000..1da9b6a --- /dev/null +++ b/Native/LobbyHook/LobbyHook.cpp @@ -0,0 +1,96 @@ +// LobbyHook.cpp : Defines the entry point for the DLL application. +// + +#include "stdafx.h" +#include "forcelib.h" +#include "apihook.h" + +bool bInject; +BOOL __stdcall Replacement_CreateProcessA( LPCSTR a0, LPSTR a1, LPSECURITY_ATTRIBUTES a2, LPSECURITY_ATTRIBUTES a3, BOOL a4, DWORD a5, LPVOID a6, LPCSTR a7, LPSTARTUPINFO a8, LPPROCESS_INFORMATION a9 ); + +static cHookDescriptor _hooks[] = +{ + { eByName, _T( "kernel32.dll" ), _T( "CreateProcessA" ), 93, reinterpret_cast< DWORD >( Replacement_CreateProcessA ), 0 }, +}; + +BOOL __stdcall Replacement_CreateProcessA( LPCSTR a0, LPSTR a1, LPSECURITY_ATTRIBUTES a2, LPSECURITY_ATTRIBUTES a3, BOOL a4, DWORD a5,LPVOID a6, LPCSTR a7, LPSTARTUPINFO a8, LPPROCESS_INFORMATION a9 ) +{ + static long s_recursion = 0; + bInject = strstr( a1, "client.exe" ) ? true : false; + + BOOL bResult; + + if( s_recursion++ == 0 && bInject) + { + HKEY key = NULL; + + char szDllPath[ MAX_PATH ]; + memset( szDllPath, 0, sizeof( szDllPath ) ); + + HRESULT hr = RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("Software\\Decal\\Agent"), 0, KEY_READ, &key ); + + if( hr == ERROR_SUCCESS ) + { + DWORD dwChars = MAX_PATH - 1; + if( RegQueryValueEx( key, "AgentPath", NULL, NULL, (LPBYTE) szDllPath, &dwChars ) == ERROR_SUCCESS ) + strcat( szDllPath, "\\Inject.dll" ); + + RegCloseKey (key); + } + + PROCESS_INFORMATION ProcInfo; + memset( &ProcInfo, 0, sizeof( PROCESS_INFORMATION ) ); + + bResult = CreateProcess( const_cast< char * >( a0 ), + a1, a2, a3, a4, CREATE_SUSPENDED, /* a5 - Creation Flags */ + a6, const_cast< char * >( a7 ), a8, &ProcInfo /* a9 - Proc Info */ ); + + if (FindWindow (NULL, "Decal Agent") != NULL) + { + ForceLibrary( szDllPath, &ProcInfo ); + } + + ResumeThread( ProcInfo.hThread ); + } + else + { + bResult = CreateProcess( a0, a1, a2, a3, a4, a5, a6, a7, a8, a9 ); + } + + s_recursion--; + + return bResult; +} + +HANDLE g_hLobbySemaphore = NULL; + +BOOL APIENTRY DllMain( HANDLE hModule, DWORD dwCallReason, LPVOID lpReserved ) +{ + switch( dwCallReason ) + { + case DLL_PROCESS_ATTACH: + { + // Alright, we're loaded into the lobby process. + // Hook CreateProcessA and bail. + hookFunctionsByExport( "AsheronsCall.dll", _hooks, 1, true ); + + TCHAR tszBuffer [256]; + + _stprintf (tszBuffer, _T("__LOBBYHOOK_%d"), ::GetCurrentProcessId ()); + g_hLobbySemaphore = ::CreateSemaphore (NULL, 0, 1, tszBuffer); + break; + } + + case DLL_PROCESS_DETACH: + { + // Detaching + // Unhook CreateProcessA and bail. + hookFunctionsByExport( "AsheronsCall.dll", _hooks, 1, false ); + ::CloseHandle (g_hLobbySemaphore); + break; + } + + } + + return TRUE; +} diff --git a/Native/LobbyHook/LobbyHook.dsp b/Native/LobbyHook/LobbyHook.dsp new file mode 100644 index 0000000..0e56482 --- /dev/null +++ b/Native/LobbyHook/LobbyHook.dsp @@ -0,0 +1,113 @@ +# Microsoft Developer Studio Project File - Name="LobbyHook" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=LobbyHook - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "LobbyHook.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "LobbyHook.mak" CFG="LobbyHook - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "LobbyHook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "LobbyHook - Win32 Release MinSize" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "LobbyHook - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /Ob0 /I "..\Include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 ..\include\forcelibrary.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "LobbyHook - Win32 Release MinSize" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinSize" +# PROP BASE Intermediate_Dir "ReleaseMinSize" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinSize" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_DLL" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX- /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /D "_MBCS" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 ..\include\forcelibrary.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib urlmon.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +!ENDIF + +# Begin Target + +# Name "LobbyHook - Win32 Debug" +# Name "LobbyHook - Win32 Release MinSize" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\LobbyHook.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File + +# End Group + +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" + +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group + +# End Target +# End Project diff --git a/Native/LobbyHook/LobbyHook.vcproj b/Native/LobbyHook/LobbyHook.vcproj new file mode 100644 index 0000000..d72a15b --- /dev/null +++ b/Native/LobbyHook/LobbyHook.vcproj @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/LobbyHook/ReadMe.txt b/Native/LobbyHook/ReadMe.txt new file mode 100644 index 0000000..efa8ce8 --- /dev/null +++ b/Native/LobbyHook/ReadMe.txt @@ -0,0 +1,40 @@ +======================================================================== + DYNAMIC LINK LIBRARY : LobbyHook Project Overview +======================================================================== + +AppWizard has created this LobbyHook DLL for you. +This file contains a summary of what you will find in each of the files that +make up your LobbyHook application. + + +LobbyHook.vcproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +LobbyHook.cpp + This is the main DLL source file. + + When created, this DLL does not export any symbols. As a result, it + will not produce a .lib file when it is built. If you wish this project + to be a project dependency of some other project, you will either need to + add code to export some symbols from the DLL so that an export library + will be produced, or you can set the Ignore Input Library property to Yes + on the General propert page of the Linker folder in the project's Property + Pages dialog box. + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named LobbyHook.pch and a precompiled types file named StdAfx.obj. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/Native/LobbyHook/stdafx.cpp b/Native/LobbyHook/stdafx.cpp new file mode 100644 index 0000000..5cfd993 --- /dev/null +++ b/Native/LobbyHook/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// LobbyHook.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/Native/LobbyHook/stdafx.h b/Native/LobbyHook/stdafx.h new file mode 100644 index 0000000..810a944 --- /dev/null +++ b/Native/LobbyHook/stdafx.h @@ -0,0 +1,15 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#define _WIN32_WINDOWS 0x0410 +// Windows Header Files: +#include +#include +#include +#include diff --git a/Native/PlainText/Attic/PlainText.h b/Native/PlainText/Attic/PlainText.h new file mode 100644 index 0000000..1854622 --- /dev/null +++ b/Native/PlainText/Attic/PlainText.h @@ -0,0 +1,351 @@ +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + +/* File created by MIDL compiler version 5.01.0164 */ +/* at Sun Sep 23 00:59:18 2001 + */ +/* Compiler settings for C:\Projects\decaldev2\source\PlainText\PlainText.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 __PlainText_h__ +#define __PlainText_h__ + +#ifdef __cplusplus +extern "C"{ +#endif + +/* Forward Declarations */ + +#ifndef __IScriptPluginSite_FWD_DEFINED__ +#define __IScriptPluginSite_FWD_DEFINED__ +typedef interface IScriptPluginSite IScriptPluginSite; +#endif /* __IScriptPluginSite_FWD_DEFINED__ */ + + +#ifndef __IPluginEvents_FWD_DEFINED__ +#define __IPluginEvents_FWD_DEFINED__ +typedef interface IPluginEvents IPluginEvents; +#endif /* __IPluginEvents_FWD_DEFINED__ */ + + +#ifndef __IPluginEvents_FWD_DEFINED__ +#define __IPluginEvents_FWD_DEFINED__ +typedef interface IPluginEvents IPluginEvents; +#endif /* __IPluginEvents_FWD_DEFINED__ */ + + +#ifndef __ScriptPlugin_FWD_DEFINED__ +#define __ScriptPlugin_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class ScriptPlugin ScriptPlugin; +#else +typedef struct ScriptPlugin ScriptPlugin; +#endif /* __cplusplus */ + +#endif /* __ScriptPlugin_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 __IScriptPluginSite_INTERFACE_DEFINED__ +#define __IScriptPluginSite_INTERFACE_DEFINED__ + +/* interface IScriptPluginSite */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IScriptPluginSite; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("7A6ECAD8-839E-47d9-B829-8581F065CEAC") + IScriptPluginSite : public IDispatch + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CreateObject( + BSTR strProgID, + /* [retval][out] */ LPDISPATCH __RPC_FAR *ppObject) = 0; + + }; + +#else /* C style interface */ + + typedef struct IScriptPluginSiteVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IScriptPluginSite __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IScriptPluginSite __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IScriptPluginSite __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IScriptPluginSite __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IScriptPluginSite __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IScriptPluginSite __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IScriptPluginSite __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *CreateObject )( + IScriptPluginSite __RPC_FAR * This, + BSTR strProgID, + /* [retval][out] */ LPDISPATCH __RPC_FAR *ppObject); + + END_INTERFACE + } IScriptPluginSiteVtbl; + + interface IScriptPluginSite + { + CONST_VTBL struct IScriptPluginSiteVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IScriptPluginSite_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IScriptPluginSite_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IScriptPluginSite_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IScriptPluginSite_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IScriptPluginSite_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IScriptPluginSite_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IScriptPluginSite_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IScriptPluginSite_CreateObject(This,strProgID,ppObject) \ + (This)->lpVtbl -> CreateObject(This,strProgID,ppObject) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IScriptPluginSite_CreateObject_Proxy( + IScriptPluginSite __RPC_FAR * This, + BSTR strProgID, + /* [retval][out] */ LPDISPATCH __RPC_FAR *ppObject); + + +void __RPC_STUB IScriptPluginSite_CreateObject_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IScriptPluginSite_INTERFACE_DEFINED__ */ + + + +#ifndef __PlainText_LIBRARY_DEFINED__ +#define __PlainText_LIBRARY_DEFINED__ + +/* library PlainText */ +/* [helpstring][version][uuid] */ + + + +EXTERN_C const IID LIBID_PlainText; + +#ifndef __IPluginEvents_DISPINTERFACE_DEFINED__ +#define __IPluginEvents_DISPINTERFACE_DEFINED__ + +/* dispinterface IPluginEvents */ +/* [helpstring][uuid] */ + + +EXTERN_C const IID DIID_IPluginEvents; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("4E1AE4C6-2120-489e-A124-F58E91C9B262") + IPluginEvents : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct IPluginEventsVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IPluginEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IPluginEvents __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IPluginEvents __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IPluginEvents __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IPluginEvents __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IPluginEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IPluginEvents __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } IPluginEventsVtbl; + + interface IPluginEvents + { + CONST_VTBL struct IPluginEventsVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IPluginEvents_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IPluginEvents_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IPluginEvents_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IPluginEvents_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IPluginEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IPluginEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IPluginEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* __IPluginEvents_DISPINTERFACE_DEFINED__ */ + + +EXTERN_C const CLSID CLSID_ScriptPlugin; + +#ifdef __cplusplus + +class DECLSPEC_UUID("F8F77FFC-88E1-4d50-9F51-C30F3F35C4EF") +ScriptPlugin; +#endif +#endif /* __PlainText_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +unsigned long __RPC_USER BSTR_UserSize( unsigned long __RPC_FAR *, unsigned long , BSTR __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER BSTR_UserMarshal( unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER BSTR_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); +void __RPC_USER BSTR_UserFree( unsigned long __RPC_FAR *, BSTR __RPC_FAR * ); + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Native/PlainText/NamedObjects.h b/Native/PlainText/NamedObjects.h new file mode 100644 index 0000000..7151367 --- /dev/null +++ b/Native/PlainText/NamedObjects.h @@ -0,0 +1,11 @@ +// NamedObjects.h +// Declaration of class cNamedObjects, cache for keeping track of named objects + +#ifndef __NAMEDOBJECTS_H +#define __NAMEDOBJECTS_H + +class cNamedObjects +{ +}; + +#endif diff --git a/Native/PlainText/PlainText.cpp b/Native/PlainText/PlainText.cpp new file mode 100644 index 0000000..79de2ce --- /dev/null +++ b/Native/PlainText/PlainText.cpp @@ -0,0 +1,72 @@ +// PlainText.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f PlainTextps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "PlainText.h" + +#include "PlainText_i.c" + +#include "ScriptPlugin.h" +#include "ScriptView.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) + OBJECT_ENTRY(CLSID_ScriptPlugin, cScriptPlugin) + OBJECT_ENTRY(CLSID_ScriptView, CScriptView) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_PlainText); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} \ No newline at end of file diff --git a/Native/PlainText/PlainText.def b/Native/PlainText/PlainText.def new file mode 100644 index 0000000..0f746fb --- /dev/null +++ b/Native/PlainText/PlainText.def @@ -0,0 +1,9 @@ +; PlainText.def : Declares the module parameters. + +LIBRARY "PlainText.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Native/PlainText/PlainText.dsp b/Native/PlainText/PlainText.dsp new file mode 100644 index 0000000..b492241 --- /dev/null +++ b/Native/PlainText/PlainText.dsp @@ -0,0 +1,189 @@ +# Microsoft Developer Studio Project File - Name="PlainText" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=PlainText - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "PlainText.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "PlainText.mak" CFG="PlainText - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "PlainText - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "PlainText - Win32 Release MinDependency" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "PlainText - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\Include" /I "..\Inject" /I "..\DecalControls" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# Begin Custom Build - Performing registration +OutDir=.\..\Debug +TargetPath=\source\Debug\PlainText.dll +InputPath=\source\Debug\PlainText.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ELSEIF "$(CFG)" == "PlainText - Win32 Release MinDependency" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseMinDependency" +# PROP BASE Intermediate_Dir "ReleaseMinDependency" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "ReleaseMinDependency" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /Oa /Og /Oi /Os /Oy /Ob1 /Gf /Gy /I "..\Include" /I "..\Inject" /I "..\DecalControls" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"stdafx.h" /FD /c +# ADD MTL /nologo /I "..\Include" /Oicf +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\Release" +# Begin Custom Build - Performing registration +OutDir=.\..\Release +TargetPath=\source\Release\PlainText.dll +InputPath=\source\Release\PlainText.dll +SOURCE="$(InputPath)" + +"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + regsvr32 /s /c "$(TargetPath)" + echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg" + +# End Custom Build + +!ENDIF + +# Begin Target + +# Name "PlainText - Win32 Debug" +# Name "PlainText - Win32 Release MinDependency" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\PlainText.cpp +# End Source File +# Begin Source File + +SOURCE=.\PlainText.def +# End Source File +# Begin Source File + +SOURCE=.\PlainText.idl +# ADD MTL /tlb ".\PlainText.tlb" /h "PlainText.h" /iid "PlainText_i.c" /Oicf +# End Source File +# Begin Source File + +SOURCE=.\PlainText.rc +# End Source File +# Begin Source File + +SOURCE=.\ScriptPlugin.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScriptSiteImpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScriptView.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\PlainTextCP.h +# End Source File +# Begin Source File + +SOURCE=.\Resource.h +# End Source File +# Begin Source File + +SOURCE=.\ScriptPlugin.h +# End Source File +# Begin Source File + +SOURCE=.\ScriptSiteImpl.h +# End Source File +# Begin Source File + +SOURCE=.\ScriptView.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\ScriptPlugin.rgs +# End Source File +# Begin Source File + +SOURCE=.\ScriptView.rgs +# End Source File +# End Group +# End Target +# End Project diff --git a/Native/PlainText/PlainText.idl b/Native/PlainText/PlainText.idl new file mode 100644 index 0000000..4e773b9 --- /dev/null +++ b/Native/PlainText/PlainText.idl @@ -0,0 +1,93 @@ +// PlainText.idl : IDL source for PlainText.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (PlainText.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; + +import "..\Inject\Inject.idl"; +import "..\DecalControls\DecalControls.idl"; + + [ + object, + uuid(7A6ECAD8-839E-47d9-B829-8581F065CEAC), + dual, + helpstring("IScriptPluginSite Interface"), + pointer_default(unique) + ] + interface IScriptPluginSite : IDispatch + { + [id(1), helpstring("method CreateObject")] HRESULT CreateObject(BSTR strProgID, [out, retval] LPDISPATCH *ppObject); + [id(2), helpstring("method WriteToChatWindow")] HRESULT WriteToChatWindow(BSTR szText, long lColor); + [id(3), helpstring("method MessageBox")] HRESULT MessageBox(BSTR Title, BSTR Text); + [id(4), helpstring("method LoadView")] HRESULT LoadView(BSTR Text, [out, retval] IView **pView); + [id(8), helpstring("method CreateView")] HRESULT CreateView(BSTR strTemplateName, [out, retval] LPDISPATCH *ppNewView); + }; + + [ + uuid(4E1AE4C6-2120-489e-A124-F58E91C9B262), + helpstring("IPluginEvents Interface") + ] + dispinterface IPluginEvents + { + properties: + methods: + [id(1), helpstring("method Initialize")] HRESULT Initialize(); + [id(2), helpstring("method Terminate")] HRESULT Terminate(); + }; + [ + object, + uuid(555175AF-1D74-4658-A199-EE6CCA3E066D), + dual, + helpstring("IScriptView Interface"), + pointer_default(unique) + ] + interface IScriptView : IDispatch + { + }; + [ + uuid(02CA4EB7-2816-4b68-8EC0-4502C9C35E7D), + helpstring("IViewEvents Interface") + ] + dispinterface IScriptViewEvents + { + properties: + methods: + [id(1), helpstring("method Initialize")] void Initialize(); + [id(2), helpstring("method Terminate")] void Terminate(); + [id(3), helpstring("method Activate")] void Activate(); + [id(4), helpstring("method Deactivate")] void Deactivate(); + }; +[ + uuid(1658A49F-0444-43E5-BA11-ED1AD1C256DB), + version(1.0), + helpstring("PlainText 1.0 Type Library") +] +library PlainText +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + dispinterface IPluginEvents; + dispinterface IScriptViewEvents; + [ + uuid(F8F77FFC-88E1-4d50-9F51-C30F3F35C4EF), + helpstring("ScriptPlugin Class") + ] + coclass ScriptPlugin + { + [default] interface IScriptPluginSite; + [default, source] dispinterface IPluginEvents; + }; + [ + uuid(B537CBEC-98C1-480A-910D-4C99E5E96273), + helpstring("ScriptView Class") + ] + coclass ScriptView + { + [default] interface IScriptView; + [default, source] interface IScriptViewEvents; + }; +}; diff --git a/Native/PlainText/PlainText.rc b/Native/PlainText/PlainText.rc new file mode 100644 index 0000000..68589f0 --- /dev/null +++ b/Native/PlainText/PlainText.rc @@ -0,0 +1,140 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +#include "..\Include\DecalVersion.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.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 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""PlainText.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + PRODUCTVERSION DECAL_MAJOR, DECAL_MINOR, DECAL_BUGFIX, DECAL_RELEASE + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "PlainText is a Decal surrogate that allows plug-ins to be written using Windows Scripting Technologies" + VALUE "FileDescription", "PlainText Module" + VALUE "FileVersion", DECAL_VERSION_STRING + VALUE "InternalName", "PlainText" + VALUE "LegalCopyright", "Copyright 2001" + VALUE "OriginalFilename", "PlainText.DLL" + VALUE "ProductName", "PlainText Module" + VALUE "ProductVersion", DECAL_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_SCRIPTVIEW REGISTRY "ScriptView.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "PlainText" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (Canada) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_SCRIPTPLUGIN REGISTRY "ScriptPlugin.rgs" +#endif // English (Canada) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "PlainText.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Native/PlainText/PlainText.vcproj b/Native/PlainText/PlainText.vcproj new file mode 100644 index 0000000..b315f0f --- /dev/null +++ b/Native/PlainText/PlainText.vcproj @@ -0,0 +1,339 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Native/PlainText/PlainTextCP.h b/Native/PlainText/PlainTextCP.h new file mode 100644 index 0000000..04767b0 --- /dev/null +++ b/Native/PlainText/PlainTextCP.h @@ -0,0 +1,145 @@ +#ifndef _PLAINTEXTCP_H_ +#define _PLAINTEXTCP_H_ + + +template +class CProxyIPluginEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_Initialize() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + return varResult.scode; + + } + HRESULT Fire_Terminate() + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + return varResult.scode; + + } +}; + + +template +class CProxyIScriptViewEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + VOID Fire_Initialize() + { + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + + } + VOID Fire_Terminate() + { + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + + } + VOID Fire_Activate() + { + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + + } + VOID Fire_Deactivate() + { + T* pT = static_cast(this); + int nConnectionIndex; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + DISPPARAMS disp = { NULL, NULL, 0, 0 }; + pDispatch->Invoke(0x4, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL); + } + } + + } +}; +#endif \ No newline at end of file diff --git a/Native/PlainText/PlainTextps.def b/Native/PlainText/PlainTextps.def new file mode 100644 index 0000000..178dd0e --- /dev/null +++ b/Native/PlainText/PlainTextps.def @@ -0,0 +1,11 @@ + +LIBRARY "PlainTextPS" + +DESCRIPTION 'Proxy/Stub DLL' + +EXPORTS + DllGetClassObject @1 PRIVATE + DllCanUnloadNow @2 PRIVATE + GetProxyDllInfo @3 PRIVATE + DllRegisterServer @4 PRIVATE + DllUnregisterServer @5 PRIVATE diff --git a/Native/PlainText/PlainTextps.mk b/Native/PlainText/PlainTextps.mk new file mode 100644 index 0000000..00adcbd --- /dev/null +++ b/Native/PlainText/PlainTextps.mk @@ -0,0 +1,16 @@ + +PlainTextps.dll: dlldata.obj PlainText_p.obj PlainText_i.obj + link /dll /out:PlainTextps.dll /def:PlainTextps.def /entry:DllMain dlldata.obj PlainText_p.obj PlainText_i.obj \ + kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \ + +.c.obj: + cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \ + $< + +clean: + @del PlainTextps.dll + @del PlainTextps.lib + @del PlainTextps.exp + @del dlldata.obj + @del PlainText_p.obj + @del PlainText_i.obj diff --git a/Native/PlainText/ScriptPlugin.cpp b/Native/PlainText/ScriptPlugin.cpp new file mode 100644 index 0000000..872d9a1 --- /dev/null +++ b/Native/PlainText/ScriptPlugin.cpp @@ -0,0 +1,305 @@ +// ScriptPlugin.cpp : Implementation of cScriptPlugin +#include "stdafx.h" +#include "PlainText.h" +#include "ScriptPlugin.h" +#include "../Inject/Inject.h" +#include "ScriptView.h" + +///////////////////////////////////////////////////////////////////////////// +// cScriptPlugin + +void cScriptPlugin::getCLSID( BSTR *pbstrCLSID ) +{ + MSXML::IXMLDOMAttributePtr pAttr = m_pPlugin->selectSingleNode( _T( "/plugin/@clsid" ) ); + + _ASSERTE( pAttr.GetInterfacePtr() != NULL ); + + *pbstrCLSID = OLE2BSTR( pAttr->value.bstrVal ); +} + +void cScriptPlugin::getLanguage( BSTR *pbstrLanguage ) +{ + MSXML::IXMLDOMAttributePtr pAttr = m_pPlugin->selectSingleNode( _T( "/plugin/@language" ) ); + + if( pAttr.GetInterfacePtr() == NULL ) + *pbstrLanguage = T2BSTR( _T( "VBScript" ) ); + else + *pbstrLanguage = OLE2BSTR( pAttr->value.bstrVal ); +} + +HRESULT cScriptPlugin::LoadScript(BSTR strFilename) +{ + USES_CONVERSION; + + HRESULT hRes = ::CoCreateInstance( __uuidof( MSXML::DOMDocument ), NULL, CLSCTX_INPROC_SERVER, + __uuidof( MSXML::IXMLDOMDocument ), reinterpret_cast< void ** >( &m_pPlugin ) ); + + if( FAILED( hRes ) ) + return hRes; + + bool bLoad = !!m_pPlugin->load( strFilename ); + + if( !bLoad ) + { + // The document failed to load, get the error info for posterity + MSXML::IXMLDOMParseErrorPtr pErr = m_pPlugin->parseError; + + long nCode = pErr->errorCode; + long nFilePos = pErr->filepos; + long nLine = pErr->line; + long nLinePos = pErr->linepos; + _bstr_t strReason = pErr->reason; + _bstr_t strText = pErr->srcText; + + TCHAR szError[ 1024 ]; + ::_stprintf( szError, _T( "0x%08X (%i, %i): %s" ), + nCode, nLine, nLinePos, OLE2T( strReason ) ); + + ::MessageBox( NULL, szError, _T( "XML Parse Error" ), MB_ICONERROR | MB_OK ); + + // Give the user a chance to break and look at this lovely info + _ASSERTE( FALSE ); + + return E_FAIL; + } + + // Looking good + + return S_OK; +} + +STDMETHODIMP cScriptPlugin::CreateInstance(IDecalEnum *pInitData, REFIID iid, LPVOID *pObject) +{ + CComVariant vFile; + HRESULT hRes = pInitData->get_Property( _bstr_t( "File" ), &vFile ); + if( FAILED( hRes ) ) + return hRes; + + if( vFile.vt != VT_BSTR ) + return E_FAIL; + + m_strFilename = vFile.bstrVal; + return static_cast< IDecalSurrogate * >( this )->QueryInterface( iid, pObject ); +} + +STDMETHODIMP cScriptPlugin::Initialize( IPluginSite2 *pSite ) +{ + USES_CONVERSION; + m_pSite = pSite; + + // First, map the map and load the script file + CComPtr< IDecal > pDecal; + m_pSite->get_Decal( &pDecal ); + + CComBSTR strTruePath; + HRESULT hRes = pDecal->MapPath( m_strFilename, &strTruePath ); + if( FAILED( hRes ) ) + return hRes; + + hRes = LoadScript( strTruePath ); + if( FAILED( hRes ) ) + return hRes; + + // Set up the scripting environment, the default scripting language + // is VBScript + CComBSTR strScript; + + getLanguage( &strScript ); + hRes = createScriptEngine( strScript ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + // Load the script text + CComPtr< IActiveScriptParse > pParse; + m_pScript->QueryInterface( &pParse ); + + pParse->InitNew(); + + addNamedItem( _bstr_t( _T( "Site" ) ), static_cast< IDispatch * >( this ) ); + + MSXML::IXMLDOMElementPtr pScript = m_pPlugin->selectSingleNode( _T( "/plugin/script" ) ); + + // Load the main script block + if( pScript.GetInterfacePtr() != NULL ) + { + EXCEPINFO ei; + HRESULT hRes = pParse->ParseScriptText( pScript->text, NULL, NULL, NULL, 0, 0, + SCRIPTITEM_ISVISIBLE, NULL, &ei ); + + _ASSERTE( SUCCEEDED( hRes ) ); + } else { + ::MessageBox(NULL, "Couldn't load the main script block", "cScriptPlugin::Initialize", MB_OK); + } + + // Walk through the intrinsic object + MSXML::IXMLDOMNodeListPtr pNetworks = m_pPlugin->selectNodes( _T( "/plugin/decal" ) ); + for( MSXML::IXMLDOMElementPtr pNetwork = pNetworks->nextNode(); pNetwork.GetInterfacePtr() != NULL; pNetwork = pNetworks->nextNode() ) + { + CComPtr< IDispatch > pObject; + HRESULT hRes = pDecal->get_Object( pNetwork->getAttribute( _T( "path" ) ).bstrVal, IID_IDispatch, reinterpret_cast< void ** >( &pObject ) ); + if( FAILED( hRes ) ) + { + ::MessageBox(NULL, "SCRIPT ERROR: Couldn't load decal object", OLE2A(pNetwork->getAttribute(_T("path")).bstrVal), MB_OK); + continue; + } + + // Add the item + addNamedItem( pNetwork->getAttribute( _T( "name" ) ).bstrVal, pObject ); + } + + // Walk through the instance objects + MSXML::IXMLDOMNodeListPtr pObjects = m_pPlugin->selectNodes( _T( "/plugin/object" ) ); + for( MSXML::IXMLDOMElementPtr pObject = pObjects->nextNode(); pObject.GetInterfacePtr() != NULL; pObject = pObjects->nextNode() ) + { + _variant_t vProgid = pObject->getAttribute( _T( "progid" ) ); + + if( vProgid.vt == VT_NULL ) + { + _ASSERT( FALSE ); + continue; + } + + CComPtr< IDispatch > pInstance; + CLSID clsid; + HRESULT hRes = ::CLSIDFromProgID( vProgid.bstrVal, &clsid ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + continue; + } + + hRes = ::CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, reinterpret_cast< void ** >( &pInstance ) ); + + if( FAILED( hRes ) ) + { + _ASSERT( FALSE ); + continue; + } + + // Add the item + addNamedItem( pObject->getAttribute( _T( "name" ) ).bstrVal, pInstance ); + } + + // Start up the plugin + m_pScript->SetScriptState(SCRIPTSTATE_CONNECTED); + Fire_Initialize(); + + return S_OK; +} + +STDMETHODIMP cScriptPlugin::Terminate() +{ + // Shut down the plugin + Fire_Terminate(); + + m_pScript->SetScriptState( SCRIPTSTATE_DISCONNECTED ); + m_pScript->Close(); + + m_pSite.Release(); + m_pPlugin.Release(); + + return S_OK; +} + + STDMETHODIMP cScriptPlugin::CreateObject( BSTR strProgID, LPDISPATCH *pDisp ) + { + if( pDisp == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + HRESULT hRes; + CLSID clsid; + if( strProgID[ 0 ] == OLESTR( '{' ) ) + hRes = ::CLSIDFromString( strProgID, &clsid ); + else + hRes = ::CLSIDFromProgID( strProgID, &clsid ); + + if( FAILED( hRes ) ) + return hRes; + + return ::CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, reinterpret_cast< void ** >( pDisp ) ); +} + +STDMETHODIMP cScriptPlugin::WriteToChatWindow(BSTR szText, long lColor) +{ + getPluginSite()->WriteToChatWindow(szText, lColor); + + return S_OK; +} + +STDMETHODIMP cScriptPlugin::MessageBox(BSTR Title, BSTR Text) +{ + USES_CONVERSION; + + ::MessageBox(NULL, OLE2A(Text), OLE2A(Title), MB_OK); + return S_OK; +} + +IPluginSite * cScriptPlugin::getPluginSite() +{ + CComPtr< IDecal > pDecal; + m_pSite->get_Decal ( &pDecal ); + + CComPtr< IInjectService > pInject; + CComPtr< IPluginSite > pSite; + HRESULT hRes = pDecal->get_Object ( _bstr_t ( _T( "services\\DecalPlugins.InjectService" ) ), + __uuidof ( IInjectService ), reinterpret_cast< LPVOID * > ( &pInject ) ); + + pInject->get_Site(&pSite); + return pSite; +} + +STDMETHODIMP cScriptPlugin::LoadView(BSTR Text, IView **pView) +{ + getPluginSite()->LoadView(Text, pView); + return S_OK; +} + +void cScriptPlugin::removeView( CScriptView *pView ) +{ + for( cViewList::iterator i = m_views.begin(); i != m_views.end(); ++ i ) + { + if( *i == pView ) + { + m_views.erase( i ); + return; + } + } + + // The view was not found in the list + _ASSERTE( FALSE ); +} + +void cScriptPlugin::postRemoveView( CScriptView *pView ) +{ + m_destroy.push_back( pView ); +} + +STDMETHODIMP cScriptPlugin::CreateView(BSTR strTemplateName, LPDISPATCH *ppNewView) +{ + USES_CONVERSION; + + TCHAR szQuery[ 255 ]; + ::_stprintf( szQuery, _T( "/plugin/view[@name='%s']" ), OLE2T( strTemplateName ) ); + + MSXML::IXMLDOMElementPtr pView = m_pPlugin->selectSingleNode( szQuery ); + + if( pView.GetInterfacePtr() == NULL ) + return E_INVALIDARG; + + CComObject< CScriptView > *pNewView; + CComObject< CScriptView >::CreateInstance( &pNewView ); + + CComPtr< IDispatch > pDispPlugin; + m_pScript->GetScriptDispatch( NULL, &pDispPlugin ); + + CComBSTR strLanguage; + getLanguage( &strLanguage ); + + pNewView->loadView( this, pView, ppNewView ); + + return S_OK; +} \ No newline at end of file diff --git a/Native/PlainText/ScriptPlugin.h b/Native/PlainText/ScriptPlugin.h new file mode 100644 index 0000000..3ea3bde --- /dev/null +++ b/Native/PlainText/ScriptPlugin.h @@ -0,0 +1,115 @@ +// ScriptPlugin.h : Declaration of the cScriptPlugin + +#ifndef __SCRIPTPLUGIN_H_ +#define __SCRIPTPLUGIN_H_ + +#include "resource.h" // main symbols +#include "PlainTextCP.h" + +#include +#include "ScriptSiteImpl.h" + +class CScriptView; + +///////////////////////////////////////////////////////////////////////////// +// cScriptPlugin +class ATL_NO_VTABLE cScriptPlugin : + public CComObjectRootEx, + public CComCoClass, + public IActiveScriptSiteImpl, + public IPlugin2, + public IDecalSurrogate, + public IProvideClassInfo2Impl< &CLSID_ScriptPlugin, &DIID_IPluginEvents, &LIBID_PlainText >, + public IDispatchImpl< IScriptPluginSite, &IID_IScriptPluginSite, &LIBID_PlainText >, + public IDecalFileSurrogateXMLImpl< cScriptPlugin, &CLSID_ScriptPlugin >, + public IConnectionPointContainerImpl, + public CProxyIPluginEvents< cScriptPlugin > +{ +public: + cScriptPlugin() + { + } + + static LPCTSTR getConfigGroup() + { + return _T( "Plugins" ); + } + +DECLARE_REGISTRY_RESOURCEID(IDR_SCRIPTPLUGIN) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(cScriptPlugin) + COM_INTERFACE_ENTRY(IActiveScriptSite) + COM_INTERFACE_ENTRY(IPlugin2) + COM_INTERFACE_ENTRY(IDecalFileSurrogate) + COM_INTERFACE_ENTRY(IDecalSurrogate) + COM_INTERFACE_ENTRY(IScriptPluginSite) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(cScriptPlugin) +CONNECTION_POINT_ENTRY(DIID_IPluginEvents) +END_CONNECTION_POINT_MAP() + + CComPtr< IPluginSite2 > m_pSite; + MSXML::IXMLDOMDocumentPtr m_pPlugin; + + void getCLSID( BSTR *pbstrCLSID ); + void getLanguage( BSTR *pbstrLanguage ); + + HRESULT LoadScript( BSTR strFilename ); + + CComBSTR m_strFilename; + + void postRemoveView( CScriptView *pView ); + void removeView( CScriptView * ); + + typedef std::deque< CScriptView * > cViewList; + cViewList m_views, + m_destroy; +public: + STDMETHOD(CreateView)(BSTR strTemplateName, /*[out, retval]*/ LPDISPATCH *ppNewView); + STDMETHOD(LoadView)(/*[in]*/ BSTR Text, /*[out]*/ IView **pView); + IPluginSite * getPluginSite(); + STDMETHOD(MessageBox)(BSTR Title, BSTR Text); + STDMETHOD(WriteToChatWindow)(BSTR szText, long lColor); + // IScriptPluginSite Methods + STDMETHOD(CreateObject)(BSTR strProgID, LPDISPATCH *pDisp); + + // IDecalSurrogate Methods + STDMETHOD(CreateInstance)(IDecalEnum *pInitData, REFIID iid, LPVOID *pObject); + + // IPlugin Methods + STDMETHOD(Initialize)( IPluginSite2 *pSite ); + STDMETHOD(Terminate)(); + + // IDecalFileSurrogate + STDMETHOD(get_Extension)( BSTR *pVal ) + { + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = T2BSTR( _T( "acs" ) ); + return S_OK; + } + + STDMETHOD(get_Description)( BSTR *pVal ) + { + if( pVal == NULL ) + { + _ASSERT( FALSE ); + return E_POINTER; + } + + *pVal = T2BSTR( _T( "Script Plugin" ) ); + return S_OK; + } +}; + +#endif //__SCRIPTPLUGIN_H_ diff --git a/Native/PlainText/ScriptPlugin.rgs b/Native/PlainText/ScriptPlugin.rgs new file mode 100644 index 0000000..b32efd4 --- /dev/null +++ b/Native/PlainText/ScriptPlugin.rgs @@ -0,0 +1,45 @@ +HKCR +{ + PlainText.ScriptPlugin.1 = s 'ScriptPlugin Class' + { + CLSID = s '{F8F77FFC-88E1-4d50-9F51-C30F3F35C4EF}' + } + PlainText.ScriptPlugin = s 'ScriptPlugin Class' + { + CLSID = s '{F8F77FFC-88E1-4d50-9F51-C30F3F35C4EF}' + CurVer = s 'PlainText.ScriptPlugin.1' + } + NoRemove CLSID + { + ForceRemove {F8F77FFC-88E1-4d50-9F51-C30F3F35C4EF} = s 'ScriptPlugin Class' + { + ProgID = s 'PlainText.ScriptPlugin.1' + VersionIndependentProgID = s 'PlainText.ScriptPlugin' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + 'TypeLib' = s '{1658A49F-0444-43E5-BA11-ED1AD1C256DB}' + } + } +} + +HKLM +{ + NoRemove SOFTWARE + { + NoRemove Decal + { + NoRemove Surrogates + { + ForceRemove {F8F77FFC-88E1-4d50-9F51-C30F3F35C4EF} = s 'VBScript Plugin Surrogate' + { + val Enabled = d '1' + val Extension = s 'acs' + val Description = s 'Script Plugin' + } + } + } + } +} diff --git a/Native/PlainText/ScriptSiteImpl.cpp b/Native/PlainText/ScriptSiteImpl.cpp new file mode 100644 index 0000000..6b62fce --- /dev/null +++ b/Native/PlainText/ScriptSiteImpl.cpp @@ -0,0 +1,92 @@ +// ScriptSiteImpl.cpp +// Implementation of IActiveScriptSiteImpl + +#include "stdafx.h" +#include "ScriptSiteImpl.h" + +HRESULT IActiveScriptSiteImpl::createScriptEngine( LPCOLESTR strLanguage ) +{ + CLSID clsidScript; + //CComPtr< IActiveScript > pScript; + HRESULT hRes = ::CLSIDFromProgID( strLanguage, &clsidScript ); + + _ASSERTE( SUCCEEDED( hRes ) ); + + hRes = ::CoCreateInstance( clsidScript, NULL, CLSCTX_INPROC_SERVER, IID_IActiveScript, reinterpret_cast< void ** >( &m_pScript ) ); + _ASSERTE( SUCCEEDED( hRes ) ); + + // Configure the script engine + //pScript->Clone(&m_pScript); + m_pScript->SetScriptSite( this ); + + return hRes; +} + +void IActiveScriptSiteImpl::addNamedItem( BSTR szName, IUnknown *pObject, DWORD dwFlags ) +{ + USES_CONVERSION; + HRESULT hRes = m_pScript->AddNamedItem( szName, dwFlags ); + + cObject o( szName, pObject ); + + m_objects.push_back( o ); +} + +STDMETHODIMP IActiveScriptSiteImpl::GetItemInfo(LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppunkItem, ITypeInfo **ppTypeInfo) +{ + // First look for the item + for( cObjectList::iterator i = m_objects.begin(); i != m_objects.end(); ++ i ) + { + if( ::wcscmp( i->m_strName, pstrName ) == 0 ) + { + if( dwReturnMask & SCRIPTINFO_IUNKNOWN ) + { + *ppunkItem = i->m_pObject; + ( *ppunkItem )->AddRef(); + } + + if( dwReturnMask & SCRIPTINFO_ITYPEINFO ) + { + CComPtr< IProvideClassInfo > pPCI; + HRESULT hRes = i->m_pObject->QueryInterface( &pPCI ); + if( SUCCEEDED( hRes ) ) + { + HRESULT hRes = pPCI->GetClassInfo( ppTypeInfo ); + _ASSERTE( SUCCEEDED( hRes ) ); + } + else + *ppTypeInfo = NULL; + } + + return S_OK; + } + } + + // The item was not found + return TYPE_E_ELEMENTNOTFOUND; +} + +STDMETHODIMP IActiveScriptSiteImpl::OnScriptError(IActiveScriptError *pase) +{ + USES_CONVERSION; + + EXCEPINFO ei; + DWORD dwCookie; + ULONG uLine; + LONG nChar; + CComBSTR strLine; + + pase->GetExceptionInfo( &ei ); + pase->GetSourcePosition( &dwCookie, &uLine, &nChar ); + pase->GetSourceLineText( &strLine ); + + TCHAR szError[ 1024 ]; + ::_stprintf( szError, _T( "0x%08X (%i, %i): %s" ), + ei.wCode, uLine, nChar, OLE2T( ei.bstrDescription ) ); + + ::MessageBox( NULL, szError, OLE2T( ei.bstrSource ), MB_ICONERROR | MB_OK ); + + _ASSERTE( FALSE ); + + return S_OK; +} diff --git a/Native/PlainText/ScriptSiteImpl.h b/Native/PlainText/ScriptSiteImpl.h new file mode 100644 index 0000000..3260795 --- /dev/null +++ b/Native/PlainText/ScriptSiteImpl.h @@ -0,0 +1,82 @@ +// ScriptSiteImpl.h +// Declaration of class IActiveScriptSiteImpl + +#ifndef __SCRIPTSITEIMPL_H +#define __SCRIPTSITEIMPL_H + +class IActiveScriptSiteImpl +: public IActiveScriptSite +{ + class cObject + { + public: + cObject( BSTR szName, IUnknown *pObject ) + : m_strName( szName ), + m_pObject( pObject ) + { + } + + _bstr_t m_strName; + CComPtr< IUnknown > m_pObject; + }; + +public: + + typedef std::deque< cObject > cObjectList; + cObjectList m_objects; + + CComPtr< IActiveScript > m_pScript; + + IActiveScriptSiteImpl() + : m_pScript( NULL ) + { + } + + HRESULT createScriptEngine( LPCOLESTR strLanguage ); + + // Helper functions + void addNamedItem( BSTR szName, IUnknown *pObject, DWORD dwFlags = SCRIPTITEM_ISSOURCE | SCRIPTITEM_ISVISIBLE ); + + // IActiveScriptSite Methods + STDMETHOD(GetLCID)(LCID *plcid) + { + return E_NOTIMPL; + } + + STDMETHOD(GetItemInfo)(LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppunkItem, ITypeInfo **ppTypeInfo); + STDMETHOD(GetDocVersionString)(BSTR *pbstrVersionString) + { + return E_NOTIMPL; + } + + STDMETHOD(OnScriptTerminate)(const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo) + { + return S_OK; + } + + STDMETHOD(OnStateChange)(SCRIPTSTATE ssScriptState) + { + if( ssScriptState == SCRIPTSTATE_CLOSED ) + { + m_objects.clear(); + m_pScript.Release(); + } + + return S_OK; + } + + STDMETHOD(OnScriptError)(IActiveScriptError *pase); + + STDMETHOD(OnEnterScript)() + { + return S_OK; + } + + STDMETHOD(OnLeaveScript)() + { + return S_OK; + } +}; + +#endif + diff --git a/Native/PlainText/ScriptView.cpp b/Native/PlainText/ScriptView.cpp new file mode 100644 index 0000000..2a0be56 --- /dev/null +++ b/Native/PlainText/ScriptView.cpp @@ -0,0 +1,93 @@ +// ScriptView.cpp : Implementation of CScriptView +#include "stdafx.h" +#include "PlainText.h" +#include "ScriptView.h" + +///////////////////////////////////////////////////////////////////////////// +// CScriptView + + +void CScriptView::loadView( cScriptPlugin *pPlugin, MSXML::IXMLDOMElementPtr &pView, LPDISPATCH *ppNewView ) +{ + USES_CONVERSION; + + // Get IPluginSite + CComPtr< IDecal > pDecal; + CComPtr< IInjectService > pInject; + pPlugin->m_pSite->get_Decal ( &pDecal ); + pDecal->get_Object ( _bstr_t ( _T( "services\\DecalPlugins.InjectService" ) ), + __uuidof ( IInjectService ), reinterpret_cast< LPVOID * > ( &pInject ) ); + + pInject->get_Site(&m_pOldSite); + + m_pPlugin = pPlugin; + + // Initialize a new script engine + CComBSTR strLanguage; + pPlugin->getLanguage( &strLanguage ); + + HRESULT hRes = createScriptEngine( strLanguage ); + + CComPtr< IActiveScriptParse > pParse; + m_pScript->QueryInterface( &pParse ); + + pParse->InitNew(); + + m_pOldSite->LoadViewObject( pView, &m_pView ); + + IViewEventsImpl< VIEW_ID, CScriptView >::DispEventAdvise( m_pView ); + + // Add in the plugin + CComPtr< IDispatch > pDispPlugin; + pPlugin->m_pScript->GetScriptDispatch( NULL, &pDispPlugin ); + addNamedItem( T2OLE( _T( "Plugin" ) ), pDispPlugin ); + + // Add in the site + addNamedItem( T2OLE( _T( "Site" ) ), static_cast< IDispatch * >( pPlugin ) ); + + // Add in the view as a base object + addNamedItem( T2OLE( _T( "View" ) ), static_cast< IDispatch * >( m_pView ) ); + + MSXML::IXMLDOMElementPtr pScript = pView->selectSingleNode( _T( "script" ) ); + + if( pScript.GetInterfacePtr() != NULL ) + { + EXCEPINFO ei; + HRESULT hRes = pParse->ParseScriptText( pScript->text, NULL, NULL, NULL, 0, 0, + SCRIPTTEXT_ISVISIBLE, NULL, &ei ); + + _ASSERTE( SUCCEEDED( hRes ) ); + } + + MSXML::IXMLDOMNodeListPtr pControls = pView->selectNodes( _T( ".//control[@name]" ) ); + for( MSXML::IXMLDOMElementPtr pControl = pControls->nextNode(); pControl.GetInterfacePtr() != NULL; pControl = pControls->nextNode() ) + { + CComPtr< IControl > pCtl; + _bstr_t strName = pControl->getAttribute( _T( "name" ) ).bstrVal; + m_pView->get_Control( strName, &pCtl ); + addNamedItem( strName, pCtl ); + } + + // Add ourself into the view list + m_pPlugin->m_views.push_back( this ); + + m_pScript->SetScriptState( SCRIPTSTATE_CONNECTED ); + m_pScript->GetScriptDispatch( NULL, ppNewView ); + + _ASSERTE( *ppNewView != NULL ); + + Fire_Initialize(); +} + +void CScriptView::destroy() +{ + Fire_Terminate(); + IViewEventsImpl< VIEW_ID, CScriptView >::DispEventUnadvise( m_pView ); + + m_pScript->SetScriptState( SCRIPTSTATE_DISCONNECTED ); + m_pScript->Close(); + + // Remove ourself from the list, the next line might destroy this object + m_pView.Release(); + m_pPlugin->removeView( this ); +} diff --git a/Native/PlainText/ScriptView.h b/Native/PlainText/ScriptView.h new file mode 100644 index 0000000..c5d7b11 --- /dev/null +++ b/Native/PlainText/ScriptView.h @@ -0,0 +1,83 @@ +// ScriptView.h : Declaration of the CScriptView + +// +// DEVELOPER COMMENTS (elphkotm) +// This is an import of the February Decal PlainText class, called +// cScriptView, I intentionally use an upper case C bye the way. +// + +#ifndef __SCRIPTVIEW_H_ +#define __SCRIPTVIEW_H_ + +#include "resource.h" // main symbols +#include "ScriptPlugin.h" +#include +#include "ScriptSiteImpl.h" +#include "../Inject/SinkImpl.h" +#include "PlainTextCP.h" + +#define VIEW_ID 1 + +///////////////////////////////////////////////////////////////////////////// +// CScriptView +class ATL_NO_VTABLE CScriptView : + public CComObjectRootEx, + public CComCoClass, + public IActiveScriptSiteImpl, + public IProvideClassInfo2Impl< &CLSID_ScriptView, &IID_IScriptView, &LIBID_PlainText >, + public IViewEventsImpl, + public IDispatchImpl, + public IConnectionPointContainerImpl, + public CProxyIScriptViewEvents< CScriptView > +{ +public: + CScriptView() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_SCRIPTVIEW) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CScriptView) + COM_INTERFACE_ENTRY(IActiveScriptSite) + COM_INTERFACE_ENTRY(IScriptView) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(CScriptView) +CONNECTION_POINT_ENTRY(DIID_IScriptViewEvents) +END_CONNECTION_POINT_MAP() + +BEGIN_SINK_MAP(CScriptView) + SINK_ENTRY_EX( VIEW_ID, DIID_IViewEvents, DISPID_ACTIVATE, onViewActivate ) + SINK_ENTRY_EX( VIEW_ID, DIID_IViewEvents, DISPID_DEACTIVATE, onViewDeactivate ) +END_SINK_MAP() + +// IScriptView +public: + void loadView( cScriptPlugin *pPlugin, MSXML::IXMLDOMElementPtr &pView, LPDISPATCH *ppNewView ); + void destroy(); + + CComPtr< IView > m_pView; + CComPtr< IPluginSite > m_pOldSite; + + cScriptPlugin *m_pPlugin; + _bstr_t m_strTemplate; + + // Method Calls + void __stdcall onViewActivate() + { + Fire_Activate(); + } + + void __stdcall onViewDeactivate() + { + Fire_Deactivate(); + } +}; + +#endif //__SCRIPTVIEW_H_ diff --git a/Native/PlainText/ScriptView.rgs b/Native/PlainText/ScriptView.rgs new file mode 100644 index 0000000..61aa18b --- /dev/null +++ b/Native/PlainText/ScriptView.rgs @@ -0,0 +1,26 @@ +HKCR +{ + PlainText.ScriptView.1 = s 'ScriptView Class' + { + CLSID = s '{B537CBEC-98C1-480A-910D-4C99E5E96273}' + } + PlainText.ScriptView = s 'ScriptView Class' + { + CLSID = s '{B537CBEC-98C1-480A-910D-4C99E5E96273}' + CurVer = s 'PlainText.ScriptView.1' + } + NoRemove CLSID + { + ForceRemove {B537CBEC-98C1-480A-910D-4C99E5E96273} = s 'ScriptView Class' + { + ProgID = s 'PlainText.ScriptView.1' + VersionIndependentProgID = s 'PlainText.ScriptView' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{1658A49F-0444-43E5-BA11-ED1AD1C256DB}' + } + } +} diff --git a/Native/PlainText/StdAfx.cpp b/Native/PlainText/StdAfx.cpp new file mode 100644 index 0000000..41a97ea --- /dev/null +++ b/Native/PlainText/StdAfx.cpp @@ -0,0 +1,11 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#include + +#include "..\Inject\SinkImpl.cpp" +#include "..\Inject\Inject_i.c" +#include "..\DecalControls\DecalControls_i.c" diff --git a/Native/PlainText/StdAfx.h b/Native/PlainText/StdAfx.h new file mode 100644 index 0000000..9628dfe --- /dev/null +++ b/Native/PlainText/StdAfx.h @@ -0,0 +1,36 @@ +// 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__211984B4_5E1D_4D2A_B7AD_0DC631864826__INCLUDED_) +#define AFX_STDAFX_H__211984B4_5E1D_4D2A_B7AD_0DC631864826__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#define _WIN32_WINDOWS 0x0410 +#define _ATL_APARTMENT_THREADED + +#pragma warning(disable:4530) + +//C Library includes +#include +#include + +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include + +#import +#include +#include +#include + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__211984B4_5E1D_4D2A_B7AD_0DC631864826__INCLUDED) diff --git a/Native/PlainText/resource.h b/Native/PlainText/resource.h new file mode 100644 index 0000000..9799e4f --- /dev/null +++ b/Native/PlainText/resource.h @@ -0,0 +1,20 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by PlainText.rc +// +#define IDS_PROJNAME 100 +#define IDR_SCRIPTPLUGIN 101 +#define IDR_PLUGINFACTORY 102 +#define IDR_SCRIPTVIEW 103 +#define IDR_DECALSCRIPT 104 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 105 +#endif +#endif diff --git a/NewNativeStubs/D3DService/NOTES.md b/NewNativeStubs/D3DService/NOTES.md new file mode 100644 index 0000000..5efc89f --- /dev/null +++ b/NewNativeStubs/D3DService/NOTES.md @@ -0,0 +1,34 @@ +# D3DService.DLL + +## Origin +**Entirely new** — no corresponding code in the old source tree. +Provides a higher-level 3D graphics API that plugins can use to render 3D objects +in the game world (meshes, 3D text, transformed geometry). + +## Binary Facts +- Size: **262 KB** (the largest of the new native modules) +- Type: COM in-process server (DLL) +- Standard 4 COM exports: `DllCanUnloadNow`, `DllGetClassObject`, `DllRegisterServer`, `DllUnregisterServer` + +## Key Imports +| DLL | Functions | +|-----|-----------| +| **Inject.DLL** | `BeginSceneO`, `EndSceneO` | +| **d3dx9_30.dll** | `D3DXCreateRenderToSurface`, `D3DXLoadMeshFromXResource`, `D3DXLoadMeshFromXW`, `D3DXCreateTextW`, `D3DXMatrixTranslation`, `D3DXMatrixRotationY`, and others | + +## What It Does +- Loads `.x` mesh files (from resources or from disk) +- Creates 3D text geometry +- Performs matrix transforms (translation, rotation) +- Renders to off-screen surfaces +- Essentially a "3D drawing toolkit" layered on top of Inject's scene hooks + +## Reconstruction Notes +- **LOOK AT:** `Managed/Decal.Interop.D3DService/` for the COM interface definitions + this DLL must implement. That directory contains **8 decompiled C# files**. +- There is **no old source** to reference. This must be reimplemented from: + 1. The COM interfaces defined in the interop assembly + 2. Knowledge of the D3DX9 API calls it makes + 3. Understanding of how `BeginSceneO`/`EndSceneO` work (see `Native/Inject/`) +- This is the most complex new module to reconstruct due to its size and the + lack of any prior source code. diff --git a/NewNativeStubs/DHS/NOTES.md b/NewNativeStubs/DHS/NOTES.md new file mode 100644 index 0000000..d12adc9 --- /dev/null +++ b/NewNativeStubs/DHS/NOTES.md @@ -0,0 +1,31 @@ +# DHS.DLL (Decal Hotkey System) + +## Origin +Factored out of the old **DecalInput.DLL** — the hotkey registration, detection, +and dispatch logic was extracted into its own COM server. + +## Binary Facts +- Size: **139 KB** +- Type: COM in-process server (DLL) +- Standard 4 COM exports: `DllCanUnloadNow`, `DllGetClassObject`, `DllRegisterServer`, `DllUnregisterServer` + +## What It Does +Manages hotkey bindings for Decal plugins — registering key combinations, detecting +when they are pressed, and firing events to the appropriate plugin. This was +previously part of DecalInput's responsibilities. + +## Reconstruction Notes +- **COMPARE WITH:** The old source files: + - `Native/DecalInput/Hotkey.cpp` + - `Native/DecalInput/Hotkey.h` + + The DHS module almost certainly started as a copy of that hotkey code, then was + expanded and wrapped in its own COM server. + +- **LOOK AT:** `Managed/Decal.Interop.DHS/` for the COM interface definitions + this DLL must implement. That directory contains **13 decompiled C# files**. + +- **Strategy:** Start by extracting the hotkey-related classes from the old + `DecalInput` source, then wrap them in the COM interfaces defined by the + interop assembly. The delta between old `Hotkey.cpp` and the new interop + interfaces will show what was added/changed. diff --git a/NewNativeStubs/DecalRender/NOTES.md b/NewNativeStubs/DecalRender/NOTES.md new file mode 100644 index 0000000..692c0a5 --- /dev/null +++ b/NewNativeStubs/DecalRender/NOTES.md @@ -0,0 +1,32 @@ +# DecalRender.DLL + +## Origin +Factored out of the old **Inject.DLL** — the rendering functionality (texture creation, +font rendering, surface blitting) that previously lived inside Inject was moved into +this dedicated COM server. + +## Binary Facts +- Size: **108 KB** +- Type: COM in-process server (DLL) +- Standard 4 COM exports: `DllCanUnloadNow`, `DllGetClassObject`, `DllRegisterServer`, `DllUnregisterServer` + +## Key Imports +| DLL | Functions | +|-----|-----------| +| **Inject.DLL** | `BeginSceneO`, `EndSceneO` | +| **d3dx9_30.dll** | `D3DXCreateTexture`, `D3DXLoadSurfaceFromMemory`, `D3DXCreateFontW`, and others | + +## What It Does +Provides the 2D rendering layer for Decal's overlay UI — creating textures, loading +surfaces from memory, and drawing text with DirectX fonts. Inject.DLL hooks the +Direct3D scene begin/end, and DecalRender plugs into those hooks to draw. + +## Reconstruction Notes +- **LOOK AT:** `Managed/Decal.Interop.Render/` for the COM interface definitions + this DLL must implement. That directory contains **19 decompiled C# files** + describing every interface, enum, and coclass. +- **LOOK AT:** The old `Native/Inject/` source for rendering code that was likely + moved here. Search for anything that touches `IDirect3DTexture9`, `ID3DXFont`, + surface blitting, etc. +- The interop assembly will define the exact vtable layout the managed side expects. + Every COM interface in `Decal.Interop.Render` maps to an interface this DLL exposes. diff --git a/NewNativeStubs/SpellFilter/NOTES.md b/NewNativeStubs/SpellFilter/NOTES.md new file mode 100644 index 0000000..2c4cccf --- /dev/null +++ b/NewNativeStubs/SpellFilter/NOTES.md @@ -0,0 +1,31 @@ +# SpellFilter.DLL + +## Origin +**Entirely new** — no corresponding code in the old source tree. +A dedicated module for filtering and managing spell-related game data. + +## Binary Facts +- Size: **185 KB** +- Type: COM in-process server (DLL) +- Standard 4 COM exports: `DllCanUnloadNow`, `DllGetClassObject`, `DllRegisterServer`, `DllUnregisterServer` + +## What It Does +Provides spell filtering functionality for Asheron's Call — likely parsing spell +tables from the DAT files, categorizing spells, and letting plugins query/filter +spells by school, level, name, or other criteria. + +## Reconstruction Notes +- **LOOK AT:** `Managed/Decal.Interop.SpellFilter/` for the COM interface definitions + this DLL must implement. That directory contains **20 decompiled C# files** — the + most of any interop assembly, suggesting a rich API surface. + +- There is **no old source** to reference. This must be reimplemented from: + 1. The COM interfaces defined in the interop assembly + 2. Understanding of AC's spell data structures (from the DAT file format) + 3. Possibly referencing `Native/DecalDat/` for how spell data was already + being parsed from DAT files + 4. Possibly referencing `Native/DecalFilters/` for the general filtering + pattern used by Decal + +- The 20 interop files suggest this module exposes multiple interfaces for + spell tables, individual spells, spell schools, filtering criteria, etc. diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..f2fb277 --- /dev/null +++ b/build.cmd @@ -0,0 +1,51 @@ +@echo off +REM Decal Open Source Build Script +REM Builds all managed C# projects and the WiX installer. +REM Native C++ projects (Inject.DLL, LauncherHook.DLL) must be built separately +REM with Visual Studio 2022 or CMake (x86/Win32 target). + +echo ============================================ +echo Decal Open Source Build +echo ============================================ +echo. + +REM Step 1: Build managed solution +echo [1/3] Building managed C# solution (25 projects)... +dotnet build Managed\Decal.sln -c Release +if errorlevel 1 ( + echo ERROR: Managed build failed. + exit /b 1 +) +echo Managed build succeeded. +echo. + +REM Step 2: Build native C++ projects (requires Visual Studio 2022) +echo [2/3] Native C++ projects... +if exist "Native\build\Release\Inject.DLL" ( + echo Native DLLs already built. +) else ( + echo NOTE: Native C++ projects must be built manually: + echo cd Native + echo cmake -G "Visual Studio 17 2022" -A Win32 -B build + echo cmake --build build --config Release + echo. + echo Skipping native build for now. +) +echo. + +REM Step 3: Build installer (requires WiX Toolset v5) +echo [3/3] Installer... +if exist "%USERPROFILE%\.dotnet\tools\wix.exe" ( + dotnet build Installer\Decal.Installer.wixproj -c Release ^ + -p:BuildOutput=..\Managed\bin\Release ^ + -p:NativeOutput=..\Native\build\Release +) else ( + echo NOTE: WiX Toolset not installed. Install with: + echo dotnet tool install --global wix + echo Skipping installer build. +) + +echo. +echo ============================================ +echo Build complete. +echo ============================================