aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/SDK/ml_xmlex
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/SDK/ml_xmlex')
-rw-r--r--Src/Plugins/SDK/ml_xmlex/api.h38
-rw-r--r--Src/Plugins/SDK/ml_xmlex/main.cpp69
-rw-r--r--Src/Plugins/SDK/ml_xmlex/main.h13
-rw-r--r--Src/Plugins/SDK/ml_xmlex/ml_xmlex.rc108
-rw-r--r--Src/Plugins/SDK/ml_xmlex/ml_xmlex.sln24
-rw-r--r--Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj241
-rw-r--r--Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj.filters41
-rw-r--r--Src/Plugins/SDK/ml_xmlex/readme.txt13
-rw-r--r--Src/Plugins/SDK/ml_xmlex/resource.h22
-rw-r--r--Src/Plugins/SDK/ml_xmlex/version.rc239
-rw-r--r--Src/Plugins/SDK/ml_xmlex/xmltest.xml8
-rw-r--r--Src/Plugins/SDK/ml_xmlex/xmltest2.xml7
-rw-r--r--Src/Plugins/SDK/ml_xmlex/xmlview.cpp301
13 files changed, 924 insertions, 0 deletions
diff --git a/Src/Plugins/SDK/ml_xmlex/api.h b/Src/Plugins/SDK/ml_xmlex/api.h
new file mode 100644
index 00000000..28cf5548
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/api.h
@@ -0,0 +1,38 @@
+#ifndef NULLSOFT_API_H
+#define NULLSOFT_API_H
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+#pragma once
+#endif
+
+#include <wtypes.h>
+
+#include <api/service/api_service.h>
+extern api_service *serviceManager;
+#define WASABI_API_SVC serviceManager
+
+#include <api/application/api_application.h>
+#define WASABI_API_APP applicationApi
+
+#include <api/service/waServiceFactory.h>
+
+#include "../Agave/Config/api_config.h"
+extern api_config *configApi;
+#define AGAVE_API_CONFIG configApi
+
+#include "../Agave/Language/api_language.h"
+
+#include "../Winamp/api_stats.h"
+extern api_stats *statsApi;
+#define AGAVE_API_STATS statsApi
+
+#include "../playlist/api_playlistmanager.h"
+extern api_playlistmanager *playlistManagerApi;
+#define AGAVE_API_PLAYLISTMANAGER playlistManagerApi
+
+HRESULT WasabiApi_Initialize(HINSTANCE hInstance, api_service *serviceApi);
+HRESULT WasabiApi_LoadDefaults();
+ULONG WasabiApi_AddRef(void);
+ULONG WasabiApi_Release(void);
+
+#endif
diff --git a/Src/Plugins/SDK/ml_xmlex/main.cpp b/Src/Plugins/SDK/ml_xmlex/main.cpp
new file mode 100644
index 00000000..bc0f69e4
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/main.cpp
@@ -0,0 +1,69 @@
+#include "main.h"
+#include "../Winamp/wa_ipc.h"
+#include "resource.h"
+#include "api.h"
+#include "../nu/AutoWide.h"
+#include "../nu/AutoChar.h"
+#include <strsafe.h>
+#include "..\..\General\gen_ml\menu.h"
+#include "..\..\General\gen_ml\ml_ipc_0313.h"
+
+#define PLUGIN_VERSION L"1.1"
+
+int Init();
+void Quit();
+UINT_PTR xmlex_treeItem = 0;
+api_service *serviceManager = 0;
+
+EXTERN_C winampMediaLibraryPlugin plugin =
+{
+ MLHDR_VER,
+ "Nullsoft XML Reader",
+ Init,
+ Quit,
+ xmlex_pluginMessageProc,
+ 0,
+ 0,
+ 0,
+};
+
+int Init()
+{
+ //starting point for wasabi, where services are shared
+ WASABI_API_SVC = (api_service *)SendMessage(plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_GET_API_SERVICE);
+
+ // waServiceFactory *sf = plugin.service->service_getServiceByGuid(languageApiGUID);
+ // if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface());
+
+ // wasabi based services for localisation support
+ // api_language* WASABI_API_LNG = 0;
+ // HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0;
+
+ // need to have this initialised before we try to do anything with localisation features
+ // WASABI_API_START_LANG(plugin.hDllInstance,MlImpexLangGUID);
+
+ // static wchar_t szDescription[256];
+ // StringCchPrintf(szDescription, ARRAYSIZE(szDescription),
+ // WASABI_API_LNGSTRINGW(IDS_NULLSOFT_XMLEX), PLUGIN_VERSION);
+ // plugin.description = (char*)szDescription;
+
+ //set up tree item, gen_ml will call xmlex_pluginMessageProc if/when the treeview item gets selected
+ MLTREEITEMW newTree;
+ newTree.size = sizeof(MLTREEITEMW);
+ newTree.parentId = 0;
+ newTree.title = L"XML Example";
+ newTree.hasChildren = 0;
+ newTree.id = 0;
+ SendMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM) &newTree, ML_IPC_TREEITEM_ADDW);
+ xmlex_treeItem = newTree.id;
+ return 0; // 0 for success. returning non-zero will cause gen_ml to abort loading your plugin
+}
+
+void Quit()
+{
+}
+
+extern "C" __declspec(dllexport) winampMediaLibraryPlugin *winampGetMediaLibraryPlugin()
+{
+ return &plugin;
+} \ No newline at end of file
diff --git a/Src/Plugins/SDK/ml_xmlex/main.h b/Src/Plugins/SDK/ml_xmlex/main.h
new file mode 100644
index 00000000..d0b8b435
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/main.h
@@ -0,0 +1,13 @@
+#ifndef _XMLEX_MAIN_H_
+#define _XMLEX_MAIN_H_
+#include <windows.h>
+#include <windowsx.h>
+#include "../nu/MediaLibraryInterface.h"
+#include "..\..\General\gen_ml\ml.h"
+#include "..\..\General\gen_ml\config.h"
+
+extern winampMediaLibraryPlugin plugin;
+INT_PTR xmlex_pluginMessageProc(int message_type, INT_PTR param1, INT_PTR param2, INT_PTR param3);
+extern UINT_PTR xmlex_treeItem;
+
+#endif \ No newline at end of file
diff --git a/Src/Plugins/SDK/ml_xmlex/ml_xmlex.rc b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.rc
new file mode 100644
index 00000000..6c22ba12
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.rc
@@ -0,0 +1,108 @@
+// 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
+ "#include ""version.rc2""\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_VIEW_XMLEX DIALOGEX 0, 0, 215, 120
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS |
+ WS_CLIPCHILDREN
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ CONTROL "",IDC_LIST,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,0,0,
+ 214,103
+ CONTROL "Load XML File",IDC_LOAD,"Button",BS_OWNERDRAW |
+ WS_TABSTOP,0,106,50,11
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_VIEW_XMLEX, DIALOG
+ BEGIN
+ RIGHTMARGIN, 214
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_NULLSOFT_XMLEX "Nullsoft XML Reader"
+ 65535 "{1A710E67-5180-49ac-8102-105856ED0A2F}"
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#include "version.rc2"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/Src/Plugins/SDK/ml_xmlex/ml_xmlex.sln b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.sln
new file mode 100644
index 00000000..e63e5ba8
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.sln
@@ -0,0 +1,24 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32802.440
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ml_xmlex", "ml_xmlex.vcxproj", "{BB556FAF-21F5-418E-9BDE-1F9EFF4AA042}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x86 = Debug|x86
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {BB556FAF-21F5-418E-9BDE-1F9EFF4AA042}.Debug|x86.ActiveCfg = Debug|Win32
+ {BB556FAF-21F5-418E-9BDE-1F9EFF4AA042}.Debug|x86.Build.0 = Debug|Win32
+ {BB556FAF-21F5-418E-9BDE-1F9EFF4AA042}.Release|x86.ActiveCfg = Release|Win32
+ {BB556FAF-21F5-418E-9BDE-1F9EFF4AA042}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {BE4BA4B4-72CA-4EA3-A44E-C3B01B5DE34F}
+ EndGlobalSection
+EndGlobal
diff --git a/Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj
new file mode 100644
index 00000000..6550896b
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{BB556FAF-21F5-418E-9BDE-1F9EFF4AA042}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>16.0.32629.160</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules />
+ <CodeAnalysisRuleAssemblies />
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules />
+ <CodeAnalysisRuleAssemblies />
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <LinkIncremental>false</LinkIncremental>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules />
+ <CodeAnalysisRuleAssemblies />
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules />
+ <CodeAnalysisRuleAssemblies />
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg">
+ <VcpkgEnabled>false</VcpkgEnabled>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <VcpkgConfiguration>Debug</VcpkgConfiguration>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..;..\..\..\wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>false</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader />
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..;..\..\..\wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..;..\..\..\wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <PrecompiledHeader />
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..;..\..\..\wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="main.cpp" />
+ <ClCompile Include="xmlview.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="main.h" />
+ <ClInclude Include="resource.h" />
+ <ClInclude Include="api.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="ml_xmlex.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\Wasabi\Wasabi.vcxproj">
+ <Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj.filters b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj.filters
new file mode 100644
index 00000000..dc42c30b
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/ml_xmlex.vcxproj.filters
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="main.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="xmlview.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="main.h">
+ <Filter>Source Files</Filter>
+ </ClInclude>
+ <ClInclude Include="api.h">
+ <Filter>Source Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="ml_xmlex.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Src/Plugins/SDK/ml_xmlex/readme.txt b/Src/Plugins/SDK/ml_xmlex/readme.txt
new file mode 100644
index 00000000..26c78641
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/readme.txt
@@ -0,0 +1,13 @@
+ml_xmlex.dll - Readme
+
+This is an example of implementation of Winamp's built in XML parser. Please make note that Winamp's XML service will parse all syntactically correct xml.
+
+XML file form for this plugin is exemplified in xmltest.xml, which is provided with the source for this plugin.
+XML files should be in the format of
+
+ <Library>
+ <Song Filename="" Artist="" Title="" /> (or)
+ <Song Filename="" Artist"" Title=""></Song>
+ </Library>
+
+with the extension .xml for this plugin to read it correctly. \ No newline at end of file
diff --git a/Src/Plugins/SDK/ml_xmlex/resource.h b/Src/Plugins/SDK/ml_xmlex/resource.h
new file mode 100644
index 00000000..8a39fb64
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/resource.h
@@ -0,0 +1,22 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by ml_xmlex.rc
+//
+
+#define IDS_NULLSOFT_XMLEX_OLD 0
+#define IDD_VIEW_XMLEX 101
+#define IDC_LIST 1001
+#define IDC_BUTTON1 1002
+#define IDC_LOAD 1003
+#define IDS_NULLSOFT_XMLEX 65534
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1004
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/Src/Plugins/SDK/ml_xmlex/version.rc2 b/Src/Plugins/SDK/ml_xmlex/version.rc2
new file mode 100644
index 00000000..6e4abc80
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/version.rc2
@@ -0,0 +1,39 @@
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+#include "..\..\..\Winamp\buildType.h"
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION WINAMP_PRODUCTVER
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", "Winamp SA"
+ VALUE "FileDescription", "Winamp Media Library Plug-in"
+ VALUE "FileVersion", "1,0,0,1"
+ VALUE "InternalName", "Nullsoft XML Playlist Loader"
+ VALUE "LegalCopyright", "Copyright © 2003-2023 Winamp SA"
+ VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA"
+ VALUE "OriginalFilename", "ml_xmlex.dll"
+ VALUE "ProductName", "Winamp"
+ VALUE "ProductVersion", STR_WINAMP_PRODUCTVER
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/Src/Plugins/SDK/ml_xmlex/xmltest.xml b/Src/Plugins/SDK/ml_xmlex/xmltest.xml
new file mode 100644
index 00000000..719208fc
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/xmltest.xml
@@ -0,0 +1,8 @@
+<!-- all valid versions of this in xml will work, however, filename, artist, and title must all be attributes of Song -->
+<Library>
+<Song Filename="C:\Music\artist - title.mp3" Artist="artist1" Title="title1"/>
+<Song Filename="C:\Music\artist2 - title2.wma" Artist="artist2" Title="title2"></Song>
+<Song Title="title3" Filename="C:\Music\artist3 - title3.mp3" Artist="artist3"/>
+<Song Filename="C:\Music\artist4 - title4.ogg" Title="title4" Artist="artist4"/>
+<Song Filename="C:\Music\artist5 - title5.aac" Artist="artist5" Title="title5"/>
+</Library> \ No newline at end of file
diff --git a/Src/Plugins/SDK/ml_xmlex/xmltest2.xml b/Src/Plugins/SDK/ml_xmlex/xmltest2.xml
new file mode 100644
index 00000000..b325ef57
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/xmltest2.xml
@@ -0,0 +1,7 @@
+<Library>
+<Song Filename="C:\Music\artist1 - title1.mp3" Artist="artist" Title="title"/>
+<Song Filename="C:\Music\artist2 - title2.wma" Artist="artist2" Title="title2"/>
+<Song Filename="C:\Music\artist3 - title3.mp3" Artist="artist3" Title="title3"/>
+<Song Filename="C:\Music\artist4 - title4.ogg" Artist="artist4" Title="title4"/>
+<Song Filename="C:\Music\artist5 - title5.aac" Artist="artist5" Title="title5"/>
+</Library> \ No newline at end of file
diff --git a/Src/Plugins/SDK/ml_xmlex/xmlview.cpp b/Src/Plugins/SDK/ml_xmlex/xmlview.cpp
new file mode 100644
index 00000000..463df934
--- /dev/null
+++ b/Src/Plugins/SDK/ml_xmlex/xmlview.cpp
@@ -0,0 +1,301 @@
+#include "main.h"
+#include <bfc/dispatch.h>
+#include <windowsx.h>
+#include "shlobj.h"
+#include "..\..\General\gen_ml\ml_ipc_0313.h"
+#include "..\..\General\gen_ml\childwnd.h"
+#include "../Winamp/wa_dlg.h"
+#include "../xml/ifc_xmlreadercallback.h"
+#include "../xml/obj_xml.h"
+#include <api/service/waServiceFactory.h>
+#include "resource.h"
+#include "api.h"
+
+typedef void (*ChildResizeFunc)(HWND, ChildWndResizeItem*, int);
+static ChildResizeFunc ml_childresize_init=0, ml_childresize_resize=0;
+
+typedef int (*HookDialogFunc)(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static HookDialogFunc ml_hook_dialog_msg = 0;
+
+typedef void (*DrawFunc)(HWND hwndDlg, int *tab, int tabsize);
+static DrawFunc ml_draw = 0;
+
+LRESULT CALLBACK view_xmlexDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
+static HWND m_hwnd;
+
+static ChildWndResizeItem xmlwnd_rlist[]={
+ {IDC_LIST,0x0011},
+ {IDC_LOAD,0x0101},
+};
+
+//--------------------------
+
+class ListXMLLoader : public ifc_xmlreadercallback
+{
+public:
+ ListXMLLoader(HWND _hwndList) : hwndList(_hwndList), index(0) {}
+ void loadSongFromXml(const wchar_t* filename, const wchar_t* artist, const wchar_t* title)
+ {
+ LVITEM lvi = {0, };
+ lvi.mask = LVIF_TEXT;
+ lvi.iItem = index;
+ lvi.pszText = (LPTSTR)filename;
+ lvi.cchTextMax = lstrlenW(filename);
+ SendMessage(hwndList, LVM_INSERTITEMW, 0, (LPARAM)&lvi);
+
+ lvi.iSubItem = 1;
+ lvi.pszText = (LPTSTR)artist;
+ lvi.cchTextMax = lstrlenW(artist);
+ SendMessageW(hwndList, LVM_SETITEMW, 0, (LPARAM)&lvi);
+
+ lvi.iSubItem = 2;
+ lvi.pszText = (LPTSTR)title;
+ lvi.cchTextMax = lstrlenW(title);
+ SendMessageW(hwndList, LVM_SETITEMW, 0, (LPARAM)&lvi);
+
+ index++;
+ }
+ void reset()
+ {
+ ListView_DeleteAllItems(hwndList);
+ index = 0;
+ }
+ void loadXML(wchar_t []);
+
+ /* XML loader callback */
+ void StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+ {
+ //read subtags of LIBRARY
+ if(!wcsicmp(xmlpath, L"LIBRARY\fSONG"))
+ {
+ //getItemValue() will return the value for an attribute
+ loadSongFromXml(params->getItemValue(L"FILENAME"), params->getItemValue(L"ARTIST"),params->getItemValue(L"TITLE"));
+ }
+ }
+
+private:
+ HWND hwndList;
+ int index;
+
+protected: // this is a Wasabi object, so we need to declare a dispatch table
+ RECVS_DISPATCH;
+};
+
+/* Dispatch table for a Wasabi object */
+#define CBCLASS ListXMLLoader
+START_DISPATCH;
+VCB(ONSTARTELEMENT, StartTag)
+END_DISPATCH;
+#undef CBCLASS
+
+/* helper function for ListXMLLoader::loadXML */
+static bool LoadFile(obj_xml *parser, const wchar_t *filename)
+{
+ HANDLE file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
+
+ if (file == INVALID_HANDLE_VALUE)
+ return false;
+
+ char data[1024];
+
+ DWORD bytesRead;
+ while (true)
+ {
+ if (ReadFile(file, data, 1024, &bytesRead, NULL) && bytesRead)
+ {
+ parser->xmlreader_feed(data, bytesRead);
+ }
+ else
+ break;
+ }
+
+ CloseHandle(file);
+ parser->xmlreader_feed(0, 0);
+
+ return true;
+}
+
+void ListXMLLoader::loadXML(wchar_t xmlfile[MAX_PATH] = L"xmltest.xml")
+{
+ // reset the listview state
+ reset();
+
+ // get an XML parser object from the service manager
+ obj_xml *parser=0;
+ waServiceFactory *parserFactory = WASABI_API_SVC->service_getServiceByGuid(obj_xmlGUID);
+ if (parserFactory)
+ parser = (obj_xml *)parserFactory->getInterface();
+
+ if (parser)
+ {
+ //set up a tag that we can read
+ //within StartTag(), we can read all subtags of this tag
+ parser->xmlreader_registerCallback(L"LIBRARY\f*", this);
+ parser->xmlreader_open();
+
+ LoadFile(parser, xmlfile);
+
+ parser->xmlreader_unregisterCallback(this);
+ parser->xmlreader_close();
+ parserFactory->releaseInterface(parser);
+ }
+}
+//--------------------------
+
+/* This function gets called directly from gen_ml when it wants our plugin to do something
+ we're only handling dialog creation, but there are lots of other messages a full-featured
+ plugin would deal with */
+
+INT_PTR xmlex_pluginMessageProc(int message_type, INT_PTR param1, INT_PTR param2, INT_PTR param3)
+{
+ if (message_type == ML_MSG_TREE_ONCREATEVIEW && param1 == xmlex_treeItem)
+ {
+ return (INT_PTR)CreateDialog(plugin.hDllInstance, MAKEINTRESOURCE(IDD_VIEW_XMLEX), (HWND)(LONG_PTR)param2, (DLGPROC)view_xmlexDialogProc);
+ }
+ return 0;
+}
+
+static BOOL xmlex_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
+{
+ /* gen_ml has some helper functions to deal with skinned dialogs,
+ we're going to grab their function pointers.
+ for definition of magic numbers, see gen_ml/ml.h */
+ if (!ml_childresize_init)
+ {
+ /* skinning helper functions */
+ ml_hook_dialog_msg = (HookDialogFunc)SendMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM)2, ML_IPC_SKIN_WADLG_GETFUNC);
+ ml_draw = (DrawFunc)SendMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM)3, ML_IPC_SKIN_WADLG_GETFUNC);
+
+ /* resizing helper functions */
+ ml_childresize_init = (ChildResizeFunc)SendMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM)32, ML_IPC_SKIN_WADLG_GETFUNC);
+ ml_childresize_resize = (ChildResizeFunc)SendMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM)33, ML_IPC_SKIN_WADLG_GETFUNC);
+ }
+
+ m_hwnd=hwnd;
+ HWND listWnd = GetDlgItem(hwnd,IDC_LIST);
+
+ /* add listview columns */
+ LVCOLUMN lvc = {0, };
+ lvc.mask = LVCF_TEXT | LVCF_WIDTH;
+ lvc.pszText = (LPTSTR)L"Filename";
+ lvc.cx = 250;
+ SendMessageW(listWnd, LVM_INSERTCOLUMNW, (WPARAM)0, (LPARAM)&lvc);
+
+ lvc.pszText = (LPTSTR)L"Artist";
+ lvc.cx = 150;
+ SendMessageW(listWnd, LVM_INSERTCOLUMNW, (WPARAM)1, (LPARAM)&lvc);
+
+ lvc.pszText = (LPTSTR)L"Title";
+ lvc.cx = 150;
+ SendMessageW(listWnd, LVM_INSERTCOLUMNW, (WPARAM)2, (LPARAM)&lvc);
+
+ /* skin dialog */
+ MLSKINWINDOW sw;
+ sw.skinType = SKINNEDWND_TYPE_DIALOG;
+ sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT;
+ sw.hwndToSkin = hwnd;
+ MLSkinWindow(plugin.hwndLibraryParent, &sw);
+
+ /* skin listview */
+ sw.hwndToSkin = listWnd;
+ sw.skinType = SKINNEDWND_TYPE_LISTVIEW;
+ sw.style = SWLVS_FULLROWSELECT | SWLVS_DOUBLEBUFFER | SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS;
+ MLSkinWindow(plugin.hwndLibraryParent, &sw);
+
+ /* skin button */
+ sw.skinType = SKINNEDWND_TYPE_BUTTON;
+ sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT;
+ sw.hwndToSkin = GetDlgItem(hwnd, IDC_LOAD);
+ MLSkinWindow(plugin.hwndLibraryParent, &sw);
+
+ ml_childresize_init(hwnd, xmlwnd_rlist, sizeof(xmlwnd_rlist) / sizeof(xmlwnd_rlist[0]));
+
+ //all other initialization is done. lets wait 20ms before we actually do anything with this plugin
+ //this way other (more important) things finish before this does
+ SetTimer(hwnd,101,20,NULL);
+
+ return FALSE;
+}
+
+static BOOL xmlex_OnSize(HWND hwnd, UINT state, int cx, int cy)
+{
+ if (state != SIZE_MINIMIZED)
+ ml_childresize_resize(hwnd, xmlwnd_rlist, sizeof(xmlwnd_rlist) / sizeof(xmlwnd_rlist[0]));
+ return FALSE;
+}
+
+static BOOL xmlex_OnDestroy(HWND hwnd)
+{
+ m_hwnd=0;
+ return FALSE;
+}
+static void xmlex_OnTimer(HWND hwnd, UINT id)
+{
+ if (id == 101)
+ {
+ KillTimer(hwnd,101);
+ // populate list with default local file, no pre-loaded xml file if not in working dir (really will only pre-load something in debug mode)
+ ListXMLLoader loader(GetDlgItem(hwnd, IDC_LIST));
+ loader.loadXML();
+ }
+}
+static BOOL xmlex_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
+{
+ switch(id) {
+ case IDC_LOAD:
+ {
+ wchar_t filename[256] = L"";
+ //browse box supported in windows 2000+
+ //if this doesnt work for you (old versions of windows) just know that the file name is set in ofn.lpstrFile which is then moved to filename variable
+ OPENFILENAME ofn = {0};
+ ofn.lStructSize = sizeof (OPENFILENAME);
+ ofn.hwndOwner=hwnd;
+ ofn.lpstrFilter=L"XML Files (*.xml)\0*.XML\0\0";
+ ofn.lpstrCustomFilter=NULL;
+ ofn.nFilterIndex=1;
+ ofn.lpstrFile=filename; //contains file name after user has selected it
+ ofn.nMaxFile=MAX_PATH;
+ ofn.lpstrFileTitle=NULL;
+ ofn.lpstrInitialDir=NULL;
+ ofn.Flags=OFN_PATHMUSTEXIST;
+ GetOpenFileName(&ofn);
+ if(*filename) //do not load on browse -> cancel
+ {
+ ListXMLLoader loader(GetDlgItem(hwnd, IDC_LIST));
+ loader.loadXML(filename);
+ }
+ }
+ break;
+ }
+ return 0;
+}
+
+LRESULT CALLBACK view_xmlexDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
+{
+ /* first, ask the dialog skinning system if it wants to do anything with the message
+ the function pointer gets set during WM_INITDIALOG so might be NULL for the first few messages
+ in theory we could grab it right here if we don't have it, but it's not necessary
+ and I wanted to put all the function pointer gathering code in the same place for this example */
+ if (ml_hook_dialog_msg)
+ {
+ INT_PTR a = ml_hook_dialog_msg(hwndDlg, uMsg, wParam, lParam);
+ if (a)
+ return a;
+ }
+
+ switch(uMsg) {
+ HANDLE_MSG(hwndDlg, WM_INITDIALOG, xmlex_OnInitDialog);
+ HANDLE_MSG(hwndDlg, WM_TIMER, xmlex_OnTimer);
+ HANDLE_MSG(hwndDlg, WM_COMMAND, xmlex_OnCommand);
+ HANDLE_MSG(hwndDlg, WM_SIZE, xmlex_OnSize);
+ case WM_PAINT:
+ {
+ int tab[] = { IDC_LIST|DCW_SUNKENBORDER};
+ ml_draw(hwndDlg, tab, sizeof(tab) / sizeof(tab[0]));
+ }
+ return 0;
+ HANDLE_MSG(hwndDlg, WM_DESTROY, xmlex_OnDestroy);
+
+ }
+ return FALSE;
+}