diff --git a/legacy/.gitignore b/legacy/.gitignore
deleted file mode 100644
index a332d81..0000000
--- a/legacy/.gitignore
+++ /dev/null
@@ -1,405 +0,0 @@
-# Custom ignore
-# ignore build directory
-builds/
-Debug_MB/
-Debug_UNICODE/
-Release_UNICODE/
-
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
-
-# User-specific files
-*.rsuser
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Mono auto generated files
-mono_crash.*
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-[Ww][Ii][Nn]32/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
-bld/
-[Bb]in/
-[Oo]bj/
-[Ll]og/
-[Ll]ogs/
-
-# Visual Studio 2015/2017 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# Visual Studio 2017 auto generated files
-Generated\ Files/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-# NUnit
-*.VisualState.xml
-TestResult.xml
-nunit-*.xml
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-# ASP.NET Scaffolding
-ScaffoldingReadMe.txt
-
-# StyleCop
-StyleCopReport.xml
-
-# Files built by Visual Studio
-*_i.c
-*_p.c
-*_h.h
-*.ilk
-*.meta
-*.obj
-*.iobj
-*.pch
-*.pdb
-*.ipdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*_wpftmp.csproj
-*.log
-*.tlog
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# Visual Studio Trace Files
-*.e2e
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Coverlet is a free, cross platform Code Coverage Tool
-coverage*.json
-coverage*.xml
-coverage*.info
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# NuGet Symbol Packages
-*.snupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-*.appxbundle
-*.appxupload
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!?*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-*.rptproj.rsuser
-*- [Bb]ackup.rdl
-*- [Bb]ackup ([0-9]).rdl
-*- [Bb]ackup ([0-9][0-9]).rdl
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-node_modules/
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio 6 auto-generated project file (contains which files were open etc.)
-*.vbp
-
-# Visual Studio 6 workspace and project file (working project files containing files to include in project)
-*.dsw
-*.dsp
-
-# Visual Studio 6 technical files
-*.ncb
-*.aps
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# CodeRush personal settings
-.cr/personal
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
-
-# Azure Stream Analytics local run output
-ASALocalRun/
-
-# MSBuild Binary and Structured Log
-*.binlog
-
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
-
-# MFractors (Xamarin productivity tool) working folder
-.mfractor/
-
-# Local History for Visual Studio
-.localhistory/
-
-# Visual Studio History (VSHistory) files
-.vshistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
-
-# Ionide (cross platform F# VS Code tools) working folder
-.ionide/
-
-# Fody - auto-generated XML schema
-FodyWeavers.xsd
-
-# VS Code files for those working on multiple tools
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-*.code-workspace
-
-# Local History for Visual Studio Code
-.history/
-
-# Windows Installer files from build outputs
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# JetBrains Rider
-*.sln.iml
diff --git a/legacy/README.md b/legacy/README.md
deleted file mode 100644
index f37494f..0000000
--- a/legacy/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# wfassoc
-
-**W**indows **F**ile **Assoc**iation Library
-
-**Work In Progress**
-
-## Introduction
-
-* wfassoc: Main library
-* wfassoc_example: A full example about how to use this library
diff --git a/legacy/wfassoc.sln b/legacy/wfassoc.sln
deleted file mode 100644
index 2c9c25d..0000000
--- a/legacy/wfassoc.sln
+++ /dev/null
@@ -1,51 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31702.278
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wfassoc", "wfassoc\wfassoc.vcxproj", "{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wfassoc_example", "wfassoc_example\wfassoc_example.vcxproj", "{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug_MB|x64 = Debug_MB|x64
- Debug_MB|x86 = Debug_MB|x86
- Debug_UNICODE|x64 = Debug_UNICODE|x64
- Debug_UNICODE|x86 = Debug_UNICODE|x86
- Release_UNICODE|x64 = Release_UNICODE|x64
- Release_UNICODE|x86 = Release_UNICODE|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x64.ActiveCfg = Debug|x64
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x64.Build.0 = Debug|x64
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x86.ActiveCfg = Debug|Win32
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x86.Build.0 = Debug|Win32
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x64.ActiveCfg = Debug|x64
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x64.Build.0 = Debug|x64
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x86.ActiveCfg = Debug|Win32
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x86.Build.0 = Debug|Win32
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x64.ActiveCfg = Release|x64
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x64.Build.0 = Release|x64
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x86.ActiveCfg = Release|Win32
- {4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x86.Build.0 = Release|Win32
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x64.ActiveCfg = Debug_UNICODE|x64
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x64.Build.0 = Debug_UNICODE|x64
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x86.ActiveCfg = Debug_MB|Win32
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x86.Build.0 = Debug_MB|Win32
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x64.ActiveCfg = Debug_UNICODE|x64
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x64.Build.0 = Debug_UNICODE|x64
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x86.ActiveCfg = Debug_UNICODE|Win32
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x86.Build.0 = Debug_UNICODE|Win32
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x64.ActiveCfg = Release_UNICODE|x64
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x64.Build.0 = Release_UNICODE|x64
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x86.ActiveCfg = Release_UNICODE|Win32
- {AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x86.Build.0 = Release_UNICODE|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {1AD32362-840E-4399-A7D5-26A0B67A614D}
- EndGlobalSection
-EndGlobal
diff --git a/legacy/wfassoc/wfassoc.def b/legacy/wfassoc/wfassoc.def
deleted file mode 100644
index 488d973..0000000
--- a/legacy/wfassoc/wfassoc.def
+++ /dev/null
@@ -1,9 +0,0 @@
-LIBRARY wfassoc
-EXPORTS
-
-WFInstallApplicationW
-WFInstallApplicationA
-WFUninstallApplicationW
-WFUninstallApplicationA
-WFGenerateProgIDW
-WFGenerateProgIDA
diff --git a/legacy/wfassoc/wfassoc.vcxproj b/legacy/wfassoc/wfassoc.vcxproj
deleted file mode 100644
index dee1b62..0000000
--- a/legacy/wfassoc/wfassoc.vcxproj
+++ /dev/null
@@ -1,165 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
- Release
- Win32
-
-
- Debug
- x64
-
-
- Release
- x64
-
-
-
- 16.0
- Win32Proj
- {4aac8f0c-3e1c-4584-b682-05bbf96a813f}
- wfassoc
- 10.0
-
-
-
- DynamicLibrary
- true
- v142
- NotSet
-
-
- DynamicLibrary
- false
- v142
- true
- NotSet
-
-
- Application
- true
- v142
- Unicode
-
-
- Application
- false
- v142
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- $(SolutionDir)builds\Debug\
-
-
- false
- $(SolutionDir)builds\Release\
-
-
- true
-
-
- false
-
-
-
- Level3
- true
- WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- CompileAsC
-
-
- Console
- true
- wfassoc.def
-
-
-
-
- Level3
- true
- true
- true
- WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- CompileAsC
-
-
- Console
- true
- true
- true
- wfassoc.def
-
-
-
-
- Level3
- true
- _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
- wfassoc.def
-
-
-
-
- Level3
- true
- true
- true
- NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
- true
- true
- wfassoc.def
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/legacy/wfassoc/wfassoc.vcxproj.filters b/legacy/wfassoc/wfassoc.vcxproj.filters
deleted file mode 100644
index 5e8d923..0000000
--- a/legacy/wfassoc/wfassoc.vcxproj.filters
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- 头文件
-
-
- 头文件
-
-
- 头文件
-
-
-
-
- 源文件
-
-
- 源文件
-
-
- 源文件
-
-
-
-
- 源文件
-
-
-
\ No newline at end of file
diff --git a/legacy/wfassoc/wfassoc_core.c b/legacy/wfassoc/wfassoc_core.c
deleted file mode 100644
index 14b0254..0000000
--- a/legacy/wfassoc/wfassoc_core.c
+++ /dev/null
@@ -1,407 +0,0 @@
-#include "wfassoc_core.h"
-#include
-#include
-
-// private function and variable declearions.
-// the function with _AL tail mean that the value returned by function is allocated from heap and should be free manually.
-// otherwise, the tail of _NAL mean this function will not allocate any new memeory.
-
-///
-/// Convert multi byte string to wide char string
-/// Notice: this function will allocate memory for returns and it should be released safely.
-///
-/// The string will be converted
-/// The error happend during converting
-/// The string has been converted. If return NULL, it mean that the converting failed.
-//WFERROR ConvMultiByteToWideChar(CHAR* source);
-WFERROR WFSplitAppPath(WFString* app_path, WFString* app_name, WFString* base_path);
-//WFERROR Strcat(WCHAR* str1, WCHAR* str2);
-//WFERROR WFGetBasePathFromAppPath(WFString* app_path, WFString* base_path);
-WFERROR WFSplitSupportedTypesString(wchar_t* typesString, WFLinkedList* list);
-
-void WFPrintflnInDebug();
-
-// some effective reg function
-LSTATUS WFRegOpenKeyWithCreation(HKEY hkey, LPCWSTR lpSubKey, PHKEY phkResult);
-LSTATUS WFRegSetStringValue(HKEY hkey, LPCWSTR lpValueName, const WCHAR* data);
-
-#define LEGACY_PROGID_FORMAT L"%s.%s.%d"
-#define WFALLOC(type,count) (type*)malloc(sizeof(type)*count);
-#define SAFE_EXEC_WIN32(wfError, recvError, skipLabel, function) recvError=function; if(recvError!=ERROR_SUCCESS) {wfError = WFERROR_WIN32;goto skipLabel;}
-#define SAFE_EXEC_WF_LABEL(wfError, skipLabel, function) if((wfError=function)!=WFERROR_OK) {goto skipLabel;}
-#define SAFE_EXEC_WF_RETURN(wfError, function) if((wfError=function)!=WFERROR_OK) {return wfError;}
-#define SAFE_EXEC_STRALLOC(wfError, skipLabel, vStr, function) vStr=function; if(vStr==NULL) {wfError = WFERROR_ALLOC;goto skipLabel;}
-#define SAFE_FREE_PTR(obj) if(obj!=NULL){free(obj);obj=NULL;}
-#define SAFE_FREE_HKEY(hkey) if(hkey!=NULL&&hkey!=INVALID_HANDLE_VALUE){RegCloseKey(hkey);hkey=NULL;}
-
-// public function implements.
-
-WFERROR WFInstallApplication(WFAPP_PROFILE* profile) {
- if (profile->WFVersion != WFVERSION) return WFERROR_INVALID_VERSION;
-
- WFERROR wf_error = WFERROR_OK;
- LSTATUS win32_error = ERROR_SUCCESS;
- //WCHAR* itemSupportedTypes = NULL;
-
- // ==================================
- // generate necessary data
-
- // init string
- WFString* strProgID = NULL,
- * strAppPath = NULL,
- * strAppBasePath = NULL,
- * strAppFileName = NULL;
-
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Alloc(&strProgID)
- );
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Alloc_Wchar(&strAppPath, profile->AppPath)
- );
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Alloc(&strAppBasePath)
- );
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Alloc(&strAppFileName)
- );
-
- // write string
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Printf(strProgID, LEGACY_PROGID_FORMAT, profile->ProgID_Vendor, profile->ProgID_Component, profile->ProgID_Version)
- );
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFSplitAppPath(strAppPath, strAppFileName, strAppBasePath)
- );
-
- WFString* regpathAppPaths = NULL,
- * regpathApplicationsRealName = NULL,
- * regpathApplicationsProgId = NULL;
-
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Alloc_Wchar(®pathAppPaths, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\")
- );
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Concat_String(regpathAppPaths, strAppFileName)
- );
-
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Alloc_Wchar(®pathApplicationsRealName, L"SOFTWARE\\Classes\\Applications\\")
- );
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Concat_String(regpathApplicationsRealName, strAppFileName)
- );
-
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Alloc_Wchar(®pathApplicationsProgId, L"SOFTWARE\\Classes\\Applications\\")
- );
- SAFE_EXEC_WF_LABEL(wf_error, final_process,
- WFString_Concat_String(regpathApplicationsProgId, strProgID)
- );
-
-
- //WCHAR* strAppPath = NULL,
- // * strPath = NULL,
- // * strApplications = NULL,
- // * strProgID = NULL,
- // * strOpenWithList = NULL;
- //SAFE_EXEC_STRALLOC(error, final_process,
- // strPath, GetPathFromAppPath_AL(profile->AppPath)
- //);
- //SAFE_EXEC_STRALLOC(error, final_process,
- // strAppPath, Strcat_AL(
- // L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\",
- // GetAppNameFromAppPath_NAL(profile->AppPath)
- //)
- //);
- //SAFE_EXEC_STRALLOC(error, final_process,
- // strProgID, Strcat_AL(
- // L"SOFTWARE\\Classes\\Applications\\",
- // profile->ProgID
- //)
- //);
- //SAFE_EXEC_STRALLOC(error, final_process,
- // strApplications, Strcat_AL(
- // L"SOFTWARE\\Classes\\Applications\\",
- // GetAppNameFromAppPath_NAL(profile->AppPath)
- //)
- //);
-
- // generate necessary HKEY
- HKEY nodeAppPath = NULL,
- nodeApplications = NULL,
- nodeApplications_Verb = NULL,
- nodeApplications_SupportedTypes = NULL,
- nodeProgID = NULL,
- nodeProgID_Verb = NULL,
- nodeClasses = NULL,
- nodeExt = NULL,
- nodeExt_OpenWithProgIds = NULL,
- nodeExt_OpenWithList = NULL;
-
- // register in `App Paths`
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, strAppPath, &nodeAppPath)
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, strApplications, &nodeApplications)
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(nodeApplications, L"shell\\open\\command", &nodeApplications_Verb)
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(nodeApplications, L"SupportedTypes", &nodeApplications_SupportedTypes)
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, strProgID, &nodeProgID)
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(nodeProgID, L"shell\\open\\command", &nodeProgID_Verb)
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, L"SOFTWARE\\Classes", &nodeClasses)
- );
-
- // operate HKEY
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegSetStringValue(nodeAppPath, NULL, profile->AppPath) // visit Default key
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegSetStringValue(nodeAppPath, L"Path", strPath)
- );
-
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegSetStringValue(nodeApplications_Verb, NULL, profile->AppCommand) // visit Default key
- );
-
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegSetStringValue(nodeProgID_Verb, NULL, profile->AppCommand) // visit Default key
- );
-
-
- while ((itemSupportedTypes = IterateSupportedTypesString_NAL(profile->SupportedTypes, itemSupportedTypes)) != NULL) {
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegSetStringValue(nodeApplications_SupportedTypes, itemSupportedTypes, NULL) // register supported type with blank item
- );
-
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(nodeClasses, itemSupportedTypes, &nodeExt)
- );
- if (profile->SetAsDefault) {
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegSetStringValue(nodeExt, NULL, profile->ProgID) // visit Default key
- );
- }
- if (profile->ShowInOpenWithMenu) {
- if (profile->UseOpenWithList) {
- // use Windows XP node
- SAFE_EXEC_STRALLOC(error, final_process,
- strOpenWithList, Strcat_AL(
- L"OpenWithList\\",
- GetAppNameFromAppPath_NAL(profile->AppPath)
- )
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(nodeExt, itemSupportedTypes, &nodeExt_OpenWithList);
- );
-
- SAFE_FREE_PTR(strOpenWithList);
- SAFE_FREE_HKEY(nodeExt_OpenWithList);
- } else {
- // use Windows Vista node
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegOpenKeyWithCreation(nodeExt, itemSupportedTypes, &nodeExt_OpenWithProgIds);
- );
- SAFE_EXEC_WIN32(error, win32_error, final_process,
- WFRegSetStringValue(nodeExt_OpenWithProgIds, profile->ProgID, NULL)
- );
-
- SAFE_FREE_HKEY(nodeExt_OpenWithProgIds);
- }
- }
- SAFE_FREE_HKEY(nodeExt);
- }
-
-final_process:
- // free HKEY and strings
- SAFE_FREE_HKEY(nodeAppPath);
- SAFE_FREE_HKEY(nodeApplications);
- SAFE_FREE_HKEY(nodeApplications_Verb);
- SAFE_FREE_HKEY(nodeApplications_SupportedTypes);
- SAFE_FREE_HKEY(nodeProgID);
- SAFE_FREE_HKEY(nodeProgID_Verb);
- SAFE_FREE_HKEY(nodeClasses);
- SAFE_FREE_HKEY(nodeExt);
- SAFE_FREE_HKEY(nodeExt_OpenWithProgIds);
- SAFE_FREE_HKEY(nodeExt_OpenWithList);
-
- SAFE_FREE_PTR(strAppPath);
- SAFE_FREE_PTR(strPath);
- SAFE_FREE_PTR(strApplications);
- SAFE_FREE_PTR(strProgID);
-
- // order uninstall to wipe out all written data
- // if function failed
- if (error != WFERROR_OK)
- WFUninstallApplicationW(profile);
-
- // active changes
- SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
-
- // return error
- return error;
-}
-
-//WFERROR WFInstallApplicationA(WFAPP_PROFILEA* profile) {
-// return WFERROR_OK;
-//}
-//
-//WFERROR WFUninstallApplicationW(WFAPP_PROFILEW* profile) {
-// if (profile->WFVersion != WFVERSION) return WFERROR_INVALID_VERSION;
-//
-// return WFERROR_OK;
-//}
-//
-//WFERROR WFUninstallApplicationA(WFAPP_PROFILEA* profile) {
-// return WFERROR_OK;
-//}
-//
-//WFERROR WFGenerateProgIDW(WCHAR* vendor, WCHAR* component, INT version, WCHAR* result, INT* result_length) {
-// if (result_length == NULL) return WFERROR_NULLPTR;
-// if (result == NULL) {
-// *result_length = _snwprintf(NULL, 0, LEGACY_PROGID_FORMATW, vendor, component, version) + 1;
-// } else {
-// int write_result = _snwprintf(result, *result_length, LEGACY_PROGID_FORMATW, vendor, component, version);
-// if (write_result < 0 || write_result >= *result_length) return WFERROR_INSUFFICIENT_BUFFER;
-// }
-// return WFERROR_OK;
-//}
-//
-//WFERROR WFGenerateProgIDA(CHAR* vendor, CHAR* component, INT version, CHAR* result, INT* result_length) {
-// if (result_length == NULL) return WFERROR_NULLPTR;
-// if (result == NULL) {
-// *result_length = _snprintf(NULL, 0, LEGACY_PROGID_FORMATA, vendor, component, version) + 1;
-// } else {
-// int write_result = _snprintf(result, *result_length, LEGACY_PROGID_FORMATA, vendor, component, version);
-// if (write_result < 0 || write_result >= *result_length) return WFERROR_INSUFFICIENT_BUFFER;
-// }
-// return WFERROR_OK;
-//}
-
-
-// private function and variable implements.
-
-//WCHAR* ConvMultiByteToWideChar_AL(CHAR* source) {
-// WCHAR* dest = NULL;
-// size_t sourceLength = strlen(source);
-//
-// int destLength = MultiByteToWideChar(CP_ACP, 0, source, sourceLength, NULL, 0);
-// if (destLength <= 0) return NULL;
-// destLength += 10;
-//
-// dest = WFALLOC(WCHAR, destLength);
-// if (dest == NULL) return NULL;
-//
-// memset(dest, 0, sizeof(WCHAR) * destLength);
-// int error = MultiByteToWideChar(CP_ACP, 0, source, sourceLength, dest, destLength);
-// if (error <= 0) {
-// free(dest);
-// return NULL;
-// }
-//
-// return dest;
-//}
-
-WFERROR WFSplitAppPath(WFString* app_path, WFString* app_name, WFString* base_path) {
- WFERROR ec;
- wchar_t* lastSlash, *src, *ptr;
- SAFE_EXEC_WF_RETURN(ec, WFString_GetData(app_path, &ptr));
- src = lastSlash = ptr;
-
- while (*ptr != L'\0') {
- if (*ptr == L'\\' || *ptr == L'/') {
- lastSlash = ptr;
- }
- ptr++;
- }
-
- SAFE_EXEC_WF_RETURN(ec, WFString_SubString(app_path, base_path, 0, lastSlash - src));
- SAFE_EXEC_WF_RETURN(ec, WFString_SetData(app_name, ++lastSlash));
- return WFERROR_OK;
-}
-
-//WCHAR* Strcat_AL(WCHAR* str1, WCHAR* str2) {
-// size_t length = wcslen(str1) + wcslen(str2) + 10;
-//
-// WCHAR* dest = NULL;
-// dest = WFALLOC(WCHAR, length);
-// if (dest == NULL) return NULL;
-//
-// wcscpy(dest, str1);
-// wcscat(dest, str2);
-// return dest;
-//}
-
-WFERROR WFSplitSupportedTypesString(wchar_t* typesString, WFLinkedList* list) {
- WFERROR ec;
- wchar_t* ptr;
- WFString* strl;
- uint32_t len_str;
- ptr = typesString;
-
- while (*ptr != L'\0') {
- // add into list
- SAFE_EXEC_WF_RETURN(ec, WFString_Alloc(&strl, ptr));
- SAFE_EXEC_WF_RETURN(ec, WFLinkedList_Add(list, strl));
-
- // shift to next string
- SAFE_EXEC_WF_RETURN(ec, WFString_GetLength(strl, &len_str));
- ptr += len_str + 1;
- }
-
- return WFERROR_OK;
-}
-
-//WCHAR* IterateSupportedTypesString_NAL(WCHAR* typesString, WCHAR* prev) {
-// if (typesString == NULL || *typesString == L'\0') return NULL;
-// if (prev == NULL) return typesString;
-//
-// // skip prev string
-// while (*prev != L'\0') {
-// prev++;
-// }
-//
-// // if the next string is start with zero, it mean that the full string is over and return NULL to terminate analyse.
-// // otherwise return next string
-// prev++;
-// if (*prev == L'\0') return NULL;
-// else return prev;
-//}
-
-void WFPrintflnInDebug() {
-
-}
-
-LSTATUS WFRegOpenKeyWithCreation(HKEY hkey, LPCWSTR lpSubKey, PHKEY phkResult) {
- return RegCreateKeyExW(
- hkey,
- lpSubKey,
- 0,
- NULL,
- REG_OPTION_NON_VOLATILE,
- KEY_ALL_ACCESS,
- NULL,
- phkResult,
- NULL
- );
-}
-
-LSTATUS WFRegSetStringValue(HKEY hkey, LPCWSTR lpValueName, const WCHAR* data) {
- return RegSetValueExW(
- hkey,
- lpValueName,
- 0,
- REG_SZ,
- data,
- data == NULL ? 0 : ((wcslen(data) + 1) * sizeof(WCHAR))
- );
-}
\ No newline at end of file
diff --git a/legacy/wfassoc/wfassoc_core.h b/legacy/wfassoc/wfassoc_core.h
deleted file mode 100644
index 7417d21..0000000
--- a/legacy/wfassoc/wfassoc_core.h
+++ /dev/null
@@ -1,60 +0,0 @@
-#if !defined(_YYCDLL_WFASSOC_H__IMPORTED_)
-#define _YYCDLL_WFASSOC_H__IMPORTED_
-
-#include
-#include
-#include "wfassoc_utils.h"
-
-// quick marco for developer and should not be used in wfassoc self
-
-//#if defined(_UNICODE)
-//#define WFAPP_PROFILE WFAPP_PROFILEW
-//#define WFInstallApplication WFInstallApplicationW
-//#define WFUninstallApplication WFUninstallApplicationW
-//#define WFGenerateProgID WFGenerateProgIDW
-//#elif defined(_MBCS)
-//#define WFAPP_PROFILE WFAPP_PROFILEA
-//#define WFInstallApplication WFInstallApplicationA
-//#define WFUninstallApplication WFUninstallApplicationA
-//#define WFGenerateProgID WFGenerateProgIDA
-//#endif
-
-///
-/// Install Application via Wide Character
-///
-///
-///
-WFERROR WFInstallApplication(WFAPP_PROFILE* profile);
-WFERROR WFUninstallApplication(WFAPP_PROFILE* profile);
-
-WFERROR WFRegisterAppPath(WFAPP_INTERNAL_PROFILE* internal_profile);
-WFERROR WFRegisterApplication(WFAPP_INTERNAL_PROFILE* internal_profile);
-WFERROR WFRegisterExtensions(WFAPP_INTERNAL_PROFILE* internal_profile);
-
-//WFERROR WFProfile_Alloc(WFAPP_PROFILE** profile);
-//WFERROR WFProfile_Free(WFAPP_PROFILE* profile);
-//WFERROR WFProfile_SetProgIDA(WFAPP_PROFILE** profile, char* vendor, char* component, uint32_t version, BOOL is_utf8);
-//WFERROR WFProfile_SetProgIDW(WFAPP_PROFILE** profile, wchar_t* vendor, wchar_t* component, uint32_t version);
-
-///
-/// Generate Legacy ProgID
-///
-/// Vendor. Such as `Word`, `Excel`, `PowerPoint`.
-/// Component. Such as `Document`, `Sheet`, `Diagram`.
-/// Version. Such as `0`, `1`, `114514`.
-/// Pointer to output ProgID. If this variable is NULL, function will calculate proper length of receiving buffer and return it via `result_length`.
-/// Pointer to a int variable containing buffer's length. If `result` is not NULL, it should be the length of `result`.
-///
-//WFERROR WFGenerateProgIDW(WCHAR* vendor, WCHAR* component, INT version, WCHAR* result, INT* result_length);
-///
-/// Generate Legacy ProgID
-///
-/// Vendor. Such as `Word`, `Excel`, `PowerPoint`.
-/// Component. Such as `Document`, `Sheet`, `Diagram`.
-/// Version. Such as `0`, `1`, `114514`.
-/// Pointer to output ProgID. If this variable is NULL, function will calculate proper length of receiving buffer and return it via `result_length`.
-/// Pointer to a int variable containing buffer's length. If `result` is not NULL, it should be the length of `result`.
-///
-//WFERROR WFGenerateProgIDA(CHAR* vendor, CHAR* component, INT version, CHAR* result, INT* result_length);
-
-#endif
diff --git a/legacy/wfassoc/wfassoc_private.c b/legacy/wfassoc/wfassoc_private.c
deleted file mode 100644
index 2a97d8a..0000000
--- a/legacy/wfassoc/wfassoc_private.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "wfassoc_private.h"
\ No newline at end of file
diff --git a/legacy/wfassoc/wfassoc_private.h b/legacy/wfassoc/wfassoc_private.h
deleted file mode 100644
index 74c67e4..0000000
--- a/legacy/wfassoc/wfassoc_private.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#if !defined(_YYCDLL_WFASSOC_PRIVATE_H__IMPORTED_)
-#define _YYCDLL_WFASSOC_PRIVATE_H__IMPORTED_
-
-typedef struct _WFAPP_RAWDATA {
- uint32_t mVersion;
-
-}WFAPP_RAWDATA;
-
-#endif
\ No newline at end of file
diff --git a/legacy/wfassoc/wfassoc_utils.c b/legacy/wfassoc/wfassoc_utils.c
deleted file mode 100644
index e66ae83..0000000
--- a/legacy/wfassoc/wfassoc_utils.c
+++ /dev/null
@@ -1,256 +0,0 @@
-#include "wfassoc_utils.h"
-
-#pragma region WFString
-
-WFERROR WFString_Alloc_Wchar(WFString** strl, const wchar_t* raw_data) {
- if (raw_data == NULL) return WFERROR_NULLPTR;
-
- WFERROR ec;
- if ((ec = WFString_Alloc(strl)) != WFERROR_OK) return ec;
- if ((ec = WFString_SetData(*strl, raw_data)) != WFERROR_OK) return ec;
- return WFERROR_OK;
-}
-
-WFERROR WFString_Alloc_Char(WFString** strl, const char* raw_data, BOOL is_utf8) {
- if (raw_data == NULL) return WFERROR_NULLPTR;
-
- // init string
- WFERROR ec;
- if ((ec = WFString_Alloc(strl)) != WFERROR_OK) return ec;
-
- // compute expected string length
- uint32_t sourceLength = strlen(raw_data);
- int destLength = MultiByteToWideChar(is_utf8 ? CP_UTF8 : CP_ACP, 0, raw_data, sourceLength, NULL, 0);
- if (destLength <= 0) return WFERROR_CRT;
- --destLength; // remove terminal char
-
- // resize string
- if ((ec = WFString_Resize(*strl, destLength)) != WFERROR_OK) return ec;
-
- // clear buffer and write data
- wchar_t* buffer;
- if ((ec = WFString_GetData(*strl, &buffer)) != WFERROR_OK) return ec;
- memset(buffer, 0, sizeof(WCHAR) * destLength);
- int crt_error = MultiByteToWideChar(is_utf8 ? CP_UTF8 : CP_ACP, 0, raw_data, sourceLength, buffer, destLength);
- if (crt_error <= 0) return WFERROR_CRT;
-
- return WFERROR_OK;
-}
-
-WFERROR WFString_Alloc_Capacity(WFString** strl, uint32_t size) {
- *strl = WFNEW(WFString);
- if (*strl == NULL) return WFERROR_ALLOC;
-
- // init struct data
- (*strl)->mCapacity = size;
- (*strl)->mRealCapacity = size + 1;
- (*strl)->mLength = 0;
- (*strl)->mRealLength = 1;
-
- (*strl)->mRawData = malloc((*strl)->mRealCapacity * sizeof(wchar_t));
- if ((*strl)->mRawData == NULL) return WFERROR_ALLOC;
-
- (*strl)->mRawData[(*strl)->mRealLength - 1] = 0;
-
- return WFERROR_OK;
-}
-
-WFERROR WFString_Alloc(WFString** strl) {
- return WFString_Alloc_Capacity(strl, 256);
-}
-
-WFERROR WFString_Free(WFString* strl) {
- if (strl == NULL) return WFERROR_OK;
- if (strl->mRawData == NULL) return WFERROR_NULLPTR;
- free(strl->mRawData);
- free(strl);
- return WFERROR_OK;
-}
-
-WFERROR WFString_Resize(WFString* strl, uint32_t new_size) {
- // if remain data is not enough, we need alloc new one
- if (new_size >= strl->mCapacity) {
- strl->mCapacity = new_size * 2;
- strl->mRealCapacity = strl->mCapacity + 1;
-
- // alloc buffer
- if (strl->mRawData != NULL)
- strl->mRawData = realloc(strl->mRawData, strl->mRealCapacity * sizeof(wchar_t));
- else
- strl->mRawData = malloc(strl->mRealCapacity * sizeof(wchar_t));
- if (strl->mRawData == NULL) return WFERROR_ALLOC;
- }
-
- // set length as new length
- strl->mLength = new_size;
- strl->mRealLength = strl->mLength + 1;
-
- // set the last one is zero
- strl->mRawData[strl->mRealLength - 1] = 0;
- return WFERROR_OK;
-}
-
-WFERROR WFString_GetData(WFString* strl, wchar_t** pdata) {
- if (strl == NULL) return WFERROR_NULLPTR;
- *pdata = strl->mRawData;
- return WFERROR_OK;
-}
-
-WFERROR WFString_SetData(WFString* strl, const wchar_t* data) {
- if (strl == NULL || data == NULL) return WFERROR_NULLPTR;
-
- // get length and resize buffer
- WFERROR ec;
- uint32_t size = wcslen(data);
- ec = WFString_Resize(strl, size);
- if (ec != WFERROR_OK) return ec;
-
- // copy data
- if (size != 0)
- memcpy(strl->mRawData, data, sizeof(wchar_t) * size);
-
- return WFERROR_OK;
-}
-
-WFERROR WFString_GetLength(WFString* strl, uint32_t* len) {
- if (strl == NULL) return WFERROR_NULLPTR;
- *len = strl->mLength;
- return WFERROR_OK;
-}
-
-WFERROR WFString_Printf(WFString* strl, const wchar_t* format, ...) {
- if (strl == NULL) return WFERROR_NULLPTR;
-
- // get expected size
- va_list argptr;
- va_start(argptr, format);
- uint32_t count = _vsnwprintf(NULL, 0, format, argptr);
- //count++;
- va_end(argptr);
-
- // resize string and get buffer ptr
- WFERROR ec;
- wchar_t* buffer;
- if ((ec = WFString_Resize(strl, count)) != WFERROR_OK) return ec;
- if ((ec = WFString_GetData(strl, &buffer)) != WFERROR_OK) return ec;
-
- // write data to buffer
- buffer[count - 1] = L'\0';
- va_start(argptr, format);
- int write_result = _vsnwprintf(buffer, count, format, argptr);
- va_end(argptr);
- if (write_result < 0 || write_result >= count) return WFERROR_CRT;
-
- return WFERROR_OK;
-}
-
-WFERROR WFString_Concat_Wchar(WFString* strl, const wchar_t* extra) {
- if (strl == NULL) return WFERROR_NULLPTR;
- if (extra == NULL) return WFERROR_OK;
-
- uint32_t count = wcslen(extra);
- uint32_t oldlen = strl->mLength;
-
- // if extra strl count is 0, do not copy any data.
- if (count == 0) return WFERROR_OK;
-
- WFERROR ec;
- if ((ec = WFString_Resize(strl, oldlen + count)) != WFERROR_OK) return ec;
- memcpy(strl->mRawData + oldlen, extra, sizeof(wchar_t) * count);
- return WFERROR_OK;
-}
-WFERROR WFString_Concat_String(WFString* strl, WFString* extra) {
- if (strl == NULL) return WFERROR_NULLPTR;
- if (extra == NULL) return WFERROR_OK;
-
- return WFString_Concat_Wchar(strl, extra->mRawData);
-}
-
-WFERROR WFString_SubString(WFString* strl, WFString* substring, uint32_t start_index, uint32_t length) {
- if (strl == NULL) return WFERROR_NULLPTR;
- if (start_index >= strl->mLength || length > strl->mLength - start_index) return WFERROR_INVALID_ARGUMENTS;
-
- WFERROR ec;
- if ((ec = WFString_Resize(substring, length)) != WFERROR_OK) return ec;
- if (length != 0) {
- memcpy(substring->mRawData, strl->mRawData + start_index, sizeof(wchar_t) * length);
- }
- return WFERROR_OK;
-}
-
-#pragma endregion
-
-#pragma region WFLinkedList
-
-WFERROR WFLinkedList_Alloc(WFLinkedList** list) {
- *list = WFNEW(WFLinkedList);
- if (*list == NULL) return WFERROR_ALLOC;
- return WFERROR_OK;
-}
-
-WFERROR WFLinkedList_Free(WFLinkedList* list) {
- return WFLinkedList_Free_Full(list, NULL);
-}
-
-WFERROR WFLinkedList_Free_Full(WFLinkedList* list, WFLinkedListNode_FreeDataFunc free_func) {
- if (list == NULL) return WFERROR_OK;
-
- // iterate full list and remove data and node
- WFLinkedListNode* node = list->mHead, * free_node = NULL;
- while (node != NULL) {
- // free raw data
- if (free_func != NULL) (*free_func)(node->mRawData);
- // move to next node and free current node
- free_node = node;
- node = node->mNext;
- free(free_node);
- }
-
- // free list self
- free(list);
-
- return WFERROR_OK;
-}
-
-WFERROR WFLinkedList_Add(WFLinkedList* list, void* data) {
- if (list == NULL) return WFERROR_NULLPTR;
-
- WFLinkedListNode* new_item = WFNEW(WFLinkedListNode);
- if (new_item == NULL) return WFERROR_ALLOC;
- new_item->mNext = NULL;
- new_item->mRawData = data;
-
- if (list->mLength == 0) {
- list->mHead = list->mTail = new_item;
- } else {
- list->mTail->mNext = new_item;
- list->mTail = new_item;
- }
- ++list->mLength;
- return WFERROR_OK;
-}
-
-WFERROR WFLinkedList_NodeIterator(WFLinkedList* list, WFLinkedListNode** node_ptr) {
- if (list == NULL) return WFERROR_NULLPTR;
-
- if (*node_ptr == NULL) {
- // if node_ptr is NULL, it mean that wo should iterate this list from head
- *node_ptr = list->mHead;
- } else {
- // otherwise, move to next node
- *node_ptr = (*node_ptr)->mNext;
- }
-
- // if the header is null, return end of tail error to notice caller stop iterate
- if (*node_ptr == NULL) return WFERROR_END_OF_TAIL;
- else return WFERROR_OK;
-}
-
-WFERROR WFLinkedListNode_GetData(WFLinkedListNode* node, void** pdata) {
- if (node == NULL) return WFERROR_NULLPTR;
-
- *pdata = node->mRawData;
- return WFERROR_OK;
-}
-
-#pragma endregion
diff --git a/legacy/wfassoc/wfassoc_utils.h b/legacy/wfassoc/wfassoc_utils.h
deleted file mode 100644
index fe20966..0000000
--- a/legacy/wfassoc/wfassoc_utils.h
+++ /dev/null
@@ -1,136 +0,0 @@
-#if !defined(_YYCDLL_WFASSOC_UTILS_H__IMPORTED_)
-#define _YYCDLL_WFASSOC_UTILS_H__IMPORTED_
-
-#include
-#include
-
-// useful macro
-
-#define WFNEW(type) ((type*)malloc(sizeof(type)))
-#define WFNEW_ARRAY(type) ((type*)malloc(sizeof(type)*count);)
-#define WFVERSION 0
-#define WFSUCCESS(expr) (!expr)
-#define WFFAILED(expr) expr
-
-///
-/// wfassoc Error Enum
-///
-typedef enum _WFERROR {
- ///
- /// All operation done successfully
- ///
- WFERROR_OK = 0,
- ///
- /// The filed `WFVersion` in Profile Struct is not matched. It usually mean that currently used DLL is not matched with the DLL when compiling this application.
- ///
- WFERROR_INVALID_VERSION = 1,
- ///
- /// The buffer in some operations is insufficient, please try expanding buffer.
- ///
- WFERROR_INSUFFICIENT_BUFFER = 2,
- ///
- /// Some essential pointer variable is NULL.
- ///
- WFERROR_NULLPTR = 3,
- WFERROR_WIN32 = 5,
- WFERROR_ALLOC = 6,
- WFERROR_END_OF_TAIL = 7,
- WFERROR_CRT = 8,
- WFERROR_INVALID_ARGUMENTS = 9
-}WFERROR;
-
-///
-/// wfassoc Profile Struct
-///
-typedef struct _WFAPP_PROFILE {
- ///
- /// wfassoc version. Fill it with `WFVERSION` in your application. This field is used for version checking.
- ///
- uint32_t WFVersion;
- ///
- /// The path to locate your application.
- ///
- wchar_t* AppPath;
- ///
- /// The command will be executed when opening files.
- ///
- wchar_t* AppCommand;
- ///
- /// Your application's ProgID.
- /// For more detail about how to create your ProgID, please browse: https://docs.microsoft.com/en-us/windows/win32/shell/fa-progids
- /// We also provide a generator for creating legacy ProgID. Use `WFGenerateProgID` to create a legacy ProgID.
- ///
- wchar_t* ProgID_Vendor;
- wchar_t* ProgID_Component;
- uint32_t ProgID_Version;
- ///
- /// Your application supported file extensions.
- /// The structure of this field is connecting all supported extensions with dot(.) end to end. For example:
- /// `.jpg\0.png\0.gif\0`
- ///
- wchar_t* SupportedTypes;
- BOOL RegisterForAllUsers;
- BOOL SetAsDefault;
- BOOL ShowInOpenWithMenu;
- BOOL UseOpenWithList;
-}WFAPP_PROFILE;
-
-typedef struct _WFAPP_INTERNAL_PROFILE {
- WFString* AppPath;
- WFString* AppBasePath;
- WFString* AppFileName;
-
- WFString* ProgID;
-
- WFString* AppCommand;
-
- WFLinkedList* SupportedTypes;
-
- BOOL RegisterForAllUsers;
- BOOL SetAsDefault;
- BOOL ShowInOpenWithMenu;
- BOOL UseOpenWithList;
-}WFAPP_INTERNAL_PROFILE;
-
-typedef struct _WFString {
- wchar_t* mRawData;
- uint32_t mLength;
- uint32_t mCapacity;
-
- uint32_t mRealLength;
- uint32_t mRealCapacity;
-}WFString;
-
-WFERROR WFString_Alloc_Wchar(WFString** strl, const wchar_t* raw_data);
-WFERROR WFString_Alloc_Char(WFString** strl, const char* raw_data, BOOL is_utf8);
-WFERROR WFString_Alloc_Capacity(WFString** strl, uint32_t size);
-WFERROR WFString_Alloc(WFString** strl);
-WFERROR WFString_Free(WFString* strl);
-WFERROR WFString_Resize(WFString* strl, uint32_t new_size);
-WFERROR WFString_GetData(WFString* strl, wchar_t** pdata);
-WFERROR WFString_SetData(WFString* strl, const wchar_t* data);
-WFERROR WFString_GetLength(WFString* strl, uint32_t* len);
-WFERROR WFString_Printf(WFString* strl, const wchar_t* format, ...);
-WFERROR WFString_Concat_Wchar(WFString* strl, const wchar_t* extra);
-WFERROR WFString_Concat_String(WFString* strl, WFString* extra);
-WFERROR WFString_SubString(WFString* strl, WFString* substring, uint32_t start_index, uint32_t length);
-
-typedef WFERROR(*WFLinkedListNode_FreeDataFunc)(void* data);
-typedef struct _WFLinkedListNode {
- void* mRawData;
- WFLinkedListNode* mNext;
-}WFLinkedListNode;
-typedef struct _WFLinkedList {
- WFLinkedListNode* mHead;
- WFLinkedListNode* mTail;
- uint32_t mLength;
-}WFLinkedList;
-
-WFERROR WFLinkedList_Alloc(WFLinkedList** list);
-WFERROR WFLinkedList_Free(WFLinkedList* list);
-WFERROR WFLinkedList_Free_Full(WFLinkedList* list, WFLinkedListNode_FreeDataFunc free_func);
-WFERROR WFLinkedList_Add(WFLinkedList* list, void* data);
-WFERROR WFLinkedList_NodeIterator(WFLinkedList* list, WFLinkedListNode** node_ptr);
-WFERROR WFLinkedListNode_GetData(WFLinkedListNode* node, void** pdata);
-
-#endif
\ No newline at end of file
diff --git a/legacy/wfassoc_example/main.c b/legacy/wfassoc_example/main.c
deleted file mode 100644
index b62d0a3..0000000
--- a/legacy/wfassoc_example/main.c
+++ /dev/null
@@ -1,81 +0,0 @@
-#include "../wfassoc/wfassoc.h"
-#include
-#include
-
-#define COMMAND_MAX_LENGTH 128
-
-WFAPP_PROFILE* create_profile();
-TCHAR* create_progId();
-void free_profile(WFAPP_PROFILE* profile);
-
-int main(int argc, char* args[]) {
-
- // alloc application profile
- WFAPP_PROFILE* profile = create_profile();
- if (profile == NULL) {
- puts("Error: Fail to allocating profile structure.\n");
- return 1;
- }
-
- // alloc input string and check it
- char* input_str = malloc(sizeof(char) * (COMMAND_MAX_LENGTH + 1));
- if (input_str == NULL) return;
-
- // accept input
- while (TRUE) {
- gets_s(input_str, COMMAND_MAX_LENGTH);
- if (!strcmp(input_str, "install")) {
- _tprintf(TEXT("%s\n"), profile->ProgID);
- } else if (!strcmp(input_str, "uninstall")) {
- _tprintf(TEXT("%s\n"), profile->ProgID);
- } else if (!strcmp(input_str, "quit")) {
- break;
- }
- }
-
- //free input string
- free(input_str);
- return 0;
-}
-
-WFAPP_PROFILE* create_profile() {
- WFAPP_PROFILE* profile = (WFAPP_PROFILE*)malloc(sizeof(WFAPP_PROFILE));
- if (profile == NULL) return NULL;
- memset(profile, 0, sizeof(WFAPP_PROFILE));
-
- profile->WFVersion = WFVERSION;
- profile->AppPath = TEXT("E:\\pineapple-picture\\ppic.exe");
- profile->AppCommand = TEXT("E:\\pineapple-picture\\ppic.exe \"%1\"");
- profile->SupportedTypes = TEXT(".png\0.jpg\0");
- profile->ProgID = create_progId();
- if (profile->ProgID == NULL) {
- free_profile(profile);
- return NULL;
- }
-
- return profile;
-}
-
-TCHAR* create_progId() {
- TCHAR* progid = NULL;
- int progIdSize;
- if (WFFAILED(WFGenerateProgID(TEXT("PineapplePicture"), TEXT("Image"), 0, NULL, &progIdSize))) {
- return NULL;
- }
-
- progid = (TCHAR*)malloc(sizeof(TCHAR) * progIdSize);
- if (progid == NULL) return NULL;
- memset(progid, 0, sizeof(TCHAR) * progIdSize);
-
- if (WFFAILED(WFGenerateProgID(TEXT("PineapplePicture"), TEXT("Image"), 0, progid, &progIdSize))) {
- free(progid);
- return NULL;
- }
-
- return progid;
-}
-
-void free_profile(WFAPP_PROFILE* profile) {
- if (profile->ProgID != NULL) free(profile->ProgID);
- free(profile);
-}
diff --git a/legacy/wfassoc_example/wfassoc_example.vcxproj b/legacy/wfassoc_example/wfassoc_example.vcxproj
deleted file mode 100644
index d955c82..0000000
--- a/legacy/wfassoc_example/wfassoc_example.vcxproj
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-
-
- Debug_MB
- Win32
-
-
- Debug_MB
- x64
-
-
- Debug_UNICODE
- Win32
-
-
- Release_UNICODE
- Win32
-
-
- Debug_UNICODE
- x64
-
-
- Release_UNICODE
- x64
-
-
-
- 16.0
- Win32Proj
- {ad275ad7-cbd5-41ca-ab24-bb707b3f7534}
- wfassocexample
- 10.0
-
-
-
- Application
- true
- v142
- Unicode
-
-
- Application
- true
- v142
- MultiByte
-
-
- Application
- false
- v142
- true
- Unicode
-
-
- Application
- true
- v142
- Unicode
-
-
- Application
- true
- v142
- Unicode
-
-
- Application
- false
- v142
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- $(SolutionDir)builds\Debug\
-
-
- true
- $(SolutionDir)builds\Debug\
-
-
- false
- $(SolutionDir)builds\Release\
-
-
- true
-
-
- true
-
-
- false
-
-
-
- Level3
- true
- WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- CompileAsC
-
-
- Console
- true
-
-
-
-
- Level3
- true
- WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- CompileAsC
-
-
- Console
- true
-
-
-
-
- Level3
- true
- true
- true
- WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- CompileAsC
-
-
- Console
- true
- true
- true
-
-
-
-
- Level3
- true
- _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
-
-
-
-
- Level3
- true
- _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
-
-
-
-
- Level3
- true
- true
- true
- NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
- true
- true
-
-
-
-
- {4aac8f0c-3e1c-4584-b682-05bbf96a813f}
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/legacy/wfassoc_example/wfassoc_example.vcxproj.filters b/legacy/wfassoc_example/wfassoc_example.vcxproj.filters
deleted file mode 100644
index 6261953..0000000
--- a/legacy/wfassoc_example/wfassoc_example.vcxproj.filters
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- 源文件
-
-
-
\ No newline at end of file