From f76feee7d19d53fb7924ac560b4eac92bc24f372 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Tue, 16 Aug 2016 23:45:27 +0900 Subject: [PATCH 01/48] =?UTF-8?q?Revert=20"#31=20=ED=95=B4=EA=B2=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 5c5aa35195f3c41d6daa03f440480abd1d758fc6. --- Server/Observer.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Server/Observer.cpp b/Server/Observer.cpp index 9789e04..3ed5f37 100644 --- a/Server/Observer.cpp +++ b/Server/Observer.cpp @@ -125,8 +125,7 @@ BOOL WINAPI Observer::BASS_ChannelPlay(DWORD handle, BOOL restart) if (info.ctype & BASS_CTYPE_STREAM) { double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - float tempo = 0; - BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); + float tempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); self->Update(currentTime, tempo); } return TRUE; @@ -145,8 +144,7 @@ BOOL WINAPI Observer::BASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mod if (info.ctype & BASS_CTYPE_STREAM) { double currentTime = BASS_ChannelBytes2Seconds(handle, pos); - float tempo = 0; - BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); + float tempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); // !! pos , // ϸ BASS_ChannelPlay Լ ȣǰ, // BASS_ChannelIsActive BASS_ACTIVE_PAUSED. From 806a8e5ddfa91dba42b33ef0713113b13a3f2655 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Tue, 16 Aug 2016 23:45:31 +0900 Subject: [PATCH 02/48] =?UTF-8?q?Revert=20"=EB=B9=84=ED=8A=B8=EB=A7=B5?= =?UTF-8?q?=EC=85=8B=20=EC=B6=94=EC=B6=9C=ED=95=A0=20=EB=95=8C=20osu!?= =?UTF-8?q?=EA=B0=80=20=ED=81=AC=EB=9E=98=EC=8B=9C=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 27f101c16377f22852381a985f2a0540f2b6a02e. --- .gitignore | 165 ++++++------------------ Server/Hooker.h | 16 +-- Server/Hooker.hpp | 45 +++---- Server/Observer.cpp | 176 ++++++++++++-------------- Server/Observer.h | 29 ++--- Server/Resource.rc | Bin 4524 -> 4524 bytes Server/Server.cpp | 12 +- Server/Server.h | 17 +-- Server/Singleton.tpl | 2 +- osu!Lyrics/Properties/AssemblyInfo.cs | 2 +- 10 files changed, 175 insertions(+), 289 deletions(-) diff --git a/.gitignore b/.gitignore index 3a2238d..1a43399 100644 --- a/.gitignore +++ b/.gitignore @@ -4,49 +4,26 @@ # User-specific files *.suo *.user -*.userosscache *.sln.docstates -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - # Build results + [Dd]ebug/ -[Dd]ebugPublic/ [Rr]elease/ -[Rr]eleases/ -[Xx]64/ -[Xx]86/ -[Bb]uild/ -bld/ +x64/ +build/ [Bb]in/ [Oo]bj/ -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ +# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets +!packages/*/build/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# DNX -project.lock.json -artifacts/ - *_i.c *_p.c -*_i.h *.ilk *.meta *.obj @@ -66,30 +43,22 @@ artifacts/ *.vssscc .builds *.pidb -*.svclog +*.log *.scc - -# Chutzpah Test files -_Chutzpah* +*.dll # Visual C++ cache files ipch/ *.aps *.ncb -*.opendb *.opensdf *.sdf *.cachefile -*.VC.db # Visual Studio profiler *.psess *.vsp *.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ # Guidance Automation Toolkit *.gpState @@ -97,10 +66,6 @@ $tf/ # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode # TeamCity is a build add-in _TeamCity* @@ -109,16 +74,8 @@ _TeamCity* *.dotCover # NCrunch -_NCrunch_* +*.ncrunch* .*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ # Installshield output folder [Ee]xpress/ @@ -137,109 +94,65 @@ DocProject/Help/html publish/ # Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml - -# TODO: Un-comment the next line if you do not want to checkin -# your web deploy settings because they may include unencrypted -# passwords -#*.pubxml -*.publishproj - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignoreable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef +*.Publish.xml -# Microsoft Azure Emulator -ecf/ -rcf/ +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ -# Microsoft Azure ApplicationInsights config file -ApplicationInsights.config +# Windows Azure Build Output +csx +*.build.csdef # Windows Store app package directory AppPackages/ -BundleArtifacts/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ # Others +sql/ +*.Cache ClientBin/ [Ss]tyle[Cc]op.* ~$* *~ *.dbmdl -*.dbproj.schemaview +*.[Pp]ublish.xml *.pfx *.publishsettings -node_modules/ -orleans.codegen.cs # 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 ;-) +# 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 # SQL Server files -*.mdf -*.ldf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ +App_Data/*.mdf +App_Data/*.ldf -# GhostDoc plugin setting file -*.GhostDoc.xml -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml -# Visual Studio 6 workspace options file -*.opt +# ========================= +# Windows detritus +# ========================= -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions +# Windows image file caches +Thumbs.db +ehthumbs.db -# LightSwitch generated files -GeneratedArtifacts/ -ModelManifest.xml +# Folder config file +Desktop.ini -# Paket dependency manager -.paket/paket.exe +# Recycle Bin used on file shares +$RECYCLE.BIN/ -# FAKE - F# Make -.fake/ \ No newline at end of file +# Mac desktop service store files +.DS_Store +*.db diff --git a/Server/Hooker.h b/Server/Hooker.h index dc98943..e96be5b 100644 --- a/Server/Hooker.h +++ b/Server/Hooker.h @@ -1,24 +1,24 @@ #pragma once -#include +#include -template +template class Hooker { public: - Hooker(const wchar_t *, const char *, T *); + Hooker(const TCHAR *, const char *, TypeFunction *); ~Hooker(); - T *GetFunction(); - void SetHookFunction(T *); + TypeFunction *GetFunction(); + void SetHookFunction(TypeFunction *); void Hook(); void Unhook(); private: - T *pFunction; - T *pHookFunction; - bool hooked; + TypeFunction *pFunction; + TypeFunction *pHookFunction; + bool isHooked; }; #include "Hooker.hpp" diff --git a/Server/Hooker.hpp b/Server/Hooker.hpp index 768308d..0e29f0f 100644 --- a/Server/Hooker.hpp +++ b/Server/Hooker.hpp @@ -1,59 +1,54 @@ -#include +#include #include #include "detours.h" -template -Hooker::Hooker(const wchar_t *szModuleName, const char *szFunctionName, T *pHookFunction = nullptr) +template +Hooker::Hooker(const TCHAR *szModuleName, const char *szFunctionName, TypeFunction *pHookFunction = nullptr) { - this->hooked = false; + this->isHooked = false; - this->pFunction = (T *) GetProcAddress(GetModuleHandle(szModuleName), szFunctionName); + this->pFunction = reinterpret_cast(GetProcAddress(GetModuleHandle(szModuleName), szFunctionName)); this->SetHookFunction(pHookFunction); } -template -Hooker::~Hooker() +template +Hooker::~Hooker() { this->Unhook(); } -template -T *Hooker::GetFunction() +template +TypeFunction *Hooker::GetFunction() { return this->pFunction; } -template -void Hooker::SetHookFunction(T *pHookFunction) +template +void Hooker::SetHookFunction(TypeFunction *pHookFunction) { this->pHookFunction = pHookFunction; } -template -void Hooker::Hook() +template +void Hooker::Hook() { - if (this->hooked || this->pHookFunction == nullptr) + if (this->isHooked || this->pHookFunction == nullptr) { return; } - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); - this->hooked = DetourTransactionCommit() == NO_ERROR; + this->isHooked = !!DetourAttach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); } -template -void Hooker::Unhook() +template +void Hooker::Unhook() { - if (!this->hooked) + if (!this->isHooked) { return; } - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); - this->hooked = DetourTransactionCommit() != NO_ERROR; + + this->isHooked = !DetourDetach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); } diff --git a/Server/Observer.cpp b/Server/Observer.cpp index 3ed5f37..6e902b1 100644 --- a/Server/Observer.cpp +++ b/Server/Observer.cpp @@ -1,14 +1,12 @@ #pragma comment(lib, "Shlwapi.lib") +#pragma warning(disable:4996) + #include "Observer.h" #include -#include -#include +#include #include -#include -#include -#include #include #include @@ -17,168 +15,143 @@ #include "Hooker.h" #include "Server.h" +#define AUDIO_FILE_INFO_TOKEN "AudioFilename:" + std::shared_ptr Observer::instance; std::once_flag Observer::once_flag; BOOL WINAPI Observer::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { - Observer *self = Observer::GetInstance(); - if (!self->hookerReadFile.GetFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) + if (!instance->hookerReadFile.GetFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) { return FALSE; } - // osu! ̸(260 ̻) Ƿ, - // szFilePath ̴ MAX_PATH ϰ ߰ Ҵϴ - // GetFinalPathNameByHandle , szFilePath \\?\D:\Games\osu!\... - wchar_t szFilePath[MAX_PATH]; + TCHAR szFilePath[MAX_PATH]; DWORD nFilePathLength = GetFinalPathNameByHandle(hFile, szFilePath, MAX_PATH, VOLUME_NAME_DOS); - // д ũ ƴϰų, osu! ɷ ʰ Ÿ library ۾? - if (nFilePathLength == 0 || nFilePathLength > MAX_PATH || lpNumberOfBytesRead == NULL) - { - return TRUE; - } - - DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - *lpNumberOfBytesRead; + // 1: \\?\D:\Games\osu!\... + DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - (*lpNumberOfBytesRead); // д Ʈ ̰ պκ оٸ : // AudioFilename պκп / ڵ ! - if (wcsnicmp(L".osu", &szFilePath[nFilePathLength - 4], 4) == 0 && dwFilePosition == 0) + if (wcsncmp(L".osu", &szFilePath[nFilePathLength - 4], 4) == 0 && dwFilePosition == 0) { // strtok ҽ ϹǷ ϴ // .osu UTF-8(Multibyte) ڵ - char *buffer = strdup((const char *) lpBuffer); - for (char *line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) + + /* ٸ strtok ߶󳻼 AudioFilename: ã. */ + char *buffer = strdup((const char*)(lpBuffer)); + + for (char *line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) { - if (strnicmp(line, "AudioFilename:", 14) != 0) + if (strnicmp(line, AUDIO_FILE_INFO_TOKEN, 14) != 0) { continue; } // AudioFilename - wchar_t szAudioFileName[MAX_PATH]; + TCHAR szAudioFileName[MAX_PATH]; + mbstowcs(szAudioFileName, &line[14], MAX_PATH); - StrTrim(szAudioFileName, L" \r"); - - // Ʈ ã - wchar_t szAudioFilePath[MAX_PATH]; - wcscpy(szAudioFilePath, szFilePath); - PathRemoveFileSpec(szAudioFilePath); - PathCombine(szAudioFilePath, szAudioFilePath, szAudioFileName); - - // audioInfo ˻ ҹ ϹǷ Ȯ - WIN32_FIND_DATA fdata; - FindClose(FindFirstFile(szAudioFilePath, &fdata)); - PathRemoveFileSpec(szAudioFilePath); - PathCombine(szAudioFilePath, szAudioFilePath, fdata.cFileName); - - // PathCombineW \\?\(Long Unicode path prefix) ϴµ, - // GetFinalPathNameByHandle 忡 ° ٽ ߰ؼ - // ٲ ȥ - wcscpy(szAudioFileName, szAudioFilePath); - wcscpy(szAudioFilePath, L"\\\\?\\"); - wcscat(szAudioFilePath, szAudioFileName); - - // osu! Ʈ ٲ Ź Ʈ ʰ ijÿ ҷ⵵ - // => Ʈ Ϻٴ ؾ - self->audioInfo.insert({szAudioFilePath, szFilePath}); + StrTrimW(szAudioFileName, L" \r"); + + TCHAR szAudioFilePath[MAX_PATH]; + + /* պκ ̻ ڸ ϱ 4° ں . */ + wcscpy(szAudioFilePath, &szFilePath[4]); + PathRemoveFileSpecW(szAudioFilePath); + PathCombineW(szAudioFilePath, szAudioFilePath, szAudioFileName); + + EnterCriticalSection(&instance->hCritiaclSection); + + instance->currentPlaying.audioPath = tstring(szAudioFilePath); + /* պκ ̻ ڸ ϱ 4° ں . */ + instance->currentPlaying.beatmapPath = (tstring(&szFilePath[4])); + + LeaveCriticalSection(&instance->hCritiaclSection); + break; } + free(buffer); } - // д Ʈ ϱ - else - { - decltype(self->audioInfo)::iterator info; - if ((info = self->audioInfo.find(szFilePath)) != self->audioInfo.end()) - { - EnterCriticalSection(&self->hCritiaclSection); - self->playing = {info->first.substr(4), info->second.substr(4)}; - LeaveCriticalSection(&self->hCritiaclSection); - } - } return TRUE; } -inline long long GetSystemTimeAsFileTime() +inline long long GetCurrentSysTime() { - /* - * Do not cast a pointer to a FILETIME structure to either a - * ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows. - * via http://technet.microsoft.com/en-us/library/ms724284(v=vs.85).aspx - */ - FILETIME ft; - GetSystemTimeAsFileTime(&ft); - return ((long long) ft.dwHighDateTime << 32) + ft.dwLowDateTime; + long long t; + GetSystemTimeAsFileTime(reinterpret_cast(&t)); + return t; } BOOL WINAPI Observer::BASS_ChannelPlay(DWORD handle, BOOL restart) { - Observer *self = Observer::GetInstance(); - if (!self->hookerBASS_ChannelPlay.GetFunction()(handle, restart)) + if (!instance->hookerBASS_ChannelPlay.GetFunction()(handle, restart)) { return FALSE; } BASS_CHANNELINFO info; BASS_ChannelGetInfo(handle, &info); + if (info.ctype & BASS_CTYPE_STREAM) { - double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); + double currentTimePos = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); float tempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); - self->Update(currentTime, tempo); + instance->SendInfomation(GetCurrentSysTime(), currentTimePos, tempo); } return TRUE; } BOOL WINAPI Observer::BASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) { - Observer *self = Observer::GetInstance(); - if (!self->hookerBASS_ChannelSetPosition.GetFunction()(handle, pos, mode)) + if (!instance->hookerBASS_ChannelSetPosition.GetFunction()(handle, pos, mode)) { return FALSE; } BASS_CHANNELINFO info; BASS_ChannelGetInfo(handle, &info); + if (info.ctype & BASS_CTYPE_STREAM) { double currentTime = BASS_ChannelBytes2Seconds(handle, pos); - float tempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); + float CurrentTempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &CurrentTempo); // !! pos , // ϸ BASS_ChannelPlay Լ ȣǰ, // BASS_ChannelIsActive BASS_ACTIVE_PAUSED. if (BASS_ChannelIsActive(handle) == BASS_ACTIVE_PAUSED) { - tempo = -100; + CurrentTempo = -100; } - self->Update(currentTime, tempo); + + instance->SendInfomation(GetCurrentSysTime(), currentTime, CurrentTempo); } return TRUE; } BOOL WINAPI Observer::BASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) { - Observer *self = Observer::GetInstance(); - if (!self->hookerBASS_ChannelSetAttribute.GetFunction()(handle, attrib, value)) + if (!instance->hookerBASS_ChannelSetAttribute.GetFunction()(handle, attrib, value)) { return FALSE; } BASS_CHANNELINFO info; BASS_ChannelGetInfo(handle, &info); + if ((info.ctype & BASS_CTYPE_STREAM) && attrib == BASS_ATTRIB_TEMPO) { double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - self->Update(currentTime, value); + instance->SendInfomation(GetCurrentSysTime(), currentTime, value); } return TRUE; } BOOL WINAPI Observer::BASS_ChannelPause(DWORD handle) { - Observer *self = Observer::GetInstance(); - if (!self->hookerBASS_ChannelPause.GetFunction()(handle)) + if (!instance->hookerBASS_ChannelPause.GetFunction()(handle)) { return FALSE; } @@ -188,43 +161,54 @@ BOOL WINAPI Observer::BASS_ChannelPause(DWORD handle) if (info.ctype & BASS_CTYPE_STREAM) { double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - self->Update(currentTime, -100); + instance->SendInfomation(GetCurrentSysTime(), currentTime, -100); } return TRUE; } -void Observer::Update(double currentTime, float tempo) +void Observer::SendInfomation(long long calledAt, double currentTime, float tempo) { - Observer *self = Observer::GetInstance(); - wchar_t message[Server::nMessageLength]; - EnterCriticalSection(&self->hCritiaclSection); - swprintf(message, L"%llx|%s|%lf|%f|%s\n", - GetSystemTimeAsFileTime(), - self->playing.first.c_str(), - currentTime, - tempo, - self->playing.second.c_str() - ); - LeaveCriticalSection(&self->hCritiaclSection); + TCHAR message[Server::nMessageLength]; + + /* Get Current Playing */ + EnterCriticalSection(&instance->hCritiaclSection); + swprintf(message, L"%llx|%s|%lf|%f|%s\n", + calledAt, + instance->currentPlaying.audioPath.c_str(), + currentTime, + tempo, + instance->currentPlaying.beatmapPath.c_str()); + LeaveCriticalSection(&instance->hCritiaclSection); + Server::GetInstance()->PushMessage(message); } -void Observer::Run() +void Observer::Initalize() { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + this->hookerReadFile.Hook(); this->hookerBASS_ChannelPlay.Hook(); this->hookerBASS_ChannelSetPosition.Hook(); this->hookerBASS_ChannelSetAttribute.Hook(); this->hookerBASS_ChannelPause.Hook(); + + DetourTransactionCommit(); } -void Observer::Stop() +void Observer::Release() { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + this->hookerBASS_ChannelPause.Unhook(); this->hookerBASS_ChannelSetAttribute.Unhook(); this->hookerBASS_ChannelSetPosition.Unhook(); this->hookerBASS_ChannelPlay.Unhook(); this->hookerReadFile.Unhook(); + + DetourTransactionCommit(); } diff --git a/Server/Observer.h b/Server/Observer.h index 32b88cb..4b05f52 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -12,9 +12,8 @@ class Observer { public: - void Run(); - void Stop(); - void Update(double, float); + void Initalize(); + void Release(); private: static BOOL WINAPI ReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); @@ -23,15 +22,14 @@ class Observer static BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD, DWORD, float); static BOOL BASSDEF(BASS_ChannelPause)(DWORD); - // what osu! played - // [ audioPath, beatmapPath ] - concurrency::concurrent_unordered_map audioInfo; - // what osu! is playing - // [ audioPath, beatmapPath ] - std::pair playing; - // thread safe playing + void SendInfomation(long long, double, float); CRITICAL_SECTION hCritiaclSection; + struct { + tstring audioPath; + tstring beatmapPath; + } currentPlaying; + Hooker hookerReadFile; Hooker hookerBASS_ChannelPlay; Hooker hookerBASS_ChannelSetPosition; @@ -52,12 +50,11 @@ class Observer } private: - Observer() - : hookerReadFile(L"kernel32.dll", "ReadFile", Observer::ReadFile), - hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", Observer::BASS_ChannelPlay), - hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", Observer::BASS_ChannelSetPosition), - hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", Observer::BASS_ChannelSetAttribute), - hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", Observer::BASS_ChannelPause) + Observer() : hookerReadFile(L"kernel32.dll", "ReadFile", Observer::ReadFile), + hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", Observer::BASS_ChannelPlay), + hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", Observer::BASS_ChannelSetPosition), + hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", Observer::BASS_ChannelSetAttribute), + hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", Observer::BASS_ChannelPause) { InitializeCriticalSection(&this->hCritiaclSection); } diff --git a/Server/Resource.rc b/Server/Resource.rc index 70e2ffc67bb9d46a82c9b44b98068362a1b0dd9a..eff67c95bf81271f35a4d2fb5d8365491ebd5d15 100644 GIT binary patch delta 42 ucmZ3ZyheFL6$hiyhPipe = CreateNamedPipe(L"\\\\.\\pipe\\osu!Lyrics", PIPE_ACCESS_OUTBOUND, + self->hPipe = CreateNamedPipe(_T("\\\\.\\pipe\\osu!Lyrics"), PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, Server::nBufferSize, 0, INFINITE, NULL); - std::wstring message; + tstring message; DWORD nNumberOfBytesWritten; // û Ŭ̾Ʈ while (!self->cancelThread) @@ -29,7 +29,7 @@ DWORD WINAPI Server::Thread(LPVOID lParam) continue; } - if (WriteFile(self->hPipe, message.c_str(), message.length() * sizeof(wchar_t), &nNumberOfBytesWritten, NULL)) + if (WriteFile(self->hPipe, message.c_str(), message.length() * sizeof(tstring::value_type), &nNumberOfBytesWritten, NULL)) { continue; } @@ -44,7 +44,7 @@ DWORD WINAPI Server::Thread(LPVOID lParam) return 0; } -void Server::PushMessage(std::wstring&& message) +void Server::PushMessage(tstring&& message) { if (!this->pipeConnected) { @@ -77,11 +77,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) if (fdwReason == DLL_PROCESS_ATTACH) { Server::GetInstance()->Run(); - Observer::GetInstance()->Run(); + Observer::GetInstance()->Initalize(); } else if (fdwReason == DLL_PROCESS_DETACH) { - Observer::GetInstance()->Stop(); + Observer::GetInstance()->Release(); Server::GetInstance()->Stop(); } return TRUE; diff --git a/Server/Server.h b/Server/Server.h index 4224d49..5b2ef06 100644 --- a/Server/Server.h +++ b/Server/Server.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -8,15 +8,17 @@ #include +typedef std::basic_string tstring; + class Server { public: static const DWORD nMessageLength = MAX_PATH * 3; - static const DWORD nBufferSize = Server::nMessageLength * sizeof(wchar_t); + static const DWORD nBufferSize = Server::nMessageLength * sizeof(tstring::value_type); void Run(); void Stop(); - void PushMessage(std::wstring&&); + void PushMessage(tstring&&); private: static DWORD WINAPI Thread(LPVOID); @@ -27,7 +29,7 @@ class Server HANDLE hPipe; std::atomic pipeConnected; - concurrency::concurrent_queue messageQueue; + concurrency::concurrent_queue messageQueue; HANDLE hPushEvent; public: @@ -44,12 +46,7 @@ class Server } private: - Server() - : hThread(NULL), - cancelThread(false), - hPipe(NULL), - pipeConnected(false), - hPushEvent(NULL) {} + Server() : hThread(NULL), cancelThread(false), hPipe(NULL), pipeConnected(false), hPushEvent(NULL) {} ~Server() {} Server(const Server&) = delete; diff --git a/Server/Singleton.tpl b/Server/Singleton.tpl index 5094931..fd79d11 100644 --- a/Server/Singleton.tpl +++ b/Server/Singleton.tpl @@ -39,4 +39,4 @@ private: // Singleton.cpp std::shared_ptr Singleton::instance; -std::once_flag Singleton::once_flag; +std::once_flag once_flag; diff --git a/osu!Lyrics/Properties/AssemblyInfo.cs b/osu!Lyrics/Properties/AssemblyInfo.cs index f8904f0..6652338 100644 --- a/osu!Lyrics/Properties/AssemblyInfo.cs +++ b/osu!Lyrics/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.8.62")] -[assembly: AssemblyInformationalVersion("1.8.63")] +[assembly: AssemblyInformationalVersion("1.8.62")] [assembly: NeutralResourcesLanguageAttribute("ko-KR")] From d6d71189ecd6203b97e912e9fb27431806881cb4 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Tue, 16 Aug 2016 23:46:55 +0900 Subject: [PATCH 03/48] =?UTF-8?q?=EC=9E=AC=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Hooker.h | 6 +-- Server/Hooker.hpp | 5 +- Server/Observer.cpp | 126 +++++++++++++++++++++++--------------------- Server/Observer.h | 69 ++++++++++-------------- Server/Server.cpp | 45 ++++++++-------- Server/Server.h | 43 ++++++--------- Server/bass.h | 8 +-- 7 files changed, 137 insertions(+), 165 deletions(-) diff --git a/Server/Hooker.h b/Server/Hooker.h index e96be5b..e1b4b8b 100644 --- a/Server/Hooker.h +++ b/Server/Hooker.h @@ -1,15 +1,13 @@ #pragma once -#include - template class Hooker { public: - Hooker(const TCHAR *, const char *, TypeFunction *); + Hooker(const wchar_t*, const char *, TypeFunction *); ~Hooker(); - TypeFunction *GetFunction(); + TypeFunction *GetOriginalFunction(); void SetHookFunction(TypeFunction *); void Hook(); diff --git a/Server/Hooker.hpp b/Server/Hooker.hpp index 0e29f0f..8766053 100644 --- a/Server/Hooker.hpp +++ b/Server/Hooker.hpp @@ -4,7 +4,7 @@ #include "detours.h" template -Hooker::Hooker(const TCHAR *szModuleName, const char *szFunctionName, TypeFunction *pHookFunction = nullptr) +Hooker::Hooker(const wchar_t *szModuleName, const char *szFunctionName, TypeFunction *pHookFunction = nullptr) { this->isHooked = false; @@ -19,7 +19,7 @@ Hooker::~Hooker() } template -TypeFunction *Hooker::GetFunction() +TypeFunction *Hooker::GetOriginalFunction() { return this->pFunction; } @@ -48,7 +48,6 @@ void Hooker::Unhook() { return; } - this->isHooked = !DetourDetach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); } diff --git a/Server/Observer.cpp b/Server/Observer.cpp index 6e902b1..e6380d8 100644 --- a/Server/Observer.cpp +++ b/Server/Observer.cpp @@ -5,8 +5,6 @@ #include "Observer.h" #include -#include -#include #include #include @@ -16,78 +14,87 @@ #include "Server.h" #define AUDIO_FILE_INFO_TOKEN "AudioFilename:" +#define AUDIO_FILE_INFO_TOKEN_LENGTH 14 -std::shared_ptr Observer::instance; -std::once_flag Observer::once_flag; +inline wchar_t* CutStringFromFront(wchar_t* string, unsigned int index) +{ + return (string + index); +} -BOOL WINAPI Observer::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) +BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { - if (!instance->hookerReadFile.GetFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) + if (!InstanceObserver.hookerReadFile.GetOriginalFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) { return FALSE; } - TCHAR szFilePath[MAX_PATH]; - DWORD nFilePathLength = GetFinalPathNameByHandle(hFile, szFilePath, MAX_PATH, VOLUME_NAME_DOS); - // 1: \\?\D:\Games\osu!\... + TCHAR nameFilePath[MAX_PATH]; + DWORD dwFilePathLength = GetFinalPathNameByHandle(hFile, nameFilePath, MAX_PATH, VOLUME_NAME_DOS); DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - (*lpNumberOfBytesRead); + // д Ʈ ̰ պκ оٸ : - // AudioFilename պκп / ڵ ! - if (wcsncmp(L".osu", &szFilePath[nFilePathLength - 4], 4) == 0 && dwFilePosition == 0) + // ̸ Ե Path κ 4ڸ ڸ. 4ڿ .osu Ͽ osu Ȯ + if (wcsncmp(L".osu", &nameFilePath[dwFilePathLength - 4], 4) == 0 && dwFilePosition == 0) { - // strtok ҽ ϹǷ ϴ // .osu UTF-8(Multibyte) ڵ - - /* ٸ strtok ߶󳻼 AudioFilename: ã. */ - char *buffer = strdup((const char*)(lpBuffer)); + /* strtok ҽ ϹǷ strdup ̿ؼ ڸ . */ + LPSTR buffer = strdup((const char*)(lpBuffer)); - for (char *line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) + /* for ̿ؼ ٸ strtok ߶. */ + for (LPSTR lineFile = strtok(buffer, "\n"); lineFile != NULL; lineFile = strtok(NULL, "\n")) { - if (strnicmp(line, AUDIO_FILE_INFO_TOKEN, 14) != 0) + /* ߶ ٿ Token ִ Ȯϰ ƴҰ쿡 continue. */ + if (strnicmp(lineFile, AUDIO_FILE_INFO_TOKEN, AUDIO_FILE_INFO_TOKEN_LENGTH) != 0) { continue; } - // AudioFilename - TCHAR szAudioFileName[MAX_PATH]; + /* NOTE: ؼ Ҷ "NOT TO FIX" Ҷ ɴϴ. */ + /* ׸ Path Լ ̿ؼ ڿ //?/ Ϸ . Լ ǹ̸ 𸣰Ե˴ϴ. */ + /* //?/ 4. 4ں ͸ ϸ ڿ //?/ ֽϴ. */ + + TCHAR nameAudioFile[MAX_PATH]; - mbstowcs(szAudioFileName, &line[14], MAX_PATH); - StrTrimW(szAudioFileName, L" \r"); + mbstowcs(nameAudioFile, &lineFile[AUDIO_FILE_INFO_TOKEN_LENGTH], MAX_PATH); + StrTrimW(nameAudioFile, L" \r"); - TCHAR szAudioFilePath[MAX_PATH]; + TCHAR nameAudioFilePath[MAX_PATH]; - /* պκ ̻ ڸ ϱ 4° ں . */ - wcscpy(szAudioFilePath, &szFilePath[4]); - PathRemoveFileSpecW(szAudioFilePath); - PathCombineW(szAudioFilePath, szAudioFilePath, szAudioFileName); + /* պκ "//?/" ϱ 4° ں . (&nameFilePath[4]) */ + wcscpy(nameAudioFilePath, CutStringFromFront(nameFilePath, 4)); + /* nameAudioFilePath ϸ ϴ. */ + PathRemoveFileSpecW(nameAudioFilePath); + /* ϸ Path nameAudioFilePath nameAudioFileٿ, Path ϴ. */ + PathCombineW(nameAudioFilePath, nameAudioFilePath, nameAudioFile); - EnterCriticalSection(&instance->hCritiaclSection); + EnterCriticalSection(&InstanceObserver.hCritiaclSection); - instance->currentPlaying.audioPath = tstring(szAudioFilePath); - /* պκ ̻ ڸ ϱ 4° ں . */ - instance->currentPlaying.beatmapPath = (tstring(&szFilePath[4])); + /* պκ "//?/" ϱ 4° ں . (&nameFilePath[4]) */ + InstanceObserver.currentPlaying.beatmapPath = (std::wstring(CutStringFromFront(nameFilePath, 4))); + InstanceObserver.currentPlaying.audioPath = (std::wstring(nameAudioFilePath)); - LeaveCriticalSection(&instance->hCritiaclSection); + LeaveCriticalSection(&InstanceObserver.hCritiaclSection); break; } + /* strdup ̿ ڿ ޸𸮸 ŵϴ. */ free(buffer); } return TRUE; } - +/* ý ð մϴ. */ inline long long GetCurrentSysTime() { - long long t; - GetSystemTimeAsFileTime(reinterpret_cast(&t)); - return t; + long long time; + + GetSystemTimeAsFileTime((LPFILETIME)&time); return time; } -BOOL WINAPI Observer::BASS_ChannelPlay(DWORD handle, BOOL restart) +BOOL WINAPI proxyBASS_ChannelPlay(DWORD handle, BOOL restart) { - if (!instance->hookerBASS_ChannelPlay.GetFunction()(handle, restart)) + if (!InstanceObserver.hookerBASS_ChannelPlay.GetOriginalFunction()(handle, restart)) { return FALSE; } @@ -99,14 +106,14 @@ BOOL WINAPI Observer::BASS_ChannelPlay(DWORD handle, BOOL restart) { double currentTimePos = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); float tempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); - instance->SendInfomation(GetCurrentSysTime(), currentTimePos, tempo); + InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTimePos, tempo); } return TRUE; } -BOOL WINAPI Observer::BASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) +BOOL WINAPI proxyBASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) { - if (!instance->hookerBASS_ChannelSetPosition.GetFunction()(handle, pos, mode)) + if (!InstanceObserver.hookerBASS_ChannelSetPosition.GetOriginalFunction()(handle, pos, mode)) { return FALSE; } @@ -117,23 +124,24 @@ BOOL WINAPI Observer::BASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mod if (info.ctype & BASS_CTYPE_STREAM) { double currentTime = BASS_ChannelBytes2Seconds(handle, pos); - float CurrentTempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &CurrentTempo); + float CurrentTempo = 0; + BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &CurrentTempo); // !! pos , - // ϸ BASS_ChannelPlay Լ ȣǰ, + // ϸ proxyBASS_ChannelPlay Լ ȣǰ, // BASS_ChannelIsActive BASS_ACTIVE_PAUSED. if (BASS_ChannelIsActive(handle) == BASS_ACTIVE_PAUSED) { CurrentTempo = -100; } - instance->SendInfomation(GetCurrentSysTime(), currentTime, CurrentTempo); + InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTime, CurrentTempo); } return TRUE; } -BOOL WINAPI Observer::BASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) +BOOL WINAPI proxyBASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) { - if (!instance->hookerBASS_ChannelSetAttribute.GetFunction()(handle, attrib, value)) + if (!InstanceObserver.hookerBASS_ChannelSetAttribute.GetOriginalFunction()(handle, attrib, value)) { return FALSE; } @@ -144,14 +152,14 @@ BOOL WINAPI Observer::BASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float if ((info.ctype & BASS_CTYPE_STREAM) && attrib == BASS_ATTRIB_TEMPO) { double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - instance->SendInfomation(GetCurrentSysTime(), currentTime, value); + InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTime, value); } return TRUE; } -BOOL WINAPI Observer::BASS_ChannelPause(DWORD handle) +BOOL WINAPI proxyBASS_ChannelPause(DWORD handle) { - if (!instance->hookerBASS_ChannelPause.GetFunction()(handle)) + if (!InstanceObserver.hookerBASS_ChannelPause.GetOriginalFunction()(handle)) { return FALSE; } @@ -161,35 +169,34 @@ BOOL WINAPI Observer::BASS_ChannelPause(DWORD handle) if (info.ctype & BASS_CTYPE_STREAM) { double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - instance->SendInfomation(GetCurrentSysTime(), currentTime, -100); + InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTime, -100); } return TRUE; } void Observer::SendInfomation(long long calledAt, double currentTime, float tempo) { - TCHAR message[Server::nMessageLength]; + TCHAR message[Server::MAX_MESSAGE_LENGTH]; - /* Get Current Playing */ - EnterCriticalSection(&instance->hCritiaclSection); + /* ÷ϰִ proxyReadFile  Ŭ̾Ʈ մϴ. */ + EnterCriticalSection(&InstanceObserver.hCritiaclSection); swprintf(message, L"%llx|%s|%lf|%f|%s\n", calledAt, - instance->currentPlaying.audioPath.c_str(), + InstanceObserver.currentPlaying.audioPath.c_str(), currentTime, tempo, - instance->currentPlaying.beatmapPath.c_str()); - LeaveCriticalSection(&instance->hCritiaclSection); + InstanceObserver.currentPlaying.beatmapPath.c_str()); + LeaveCriticalSection(&InstanceObserver.hCritiaclSection); - Server::GetInstance()->PushMessage(message); + InstanceServer.PushMessage(message); } -void Observer::Initalize() +void Observer::Start() { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); this->hookerReadFile.Hook(); - this->hookerBASS_ChannelPlay.Hook(); this->hookerBASS_ChannelSetPosition.Hook(); this->hookerBASS_ChannelSetAttribute.Hook(); @@ -198,7 +205,7 @@ void Observer::Initalize() DetourTransactionCommit(); } -void Observer::Release() +void Observer::Stop() { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); @@ -207,7 +214,6 @@ void Observer::Release() this->hookerBASS_ChannelSetAttribute.Unhook(); this->hookerBASS_ChannelSetPosition.Unhook(); this->hookerBASS_ChannelPlay.Unhook(); - this->hookerReadFile.Unhook(); DetourTransactionCommit(); diff --git a/Server/Observer.h b/Server/Observer.h index 4b05f52..96abe68 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -2,72 +2,57 @@ #include #include -#include #include #include "bass.h" #include "Server.h" #include "Hooker.h" + +/* Ͻ Լ DZ. */ +BOOL WINAPI proxyReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); +BOOL BASSDEF(proxyBASS_ChannelPlay)(DWORD, BOOL); +BOOL BASSDEF(proxyBASS_ChannelSetPosition)(DWORD, QWORD, DWORD); +BOOL BASSDEF(proxyBASS_ChannelSetAttribute)(DWORD, DWORD, float); +BOOL BASSDEF(proxyBASS_ChannelPause)(DWORD); + class Observer { public: - void Initalize(); - void Release(); - -private: - static BOOL WINAPI ReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); - static BOOL BASSDEF(BASS_ChannelPlay)(DWORD, BOOL); - static BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD, QWORD, DWORD); - static BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD, DWORD, float); - static BOOL BASSDEF(BASS_ChannelPause)(DWORD); + void Start(); + void Stop(); void SendInfomation(long long, double, float); CRITICAL_SECTION hCritiaclSection; struct { - tstring audioPath; - tstring beatmapPath; + std::wstring audioPath; + std::wstring beatmapPath; } currentPlaying; - Hooker hookerReadFile; - Hooker hookerBASS_ChannelPlay; - Hooker hookerBASS_ChannelSetPosition; - Hooker hookerBASS_ChannelSetAttribute; - Hooker hookerBASS_ChannelPause; - -public: - static Observer *GetInstance() - { - std::call_once(Observer::once_flag, [] - { - Observer::instance.reset(new Observer, [](Observer *p) - { - delete p; - }); - }); - return Observer::instance.get(); - } - -private: - Observer() : hookerReadFile(L"kernel32.dll", "ReadFile", Observer::ReadFile), - hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", Observer::BASS_ChannelPlay), - hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", Observer::BASS_ChannelSetPosition), - hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", Observer::BASS_ChannelSetAttribute), - hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", Observer::BASS_ChannelPause) + Hooker hookerReadFile; + Hooker hookerBASS_ChannelPlay; + Hooker hookerBASS_ChannelSetPosition; + Hooker hookerBASS_ChannelSetAttribute; + Hooker hookerBASS_ChannelPause; + + Observer() : hookerReadFile(L"kernel32.dll", "ReadFile", proxyReadFile), + hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", proxyBASS_ChannelPlay), + hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", proxyBASS_ChannelSetPosition), + hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", proxyBASS_ChannelSetAttribute), + hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", proxyBASS_ChannelPause) { - InitializeCriticalSection(&this->hCritiaclSection); + InitializeCriticalSection(&hCritiaclSection); } ~Observer() { - DeleteCriticalSection(&this->hCritiaclSection); + DeleteCriticalSection(&hCritiaclSection); } Observer(const Observer&) = delete; Observer(Observer&&) = delete; Observer& operator=(const Observer&) = delete; Observer& operator=(Observer&&) = delete; - - static std::shared_ptr instance; - static std::once_flag once_flag; }; + +static Observer InstanceObserver; \ No newline at end of file diff --git a/Server/Server.cpp b/Server/Server.cpp index 358497c..3662574 100644 --- a/Server/Server.cpp +++ b/Server/Server.cpp @@ -2,51 +2,48 @@ #include "Observer.h" -std::shared_ptr Server::instance; -std::once_flag Server::once_flag; - DWORD WINAPI Server::Thread(LPVOID lParam) { - Server *self = Server::GetInstance(); - self->hPipe = CreateNamedPipe(_T("\\\\.\\pipe\\osu!Lyrics"), PIPE_ACCESS_OUTBOUND, + InstanceServer.hPipe = CreateNamedPipe(L"\\\\.\\pipe\\osu!Lyrics", PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, Server::nBufferSize, 0, INFINITE, NULL); - tstring message; + + std::wstring message; DWORD nNumberOfBytesWritten; // û Ŭ̾Ʈ - while (!self->cancelThread) + while (!InstanceServer.isThreadCanceled) { // ConnectNamedPipe Ŭ̾Ʈ : // Ҵ DisconnectNamedPipe - if (ConnectNamedPipe(self->hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) + if (ConnectNamedPipe(InstanceServer.hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) { - self->pipeConnected = true; + InstanceServer.isPipeConnected = true; // ޽ ť ִ 3ʰ ٸ ٽ õ: // Ŭ̾Ʈ ؾ ϱ INTINITE - if (!self->messageQueue.try_pop(message)) + if (!InstanceServer.messageQueue.try_pop(message)) { - WaitForSingleObject(self->hPushEvent, 3000); + WaitForSingleObject(InstanceServer.hPushEvent, 3000); continue; } - if (WriteFile(self->hPipe, message.c_str(), message.length() * sizeof(tstring::value_type), &nNumberOfBytesWritten, NULL)) + if (WriteFile(InstanceServer.hPipe, message.c_str(), message.length() * sizeof(std::wstring::value_type), &nNumberOfBytesWritten, NULL)) { continue; } } - self->pipeConnected = false; - DisconnectNamedPipe(self->hPipe); + InstanceServer.isPipeConnected = false; + DisconnectNamedPipe(InstanceServer.hPipe); } // Ŭ̾Ʈ - self->pipeConnected = false; - DisconnectNamedPipe(self->hPipe); - CloseHandle(self->hPipe); + InstanceServer.isPipeConnected = false; + DisconnectNamedPipe(InstanceServer.hPipe); + CloseHandle(InstanceServer.hPipe); return 0; } -void Server::PushMessage(tstring&& message) +void Server::PushMessage(std::wstring&& message) { - if (!this->pipeConnected) + if (!this->isPipeConnected) { return; } @@ -64,7 +61,7 @@ void Server::Run() void Server::Stop() { - this->cancelThread = true; + this->isThreadCanceled = true; DisconnectNamedPipe(this->hPipe); WaitForSingleObject(this->hThread, INFINITE); CloseHandle(this->hThread); @@ -76,13 +73,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { - Server::GetInstance()->Run(); - Observer::GetInstance()->Initalize(); + InstanceServer.Run(); + InstanceObserver.Start(); } else if (fdwReason == DLL_PROCESS_DETACH) { - Observer::GetInstance()->Release(); - Server::GetInstance()->Stop(); + InstanceObserver.Stop(); + InstanceServer.Stop(); } return TRUE; } diff --git a/Server/Server.h b/Server/Server.h index 5b2ef06..33e5677 100644 --- a/Server/Server.h +++ b/Server/Server.h @@ -4,56 +4,43 @@ #include #include #include +#include #include #include -typedef std::basic_string tstring; - class Server { public: - static const DWORD nMessageLength = MAX_PATH * 3; - static const DWORD nBufferSize = Server::nMessageLength * sizeof(tstring::value_type); + static const DWORD MAX_MESSAGE_LENGTH = MAX_PATH * 3; + static const DWORD nBufferSize = Server::MAX_MESSAGE_LENGTH * sizeof(std::wstring::value_type); void Run(); void Stop(); - void PushMessage(tstring&&); + void PushMessage(std::wstring&&); -private: static DWORD WINAPI Thread(LPVOID); HANDLE hThread; - std::atomic cancelThread; + std::atomic isThreadCanceled; HANDLE hPipe; - std::atomic pipeConnected; + std::atomic isPipeConnected; - concurrency::concurrent_queue messageQueue; + concurrency::concurrent_queue messageQueue; HANDLE hPushEvent; - -public: - static Server *GetInstance() - { - std::call_once(Server::once_flag, [] - { - Server::instance.reset(new Server, [](Server *p) - { - delete p; - }); - }); - return Server::instance.get(); - } - -private: - Server() : hThread(NULL), cancelThread(false), hPipe(NULL), pipeConnected(false), hPushEvent(NULL) {} + Server() : + hThread(NULL), + isThreadCanceled(false), + hPipe(NULL), + isPipeConnected(false), + hPushEvent(NULL) {} ~Server() {} Server(const Server&) = delete; Server(Server&&) = delete; Server& operator=(const Server&) = delete; Server& operator=(Server&&) = delete; - - static std::shared_ptr instance; - static std::once_flag once_flag; }; + +static Server InstanceServer; diff --git a/Server/bass.h b/Server/bass.h index c96cfee..fc84039 100644 --- a/Server/bass.h +++ b/Server/bass.h @@ -968,10 +968,10 @@ const char *BASSDEF(BASS_ChannelGetTags)(DWORD handle, DWORD tags); DWORD BASSDEF(BASS_ChannelFlags)(DWORD handle, DWORD flags, DWORD mask); BOOL BASSDEF(BASS_ChannelUpdate)(DWORD handle, DWORD length); BOOL BASSDEF(BASS_ChannelLock)(DWORD handle, BOOL lock); -BOOL BASSDEF(BASS_ChannelPlay)(DWORD handle, BOOL restart); +BOOL BASSDEF(proxyBASS_ChannelPlay)(DWORD handle, BOOL restart); BOOL BASSDEF(BASS_ChannelStop)(DWORD handle); -BOOL BASSDEF(BASS_ChannelPause)(DWORD handle); -BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value); +BOOL BASSDEF(proxyBASS_ChannelPause)(DWORD handle); +BOOL BASSDEF(proxyBASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value); BOOL BASSDEF(BASS_ChannelGetAttribute)(DWORD handle, DWORD attrib, float *value); BOOL BASSDEF(BASS_ChannelSlideAttribute)(DWORD handle, DWORD attrib, float value, DWORD time); BOOL BASSDEF(BASS_ChannelIsSliding)(DWORD handle, DWORD attrib); @@ -982,7 +982,7 @@ BOOL BASSDEF(BASS_ChannelGet3DAttributes)(DWORD handle, DWORD *mode, float *min, BOOL BASSDEF(BASS_ChannelSet3DPosition)(DWORD handle, const BASS_3DVECTOR *pos, const BASS_3DVECTOR *orient, const BASS_3DVECTOR *vel); BOOL BASSDEF(BASS_ChannelGet3DPosition)(DWORD handle, BASS_3DVECTOR *pos, BASS_3DVECTOR *orient, BASS_3DVECTOR *vel); QWORD BASSDEF(BASS_ChannelGetLength)(DWORD handle, DWORD mode); -BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode); +BOOL BASSDEF(proxyBASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode); QWORD BASSDEF(BASS_ChannelGetPosition)(DWORD handle, DWORD mode); DWORD BASSDEF(BASS_ChannelGetLevel)(DWORD handle); BOOL BASSDEF(BASS_ChannelGetLevelEx)(DWORD handle, float *levels, float length, DWORD flags); From 2b0c1c4eac455e9a938d32eea55c86a20be26511 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 17 Aug 2016 13:06:21 +0900 Subject: [PATCH 04/48] =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20=EC=9D=B4=EC=8A=88?= =?UTF-8?q?=20=EC=88=98=EC=A0=95.=20=EC=8B=B1=EA=B8=80=ED=86=A4=20?= =?UTF-8?q?=ED=8E=98=ED=84=B4=20=EC=A0=9C=EA=B1=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추후 전체적인 최적화를 하겠음. 너무 코드가 전체적으로 복잡해보이고 너덜너덜함. --- Server/Observer.cpp | 47 +++++++++++++++++++++-------------- Server/Observer.h | 13 ++++++---- Server/Server.cpp | 16 ++++++------ Server/Server.h | 6 ++--- Server/Server.vcxproj | 5 ---- Server/Server.vcxproj.filters | 3 --- Server/Singleton.tpl | 42 ------------------------------- 7 files changed, 48 insertions(+), 84 deletions(-) delete mode 100644 Server/Singleton.tpl diff --git a/Server/Observer.cpp b/Server/Observer.cpp index e6380d8..f61b7ef 100644 --- a/Server/Observer.cpp +++ b/Server/Observer.cpp @@ -13,6 +13,8 @@ #include "Hooker.h" #include "Server.h" +Observer InstanceObserver; + #define AUDIO_FILE_INFO_TOKEN "AudioFilename:" #define AUDIO_FILE_INFO_TOKEN_LENGTH 14 @@ -28,10 +30,12 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR return FALSE; } - TCHAR nameFilePath[MAX_PATH]; - DWORD dwFilePathLength = GetFinalPathNameByHandle(hFile, nameFilePath, MAX_PATH, VOLUME_NAME_DOS); + TCHAR tmpFilePath[MAX_PATH]; + DWORD dwFilePathLength = GetFinalPathNameByHandle(hFile, tmpFilePath, MAX_PATH, VOLUME_NAME_DOS); DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - (*lpNumberOfBytesRead); + TCHAR* nameFilePath = CutStringFromFront(tmpFilePath, 4); + // д Ʈ ̰ պκ оٸ : // ̸ Ե Path κ 4ڸ ڸ. 4ڿ .osu Ͽ osu Ȯ if (wcsncmp(L".osu", &nameFilePath[dwFilePathLength - 4], 4) == 0 && dwFilePosition == 0) @@ -49,30 +53,21 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR continue; } - /* NOTE: ؼ Ҷ "NOT TO FIX" Ҷ ɴϴ. */ - /* ׸ Path Լ ̿ؼ ڿ //?/ Ϸ . Լ ǹ̸ 𸣰Ե˴ϴ. */ - /* //?/ 4. 4ں ͸ ϸ ڿ //?/ ֽϴ. */ - TCHAR nameAudioFile[MAX_PATH]; - mbstowcs(nameAudioFile, &lineFile[AUDIO_FILE_INFO_TOKEN_LENGTH], MAX_PATH); StrTrimW(nameAudioFile, L" \r"); TCHAR nameAudioFilePath[MAX_PATH]; - - /* պκ "//?/" ϱ 4° ں . (&nameFilePath[4]) */ - wcscpy(nameAudioFilePath, CutStringFromFront(nameFilePath, 4)); + wcscpy(nameAudioFilePath, nameFilePath); /* nameAudioFilePath ϸ ϴ. */ PathRemoveFileSpecW(nameAudioFilePath); /* ϸ Path nameAudioFilePath nameAudioFileٿ, Path ϴ. */ PathCombineW(nameAudioFilePath, nameAudioFilePath, nameAudioFile); EnterCriticalSection(&InstanceObserver.hCritiaclSection); - - /* պκ "//?/" ϱ 4° ں . (&nameFilePath[4]) */ - InstanceObserver.currentPlaying.beatmapPath = (std::wstring(CutStringFromFront(nameFilePath, 4))); + InstanceObserver.currentPlaying.beatmapPath = (std::wstring(nameFilePath)); InstanceObserver.currentPlaying.audioPath = (std::wstring(nameAudioFilePath)); - + InstanceObserver.listPlayed.push_back(InstanceObserver.currentPlaying); LeaveCriticalSection(&InstanceObserver.hCritiaclSection); break; @@ -81,6 +76,20 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR /* strdup ̿ ڿ ޸𸮸 ŵϴ. */ free(buffer); } + else + { + EnterCriticalSection(&InstanceObserver.hCritiaclSection); + for (auto info = InstanceObserver.listPlayed.begin(); info != InstanceObserver.listPlayed.end(); ++info) + { + if (StrCmpW(nameFilePath, info->audioPath.c_str())) + { + InstanceObserver.currentPlaying.beatmapPath = (info->beatmapPath); + InstanceObserver.currentPlaying.audioPath = (info->audioPath); + break; + } + } + LeaveCriticalSection(&InstanceObserver.hCritiaclSection); + } return TRUE; } @@ -179,16 +188,16 @@ void Observer::SendInfomation(long long calledAt, double currentTime, float temp TCHAR message[Server::MAX_MESSAGE_LENGTH]; /* ÷ϰִ proxyReadFile  Ŭ̾Ʈ մϴ. */ - EnterCriticalSection(&InstanceObserver.hCritiaclSection); + EnterCriticalSection(&hCritiaclSection); swprintf(message, L"%llx|%s|%lf|%f|%s\n", calledAt, - InstanceObserver.currentPlaying.audioPath.c_str(), + currentPlaying.audioPath.c_str(), currentTime, tempo, - InstanceObserver.currentPlaying.beatmapPath.c_str()); - LeaveCriticalSection(&InstanceObserver.hCritiaclSection); + currentPlaying.beatmapPath.c_str()); + LeaveCriticalSection(&hCritiaclSection); - InstanceServer.PushMessage(message); + GetServerInstance()->PushMessage(message); } void Observer::Start() diff --git a/Server/Observer.h b/Server/Observer.h index 96abe68..d177382 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -2,13 +2,13 @@ #include #include +#include #include #include "bass.h" #include "Server.h" #include "Hooker.h" - /* Ͻ Լ DZ. */ BOOL WINAPI proxyReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); BOOL BASSDEF(proxyBASS_ChannelPlay)(DWORD, BOOL); @@ -25,27 +25,32 @@ class Observer void SendInfomation(long long, double, float); CRITICAL_SECTION hCritiaclSection; - struct { + struct SongInfo { std::wstring audioPath; std::wstring beatmapPath; } currentPlaying; + std::list listPlayed; + Hooker hookerReadFile; Hooker hookerBASS_ChannelPlay; Hooker hookerBASS_ChannelSetPosition; Hooker hookerBASS_ChannelSetAttribute; Hooker hookerBASS_ChannelPause; - Observer() : hookerReadFile(L"kernel32.dll", "ReadFile", proxyReadFile), + Observer() : + hookerReadFile(L"kernel32.dll", "ReadFile", proxyReadFile), hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", proxyBASS_ChannelPlay), hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", proxyBASS_ChannelSetPosition), hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", proxyBASS_ChannelSetAttribute), hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", proxyBASS_ChannelPause) { InitializeCriticalSection(&hCritiaclSection); + Start(); } ~Observer() { + Stop(); DeleteCriticalSection(&hCritiaclSection); } @@ -54,5 +59,3 @@ class Observer Observer& operator=(const Observer&) = delete; Observer& operator=(Observer&&) = delete; }; - -static Observer InstanceObserver; \ No newline at end of file diff --git a/Server/Server.cpp b/Server/Server.cpp index 3662574..5084e53 100644 --- a/Server/Server.cpp +++ b/Server/Server.cpp @@ -2,6 +2,13 @@ #include "Observer.h" +Server InstanceServer; + +Server* GetServerInstance() +{ + return &InstanceServer; +} + DWORD WINAPI Server::Thread(LPVOID lParam) { InstanceServer.hPipe = CreateNamedPipe(L"\\\\.\\pipe\\osu!Lyrics", PIPE_ACCESS_OUTBOUND, @@ -55,17 +62,16 @@ void Server::PushMessage(std::wstring&& message) void Server::Run() { this->hPushEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - this->hThread = CreateThread(NULL, 0, Server::Thread, NULL, 0, NULL); } void Server::Stop() { this->isThreadCanceled = true; + DisconnectNamedPipe(this->hPipe); WaitForSingleObject(this->hThread, INFINITE); CloseHandle(this->hThread); - CloseHandle(this->hPushEvent); } @@ -73,13 +79,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { - InstanceServer.Run(); - InstanceObserver.Start(); } else if (fdwReason == DLL_PROCESS_DETACH) { - InstanceObserver.Stop(); - InstanceServer.Stop(); } return TRUE; -} +} \ No newline at end of file diff --git a/Server/Server.h b/Server/Server.h index 33e5677..694823f 100644 --- a/Server/Server.h +++ b/Server/Server.h @@ -34,8 +34,8 @@ class Server isThreadCanceled(false), hPipe(NULL), isPipeConnected(false), - hPushEvent(NULL) {} - ~Server() {} + hPushEvent(NULL) { Run(); } + ~Server() { Stop(); } Server(const Server&) = delete; Server(Server&&) = delete; @@ -43,4 +43,4 @@ class Server Server& operator=(Server&&) = delete; }; -static Server InstanceServer; +Server* GetServerInstance(); \ No newline at end of file diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj index dcb8a5d..0aa4890 100644 --- a/Server/Server.vcxproj +++ b/Server/Server.vcxproj @@ -98,11 +98,6 @@ - - true - CppHeader - true - diff --git a/Server/Server.vcxproj.filters b/Server/Server.vcxproj.filters index 04ff4af..9b65372 100644 --- a/Server/Server.vcxproj.filters +++ b/Server/Server.vcxproj.filters @@ -45,7 +45,4 @@ Libraries\detours - - - \ No newline at end of file diff --git a/Server/Singleton.tpl b/Server/Singleton.tpl deleted file mode 100644 index fd79d11..0000000 --- a/Server/Singleton.tpl +++ /dev/null @@ -1,42 +0,0 @@ -/** Thread-safe Singleton - * - * http://silviuardelean.ro/2012/06/05/few-singleton-approaches/ - */ - -// Singleton.h -#pragma once - -#include -#include - -class Singleton -{ -public: - static Singleton *GetInstance() - { - std::call_once(Singleton::once_flag, [] - { - Singleton::instance.reset(new Singleton, [](Singleton *p) - { - delete p; - }); - }); - return Singleton::instance.get(); - } - -private: - Singleton() {} - ~Singleton() {} - - Singleton(const Singleton&) = delete; - Singleton(Singleton&&) = delete; - Singleton& operator=(const Singleton&) = delete; - Singleton& operator=(Singleton&&) = delete; - - static std::shared_ptr instance; - static std::once_flag once_flag; -}; - -// Singleton.cpp -std::shared_ptr Singleton::instance; -std::once_flag once_flag; From 76f86cef03def6373e3a073d99bae5c40c3dd4f6 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 17 Aug 2016 17:14:32 +0900 Subject: [PATCH 05/48] =?UTF-8?q?Cached=20=EB=90=9C=20Bitmap=EC=9D=84=20?= =?UTF-8?q?=EC=9D=BD=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Observer.cpp | 18 ++++++++++++------ Server/Observer.h | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Server/Observer.cpp b/Server/Observer.cpp index f61b7ef..b6788cb 100644 --- a/Server/Observer.cpp +++ b/Server/Observer.cpp @@ -30,11 +30,13 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR return FALSE; } - TCHAR tmpFilePath[MAX_PATH]; - DWORD dwFilePathLength = GetFinalPathNameByHandle(hFile, tmpFilePath, MAX_PATH, VOLUME_NAME_DOS); + TCHAR nameTmpFilePath[MAX_PATH]; + + DWORD dwTmpFilePathLength = GetFinalPathNameByHandle(hFile, nameTmpFilePath, MAX_PATH, VOLUME_NAME_DOS); DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - (*lpNumberOfBytesRead); - TCHAR* nameFilePath = CutStringFromFront(tmpFilePath, 4); + TCHAR* nameFilePath = CutStringFromFront(nameTmpFilePath, 4); + DWORD dwFilePathLength = dwTmpFilePathLength - 4; // д Ʈ ̰ պκ оٸ : // ̸ Ե Path κ 4ڸ ڸ. 4ڿ .osu Ͽ osu Ȯ @@ -67,7 +69,7 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR EnterCriticalSection(&InstanceObserver.hCritiaclSection); InstanceObserver.currentPlaying.beatmapPath = (std::wstring(nameFilePath)); InstanceObserver.currentPlaying.audioPath = (std::wstring(nameAudioFilePath)); - InstanceObserver.listPlayed.push_back(InstanceObserver.currentPlaying); + InstanceObserver.listPlayedCached.push_back(InstanceObserver.currentPlaying); LeaveCriticalSection(&InstanceObserver.hCritiaclSection); break; @@ -78,10 +80,14 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR } else { + /* Beatmap ٽ ҷ ʰ Cache ҷö ִµ. */ + /* ׷쿡 Audioϸ Audio ִ Ȯϰ */ + /* ǰִ AudioFile ٲ۴. */ EnterCriticalSection(&InstanceObserver.hCritiaclSection); - for (auto info = InstanceObserver.listPlayed.begin(); info != InstanceObserver.listPlayed.end(); ++info) + for (auto info = InstanceObserver.listPlayedCached.begin(); info != InstanceObserver.listPlayedCached.end(); ++info) { - if (StrCmpW(nameFilePath, info->audioPath.c_str())) + /* AudioFile Ѵ. */ + if (!StrCmpW(nameFilePath, info->audioPath.c_str())) { InstanceObserver.currentPlaying.beatmapPath = (info->beatmapPath); InstanceObserver.currentPlaying.audioPath = (info->audioPath); diff --git a/Server/Observer.h b/Server/Observer.h index d177382..2c4e050 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -30,7 +30,7 @@ class Observer std::wstring beatmapPath; } currentPlaying; - std::list listPlayed; + std::list listPlayedCached; Hooker hookerReadFile; Hooker hookerBASS_ChannelPlay; From dece37d7504b745999d2b338c16aa7caeeeb89c1 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 17 Aug 2016 17:32:22 +0900 Subject: [PATCH 06/48] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=20Cache=20=EB=90=90?= =?UTF-8?q?=EC=9D=8C=EC=97=90=EB=8F=84=20=EB=B6=88=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EA=B3=84=EC=86=8D=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=EB=A5=BC=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=ED=95=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Observer.cpp | 42 ++++++++++++++++++++++++++---------------- Server/Observer.h | 3 ++- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Server/Observer.cpp b/Server/Observer.cpp index b6788cb..e654d57 100644 --- a/Server/Observer.cpp +++ b/Server/Observer.cpp @@ -35,41 +35,51 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR DWORD dwTmpFilePathLength = GetFinalPathNameByHandle(hFile, nameTmpFilePath, MAX_PATH, VOLUME_NAME_DOS); DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - (*lpNumberOfBytesRead); - TCHAR* nameFilePath = CutStringFromFront(nameTmpFilePath, 4); + TCHAR* nameFile = CutStringFromFront(nameTmpFilePath, 4); DWORD dwFilePathLength = dwTmpFilePathLength - 4; // д Ʈ ̰ պκ оٸ : // ̸ Ե Path κ 4ڸ ڸ. 4ڿ .osu Ͽ osu Ȯ - if (wcsncmp(L".osu", &nameFilePath[dwFilePathLength - 4], 4) == 0 && dwFilePosition == 0) + if (wcsncmp(L".osu", &nameFile[dwFilePathLength - 4], 4) == 0 && dwFilePosition == 0) { // .osu UTF-8(Multibyte) ڵ /* strtok ҽ ϹǷ strdup ̿ؼ ڸ . */ LPSTR buffer = strdup((const char*)(lpBuffer)); /* for ̿ؼ ٸ strtok ߶. */ - for (LPSTR lineFile = strtok(buffer, "\n"); lineFile != NULL; lineFile = strtok(NULL, "\n")) + for (LPSTR line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) { /* ߶ ٿ Token ִ Ȯϰ ƴҰ쿡 continue. */ - if (strnicmp(lineFile, AUDIO_FILE_INFO_TOKEN, AUDIO_FILE_INFO_TOKEN_LENGTH) != 0) + if (strnicmp(line, AUDIO_FILE_INFO_TOKEN, AUDIO_FILE_INFO_TOKEN_LENGTH) != 0) { continue; } TCHAR nameAudioFile[MAX_PATH]; - mbstowcs(nameAudioFile, &lineFile[AUDIO_FILE_INFO_TOKEN_LENGTH], MAX_PATH); + mbstowcs(nameAudioFile, &line[AUDIO_FILE_INFO_TOKEN_LENGTH], MAX_PATH); StrTrimW(nameAudioFile, L" \r"); - TCHAR nameAudioFilePath[MAX_PATH]; - wcscpy(nameAudioFilePath, nameFilePath); - /* nameAudioFilePath ϸ ϴ. */ - PathRemoveFileSpecW(nameAudioFilePath); - /* ϸ Path nameAudioFilePath nameAudioFileٿ, Path ϴ. */ - PathCombineW(nameAudioFilePath, nameAudioFilePath, nameAudioFile); + TCHAR pathAudioFile[MAX_PATH]; + wcscpy(pathAudioFile, nameFile); + /* pathAudioFile ϸ ϴ. */ + PathRemoveFileSpecW(pathAudioFile); + /* ϸ Path pathAudioFile nameAudioFileٿ, Path ϴ. */ + PathCombineW(pathAudioFile, pathAudioFile, nameAudioFile); EnterCriticalSection(&InstanceObserver.hCritiaclSection); - InstanceObserver.currentPlaying.beatmapPath = (std::wstring(nameFilePath)); - InstanceObserver.currentPlaying.audioPath = (std::wstring(nameAudioFilePath)); - InstanceObserver.listPlayedCached.push_back(InstanceObserver.currentPlaying); + InstanceObserver.currentPlaying.beatmapPath = (std::wstring(nameFile)); + InstanceObserver.currentPlaying.audioPath = (std::wstring(pathAudioFile)); + /* Ȱ AudioFile ̸ ִٸ List ߰ ʴ´. */ + for (auto info = InstanceObserver.listBeatmapCached.begin(); info != InstanceObserver.listBeatmapCached.end(); ++info) + { + if (!StrCmpW(pathAudioFile, info->audioPath.c_str())) + { + goto ALREADY_CACHED; + } + } + InstanceObserver.listBeatmapCached.push_back(InstanceObserver.currentPlaying); + ALREADY_CACHED: + LeaveCriticalSection(&InstanceObserver.hCritiaclSection); break; @@ -84,10 +94,10 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR /* ׷쿡 Audioϸ Audio ִ Ȯϰ */ /* ǰִ AudioFile ٲ۴. */ EnterCriticalSection(&InstanceObserver.hCritiaclSection); - for (auto info = InstanceObserver.listPlayedCached.begin(); info != InstanceObserver.listPlayedCached.end(); ++info) + for (auto info = InstanceObserver.listBeatmapCached.begin(); info != InstanceObserver.listBeatmapCached.end(); ++info) { /* AudioFile Ѵ. */ - if (!StrCmpW(nameFilePath, info->audioPath.c_str())) + if (!StrCmpW(nameFile, info->audioPath.c_str())) { InstanceObserver.currentPlaying.beatmapPath = (info->beatmapPath); InstanceObserver.currentPlaying.audioPath = (info->audioPath); diff --git a/Server/Observer.h b/Server/Observer.h index 2c4e050..26d3687 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -30,7 +30,8 @@ class Observer std::wstring beatmapPath; } currentPlaying; - std::list listPlayedCached; + std::list listBeatmapCached; + bool isSongCached(TCHAR* nameSongPath); Hooker hookerReadFile; Hooker hookerBASS_ChannelPlay; From f12206a305899adf0a9f759e02a87a9dfdc4ce4a Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 17 Aug 2016 17:35:06 +0900 Subject: [PATCH 07/48] =?UTF-8?q?#31=20=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Observer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/Observer.cpp b/Server/Observer.cpp index e654d57..84664f6 100644 --- a/Server/Observer.cpp +++ b/Server/Observer.cpp @@ -130,7 +130,8 @@ BOOL WINAPI proxyBASS_ChannelPlay(DWORD handle, BOOL restart) if (info.ctype & BASS_CTYPE_STREAM) { double currentTimePos = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - float tempo; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); + float tempo = 0; + BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTimePos, tempo); } return TRUE; From ad15104c28a905fad6c83ab5729298b7f57b0fd9 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 18 Aug 2016 03:25:53 +0900 Subject: [PATCH 08/48] =?UTF-8?q?=EC=8B=B1=EA=B8=80=ED=86=A4=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=20=EC=82=AC=EC=9A=A9=20=EC=A7=80=EC=96=91=20=EB=B0=8F?= =?UTF-8?q?=20=EC=95=84=20=EC=9E=A0=EC=99=80=20=EC=BB=A4=EB=B0=8B=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20-=20=EC=8B=B1=EA=B8=80=ED=86=A4=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=EC=9D=84=20=EA=B8=80=EB=A1=9C=EB=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=A1=9C=20=EC=98=A4=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=98=80=EC=9D=8C=20-=20=EA=B8=80=EB=A1=9C=EB=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=82=AC=EC=9A=A9=EC=9D=84=20=EC=A7=80?= =?UTF-8?q?=EC=96=91=ED=95=9C=EB=8B=A4=EB=A9=B4=20=20=20=EC=84=9C=EB=B2=84?= =?UTF-8?q?=EC=97=90=20=EC=A0=81=EC=9A=A9=ED=95=9C=20=EA=B2=83=EC=B2=98?= =?UTF-8?q?=EB=9F=BC=20trunk=EB=A5=BC=20=ED=9B=84=EC=BB=A4=EC=97=90?= =?UTF-8?q?=EB=8F=84=20=EB=A7=8C=EB=93=A4=EC=96=B4=20=EC=A3=BC=EC=96=B4?= =?UTF-8?q?=EC=95=BC=20=ED=95=A0=EA=B9=8C=3F=3F=20-=20=EC=95=84=20?= =?UTF-8?q?=EC=9E=A0=EC=99=80=20-=20=EC=98=A4=EB=8A=98=20=EB=B3=B5?= =?UTF-8?q?=EA=B7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 165 +++++++++++++---- Server/HookP.cpp | 236 ++++++++++++++++++++++++ Server/HookP.h | 60 +++++++ Server/Hooker.h | 10 +- Server/Hooker.hpp | 16 +- Server/Observer.cpp | 246 -------------------------- Server/Observer.h | 57 +----- Server/Program.cpp | 27 +++ Server/Resource.rc | Bin 4524 -> 4524 bytes Server/Server.cpp | 71 ++++---- Server/Server.h | 42 ++--- Server/Server.vcxproj | 6 +- Server/Server.vcxproj.filters | 8 +- Server/Subject.cpp | 25 +++ Server/Subject.h | 17 ++ Server/bass.h | 8 +- osu!Lyrics/Properties/AssemblyInfo.cs | 2 +- 17 files changed, 575 insertions(+), 421 deletions(-) create mode 100644 Server/HookP.cpp create mode 100644 Server/HookP.h delete mode 100644 Server/Observer.cpp create mode 100644 Server/Program.cpp create mode 100644 Server/Subject.cpp create mode 100644 Server/Subject.h diff --git a/.gitignore b/.gitignore index 1a43399..3a2238d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,26 +4,49 @@ # User-specific files *.suo *.user +*.userosscache *.sln.docstates -# Build results +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs +# Build results [Dd]ebug/ +[Dd]ebugPublic/ [Rr]elease/ -x64/ -build/ +[Rr]eleases/ +[Xx]64/ +[Xx]86/ +[Bb]uild/ +bld/ [Bb]in/ [Oo]bj/ -# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets -!packages/*/build/ +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + *_i.c *_p.c +*_i.h *.ilk *.meta *.obj @@ -43,22 +66,30 @@ build/ *.vssscc .builds *.pidb -*.log +*.svclog *.scc -*.dll + +# Chutzpah Test files +_Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb +*.opendb *.opensdf *.sdf *.cachefile +*.VC.db # Visual Studio profiler *.psess *.vsp *.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ # Guidance Automation Toolkit *.gpState @@ -66,6 +97,10 @@ ipch/ # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode # TeamCity is a build add-in _TeamCity* @@ -74,8 +109,16 @@ _TeamCity* *.dotCover # NCrunch -*.ncrunch* +_NCrunch_* .*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ # Installshield output folder [Ee]xpress/ @@ -94,65 +137,109 @@ DocProject/Help/html publish/ # Publish Web Output -*.Publish.xml +*.[Pp]ublish.xml +*.azurePubxml + +# TODO: Un-comment the next line if you do not want to checkin +# your web deploy settings because they may include unencrypted +# passwords +#*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ +# Microsoft Azure Emulator +ecf/ +rcf/ -# Windows Azure Build Output -csx -*.build.csdef +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config # Windows Store app package directory AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ # Others -sql/ -*.Cache ClientBin/ [Ss]tyle[Cc]op.* ~$* *~ *.dbmdl -*.[Pp]ublish.xml +*.dbproj.schemaview *.pfx *.publishsettings +node_modules/ +orleans.codegen.cs # 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 ;-) +# 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 # SQL Server files -App_Data/*.mdf -App_Data/*.ldf +*.mdf +*.ldf +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings -#LightSwitch generated files -GeneratedArtifacts/ -_Pvt_Extensions/ -ModelManifest.xml +# Microsoft Fakes +FakesAssemblies/ -# ========================= -# Windows detritus -# ========================= +# GhostDoc plugin setting file +*.GhostDoc.xml -# Windows image file caches -Thumbs.db -ehthumbs.db +# Node.js Tools for Visual Studio +.ntvs_analysis.dat -# Folder config file -Desktop.ini +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# LightSwitch generated files +GeneratedArtifacts/ +ModelManifest.xml -# Recycle Bin used on file shares -$RECYCLE.BIN/ +# Paket dependency manager +.paket/paket.exe -# Mac desktop service store files -.DS_Store -*.db +# FAKE - F# Make +.fake/ \ No newline at end of file diff --git a/Server/HookP.cpp b/Server/HookP.cpp new file mode 100644 index 0000000..e39a607 --- /dev/null +++ b/Server/HookP.cpp @@ -0,0 +1,236 @@ +#pragma comment(lib, "Shlwapi.lib") + +#include "HookP.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "bass.h" +#include "bass_fx.h" +#include "Hooker.h" +#include "Server.h" + +HookP *HookP::Instance; +HookP *HookP::GetInstance() +{ + return Instance; +} + +BOOL WINAPI HookP::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) +{ + HookP *self = HookP::GetInstance(); + if (!self->hookerReadFile.GetOriginalFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) + { + return FALSE; + } + + // osu! ̸(260 ̻) Ƿ, + // szFilePath ̴ MAX_PATH ϰ ߰ Ҵϴ + // GetFinalPathNameByHandle , szFilePath \\?\D:\Games\osu!\... + wchar_t szFilePath[MAX_PATH]; + DWORD nFilePathLength = GetFinalPathNameByHandle(hFile, szFilePath, MAX_PATH, VOLUME_NAME_DOS); + // д ũ ƴϰų, osu! ɷ ʰ Ÿ library ۾? + if (nFilePathLength == 0 || nFilePathLength > MAX_PATH || lpNumberOfBytesRead == NULL) + { + return TRUE; + } + + DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - *lpNumberOfBytesRead; + // д Ʈ ̰ պκ оٸ : + // AudioFilename պκп / ڵ ! + if (wcsnicmp(L".osu", &szFilePath[nFilePathLength - 4], 4) == 0 && dwFilePosition == 0) + { + // strtok ҽ ϹǷ ϴ + // .osu UTF-8(Multibyte) ڵ + char *buffer = strdup((const char *) lpBuffer); + for (char *line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) + { + if (strnicmp(line, "AudioFilename:", 14) != 0) + { + continue; + } + + // AudioFilename + wchar_t szAudioFileName[MAX_PATH]; + mbstowcs(szAudioFileName, &line[14], MAX_PATH); + StrTrim(szAudioFileName, L" \r"); + + // Ʈ ã + wchar_t szAudioFilePath[MAX_PATH]; + wcscpy(szAudioFilePath, szFilePath); + PathRemoveFileSpec(szAudioFilePath); + PathCombine(szAudioFilePath, szAudioFilePath, szAudioFileName); + + // audioInfo ˻ ҹ ϹǷ Ȯ + WIN32_FIND_DATA fdata; + FindClose(FindFirstFile(szAudioFilePath, &fdata)); + PathRemoveFileSpec(szAudioFilePath); + PathCombine(szAudioFilePath, szAudioFilePath, fdata.cFileName); + + // PathCombineW ǵġ ʰ \\?\(Long Unicode path prefix) ϴµ, + // GetFinalPathNameByHandle 忡 ° ٽ ߰ؼ + // ٲ ȥ + wcscpy(szAudioFileName, szAudioFilePath); + wcscpy(szAudioFilePath, L"\\\\?\\"); + wcscat(szAudioFilePath, szAudioFileName); + + // osu! Ʈ ٲ Ź Ʈ ʰ ijÿ ҷ⵵ + // => Ʈ Ϻٴ ؾ + self->audioInfo.insert({szAudioFilePath, szFilePath}); + break; + } + // strdup ó + free(buffer); + } + // д Ʈ ϱ + else + { + decltype(self->audioInfo)::iterator info; + if ((info = self->audioInfo.find(szFilePath)) != self->audioInfo.end()) + { + EnterCriticalSection(&self->hCritiaclSection); + self->playing = {info->first.substr(4), info->second.substr(4)}; + LeaveCriticalSection(&self->hCritiaclSection); + } + } + return TRUE; +} + + +BOOL WINAPI HookP::BASS_ChannelPlay(DWORD handle, BOOL restart) +{ + HookP *self = HookP::GetInstance(); + if (!self->hookerBASS_ChannelPlay.GetOriginalFunction()(handle, restart)) + { + return FALSE; + } + + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + if (info.ctype & BASS_CTYPE_STREAM) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); + float tempo = 0; + BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); + self->Notify(currentTime, tempo); + } + return TRUE; +} + +BOOL WINAPI HookP::BASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) +{ + HookP *self = HookP::GetInstance(); + if (!self->hookerBASS_ChannelSetPosition.GetOriginalFunction()(handle, pos, mode)) + { + return FALSE; + } + + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + if (info.ctype & BASS_CTYPE_STREAM) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, pos); + float tempo = 0; + BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); + // !! pos , + // ϸ BASS_ChannelPlay Լ ȣǰ, + // BASS_ChannelIsActive BASS_ACTIVE_PAUSED. + if (BASS_ChannelIsActive(handle) == BASS_ACTIVE_PAUSED) + { + tempo = -100; + } + self->Notify(currentTime, tempo); + } + return TRUE; +} + +BOOL WINAPI HookP::BASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) +{ + HookP *self = HookP::GetInstance(); + if (!self->hookerBASS_ChannelSetAttribute.GetOriginalFunction()(handle, attrib, value)) + { + return FALSE; + } + + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + if ((info.ctype & BASS_CTYPE_STREAM) && attrib == BASS_ATTRIB_TEMPO) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); + self->Notify(currentTime, value); + } + return TRUE; +} + +BOOL WINAPI HookP::BASS_ChannelPause(DWORD handle) +{ + HookP *self = HookP::GetInstance(); + if (!self->hookerBASS_ChannelPause.GetOriginalFunction()(handle)) + { + return FALSE; + } + + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + if (info.ctype & BASS_CTYPE_STREAM) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); + self->Notify(currentTime, -100); + } + return TRUE; +} + + +inline long long GetSystemTimeAsFileTime() +{ + /* + * Do not cast a pointer to a FILETIME structure to either a + * ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows. + * via http://technet.microsoft.com/en-us/library/ms724284(v=vs.85).aspx + */ + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + return ((long long) ft.dwHighDateTime << 32) + ft.dwLowDateTime; +} + +void HookP::Notify(double currentTime, float tempo) +{ + wchar_t message[Server::nMessageLength]; + EnterCriticalSection(&this->hCritiaclSection); + swprintf(message, L"%llx|%s|%lf|%f|%s\n", + GetSystemTimeAsFileTime(), + this->playing.first.c_str(), + currentTime, + tempo, + this->playing.second.c_str() + ); + LeaveCriticalSection(&this->hCritiaclSection); + Subject::Notify(message); +} + +void HookP::Run() +{ + this->hookerReadFile.Hook(); + + this->hookerBASS_ChannelPlay.Hook(); + this->hookerBASS_ChannelSetPosition.Hook(); + this->hookerBASS_ChannelSetAttribute.Hook(); + this->hookerBASS_ChannelPause.Hook(); +} + +void HookP::Stop() +{ + this->hookerBASS_ChannelPause.Unhook(); + this->hookerBASS_ChannelSetAttribute.Unhook(); + this->hookerBASS_ChannelSetPosition.Unhook(); + this->hookerBASS_ChannelPlay.Unhook(); + + this->hookerReadFile.Unhook(); +} diff --git a/Server/HookP.h b/Server/HookP.h new file mode 100644 index 0000000..6f1c920 --- /dev/null +++ b/Server/HookP.h @@ -0,0 +1,60 @@ +#pragma once + +#include "Subject.h" + +#include +#include + +#include +#include "bass.h" +#include "Server.h" +#include "Hooker.h" + +class HookP : public Subject +{ +public: + HookP() : + hookerReadFile(L"kernel32.dll", "ReadFile", HookP::ReadFile), + hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", HookP::BASS_ChannelPlay), + hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", HookP::BASS_ChannelSetPosition), + hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", HookP::BASS_ChannelSetAttribute), + hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", HookP::BASS_ChannelPause) + { + Instance = this; + InitializeCriticalSection(&this->hCritiaclSection); + } + ~HookP() + { + DeleteCriticalSection(&this->hCritiaclSection); + } + + void Run(); + void Stop(); + void Notify(double, float); +private: + static BOOL WINAPI ReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); + static BOOL BASSDEF(BASS_ChannelPlay)(DWORD, BOOL); + static BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD, QWORD, DWORD); + static BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD, DWORD, float); + static BOOL BASSDEF(BASS_ChannelPause)(DWORD); + + // ʿϰ ߻ + // Serveró trunk ?? + static HookP *Instance; + static HookP *GetInstance(); + + // what osu! played + // [ audioPath, beatmapPath ] + concurrency::concurrent_unordered_map audioInfo; + // what osu! is playing + // [ audioPath, beatmapPath ] + std::pair playing; + // thread safe playing + CRITICAL_SECTION hCritiaclSection; + + Hooker hookerReadFile; + Hooker hookerBASS_ChannelPlay; + Hooker hookerBASS_ChannelSetPosition; + Hooker hookerBASS_ChannelSetAttribute; + Hooker hookerBASS_ChannelPause; +}; diff --git a/Server/Hooker.h b/Server/Hooker.h index e1b4b8b..7d1fb5b 100644 --- a/Server/Hooker.h +++ b/Server/Hooker.h @@ -1,21 +1,23 @@ #pragma once +#include + template class Hooker { public: - Hooker(const wchar_t*, const char *, TypeFunction *); + Hooker(const wchar_t *, const char *, TypeFunction *); ~Hooker(); - TypeFunction *GetOriginalFunction(); + TypeFunction *GetOriginalFunction(); void SetHookFunction(TypeFunction *); void Hook(); void Unhook(); private: - TypeFunction *pFunction; - TypeFunction *pHookFunction; + TypeFunction *pFunction; + TypeFunction *pHookFunction; bool isHooked; }; diff --git a/Server/Hooker.hpp b/Server/Hooker.hpp index 8766053..536c5aa 100644 --- a/Server/Hooker.hpp +++ b/Server/Hooker.hpp @@ -1,4 +1,4 @@ -#include +#include #include #include "detours.h" @@ -8,7 +8,7 @@ Hooker::Hooker(const wchar_t *szModuleName, const char *szFunction { this->isHooked = false; - this->pFunction = reinterpret_cast(GetProcAddress(GetModuleHandle(szModuleName), szFunctionName)); + this->pFunction = (TypeFunction *) GetProcAddress(GetModuleHandle(szModuleName), szFunctionName); this->SetHookFunction(pHookFunction); } @@ -38,7 +38,10 @@ void Hooker::Hook() return; } - this->isHooked = !!DetourAttach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); + this->isHooked = DetourTransactionCommit() == NO_ERROR; } template @@ -48,6 +51,9 @@ void Hooker::Unhook() { return; } - - this->isHooked = !DetourDetach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); + + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); + this->isHooked = DetourTransactionCommit() != NO_ERROR; } diff --git a/Server/Observer.cpp b/Server/Observer.cpp deleted file mode 100644 index 84664f6..0000000 --- a/Server/Observer.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#pragma comment(lib, "Shlwapi.lib") - -#pragma warning(disable:4996) - -#include "Observer.h" - -#include - -#include -#include -#include "bass.h" -#include "bass_fx.h" -#include "Hooker.h" -#include "Server.h" - -Observer InstanceObserver; - -#define AUDIO_FILE_INFO_TOKEN "AudioFilename:" -#define AUDIO_FILE_INFO_TOKEN_LENGTH 14 - -inline wchar_t* CutStringFromFront(wchar_t* string, unsigned int index) -{ - return (string + index); -} - -BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) -{ - if (!InstanceObserver.hookerReadFile.GetOriginalFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) - { - return FALSE; - } - - TCHAR nameTmpFilePath[MAX_PATH]; - - DWORD dwTmpFilePathLength = GetFinalPathNameByHandle(hFile, nameTmpFilePath, MAX_PATH, VOLUME_NAME_DOS); - DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - (*lpNumberOfBytesRead); - - TCHAR* nameFile = CutStringFromFront(nameTmpFilePath, 4); - DWORD dwFilePathLength = dwTmpFilePathLength - 4; - - // д Ʈ ̰ պκ оٸ : - // ̸ Ե Path κ 4ڸ ڸ. 4ڿ .osu Ͽ osu Ȯ - if (wcsncmp(L".osu", &nameFile[dwFilePathLength - 4], 4) == 0 && dwFilePosition == 0) - { - // .osu UTF-8(Multibyte) ڵ - /* strtok ҽ ϹǷ strdup ̿ؼ ڸ . */ - LPSTR buffer = strdup((const char*)(lpBuffer)); - - /* for ̿ؼ ٸ strtok ߶. */ - for (LPSTR line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) - { - /* ߶ ٿ Token ִ Ȯϰ ƴҰ쿡 continue. */ - if (strnicmp(line, AUDIO_FILE_INFO_TOKEN, AUDIO_FILE_INFO_TOKEN_LENGTH) != 0) - { - continue; - } - - TCHAR nameAudioFile[MAX_PATH]; - mbstowcs(nameAudioFile, &line[AUDIO_FILE_INFO_TOKEN_LENGTH], MAX_PATH); - StrTrimW(nameAudioFile, L" \r"); - - TCHAR pathAudioFile[MAX_PATH]; - wcscpy(pathAudioFile, nameFile); - /* pathAudioFile ϸ ϴ. */ - PathRemoveFileSpecW(pathAudioFile); - /* ϸ Path pathAudioFile nameAudioFileٿ, Path ϴ. */ - PathCombineW(pathAudioFile, pathAudioFile, nameAudioFile); - - EnterCriticalSection(&InstanceObserver.hCritiaclSection); - InstanceObserver.currentPlaying.beatmapPath = (std::wstring(nameFile)); - InstanceObserver.currentPlaying.audioPath = (std::wstring(pathAudioFile)); - /* Ȱ AudioFile ̸ ִٸ List ߰ ʴ´. */ - for (auto info = InstanceObserver.listBeatmapCached.begin(); info != InstanceObserver.listBeatmapCached.end(); ++info) - { - if (!StrCmpW(pathAudioFile, info->audioPath.c_str())) - { - goto ALREADY_CACHED; - } - } - InstanceObserver.listBeatmapCached.push_back(InstanceObserver.currentPlaying); - ALREADY_CACHED: - - LeaveCriticalSection(&InstanceObserver.hCritiaclSection); - - break; - } - - /* strdup ̿ ڿ ޸𸮸 ŵϴ. */ - free(buffer); - } - else - { - /* Beatmap ٽ ҷ ʰ Cache ҷö ִµ. */ - /* ׷쿡 Audioϸ Audio ִ Ȯϰ */ - /* ǰִ AudioFile ٲ۴. */ - EnterCriticalSection(&InstanceObserver.hCritiaclSection); - for (auto info = InstanceObserver.listBeatmapCached.begin(); info != InstanceObserver.listBeatmapCached.end(); ++info) - { - /* AudioFile Ѵ. */ - if (!StrCmpW(nameFile, info->audioPath.c_str())) - { - InstanceObserver.currentPlaying.beatmapPath = (info->beatmapPath); - InstanceObserver.currentPlaying.audioPath = (info->audioPath); - break; - } - } - LeaveCriticalSection(&InstanceObserver.hCritiaclSection); - } - return TRUE; -} - -/* ý ð մϴ. */ -inline long long GetCurrentSysTime() -{ - long long time; - - GetSystemTimeAsFileTime((LPFILETIME)&time); return time; -} - -BOOL WINAPI proxyBASS_ChannelPlay(DWORD handle, BOOL restart) -{ - if (!InstanceObserver.hookerBASS_ChannelPlay.GetOriginalFunction()(handle, restart)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - - if (info.ctype & BASS_CTYPE_STREAM) - { - double currentTimePos = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - float tempo = 0; - BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); - InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTimePos, tempo); - } - return TRUE; -} - -BOOL WINAPI proxyBASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) -{ - if (!InstanceObserver.hookerBASS_ChannelSetPosition.GetOriginalFunction()(handle, pos, mode)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - - if (info.ctype & BASS_CTYPE_STREAM) - { - double currentTime = BASS_ChannelBytes2Seconds(handle, pos); - float CurrentTempo = 0; - BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &CurrentTempo); - // !! pos , - // ϸ proxyBASS_ChannelPlay Լ ȣǰ, - // BASS_ChannelIsActive BASS_ACTIVE_PAUSED. - if (BASS_ChannelIsActive(handle) == BASS_ACTIVE_PAUSED) - { - CurrentTempo = -100; - } - - InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTime, CurrentTempo); - } - return TRUE; -} - -BOOL WINAPI proxyBASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) -{ - if (!InstanceObserver.hookerBASS_ChannelSetAttribute.GetOriginalFunction()(handle, attrib, value)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - - if ((info.ctype & BASS_CTYPE_STREAM) && attrib == BASS_ATTRIB_TEMPO) - { - double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTime, value); - } - return TRUE; -} - -BOOL WINAPI proxyBASS_ChannelPause(DWORD handle) -{ - if (!InstanceObserver.hookerBASS_ChannelPause.GetOriginalFunction()(handle)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - if (info.ctype & BASS_CTYPE_STREAM) - { - double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - InstanceObserver.SendInfomation(GetCurrentSysTime(), currentTime, -100); - } - return TRUE; -} - -void Observer::SendInfomation(long long calledAt, double currentTime, float tempo) -{ - TCHAR message[Server::MAX_MESSAGE_LENGTH]; - - /* ÷ϰִ proxyReadFile  Ŭ̾Ʈ մϴ. */ - EnterCriticalSection(&hCritiaclSection); - swprintf(message, L"%llx|%s|%lf|%f|%s\n", - calledAt, - currentPlaying.audioPath.c_str(), - currentTime, - tempo, - currentPlaying.beatmapPath.c_str()); - LeaveCriticalSection(&hCritiaclSection); - - GetServerInstance()->PushMessage(message); -} - -void Observer::Start() -{ - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - - this->hookerReadFile.Hook(); - this->hookerBASS_ChannelPlay.Hook(); - this->hookerBASS_ChannelSetPosition.Hook(); - this->hookerBASS_ChannelSetAttribute.Hook(); - this->hookerBASS_ChannelPause.Hook(); - - DetourTransactionCommit(); -} - -void Observer::Stop() -{ - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - - this->hookerBASS_ChannelPause.Unhook(); - this->hookerBASS_ChannelSetAttribute.Unhook(); - this->hookerBASS_ChannelSetPosition.Unhook(); - this->hookerBASS_ChannelPlay.Unhook(); - this->hookerReadFile.Unhook(); - - DetourTransactionCommit(); -} diff --git a/Server/Observer.h b/Server/Observer.h index 26d3687..f5b31b2 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -1,62 +1,9 @@ #pragma once -#include -#include -#include - -#include -#include "bass.h" -#include "Server.h" -#include "Hooker.h" - -/* Ͻ Լ DZ. */ -BOOL WINAPI proxyReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); -BOOL BASSDEF(proxyBASS_ChannelPlay)(DWORD, BOOL); -BOOL BASSDEF(proxyBASS_ChannelSetPosition)(DWORD, QWORD, DWORD); -BOOL BASSDEF(proxyBASS_ChannelSetAttribute)(DWORD, DWORD, float); -BOOL BASSDEF(proxyBASS_ChannelPause)(DWORD); +#include class Observer { public: - void Start(); - void Stop(); - - void SendInfomation(long long, double, float); - CRITICAL_SECTION hCritiaclSection; - - struct SongInfo { - std::wstring audioPath; - std::wstring beatmapPath; - } currentPlaying; - - std::list listBeatmapCached; - bool isSongCached(TCHAR* nameSongPath); - - Hooker hookerReadFile; - Hooker hookerBASS_ChannelPlay; - Hooker hookerBASS_ChannelSetPosition; - Hooker hookerBASS_ChannelSetAttribute; - Hooker hookerBASS_ChannelPause; - - Observer() : - hookerReadFile(L"kernel32.dll", "ReadFile", proxyReadFile), - hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", proxyBASS_ChannelPlay), - hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", proxyBASS_ChannelSetPosition), - hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", proxyBASS_ChannelSetAttribute), - hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", proxyBASS_ChannelPause) - { - InitializeCriticalSection(&hCritiaclSection); - Start(); - } - ~Observer() - { - Stop(); - DeleteCriticalSection(&hCritiaclSection); - } - - Observer(const Observer&) = delete; - Observer(Observer&&) = delete; - Observer& operator=(const Observer&) = delete; - Observer& operator=(Observer&&) = delete; + virtual void Update(std::wstring&&) = 0; }; diff --git a/Server/Program.cpp b/Server/Program.cpp new file mode 100644 index 0000000..0741310 --- /dev/null +++ b/Server/Program.cpp @@ -0,0 +1,27 @@ +#include +#include "Server.h" +#include "HookP.h" + +Server *server; +HookP *observer; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + { + server = new Server(); + server->Start(); + observer = new HookP(); + observer->Attach(server); + observer->Run(); + } + else if (fdwReason == DLL_PROCESS_DETACH) + { + observer->Stop(); + observer->Detach(server); + server->Stop(); + delete observer; + delete server; + } + return TRUE; +} diff --git a/Server/Resource.rc b/Server/Resource.rc index eff67c95bf81271f35a4d2fb5d8365491ebd5d15..70e2ffc67bb9d46a82c9b44b98068362a1b0dd9a 100644 GIT binary patch delta 42 ucmZ3ZyheFL6$hj7 -Server InstanceServer; +#include -Server* GetServerInstance() +DWORD WINAPI Server::Run(LPVOID lParam) { - return &InstanceServer; -} + this->hPushEvent = CreateEvent(NULL, FALSE, FALSE, NULL); -DWORD WINAPI Server::Thread(LPVOID lParam) -{ - InstanceServer.hPipe = CreateNamedPipe(L"\\\\.\\pipe\\osu!Lyrics", PIPE_ACCESS_OUTBOUND, + this->hPipe = CreateNamedPipe(L"\\\\.\\pipe\\osu!Lyrics", PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, Server::nBufferSize, 0, INFINITE, NULL); - std::wstring message; DWORD nNumberOfBytesWritten; // û Ŭ̾Ʈ - while (!InstanceServer.isThreadCanceled) + while (!this->isCancellationRequested) { // ConnectNamedPipe Ŭ̾Ʈ : // Ҵ DisconnectNamedPipe - if (ConnectNamedPipe(InstanceServer.hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) + if (ConnectNamedPipe(this->hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) { - InstanceServer.isPipeConnected = true; + this->isPipeConnected = true; // ޽ ť ִ 3ʰ ٸ ٽ õ: // Ŭ̾Ʈ ؾ ϱ INTINITE - if (!InstanceServer.messageQueue.try_pop(message)) + if (!this->messageQueue.try_pop(message)) { - WaitForSingleObject(InstanceServer.hPushEvent, 3000); + WaitForSingleObject(this->hPushEvent, 3000); continue; } - if (WriteFile(InstanceServer.hPipe, message.c_str(), message.length() * sizeof(std::wstring::value_type), &nNumberOfBytesWritten, NULL)) + if (WriteFile(this->hPipe, message.c_str(), message.length() * sizeof(std::wstring::value_type), &nNumberOfBytesWritten, NULL)) { continue; } } - InstanceServer.isPipeConnected = false; - DisconnectNamedPipe(InstanceServer.hPipe); + this->isPipeConnected = false; + DisconnectNamedPipe(this->hPipe); } // Ŭ̾Ʈ - InstanceServer.isPipeConnected = false; - DisconnectNamedPipe(InstanceServer.hPipe); - CloseHandle(InstanceServer.hPipe); + this->isPipeConnected = false; + DisconnectNamedPipe(this->hPipe); + CloseHandle(this->hPipe); + + CloseHandle(this->hPushEvent); return 0; } -void Server::PushMessage(std::wstring&& message) +namespace bettertrunkneeded_maybetemplatetrunk_question { - if (!this->isPipeConnected) + DWORD WINAPI trunk(LPVOID lParam) { - return; + Server *server = (Server *) lParam; + return server->Run(nullptr); } - - this->messageQueue.push(message); - SetEvent(this->hPushEvent); } -void Server::Run() +void Server::Start() { - this->hPushEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - this->hThread = CreateThread(NULL, 0, Server::Thread, NULL, 0, NULL); + this->hThread = CreateThread(NULL, 0, bettertrunkneeded_maybetemplatetrunk_question::trunk, this, 0, NULL); } void Server::Stop() { - this->isThreadCanceled = true; - + this->isCancellationRequested = true; DisconnectNamedPipe(this->hPipe); WaitForSingleObject(this->hThread, INFINITE); CloseHandle(this->hThread); - CloseHandle(this->hPushEvent); } -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +void Server::Update(std::wstring&& message) { - if (fdwReason == DLL_PROCESS_ATTACH) - { - } - else if (fdwReason == DLL_PROCESS_DETACH) + if (!this->isPipeConnected) { + return; } - return TRUE; -} \ No newline at end of file + + this->messageQueue.push(message); + SetEvent(this->hPushEvent); +} diff --git a/Server/Server.h b/Server/Server.h index 694823f..10526ae 100644 --- a/Server/Server.h +++ b/Server/Server.h @@ -1,46 +1,38 @@ #pragma once -#include #include -#include -#include #include #include #include +#include "Observer.h" -class Server +class Server : public Observer { public: - static const DWORD MAX_MESSAGE_LENGTH = MAX_PATH * 3; - static const DWORD nBufferSize = Server::MAX_MESSAGE_LENGTH * sizeof(std::wstring::value_type); - - void Run(); + static const DWORD nMessageLength = MAX_PATH * 3; + static const DWORD nBufferSize = Server::nMessageLength * sizeof(std::wstring::value_type); + + Server() : + hThread(NULL), + isCancellationRequested(false), + hPipe(NULL), + isPipeConnected(false), + hPushEvent(NULL) {} + + DWORD WINAPI Run(LPVOID); + void Start(); void Stop(); - void PushMessage(std::wstring&&); - static DWORD WINAPI Thread(LPVOID); + virtual void Update(std::wstring&&); +private: HANDLE hThread; - std::atomic isThreadCanceled; + std::atomic isCancellationRequested; HANDLE hPipe; std::atomic isPipeConnected; concurrency::concurrent_queue messageQueue; HANDLE hPushEvent; - Server() : - hThread(NULL), - isThreadCanceled(false), - hPipe(NULL), - isPipeConnected(false), - hPushEvent(NULL) { Run(); } - ~Server() { Stop(); } - - Server(const Server&) = delete; - Server(Server&&) = delete; - Server& operator=(const Server&) = delete; - Server& operator=(Server&&) = delete; }; - -Server* GetServerInstance(); \ No newline at end of file diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj index 0aa4890..67da8af 100644 --- a/Server/Server.vcxproj +++ b/Server/Server.vcxproj @@ -86,8 +86,10 @@ - + + + @@ -95,6 +97,8 @@ + + diff --git a/Server/Server.vcxproj.filters b/Server/Server.vcxproj.filters index 9b65372..5861b86 100644 --- a/Server/Server.vcxproj.filters +++ b/Server/Server.vcxproj.filters @@ -1,13 +1,14 @@  - + + + - @@ -19,6 +20,9 @@ Libraries\detours + + + diff --git a/Server/Subject.cpp b/Server/Subject.cpp new file mode 100644 index 0000000..b83c137 --- /dev/null +++ b/Server/Subject.cpp @@ -0,0 +1,25 @@ +#include "Subject.h" + +#include +#include +#include + +#include "Observer.h" + +void Subject::Attach(Observer *observer) +{ + this->observers.emplace_back(observer); +} + +void Subject::Detach(Observer *observer) +{ + this->observers.erase(std::find(this->observers.begin(), this->observers.end(), observer), this->observers.end()); +} + +void Subject::Notify(std::wstring&& message) +{ + std::for_each(this->observers.begin(), this->observers.end(), [&message](auto& observer) + { + observer->Update(std::move(message)); + }); +} diff --git a/Server/Subject.h b/Server/Subject.h new file mode 100644 index 0000000..f89916d --- /dev/null +++ b/Server/Subject.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +#include "Observer.h" + +class Subject +{ +public: + void Attach(Observer *); + void Detach(Observer *); + void Notify(std::wstring&&); + +private: + std::vector observers; +}; diff --git a/Server/bass.h b/Server/bass.h index fc84039..c96cfee 100644 --- a/Server/bass.h +++ b/Server/bass.h @@ -968,10 +968,10 @@ const char *BASSDEF(BASS_ChannelGetTags)(DWORD handle, DWORD tags); DWORD BASSDEF(BASS_ChannelFlags)(DWORD handle, DWORD flags, DWORD mask); BOOL BASSDEF(BASS_ChannelUpdate)(DWORD handle, DWORD length); BOOL BASSDEF(BASS_ChannelLock)(DWORD handle, BOOL lock); -BOOL BASSDEF(proxyBASS_ChannelPlay)(DWORD handle, BOOL restart); +BOOL BASSDEF(BASS_ChannelPlay)(DWORD handle, BOOL restart); BOOL BASSDEF(BASS_ChannelStop)(DWORD handle); -BOOL BASSDEF(proxyBASS_ChannelPause)(DWORD handle); -BOOL BASSDEF(proxyBASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value); +BOOL BASSDEF(BASS_ChannelPause)(DWORD handle); +BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value); BOOL BASSDEF(BASS_ChannelGetAttribute)(DWORD handle, DWORD attrib, float *value); BOOL BASSDEF(BASS_ChannelSlideAttribute)(DWORD handle, DWORD attrib, float value, DWORD time); BOOL BASSDEF(BASS_ChannelIsSliding)(DWORD handle, DWORD attrib); @@ -982,7 +982,7 @@ BOOL BASSDEF(BASS_ChannelGet3DAttributes)(DWORD handle, DWORD *mode, float *min, BOOL BASSDEF(BASS_ChannelSet3DPosition)(DWORD handle, const BASS_3DVECTOR *pos, const BASS_3DVECTOR *orient, const BASS_3DVECTOR *vel); BOOL BASSDEF(BASS_ChannelGet3DPosition)(DWORD handle, BASS_3DVECTOR *pos, BASS_3DVECTOR *orient, BASS_3DVECTOR *vel); QWORD BASSDEF(BASS_ChannelGetLength)(DWORD handle, DWORD mode); -BOOL BASSDEF(proxyBASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode); +BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode); QWORD BASSDEF(BASS_ChannelGetPosition)(DWORD handle, DWORD mode); DWORD BASSDEF(BASS_ChannelGetLevel)(DWORD handle); BOOL BASSDEF(BASS_ChannelGetLevelEx)(DWORD handle, float *levels, float length, DWORD flags); diff --git a/osu!Lyrics/Properties/AssemblyInfo.cs b/osu!Lyrics/Properties/AssemblyInfo.cs index 6652338..f8904f0 100644 --- a/osu!Lyrics/Properties/AssemblyInfo.cs +++ b/osu!Lyrics/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.8.62")] -[assembly: AssemblyInformationalVersion("1.8.62")] +[assembly: AssemblyInformationalVersion("1.8.63")] [assembly: NeutralResourcesLanguageAttribute("ko-KR")] From 0c665dfaaa14e75c0da32a33081d565da225d73a Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 18 Aug 2016 12:54:05 +0900 Subject: [PATCH 09/48] =?UTF-8?q?wchar=5Ft=EA=B0=80=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=3F!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/HookP.cpp | 1 - Server/Hooker.h | 2 -- Server/Hooker.hpp | 2 -- 3 files changed, 5 deletions(-) diff --git a/Server/HookP.cpp b/Server/HookP.cpp index e39a607..848cd36 100644 --- a/Server/HookP.cpp +++ b/Server/HookP.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include #include diff --git a/Server/Hooker.h b/Server/Hooker.h index 7d1fb5b..38303d3 100644 --- a/Server/Hooker.h +++ b/Server/Hooker.h @@ -1,7 +1,5 @@ #pragma once -#include - template class Hooker { diff --git a/Server/Hooker.hpp b/Server/Hooker.hpp index 536c5aa..ce3eba9 100644 --- a/Server/Hooker.hpp +++ b/Server/Hooker.hpp @@ -1,5 +1,3 @@ -#include - #include #include "detours.h" From 84c4a3aeec946f875a7ce3807f634a35e9e43d37 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Fri, 16 Sep 2016 20:43:38 +0900 Subject: [PATCH 10/48] =?UTF-8?q?Hooker=EC=9D=98=20=ED=9B=84=ED=82=B9=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EC=97=90=20=EB=A9=A4=EB=B2=84=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EA=B2=8C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/{Program.cpp => DllMain.cpp} | 19 +++---- Server/HookP.h | 60 --------------------- Server/Hooker.h | 54 +++++++++++++++---- Server/Hooker.hpp | 57 -------------------- Server/{HookP.cpp => Monitor.cpp} | 81 +++++++++++++++-------------- Server/Monitor.h | 43 +++++++++++++++ Server/Observable.h | 12 +++++ Server/Observer.h | 2 +- Server/Runnable.h | 6 +++ Server/Server.cpp | 29 ++++------- Server/Server.h | 20 +++---- Server/Server.vcxproj | 14 +++-- Server/Server.vcxproj.filters | 14 +++-- Server/Subject.cpp | 11 ++-- Server/Subject.h | 15 +++--- Server/THUNK.cpp | 44 ++++++++++++++++ Server/THUNK.h | 42 +++++++++++++++ Server/Thread.cpp | 29 +++++++++++ Server/Thread.h | 22 ++++++++ Server/brute_cast.h | 13 +++++ 20 files changed, 357 insertions(+), 230 deletions(-) rename Server/{Program.cpp => DllMain.cpp} (53%) delete mode 100644 Server/HookP.h delete mode 100644 Server/Hooker.hpp rename Server/{HookP.cpp => Monitor.cpp} (72%) create mode 100644 Server/Monitor.h create mode 100644 Server/Observable.h create mode 100644 Server/Runnable.h create mode 100644 Server/THUNK.cpp create mode 100644 Server/THUNK.h create mode 100644 Server/Thread.cpp create mode 100644 Server/Thread.h create mode 100644 Server/brute_cast.h diff --git a/Server/Program.cpp b/Server/DllMain.cpp similarity index 53% rename from Server/Program.cpp rename to Server/DllMain.cpp index 0741310..a930131 100644 --- a/Server/Program.cpp +++ b/Server/DllMain.cpp @@ -1,9 +1,9 @@ #include #include "Server.h" -#include "HookP.h" +#include "Monitor.h" -Server *server; -HookP *observer; +Server* server; +Monitor* monitor; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { @@ -11,16 +11,17 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { server = new Server(); server->Start(); - observer = new HookP(); - observer->Attach(server); - observer->Run(); + monitor = new Monitor(); + monitor->Attach(static_cast(server)); + monitor->Activate(); } else if (fdwReason == DLL_PROCESS_DETACH) { - observer->Stop(); - observer->Detach(server); + monitor->Disable(); + monitor->Detach(static_cast(server)); server->Stop(); - delete observer; + delete monitor; + server->Wait(); delete server; } return TRUE; diff --git a/Server/HookP.h b/Server/HookP.h deleted file mode 100644 index 6f1c920..0000000 --- a/Server/HookP.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include "Subject.h" - -#include -#include - -#include -#include "bass.h" -#include "Server.h" -#include "Hooker.h" - -class HookP : public Subject -{ -public: - HookP() : - hookerReadFile(L"kernel32.dll", "ReadFile", HookP::ReadFile), - hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay", HookP::BASS_ChannelPlay), - hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition", HookP::BASS_ChannelSetPosition), - hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute", HookP::BASS_ChannelSetAttribute), - hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause", HookP::BASS_ChannelPause) - { - Instance = this; - InitializeCriticalSection(&this->hCritiaclSection); - } - ~HookP() - { - DeleteCriticalSection(&this->hCritiaclSection); - } - - void Run(); - void Stop(); - void Notify(double, float); -private: - static BOOL WINAPI ReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); - static BOOL BASSDEF(BASS_ChannelPlay)(DWORD, BOOL); - static BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD, QWORD, DWORD); - static BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD, DWORD, float); - static BOOL BASSDEF(BASS_ChannelPause)(DWORD); - - // ʿϰ ߻ - // Serveró trunk ?? - static HookP *Instance; - static HookP *GetInstance(); - - // what osu! played - // [ audioPath, beatmapPath ] - concurrency::concurrent_unordered_map audioInfo; - // what osu! is playing - // [ audioPath, beatmapPath ] - std::pair playing; - // thread safe playing - CRITICAL_SECTION hCritiaclSection; - - Hooker hookerReadFile; - Hooker hookerBASS_ChannelPlay; - Hooker hookerBASS_ChannelSetPosition; - Hooker hookerBASS_ChannelSetAttribute; - Hooker hookerBASS_ChannelPause; -}; diff --git a/Server/Hooker.h b/Server/Hooker.h index 38303d3..55c8243 100644 --- a/Server/Hooker.h +++ b/Server/Hooker.h @@ -1,22 +1,56 @@ #pragma once +#include +#include "detours.h" +#include "THUNK.h" + template class Hooker { public: - Hooker(const wchar_t *, const char *, TypeFunction *); - ~Hooker(); + Hooker(const wchar_t* szModuleName, const char* szFunctionName) : + pOriginalFunction(reinterpret_cast(GetProcAddress(GetModuleHandle(szModuleName), szFunctionName))), + pHookThunk(new THUNK()), + isHooked(false) + { + } + ~Hooker() + { + delete this->pHookThunk; + } + + void SetHookFunction(TypeFunction* pHookFunction) + { + this->pHookThunk->Set(pHookFunction); + } + template + void SetHookFunction(T C::* pHookMemberFunction, I* pInstance) + { + this->pHookThunk->Set(pHookMemberFunction, pInstance); + } - TypeFunction *GetOriginalFunction(); - void SetHookFunction(TypeFunction *); + void Hook() + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach(&(PVOID&) this->pOriginalFunction, this->pHookThunk); + this->isHooked = DetourTransactionCommit() == NO_ERROR; + } + void Unhook() + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach(&(PVOID&) this->pOriginalFunction, this->pHookThunk); + this->isHooked = DetourTransactionCommit() != NO_ERROR; + } - void Hook(); - void Unhook(); + TypeFunction* GetOriginalFunction() + { + return this->pOriginalFunction; + } private: - TypeFunction *pFunction; - TypeFunction *pHookFunction; + TypeFunction* pOriginalFunction; + THUNK* pHookThunk; bool isHooked; }; - -#include "Hooker.hpp" diff --git a/Server/Hooker.hpp b/Server/Hooker.hpp deleted file mode 100644 index ce3eba9..0000000 --- a/Server/Hooker.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include "detours.h" - -template -Hooker::Hooker(const wchar_t *szModuleName, const char *szFunctionName, TypeFunction *pHookFunction = nullptr) -{ - this->isHooked = false; - - this->pFunction = (TypeFunction *) GetProcAddress(GetModuleHandle(szModuleName), szFunctionName); - this->SetHookFunction(pHookFunction); -} - -template -Hooker::~Hooker() -{ - this->Unhook(); -} - -template -TypeFunction *Hooker::GetOriginalFunction() -{ - return this->pFunction; -} - -template -void Hooker::SetHookFunction(TypeFunction *pHookFunction) -{ - this->pHookFunction = pHookFunction; -} - -template -void Hooker::Hook() -{ - if (this->isHooked || this->pHookFunction == nullptr) - { - return; - } - - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); - this->isHooked = DetourTransactionCommit() == NO_ERROR; -} - -template -void Hooker::Unhook() -{ - if (!this->isHooked) - { - return; - } - - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach(&(PVOID&) this->pFunction, (PVOID) this->pHookFunction); - this->isHooked = DetourTransactionCommit() != NO_ERROR; -} diff --git a/Server/HookP.cpp b/Server/Monitor.cpp similarity index 72% rename from Server/HookP.cpp rename to Server/Monitor.cpp index 848cd36..2a40940 100644 --- a/Server/HookP.cpp +++ b/Server/Monitor.cpp @@ -1,31 +1,40 @@ #pragma comment(lib, "Shlwapi.lib") -#include "HookP.h" +#include "Monitor.h" #include #include -#include #include #include -#include -#include #include -#include "bass.h" -#include "bass_fx.h" -#include "Hooker.h" #include "Server.h" -HookP *HookP::Instance; -HookP *HookP::GetInstance() +Monitor::Monitor() : + hookerReadFile(L"kernel32.dll", "ReadFile"), + hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay"), + hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition"), + hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute"), + hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause") { - return Instance; + InitializeCriticalSection(&this->hCritiaclSection); + + hookerReadFile.SetHookFunction(&Monitor::OnReadFile, this); + hookerBASS_ChannelPlay.SetHookFunction(&Monitor::OnBASS_ChannelPlay, this); + hookerBASS_ChannelSetPosition.SetHookFunction(&Monitor::OnBASS_ChannelSetPosition, this); + hookerBASS_ChannelSetAttribute.SetHookFunction(&Monitor::OnBASS_ChannelSetAttribute, this); + hookerBASS_ChannelPause.SetHookFunction(&Monitor::OnBASS_ChannelPause, this); } -BOOL WINAPI HookP::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) +Monitor::~Monitor() +{ + DeleteCriticalSection(&this->hCritiaclSection); +} + + +BOOL Monitor::OnReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { - HookP *self = HookP::GetInstance(); - if (!self->hookerReadFile.GetOriginalFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) + if (!this->hookerReadFile.GetOriginalFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) { return FALSE; } @@ -82,7 +91,7 @@ BOOL WINAPI HookP::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesT // osu! Ʈ ٲ Ź Ʈ ʰ ijÿ ҷ⵵ // => Ʈ Ϻٴ ؾ - self->audioInfo.insert({szAudioFilePath, szFilePath}); + this->audioInfo.insert({szAudioFilePath, szFilePath}); break; } // strdup ó @@ -91,22 +100,21 @@ BOOL WINAPI HookP::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesT // д Ʈ ϱ else { - decltype(self->audioInfo)::iterator info; - if ((info = self->audioInfo.find(szFilePath)) != self->audioInfo.end()) + decltype(this->audioInfo)::iterator info; + if ((info = this->audioInfo.find(szFilePath)) != this->audioInfo.end()) { - EnterCriticalSection(&self->hCritiaclSection); - self->playing = {info->first.substr(4), info->second.substr(4)}; - LeaveCriticalSection(&self->hCritiaclSection); + EnterCriticalSection(&this->hCritiaclSection); + this->playing = {info->first.substr(4), info->second.substr(4)}; + LeaveCriticalSection(&this->hCritiaclSection); } } return TRUE; } -BOOL WINAPI HookP::BASS_ChannelPlay(DWORD handle, BOOL restart) +BOOL Monitor::OnBASS_ChannelPlay(DWORD handle, BOOL restart) { - HookP *self = HookP::GetInstance(); - if (!self->hookerBASS_ChannelPlay.GetOriginalFunction()(handle, restart)) + if (!this->hookerBASS_ChannelPlay.GetOriginalFunction()(handle, restart)) { return FALSE; } @@ -118,15 +126,14 @@ BOOL WINAPI HookP::BASS_ChannelPlay(DWORD handle, BOOL restart) double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); float tempo = 0; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); - self->Notify(currentTime, tempo); + this->Notify(currentTime, tempo); } return TRUE; } -BOOL WINAPI HookP::BASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) +BOOL Monitor::OnBASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) { - HookP *self = HookP::GetInstance(); - if (!self->hookerBASS_ChannelSetPosition.GetOriginalFunction()(handle, pos, mode)) + if (!this->hookerBASS_ChannelSetPosition.GetOriginalFunction()(handle, pos, mode)) { return FALSE; } @@ -145,15 +152,14 @@ BOOL WINAPI HookP::BASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) { tempo = -100; } - self->Notify(currentTime, tempo); + this->Notify(currentTime, tempo); } return TRUE; } -BOOL WINAPI HookP::BASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) +BOOL Monitor::OnBASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) { - HookP *self = HookP::GetInstance(); - if (!self->hookerBASS_ChannelSetAttribute.GetOriginalFunction()(handle, attrib, value)) + if (!this->hookerBASS_ChannelSetAttribute.GetOriginalFunction()(handle, attrib, value)) { return FALSE; } @@ -163,15 +169,14 @@ BOOL WINAPI HookP::BASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float va if ((info.ctype & BASS_CTYPE_STREAM) && attrib == BASS_ATTRIB_TEMPO) { double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - self->Notify(currentTime, value); + this->Notify(currentTime, value); } return TRUE; } -BOOL WINAPI HookP::BASS_ChannelPause(DWORD handle) +BOOL Monitor::OnBASS_ChannelPause(DWORD handle) { - HookP *self = HookP::GetInstance(); - if (!self->hookerBASS_ChannelPause.GetOriginalFunction()(handle)) + if (!this->hookerBASS_ChannelPause.GetOriginalFunction()(handle)) { return FALSE; } @@ -181,7 +186,7 @@ BOOL WINAPI HookP::BASS_ChannelPause(DWORD handle) if (info.ctype & BASS_CTYPE_STREAM) { double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - self->Notify(currentTime, -100); + this->Notify(currentTime, -100); } return TRUE; } @@ -199,7 +204,7 @@ inline long long GetSystemTimeAsFileTime() return ((long long) ft.dwHighDateTime << 32) + ft.dwLowDateTime; } -void HookP::Notify(double currentTime, float tempo) +void Monitor::Notify(double currentTime, float tempo) { wchar_t message[Server::nMessageLength]; EnterCriticalSection(&this->hCritiaclSection); @@ -214,7 +219,7 @@ void HookP::Notify(double currentTime, float tempo) Subject::Notify(message); } -void HookP::Run() +void Monitor::Activate() { this->hookerReadFile.Hook(); @@ -224,7 +229,7 @@ void HookP::Run() this->hookerBASS_ChannelPause.Hook(); } -void HookP::Stop() +void Monitor::Disable() { this->hookerBASS_ChannelPause.Unhook(); this->hookerBASS_ChannelSetAttribute.Unhook(); diff --git a/Server/Monitor.h b/Server/Monitor.h new file mode 100644 index 0000000..a04c76b --- /dev/null +++ b/Server/Monitor.h @@ -0,0 +1,43 @@ +#pragma once + +#include "Subject.h" + +#include + +#include +#include "bass.h" +#include "bass_fx.h" +#include "Hooker.h" + +class Monitor : public Subject +{ +public: + Monitor(); + ~Monitor(); + + void Activate(); + void Disable(); + void Notify(double, float); + +private: + BOOL OnReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); + BOOL OnBASS_ChannelPlay(DWORD, BOOL); + BOOL OnBASS_ChannelSetPosition(DWORD, QWORD, DWORD); + BOOL OnBASS_ChannelSetAttribute(DWORD, DWORD, float); + BOOL OnBASS_ChannelPause(DWORD); + + Hooker hookerReadFile; + Hooker hookerBASS_ChannelPlay; + Hooker hookerBASS_ChannelSetPosition; + Hooker hookerBASS_ChannelSetAttribute; + Hooker hookerBASS_ChannelPause; + + // what osu! played + // [ audioPath, beatmapPath ] + concurrency::concurrent_unordered_map audioInfo; + // what osu! is playing + // [ audioPath, beatmapPath ] + std::pair playing; + // thread safe playing + CRITICAL_SECTION hCritiaclSection; +}; diff --git a/Server/Observable.h b/Server/Observable.h new file mode 100644 index 0000000..f780570 --- /dev/null +++ b/Server/Observable.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +#include "Observer.h" + +struct Observable +{ + virtual void Attach(Observer*) = 0; + virtual void Detach(Observer*) = 0; + virtual void Notify(const std::wstring&) = 0; +}; diff --git a/Server/Observer.h b/Server/Observer.h index f5b31b2..ebb2758 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -5,5 +5,5 @@ class Observer { public: - virtual void Update(std::wstring&&) = 0; + virtual void Update(const std::wstring&) = 0; }; diff --git a/Server/Runnable.h b/Server/Runnable.h new file mode 100644 index 0000000..5264367 --- /dev/null +++ b/Server/Runnable.h @@ -0,0 +1,6 @@ +#pragma once + +struct Runnable +{ + virtual void Run() = 0; +}; diff --git a/Server/Server.cpp b/Server/Server.cpp index 61ee5af..9749a08 100644 --- a/Server/Server.cpp +++ b/Server/Server.cpp @@ -4,7 +4,15 @@ #include -DWORD WINAPI Server::Run(LPVOID lParam) +Server::Server() : + isCancellationRequested(false), + hPipe(NULL), + isPipeConnected(false), + hPushEvent(NULL) +{ +} + +void Server::Run() { this->hPushEvent = CreateEvent(NULL, FALSE, FALSE, NULL); @@ -43,32 +51,15 @@ DWORD WINAPI Server::Run(LPVOID lParam) CloseHandle(this->hPipe); CloseHandle(this->hPushEvent); - return 0; -} - -namespace bettertrunkneeded_maybetemplatetrunk_question -{ - DWORD WINAPI trunk(LPVOID lParam) - { - Server *server = (Server *) lParam; - return server->Run(nullptr); - } -} - -void Server::Start() -{ - this->hThread = CreateThread(NULL, 0, bettertrunkneeded_maybetemplatetrunk_question::trunk, this, 0, NULL); } void Server::Stop() { this->isCancellationRequested = true; DisconnectNamedPipe(this->hPipe); - WaitForSingleObject(this->hThread, INFINITE); - CloseHandle(this->hThread); } -void Server::Update(std::wstring&& message) +void Server::Update(const std::wstring& message) { if (!this->isPipeConnected) { diff --git a/Server/Server.h b/Server/Server.h index 10526ae..f4d2140 100644 --- a/Server/Server.h +++ b/Server/Server.h @@ -1,33 +1,27 @@ #pragma once -#include +#include "Observer.h" +#include "Thread.h" + #include #include #include -#include "Observer.h" -class Server : public Observer +class Server : public Observer, public Thread { public: static const DWORD nMessageLength = MAX_PATH * 3; static const DWORD nBufferSize = Server::nMessageLength * sizeof(std::wstring::value_type); - Server() : - hThread(NULL), - isCancellationRequested(false), - hPipe(NULL), - isPipeConnected(false), - hPushEvent(NULL) {} + Server(); - DWORD WINAPI Run(LPVOID); - void Start(); + virtual void Run() override; void Stop(); - virtual void Update(std::wstring&&); + virtual void Update(const std::wstring&) override; private: - HANDLE hThread; std::atomic isCancellationRequested; HANDLE hPipe; diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj index 67da8af..e4e4d10 100644 --- a/Server/Server.vcxproj +++ b/Server/Server.vcxproj @@ -86,22 +86,28 @@ - - + + + + + - - + + + + + diff --git a/Server/Server.vcxproj.filters b/Server/Server.vcxproj.filters index 5861b86..c37bf12 100644 --- a/Server/Server.vcxproj.filters +++ b/Server/Server.vcxproj.filters @@ -2,13 +2,14 @@ - - + + + + - @@ -20,9 +21,14 @@ Libraries\detours - + + + + + + diff --git a/Server/Subject.cpp b/Server/Subject.cpp index b83c137..9b0af1a 100644 --- a/Server/Subject.cpp +++ b/Server/Subject.cpp @@ -1,25 +1,22 @@ #include "Subject.h" -#include #include #include -#include "Observer.h" - -void Subject::Attach(Observer *observer) +void Subject::Attach(Observer* observer) { this->observers.emplace_back(observer); } -void Subject::Detach(Observer *observer) +void Subject::Detach(Observer* observer) { this->observers.erase(std::find(this->observers.begin(), this->observers.end(), observer), this->observers.end()); } -void Subject::Notify(std::wstring&& message) +void Subject::Notify(const std::wstring& message) { std::for_each(this->observers.begin(), this->observers.end(), [&message](auto& observer) { - observer->Update(std::move(message)); + observer->Update(message); }); } diff --git a/Server/Subject.h b/Server/Subject.h index f89916d..abf7702 100644 --- a/Server/Subject.h +++ b/Server/Subject.h @@ -1,17 +1,16 @@ #pragma once -#include -#include +#include "Observable.h" -#include "Observer.h" +#include -class Subject +class Subject : public Observable { public: - void Attach(Observer *); - void Detach(Observer *); - void Notify(std::wstring&&); + virtual void Attach(Observer*) override; + virtual void Detach(Observer*) override; + virtual void Notify(const std::wstring&) override; private: - std::vector observers; + std::vector observers; }; diff --git a/Server/THUNK.cpp b/Server/THUNK.cpp new file mode 100644 index 0000000..43a38c4 --- /dev/null +++ b/Server/THUNK.cpp @@ -0,0 +1,44 @@ +#include "THUNK.h" + +HANDLE hHeap; +size_t nEntry; + +void THUNK::Set(DWORD pFunction, DWORD pInstance) +{ + if (pInstance == 0) + { + //nop + this->lea_ecx = 0x9090; + this->pInstance = 0x90909090; + } + else + { + this->lea_ecx = 0x0D8D; + this->pInstance = pInstance; + } + this->mov_eax = 0xB8; + this->pFunction = pFunction; + this->jmp_eax = 0xE0FF; + // flush multi thread instruction cache + FlushInstructionCache(GetCurrentProcess(), static_cast(this), sizeof(THUNK)); +} + +void* THUNK::operator new(size_t) +{ + if (nEntry == 0) + { + hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0); + } + void* entry = HeapAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS, sizeof(THUNK)); + nEntry++; + return entry; +} + +void THUNK::operator delete(void* p) +{ + HeapFree(hHeap, HEAP_GENERATE_EXCEPTIONS, p); + if (--nEntry == 0) + { + HeapDestroy(hHeap); + } +} diff --git a/Server/THUNK.h b/Server/THUNK.h new file mode 100644 index 0000000..b51c630 --- /dev/null +++ b/Server/THUNK.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include "brute_cast.h" + +struct THUNK +{ +#pragma pack(push, 1) + //lea ecx,pInstance + WORD lea_ecx; + DWORD pInstance; + //mov eax,pFunction + BYTE mov_eax; + DWORD pFunction; + //jmp eax + WORD jmp_eax; +#pragma pack(pop) + + THUNK() + : lea_ecx(0), + pInstance(0), + mov_eax(0), + pFunction(0), + jmp_eax(0) + { + } + + template + void Set(T* pFunction) + { + this->Set(reinterpret_cast(pFunction), reinterpret_cast(nullptr)); + } + template + void Set(T C::* pMemberFunction, I* pInstance) + { + this->Set(brute_cast(pMemberFunction), reinterpret_cast(pInstance)); + } + void Set(DWORD, DWORD); + + void* operator new(size_t); + void operator delete(void*); +}; diff --git a/Server/Thread.cpp b/Server/Thread.cpp new file mode 100644 index 0000000..3c1ae35 --- /dev/null +++ b/Server/Thread.cpp @@ -0,0 +1,29 @@ +#include "Thread.h" + +Thread::Thread() + : pThunk(new THUNK()) +{ + this->pThunk->Set(&Thread::Proc, this); +} + +Thread::~Thread() +{ + delete this->pThunk; +} + +void Thread::Start() +{ + this->hThread = CreateThread(NULL, 0, reinterpret_cast(this->pThunk), NULL, 0, NULL); +} + +void Thread::Wait() +{ + WaitForSingleObject(this->hThread, INFINITE); + CloseHandle(this->hThread); +} + +DWORD Thread::Proc(LPVOID lParam) +{ + this->Run(); + return 0; +} diff --git a/Server/Thread.h b/Server/Thread.h new file mode 100644 index 0000000..e37be5d --- /dev/null +++ b/Server/Thread.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Runnable.h" + +#include +#include "THUNK.h" + +class Thread : public Runnable +{ +public: + Thread(); + ~Thread(); + + void Start(); + void Wait(); + +private: + DWORD Proc(LPVOID); + + THUNK* pThunk; + HANDLE hThread; +}; diff --git a/Server/brute_cast.h b/Server/brute_cast.h new file mode 100644 index 0000000..1c8699b --- /dev/null +++ b/Server/brute_cast.h @@ -0,0 +1,13 @@ +#pragma once + +template +R brute_cast(T in) +{ + union + { + R o; + T i; + } u; + u.i = in; + return u.o; +} From f633628d19e3438fc8af23a044904fd6bc6770e7 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Fri, 16 Sep 2016 21:15:31 +0900 Subject: [PATCH 11/48] 1.8.64 --- LICENSE | 2 +- Server/Observer.h | 3 +-- Server/Resource.rc | Bin 4524 -> 4524 bytes Server/detours.lib | Bin 208994 -> 242484 bytes osu!Lyrics/Properties/AssemblyInfo.cs | 2 +- 5 files changed, 3 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 2a950b8..4317eb9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Sunghwan Bang +Copyright (c) 2016 Bang Sunghwan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Server/Observer.h b/Server/Observer.h index ebb2758..b0c5e18 100644 --- a/Server/Observer.h +++ b/Server/Observer.h @@ -2,8 +2,7 @@ #include -class Observer +struct Observer { -public: virtual void Update(const std::wstring&) = 0; }; diff --git a/Server/Resource.rc b/Server/Resource.rc index 70e2ffc67bb9d46a82c9b44b98068362a1b0dd9a..02ba198d4fb8ccce08f5eb6d6df6e7c640919385 100644 GIT binary patch delta 42 ucmZ3ZyheFL6$hiqROFgKxCMmWBnye;vgATQ(IuA+3FPMPhKq_W4Y9-} zEh?#(YQ?IpTCI0QD>fj4R;$&|_Ty8uXtjlc7F$};qWsS@Gw1BtTL5dn|NH*G181K( z@4WM#xxVwxoH>(or&oJw8)hVp%LsK@*^{#~$4{L!b$lp2Q{PU^8lSDai;{#89YTzl z^37hqf!zO(u73TW6W`e7J4N*SC$9LjuNVKsHFM^0mup$A$LCsB?ehAn>2Z4+>sPv} zJ&W6$-7P+sZ)Ka?Ha9olW?NvNKmQVO>``1*W}I@Lr?F*mUTs5OYuidY$g?kY+VcyY z5DST}(l%dXYm2ws*XpTW?6%F!nmNmZbG8!8e3g$i0-R*wJJWFZK^HXHODSy zdVL=B2@jtGd2{Xg1(4^;cl%n~J$#h2dSz2M&+U2t#3WTdT)6tFbBe6BSEIb#rW%iiY-< zrN@w}tXP@T0TIcSIoE-GB{hU4dQx2u_3-G~aoXn>%7Syvj!a`jV0bzs7^0^&$X0;9 zJfF9P&PfhnrtK2-^g?TZLAEzFE^c8R$>)Zpuh8x&fCNUjH?jBo+&0A$(Nxgc@!x18 z$HuK2R2Xw)g*)w)uEJvbY=^6&pt59+E8kvWpD^BLwn#%jX}hnj-KSG%Hce#0X?GYY z%WH7gE>%V7EpfZ++;vg-k?A>^C^s=Puc_5*Kc8z=Au0v4b?em zc0s0WiTJTyB5$*@#%tdkwt?WS>J}_3w8p&v_`8beW5 z&NtN6C2o%_Gnt35F30ETBGCp`ZevTeXQk3v*@pe0h^nJ$>&s@^R4UNgv&M%-G&_in zYqi)^Y_@enaM0{gVWn;E7F(D^*^o?WVS#0Cv<;(|hlQa^&F7d_qk4`i@+s0fQ5qz_ z(W@*RCwd4J-^ElR_PQnQUS9=FX*NI$qip=tkeL@>EIFy$GiOEP$*s&QbuMs}RFo~S zWubF8q#h;zq)ErgKl%9hb65J@-mekm;`ZjYuMy4Zao0Dl_!<$*s*f|)tm7=WS;tv$ zvyQVO3tKRaX_rbSB>To7>X5cUVaqb5kt5qt^fppn-O}h=DJ_ulm0q74gR~`Txn1gc zuggW>c%Eu4!_IwNLPbG|dS9kjF)GTV`q20vMkOt3uA- ziZF4LGl+twHZ{SkbmcoLN-N7;!snJo499$jtH4p@bd*Vp z1lmeTBE8H}UQt@+FaqSmO+DmT!D$85kU7ILgABb9oKu=XDAM*O^d3{CP;1Rci-|%tCdn2rAFnZeLz&i?14U#+JqE0YUi)bhP+9E1j*FD2I?0CkLDmvK)cxBlRLQ zB4*)kd%e%?;jGwZ&N{MU=wYt5o+SWR^%iU7vsyA|qc{v6R2bG~_TO5pZ7v83MyFcl z%tE(1yU$l$+Yl^Ub&njO`I!x~&OOW1+AK>HPcbVEturJp#)-nkEhw{!*4Fao>ZYb( zIU}eH+>I?|?!{c-2!>R6s$0C(%CM+G0}B?jB_tQITB3&JwKg|5MvtU|kQKA-scC;j z0~S2$Kt0~|!|W+jCK>C81F(QNWrPq(zY*fO{{6%$zJB8Rv*Wp_DB|!hUi3T4zi^It z#0me`FG5a#Q)+m8D{p_KKs`TB3^4yG>2abz{*f9jg#++JreFOVAbH8pe=4T(F`T}j z^Z}soGX5R=^4LGOqK0)5r6!|V9>%JPX>MaI`S;?B98D~f4OM`am8t*77hjIq9F=n& zP8s@`2vBVsOCfq@@$Y3Cl*zwMdGG(fru6yVm=&Sfnz<3<8fMTwi{m)rz!xCH{8#DfUR^q<#?H}O_c)^vW@DS^= zjgM|@od<73m$}uQ5R>59e}ZwRF)0;%?wa<+!^@43w@w#g7x0&6A$ z+H=?T!>-ayAs!j8_|js?I}!9tCMX``H=4Y+5ZC~|>Dh`aR=H4Ki{|M|-cAHw4Zezr zeam|n!PjY?zT{P)Tx!wypPt;eytxS83!WV8x}`%gMJ>PSkXHhp>!(V#nC;+B1V5*F z6lZjKyCLt=93iGn?_1u52yWIqeaXv&yzhf=`$c`r`*@%bhrsiZL-Cyfh*rP5(2)L$ z*7$m{;yV`*tse~m{j^f(9b9xsMpSuwK%WAh3@5o__oK<^A7$X_(wd3=AX@q!1mA@f z*x6hq#fg&v(bD${=r_$5;_?NGkL@&?yb+MM9z2^CD!ybuGB5D@jkTUuZ)?3T1M>|xKW15|mS(*fnE83IJwIc@*vy4qPwhg(01mN=bHwztxC}Nl zs=Avmk25hSc|_TT8T^`{x$#QulE}cz@HV8tqtbXMQg@yhn3fBS7Zpxdp1r6j*Pb`W z_vt7Vz?NTHj5*Jbg?#zd@B~0bwT7TJh2#0>?iU{%UttNZiS^K zu44Peyc;jh5h-a}v*20v<+5Phb+cMMYIDCx2gBRUv2<;kdK#q8lKF79E_Zt>y>3r& z^@_&k_GXbR64RiEL}g(~g*Xv6y~v1bPCgSQPQv{|xG%y!%Y5v7DW8-rP6zE}Ji%F3 zng@#9T2qD=fOMkuCCc)0MJq1YkcnxJTcu$(keK!=R8a7 z^jhrv+I2w%oXg)?M2ndtng(z5&sgzE@wrV7=!3HK`?XZs`lZ_mYR0#l*`F+FXQ(zUVM5|>&7aVqKm0uUw6#x zIXV2s1+5nwX~aZCz5Y0&@>3l|n}KL+qeW|wADV=ud0CdLy2;0g!4%Iz{En|5KPN}0 zgE{vfqnvgxX1c*7T`Z z8ZBb=;>8~KVkmO#oC`jOHQI2@>}E-hLo|1^XsXF!KJISBcU!^dFh2{ABZB#)3lMQZ zw1{ezA@~F)$$1QnrsP40a0NySXJu76deJGk9feK^f4O~@!{y8?xuhzuKrd`iR zl((pPwU)~(bJ#0T7+Mh{85M;kjw%ciiD`AgQYm#(7ut(-*`R2KfMKhAOvuxzpA!(T zps)n=l01hj-;I;2~svJbj#54cKD8eD> zT+|$uyHxEPP-@l@#ZfY^ung*bUX~Pe9a5nhK)KfYT6c3eW3zGQsb<9c&Aivc+u6A1 zu;{8R$5u}}#*BF!)}0vX9LzrJ^d#0P>t8B+)-XPPjux#S8?OdrU)sa^z z?Gt-NMOk5PWrd?$hH@CwJtb@$<2XMYlFXWSxnM3Oru`Q3ED5ZVWgweKacO>KkwY-S z9Pr8uFTod3GQm5|yoV(i; zvz`izoux2@^Bv`RWra@I39^*PU8LA)C4HBXt!>)ub1c#{HoEcxh!JVHWodv{TZ7^> zklsZ6aHWR=rha1MGpae*`WSL4(rD<8qB5ghGKAtHl&I8y@eI*D*eAQ&HSD+OX%TIV zdWXfJ1x1zv8$Fwpwb56}uE2g}^rIpt%am>Veef1kmE_B8y^9-*8d65HY>=GO7CEIY zDDS_8;*xhzbu3LzJBpmL+tGNv0XbsPmm`6&^9-|I_GgYc!F0&6Ckat#a??I$^w$_Y zO3~9$?9ieOnJ(Q>W%r|+(nS-dr?L?Bxmcm$t*^MzTRTJMi<+WRwGwKoc%mx8Uf5qM-I;M%*4xODnVs<6MDz45S#bc*lZL<;1F_#T?UMrZA*f6hK#27F9?S zdn12P9W3p@|%u{Y@X_3^t(fWl{We+29 zdL(v1c{$`LnZ`o0j!|{6!CYu6kgMA|yTonKo}8XYKAJw^Em605Hsm6wOgGJj z9gx_!*qAZXzsSbF5GP^bjS!%zJZidX`6;j zm25g}s;%`taW9NI>-qn9^uVE>#XD~w`B2^scpk!2PY5Jx2a-ka;op6LJayPNMm|Hy3{*4~YJ>qq&6>R;RS@vR@FHe9>nVB(;6 zPzCEHeeyqk_snzdA=B@FBBx@>nM>{x;&+n1>&5x+ed*n@-0^wQi}znQ{=bAcH=c5a z4BIxX-whXD`R$6qy{oU-oh`&dNuRQ0*iY+9ZoMUA$JTMLUG^mO=Dm{sz+XluFRMQ1 ztA^|aBW)8O0__iyKIZbqJ3f7W=bf*<`ud>Px2<;yF%DIc8aF)eozr%`*!la!zYlu& z&u0}C39(wz<1hQ}U#@YUKk&q5&Oe>JJbfeH7E1ajGne0&bMIT@x7#)puess6uY@=q z%a^HfnbVy=dG5xdx6Xg|M=95ya@uIT;X(P|&L#cYoP}+AQ4rtlxQ#_Y*u{0N%e@&( z8-3n|Q^sa3Y;37*YOixI^g@fe>lPv$qg$(IY{PL&Xm4ihnrg56Yed$MU)qa`e)uKJW@m-iTDT3Zy_LtV{cE`r65 zd>m!p-Y8ET@s2&#vbUy1H!qYpKI&ZD5<5X5C1jPLT6c@@7^C)GU7ScAqabSpPex(<8ny= zodk8`RX0-*dQryLj+ilgJe~-lfH6`sC=(PVJ4ne^lqs4L^09I z555d4=kZg)d}M{@f%%g;$ddW{=W?LZYa~~`zv5fs1W}as25gDn!T&2<$>R6gmm~&Y zoPSNyxF3eTBvA<8iIP^VeMw>oe1j#eMf;KjhD@h-_d%J(ubkk4r@A$>G?dQ#! z@DslA`{&-3H8s}A-DAdnueQ1x@t04rYQWuBJOoQr6_()T2J8jzN^eWG56i?0J?$-Z zO-&QVk9Dtb3+qkBu=5(c!$yBA3+bv7g`z~{;}?Z0bSWJJzHJlXfSVUG=1p+J? zS)`u=zm4m1F&mW@bc{nDUPoYuDi;@=v&BB>YwyNkchj&19uC(ChY z!i!yw56kCOIlCPP>KI#ex%YIeN)hcR>~L)4#A9D_z>$Iqj1ygsjj+x|cd>u&9&&bU zOWAiqpwb^-xvr}cLER3&Gf=#7ZlE%;?8p#uboRCn*n1i(KHyk)-VrE*i}(W?^+%xC zA78v~TJc8jfW2(!t5>bZlvuP64ODJe{lO7F;EOn4Qoym{JUm?Z`t7@EhvP8CE)h#? z-NpCdK^w~gjzp*VuoN(Sb>zsAz4iDR{B-d>t3NNk1R_riRPLTuxo&wv$Ew{nugPTt z*Amfyc?%Ml%CyH9?+#7A$(s&dFs+{AbRaDz`Aa+w@w$p{*N+Z3Zr?Xr`}du>2?-Z3 z1l)U!g#8NqhJOqE6M6&12kN>8FET++O%H!V*x`Li9=> zc8-eIrEdX#xxpu0T!mk5g-Z~Oyixjc@NngO8opnEmM%2~3p*c|;kcF3j~n(vy7j2- zNvH~d@FR@#6+bQ`{0IXOjvzT$+yKu^!S@V7N12mwdpGc5GbGO3+^)`H@D{e{oyt%P zC#Cv>@!1lzvvr(=)}52~A!-1}LrQ;}^mA+(U7X;MTs3Vg@fF}y0k;Q>+R14fk;V*&XseNo zCxYY$iK~vyHH}z}jW?1m?t*~d;({aFJz(P^cVk@x@|ytK)U=fnave*tg^&<#ZX{L6t*GJdwz(}7*UGk`ssemn3i+}{N}8^|_! z4v^LP46cC~q?IpOT&;ac;vx9h^OD7*+Lt8$1HKm}?LW0Ii6tXPsASpmw&5;Gj@vIt zKIB)>mn0JK)UA?+JV{@YI2FDvl7{q3Uy`^DKBg*J{80On#4{#svq^i|r2WdI{g+95 z*Q6aZX@^Xj(W~(oIyQD)5*RQ#_K%Qi-m%k3T|zYd*CXKpnPv6`mGHHGeA}vwG{1BcOc% zo8?GXj2ptX-?~E`0aBA^kZ|Rc$4I%>)D^u~{!_eS~bJZie9EUnq9TM&R z_H8E*I#XXfKMFVw?K@%L5B8pco(Glu(Pb|nd0Mq*n!efaF#`!=E`D#4K34c0(#OJ5 zzW(rqn{Kp|M}Tf9QJQX4tmH)}5sMIhQJ4~C9P)6qd?XDX>Ed`IjvfE?sgNa@FXUqW zBvmLM5yinWi>lSArSUKeU=){uE;9)2F%ejbJ!FV-YSsXE-i8 zl#`$Lm+3md-b`5+KL<_K1%0Y6=t~m!;8)S^(>`gt%Q6|*vHQ^1E0cQ2n$Sm?JQl4? zoIcOjC>CjK9Iafcb-C2&@~GAL9MY-Eg+5g-^d$+FhN3;FeX?BUafaf{?^u;6d^0*$ zr3&AaO=wGE=}T1egP-r8)Y+xVU z>wPKegz@So9(%@3S)ns}ql;l!KqsJ5W+&hqtv2tK`8W|x(wG`5xZ2tVlg4p_ue8BO z(W=MDra=qKa7^1GT$Ip+iw+9K&*x&n$X^0%268Q+6?h4-4T$$S;tJsHKo4*e&R|5H*&A3z(qfa$4`jVvLSG3)@S2U=jxeXYIuEo?>8WnpGMAM^V z)nRe)5D$>NO`>86w7I+$HtAXbLJAl)HUBFym09XM0E|7Wr9+2fj16@@q zeX2_7Qzp5hvECF-8n%f$9EU&=n1K_d7AfplHB|WW0*>^-&nI@i?3;?J!_D=HYm-bR zfcuW#xGqP!ML!Jf_!IQQP*kxDI=t^uifca&HmFn~iGj+)lI1WSdZifXhce&JXF^*g z28vS=+?58qlMN&|FCWfyX-89&1(vSw!%fD&gFZQ|-z)PJpJgEI4-t(4-^o|CdX{2u ztZWYy9_fy!J)EiALpz#Q8#DpVH>NTua7dQy_KL#>64*>B+sCW=K3-}O_ zrrghfY_yL6tAURKYk`jg8-Y&&J;0}dR{@^^a^QFlxEA<4@VmfX;P-(q09g;)fNZc2 z;!+KkKGk69OOh#9G?G#-pp<937Y#UBi-QD3i1CFti>S9$D^r@<#FGLe=i<+7f6CjriXWQIxz_Fc1Pz1?L!51b*{tB5*t=YyKjfjTqu=GmOUhu z1tgDUu8LLCsU4f86yJG)9(uZZitrogD@h~ z>L21LkYej?RS;z`(&zcOQT^(8DKn=O+#A>MVe7N9TIYuy1gnoBob1ab41br+0R9wMoPAPAOdTK$as?2T@jaFwui;lv8{hsCyfb= zFI#r^kC*}i_eNP9ZXiJ)GjNQrKF4?+u>%<~X#g|MQBhQ8LBipJGFGV%% zuFf{b?&fcNcOuFozWb2$AC|vZ&_TZDlc$F~(|YJfF?JG-*zyUAK`trj@T8s277!xiDIvjP3XOUPqN;># zdB0zvhi$IA|Mgv+SHlyKMHb&p|5Dj-(gQMAT`8$Xq8QfIy#l|_QtvO_DgyFuM}I8b z3cn<>op+LDM}Ikbgg-C;`oyC>uqgGPdg4-9^yz^fStt2Pa)??gJ4bq;TM^?DRSEi# z(0EybAq-s=aVf{pdt`@{MZPzMIkqY|smeHclpeD^DSbKN&1YzWeD-O)BYmoj<-KRLrTE<_X@2~E2Uof@Ayg=r={Dj@;9C!|LHhVkLWTYa zJ{4NgPc3Goi(kM;OEF!%0v{KC(#0P5u9Loucq8r__@0%tM6~6N@FfT@e4Nsxi*@iZ zwF%;<@NwpvF1{RKNIn7fk&^rq`0kQ?lVLFYQ2OfOQ?w1H?*%jTBlvzH7(PZQG-hn6dlFsw}6~#@+}}< zPa0zIRSk}(ioU?j)e9PYme+Q2^@3^tPY7shYQtYT^Fmy58aw7NTrDPrEuECw8ca## zbcQ2V1`0(lmZu;ZwY-cb-`(xP9rx%rwy60J`x--A)#^GUtk=55gcETzJ*3`9ZHDR&X)t$_X%%+ zZ4R3)8)$MG$3d$61`p1jmsQWPjJau1e+x$n;M;=*i~?u8QGG+*n)jdR`${~R{2O&U zRs5Hy{jnbz28ay&GCV;g!i;|}x*^>r^aF-ZL|34DR^Qj@dn5eDu=_0*e))!%6Qe2U zYldSV+liYxT%$D|Y4x+;;qspaL>rf{F-`?$;{J4C9`FocEiePv1Uwh`9UuzIe*BaE5|{+M8aNnu4e$b>AO9x+JAqX|Xl%b5 zh_dou0So|d0Imbx285RP-w8w+`X2?}2>dzlCg87tcLGzo z;3^55fxCcD06zk52mS&04)Bk_1HeB42MkpE3Qh+e!2L|%UxE2Rv?+fH@G!6i z_!ZC#?1y#U+ktqg<-ZGf3h))+X~16tF95y`90BAQgf=J_0#Gh`A%H%$5I|p&e3iRh z((b}9eMwx3WJ!V#i;&WnB%U&9&ziJ-ChgBAjR)PRxJOJ{GFpJ5v5l$co?+6?F=?Yr z+BlOo&7{pVX>&|ksY$!kq`6GmQj^wd(ylUT*P66|N&B8jyT_#6XVT>BJIg|N$F{`F zUPwVfU5_jJ;^q*9&`~$j(TIRNfi^2wy3s*#oWSfffaw^AJSXFN&daa@iiOlCT1c^pf)doki&7N5HU7oR;G7u`u%g_danGCk>fRr-7ItCc1C zRD+@~iCt7E8ak)+>6N8dq1V{P)XEap0tRdXrK>X=1C_CPp_@0Ha+`bWx;m$T)Ulbr zqJ7|m-o3v?y9!8Zmz=xr=$y_lIJF=(omTN4-eXJ0v)mY0-_=9nj?NYMwIQHeMsZ?$ zUAN>8^w=OG#D?~r(6O0vZ9YD;hR^IKQ^yutm-HAbQa!Y6%*BBna#@3$=Qi!egX+8F zbpIKVL4WrpV0{*uW{NI`e-js@z(d;sNx|=2y`Uw9sxm&}SxfZ3EZeTim*n#Q{4U3s(cQ! z4Q4wu5xQ(f$Q0n!zD@yz>Bn~Q$=VVUi4tl?dtIK5-b{I24) z-95~I8R|quRK*>#BoSICuQ9evTt}}>HH9TZ@!aAMgL$k>@7OxDtMbDg4%r~EbQwtO zD&8M(_V21Z5Ga8EV8EHuRe8v05knchkLEDc*MCCqzIjGl7^>QWPCE(^<&+vVesVz8 zFV?N31k8C^tnroUs>Ik8P!^UM8ot6!0_}BN33&fuY`XEnr)FFjEA`yw_a-eLV(!9S zg18bs#kU5&WJ&9WZ!LW3;$`^mlC;C{DLy;exT0MFpQ1fy(hi%xG0+DXUt=gd9<;}v z4pk#v_^gRxwlIaqI8-jQJT?Uto;oLrZ%*`ItTO+ivz$OtQWO_9fr`2xh!!&y;%uZ6 zfASiJJt<5wH$%4NK*<91PgP+I5p;2!3- zE)rvN5G*X|40D^i4C##f9bxw~`-O&cw5K!pzp&gJn~jVq0{K{%i-1|UHfY(`#jC*s zCvZJ*Bal|a-M|-t`2116 z9sdasmX*MWEv@tWfdXlG0GI;&DR3wdhdla+1M!KZe?IVGpbH4g)sHvt;&I?=;1fXR z;Yr|+flmQxtv>^N8~AhJ`@qe>1HfMZ<551nz(K$*Kn$2-EAR~93&7#P?Z7f14*T;j z0R9r#0DKj=0tk!QzZ&=&kO!>34*U`D*T7!^-vqt^d<#fx{MX!mGevbfKrJz>(QuoT}mlg6<~(cUs?J5Ab$ zCT)*NJ804lnY0w-NTr1{ASF+}*3Jkx&g^)pzufbfjh*{}K}fskD$ee%+>Nn&1a$9k zj29X3AA)}<{ORy>$9swzM=G=NGKdP?XTEaG6uy(Wf1x@Gfl zXuH+ej)%K=nRNmX_cv@JyU; zAjECB5;)lsPvT0Ki)1%T+E4JSR5Y!pTO|$JCSq|46B3buD-#zT)ocQgyr1HlfuggA zsaeJ$54+4$5o(r4QM>gvaQ+QIEYqkrpc!C~;;?6iuf-D)#5bT#ZT7Y{9Jhe4japmy zC(Lo!hf=cKQPb4Mzff1*Qdfj8dvVT+Qnozirm0Oo(>!I$ix1n?DwPUXf5Xlad^&=M z;;~$WsVQt}z@am~0?5Yq#hBSB7SS+XQw)=kwI1wnn+q za{#xmLCLsp2s_$jt{>(D7dm`c&W*!0Ev2fENL8 z1kM0{A7}^O4$KAq4Cnw-CCmc$0tA0`^U1Qz5jU(p|j2t9bO1RM?`G`z=agG!)SY zXq4elN*VB<+3|9J+z!R9wi_!`;KzqPQcrQ-K?Ok7RD5_zTzBPRgpLj*D)SZ!DKAi& z4N@j#jSkFBG!@k-Dk?Incie%>(Sd$iZAs4l`nx6QuxVOX4GIb9cI=<(7|l&SqXTK0 znGy^7N9r>wVWrP5WFg>6m!B6X&9(vek4xH*@vC&)WAL$#6Qmibd^>TkwB3F)6pJ95 zk6P_-xY$Pxmk5=bj+{4AThE}^r-y2%(5q&>PYdI_wN@v{vR^L1TMPw`zx*Z0gzhh_dqtGKLSq&?g3^1_X62|_XBHy ze+M=KKL@q~{{f`-!*aX-0YDs(+OHq*1zH2?@*L7I3$!YluBF)-RLCK! zmm;V-|K+OpFK92ls?o^bXqxvNXf}@U8Ct{PWsuao=K-mC&j)4zF91^Wjs(^Kvw_sS zQ-IXGIY4UOnLuh@8<3jU4y5MI1yb`mfYiLRfYiK&Kx*ELfz-TnfYiLjKx*C+AT=*- zAfen zw0^y*_*C1ZbA<7QwEUW>J-Okb^YN86t#lEPza3i> z@!|*bYPni?*ql`-H~cKfi6y&KQ=m`?<*|#!KoKptl<{H!;9H0!bSHHS|7{l55RMPe*~Tf{1Y$}_%U!g z@DpGu@KYem^shkXeG@L#YUxw0mOf00P%Dadw)SC4WYX}Vv<$@&9wu#uNvkkv^G%v; zwJ9AJK{yKXY{P>CY4}b~?Bf?O48l_MzWF<_zRPm~@DA5;(AmJ7J^axJ0QgQ=z3L!e zad^49Ju*;yNS(E!TKei78FZo&!f0TUZ{N8l{Q`^cL|h3l{EVhN&ZM!h_^LGl>&f_d z2v@o+bk*eRaj$%A3d$F)$#Y$Z#cR0mCf|vGX<<#CaaffMdp5kuhy9^U+1#xUKpexN zxpVb^tuP*GYg=Z%%sU9uFtF+Od#aVmeGz^mGLY$5go|@6=92F3Xf90K7eMCvAHXrd zuYi+*M}P&uILzRyfc=16s~7;R17g>l{K#q`@M_#+3tT^)ABv8+Go+gs^{DIJ?NU2xADAX5I!vF>fVo=02Ut``h(KldBDo5 zX!6^Jxw749z1q1OTpgSFi-UqzOAn)axNbQYx>+)-*gc2vCevIAU9vFr5!f&Pp_Ij6 z;Y$m2%UgasL(jg8mgIEzFinPphzKe^zYviTQo6gzuA>hQ^hkN!s!mTpGO4d1Tc1UW z)jod)4Sqg7uH%ad?d9@)&6eHR^ARMEZ=Wv7Z|t^G$F`p@sr)8eir?NpX;NtP?fv7j z_YK(Fj>e|*VJVusbquk^Ph%oxIIQ%DX$s>+J3( z0RtcY^_RbhLcwL-oh*8+D5rMz4qij`B^yL{H|t;3XP}2N%*Ep|SUgrz^!?%I(-pZXx$cB+H`Q*MDC>9wBAj9+84R zU~G?IA7(F2=Y~pdN`$W(zZ|y`#A5uem%i`fmx?4oo^R3(U%E6Qz9)U}<5&6aN18DP zf{*Qk^S^ZQEBMqicALH|G;^gJFM{tW$>)UcW*PS~_-H^S2%0a-$GMeS=e{1k9vONc ze78v7lP2F*)Au2KvA0`%f>3sNL-kRwV*E7U0}ep=MPYiCame!?@aN%rRlkj!*I2Fo z=9F6h<|CrGu)P*MJSq`v!*JCtR~s9g*jzyyfC-Fz3C0SF`Vx!_z-+niAfetX9XPX) zDx96s_&^_P!d#SK+tu&F_!u^N6-U2t#F&H^W?*8XTJXiL6vWog)7jM@N0NfrgZPJB zyrE}Su~PZY9*#B>Tc*k${+wBRlMk=T)WKD5$pZTWB52*5rs9~d+qe`;XW00hjMEtl z&3ylFy=X<197;4m;$^FI2Cw1&6W-$N$tQIodWq_Hd% zAN7-Z20sl@w0BL~`zGyUlg9E=d|#ThIHX2Iq(fDn4x!83DEl*>!Z- zCQ=@46M6!YDZ(~kP!!uFNVeK0L28I?LUO2Wq9_*IMCQX%G@bkLJ!P0}vJGOwY!g37 zM)pyAyj8Xdd10H75N4ZDFl-ZP`)J$bMO1*cO<4biZ9*BLwuzK#*d{VLhHdf^c}?47 zWuTJ;S7^H7B=WZNNCVxVJ8bSS=gK` zCJXz5ieoidsIrD3{ieynP7!9Zuw(J>Fol^cFCd!5WMLbnq`KuXOqK%>VKrHdWyycm zWVsHNMQ4~WJ^J1-VGNVSFk!4F3)91`j&wAUEG7)jNHQJU#Uk8|!d0i~_;OU5FjoR; z!dwNM0K6JV69(TINfYK;AWaxQkS5G(AWfL-fb2=@fHYycfiz*h2c!wJ9!L}BMj%a? zn}9T7ZU)kXxfMtg<~ATrm>&RX!rTqyuzo*~!}fzfnlKLmX~O&r$RYU=Agk|jAWfL3 zfiz(@0cpZK1EdM_ERZJ5W*|+NUjWwudx1XyZUx>8d;v%k=0zY)nC(ECE-wLTviuUb z8~7@aANRcm+zb3Qkp1mVAp7bQxRfbFpE70WQ>KiftwQ=0?GEir7Rl)}#Ya;{(cU#_@0&E5GK!Dorue=zX*6XNji!v^qbZ|kG-VWxri`M|luW^Q)8g)cSxt5d|q?8uy(ExeUH28F^ylZWUQ3 ze6I^39h+sM+fQnE7xOk_oZXv_xnaYK1i8x8vjURgL^dZnn zsRUx19Obk^4l=k0fhdNz0ZZQ)(Vd@)qgxn#^=AGiBBjg7&8o&nNZlmP?e3vue)A8& zRy$)`otDhu3I)F(fx6(&(uWe9sB#^@W=IiE2I%Ts50-r+@p#Gmxh&^1^vMJ#;Hummrwry>t;%hb8SCJiZ=%w|T%T<-g&@;Hw#b5Ee0at<;gi=$>OGWT)l(Y?| z?-SG4f##+{^-^s|tM@0={36>M4O=1ZdhJ_!N0=#WVrpNPDcpcdM?-V`IIOw%!D&uWyM3b z`P#`i5Fz~V11>lX!=?5`bH#|Q^juJyt7{u3jL&WKA))x5UQ_YcG8B>49aXSAVZl7< zoNZtuRtk9-I)$-27{VrHQy3G%o-O0)w_n!p_;1Ifb8*4(a~=)>#SPTI-4XcaMn&^xp0B#Js-ye3rx?dx9=K)6n z#{x$KrvNdE`*VTgft<`v04@Pe1+D<*0M`Jg0dE3M2i^s=0q+Jv`THLO<^s0@@qGWU zfw0B=?*Xy6;r~5w4sbsZOB~WJECzms`*I-dLD+15zA40;Z9m@=Vk3?}8wl&cUje)n zcqy05PL`^;mOa(p%JOlVVFbDVxAhz#|t-w6sHsBoKi@-7AX+Y|zCvhpel|E&+ z(w8LaQEG~|MEjD&4JM7}>MOqOCXMBbX?f2n@|`+oyq$udc#3D-oGF;)8t?+3;EYQn2zC^UI-HJ=Kz_u zA|PAJk8r7$LZ50W^d-prRlJ#HFCD9R`El3rcvjJ|)^XN1TgU9t;Z@An zSk@~31Zxzm;y(jf#eW4B0uKUN#rNV;RZO3%V)|4SD;ld<(Nr(qgK+G&Nk=b5x5NT= zM0f7khQLGSHXWXE%)`axU-n9u+J=oMdW~`=ihYZzqYLk}n?V~F)@d1sxnyblEDb-> z#hG39U)^D87_%QnbWUn79}?q=?3@KUl?0}ros)T>pKjzpRdZv2%+gpOt+{c)iNH)C z^P2@^Sv`PD)g*nYCh3Eohh#%ye8QPtu=`oKkws#%u;_KYjOaPHJJcpO%4RICVxynPr8ymRgB!;w7aj1eAbDQhwtVL^)V(k#kyv92)%baXjCUzWJ$V9Ez;>GbPWi z1bKEL{NxR*FG9`*lBe%{jgUOnd|ePBhb<>QZV`S_t>R}r zbAJ$-uaT1HL1fn`p9>@8jFLQE_@$2evb`M-4=*3;@%Xp`kd1mD6(MJgOc9@E~vW-_n_KR%Ea}d8AUFar6$e}e8AIJF> zvL-&yIRynqpS3;HiinS+wQH2~#0WW)B~RaS&{e|ZOpcH zwce*j$eDHwa`=?c_A|}Qp&en$WyqA^&$$@{L5i!{-CT>mgA(K+1%DFVN->T(lr%%m zWtu}sIlNgMK|y6|C!Ym5P1xZPeUox z=A9ut)XSk1jtbYAJh&0(;aRmnjz|e&>yS z_-So}yACU-YFoa|Hle^SX11AkPJ5**-%(LoS>|%gcen~1MNUVV%?6&Cu1ebiyVE|u z&~^#$=HYHWZgJ;YUhBn)T`sS{V!Q{c+3-o)Os$G-GJ5`8dwv1qxEh<=T&~$}pXCIt zdDWiA>Y66E-Ig`JZ;mPpM_yB_*R4+OvSnMM@%5_1<7xHSG7W0E+ZUvoyj9hWJ`_oL zW6RpR{ zC@b{bE?c&l*pPrKOF(Ix+xSc1mSULK=<&5zH_5+2>sVn!2hnA$1CR-xS|2TFZoAvF z5&>D0j5uZZ%iKEG#qMUDUS^S3g@e+J%vl5bdLJ`$=5Uv5S*^$CT2_rlQcVvIT&rK{ zs>aEgJUz|jTiNEe&CPXHv7yYL&nBYZ?O^?-xwXZ*;*7A+^=DUbH5!fcSf7<2`%%W) zwtSLtgO?eu;45XfquxXk{MsShab=TWIzm)EKm0L19UG zg}o%t;d0q*P-`G%0V`dF#rD|_S4jnQp*`PGR&KMg(pVu;{;D+Flhf{y@f~x>82t0O z44V^1!=H~0lB4~(QHEaZWP_2-VP@E$0AX-}N^MvMz|Uvd(1+Z$?dY*9UC{isOI@|C ztxFr-QvJAB)VkYzt_FGNp(k4mua|!tWcUQC0k6BkM_oMpn=ZPr*R8ghSr|?F&>c40 zR9m)djvX}|9GJ=+dXSS?7QUE|xqltUUmpotiI}ylvpy51vP6 zQCi>fUIWiz%@<1^^P4&wf4T%0U99v`Rehm(BqM&JmEQr-M;74A(L%*F01&PG*zAfl zkK&9iuM2!DFYa6383_KV<~f?Y?cjTAPT%qZ2;Ku8Z;|5b4~UlEI<&tZfaeI;^WX;J zik9E)pgT&ijH}niV%5iUkarGv-f>b|?EdjM!UjP}_fk>A#gexX^4ReqfE51Nn9ZWbuM zSoOiza6bpnj)jUZ84#^LhC$v$D4D9u6(7qbTKd+4uM0eBixl4pfN1hKv@HeCow(=_ zEvh`en!0}xJ{YeiSM2(wyi;o=i}@2ReHoB92YgFw6hri z+=o9!cBSIG01&NzP+xs^6~?%$6<;iUbq~__Ja}rZQGBu5%eN4`0X$D@K17R}zC)mI z0nann_AT!#2-pXny{i>pEO`eJ@K^Bsu|x5(T%zUoLeTAN6p!&6t^9T(a0&QwI~7-~ z{EkJi4?I88e6i9;{rn(!4qd0@#Y*252rm1M;xT@srSB!kdjWibuD<1+i{OtmPhavr zL}0@8IG76;U99{j;JIf8@YTk;AYZifv42#6XY_X!U##{#48ga7=Q+)XXi?h>^}%-V zJo`N*FIM_aM(}>{9MOES*yWp|D<(-M(1)8TXdDMUH;QO2k2`*Op*fmByAz93yXytb` z+sfq-b`cQfcd&0`3RCT}C;B|i;Yc9Y^_y+xBp{Wstl{K-FDbchzUeh-5_ z9z0{8C0FeHrb56X@U;D0@g)MHrSAavdcpI^X2ln){P^4t!1LboiVwp?RC&FScls}| zJG)o$#p=H-j)E=t*{b+r$>aDj9Xz{VP<*ki(O$a~Jny`y_+sVv zP6Q9yu6T^!XyvyX@*V`=x|jNvcOinG*F1g6qkZ*9@SXb0zU4iA66W#bc~|kx0YppR zbm*Z^eup{S$BJ(PAX@u75A+d##tFx`=#Y%4@)jYW3Or9AkZdvS7pN-nC3x=tRPn{f zkhcr+c7W&Zzbd|1^;<%D;F&{(4i_tZZ1JLz+*+u@>%C6Aj3+~E2A3&j^p-ed%i z`UmVVTy(MIIU#Quc(${{!^M)vc610lqrQ}EG3BxRW`f82mEwyfuN%Slf@l1ZAYZih z%=O7S@H{A6fEov*wdYX~lMojtvT)JG$}iiC13Z=e6kn|L&47&WfagUEU$pd5-e=$$ z*uQUitdFVSY14eM(w7f0Yryl;fWGCi{e1zR3u$P<#gfPI{37sFVhx?n$S)Sy$IY@A z78TAaE-Wv$SL7As40Gj`Rk+G4@(W8{h2^ELs=|DStK8|xE1Xq`7cm!Q4$J5d3GCpv z;JQS_r2#}<&O*F*TI{KA&fuTW_GXM&F=f()3yT|TJ+0o>dS3=!!^-#I3)LGVZ-!$< zo5$_-W=t5HxzOvWUD#T)WbFJYlNL5M<8!dFxWgZ2o}Lz$!PS_P@r0W%k25hSc0}2Q z8T^v0x$#Q870kdXENytaN2c$IRBS5{1JiPm!gx{PbmiHLigN9Fb6n1{!qT$BiUqF1 zl6m$byv)eJw`mXZDblGV=Hz%?o|^ntFJCKTXWGEDVhHLd@=D8G^H3Cpr6sOn`^CH) zkIg9q(`L!%I9r#yJ(XU!r?`4WV{>~m_WUKLwL@-YVMzr(;Z02IMY>#b^7+yPo8l7F z9>RSQUN`0A{Yv?yY;4?1OnV75r+N#PUs|qTgW)|TX^j!&yoPFz7dtf)(=sE%DjM2bmU?Ac&Ws3D zX_0?MD;2RHw`LqKaT3#B#Q+z4W!;1i$Xt!61vkD=bGOvGr`O`i8MXM<(3de%;SAJF zVjBO7qVcAx+>uwox+!y@rt)QJ=A&j*Va_Tn;sy)8RFoOmg(T==wpZ9)`GtsucU%i( zMX}aA-o`84E+2MCCZ^p4F-)DS+J~3WHSIpPHz&uvjPKFCt?iy#xA}+8#8j}aJ7)Hr z9DYKHHtcq}F&RiqyZ$($@)bU!%|NuZ(W0qy5<}9wEX!5hAgb_2R`I_hM{a;(i*Vk;octIA(UUB*)=Ok_#vD#ufSd=b?}qmbNQ+lYb`7}W|1b}b)QUrXtN?`DKvkP-RX4X-; zqRYkIH%;>USXWyszLs`-ycr{B$U)&;q_&DGiW+PK9%j|*j*@wWWzb^tvZS864i8d# z%201wi81bNNSfXtk3VPQp5vCQvfNSTvO{yu^8!GbI%Tl_hgr`Oupa#!G$4BE?Q4s%`v9t;95*8EdU+RP?DJ z^Uvf)3~d}GGf*J83o0CPoVy;G(j#DDv9lCLN$vtyiM`l?t&fRmEW70>PH1M9zvOr!`R_DIn&!)TJX0*>&8&=k7=KQBLouD?meCu;WE54WPw~^wlH1s`Hu3u zvO*`uWm)py#WQ4|Hq1F=7m;ikX>6_K1!yq%x=Ix``js}=WDDjQEvjmQ8;nraw2l^7 z+EHFnnPDkVld#nq^&Pax7{Y^GblVGy!zV@TWs;gIo*`N<_+$^i2G#6})+%Y%u}HL_ z$TCR>1G}El)ry={wX_x2QKrgjSRbMu;71unPSqNC&($b-2OE@a_y(krLq0K-n;fRJqXwvLt;dNw>$- z(hBuNiC5qr!yLvM-f;rulzNWVzmIif8CF=jG6lLxDHS9ugsNAUONde#gDBTT4+}4o z_N*CFRfAg;K*?7YRY+UC6@*Z2Yw2_>BcxKQP~<;cwHG<_*x;Boa{!hD9E%~hw6sWS z{b;=o6S~ASo-U$?T~~2wzC)&m2Tp_xo^>#)Ty5<&_%p>a102-wVA=9G0#J+UvI$e8 zvcGLYupaY}g9(W6EDOxs9UD2-SkAeI%V*3s)R27}hDuH$bC53XCk*qyX?5UKbhT(yr^)t5SFtsu7{}=7BscE5o}T8EZLt!vYxO*7E{J{ z;A(8G!3**8aGQ&yMHmgTx(r1q`$HSjE42Wt{R9e)W*!PIc0PiI8vGZjaW9NI>-qn9 z^uVE>#XD~w`B2^s{M(GAPdoJbm{%76@uTN6#|+Hga1|2dm-Jt*N?4q5*DZfqaO)#$ z9(d%n`FL|G>0@r3zWIYWoBnd@S0~*2+0HI3O{e1lsc{qLci;EzciwpK`MPV?`k?yPc71&7N2v|ht~i)D=pB^K9g;rz8vDVw|M2;Y`%Zh}&#w==6R#L}0BUO7 z_j}LY^I`89>ldAM)5IxL_F<(HhjxK}@6GjPPxSxz-OYEOf8@3eYwyOn9Fo54#rf}j z>D{v2@p;jU_g^>uzwmZk(uWM&Hm%a$1>`CaBa!G&SFQb!}RiE=!L-vA^wuujcwn5UzT;6!cr_b-a^VL^hAN2aR^-e6B zOZxD#Bms%K}SVH8xgM{f_UMk0y2uqC?Mk%aex`*CX938 zqM`>6qa2S@P*8T2yrh|yWnO~FQmA3SQ}1M5FE;gw^bxu@ioLk=6rj56u` zB@M0395J=t4~ET(4TjNPtzEddv0~nwrpBqm1`U}yXTi+*&9!w?8<8}1wNo*t(pcCq zX!d{XL-TcVJ!5)f-A8cjKYwlWoZ8yDSs&7aA%mmf4;egY@Sq`sPdOEw+DwOM>db|7 zPU-k8W)})Q?(V(3E*c+XEYOV)*48yKmeN>Jmo+}<#sz2A*MF46shx4Hh99~QNSD0X zYur94N*~^*FqPOx$zG5DM%ZFL+J>MH>1Q5ZB$m_X&$)KNNASV%;)13R>2$A&JyU&) z59v|B4OhTlo zv6g_=(<$f=b1MKdE=uxL6Wq!Gvcrwp#>UpJ$^;!I#p zeTCjntr$=-%?Qv%a4(JSWf-PsR(xcK75z^cYMu@~?evP1%xg%eI@0NbJqhV-a|2Xc zLC;`9@B64Xe~Z49r&qv~sp*Ps<@4O&;DaZ9a@#lNfBJ!OU;6%Y&mVK{&<7Cx|HrwG z`EzF2JcpNagX(K%1n<1f3V(?`?O5o7d=7QM$DcVM_|ASmKI*B02|qsS#1lChX;Qjs z54X#;1qIJ+{WoV^wT)4fIOl3l+t?D*VVK-Xm1i$lSiUWM!OpEZJJw8OZBO_je-uUY z=T=Jvy~s|X(Rq@@B2_QYF&kBZ}VKwGb-z7CApEE zJ9(}nXPol4Oph4hCNx5%A9i3_{0pIdkmCk*caRRe8cN%&Y4)5(W^STW=aMn2`eqFe zQ|8ePaXNld;W!X11Ixj~!Gl4?@lbFG*ay@c;o+d>;yFUouH`%eoWVOAp6y2B3h*Z0 z`+;fjXi%9{OUua}qa>X>MoGG2JGR`>p7QqW^g5sGy7;Zgvf5?3PB|+{k1v6g+8mx+ zxF@sUcHAl}(_;%Wm1X2yW>Q(Y%w^i<61qVwqv3P;&&HaBsgl>Y3CzyGC!w92m4R}j zgi~V7=`I6p`Y6mrH<#3XR_e6EFe_`qtkiu{iurL6>TQ;bIJnab`$1k{o-+T&2#`Cv zP(vN{3&zyeHaIqT2U`<)LZxum@F?u#c%(M;a7>`HP$eEVf`@^dKz(I1cqaHPI3Cm) zsY)yDbat64oy%0|iUZojX4)&zJiDWH7UeKgIdxL`)mfyijBPHm%*ZZfn(y5Vi34X^ZaSGNASM^bRG3aOxUcED7mwFsZeNl;RCdO- zK%1DAadNXS&rF`ny34rE`Q9-5Iw>DA6HCH!789BEd^1!EM-5Leo?0HMxnzLCHV;%9 z%?Bki7l8f2h2S9YdTD(onj`otb z*Cj(oyL^m_(a@ifle3V1qIBk>%h~SpN#gxK%_q50T8!YiYVY}^x$v&}WV7Sl%foop zc4(e_n#eaprEt{nC@kZ6q&`Wy>U|Zcpy@QdkAa*co;(`-G1}?ddkr>8s%tV-d63| zj$3OS3hg>#NrXAr%-^DrOx#;pYQQ}E_9(eg93^8HbeBgXM%?V$h96SEWwi-a0ZAr> zO5d#EQCJ7^NF7U)P2o5WRN8VXm{mY0fJ(zUV(n^u>0BC0=bCbk_LR359z?7rd}k`A zmJ|ie`$;_EjO3&(HzH^{LantT9V}hFJG`8Q#vBcQvm{|=Ng8Vn(jZr3R_D`~TfELN zovdXyA8Me5O$W4AYP1+rcHic?fu}O7)YL$eovA$2y2}yQeDJvvwIAZ2!gZ)(O}wc6 z(0RAO?9dumh=+tVSZ-J6%kAZ4ZdkAPJ_$|+p91CA z)1Y#43aRCCQaYED(iI2my=kvtqu2SI?C&~bsbN9WP>HhM>FS-C%AMf_-=%X4xYc_* zZn*P%hb{--A$^yuzM&{+I$L=?p3L5!sotKh-j!OmD`+a6o5)n{@{Zq-<2TH)8XiTV zH)9lVW0@N&f~Jp~KNab!ZJFwAU6^Kcg?Eu!+E@0f_hiO$l=;?7)zr@CGQnHTE^s5R`1{Cvuiea@zP1MtdD;-^aPA$eO9|kS$}!VrovIf zqtZ2jN9r!JLSg$Hcp%8-aLMDqFMvZp=0=ig?tK}&7`z))JiY=dKr^B&l+IQsqKXwM?v0hepDBwUN2}mAm&NxIoV! zxt-s4n&}FmW!EW-p^2_XD!V1N8rsyXQZF~EU9ac4^220(%_2@!TG&ugTQ|S1Nh^PA z>lm_b7VWsbGy>wSvn(z!c9nc{B~3b)P11E{NtlwAWKBU+@7X0pljMyjxl2qng;edA z2S=gnKDop_drPj{F`t~3Tymr2l5kFUms}%8)Nnx9d=||99}=l+OG%upy;3fTq;p9m zU3W=zz}%8<(?`{6xt*fYefp@=xVQAlV18*<`pAva=Xjpmx=SC|MENhIQP(z$(&*|a zjihsFBwhDu)W6#_l6e2WrqOD`lwIWFX{5EEPUV%hT0H(=;ijxQ*NU7P7mlB#b7>`= zODl#g(}<_4vQ&FPn*U{cfj;)d$NQT@R+}B*C|@VNsCY#VE}@ zoR?(p3Zi>oVDII;-$oDenrmk9KD@Uz$vn+k$MQgzmb%oF&ZVAo#Wt7WXn*kb!W1nj z{bprZqOvGmSwzCBp-^3xdb1$Szf0cAq5+IS%2esRx8yw&ulJU`+AEoTvry>f49r?` zlebfl|9_skN5)e36hb2b1@VeJo@-ldv+Fp>ZEa5iH z1pief@4bBVru;J`8g`KqV@QcN6QB}Qyt#;HXrR@(ol0(GM+4E9L?%(G9ius0tN%Kk z#C59wN<1(2!(ck?+s;8*t+nxySDPr_CDwOqcoepQJW?mnwozD4^lh90pu)v&Uu*N+ z93`G~F7c!*4%88LwDn$RiO1bMuGyLy4_ngXrFT-MHjQh%aKF-+G9#9EC6=d_6}{hd zma{*ya`&R4To_5MygPQ4WNP>OcE6+br^lBK@P?u1;k}R64myHBEg_)gfw*F+>8?U| zHoBhHCvGsB5+hsSs5(-H%1kP|;j8w3w!o1aH7+&gdvk84hSOe_xst{IL4P``zjX&< zD1m0%ZlFF;boq<;V1W+k6xF6kByH4qm0IM>gBYUTDDF>TuHos$Q_CZTbhAb>Q-#(@ z?g<_TeP3`C$W3oH=35M^pVSMKTiQ@|+us3Tl6RKyCY2T}JU2#aB(+^Bl+H1dbj8+7 zbhK^QceGtz*URQx9E~xn)DG7tDvEkQsf`JG=&%W`=tR}-kmD$~5ciB6Q?h7(B%`j= zqa1GRxG`%AZG7RZOm)eubZ=dJi-XLh5^fBm17Dch)Wfw0)0NhTUsj0oQO2Hysf|5M zvSPh3p&r?u^hEW=GLxvy+$(aI*Rt@H`MM%ia3$0NjE@=THKNm|$o%7M+QBU8rAI28 z2Y&-Cn+N4aJh+i(UUxj`XYTB@Q%-fPxct>KaSJ!7AW z@9Ut1+aEyj>K{P~zCVFuz(0eP;G5t?P&Xc`gZLJx(J@ZiH=fnahbwr02V4c}=0i=s z{T=)U_%65s+zoC7brYiU=XP?@@wRl1x1}o%`tt8+6<+6sWG)|5;d~GumqdI#n>xyI zn5KfWST~n%hdaLgh)i1)W7?TSw|l023{xeDa#t#wXyoMf^KjiPvS- z-iWV>MI$GbG*0TmY8u;2Z7P7D(ihmE!}zk)CJi^HFR(QUMUP#=KktGxJPl_)k_+q2(Sm_?jvM0smMyw>ss=aznMGY%g2ZwV(T?AnGmC%jD zxB!gifx=4Is$8qZyWyiwIW{}yt-@Ht6CeHlGTEhY-whrLt^?)$J>U@VUT`#cA9x{n zKPW#R0Ivrh1QqA6fy#EqD1Ej|=dxWoZt?P_y@Kst*CpFK>s2o*R%?k7nVDF%6Ad?g zOX#fL5hrRYu(#yPt+GOwL^-`&dJ*A+JER}EQtOizmCQXLyr;b5U^rzmO}x(WOd8y} z!w-&7EqMzeF1OL7vFLgRlFTEGMtRL?v#Cx{F6xoW7CovzviU`Blgq_cU{~j?=`3pF(M?+=a`)U*p(Txl?bM z%59mIYJej{I#?#PJ42IecWT-0pmfEdctwjZGpV9;fV*l>>y!ezzv4Is^%6A6G~}>5 zwX`s3Iv7uJ14HggZN}2BcGcpkWjllBqr`IK`_jqSof%sZHY0z1$27e2t9lwGrj~5-%!WL+%i5J^Du+Wr3~p0 zqI{$__pmVIq%0hMlr(J}*Ms(eW)`ho%cZn*@Wa42!Xp`4r5mxbD^s<@Lbap)S6s=L zsor5R+@bbn)ebE%qfqTi_h66!ZzY&_x^`$4adPd@FQHpW@|0T+I^E&CJJWn+O%+E4 zuEY;g*=6lM%(Lg|t-YWE&T;Zqxp+T2%zDexL_C0GMK2+jl**E&$q znFanDoDKd1oCgMkZ2`C+xDY%LtOpsq2(AZ}yp7;!unDXL7l9Xni^0o4Zd^%D1($*v z;=d8R4!jAJoLUAh18)Jvvq@0=&itX5f6_VmCtY!H1^M~u;Tz8)7>i9whn{7N)^*h4O)#>`cSd$6nJCosun(sxEy?K1PJN2}!UT!)C zR~cK$oJQnVZHr66ZdN!m*-r$R$P~ZT@KPQuN2gRTw{C>;yJzrYXk$#b8=ZI}e^0v~ zCKcESRkk!+g~7U1ArekywKQ38qzhI)gaGTZ##wd#*S(L|QG)gUqJKY^ zceMdja-Z@vfx=S*mh(K!BQ=m3TVXs2JQy4Vo&%l?P6P*oSA#>rS>UPQYVb5ror+=L zec*8LTi^)ryWpANbKqIv%i!7IZ^5zPpTTp$_rYlGql_w?4yWrY9|2;Kz%_Q^R;dr8v~^NMa1+k$Qu?Q@s8N%G*DIisPSs zp0YC3=c#lqPo-ls2LFy$3x$CVu$NjHp~PHJ7!{L3_H9B+^=rX$-sgY{?_5xctww`OZ0THLOXpUFIND3zUf#r}l9YJTz_T03 zJHIp0OM>HYTHS4;55ZK)p@2wbC;Fq%&dN%3xlzOh@YL@;(RKHaRbL+=$v=G{-k+x= zkK_`*)X(hf0*j^liMHT;KLs1rZKE*?mBL%Y6VIF~5?^t+2$VM$gUXyqpyD+dRGP4& z-Di$;E_0+S4t9FeUba=+(WpBjdE`q1GD&^8B0nn-m4+hY*-N|473`8)2|6{Aj`vDuu0vC!Pt_B(lPLDX2`i3{)mu z0V)nxg31K86ZlM!&SiphZtBO;wt0IwC1hV~?NJd>A#@guXVvvkgFC-0Iu_G7%Vwv3 z6Xs`U6$`mhY*Z~a?LGA;HaA@RAB&=}*)|&gL#1!l@WfN~I#NyHSO6+j7lP_=T@Na3 z4WLq$O&LB_rE{q&om;HzXlgV$S{~N^V7a4yQvL*1nN$LICwCsgEPEBW+$drypE|M4 zshl>Eggv(n{@=M8c%SPgU+1!1#~4c>}hvsJV&Nhdc3f2XZZ1j?O5N zM(hV@-6&)E8m>247xuL_7ux1Zw;o-wb)ru*!fteSIl2+VvOG}V!PygsWVhAC8A`RV zc&ccsMXC3d>r?17-~~A{I4M+$7c~)K6H-eIv>=P(+X3m&f#1Wwhub0{VTpTJk+4U7kQ-4 zqHU)%I2%+Fi~;+AV?i~{#(}4R+zxD0OXq^4c|Q*v2VMYHffs_8f>q!(;6-2qI1!Xs zoCK}}F9AObR)cqgmx457Ac`FAw+`W$U=L_0O28RwUR9+o}k{vsxR}LnYFe@Ze(XVPqjX7 zDiU(zn(I0Ih-r5}Z>~K^`a~WDpN4Gd=i1L-&}G0+f%k61;YM$fi3&yy9Q!q6YXL4b z?soutJ;c0{YxVq#9Y@-G4m-*?REkp#PcNQY9x1Xhsd%2|*9nob)-_?6#fAZgfx|H; zb(3R2CT?u-VH9{J?`MHxztN!5ih&wqt0cMM*h)IbR?-#QDnCd2F7_R*-RpXp*l;ur z5;}YTitLr+gQNBFI%{X7c8p6`?er552*rJrwJ_V|A}e&OZA_ z&~$Xhtn5i`stC&v6A*;%99ct>1RYmXpd|8((!~VAb+LI*S3Z}idM;h{LTcFy+O|SJ z`~@HQjoP-dk$`9#MYA!~SUWSTHK54CLsBojO8WLTrXkwTC7DypnBtR*et2W!i+R0a1t6n8QuktxeN+z{d zzk>D^0>|u9A=;veES|J5YSf}VVIO}rXgUcS(P<6lJhd@C*+Xc5#n;<^rof$%TJ}oN zG(?_OzmlHBwE6Co-_yZo%F@;AGnMNj@n=4(eG#-DN3BBO;R=^kReRd!{OkSqjR`Ml zt9(h8TB~2ONmPYYELhkvz2lnHvX|_GFEP*+GT)ZevMsK6KQ>dnMR`r50J*wF9JmFp z?|7i2N5{RXWqrtampgsTzuq0Ca|2f(o+AFNo-xt7x!eW>oFKgp`i&Tt+r08})1AnF zjp@G1zoSio_neM>i+)U&RXN@*Ba*%~0VCyzW5yMOanQqhJ-g*_Ip$-s8ufCcT9Yx$ zAeAeQ!&P~ewR4*Mq?5Hf^_e^hk$ga~Pw368>2v1W>Ls-aa;BdWM4|qig&Y>Uq=|$7 zTvJrXfY#3%yL9pNrRPkaKYzybne$i$>e{3_f2@9%Mgt?Gk71

d?jdS(hxmZpOm- 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 diff --git a/osu!Lyrics/Properties/AssemblyInfo.cs b/osu!Lyrics/Properties/AssemblyInfo.cs index f8904f0..44c5f49 100644 --- a/osu!Lyrics/Properties/AssemblyInfo.cs +++ b/osu!Lyrics/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.8.62")] -[assembly: AssemblyInformationalVersion("1.8.63")] +[assembly: AssemblyInformationalVersion("1.8.64")] [assembly: NeutralResourcesLanguageAttribute("ko-KR")] From eb72ede50ffc3e7cd2f9274f25e974b05d809661 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 12 Oct 2016 00:36:47 +0900 Subject: [PATCH 12/48] =?UTF-8?q?=EB=8C=80=EB=8C=80=EC=A0=81=EC=9D=B8=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DvlErrLog.txt | 3 + Server/Core.cpp | 273 ++++++++++++++++++++++++++++++++++ Server/Core.h | 166 +++++++++++++++++++++ Server/Core.zip | Bin 0 -> 4627 bytes Server/Defines.h | 13 ++ Server/DllMain.cpp | 28 ---- Server/Hooker.h | 56 ------- Server/Monitor.cpp | 240 ------------------------------ Server/Monitor.h | 43 ------ Server/Observable.h | 12 -- Server/Observer.h | 8 - Server/Runnable.h | 6 - Server/Server.cpp | 71 --------- Server/Server.h | 32 ---- Server/Server.vcxproj | 25 +--- Server/Server.vcxproj.filters | 22 +-- Server/Subject.cpp | 22 --- Server/Subject.h | 16 -- Server/THUNK.cpp | 44 ------ Server/THUNK.h | 42 ------ Server/Thread.cpp | 29 ---- Server/Thread.h | 22 --- Server/brute_cast.h | 13 -- osu!Lyrics/Server.dll | Bin 0 -> 280576 bytes 24 files changed, 465 insertions(+), 721 deletions(-) create mode 100644 DvlErrLog.txt create mode 100644 Server/Core.cpp create mode 100644 Server/Core.h create mode 100644 Server/Core.zip create mode 100644 Server/Defines.h delete mode 100644 Server/DllMain.cpp delete mode 100644 Server/Hooker.h delete mode 100644 Server/Monitor.cpp delete mode 100644 Server/Monitor.h delete mode 100644 Server/Observable.h delete mode 100644 Server/Observer.h delete mode 100644 Server/Runnable.h delete mode 100644 Server/Server.cpp delete mode 100644 Server/Server.h delete mode 100644 Server/Subject.cpp delete mode 100644 Server/Subject.h delete mode 100644 Server/THUNK.cpp delete mode 100644 Server/THUNK.h delete mode 100644 Server/Thread.cpp delete mode 100644 Server/Thread.h delete mode 100644 Server/brute_cast.h create mode 100644 osu!Lyrics/Server.dll diff --git a/DvlErrLog.txt b/DvlErrLog.txt new file mode 100644 index 0000000..f8636cb --- /dev/null +++ b/DvlErrLog.txt @@ -0,0 +1,3 @@ +System.Exception: Please select a driver project. Driver Verification Log cannot be created for the selected platform tool set: ''. + 위치: Microsoft.SdvMenuCommand.DriverVerificationLicense..ctor() + 위치: Microsoft.SdvMenuCommand.SdvMenuCommandPackage.StaticToolsLogoMenuItemCallback(Object sender, EventArgs e) diff --git a/Server/Core.cpp b/Server/Core.cpp new file mode 100644 index 0000000..7c79a8c --- /dev/null +++ b/Server/Core.cpp @@ -0,0 +1,273 @@ +#include "Core.h" + +#include +#include +#include +#include +#include + +#pragma comment(lib, "Shlwapi.lib") + +std::wstring g_audioPath; +std::wstring g_beatmapPath; + +std::map g_songCached; +std::mutex g_songMutex; + +NamedPipe g_namedPipe +; + +// +// Proxy Ǻ. (#define ǵǾ.) +// MAKE_PROXY_DEF(module, function, proxy) +// HookEngine proxy__hk = HookEngine(module, function, proxy) +// EXAMPLE : +// MAKE_PROXY_DEF(NAME_KERNEL_DLL, "ReadFile", proxyReadFile); +// ==> HookEngine< decltype(proxyReadFile) > proxyReadFile__hk = HookEngine< decltype(proxy) >(module, function, proxy); +// + +MAKE_PROXY_DEF(NAME_KERNEL_DLL, "ReadFile", proxyReadFile); +MAKE_PROXY_DEF(NAME_BASS_DLL, "BASS_ChannelPlay", proxyBASS_ChannelPlay); +MAKE_PROXY_DEF(NAME_BASS_DLL, "BASS_ChannelSetPosition", proxyBASS_ChannelSetPosition); +MAKE_PROXY_DEF(NAME_BASS_DLL, "BASS_ChannelSetAttribute", proxyBASS_ChannelSetAttribute); +MAKE_PROXY_DEF(NAME_BASS_DLL, "BASS_ChannelPause", proxyBASS_ChannelPause); + +void Start() +{ + BeginHook(); // Begin Hooking Method. + EngineHook(proxyReadFile); // ReadFile Hook. + EngineHook(proxyBASS_ChannelPlay); // ChannelPlay Hook. + EngineHook(proxyBASS_ChannelSetPosition); // ChannelSetPosition Hook. + EngineHook(proxyBASS_ChannelSetAttribute); // ChannelSetAttribute Hook. + EngineHook(proxyBASS_ChannelPause); // ChannelPause Hook. + EndHook(); // End Hooking Method. + + g_namedPipe.Start(NAME_NAMED_PIPE); +} + +void Stop() +{ + BeginHook(); // Begin Hooking Method. + EngineUnhook(proxyReadFile); // ReadFile Unhook. + EngineUnhook(proxyBASS_ChannelPlay); // ChannelPlay Unhook. + EngineUnhook(proxyBASS_ChannelSetPosition); // ChannelSetPostion Unhook. + EngineUnhook(proxyBASS_ChannelSetAttribute); // ChannelSetAttribute Unhook. + EngineUnhook(proxyBASS_ChannelPause); // ChannelPause Unhook. + EndHook(); // End Hooking Method. + + g_namedPipe.Stop(); +} + +// +// TODO : currentTime tempo ǹϴ ˼ ϴ. +// ּ Ź帳ϴ. +// +void Notify(double currentTime, float tempo) +{ + wchar_t message[MAX_MESSAGE_LENGTH]; + + long long sysTime; + GetSystemTime((LPSYSTEMTIME)&sysTime); + + // ÷ϰִ proxyReadFile  Ŭ̾Ʈ մϴ. + g_songMutex.lock(); + swprintf(message, L"%llx|%s|%lf|%f|%s\n", + sysTime, + g_audioPath.c_str(), + currentTime, + tempo, + g_beatmapPath.c_str()); + g_songMutex.unlock(); + + g_namedPipe.PushMessage(std::wstring(message)); +} + +BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) +{ + if (!SelectProxy(proxyReadFile).OriginalFunction(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) + { + return FALSE; + } + + + TCHAR nameTmpFilePath[MAX_PATH]; + + DWORD dwTmpFilePathLength = GetFinalPathNameByHandle(hFile, nameTmpFilePath, MAX_PATH, VOLUME_NAME_DOS); + DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - (*lpNumberOfBytesRead); + + // //?/ ϱ 4 . + TCHAR* nameFile = &nameTmpFilePath[4]; + DWORD dwFilePathLength = dwTmpFilePathLength - 4; + + // д Ʈ ̰ պκ оٸ : + // ̸ Ե Path κ 4ڸ ڸ. 4ڿ .osu Ͽ osu Ȯ + if (wcsncmp(L".osu", &nameFile[dwFilePathLength - 4], 4) == 0 && dwFilePosition == 0) + { + // .osu UTF-8(Multibyte) ڵ + // strtok ҽ ϹǷ strdup ̿ؼ ڸ . + LPSTR buffer = strdup((const char*)(lpBuffer)); + + // for ̿ؼ ٸ strtok ߶. + for (LPSTR line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) + { + // ߶ ٿ Token ִ Ȯϰ ƴҰ쿡 continue. + if (strnicmp(line, AUDIO_FILE_INFO_TOKEN, strlen(AUDIO_FILE_INFO_TOKEN)) != 0) + { + continue; + } + + TCHAR nameAudioFile[MAX_PATH]; + mbstowcs(nameAudioFile, &line[strlen(AUDIO_FILE_INFO_TOKEN)], MAX_PATH); + StrTrimW(nameAudioFile, L" \r"); + + TCHAR pathAudioFile[MAX_PATH]; + wcscpy(pathAudioFile, nameFile); + + // pathAudioFile ϸ ϴ. + PathRemoveFileSpecW(pathAudioFile); + + // ϸ Path pathAudioFile nameAudioFileٿ, Path ϴ. + PathCombineW(pathAudioFile, pathAudioFile, nameAudioFile); + + g_songMutex.lock(); + g_beatmapPath = (std::wstring(nameFile)); + g_audioPath = (std::wstring(pathAudioFile)); + + if (g_songCached.find(g_audioPath) == g_songCached.end()) + { + g_songCached.insert( + std::pair(nameAudioFile, nameFile)); + } + + g_songMutex.unlock(); + + break; + } + + // strdup ̿ ڿ ޸𸮸 ŵϴ. + free(buffer); + } + else + { + // Beatmap ٽ ҷ ʰ Osu ޸ Cache ҷö ִµ. + // ׷쿡 Audioϸ Beatmap Audio + // ִ Ȯϰ ǰִ AudioFile ٲ۴. + g_songMutex.lock(); + + if (g_songCached.find(nameFile) != g_songCached.end()) + { + g_beatmapPath = g_songCached.find(nameFile)->second; + } + + g_songMutex.unlock(); + } + return TRUE; + +} + +BOOL WINAPI proxyBASS_ChannelPlay(DWORD handle, BOOL restart) +{ + if (!SelectProxy(proxyBASS_ChannelPlay).OriginalFunction(handle, restart)) + { + return FALSE; + } + + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + + if (info.ctype & BASS_CTYPE_STREAM) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); + float currentTempo = 0; + BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, ¤tTempo); + + //Notify(currentTime, currentTempo); + } + return TRUE; + +} + +BOOL WINAPI proxyBASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) +{ + if (!SelectProxy(proxyBASS_ChannelSetPosition).OriginalFunction(handle, pos, mode)) + { + return FALSE; + } + + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + + if (info.ctype & BASS_CTYPE_STREAM) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, pos); + float currentTempo = 0; + BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, ¤tTempo); + // !! pos , + // ϸ proxyBASS_ChannelPlay Լ ȣǰ, + // BASS_ChannelIsActive BASS_ACTIVE_PAUSED. + if (BASS_ChannelIsActive(handle) == BASS_ACTIVE_PAUSED) + { + currentTempo = -100; + } + + Notify(currentTime, currentTempo); + } + + return TRUE; +} + +BOOL WINAPI proxyBASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) +{ + if (!SelectProxy(proxyBASS_ChannelSetAttribute).OriginalFunction(handle, attrib, value)) + { + return FALSE; + } + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + + if ((info.ctype & BASS_CTYPE_STREAM) && attrib == BASS_ATTRIB_TEMPO) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); + + Notify(currentTime, value); + } + + return TRUE; +} + +BOOL WINAPI proxyBASS_ChannelPause(DWORD handle) +{ + if (!SelectProxy(proxyBASS_ChannelPause).OriginalFunction(handle)) + { + return FALSE; + } + + BASS_CHANNELINFO info; + BASS_ChannelGetInfo(handle, &info); + if (info.ctype & BASS_CTYPE_STREAM) + { + double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); + + Notify(currentTime, -100); + } + + return TRUE; +} + + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + // + // LoaderLock ؼ ȣѴ. + // + CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Start, 0, 0, 0); + break; + case DLL_PROCESS_DETACH: + Stop(); + break; + } + return TRUE; +} \ No newline at end of file diff --git a/Server/Core.h b/Server/Core.h new file mode 100644 index 0000000..83ab610 --- /dev/null +++ b/Server/Core.h @@ -0,0 +1,166 @@ +#pragma once + +#include "Defines.h" +#include "detours.h" +#include "bass.h" +#include "bass_fx.h" + +#include +#include +#include + +// +// proxy Ǻ. +// + +BOOL WINAPI +proxyReadFile( HANDLE hFile, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesRead, + LPOVERLAPPED lpOverlapped); +BOOL WINAPI +proxyBASS_ChannelPlay( DWORD handle, + BOOL restart); +BOOL WINAPI +proxyBASS_ChannelSetPosition( DWORD handle, + QWORD pos, + DWORD mode); +BOOL WINAPI +proxyBASS_ChannelSetAttribute( DWORD handle, + DWORD attrib, + float value); +BOOL WINAPI +proxyBASS_ChannelPause( DWORD handle); + +#define MAKE_PROXY_DEF(module, function, proxy) \ + HookEngine proxy##__hk = \ + HookEngine(module, function, proxy) +#define SelectProxy(proxy_class) proxy_class##__hk +#define EngineHook(proxy_class) \ + SelectProxy(proxy_class).TryHook() +#define EngineUnhook(proxy_class) \ + SelectProxy(proxy_class).Unhook() +#define BeginHook() \ + do \ + { \ + DetourTransactionBegin(); \ + DetourUpdateThread(GetCurrentThread()); \ + } while(0) +#define EndHook() DetourTransactionCommit() + +#define NAME_BASS_DLL L"bass.dll" +#define NAME_KERNEL_DLL L"kernel32.dll" +#define NAME_NAMED_PIPE L"\\\\.\\pipe\\osu!Lyrics" +#define AUDIO_FILE_INFO_TOKEN "AudioFilename:" +#define MAX_MESSAGE_LENGTH 600 + +template +class HookEngine +{ +private: + funcType* proxy; + bool isHooked; + +public: + funcType* OriginalFunction; + + HookEngine(const wchar_t *nameModule, const char *nameFunction, funcType* proxy) + { + this->OriginalFunction = (funcType*)GetProcAddress(GetModuleHandle(nameModule), nameFunction); + this->proxy = proxy; + } + void TryHook() + { + if (!isHooked) this->isHooked = !!DetourAttach(&(PVOID&)OriginalFunction, (PVOID)proxy); + } + void Unhook() + { + if (isHooked) this->isHooked = !DetourDetach(&(PVOID&)OriginalFunction, (PVOID)proxy); + } +}; + +class NamedPipe +{ + HANDLE m_hEvent; + HANDLE m_hPipe; + + std::atomic m_isThreadRunning; + std::atomic m_isPipeConnected; + + std::thread* m_ThreadObject; + concurrency::concurrent_queue m_ThreadQueues; + +public: + + + void Start(const std::wstring&& nPipe) + { + + m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + m_hPipe = CreateNamedPipeW( + + nPipe.c_str(), + + PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, MAX_MESSAGE_LENGTH, 0, INFINITE, NULL); + + m_isThreadRunning = true; + + m_ThreadObject = new std::thread([this]() { + std::wstring wMessage; + DWORD nWritten; + + while (m_isThreadRunning) + { + // + // ConnectNamedPipe Ŭ̾Ʈ \ : + // Ҵ DisconnectNamedPipe + // + if (ConnectNamedPipe(m_hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) + { + m_isPipeConnected = true; + + if (!m_ThreadQueues.try_pop(wMessage)) + { + WaitForSingleObject(m_hEvent, 3000); + continue; + } + + if (WriteFile(m_hPipe, wMessage.c_str(), wMessage.length() * sizeof(std::wstring::value_type), &nWritten, NULL)) + { + continue; + } + + m_isPipeConnected = false; + DisconnectNamedPipe(m_hPipe); + } + } + + m_isPipeConnected = false; + DisconnectNamedPipe(m_hPipe); + CloseHandle(m_hPipe); + }); + + return; + } + + void Stop() + { + m_isThreadRunning = false; + m_ThreadObject->join(); + delete m_ThreadObject; + + CloseHandle(m_hEvent); + } + + void PushMessage(const std::wstring&& message) + { + if (!(m_isPipeConnected & m_isThreadRunning)) + { + return; + } + + m_ThreadQueues.push(message); + SetEvent(m_hEvent); + } +}; \ No newline at end of file diff --git a/Server/Core.zip b/Server/Core.zip new file mode 100644 index 0000000000000000000000000000000000000000..94a4e4d03880bb9a2c4479ed712917f75616b5d7 GIT binary patch literal 4627 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 fdj88T^Ecr6Pd8Lg6Zc +#include +#include + +#ifdef _DEBUG +#define DEBUG_ASSERT(expression) assert(expression) +#else +#define DEBUG_ASSERT() +#endif + +#pragma warning(disable:4996) diff --git a/Server/DllMain.cpp b/Server/DllMain.cpp deleted file mode 100644 index a930131..0000000 --- a/Server/DllMain.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include "Server.h" -#include "Monitor.h" - -Server* server; -Monitor* monitor; - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - if (fdwReason == DLL_PROCESS_ATTACH) - { - server = new Server(); - server->Start(); - monitor = new Monitor(); - monitor->Attach(static_cast(server)); - monitor->Activate(); - } - else if (fdwReason == DLL_PROCESS_DETACH) - { - monitor->Disable(); - monitor->Detach(static_cast(server)); - server->Stop(); - delete monitor; - server->Wait(); - delete server; - } - return TRUE; -} diff --git a/Server/Hooker.h b/Server/Hooker.h deleted file mode 100644 index 55c8243..0000000 --- a/Server/Hooker.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include -#include "detours.h" -#include "THUNK.h" - -template -class Hooker -{ -public: - Hooker(const wchar_t* szModuleName, const char* szFunctionName) : - pOriginalFunction(reinterpret_cast(GetProcAddress(GetModuleHandle(szModuleName), szFunctionName))), - pHookThunk(new THUNK()), - isHooked(false) - { - } - ~Hooker() - { - delete this->pHookThunk; - } - - void SetHookFunction(TypeFunction* pHookFunction) - { - this->pHookThunk->Set(pHookFunction); - } - template - void SetHookFunction(T C::* pHookMemberFunction, I* pInstance) - { - this->pHookThunk->Set(pHookMemberFunction, pInstance); - } - - void Hook() - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&) this->pOriginalFunction, this->pHookThunk); - this->isHooked = DetourTransactionCommit() == NO_ERROR; - } - void Unhook() - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach(&(PVOID&) this->pOriginalFunction, this->pHookThunk); - this->isHooked = DetourTransactionCommit() != NO_ERROR; - } - - TypeFunction* GetOriginalFunction() - { - return this->pOriginalFunction; - } - -private: - TypeFunction* pOriginalFunction; - THUNK* pHookThunk; - bool isHooked; -}; diff --git a/Server/Monitor.cpp b/Server/Monitor.cpp deleted file mode 100644 index 2a40940..0000000 --- a/Server/Monitor.cpp +++ /dev/null @@ -1,240 +0,0 @@ -#pragma comment(lib, "Shlwapi.lib") - -#include "Monitor.h" - -#include -#include -#include -#include - -#include -#include "Server.h" - -Monitor::Monitor() : - hookerReadFile(L"kernel32.dll", "ReadFile"), - hookerBASS_ChannelPlay(L"bass.dll", "BASS_ChannelPlay"), - hookerBASS_ChannelSetPosition(L"bass.dll", "BASS_ChannelSetPosition"), - hookerBASS_ChannelSetAttribute(L"bass.dll", "BASS_ChannelSetAttribute"), - hookerBASS_ChannelPause(L"bass.dll", "BASS_ChannelPause") -{ - InitializeCriticalSection(&this->hCritiaclSection); - - hookerReadFile.SetHookFunction(&Monitor::OnReadFile, this); - hookerBASS_ChannelPlay.SetHookFunction(&Monitor::OnBASS_ChannelPlay, this); - hookerBASS_ChannelSetPosition.SetHookFunction(&Monitor::OnBASS_ChannelSetPosition, this); - hookerBASS_ChannelSetAttribute.SetHookFunction(&Monitor::OnBASS_ChannelSetAttribute, this); - hookerBASS_ChannelPause.SetHookFunction(&Monitor::OnBASS_ChannelPause, this); -} - -Monitor::~Monitor() -{ - DeleteCriticalSection(&this->hCritiaclSection); -} - - -BOOL Monitor::OnReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) -{ - if (!this->hookerReadFile.GetOriginalFunction()(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped)) - { - return FALSE; - } - - // osu! ̸(260 ̻) Ƿ, - // szFilePath ̴ MAX_PATH ϰ ߰ Ҵϴ - // GetFinalPathNameByHandle , szFilePath \\?\D:\Games\osu!\... - wchar_t szFilePath[MAX_PATH]; - DWORD nFilePathLength = GetFinalPathNameByHandle(hFile, szFilePath, MAX_PATH, VOLUME_NAME_DOS); - // д ũ ƴϰų, osu! ɷ ʰ Ÿ library ۾? - if (nFilePathLength == 0 || nFilePathLength > MAX_PATH || lpNumberOfBytesRead == NULL) - { - return TRUE; - } - - DWORD dwFilePosition = SetFilePointer(hFile, 0, NULL, FILE_CURRENT) - *lpNumberOfBytesRead; - // д Ʈ ̰ պκ оٸ : - // AudioFilename պκп / ڵ ! - if (wcsnicmp(L".osu", &szFilePath[nFilePathLength - 4], 4) == 0 && dwFilePosition == 0) - { - // strtok ҽ ϹǷ ϴ - // .osu UTF-8(Multibyte) ڵ - char *buffer = strdup((const char *) lpBuffer); - for (char *line = strtok(buffer, "\n"); line != NULL; line = strtok(NULL, "\n")) - { - if (strnicmp(line, "AudioFilename:", 14) != 0) - { - continue; - } - - // AudioFilename - wchar_t szAudioFileName[MAX_PATH]; - mbstowcs(szAudioFileName, &line[14], MAX_PATH); - StrTrim(szAudioFileName, L" \r"); - - // Ʈ ã - wchar_t szAudioFilePath[MAX_PATH]; - wcscpy(szAudioFilePath, szFilePath); - PathRemoveFileSpec(szAudioFilePath); - PathCombine(szAudioFilePath, szAudioFilePath, szAudioFileName); - - // audioInfo ˻ ҹ ϹǷ Ȯ - WIN32_FIND_DATA fdata; - FindClose(FindFirstFile(szAudioFilePath, &fdata)); - PathRemoveFileSpec(szAudioFilePath); - PathCombine(szAudioFilePath, szAudioFilePath, fdata.cFileName); - - // PathCombineW ǵġ ʰ \\?\(Long Unicode path prefix) ϴµ, - // GetFinalPathNameByHandle 忡 ° ٽ ߰ؼ - // ٲ ȥ - wcscpy(szAudioFileName, szAudioFilePath); - wcscpy(szAudioFilePath, L"\\\\?\\"); - wcscat(szAudioFilePath, szAudioFileName); - - // osu! Ʈ ٲ Ź Ʈ ʰ ijÿ ҷ⵵ - // => Ʈ Ϻٴ ؾ - this->audioInfo.insert({szAudioFilePath, szFilePath}); - break; - } - // strdup ó - free(buffer); - } - // д Ʈ ϱ - else - { - decltype(this->audioInfo)::iterator info; - if ((info = this->audioInfo.find(szFilePath)) != this->audioInfo.end()) - { - EnterCriticalSection(&this->hCritiaclSection); - this->playing = {info->first.substr(4), info->second.substr(4)}; - LeaveCriticalSection(&this->hCritiaclSection); - } - } - return TRUE; -} - - -BOOL Monitor::OnBASS_ChannelPlay(DWORD handle, BOOL restart) -{ - if (!this->hookerBASS_ChannelPlay.GetOriginalFunction()(handle, restart)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - if (info.ctype & BASS_CTYPE_STREAM) - { - double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - float tempo = 0; - BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); - this->Notify(currentTime, tempo); - } - return TRUE; -} - -BOOL Monitor::OnBASS_ChannelSetPosition(DWORD handle, QWORD pos, DWORD mode) -{ - if (!this->hookerBASS_ChannelSetPosition.GetOriginalFunction()(handle, pos, mode)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - if (info.ctype & BASS_CTYPE_STREAM) - { - double currentTime = BASS_ChannelBytes2Seconds(handle, pos); - float tempo = 0; - BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, &tempo); - // !! pos , - // ϸ BASS_ChannelPlay Լ ȣǰ, - // BASS_ChannelIsActive BASS_ACTIVE_PAUSED. - if (BASS_ChannelIsActive(handle) == BASS_ACTIVE_PAUSED) - { - tempo = -100; - } - this->Notify(currentTime, tempo); - } - return TRUE; -} - -BOOL Monitor::OnBASS_ChannelSetAttribute(DWORD handle, DWORD attrib, float value) -{ - if (!this->hookerBASS_ChannelSetAttribute.GetOriginalFunction()(handle, attrib, value)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - if ((info.ctype & BASS_CTYPE_STREAM) && attrib == BASS_ATTRIB_TEMPO) - { - double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - this->Notify(currentTime, value); - } - return TRUE; -} - -BOOL Monitor::OnBASS_ChannelPause(DWORD handle) -{ - if (!this->hookerBASS_ChannelPause.GetOriginalFunction()(handle)) - { - return FALSE; - } - - BASS_CHANNELINFO info; - BASS_ChannelGetInfo(handle, &info); - if (info.ctype & BASS_CTYPE_STREAM) - { - double currentTime = BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetPosition(handle, BASS_POS_BYTE)); - this->Notify(currentTime, -100); - } - return TRUE; -} - - -inline long long GetSystemTimeAsFileTime() -{ - /* - * Do not cast a pointer to a FILETIME structure to either a - * ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows. - * via http://technet.microsoft.com/en-us/library/ms724284(v=vs.85).aspx - */ - FILETIME ft; - GetSystemTimeAsFileTime(&ft); - return ((long long) ft.dwHighDateTime << 32) + ft.dwLowDateTime; -} - -void Monitor::Notify(double currentTime, float tempo) -{ - wchar_t message[Server::nMessageLength]; - EnterCriticalSection(&this->hCritiaclSection); - swprintf(message, L"%llx|%s|%lf|%f|%s\n", - GetSystemTimeAsFileTime(), - this->playing.first.c_str(), - currentTime, - tempo, - this->playing.second.c_str() - ); - LeaveCriticalSection(&this->hCritiaclSection); - Subject::Notify(message); -} - -void Monitor::Activate() -{ - this->hookerReadFile.Hook(); - - this->hookerBASS_ChannelPlay.Hook(); - this->hookerBASS_ChannelSetPosition.Hook(); - this->hookerBASS_ChannelSetAttribute.Hook(); - this->hookerBASS_ChannelPause.Hook(); -} - -void Monitor::Disable() -{ - this->hookerBASS_ChannelPause.Unhook(); - this->hookerBASS_ChannelSetAttribute.Unhook(); - this->hookerBASS_ChannelSetPosition.Unhook(); - this->hookerBASS_ChannelPlay.Unhook(); - - this->hookerReadFile.Unhook(); -} diff --git a/Server/Monitor.h b/Server/Monitor.h deleted file mode 100644 index a04c76b..0000000 --- a/Server/Monitor.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "Subject.h" - -#include - -#include -#include "bass.h" -#include "bass_fx.h" -#include "Hooker.h" - -class Monitor : public Subject -{ -public: - Monitor(); - ~Monitor(); - - void Activate(); - void Disable(); - void Notify(double, float); - -private: - BOOL OnReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); - BOOL OnBASS_ChannelPlay(DWORD, BOOL); - BOOL OnBASS_ChannelSetPosition(DWORD, QWORD, DWORD); - BOOL OnBASS_ChannelSetAttribute(DWORD, DWORD, float); - BOOL OnBASS_ChannelPause(DWORD); - - Hooker hookerReadFile; - Hooker hookerBASS_ChannelPlay; - Hooker hookerBASS_ChannelSetPosition; - Hooker hookerBASS_ChannelSetAttribute; - Hooker hookerBASS_ChannelPause; - - // what osu! played - // [ audioPath, beatmapPath ] - concurrency::concurrent_unordered_map audioInfo; - // what osu! is playing - // [ audioPath, beatmapPath ] - std::pair playing; - // thread safe playing - CRITICAL_SECTION hCritiaclSection; -}; diff --git a/Server/Observable.h b/Server/Observable.h deleted file mode 100644 index f780570..0000000 --- a/Server/Observable.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include - -#include "Observer.h" - -struct Observable -{ - virtual void Attach(Observer*) = 0; - virtual void Detach(Observer*) = 0; - virtual void Notify(const std::wstring&) = 0; -}; diff --git a/Server/Observer.h b/Server/Observer.h deleted file mode 100644 index b0c5e18..0000000 --- a/Server/Observer.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include - -struct Observer -{ - virtual void Update(const std::wstring&) = 0; -}; diff --git a/Server/Runnable.h b/Server/Runnable.h deleted file mode 100644 index 5264367..0000000 --- a/Server/Runnable.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -struct Runnable -{ - virtual void Run() = 0; -}; diff --git a/Server/Server.cpp b/Server/Server.cpp deleted file mode 100644 index 9749a08..0000000 --- a/Server/Server.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "Server.h" - -#include - -#include - -Server::Server() : - isCancellationRequested(false), - hPipe(NULL), - isPipeConnected(false), - hPushEvent(NULL) -{ -} - -void Server::Run() -{ - this->hPushEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - - this->hPipe = CreateNamedPipe(L"\\\\.\\pipe\\osu!Lyrics", PIPE_ACCESS_OUTBOUND, - PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, Server::nBufferSize, 0, INFINITE, NULL); - std::wstring message; - DWORD nNumberOfBytesWritten; - // û Ŭ̾Ʈ - while (!this->isCancellationRequested) - { - // ConnectNamedPipe Ŭ̾Ʈ : - // Ҵ DisconnectNamedPipe - if (ConnectNamedPipe(this->hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) - { - this->isPipeConnected = true; - - // ޽ ť ִ 3ʰ ٸ ٽ õ: - // Ŭ̾Ʈ ؾ ϱ INTINITE - if (!this->messageQueue.try_pop(message)) - { - WaitForSingleObject(this->hPushEvent, 3000); - continue; - } - - if (WriteFile(this->hPipe, message.c_str(), message.length() * sizeof(std::wstring::value_type), &nNumberOfBytesWritten, NULL)) - { - continue; - } - } - this->isPipeConnected = false; - DisconnectNamedPipe(this->hPipe); - } - // Ŭ̾Ʈ - this->isPipeConnected = false; - DisconnectNamedPipe(this->hPipe); - CloseHandle(this->hPipe); - - CloseHandle(this->hPushEvent); -} - -void Server::Stop() -{ - this->isCancellationRequested = true; - DisconnectNamedPipe(this->hPipe); -} - -void Server::Update(const std::wstring& message) -{ - if (!this->isPipeConnected) - { - return; - } - - this->messageQueue.push(message); - SetEvent(this->hPushEvent); -} diff --git a/Server/Server.h b/Server/Server.h deleted file mode 100644 index f4d2140..0000000 --- a/Server/Server.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "Observer.h" -#include "Thread.h" - -#include -#include - -#include - -class Server : public Observer, public Thread -{ -public: - static const DWORD nMessageLength = MAX_PATH * 3; - static const DWORD nBufferSize = Server::nMessageLength * sizeof(std::wstring::value_type); - - Server(); - - virtual void Run() override; - void Stop(); - - virtual void Update(const std::wstring&) override; - -private: - std::atomic isCancellationRequested; - - HANDLE hPipe; - std::atomic isPipeConnected; - - concurrency::concurrent_queue messageQueue; - HANDLE hPushEvent; -}; diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj index e4e4d10..224a243 100644 --- a/Server/Server.vcxproj +++ b/Server/Server.vcxproj @@ -15,6 +15,7 @@ Win32Proj osu_Lyrics Server + 8.1 @@ -26,7 +27,7 @@ DynamicLibrary false - v140 + v140_xp true Unicode @@ -85,29 +86,12 @@ false - - - - - - - - - + - - - - - - - - - @@ -117,6 +101,9 @@ + + + diff --git a/Server/Server.vcxproj.filters b/Server/Server.vcxproj.filters index c37bf12..0df9782 100644 --- a/Server/Server.vcxproj.filters +++ b/Server/Server.vcxproj.filters @@ -1,17 +1,7 @@  - - - - - - - - - - Libraries\BASS @@ -21,14 +11,7 @@ Libraries\detours - - - - - - - - + @@ -55,4 +38,7 @@ Libraries\detours + + + \ No newline at end of file diff --git a/Server/Subject.cpp b/Server/Subject.cpp deleted file mode 100644 index 9b0af1a..0000000 --- a/Server/Subject.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "Subject.h" - -#include -#include - -void Subject::Attach(Observer* observer) -{ - this->observers.emplace_back(observer); -} - -void Subject::Detach(Observer* observer) -{ - this->observers.erase(std::find(this->observers.begin(), this->observers.end(), observer), this->observers.end()); -} - -void Subject::Notify(const std::wstring& message) -{ - std::for_each(this->observers.begin(), this->observers.end(), [&message](auto& observer) - { - observer->Update(message); - }); -} diff --git a/Server/Subject.h b/Server/Subject.h deleted file mode 100644 index abf7702..0000000 --- a/Server/Subject.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "Observable.h" - -#include - -class Subject : public Observable -{ -public: - virtual void Attach(Observer*) override; - virtual void Detach(Observer*) override; - virtual void Notify(const std::wstring&) override; - -private: - std::vector observers; -}; diff --git a/Server/THUNK.cpp b/Server/THUNK.cpp deleted file mode 100644 index 43a38c4..0000000 --- a/Server/THUNK.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "THUNK.h" - -HANDLE hHeap; -size_t nEntry; - -void THUNK::Set(DWORD pFunction, DWORD pInstance) -{ - if (pInstance == 0) - { - //nop - this->lea_ecx = 0x9090; - this->pInstance = 0x90909090; - } - else - { - this->lea_ecx = 0x0D8D; - this->pInstance = pInstance; - } - this->mov_eax = 0xB8; - this->pFunction = pFunction; - this->jmp_eax = 0xE0FF; - // flush multi thread instruction cache - FlushInstructionCache(GetCurrentProcess(), static_cast(this), sizeof(THUNK)); -} - -void* THUNK::operator new(size_t) -{ - if (nEntry == 0) - { - hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0); - } - void* entry = HeapAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS, sizeof(THUNK)); - nEntry++; - return entry; -} - -void THUNK::operator delete(void* p) -{ - HeapFree(hHeap, HEAP_GENERATE_EXCEPTIONS, p); - if (--nEntry == 0) - { - HeapDestroy(hHeap); - } -} diff --git a/Server/THUNK.h b/Server/THUNK.h deleted file mode 100644 index b51c630..0000000 --- a/Server/THUNK.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include "brute_cast.h" - -struct THUNK -{ -#pragma pack(push, 1) - //lea ecx,pInstance - WORD lea_ecx; - DWORD pInstance; - //mov eax,pFunction - BYTE mov_eax; - DWORD pFunction; - //jmp eax - WORD jmp_eax; -#pragma pack(pop) - - THUNK() - : lea_ecx(0), - pInstance(0), - mov_eax(0), - pFunction(0), - jmp_eax(0) - { - } - - template - void Set(T* pFunction) - { - this->Set(reinterpret_cast(pFunction), reinterpret_cast(nullptr)); - } - template - void Set(T C::* pMemberFunction, I* pInstance) - { - this->Set(brute_cast(pMemberFunction), reinterpret_cast(pInstance)); - } - void Set(DWORD, DWORD); - - void* operator new(size_t); - void operator delete(void*); -}; diff --git a/Server/Thread.cpp b/Server/Thread.cpp deleted file mode 100644 index 3c1ae35..0000000 --- a/Server/Thread.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "Thread.h" - -Thread::Thread() - : pThunk(new THUNK()) -{ - this->pThunk->Set(&Thread::Proc, this); -} - -Thread::~Thread() -{ - delete this->pThunk; -} - -void Thread::Start() -{ - this->hThread = CreateThread(NULL, 0, reinterpret_cast(this->pThunk), NULL, 0, NULL); -} - -void Thread::Wait() -{ - WaitForSingleObject(this->hThread, INFINITE); - CloseHandle(this->hThread); -} - -DWORD Thread::Proc(LPVOID lParam) -{ - this->Run(); - return 0; -} diff --git a/Server/Thread.h b/Server/Thread.h deleted file mode 100644 index e37be5d..0000000 --- a/Server/Thread.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "Runnable.h" - -#include -#include "THUNK.h" - -class Thread : public Runnable -{ -public: - Thread(); - ~Thread(); - - void Start(); - void Wait(); - -private: - DWORD Proc(LPVOID); - - THUNK* pThunk; - HANDLE hThread; -}; diff --git a/Server/brute_cast.h b/Server/brute_cast.h deleted file mode 100644 index 1c8699b..0000000 --- a/Server/brute_cast.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -template -R brute_cast(T in) -{ - union - { - R o; - T i; - } u; - u.i = in; - return u.o; -} diff --git a/osu!Lyrics/Server.dll b/osu!Lyrics/Server.dll new file mode 100644 index 0000000000000000000000000000000000000000..0b9533f4b97162d3c10df3e4499a3391280b120b GIT binary patch literal 280576 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�aYrA9oW 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

-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 F{XYRrGk^d9 literal 0 HcmV?d00001 From 68aa81dfb84f6b8cdbb05aee3ebca9006deb8d35 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 12 Oct 2016 00:49:16 +0900 Subject: [PATCH 13/48] =?UTF-8?q?=EC=B5=9C=EC=A0=81=ED=99=94=20+=20map=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EA=B8=B0=EC=A1=B4=20cache=EB=90=9C=20?= =?UTF-8?q?=EA=B0=92=EC=9D=84=20=EC=B0=BE=EC=A7=80=20=EB=AA=BB=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Core.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Server/Core.cpp b/Server/Core.cpp index 7c79a8c..60ee945 100644 --- a/Server/Core.cpp +++ b/Server/Core.cpp @@ -136,7 +136,7 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR if (g_songCached.find(g_audioPath) == g_songCached.end()) { g_songCached.insert( - std::pair(nameAudioFile, nameFile)); + std::pair(pathAudioFile, nameFile)); } g_songMutex.unlock(); @@ -153,10 +153,11 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR // ׷쿡 Audioϸ Beatmap Audio // ִ Ȯϰ ǰִ AudioFile ٲ۴. g_songMutex.lock(); + auto cachedInfo = g_songCached.find(nameFile); - if (g_songCached.find(nameFile) != g_songCached.end()) + if (cachedInfo != g_songCached.end()) { - g_beatmapPath = g_songCached.find(nameFile)->second; + g_beatmapPath = cachedInfo->second; } g_songMutex.unlock(); From e86f7c56ca9712651dc2231c7ba0cb4c201e97d8 Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 12 Oct 2016 00:52:47 +0900 Subject: [PATCH 14/48] =?UTF-8?q?cache=EB=90=9C=20=EA=B0=92=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=98=A4=EB=94=94=EC=98=A4=20=EA=B0=92=EC=9D=84=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=ED=95=B4=EC=A3=BC=EC=A7=80=20=EB=AA=BB?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Core.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/Core.cpp b/Server/Core.cpp index 60ee945..696745d 100644 --- a/Server/Core.cpp +++ b/Server/Core.cpp @@ -157,6 +157,7 @@ BOOL WINAPI proxyReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToR if (cachedInfo != g_songCached.end()) { + g_audioPath = cachedInfo->first; g_beatmapPath = cachedInfo->second; } From bf61a1e2ad033bb46f15a8e34c2e24cce26f5e4a Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Wed, 12 Oct 2016 00:54:33 +0900 Subject: [PATCH 15/48] =?UTF-8?q?=ED=95=84=EC=9A=94=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Core.zip | Bin 4627 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Server/Core.zip diff --git a/Server/Core.zip b/Server/Core.zip deleted file mode 100644 index 94a4e4d03880bb9a2c4479ed712917f75616b5d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4627 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 fdj88T^Ecr6Pd8Lg6Zc Date: Wed, 12 Oct 2016 00:57:01 +0900 Subject: [PATCH 16/48] =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=ED=95=9C=EB=B6=80=EB=B6=84=20=EC=A3=BC=EC=84=9D=ED=95=B4?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/Core.cpp b/Server/Core.cpp index 696745d..a2d8108 100644 --- a/Server/Core.cpp +++ b/Server/Core.cpp @@ -183,7 +183,7 @@ BOOL WINAPI proxyBASS_ChannelPlay(DWORD handle, BOOL restart) float currentTempo = 0; BASS_ChannelGetAttribute(handle, BASS_ATTRIB_TEMPO, ¤tTempo); - //Notify(currentTime, currentTempo); + Notify(currentTime, currentTempo); } return TRUE; From c42eda4857fbd1745edde91c93e1fca28b21dfbc Mon Sep 17 00:00:00 2001 From: Jun Ryung Ju Date: Thu, 13 Oct 2016 17:53:32 +0900 Subject: [PATCH 17/48] =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EC=9D=B4=20=EB=A7=9E=EC=A7=80=20=EC=95=8A=EC=9D=80=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Core.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/Core.cpp b/Server/Core.cpp index a2d8108..633a3b3 100644 --- a/Server/Core.cpp +++ b/Server/Core.cpp @@ -66,13 +66,13 @@ void Notify(double currentTime, float tempo) { wchar_t message[MAX_MESSAGE_LENGTH]; - long long sysTime; - GetSystemTime((LPSYSTEMTIME)&sysTime); + FILETIME ft; + GetSystemTimeAsFileTime(&ft); // ÷ϰִ proxyReadFile  Ŭ̾Ʈ մϴ. g_songMutex.lock(); swprintf(message, L"%llx|%s|%lf|%f|%s\n", - sysTime, + ((long long)ft.dwHighDateTime << 32) + ft.dwLowDateTime, g_audioPath.c_str(), currentTime, tempo, From 674d119a90f9f0dca5a0b9d68b76fed1409a5c27 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Wed, 15 Nov 2017 09:34:03 +0900 Subject: [PATCH 18/48] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=82=B4=20?= =?UTF-8?q?=EC=84=9E=EC=97=AC=EC=9E=88=EB=8D=98=20NativeMethods=EB=A5=BC?= =?UTF-8?q?=20Interop=20=EB=84=A4=EC=9E=84=EC=8A=A4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Constants.cs | 18 +++ osu!Lyrics/FileEx.cs | 58 +++++++ osu!Lyrics/Interop/ExternDll.cs | 15 ++ osu!Lyrics/Interop/NativeMethods.cs | 227 ++++++++++++++++++++++++++++ osu!Lyrics/LayeredWindow.cs | 97 ++++++++++++ osu!Lyrics/Lyrics.Designer.cs | 1 - osu!Lyrics/Lyrics.cs | 99 ++---------- osu!Lyrics/Osu.cs | 131 ++++------------ osu!Lyrics/Program.cs | 50 +----- osu!Lyrics/Settings.cs | 17 +-- osu!Lyrics/osu!Lyrics.csproj | 11 +- 11 files changed, 468 insertions(+), 256 deletions(-) create mode 100644 osu!Lyrics/Constants.cs create mode 100644 osu!Lyrics/FileEx.cs create mode 100644 osu!Lyrics/Interop/ExternDll.cs create mode 100644 osu!Lyrics/Interop/NativeMethods.cs create mode 100644 osu!Lyrics/LayeredWindow.cs diff --git a/osu!Lyrics/Constants.cs b/osu!Lyrics/Constants.cs new file mode 100644 index 0000000..0e61461 --- /dev/null +++ b/osu!Lyrics/Constants.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace osu_Lyrics +{ + static class Constants + { + public static readonly string _MutexName = "osu!Lyrics." + Application.ProductVersion; + //public static readonly string _Path = Application.ExecutablePath + ".cfg"; + public static readonly string _Server = Path.Combine(Path.GetTempPath(), "osu!Lyrics.dll"); + public static readonly string _BakExt = ".del"; + } +} diff --git a/osu!Lyrics/FileEx.cs b/osu!Lyrics/FileEx.cs new file mode 100644 index 0000000..440a4c4 --- /dev/null +++ b/osu!Lyrics/FileEx.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace osu_Lyrics +{ + static class FileEx + { + public static void PreDel(string path) + { + try + { + File.Delete(path); + } + catch // running + { + var bak = path + Constants._BakExt; + PostDel(bak); + File.Move(path, bak); + } + } + + public static void Extract(Stream s, string path) + { + PreDel(path); + using (var fs = File.OpenWrite(path)) + { + s.CopyTo(fs); + } + s.Dispose(); + } + + public static void Move(string src, string dst) + { + PreDel(dst); + File.Move(src, dst); + } + + public static void PostDel(string bak) + { + while (File.Exists(bak)) + { + try + { + File.Delete(bak); + } + catch + { + Thread.Sleep(1000); + } + } + } + } +} diff --git a/osu!Lyrics/Interop/ExternDll.cs b/osu!Lyrics/Interop/ExternDll.cs new file mode 100644 index 0000000..ae73fc6 --- /dev/null +++ b/osu!Lyrics/Interop/ExternDll.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Interop +{ + internal static class ExternDll + { + public const string User32 = "user32.dll"; + public const string Gdi32 = "gdi32.dll"; + public const string Kernel32 = "kernel32.dll"; + } +} diff --git a/osu!Lyrics/Interop/NativeMethods.cs b/osu!Lyrics/Interop/NativeMethods.cs new file mode 100644 index 0000000..1fb909c --- /dev/null +++ b/osu!Lyrics/Interop/NativeMethods.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Interop +{ + internal static class NativeMethods + { + [DllImport(ExternDll.User32, SetLastError = true)] + public static extern IntPtr GetDC(IntPtr hWnd); + + [DllImport(ExternDll.Gdi32, SetLastError = true)] + public static extern IntPtr CreateCompatibleDC(IntPtr hDC); + + [DllImport(ExternDll.Gdi32, SetLastError = true)] + public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.User32, SetLastError = true)] + public static extern bool SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte bAlpha, int dwFlags); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.User32, SetLastError = true)] + public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size pSizeDst, IntPtr hdcSrc, ref Point pptSrc, int crKey, ref BLENDFUNCTION pBlend, int dwFlags); + + [StructLayout(LayoutKind.Sequential)] + public class POINT + { + public int x; + public int y; + + public POINT() + { + } + + public POINT(int x, int y) + { + this.x = x; + this.y = y; + } +#if DEBUG + public override string ToString() + { + return "{x=" + x + ", y=" + y + "}"; + } +#endif + } + + [StructLayout(LayoutKind.Sequential)] + public struct BLENDFUNCTION + { + public byte BlendOp; + public byte BlendFlags; + public byte SourceConstantAlpha; + public byte AlphaFormat; + } + + public const int AC_SRC_OVER = 0x00000000; + public const int AC_SRC_ALPHA = 0x00000001; + public const int ULW_COLORKEY = 0x00000001; + public const int ULW_ALPHA = 0x00000002; + public const int ULW_OPAQUE = 0x00000004; + + [DllImport(ExternDll.User32)] + public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.Gdi32, SetLastError = true)] + public static extern bool DeleteObject(IntPtr hObject); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.Gdi32, SetLastError = true)] + public static extern bool DeleteDC(IntPtr hDC); + + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); + + public const int PROCESS_TERMINATE = 0x0001; + public const int PROCESS_CREATE_THREAD = 0x0002; + public const int PROCESS_SET_SESSIONID = 0x0004; + public const int PROCESS_VM_OPERATION = 0x0008; + public const int PROCESS_VM_READ = 0x0010; + public const int PROCESS_VM_WRITE = 0x0020; + public const int PROCESS_DUP_HANDLE = 0x0040; + public const int PROCESS_CREATE_PROCESS = 0x0080; + public const int PROCESS_SET_QUOTA = 0x0100; + public const int PROCESS_SET_INFORMATION = 0x0200; + public const int PROCESS_QUERY_INFORMATION = 0x0400; + public const int PROCESS_QUERY_LIMITED_INFORMATION = 0x1000; + public const int STANDARD_RIGHTS_REQUIRED = 0x000F0000; + public const int SYNCHRONIZE = 0x00100000; + public const int PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF; + + [DllImport(ExternDll.Kernel32, CharSet = CharSet.Auto)] + public static extern IntPtr GetModuleHandle(string lpModuleName); + + [DllImport(ExternDll.Kernel32, CharSet = CharSet.Ansi)] + public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); + + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, int flAllocationType, int flProtect); + + public const int MEM_COMMIT = 0x1000; + public const int MEM_RESERVE = 0x2000; + public const int MEM_RELEASE = 0x8000; + // MEM_DECOMMIT??? + public const int MEM_FREE = 0x10000; + + public const int PAGE_READWRITE = 0x04; + public const int PAGE_READONLY = 0x02; + public const int PAGE_WRITECOPY = 0x08; + public const int PAGE_EXECUTE_READ = 0x20; + public const int PAGE_EXECUTE_READWRITE = 0x40; + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, int dwFreeType); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, uint nSize, out uint lpNumberOfBytesWritten); + + //TODO + [DllImport(ExternDll.Kernel32)] + public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); + + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern int WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds); + + public const uint INFINITE = 0xFFFFFFFF; + + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern uint GlobalSize(IntPtr hMem); + + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern bool CloseHandle(IntPtr hObject); + + //TODO + [DllImport(ExternDll.Kernel32)] + public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName); + + //TODO + [DllImport(ExternDll.Kernel32)] + public static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName); + + [DllImport(ExternDll.User32)] + public static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey); + + [DllImport(ExternDll.User32)] + public static extern IntPtr GetForegroundWindow(); + + [DllImport(ExternDll.User32)] + public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + [DllImport(ExternDll.User32)] + public static extern bool SetForegroundWindow(IntPtr hWnd); + + [DllImport(ExternDll.User32)] + public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); + + public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport(ExternDll.User32)] + public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.User32)] + public static extern bool UnhookWindowsHookEx(IntPtr hhk); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.User32)] + public static extern bool ClientToScreen(IntPtr hWnd, POINT lpPoint); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.User32, SetLastError = true)] + public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int left; + public int top; + public int right; + public int bottom; + + public RECT(int left, int top, int right, int bottom) + { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + public RECT(System.Drawing.Rectangle r) + { + this.left = r.Left; + this.top = r.Top; + this.right = r.Right; + this.bottom = r.Bottom; + } + + public static RECT FromXYWH(int x, int y, int width, int height) + { + return new RECT(x, y, x + width, y + height); + } + + public System.Drawing.Size Size + { + get + { + return new System.Drawing.Size(this.right - this.left, this.bottom - this.top); + } + } + } + + //TODO DELETE + public struct WNDINFO + { + public Point Location; + public Size ClientSize; + } + } +} diff --git a/osu!Lyrics/LayeredWindow.cs b/osu!Lyrics/LayeredWindow.cs new file mode 100644 index 0000000..6fab70b --- /dev/null +++ b/osu!Lyrics/LayeredWindow.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static osu_Lyrics.Interop.NativeMethods; + +namespace osu_Lyrics +{ + [System.ComponentModel.DesignerCategory("code")] + class LayeredWindow : Form + { + protected override CreateParams CreateParams + { + get + { + const int WS_EX_LAYERED = 0x80000; + const int WS_EX_TRANSPARENT = 0x20; + + var cp = base.CreateParams; + cp.ExStyle |= WS_EX_LAYERED | WS_EX_TRANSPARENT; + return cp; + } + } + + public new FormBorderStyle FormBorderStyle { get; } = FormBorderStyle.None; + + public LayeredWindow() : base() + { + base.FormBorderStyle = FormBorderStyle.None; + } + + protected override void OnLoad(EventArgs e) + { + UpdateLayer(); + } + + protected override void OnPaint(PaintEventArgs e) + { + UpdateLayer(); + } + + protected BLENDFUNCTION BlendFunction = new BLENDFUNCTION + { + BlendOp = AC_SRC_OVER, + BlendFlags = 0, + SourceConstantAlpha = 255, + AlphaFormat = AC_SRC_ALPHA + }; + + protected void UpdateLayer() + { + var hScreenDC = GetDC(IntPtr.Zero); + var hDC = CreateCompatibleDC(hScreenDC); + var hBitmap = IntPtr.Zero; + var hOldBitmap = IntPtr.Zero; + + Bitmap bmp = null; + Graphics g = null; + try + { + bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); + g = Graphics.FromImage(bmp); + + Render(g); + hBitmap = bmp.GetHbitmap(Color.FromArgb(0)); + hOldBitmap = SelectObject(hDC, hBitmap); + + var ptDst = Location; + var sizeDst = Size; + var ptSrc = Point.Empty; + UpdateLayeredWindow(Handle, hScreenDC, ref ptDst, ref sizeDst, hDC, ref ptSrc, 0, ref BlendFunction, ULW_ALPHA); + } + catch { } + finally + { + g?.Dispose(); + bmp?.Dispose(); + } + + if (hBitmap != IntPtr.Zero) + { + SelectObject(hDC, hOldBitmap); + DeleteObject(hBitmap); + } + DeleteDC(hDC); + ReleaseDC(IntPtr.Zero, hScreenDC); + } + + public virtual void Render(Graphics g) + { + } + } +} diff --git a/osu!Lyrics/Lyrics.Designer.cs b/osu!Lyrics/Lyrics.Designer.cs index a15c869..146a819 100644 --- a/osu!Lyrics/Lyrics.Designer.cs +++ b/osu!Lyrics/Lyrics.Designer.cs @@ -71,7 +71,6 @@ private void InitializeComponent() // // Lyrics // - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "Lyrics"; this.ShowInTaskbar = false; this.Text = "osu!Lyrics"; diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/Lyrics.cs index eaba26d..d606777 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/Lyrics.cs @@ -13,42 +13,15 @@ using System.Windows.Forms; using osu_Lyrics.Properties; using System.Threading; +using static osu_Lyrics.Interop.NativeMethods; namespace osu_Lyrics { - internal partial class Lyrics : Form + [System.ComponentModel.DesignerCategory("code")] + internal partial class Lyrics : LayeredWindow { #region Lyrics() - [DllImport("user32.dll")] - private static extern IntPtr GetDC(IntPtr hWnd); - - [DllImport("gdi32.dll")] - private static extern IntPtr CreateCompatibleDC(IntPtr hdc); - - [DllImport("gdi32.dll")] - private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj); - - [DllImport("user32.dll")] - private static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, int crKey, ref BLENDFUNCTION pblend, uint dwFlags); - - private struct BLENDFUNCTION - { - public byte BlendOp; - public byte BlendFlags; - public byte SourceConstantAlpha; - public byte AlphaFormat; - } - - [DllImport("user32.dll")] - private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); - - [DllImport("gdi32.dll")] - private static extern bool DeleteObject(IntPtr hObject); - - [DllImport("gdi32.dll")] - private static extern bool DeleteDC(IntPtr hdc); - public static Lyrics Constructor; public Lyrics() @@ -64,77 +37,29 @@ protected override CreateParams CreateParams { get { - const int WS_EX_LAYERED = 0x80000; - const int WS_EX_TRANSPARENT = 0x20; const int WS_EX_NOACTIVATE = 0x8000000; var cp = base.CreateParams; - cp.ExStyle |= WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE; + cp.ExStyle |= WS_EX_NOACTIVATE; return cp; } } - protected override void OnPaint(PaintEventArgs e) - { - const byte AC_SRC_OVER = 0; - const byte AC_SRC_ALPHA = 1; - const uint ULW_ALPHA = 2; - - var hDC = GetDC(IntPtr.Zero); - var hMemDC = CreateCompatibleDC(hDC); - var hBitmap = IntPtr.Zero; - var hOldBitmap = IntPtr.Zero; - Bitmap bmp = null; - Graphics g = null; - try - { - bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); - g = Graphics.FromImage(bmp); - g.SmoothingMode = SmoothingMode.AntiAlias; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; - - DrawLyric(g); - hBitmap = bmp.GetHbitmap(Color.FromArgb(0)); - hOldBitmap = SelectObject(hMemDC, hBitmap); - - var cur = Location; - var size = bmp.Size; - var point = Point.Empty; - var blend = new BLENDFUNCTION - { - BlendOp = AC_SRC_OVER, - BlendFlags = 0, - SourceConstantAlpha = 255, - AlphaFormat = AC_SRC_ALPHA - }; - UpdateLayeredWindow(Handle, hDC, ref cur, ref size, hMemDC, ref point, 0, ref blend, ULW_ALPHA); - } - catch {} - if (g != null) - { - g.Dispose(); - } - if (bmp != null) - { - bmp.Dispose(); - } + public override void Render(Graphics g) + { + g.SmoothingMode = SmoothingMode.AntiAlias; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; - ReleaseDC(IntPtr.Zero, hDC); - if (hBitmap != IntPtr.Zero) - { - SelectObject(hMemDC, hOldBitmap); - DeleteObject(hBitmap); - } - DeleteDC(hMemDC); + DrawLyric(g); } #endregion private void Lyrics_Load(object sender, EventArgs e) { - Notice(Osu.Listen(Osu_Signal) ? Settings._MutexName : "초기화 실패"); + Notice(Osu.Listen(Osu_Signal) ? Constants._MutexName : "초기화 실패"); Osu.HookKeyboard(Osu_KeyDown); } @@ -147,7 +72,7 @@ private async void Lyrics_Shown(object sender, EventArgs e) } while (!Osu.Process.HasExited) { - if (!Osu.Show(true)) + if (Osu.IsForeground()) { var osu = Osu.WindowInfo(); if (!Location.Equals(osu.Location)) diff --git a/osu!Lyrics/Osu.cs b/osu!Lyrics/Osu.cs index eb6f417..02212bb 100644 --- a/osu!Lyrics/Osu.cs +++ b/osu!Lyrics/Osu.cs @@ -11,6 +11,7 @@ using Microsoft.Win32; using System.Linq; using System.Text; +using static osu_Lyrics.Interop.NativeMethods; namespace osu_Lyrics { @@ -58,14 +59,14 @@ public static Process Process #region Show() - [DllImport("user32.dll")] - private static extern IntPtr GetForegroundWindow(); - - [DllImport("user32.dll")] - private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); - - [DllImport("user32.dll")] - private static extern bool SetForegroundWindow(IntPtr hWnd); + public static bool IsForeground() + { + if (GetForegroundWindow() == Process.MainWindowHandle) + { + return true; + } + return Lyrics.Settings?.Visible ?? false; + } ///

/// 창이 활성화되어 있는지 확인하거나 활성화함. @@ -80,35 +81,17 @@ public static bool Show(bool checkOnly = false) { return false; } - if (!checkOnly) - { - ShowWindow(Process.MainWindowHandle, SW_SHOWNORMAL); - SetForegroundWindow(Process.MainWindowHandle); - } - return Lyrics.Settings == null || !Lyrics.Settings.Visible; + ShowWindow(Process.MainWindowHandle, SW_SHOWNORMAL); + SetForegroundWindow(Process.MainWindowHandle); + return !Lyrics.Settings?.Visible ?? true; } #endregion #region HookKeyboard(Action action), UnhookKeyboard() - // DECLARED - //[DllImport("user32.dll")] - //private static extern IntPtr GetForegroundWindow(); - - [DllImport("user32.dll")] - private static extern IntPtr SetWindowsHookEx(int idHook, HOOKPROC lpfn, IntPtr hMod, uint dwThreadId); - - [DllImport("user32.dll")] - private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); - - [DllImport("user32.dll")] - private static extern bool UnhookWindowsHookEx(IntPtr hhk); - - private delegate IntPtr HOOKPROC(int code, IntPtr wParam, IntPtr lParam); - private static IntPtr _hhkk; // hookHandleKeyKeyboard - private static HOOKPROC _hpk; // hookProcKeyboard + private static HookProc _hpk; // hookProcKeyboard private static Func _hak; // hookActionKeyboard public static void HookKeyboard(Func action) @@ -121,7 +104,7 @@ public static void HookKeyboard(Func action) } _hak = action; - _hpk = new HOOKPROC(LowLevelKeyboardProc); + _hpk = new HookProc(LowLevelKeyboardProc); _hhkk = SetWindowsHookEx(WH_KEYBOARD_LL, _hpk, IntPtr.Zero, 0); } @@ -131,7 +114,7 @@ private static IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lPar const int WM_KEYDOWN = 0x100; const int WM_SYSKEYDOWN = 0x104; - if (!Show(true) && nCode == HC_ACTION) + if (IsForeground() && nCode == HC_ACTION) { var state = wParam.ToInt32(); // 설정 중이면 키보드 후킹 안 하기! @@ -154,61 +137,24 @@ public static void UnhookKeyboard() #endregion #region Listen(Action onSignal) - - [DllImport("kernel32.dll")] - private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId); - - [DllImport("kernel32.dll")] - private static extern IntPtr GetModuleHandle(string lpModuleName); - - [DllImport("kernel32.dll")] - private static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); - - [DllImport("kernel32.dll")] - private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint flAllocationType, uint flProtect); - - [DllImport("kernel32.dll")] - private static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint dwFreeType); - - [DllImport("kernel32.dll")] - private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, UIntPtr nSize, UIntPtr lpNumberOfBytesWritten); - - [DllImport("kernel32.dll")] - private static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, UIntPtr dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, UIntPtr lpThreadId); - - [DllImport("kernel32.dll")] - private static extern uint WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds); - - [DllImport("kernel32.dll")] - private static extern UIntPtr GlobalSize(IntPtr hMem); - - [DllImport("kernel32.dll")] - private static extern bool CloseHandle(IntPtr hObject); private static bool InjectDLL(string dllPath) { - const uint PROCESS_ALL_ACCESS = 0x1F0FFF; - const uint MEM_RESERVE = 0x2000; - const uint MEM_COMMIT = 0x1000; - const uint PAGE_READWRITE = 0x04; - const uint INFINITE = 0xFFFFFFFF; - const uint MEM_RELEASE = 0x8000; - - var hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, (uint) Process.Id); + var hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Process.Id); var szFileName = Marshal.StringToHGlobalUni(dllPath); var nFileNameLength = GlobalSize(szFileName); var pParameter = VirtualAllocEx(hProcess, IntPtr.Zero, nFileNameLength, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); - WriteProcessMemory(hProcess, pParameter, szFileName, nFileNameLength, UIntPtr.Zero); + WriteProcessMemory(hProcess, pParameter, szFileName, nFileNameLength, out _); Marshal.FreeHGlobal(szFileName); var pThreadProc = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"); - var hThread = CreateRemoteThread(hProcess, IntPtr.Zero, UIntPtr.Zero, pThreadProc, pParameter, 0, UIntPtr.Zero); + var hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, pThreadProc, pParameter, 0, IntPtr.Zero); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); - VirtualFreeEx(hProcess, pParameter, UIntPtr.Zero, MEM_RELEASE); + VirtualFreeEx(hProcess, pParameter, 0, MEM_RELEASE); CloseHandle(hProcess); @@ -219,9 +165,9 @@ public static bool Listen(Action onSignal) { // dll의 fileVersion을 바탕으로 버전별로 겹치지 않는 경로에 압축 풀기: // 시스템 커널에 이전 버전의 dll이 같은 이름으로 남아있을 수 있음 - Program.Extract(Assembly.GetExecutingAssembly().GetManifestResourceStream("osu_Lyrics.Server.dll"), Settings._Server); - var dest = Settings._Server + "." + FileVersionInfo.GetVersionInfo(Settings._Server).FileVersion; - Program.Move(Settings._Server, dest); + FileEx.Extract(Assembly.GetExecutingAssembly().GetManifestResourceStream("osu_Lyrics.Server.dll"), Constants._Server); + var dest = Constants._Server + "." + FileVersionInfo.GetVersionInfo(Constants._Server).FileVersion; + FileEx.Move(Constants._Server, dest); if (!InjectDLL(dest)) { return false; @@ -247,39 +193,18 @@ public static bool Listen(Action onSignal) #region WindowInfo() - [DllImport("user32.dll")] - private static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint); - - [DllImport("user32.dll")] - private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); - - private struct RECT - { - public int left; - public int top; - public int right; - public int bottom; - } - - public struct WNDINFO - { - public Point Location; - public Size ClientSize; - } - public static WNDINFO WindowInfo() { - var location = Point.Empty; - ClientToScreen(Process.MainWindowHandle, ref location); + var location = new POINT(0, 0); + ClientToScreen(Process.MainWindowHandle, location); - RECT rect; - GetWindowRect(Process.MainWindowHandle, out rect); - var border = location.X - rect.left; - var title = location.Y - rect.top; + GetWindowRect(Process.MainWindowHandle, out RECT rect); + var border = location.x - rect.left; + var title = location.y - rect.top; return new WNDINFO { - Location = location, + Location = new Point(location.x, location.y), ClientSize = new Size(rect.right - rect.left - border * 2, rect.bottom - rect.top - border - title) }; } diff --git a/osu!Lyrics/Program.cs b/osu!Lyrics/Program.cs index 8a03e36..1d98672 100644 --- a/osu!Lyrics/Program.cs +++ b/osu!Lyrics/Program.cs @@ -11,14 +11,13 @@ internal class Program [STAThread] private static void Main() { - bool createdNew; - using (new Mutex(true, Settings._MutexName, out createdNew)) + using (new Mutex(true, Constants._MutexName, out bool createdNew)) { Osu.Show(); if (createdNew) { // 업데이트 전의 파일 삭제 - Task.Run(() => PostDel(Application.ExecutablePath + Settings._BakExt)); + Task.Run(() => FileEx.PostDel(Application.ExecutablePath + Constants._BakExt)); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -27,51 +26,6 @@ private static void Main() } } - public static void PreDel(string path) - { - try - { - File.Delete(path); - } - catch // running - { - var bak = path + Settings._BakExt; - PostDel(bak); - File.Move(path, bak); - } - } - - public static void Extract(Stream s, string path) - { - PreDel(path); - using (var fs = File.OpenWrite(path)) - { - s.CopyTo(fs); - } - s.Dispose(); - } - - public static void Move(string src, string dst) - { - PreDel(dst); - File.Move(src, dst); - } - - public static void PostDel(string bak) - { - while (File.Exists(bak)) - { - try - { - File.Delete(bak); - } - catch - { - Thread.Sleep(1000); - } - } - } - public static int IntB(byte[] buff, int offset, int len = 4) { if (len-- > 4) diff --git a/osu!Lyrics/Settings.cs b/osu!Lyrics/Settings.cs index eb88e07..ce6fdce 100644 --- a/osu!Lyrics/Settings.cs +++ b/osu!Lyrics/Settings.cs @@ -9,6 +9,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; +using static osu_Lyrics.Interop.NativeMethods; namespace osu_Lyrics { @@ -21,19 +22,7 @@ public Settings() private bool Loaded; - [DllImport("kernel32.dll")] - private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName); - - [DllImport("kernel32.dll")] - private static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName); - - [DllImport("user32.dll")] - private static extern short GetAsyncKeyState(Keys vKey); - - public static readonly string _MutexName = "osu!Lyrics." + Application.ProductVersion; public static readonly string _Path = Application.ExecutablePath + ".cfg"; - public static readonly string _Server = Path.Combine(Path.GetTempPath(), "osu!Lyrics.dll"); - public static readonly string _BakExt = ".del"; private static string Get(string section, string key) { @@ -878,11 +867,11 @@ private static void UpdateProgram(bool restartOsu) } ms.Seek(0, SeekOrigin.Begin); - Program.Extract(new DeflateStream(ms, CompressionMode.Decompress), update); + FileEx.Extract(new DeflateStream(ms, CompressionMode.Decompress), update); } // 윈도우는 실행 중인 파일 삭제는 못 하지만 이름 변경은 가능 - File.Move(current, current + _BakExt); + File.Move(current, current + Constants._BakExt); File.Move(update, current); Application.Exit(); diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 437ed5f..0af8c7f 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -43,17 +43,21 @@ + + + + + + - - Form - + Lyrics.cs @@ -74,6 +78,7 @@ Settings.cs + From ee7499ab6a70f9cc23ebec345eec16e4bbaea143 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Wed, 15 Nov 2017 09:52:11 +0900 Subject: [PATCH 19/48] =?UTF-8?q?FileEx=EB=A5=BC=20IO=20=EB=84=A4=EC=9E=84?= =?UTF-8?q?=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/{ => IO}/FileEx.cs | 2 +- osu!Lyrics/Osu.cs | 4 ++-- osu!Lyrics/Program.cs | 2 +- osu!Lyrics/Settings.cs | 2 +- osu!Lyrics/osu!Lyrics.csproj | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) rename osu!Lyrics/{ => IO}/FileEx.cs (98%) diff --git a/osu!Lyrics/FileEx.cs b/osu!Lyrics/IO/FileEx.cs similarity index 98% rename from osu!Lyrics/FileEx.cs rename to osu!Lyrics/IO/FileEx.cs index 440a4c4..35d0cc4 100644 --- a/osu!Lyrics/FileEx.cs +++ b/osu!Lyrics/IO/FileEx.cs @@ -6,7 +6,7 @@ using System.Threading; using System.Threading.Tasks; -namespace osu_Lyrics +namespace osu_Lyrics.IO { static class FileEx { diff --git a/osu!Lyrics/Osu.cs b/osu!Lyrics/Osu.cs index 02212bb..899fd8b 100644 --- a/osu!Lyrics/Osu.cs +++ b/osu!Lyrics/Osu.cs @@ -165,9 +165,9 @@ public static bool Listen(Action onSignal) { // dll의 fileVersion을 바탕으로 버전별로 겹치지 않는 경로에 압축 풀기: // 시스템 커널에 이전 버전의 dll이 같은 이름으로 남아있을 수 있음 - FileEx.Extract(Assembly.GetExecutingAssembly().GetManifestResourceStream("osu_Lyrics.Server.dll"), Constants._Server); + IO.FileEx.Extract(Assembly.GetExecutingAssembly().GetManifestResourceStream("osu_Lyrics.Server.dll"), Constants._Server); var dest = Constants._Server + "." + FileVersionInfo.GetVersionInfo(Constants._Server).FileVersion; - FileEx.Move(Constants._Server, dest); + IO.FileEx.Move(Constants._Server, dest); if (!InjectDLL(dest)) { return false; diff --git a/osu!Lyrics/Program.cs b/osu!Lyrics/Program.cs index 1d98672..273c711 100644 --- a/osu!Lyrics/Program.cs +++ b/osu!Lyrics/Program.cs @@ -17,7 +17,7 @@ private static void Main() if (createdNew) { // 업데이트 전의 파일 삭제 - Task.Run(() => FileEx.PostDel(Application.ExecutablePath + Constants._BakExt)); + Task.Run(() => IO.FileEx.PostDel(Application.ExecutablePath + Constants._BakExt)); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); diff --git a/osu!Lyrics/Settings.cs b/osu!Lyrics/Settings.cs index ce6fdce..80d783c 100644 --- a/osu!Lyrics/Settings.cs +++ b/osu!Lyrics/Settings.cs @@ -867,7 +867,7 @@ private static void UpdateProgram(bool restartOsu) } ms.Seek(0, SeekOrigin.Begin); - FileEx.Extract(new DeflateStream(ms, CompressionMode.Decompress), update); + IO.FileEx.Extract(new DeflateStream(ms, CompressionMode.Decompress), update); } // 윈도우는 실행 중인 파일 삭제는 못 하지만 이름 변경은 가능 diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 0af8c7f..59e868a 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -53,7 +53,7 @@ - + From 3a343ed93fc330c7875cc4cb01d0dffa5b76092c Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Wed, 15 Nov 2017 10:46:51 +0900 Subject: [PATCH 20/48] =?UTF-8?q?NativeMethods=20=EC=A0=95=EB=A6=AC,=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Interop/NativeMethods.cs | 94 +++++------------------------ osu!Lyrics/LayeredWindow.cs | 69 ++++++++++----------- osu!Lyrics/Lyrics.cs | 11 ++-- osu!Lyrics/Osu.cs | 25 ++++---- 4 files changed, 69 insertions(+), 130 deletions(-) diff --git a/osu!Lyrics/Interop/NativeMethods.cs b/osu!Lyrics/Interop/NativeMethods.cs index 1fb909c..17a3aaf 100644 --- a/osu!Lyrics/Interop/NativeMethods.cs +++ b/osu!Lyrics/Interop/NativeMethods.cs @@ -10,6 +10,10 @@ namespace osu_Lyrics.Interop { internal static class NativeMethods { + public const int WS_EX_TRANSPARENT = 0x00000020; + public const int WS_EX_LAYERED = 0x00080000; + public const int WS_EX_NOACTIVATE = 0x08000000; + [DllImport(ExternDll.User32, SetLastError = true)] public static extern IntPtr GetDC(IntPtr hWnd); @@ -27,29 +31,6 @@ internal static class NativeMethods [DllImport(ExternDll.User32, SetLastError = true)] public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size pSizeDst, IntPtr hdcSrc, ref Point pptSrc, int crKey, ref BLENDFUNCTION pBlend, int dwFlags); - [StructLayout(LayoutKind.Sequential)] - public class POINT - { - public int x; - public int y; - - public POINT() - { - } - - public POINT(int x, int y) - { - this.x = x; - this.y = y; - } -#if DEBUG - public override string ToString() - { - return "{x=" + x + ", y=" + y + "}"; - } -#endif - } - [StructLayout(LayoutKind.Sequential)] public struct BLENDFUNCTION { @@ -59,8 +40,8 @@ public struct BLENDFUNCTION public byte AlphaFormat; } - public const int AC_SRC_OVER = 0x00000000; - public const int AC_SRC_ALPHA = 0x00000001; + public const int AC_SRC_OVER = 0x00; + public const int AC_SRC_ALPHA = 0x01; public const int ULW_COLORKEY = 0x00000001; public const int ULW_ALPHA = 0x00000002; public const int ULW_OPAQUE = 0x00000004; @@ -104,15 +85,17 @@ public struct BLENDFUNCTION [DllImport(ExternDll.Kernel32, SetLastError = true)] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, int flAllocationType, int flProtect); - public const int MEM_COMMIT = 0x1000; - public const int MEM_RESERVE = 0x2000; - public const int MEM_RELEASE = 0x8000; - // MEM_DECOMMIT??? - public const int MEM_FREE = 0x10000; + public const int MEM_COMMIT = 0x00001000; + public const int MEM_RESERVE = 0x00002000; + public const int MEM_DECOMMIT = 0x00004000; + public const int MEM_RELEASE = 0x00008000; + public const int MEM_FREE = 0x00010000; - public const int PAGE_READWRITE = 0x04; + public const int PAGE_NOACCESS = 0x01; public const int PAGE_READONLY = 0x02; + public const int PAGE_READWRITE = 0x04; public const int PAGE_WRITECOPY = 0x08; + public const int PAGE_EXECUTE = 0x10; public const int PAGE_EXECUTE_READ = 0x20; public const int PAGE_EXECUTE_READWRITE = 0x40; @@ -173,55 +156,10 @@ public struct BLENDFUNCTION [return: MarshalAs(UnmanagedType.Bool)] [DllImport(ExternDll.User32)] - public static extern bool ClientToScreen(IntPtr hWnd, POINT lpPoint); + public static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint); [return: MarshalAs(UnmanagedType.Bool)] [DllImport(ExternDll.User32, SetLastError = true)] - public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); - - [StructLayout(LayoutKind.Sequential)] - public struct RECT - { - public int left; - public int top; - public int right; - public int bottom; - - public RECT(int left, int top, int right, int bottom) - { - this.left = left; - this.top = top; - this.right = right; - this.bottom = bottom; - } - - public RECT(System.Drawing.Rectangle r) - { - this.left = r.Left; - this.top = r.Top; - this.right = r.Right; - this.bottom = r.Bottom; - } - - public static RECT FromXYWH(int x, int y, int width, int height) - { - return new RECT(x, y, x + width, y + height); - } - - public System.Drawing.Size Size - { - get - { - return new System.Drawing.Size(this.right - this.left, this.bottom - this.top); - } - } - } - - //TODO DELETE - public struct WNDINFO - { - public Point Location; - public Size ClientSize; - } + public static extern bool GetClientRect(IntPtr hWnd, out Rectangle lpRect); } } diff --git a/osu!Lyrics/LayeredWindow.cs b/osu!Lyrics/LayeredWindow.cs index 6fab70b..da94949 100644 --- a/osu!Lyrics/LayeredWindow.cs +++ b/osu!Lyrics/LayeredWindow.cs @@ -17,32 +17,44 @@ protected override CreateParams CreateParams { get { - const int WS_EX_LAYERED = 0x80000; - const int WS_EX_TRANSPARENT = 0x20; - var cp = base.CreateParams; cp.ExStyle |= WS_EX_LAYERED | WS_EX_TRANSPARENT; return cp; } } - public new FormBorderStyle FormBorderStyle { get; } = FormBorderStyle.None; + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + UpdateLayer(); + } - public LayeredWindow() : base() + protected override void OnPaint(PaintEventArgs e) { - base.FormBorderStyle = FormBorderStyle.None; + base.OnPaint(e); + UpdateLayer(); } - protected override void OnLoad(EventArgs e) + private Point DestinationPoint = Point.Empty; + + protected override void OnLocationChanged(EventArgs e) { + base.OnLocationChanged(e); + DestinationPoint = Location; UpdateLayer(); } - protected override void OnPaint(PaintEventArgs e) + private Size DestinationSize = Size.Empty; + + protected override void OnSizeChanged(EventArgs e) { + base.OnSizeChanged(e); + DestinationSize = Size; UpdateLayer(); } + protected Point SourcePoint = Point.Empty; + protected BLENDFUNCTION BlendFunction = new BLENDFUNCTION { BlendOp = AC_SRC_OVER, @@ -55,43 +67,32 @@ protected void UpdateLayer() { var hScreenDC = GetDC(IntPtr.Zero); var hDC = CreateCompatibleDC(hScreenDC); - var hBitmap = IntPtr.Zero; - var hOldBitmap = IntPtr.Zero; - Bitmap bmp = null; - Graphics g = null; try { - bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); - g = Graphics.FromImage(bmp); + var hBitmap = IntPtr.Zero; + using (var bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb)) + using (var g = Graphics.FromImage(bmp)) + { + Render(g); + hBitmap = bmp.GetHbitmap(Color.FromArgb(0)); + } + var hOldBitmap = SelectObject(hDC, hBitmap); - Render(g); - hBitmap = bmp.GetHbitmap(Color.FromArgb(0)); - hOldBitmap = SelectObject(hDC, hBitmap); + UpdateLayeredWindow(Handle, hScreenDC, ref DestinationPoint, ref DestinationSize, hDC, ref SourcePoint, 0, ref BlendFunction, ULW_ALPHA); - var ptDst = Location; - var sizeDst = Size; - var ptSrc = Point.Empty; - UpdateLayeredWindow(Handle, hScreenDC, ref ptDst, ref sizeDst, hDC, ref ptSrc, 0, ref BlendFunction, ULW_ALPHA); + if (hBitmap != IntPtr.Zero) + { + SelectObject(hDC, hOldBitmap); + DeleteObject(hBitmap); + } } catch { } - finally - { - g?.Dispose(); - bmp?.Dispose(); - } - if (hBitmap != IntPtr.Zero) - { - SelectObject(hDC, hOldBitmap); - DeleteObject(hBitmap); - } DeleteDC(hDC); ReleaseDC(IntPtr.Zero, hScreenDC); } - public virtual void Render(Graphics g) - { - } + public virtual void Render(Graphics g) { } } } diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/Lyrics.cs index d606777..d19293c 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/Lyrics.cs @@ -37,8 +37,6 @@ protected override CreateParams CreateParams { get { - const int WS_EX_NOACTIVATE = 0x8000000; - var cp = base.CreateParams; cp.ExStyle |= WS_EX_NOACTIVATE; return cp; @@ -74,14 +72,13 @@ private async void Lyrics_Shown(object sender, EventArgs e) { if (Osu.IsForeground()) { - var osu = Osu.WindowInfo(); - if (!Location.Equals(osu.Location)) + if (!Location.Equals(Osu.Location)) { - Location = osu.Location; + Location = Osu.Location; } - if (!ClientSize.Equals(osu.ClientSize)) + if (!Size.Equals(Osu.ClientSize)) { - ClientSize = osu.ClientSize; + Size = Osu.ClientSize; Settings.DrawingOrigin = Point.Empty; } if (Settings == null) diff --git a/osu!Lyrics/Osu.cs b/osu!Lyrics/Osu.cs index 899fd8b..1224be9 100644 --- a/osu!Lyrics/Osu.cs +++ b/osu!Lyrics/Osu.cs @@ -193,20 +193,23 @@ public static bool Listen(Action onSignal) #region WindowInfo() - public static WNDINFO WindowInfo() + public static Point Location { - var location = new POINT(0, 0); - ClientToScreen(Process.MainWindowHandle, location); - - GetWindowRect(Process.MainWindowHandle, out RECT rect); - var border = location.x - rect.left; - var title = location.y - rect.top; + get + { + var location = Point.Empty; + ClientToScreen(Process.MainWindowHandle, ref location); + return location; + } + } - return new WNDINFO + public static Size ClientSize + { + get { - Location = new Point(location.x, location.y), - ClientSize = new Size(rect.right - rect.left - border * 2, rect.bottom - rect.top - border - title) - }; + GetClientRect(Process.MainWindowHandle, out Rectangle rect); + return rect.Size; + } } #endregion From 1b0de174ebdc9a6f1c0b5717a1b0051522b8564c Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Wed, 15 Nov 2017 13:59:27 +0900 Subject: [PATCH 21/48] =?UTF-8?q?Lyrics=EC=97=90=EC=84=9C=20GhostLayeredWi?= =?UTF-8?q?ndow=20=EC=B6=94=EC=B6=9C,=20=EB=84=A4=EC=9E=84=EC=8A=A4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=ED=95=A0=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Forms/GhostLayeredWindow.cs | 28 +++++++++++++++++++++++++ osu!Lyrics/{ => Forms}/LayeredWindow.cs | 4 ++-- osu!Lyrics/{ => Interop}/Osu.cs | 12 +++++++++-- osu!Lyrics/Lyrics.Designer.cs | 1 - osu!Lyrics/Lyrics.cs | 20 +++++------------- osu!Lyrics/Program.cs | 2 +- osu!Lyrics/Settings.cs | 2 +- osu!Lyrics/osu!Lyrics.csproj | 6 ++++-- 8 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 osu!Lyrics/Forms/GhostLayeredWindow.cs rename osu!Lyrics/{ => Forms}/LayeredWindow.cs (96%) rename osu!Lyrics/{ => Interop}/Osu.cs (96%) diff --git a/osu!Lyrics/Forms/GhostLayeredWindow.cs b/osu!Lyrics/Forms/GhostLayeredWindow.cs new file mode 100644 index 0000000..1edb2f6 --- /dev/null +++ b/osu!Lyrics/Forms/GhostLayeredWindow.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static osu_Lyrics.Interop.NativeMethods; + +namespace osu_Lyrics.Forms +{ + class GhostLayeredWindow : LayeredWindow + { + public GhostLayeredWindow() : base() + { + ShowInTaskbar = false; + } + + protected override CreateParams CreateParams + { + get + { + var cp = base.CreateParams; + cp.ExStyle |= WS_EX_NOACTIVATE | WS_EX_TRANSPARENT; + return cp; + } + } + } +} diff --git a/osu!Lyrics/LayeredWindow.cs b/osu!Lyrics/Forms/LayeredWindow.cs similarity index 96% rename from osu!Lyrics/LayeredWindow.cs rename to osu!Lyrics/Forms/LayeredWindow.cs index da94949..7bb5935 100644 --- a/osu!Lyrics/LayeredWindow.cs +++ b/osu!Lyrics/Forms/LayeredWindow.cs @@ -8,7 +8,7 @@ using System.Windows.Forms; using static osu_Lyrics.Interop.NativeMethods; -namespace osu_Lyrics +namespace osu_Lyrics.Forms { [System.ComponentModel.DesignerCategory("code")] class LayeredWindow : Form @@ -18,7 +18,7 @@ protected override CreateParams CreateParams get { var cp = base.CreateParams; - cp.ExStyle |= WS_EX_LAYERED | WS_EX_TRANSPARENT; + cp.ExStyle |= WS_EX_LAYERED; return cp; } } diff --git a/osu!Lyrics/Osu.cs b/osu!Lyrics/Interop/Osu.cs similarity index 96% rename from osu!Lyrics/Osu.cs rename to osu!Lyrics/Interop/Osu.cs index 1224be9..38d3298 100644 --- a/osu!Lyrics/Osu.cs +++ b/osu!Lyrics/Interop/Osu.cs @@ -13,7 +13,7 @@ using System.Text; using static osu_Lyrics.Interop.NativeMethods; -namespace osu_Lyrics +namespace osu_Lyrics.Interop { internal class Osu { @@ -193,7 +193,7 @@ public static bool Listen(Action onSignal) #region WindowInfo() - public static Point Location + public static Point ClientLocation { get { @@ -212,6 +212,14 @@ public static Size ClientSize } } + public static Rectangle ClientBounds + { + get + { + return new Rectangle(ClientLocation, ClientSize); + } + } + #endregion } } \ No newline at end of file diff --git a/osu!Lyrics/Lyrics.Designer.cs b/osu!Lyrics/Lyrics.Designer.cs index 146a819..b7858dd 100644 --- a/osu!Lyrics/Lyrics.Designer.cs +++ b/osu!Lyrics/Lyrics.Designer.cs @@ -72,7 +72,6 @@ private void InitializeComponent() // Lyrics // this.Name = "Lyrics"; - this.ShowInTaskbar = false; this.Text = "osu!Lyrics"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Lyrics_FormClosing); this.Load += new System.EventHandler(this.Lyrics_Load); diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/Lyrics.cs index d19293c..a2fbbf1 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/Lyrics.cs @@ -14,11 +14,12 @@ using osu_Lyrics.Properties; using System.Threading; using static osu_Lyrics.Interop.NativeMethods; +using osu_Lyrics.Interop; +using osu_Lyrics.Forms; namespace osu_Lyrics { - [System.ComponentModel.DesignerCategory("code")] - internal partial class Lyrics : LayeredWindow + internal partial class Lyrics : GhostLayeredWindow { #region Lyrics() @@ -33,17 +34,6 @@ public Lyrics() InitializeComponent(); } - protected override CreateParams CreateParams - { - get - { - var cp = base.CreateParams; - cp.ExStyle |= WS_EX_NOACTIVATE; - return cp; - } - } - - public override void Render(Graphics g) { g.SmoothingMode = SmoothingMode.AntiAlias; @@ -72,9 +62,9 @@ private async void Lyrics_Shown(object sender, EventArgs e) { if (Osu.IsForeground()) { - if (!Location.Equals(Osu.Location)) + if (!Location.Equals(Osu.ClientLocation)) { - Location = Osu.Location; + Location = Osu.ClientLocation; } if (!Size.Equals(Osu.ClientSize)) { diff --git a/osu!Lyrics/Program.cs b/osu!Lyrics/Program.cs index 273c711..dad5dd2 100644 --- a/osu!Lyrics/Program.cs +++ b/osu!Lyrics/Program.cs @@ -13,7 +13,7 @@ private static void Main() { using (new Mutex(true, Constants._MutexName, out bool createdNew)) { - Osu.Show(); + Interop.Osu.Show(); if (createdNew) { // 업데이트 전의 파일 삭제 diff --git a/osu!Lyrics/Settings.cs b/osu!Lyrics/Settings.cs index 80d783c..492344f 100644 --- a/osu!Lyrics/Settings.cs +++ b/osu!Lyrics/Settings.cs @@ -877,7 +877,7 @@ private static void UpdateProgram(bool restartOsu) Application.Exit(); if (restartOsu) { - Osu.Process.Kill(); + Interop.Osu.Process.Kill(); } Process.Start(current); } diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 59e868a..75cdad7 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -53,9 +53,10 @@ + - + @@ -63,7 +64,7 @@ - + @@ -92,6 +93,7 @@ + copy /y "$(SolutionDir)Server\bin\$(ConfigurationName)\Server.dll" "$(ProjectDir)" From 0038bdbb0ee7dd03372e95a614d9488162a51c87 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Wed, 15 Nov 2017 20:51:30 +0900 Subject: [PATCH 22/48] =?UTF-8?q?=EB=94=94=EC=BD=94=EB=93=9C=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=20Formats=20=EB=84=A4=EC=9E=84?= =?UTF-8?q?=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4=20=ED=95=A0=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Beatmap.cs | 54 ------- .../{AudioHash.cs => Formats/AudioDecoder.cs} | 8 +- osu!Lyrics/Formats/BeatmapDecoder.cs | 72 ++++++++++ .../MpegDecoder.cs} | 4 +- .../OggDecoder.cs} | 4 +- osu!Lyrics/Formats/OsuLegacyDecoder.cs | 136 ++++++++++++++++++ osu!Lyrics/Interop/NativeMethods.cs | 4 - osu!Lyrics/Lyrics.cs | 5 +- osu!Lyrics/{ => Models}/Audio.cs | 12 +- osu!Lyrics/Models/Beatmap.cs | 28 ++++ osu!Lyrics/{ => Models}/Lyric.cs | 2 +- osu!Lyrics/osu!Lyrics.csproj | 16 ++- 12 files changed, 266 insertions(+), 79 deletions(-) delete mode 100644 osu!Lyrics/Beatmap.cs rename osu!Lyrics/{AudioHash.cs => Formats/AudioDecoder.cs} (83%) create mode 100644 osu!Lyrics/Formats/BeatmapDecoder.cs rename osu!Lyrics/{AudioHash.Mpeg.cs => Formats/MpegDecoder.cs} (96%) rename osu!Lyrics/{AudioHash.Ogg.cs => Formats/OggDecoder.cs} (93%) create mode 100644 osu!Lyrics/Formats/OsuLegacyDecoder.cs rename osu!Lyrics/{ => Models}/Audio.cs (61%) create mode 100644 osu!Lyrics/Models/Beatmap.cs rename osu!Lyrics/{ => Models}/Lyric.cs (95%) diff --git a/osu!Lyrics/Beatmap.cs b/osu!Lyrics/Beatmap.cs deleted file mode 100644 index 71a52bd..0000000 --- a/osu!Lyrics/Beatmap.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.IO; - -namespace osu_Lyrics -{ - internal class Beatmap - { - public string Artist { get; private set; } - public string ArtistUnicode { get; private set; } - public string Title { get; private set; } - public string TitleUnicode { get; private set; } - - public Beatmap() {} - - public Beatmap(string osu) - { - var currentSection = ""; - foreach (var line in osu.Replace("\r\n", "\n").Replace('\r', '\n').Split('\n')) - { - // 주석 - if (line.StartsWith("//")) - { - continue; - } - - if (line.StartsWith("[")) - { - currentSection = line.Substring(1, line.IndexOf("]") - 1); - continue; - } - - if (currentSection == "Metadata") - { - var pair = line.Split(new[] { ':' }, 2); - // 빈 줄인지 검사.. - if (pair.Length != 2) - { - continue; - } - // if (key in this): from osu!Preview - var property = this.GetType().GetProperty(pair[0].Trim()); - if (property != null) - { - property.SetValue(this, pair[1].Trim()); - } - } - } - } - - public static Beatmap Load(string path) - { - return new Beatmap(File.ReadAllText(path)); - } - } -} diff --git a/osu!Lyrics/AudioHash.cs b/osu!Lyrics/Formats/AudioDecoder.cs similarity index 83% rename from osu!Lyrics/AudioHash.cs rename to osu!Lyrics/Formats/AudioDecoder.cs index 778c812..8a854c9 100644 --- a/osu!Lyrics/AudioHash.cs +++ b/osu!Lyrics/Formats/AudioDecoder.cs @@ -3,9 +3,9 @@ using System.Linq; using System.Security.Cryptography; -namespace osu_Lyrics +namespace osu_Lyrics.IO { - internal class AudioHash + internal class AudioDecoder { protected long RawPosition = 0; @@ -25,8 +25,8 @@ public static string Load(string path) { var buff = new byte[4]; var mediaType = Program.IntB(buff, 0, fs.Read(buff, 0, 4)) == 0x4F676753 ? // "OggS" - (AudioHash) new Ogg(fs) : - (AudioHash) new Mpeg(fs); + (AudioDecoder) new Formats.Ogg(fs) : + (AudioDecoder) new Formats.Mpeg(fs); return mediaType.Hash; } } diff --git a/osu!Lyrics/Formats/BeatmapDecoder.cs b/osu!Lyrics/Formats/BeatmapDecoder.cs new file mode 100644 index 0000000..34919eb --- /dev/null +++ b/osu!Lyrics/Formats/BeatmapDecoder.cs @@ -0,0 +1,72 @@ +using osu_Lyrics.Models; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Formats +{ + abstract class BeatmapDecoder + { + private static readonly List, Type>> decoders = default; + + static BeatmapDecoder() + { + OsuLegacyDecoder.Register(); + } + + public static BeatmapDecoder GetDecoder(StreamReader stream) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + string line; + do + { + line = stream.ReadLine()?.Trim(); + } + while (line != null && line.Length == 0); + + Type decoder = null; + if (line != null) + { + decoder = decoders.FirstOrDefault(t => t.Item1.Invoke(line))?.Item2; + } + + if (line == null || decoder == null) + { + throw new IOException(@"Unknown file format"); + } + return (BeatmapDecoder)Activator.CreateInstance(decoder, line); + } + + protected static void AddDecoder(Predicate predict) where T : BeatmapDecoder + { + decoders.Add(new Tuple, Type>(predict, typeof(T))); + } + + public virtual Beatmap Decode(StreamReader stream) + { + return ParseFile(stream); + } + + public virtual void Decode(StreamReader stream, Beatmap beatmap) + { + ParseFile(stream, beatmap); + } + + protected virtual Beatmap ParseFile(StreamReader stream) + { + var beatmap = new Beatmap(); + + ParseFile(stream, beatmap); + return beatmap; + } + + protected abstract void ParseFile(StreamReader stream, Beatmap beatmap); + } +} diff --git a/osu!Lyrics/AudioHash.Mpeg.cs b/osu!Lyrics/Formats/MpegDecoder.cs similarity index 96% rename from osu!Lyrics/AudioHash.Mpeg.cs rename to osu!Lyrics/Formats/MpegDecoder.cs index c0476ee..8d479db 100644 --- a/osu!Lyrics/AudioHash.Mpeg.cs +++ b/osu!Lyrics/Formats/MpegDecoder.cs @@ -1,8 +1,8 @@ using System.IO; -namespace osu_Lyrics +namespace osu_Lyrics.Formats { - internal class Mpeg : AudioHash + internal class Mpeg : IO.AudioDecoder { public Mpeg(Stream s) { diff --git a/osu!Lyrics/AudioHash.Ogg.cs b/osu!Lyrics/Formats/OggDecoder.cs similarity index 93% rename from osu!Lyrics/AudioHash.Ogg.cs rename to osu!Lyrics/Formats/OggDecoder.cs index 495d3f5..22a2f56 100644 --- a/osu!Lyrics/AudioHash.Ogg.cs +++ b/osu!Lyrics/Formats/OggDecoder.cs @@ -1,8 +1,8 @@ using System.IO; -namespace osu_Lyrics +namespace osu_Lyrics.Formats { - internal class Ogg : AudioHash + internal class Ogg : IO.AudioDecoder { public Ogg(Stream s) { diff --git a/osu!Lyrics/Formats/OsuLegacyDecoder.cs b/osu!Lyrics/Formats/OsuLegacyDecoder.cs new file mode 100644 index 0000000..2afb04c --- /dev/null +++ b/osu!Lyrics/Formats/OsuLegacyDecoder.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using osu_Lyrics.Models; + +namespace osu_Lyrics.Formats +{ + class OsuLegacyDecoder : BeatmapDecoder + { + public static void Register() + { + AddDecoder(header => header.StartsWith(@"osu file format v")); + } + + public OsuLegacyDecoder() + { + } + + public OsuLegacyDecoder(string header) + { + } + + private enum Section + { + None, + General, + Editor, + Metadata, + Difficulty, + Events, + TimingPoints, + Colours, + HitObjects, + Variables, + } + + private void handleMetadata(Beatmap beatmap, string line) + { + if (beatmap == null) + { + throw new ArgumentNullException(nameof(beatmap)); + } + if (line == null) + { + throw new ArgumentNullException(nameof(line)); + } + + var pair = splitKeyVal(line, ':'); + + switch (pair.Key) + { + case @"Title": + beatmap.Title = pair.Value; + break; + case @"TitleUnicode": + beatmap.TitleUnicode = pair.Value; + break; + case @"Artist": + beatmap.Artist = pair.Value; + break; + case @"ArtistUnicode": + beatmap.ArtistUnicode = pair.Value; + break; + case @"Creator": + beatmap.AuthorString = pair.Value; + break; + case @"Source": + beatmap.Source = pair.Value; + break; + case @"Tags": + beatmap.Tags = pair.Value; + break; + } + } + + protected override void ParseFile(StreamReader stream, Beatmap beatmap) + { + if (beatmap == null) + { + throw new ArgumentNullException(nameof(beatmap)); + } + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + var section = Section.None; + + string line; + while ((line = stream.ReadLine()) != null) + { + if (string.IsNullOrWhiteSpace(line) + || line.StartsWith(@"//")) + { + continue; + } + + if (line.StartsWith(@"[") && line.EndsWith(@"]")) + { + if (!Enum.TryParse(line.Substring(1, line.Length - 2), out section)) + { + //throw new InvalidDataException($@"Unknown osu section {line}"); + section = Section.None; + } + continue; + } + + switch (section) + { + case Section.Metadata: + handleMetadata(beatmap, line); + break; + } + } + } + + private KeyValuePair splitKeyVal(string line, char separator) + { + if (line == null) + { + throw new ArgumentNullException(nameof(line)); + } + + var split = line.Trim().Split(new[] { separator }, 2); + + return new KeyValuePair + ( + split[0].Trim(), + split.Length > 1 ? split[1].Trim() : string.Empty + ); + } + } +} diff --git a/osu!Lyrics/Interop/NativeMethods.cs b/osu!Lyrics/Interop/NativeMethods.cs index 17a3aaf..1a89e1c 100644 --- a/osu!Lyrics/Interop/NativeMethods.cs +++ b/osu!Lyrics/Interop/NativeMethods.cs @@ -23,10 +23,6 @@ internal static class NativeMethods [DllImport(ExternDll.Gdi32, SetLastError = true)] public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport(ExternDll.User32, SetLastError = true)] - public static extern bool SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte bAlpha, int dwFlags); - [return: MarshalAs(UnmanagedType.Bool)] [DllImport(ExternDll.User32, SetLastError = true)] public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size pSizeDst, IntPtr hdcSrc, ref Point pptSrc, int crKey, ref BLENDFUNCTION pBlend, int dwFlags); diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/Lyrics.cs index a2fbbf1..8ef1333 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/Lyrics.cs @@ -7,15 +7,14 @@ using System.IO; using System.Linq; using System.Net; -using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using osu_Lyrics.Properties; using System.Threading; -using static osu_Lyrics.Interop.NativeMethods; using osu_Lyrics.Interop; using osu_Lyrics.Forms; +using osu_Lyrics.Models; namespace osu_Lyrics { @@ -56,7 +55,7 @@ private async void Lyrics_Shown(object sender, EventArgs e) // 초기 설정을 위해 대화 상자 열기 if (!File.Exists(Settings._Path)) { - Task.Run(() => Invoke(new MethodInvoker(menuSetting.PerformClick))); + BeginInvoke(new MethodInvoker(menuSetting.PerformClick)); } while (!Osu.Process.HasExited) { diff --git a/osu!Lyrics/Audio.cs b/osu!Lyrics/Models/Audio.cs similarity index 61% rename from osu!Lyrics/Audio.cs rename to osu!Lyrics/Models/Audio.cs index da473e0..14c79d5 100644 --- a/osu!Lyrics/Audio.cs +++ b/osu!Lyrics/Models/Audio.cs @@ -1,4 +1,7 @@ -namespace osu_Lyrics +using osu_Lyrics.Formats; +using System.IO; + +namespace osu_Lyrics.Models { internal class Audio { @@ -18,12 +21,15 @@ public Audio(string path, string beatmapPath) : this() this.Path = path; try { - this.Hash = AudioHash.Load(path); + this.Hash = IO.AudioDecoder.Load(path); } catch {} try { - this.Beatmap = Beatmap.Load(beatmapPath); + using (var sr = new StreamReader(beatmapPath)) + { + this.Beatmap = BeatmapDecoder.GetDecoder(sr)?.Decode(sr); + } } catch {} } diff --git a/osu!Lyrics/Models/Beatmap.cs b/osu!Lyrics/Models/Beatmap.cs new file mode 100644 index 0000000..cd9ec83 --- /dev/null +++ b/osu!Lyrics/Models/Beatmap.cs @@ -0,0 +1,28 @@ +using System.IO; + +namespace osu_Lyrics.Models +{ + internal class Beatmap + { + public string Title { get; set; } + public string TitleUnicode { get; set; } + public string Artist { get; set; } + public string ArtistUnicode { get; set; } + public string AuthorString { get; set; } + public string Source { get; set; } + public string Tags { get; set; } + public int PreviewTime { get; set; } + public string AudioFile { get; set; } + public string BackgroundFile { get; set; } + + public Beatmap(Beatmap original = null) + { + if (original == null) + { + Title = @"Unknown"; + Artist = @"Unknown"; + AuthorString = @"Unknown Creator"; + } + } + } +} diff --git a/osu!Lyrics/Lyric.cs b/osu!Lyrics/Models/Lyric.cs similarity index 95% rename from osu!Lyrics/Lyric.cs rename to osu!Lyrics/Models/Lyric.cs index 3cc6f8c..ecc6e81 100644 --- a/osu!Lyrics/Lyric.cs +++ b/osu!Lyrics/Models/Lyric.cs @@ -1,6 +1,6 @@ using System; -namespace osu_Lyrics +namespace osu_Lyrics.Models { internal class Lyric { diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 75cdad7..dbda6ed 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -30,6 +30,7 @@ x86 prompt MinimumRecommendedRules.ruleset + latest bin\Release\ @@ -45,25 +46,28 @@ + - - - + + + + + - + Lyrics.cs - - + + From ff578a3fd33336f31161c765591e89f86d177fc6 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 01:22:27 +0900 Subject: [PATCH 23/48] =?UTF-8?q?=EB=94=94=EC=BD=94=EB=8D=94=20=EC=9E=AC?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Formats/AudioDecoder.cs | 71 ++++++++++++---- osu!Lyrics/Formats/BeatmapDecoder.cs | 9 +- osu!Lyrics/Formats/MpegDecoder.cs | 110 +++++++++++++------------ osu!Lyrics/Formats/OggDecoder.cs | 61 ++++++++++---- osu!Lyrics/Formats/OsuLegacyDecoder.cs | 11 +-- osu!Lyrics/Lyrics.cs | 13 ++- osu!Lyrics/Models/Audio.cs | 25 +----- 7 files changed, 181 insertions(+), 119 deletions(-) diff --git a/osu!Lyrics/Formats/AudioDecoder.cs b/osu!Lyrics/Formats/AudioDecoder.cs index 8a854c9..aeb78e3 100644 --- a/osu!Lyrics/Formats/AudioDecoder.cs +++ b/osu!Lyrics/Formats/AudioDecoder.cs @@ -1,34 +1,69 @@ -using System; +using osu_Lyrics.Models; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; -namespace osu_Lyrics.IO +namespace osu_Lyrics.Formats { - internal class AudioDecoder + using Predicate = Predicate; + internal abstract class AudioDecoder { - protected long RawPosition = 0; + private static readonly List> decoders = new List>(); - public string Hash { get; protected set; } - - protected void SetHash(Stream s) + static AudioDecoder() { - s.Seek(RawPosition, SeekOrigin.Begin); - var buff = new byte[0x28000]; - var read = s.Read(buff, 0, buff.Length); - this.Hash = string.Join("", MD5.Create().ComputeHash(buff, 0, read).Select(i => i.ToString("x2"))); + MpegDecoder.Register(); + OggDecoder.Register(); } - public static string Load(string path) + public static AudioDecoder GetDecoder(Stream stream) { - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + var decoder = decoders.FirstOrDefault(t => t.Item1.Invoke(stream))?.Item2; + + if (decoder == null) { - var buff = new byte[4]; - var mediaType = Program.IntB(buff, 0, fs.Read(buff, 0, 4)) == 0x4F676753 ? // "OggS" - (AudioDecoder) new Formats.Ogg(fs) : - (AudioDecoder) new Formats.Mpeg(fs); - return mediaType.Hash; + throw new IOException(@"Unknown file format"); } + return (AudioDecoder)Activator.CreateInstance(decoder, true); + } + + protected static void AddDecoder(Predicate predict) where T : AudioDecoder + { + decoders.Add(new Tuple(predict, typeof(T))); + } + + public virtual Audio Decode(Stream stream) + { + return ParseFile(stream); + } + + public virtual void Decode(Stream stream, Audio audio) + { + ParseFile(stream, audio); + } + + protected virtual Audio ParseFile(Stream stream) + { + var audio = new Audio(); + + ParseFile(stream, audio); + return audio; + } + + protected abstract void ParseFile(Stream stream, Audio audio); + + protected static string GetCheckSum(Stream s) + { + var buff = new byte[0x28000]; + var read = s.Read(buff, 0, buff.Length); + return string.Join("", MD5.Create().ComputeHash(buff, 0, read).Select(i => i.ToString("x2"))); } } } diff --git a/osu!Lyrics/Formats/BeatmapDecoder.cs b/osu!Lyrics/Formats/BeatmapDecoder.cs index 34919eb..1d5ca9c 100644 --- a/osu!Lyrics/Formats/BeatmapDecoder.cs +++ b/osu!Lyrics/Formats/BeatmapDecoder.cs @@ -8,9 +8,10 @@ namespace osu_Lyrics.Formats { - abstract class BeatmapDecoder + using Predicate = Predicate; + internal abstract class BeatmapDecoder { - private static readonly List, Type>> decoders = default; + private static readonly List> decoders = new List>(); static BeatmapDecoder() { @@ -44,9 +45,9 @@ public static BeatmapDecoder GetDecoder(StreamReader stream) return (BeatmapDecoder)Activator.CreateInstance(decoder, line); } - protected static void AddDecoder(Predicate predict) where T : BeatmapDecoder + protected static void AddDecoder(Predicate predict) where T : BeatmapDecoder { - decoders.Add(new Tuple, Type>(predict, typeof(T))); + decoders.Add(new Tuple(predict, typeof(T))); } public virtual Beatmap Decode(StreamReader stream) diff --git a/osu!Lyrics/Formats/MpegDecoder.cs b/osu!Lyrics/Formats/MpegDecoder.cs index 8d479db..67417fa 100644 --- a/osu!Lyrics/Formats/MpegDecoder.cs +++ b/osu!Lyrics/Formats/MpegDecoder.cs @@ -1,85 +1,89 @@ -using System.IO; +using System; +using System.IO; +using osu_Lyrics.Models; namespace osu_Lyrics.Formats { - internal class Mpeg : IO.AudioDecoder + internal class MpegDecoder : AudioDecoder { - public Mpeg(Stream s) + public static void Register() + { + AddDecoder(TypeCheck); + } + + public static bool TypeCheck(Stream s) { s.Seek(0, SeekOrigin.Begin); - // ID3 + SkipID3v2(s); + SeekHeader(s); + + return s.Position < s.Length - 1; + } + + private static void SkipID3v2(Stream s) + { + const int IDENTIFIER = 0x494433; + var buff = new byte[10]; int read; do { read = s.Read(buff, 0, buff.Length); - if (Program.IntB(buff, 0, 3) == 0x494433) // "ID3" - { - s.Seek(buff[6] << 21 | buff[7] << 14 | buff[8] << 7 | buff[9], SeekOrigin.Current); - } - else + + // 더이상 ID3v2 태그가 없는 경우 + if (Program.IntB(buff, 0, 3) != IDENTIFIER) { s.Seek(-buff.Length, SeekOrigin.Current); break; } - } while (read == buff.Length); - // header - buff = new byte[4096]; + // ID3v2 태그 건너뛰기 + s.Seek(buff[6] << 21 | buff[7] << 14 | buff[8] << 7 | buff[9], SeekOrigin.Current); + } while (read > 0); + } + + private static void SeekHeader(Stream s) + { + const int FRAME_SYNC = 0xFFE0F0; + + var buff = new byte[3]; + int read; do { read = s.Read(buff, 0, buff.Length); - for (var i = 3; i < read; i++) + + // MPEG 헤더를 찾았을 경우 + if ((Program.IntB(buff, 0, 3) & FRAME_SYNC) == FRAME_SYNC) { - var header = Program.IntB(buff, i - 3); - if (Validate(header)) - { - RawPosition = s.Position - read + i - 3; - read = 0; - } + s.Seek(-buff.Length, SeekOrigin.Current); + break; } - s.Seek(-4, SeekOrigin.Current); - } while (read == buff.Length); - - SetHash(s); - } - - private static bool Validate(int header) - { - return ((header >> 21) & 0x7FF) == 0x7FF && ParseVersion(header) != 1 && ParseLayer(header) != 0 && - ParseBitRate(header) != 0 && ParseBitRate(header) != 0xF && ParseSampleRate(header) != 3 && - ParseEmphasis(header) != 2; + + // 패딩 건너뛰기 + s.Seek(-buff.Length + 1, SeekOrigin.Current); + } while (read > 0); } - private static int ParseVersion(int header) - { - return (header >> 19) & 3; - } - - private static int ParseLayer(int header) - { - return (header >> 17) & 3; - } + public MpegDecoder() { } - private static int ParseBitRate(int header) + protected override void ParseFile(Stream stream, Audio audio) { - return (header >> 12) & 0xF; - } + if (audio == null) + { + throw new ArgumentNullException(nameof(audio)); + } + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } - private static int ParseSampleRate(int header) - { - return (header >> 10) & 3; - } + stream.Seek(0, SeekOrigin.Begin); - private static int ParseMode(int header) - { - return (header >> 6) & 3; - } + SkipID3v2(stream); + SeekHeader(stream); - private static int ParseEmphasis(int header) - { - return header & 3; + audio.CheckSum = GetCheckSum(stream); } } } \ No newline at end of file diff --git a/osu!Lyrics/Formats/OggDecoder.cs b/osu!Lyrics/Formats/OggDecoder.cs index 22a2f56..9f2bdf6 100644 --- a/osu!Lyrics/Formats/OggDecoder.cs +++ b/osu!Lyrics/Formats/OggDecoder.cs @@ -1,37 +1,66 @@ -using System.IO; +using System; +using System.IO; +using osu_Lyrics.Models; namespace osu_Lyrics.Formats { - internal class Ogg : IO.AudioDecoder + internal class OggDecoder : AudioDecoder { - public Ogg(Stream s) + public static void Register() { - s.Seek(52, SeekOrigin.Begin); + AddDecoder(TypeCheck); + } + + private static bool TypeCheck(Stream s) + { + s.Seek(0, SeekOrigin.Begin); + + var buff = new byte[4]; + return Program.IntB(buff, 0, s.Read(buff, 0, 4)) == 0x4F676753; // "OggS" + } + + public OggDecoder() { } + + private static bool Validate(byte[] buff, int offset) + { + return buff[offset] == 5 && Program.LongB(buff, offset + 1, 6) == 0x766F72626973 && // "vorbis" + Program.IntB(buff, offset + 8, 3) == 0x424356; // "BCV" codebook? + } + + protected override void ParseFile(Stream stream, Audio audio) + { + if (audio == null) + { + throw new ArgumentNullException(nameof(audio)); + } + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + stream.Seek(52, SeekOrigin.Begin); - // setup header var buff = new byte[4096]; int read; do { - read = s.Read(buff, 0, buff.Length); + read = stream.Read(buff, 0, buff.Length); + for (var i = 11; i < read; i++) { + // Setup 헤더를 찾았을 경우 if (Validate(buff, i - 11)) { - RawPosition = s.Position - read + i; - read = 0; + stream.Seek(-read + i, SeekOrigin.Current); + break; } } - s.Seek(-12, SeekOrigin.Current); - } while (read == buff.Length); - SetHash(s); - } + // 패딩 건너뛰기 + stream.Seek(-12, SeekOrigin.Current); + } while (read == buff.Length); - private static bool Validate(byte[] buff, int offset) - { - return buff[offset] == 5 && Program.LongB(buff, offset + 1, 6) == 0x766F72626973 && // "vorbis" - Program.IntB(buff, offset + 8, 3) == 0x424356; // "BCV" codebook? + audio.CheckSum = GetCheckSum(stream); } } } \ No newline at end of file diff --git a/osu!Lyrics/Formats/OsuLegacyDecoder.cs b/osu!Lyrics/Formats/OsuLegacyDecoder.cs index 2afb04c..9689e55 100644 --- a/osu!Lyrics/Formats/OsuLegacyDecoder.cs +++ b/osu!Lyrics/Formats/OsuLegacyDecoder.cs @@ -12,16 +12,17 @@ class OsuLegacyDecoder : BeatmapDecoder { public static void Register() { - AddDecoder(header => header.StartsWith(@"osu file format v")); + AddDecoder(TypeCheck); } - public OsuLegacyDecoder() + private static bool TypeCheck(string header) { + return header.StartsWith(@"osu file format v"); } - public OsuLegacyDecoder(string header) - { - } + public OsuLegacyDecoder() { } + + public OsuLegacyDecoder(string header) { } private enum Section { diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/Lyrics.cs index 8ef1333..f830efe 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/Lyrics.cs @@ -15,6 +15,7 @@ using osu_Lyrics.Interop; using osu_Lyrics.Forms; using osu_Lyrics.Models; +using osu_Lyrics.Formats; namespace osu_Lyrics { @@ -233,7 +234,15 @@ private void Osu_Signal(string line) // 재생 중인 곡이 바꼈다! if (data[1] != curAudio.Path) { - curAudio = new Audio(data[1], data[4]); + using (var fs = new FileStream(data[1], FileMode.Open, FileAccess.Read)) + { + curAudio = AudioDecoder.GetDecoder(fs)?.Decode(fs); + } + curAudio.Path = data[1]; + using (var sr = new StreamReader(data[4])) + { + curAudio.Beatmap = BeatmapDecoder.GetDecoder(sr)?.Decode(sr); + } UpdateLyrics(); } curTime = DateTimeOffset.Now.Subtract( @@ -263,7 +272,7 @@ private void UpdateLyrics() // 파일 해시로 가사 검색 var newLyrics = await GetLyricsAsync(new Dictionary { - { "[HASH]", curAudio.Hash } + { "[HASH]", curAudio.CheckSum } }); if (newLyrics == null && curAudio.Beatmap != null) diff --git a/osu!Lyrics/Models/Audio.cs b/osu!Lyrics/Models/Audio.cs index 14c79d5..e62ca91 100644 --- a/osu!Lyrics/Models/Audio.cs +++ b/osu!Lyrics/Models/Audio.cs @@ -5,9 +5,10 @@ namespace osu_Lyrics.Models { internal class Audio { - public readonly string Path; - public readonly string Hash; - public readonly Beatmap Beatmap; + public string Path { get; set; } + + public string CheckSum { get; set; } + public Beatmap Beatmap { get; set; } public double Sync; @@ -15,23 +16,5 @@ public Audio() { this.Sync = 0; } - - public Audio(string path, string beatmapPath) : this() - { - this.Path = path; - try - { - this.Hash = IO.AudioDecoder.Load(path); - } - catch {} - try - { - using (var sr = new StreamReader(beatmapPath)) - { - this.Beatmap = BeatmapDecoder.GetDecoder(sr)?.Decode(sr); - } - } - catch {} - } } } From 7109318662250d4b001079fd711e507b1a5639bd Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 02:49:37 +0900 Subject: [PATCH 24/48] =?UTF-8?q?MPEG=20=ED=97=A4=EB=8D=94=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Formats/AudioDecoder.cs | 2 +- osu!Lyrics/Formats/MpegDecoder.cs | 58 ++++++++++++++++++++++++++---- osu!Lyrics/Formats/OggDecoder.cs | 50 ++++++++++++++------------ 3 files changed, 79 insertions(+), 31 deletions(-) diff --git a/osu!Lyrics/Formats/AudioDecoder.cs b/osu!Lyrics/Formats/AudioDecoder.cs index aeb78e3..bce2dc0 100644 --- a/osu!Lyrics/Formats/AudioDecoder.cs +++ b/osu!Lyrics/Formats/AudioDecoder.cs @@ -31,7 +31,7 @@ public static AudioDecoder GetDecoder(Stream stream) { throw new IOException(@"Unknown file format"); } - return (AudioDecoder)Activator.CreateInstance(decoder, true); + return (AudioDecoder)Activator.CreateInstance(decoder); } protected static void AddDecoder(Predicate predict) where T : AudioDecoder diff --git a/osu!Lyrics/Formats/MpegDecoder.cs b/osu!Lyrics/Formats/MpegDecoder.cs index 67417fa..5972558 100644 --- a/osu!Lyrics/Formats/MpegDecoder.cs +++ b/osu!Lyrics/Formats/MpegDecoder.cs @@ -34,7 +34,7 @@ private static void SkipID3v2(Stream s) // 더이상 ID3v2 태그가 없는 경우 if (Program.IntB(buff, 0, 3) != IDENTIFIER) { - s.Seek(-buff.Length, SeekOrigin.Current); + s.Seek(-read, SeekOrigin.Current); break; } @@ -45,28 +45,72 @@ private static void SkipID3v2(Stream s) private static void SeekHeader(Stream s) { - const int FRAME_SYNC = 0xFFE0F0; - - var buff = new byte[3]; + var buff = new byte[4]; int read; do { read = s.Read(buff, 0, buff.Length); // MPEG 헤더를 찾았을 경우 - if ((Program.IntB(buff, 0, 3) & FRAME_SYNC) == FRAME_SYNC) + if (Validate(Program.IntB(buff, 0, 4))) { - s.Seek(-buff.Length, SeekOrigin.Current); + s.Seek(-read, SeekOrigin.Current); break; } // 패딩 건너뛰기 - s.Seek(-buff.Length + 1, SeekOrigin.Current); + s.Seek(-read + 1, SeekOrigin.Current); } while (read > 0); } public MpegDecoder() { } + private static bool Validate(int header) + { + const int SYNC = 0b1111_1111_111; + const int VERSION_RESERVED = 0b01; + const int LAYER_RESERVED = 0b00; + const int BITRATE_BAD = 0b1111; + const int SAMPLERATE_RESERVED = 0b11; + const int EMPHASIS_RESERVED = 0b10; + return ParseSync(header) == SYNC + && ParseVersion(header) != VERSION_RESERVED + && ParseLayer(header) != LAYER_RESERVED + && ParseBitRate(header) != BITRATE_BAD + && ParseSampleRate(header) != SAMPLERATE_RESERVED + && ParseEmphasis(header) != EMPHASIS_RESERVED; + } + + private static int ParseSync(int header) + { + return (header >> 21) & 0x7FF; + } + + private static int ParseVersion(int header) + { + return (header >> 19) & 3; + } + + private static int ParseLayer(int header) + { + return (header >> 17) & 3; + } + + private static int ParseBitRate(int header) + { + return (header >> 12) & 0xF; + } + + private static int ParseSampleRate(int header) + { + return (header >> 10) & 3; + } + + private static int ParseEmphasis(int header) + { + return header & 3; + } + protected override void ParseFile(Stream stream, Audio audio) { if (audio == null) diff --git a/osu!Lyrics/Formats/OggDecoder.cs b/osu!Lyrics/Formats/OggDecoder.cs index 9f2bdf6..8fa372a 100644 --- a/osu!Lyrics/Formats/OggDecoder.cs +++ b/osu!Lyrics/Formats/OggDecoder.cs @@ -19,12 +19,34 @@ private static bool TypeCheck(Stream s) return Program.IntB(buff, 0, s.Read(buff, 0, 4)) == 0x4F676753; // "OggS" } + private static void SeekHeader(Stream s) + { + s.Seek(52, SeekOrigin.Begin); + + var buff = new byte[12]; + int read; + do + { + read = s.Read(buff, 0, buff.Length); + + // Setup 헤더를 찾았을 경우 + if (Validate(buff)) + { + s.Seek(-read, SeekOrigin.Current); + break; + } + + // 패딩 건너뛰기 + s.Seek(-read + 1, SeekOrigin.Current); + } while (read > 0); + } + public OggDecoder() { } - private static bool Validate(byte[] buff, int offset) + private static bool Validate(byte[] buff) { - return buff[offset] == 5 && Program.LongB(buff, offset + 1, 6) == 0x766F72626973 && // "vorbis" - Program.IntB(buff, offset + 8, 3) == 0x424356; // "BCV" codebook? + return buff[0] == 5 && Program.LongB(buff, 1, 6) == 0x766F72626973 // "vorbis" + && Program.IntB(buff, 8, 3) == 0x424356; // "BCV" codebook? } protected override void ParseFile(Stream stream, Audio audio) @@ -38,27 +60,9 @@ protected override void ParseFile(Stream stream, Audio audio) throw new ArgumentNullException(nameof(stream)); } - stream.Seek(52, SeekOrigin.Begin); - - var buff = new byte[4096]; - int read; - do - { - read = stream.Read(buff, 0, buff.Length); - - for (var i = 11; i < read; i++) - { - // Setup 헤더를 찾았을 경우 - if (Validate(buff, i - 11)) - { - stream.Seek(-read + i, SeekOrigin.Current); - break; - } - } + stream.Seek(0, SeekOrigin.Begin); - // 패딩 건너뛰기 - stream.Seek(-12, SeekOrigin.Current); - } while (read == buff.Length); + SeekHeader(stream); audio.CheckSum = GetCheckSum(stream); } From f0ae4289fbc76160b758e2ee25aaa07fe5c2c922 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 04:16:27 +0900 Subject: [PATCH 25/48] =?UTF-8?q?Ogg=20=EC=B2=B4=ED=81=AC=EC=84=AC=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Formats/AudioDecoder.cs | 2 +- osu!Lyrics/Formats/OggDecoder.cs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/osu!Lyrics/Formats/AudioDecoder.cs b/osu!Lyrics/Formats/AudioDecoder.cs index bce2dc0..8ce00a1 100644 --- a/osu!Lyrics/Formats/AudioDecoder.cs +++ b/osu!Lyrics/Formats/AudioDecoder.cs @@ -14,8 +14,8 @@ internal abstract class AudioDecoder static AudioDecoder() { - MpegDecoder.Register(); OggDecoder.Register(); + MpegDecoder.Register(); } public static AudioDecoder GetDecoder(Stream stream) diff --git a/osu!Lyrics/Formats/OggDecoder.cs b/osu!Lyrics/Formats/OggDecoder.cs index 8fa372a..4ecaf13 100644 --- a/osu!Lyrics/Formats/OggDecoder.cs +++ b/osu!Lyrics/Formats/OggDecoder.cs @@ -23,7 +23,7 @@ private static void SeekHeader(Stream s) { s.Seek(52, SeekOrigin.Begin); - var buff = new byte[12]; + var buff = new byte[11]; int read; do { @@ -32,7 +32,6 @@ private static void SeekHeader(Stream s) // Setup 헤더를 찾았을 경우 if (Validate(buff)) { - s.Seek(-read, SeekOrigin.Current); break; } From c12a92a53e7f9e14d08f55a9fecd12a0d9629061 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 10:39:37 +0900 Subject: [PATCH 26/48] =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=9D=84=20=EC=B5=9C?= =?UTF-8?q?=EC=86=8C=ED=99=94=ED=95=9C=20=EC=83=81=ED=83=9C=EC=97=90=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A4=91=EC=97=90=20=EA=B0=80=EC=82=AC=20?= =?UTF-8?q?=EB=B3=BC=20=EC=88=98=20=EC=9E=88=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Interop/NativeMethods.cs | 36 +++++++++++++++++++++ osu!Lyrics/Interop/Osu.cs | 49 +++++++++-------------------- osu!Lyrics/Lyrics.cs | 6 +++- osu!Lyrics/Settings.Designer.cs | 2 +- 4 files changed, 57 insertions(+), 36 deletions(-) diff --git a/osu!Lyrics/Interop/NativeMethods.cs b/osu!Lyrics/Interop/NativeMethods.cs index 1a89e1c..b141a5c 100644 --- a/osu!Lyrics/Interop/NativeMethods.cs +++ b/osu!Lyrics/Interop/NativeMethods.cs @@ -135,14 +135,50 @@ public struct BLENDFUNCTION [DllImport(ExternDll.User32)] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + public const int SW_HIDE = 0; + public const int SW_SHOWNORMAL = 1; + public const int SW_NORMAL = 1; + public const int SW_SHOWMINIMIZED = 2; + public const int SW_SHOWMAXIMIZED = 3; + public const int SW_MAXIMIZE = 3; + public const int SW_SHOWNOACTIVATE = 4; + public const int SW_SHOW = 5; + public const int SW_MINIMIZE = 6; + public const int SW_SHOWMINNOACTIVE = 7; + public const int SW_SHOWNA = 8; + public const int SW_RESTORE = 9; + public const int SW_SHOWDEFAULT = 10; + public const int SW_FORCEMINIMIZE = 11; + public const int SW_MAX = 11; + [DllImport(ExternDll.User32)] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport(ExternDll.User32)] public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); + public const int WH_KEYBOARD_LL = 13; + public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); + public const int HC_ACTION = 0; + public const int HC_GETNEXT = 1; + public const int HC_SKIP = 2; + public const int HC_NOREMOVE = 3; + public const int HC_NOREM = HC_NOREMOVE; + public const int HC_SYSMODALON = 4; + public const int HC_SYSMODALOFF = 5; + + public const int WM_KEYFIRST = 0x0100; + public const int WM_KEYDOWN = 0x0100; + public const int WM_KEYUP = 0x0101; + public const int WM_CHAR = 0x0102; + public const int WM_DEADCHAR = 0x0103; + public const int WM_SYSKEYDOWN = 0x0104; + public const int WM_SYSKEYUP = 0x0105; + public const int WM_SYSCHAR = 0x0106; + public const int WM_SYSDEADCHAR = 0x0107; + [DllImport(ExternDll.User32)] public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); diff --git a/osu!Lyrics/Interop/Osu.cs b/osu!Lyrics/Interop/Osu.cs index 38d3298..ad1f3fc 100644 --- a/osu!Lyrics/Interop/Osu.cs +++ b/osu!Lyrics/Interop/Osu.cs @@ -59,45 +59,24 @@ public static Process Process #region Show() - public static bool IsForeground() - { - if (GetForegroundWindow() == Process.MainWindowHandle) - { - return true; - } - return Lyrics.Settings?.Visible ?? false; - } + public static bool IsForeground() => GetForegroundWindow() == Process.MainWindowHandle; - /// - /// 창이 활성화되어 있는지 확인하거나 활성화함. - /// 이미 창이 활성화되어 있다면 false를 반환. - /// - /// bool - public static bool Show(bool checkOnly = false) + public static void Show() { - const int SW_SHOWNORMAL = 1; - - if (GetForegroundWindow() == Process.MainWindowHandle) - { - return false; - } ShowWindow(Process.MainWindowHandle, SW_SHOWNORMAL); SetForegroundWindow(Process.MainWindowHandle); - return !Lyrics.Settings?.Visible ?? true; } #endregion #region HookKeyboard(Action action), UnhookKeyboard() - private static IntPtr _hhkk; // hookHandleKeyKeyboard + private static IntPtr _hhkk = IntPtr.Zero; // hookHandleKeyKeyboard private static HookProc _hpk; // hookProcKeyboard private static Func _hak; // hookActionKeyboard public static void HookKeyboard(Func action) { - const int WH_KEYBOARD_LL = 13; - if (_hhkk != IntPtr.Zero) { throw new StackOverflowException(); @@ -110,17 +89,14 @@ public static void HookKeyboard(Func action) private static IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam) { - const int HC_ACTION = 0; - const int WM_KEYDOWN = 0x100; - const int WM_SYSKEYDOWN = 0x104; - if (IsForeground() && nCode == HC_ACTION) { var state = wParam.ToInt32(); // 설정 중이면 키보드 후킹 안 하기! - if (Lyrics.Settings == null && - (state == WM_KEYDOWN || state == WM_SYSKEYDOWN) && - _hak((Keys) Marshal.ReadInt32(lParam)) && Settings.SuppressKey) + if (!(Lyrics.Settings?.Visible ?? false) + && (state == WM_KEYDOWN || state == WM_SYSKEYDOWN) + && _hak((Keys) Marshal.ReadInt32(lParam)) + && Settings.SuppressKey) { // 설정 중 "핫키 전송 막기" 활성화시 osu!로 핫기 전송 막는 부분.. return (IntPtr) 1; @@ -131,14 +107,19 @@ private static IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lPar public static void UnhookKeyboard() { - UnhookWindowsHookEx(_hhkk); + if (_hhkk != IntPtr.Zero) + { + UnhookWindowsHookEx(_hhkk); + _hpk = null; + _hak = null; + } } #endregion #region Listen(Action onSignal) - private static bool InjectDLL(string dllPath) + private static bool InjectDll(string dllPath) { var hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Process.Id); @@ -168,7 +149,7 @@ public static bool Listen(Action onSignal) IO.FileEx.Extract(Assembly.GetExecutingAssembly().GetManifestResourceStream("osu_Lyrics.Server.dll"), Constants._Server); var dest = Constants._Server + "." + FileVersionInfo.GetVersionInfo(Constants._Server).FileVersion; IO.FileEx.Move(Constants._Server, dest); - if (!InjectDLL(dest)) + if (!InjectDll(dest)) { return false; } diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/Lyrics.cs index f830efe..8dd652b 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/Lyrics.cs @@ -71,12 +71,16 @@ private async void Lyrics_Shown(object sender, EventArgs e) Size = Osu.ClientSize; Settings.DrawingOrigin = Point.Empty; } - if (Settings == null) + if (!(Settings?.Visible ?? false)) { TopMost = true; } Visible = true; } + else if (Settings?.Visible ?? false) + { + Visible = true; + } else if (Settings.ShowWhileOsuTop) { Visible = false; diff --git a/osu!Lyrics/Settings.Designer.cs b/osu!Lyrics/Settings.Designer.cs index 210d676..1a7497e 100644 --- a/osu!Lyrics/Settings.Designer.cs +++ b/osu!Lyrics/Settings.Designer.cs @@ -471,7 +471,7 @@ private void InitializeComponent() this.label18.TabIndex = 40; this.label18.Text = "?"; this.toolTip1.SetToolTip(this.label18, "핫키로 조절한 싱크 타이밍은 곡이 바뀔 때마다 초기화됨\r\nEscape 키로 핫키 취소\r\n\r\n싱크 느리게 & 싱크 빠르게: 싱크 0.5초만큼 조절\r" + - "\n토글: 가사 숨김/보임\r\n\r\n핫키 전송 막기 기능은 핫키가 제구실하면 작동함"); + "\n토글: 가사 숨김/보임\r\n\r\n핫키 전송 막기 기능은 핫키가 게임에 입력되지 않게 하는 기능임"); // // label17 // From 75a684e168a38de97cf12263ae3c59c1bdefe536 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 12:36:19 +0900 Subject: [PATCH 27/48] =?UTF-8?q?C#=207=20=EB=AC=B8=EB=B2=95=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Formats/MpegDecoder.cs | 35 +++-------------- osu!Lyrics/Interop/Osu.cs | 65 ++++++++++++++++--------------- osu!Lyrics/Lyrics.cs | 5 +-- 3 files changed, 40 insertions(+), 65 deletions(-) diff --git a/osu!Lyrics/Formats/MpegDecoder.cs b/osu!Lyrics/Formats/MpegDecoder.cs index 5972558..d3e8c6e 100644 --- a/osu!Lyrics/Formats/MpegDecoder.cs +++ b/osu!Lyrics/Formats/MpegDecoder.cs @@ -81,35 +81,12 @@ private static bool Validate(int header) && ParseEmphasis(header) != EMPHASIS_RESERVED; } - private static int ParseSync(int header) - { - return (header >> 21) & 0x7FF; - } - - private static int ParseVersion(int header) - { - return (header >> 19) & 3; - } - - private static int ParseLayer(int header) - { - return (header >> 17) & 3; - } - - private static int ParseBitRate(int header) - { - return (header >> 12) & 0xF; - } - - private static int ParseSampleRate(int header) - { - return (header >> 10) & 3; - } - - private static int ParseEmphasis(int header) - { - return header & 3; - } + private static int ParseSync(int header) => (header >> 21) & 0x7FF; + private static int ParseVersion(int header) => (header >> 19) & 3; + private static int ParseLayer(int header) => (header >> 17) & 3; + private static int ParseBitRate(int header) => (header >> 12) & 0xF; + private static int ParseSampleRate(int header) => (header >> 10) & 3; + private static int ParseEmphasis(int header) => header & 3; protected override void ParseFile(Stream stream, Audio audio) { diff --git a/osu!Lyrics/Interop/Osu.cs b/osu!Lyrics/Interop/Osu.cs index ad1f3fc..35f41ff 100644 --- a/osu!Lyrics/Interop/Osu.cs +++ b/osu!Lyrics/Interop/Osu.cs @@ -15,7 +15,7 @@ namespace osu_Lyrics.Interop { - internal class Osu + internal static class Osu { #region Process @@ -42,10 +42,9 @@ public static Process Process } // osu!가 실행 중이 아니므로 하나 띄운다 - var exec = Registry.GetValue(@"HKEY_CLASSES_ROOT\osu!\shell\open\command", null, null); - if (exec != null) + if (Registry.GetValue(@"HKEY_CLASSES_ROOT\osu!\shell\open\command", null, null) is string exec) { - _process = Process.Start(exec.ToString().Split(new[] { '"' }, StringSplitOptions.RemoveEmptyEntries)[0]); + _process = Process.Start(exec.Split()[0].Trim('"')); return Process; } @@ -118,7 +117,18 @@ public static void UnhookKeyboard() #endregion #region Listen(Action onSignal) - + + private static bool PrepareIPC() + { + // dll의 fileVersion을 바탕으로 버전별로 겹치지 않는 경로에 압축 풀기: + // 시스템 커널에 이전 버전의 dll이 같은 이름으로 남아있을 수 있음 + IO.FileEx.Extract(Assembly.GetExecutingAssembly().GetManifestResourceStream("osu_Lyrics.Server.dll"), Constants._Server); + var dest = Constants._Server + "." + FileVersionInfo.GetVersionInfo(Constants._Server).FileVersion; + IO.FileEx.Move(Constants._Server, dest); + + return InjectDll(dest); + } + private static bool InjectDll(string dllPath) { var hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Process.Id); @@ -142,31 +152,28 @@ private static bool InjectDll(string dllPath) return hThread != IntPtr.Zero; } + private static void ListenIPC(Action onSignal) + { + // 백그라운드에서 서버로부터 데이터를 받아 전달 + using (var pipe = new NamedPipeClientStream(".", "osu!Lyrics", PipeDirection.In, PipeOptions.None)) + using (var sr = new StreamReader(pipe, Encoding.Unicode)) + { + pipe.Connect(); + while (pipe.IsConnected && !sr.EndOfStream) + { + onSignal.BeginInvoke(sr.ReadLine(), null, null); + } + } + } + public static bool Listen(Action onSignal) { - // dll의 fileVersion을 바탕으로 버전별로 겹치지 않는 경로에 압축 풀기: - // 시스템 커널에 이전 버전의 dll이 같은 이름으로 남아있을 수 있음 - IO.FileEx.Extract(Assembly.GetExecutingAssembly().GetManifestResourceStream("osu_Lyrics.Server.dll"), Constants._Server); - var dest = Constants._Server + "." + FileVersionInfo.GetVersionInfo(Constants._Server).FileVersion; - IO.FileEx.Move(Constants._Server, dest); - if (!InjectDll(dest)) + if (!PrepareIPC()) { return false; } - // 백그라운드에서 서버로부터 데이터를 받아 전달 - Task.Run(() => - { - using (var pipe = new NamedPipeClientStream(".", "osu!Lyrics", PipeDirection.In, PipeOptions.None)) - using (var sr = new StreamReader(pipe, Encoding.Unicode)) - { - pipe.Connect(); - while (pipe.IsConnected && !sr.EndOfStream) - { - onSignal(sr.ReadLine()); - } - } - }); + Task.Run(() => ListenIPC(onSignal)); return true; } @@ -193,14 +200,8 @@ public static Size ClientSize } } - public static Rectangle ClientBounds - { - get - { - return new Rectangle(ClientLocation, ClientSize); - } - } + public static Rectangle ClientBounds => new Rectangle(ClientLocation, ClientSize); #endregion } -} \ No newline at end of file +} diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/Lyrics.cs index 8dd652b..8e3cfa3 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/Lyrics.cs @@ -133,10 +133,7 @@ private void timer1_Tick(object sender, EventArgs e) #endregion - private static double Now() - { - return new TimeSpan(DateTime.Now.Ticks).TotalSeconds; - } + private static double Now() => new TimeSpan(DateTime.Now.Ticks).TotalSeconds; /// /// 알송 서버에서 가사를 가져옴. From f8b5482e42fdcc0edd1a03e000eee949b840a144 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 20:26:09 +0900 Subject: [PATCH 28/48] =?UTF-8?q?=EB=84=A4=EC=9E=84=EC=8A=A4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Models/Audio.cs => Audio/AudioInfo.cs} | 11 ++++------ .../{ => Audio}/Formats/AudioDecoder.cs | 15 ++++++------- osu!Lyrics/{ => Audio}/Formats/MpegDecoder.cs | 5 ++--- osu!Lyrics/{ => Audio}/Formats/OggDecoder.cs | 5 ++--- .../Beatmap.cs => Beatmap/BeatmapMetadata.cs} | 8 +++---- .../{ => Beatmap}/Formats/BeatmapDecoder.cs | 15 ++++++------- .../{ => Beatmap}/Formats/OsuLegacyDecoder.cs | 7 +++--- ...s.Designer.cs => CanvasWindow.Designer.cs} | 2 +- osu!Lyrics/{Lyrics.cs => CanvasWindow.cs} | 16 +++++++------- osu!Lyrics/Interop/Osu.cs | 2 +- osu!Lyrics/{Models => Lyrics}/Lyric.cs | 2 +- osu!Lyrics/Program.cs | 2 +- osu!Lyrics/Settings.cs | 10 ++++----- osu!Lyrics/osu!Lyrics.csproj | 22 +++++++++---------- 14 files changed, 56 insertions(+), 66 deletions(-) rename osu!Lyrics/{Models/Audio.cs => Audio/AudioInfo.cs} (51%) rename osu!Lyrics/{ => Audio}/Formats/AudioDecoder.cs (81%) rename osu!Lyrics/{ => Audio}/Formats/MpegDecoder.cs (96%) rename osu!Lyrics/{ => Audio}/Formats/OggDecoder.cs (92%) rename osu!Lyrics/{Models/Beatmap.cs => Beatmap/BeatmapMetadata.cs} (83%) rename osu!Lyrics/{ => Beatmap}/Formats/BeatmapDecoder.cs (82%) rename osu!Lyrics/{ => Beatmap}/Formats/OsuLegacyDecoder.cs (96%) rename osu!Lyrics/{Lyrics.Designer.cs => CanvasWindow.Designer.cs} (99%) rename osu!Lyrics/{Lyrics.cs => CanvasWindow.cs} (97%) rename osu!Lyrics/{Models => Lyrics}/Lyric.cs (95%) diff --git a/osu!Lyrics/Models/Audio.cs b/osu!Lyrics/Audio/AudioInfo.cs similarity index 51% rename from osu!Lyrics/Models/Audio.cs rename to osu!Lyrics/Audio/AudioInfo.cs index e62ca91..1902699 100644 --- a/osu!Lyrics/Models/Audio.cs +++ b/osu!Lyrics/Audio/AudioInfo.cs @@ -1,18 +1,15 @@ -using osu_Lyrics.Formats; -using System.IO; - -namespace osu_Lyrics.Models +namespace osu_Lyrics.Audio { - internal class Audio + internal class AudioInfo { public string Path { get; set; } public string CheckSum { get; set; } - public Beatmap Beatmap { get; set; } + public Beatmap.BeatmapMetadata Beatmap { get; set; } public double Sync; - public Audio() + public AudioInfo() { this.Sync = 0; } diff --git a/osu!Lyrics/Formats/AudioDecoder.cs b/osu!Lyrics/Audio/Formats/AudioDecoder.cs similarity index 81% rename from osu!Lyrics/Formats/AudioDecoder.cs rename to osu!Lyrics/Audio/Formats/AudioDecoder.cs index 8ce00a1..545c566 100644 --- a/osu!Lyrics/Formats/AudioDecoder.cs +++ b/osu!Lyrics/Audio/Formats/AudioDecoder.cs @@ -1,11 +1,10 @@ -using osu_Lyrics.Models; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; -namespace osu_Lyrics.Formats +namespace osu_Lyrics.Audio.Formats { using Predicate = Predicate; internal abstract class AudioDecoder @@ -39,25 +38,25 @@ protected static void AddDecoder(Predicate predict) where T : AudioDecoder decoders.Add(new Tuple(predict, typeof(T))); } - public virtual Audio Decode(Stream stream) + public virtual AudioInfo Decode(Stream stream) { return ParseFile(stream); } - public virtual void Decode(Stream stream, Audio audio) + public virtual void Decode(Stream stream, AudioInfo audio) { ParseFile(stream, audio); } - protected virtual Audio ParseFile(Stream stream) + protected virtual AudioInfo ParseFile(Stream stream) { - var audio = new Audio(); + var audio = new AudioInfo(); ParseFile(stream, audio); return audio; } - protected abstract void ParseFile(Stream stream, Audio audio); + protected abstract void ParseFile(Stream stream, AudioInfo audio); protected static string GetCheckSum(Stream s) { diff --git a/osu!Lyrics/Formats/MpegDecoder.cs b/osu!Lyrics/Audio/Formats/MpegDecoder.cs similarity index 96% rename from osu!Lyrics/Formats/MpegDecoder.cs rename to osu!Lyrics/Audio/Formats/MpegDecoder.cs index d3e8c6e..57cee0c 100644 --- a/osu!Lyrics/Formats/MpegDecoder.cs +++ b/osu!Lyrics/Audio/Formats/MpegDecoder.cs @@ -1,8 +1,7 @@ using System; using System.IO; -using osu_Lyrics.Models; -namespace osu_Lyrics.Formats +namespace osu_Lyrics.Audio.Formats { internal class MpegDecoder : AudioDecoder { @@ -88,7 +87,7 @@ private static bool Validate(int header) private static int ParseSampleRate(int header) => (header >> 10) & 3; private static int ParseEmphasis(int header) => header & 3; - protected override void ParseFile(Stream stream, Audio audio) + protected override void ParseFile(Stream stream, AudioInfo audio) { if (audio == null) { diff --git a/osu!Lyrics/Formats/OggDecoder.cs b/osu!Lyrics/Audio/Formats/OggDecoder.cs similarity index 92% rename from osu!Lyrics/Formats/OggDecoder.cs rename to osu!Lyrics/Audio/Formats/OggDecoder.cs index 4ecaf13..65a2a61 100644 --- a/osu!Lyrics/Formats/OggDecoder.cs +++ b/osu!Lyrics/Audio/Formats/OggDecoder.cs @@ -1,8 +1,7 @@ using System; using System.IO; -using osu_Lyrics.Models; -namespace osu_Lyrics.Formats +namespace osu_Lyrics.Audio.Formats { internal class OggDecoder : AudioDecoder { @@ -48,7 +47,7 @@ private static bool Validate(byte[] buff) && Program.IntB(buff, 8, 3) == 0x424356; // "BCV" codebook? } - protected override void ParseFile(Stream stream, Audio audio) + protected override void ParseFile(Stream stream, AudioInfo audio) { if (audio == null) { diff --git a/osu!Lyrics/Models/Beatmap.cs b/osu!Lyrics/Beatmap/BeatmapMetadata.cs similarity index 83% rename from osu!Lyrics/Models/Beatmap.cs rename to osu!Lyrics/Beatmap/BeatmapMetadata.cs index cd9ec83..ca6daa9 100644 --- a/osu!Lyrics/Models/Beatmap.cs +++ b/osu!Lyrics/Beatmap/BeatmapMetadata.cs @@ -1,8 +1,6 @@ -using System.IO; - -namespace osu_Lyrics.Models +namespace osu_Lyrics.Beatmap { - internal class Beatmap + internal class BeatmapMetadata { public string Title { get; set; } public string TitleUnicode { get; set; } @@ -15,7 +13,7 @@ internal class Beatmap public string AudioFile { get; set; } public string BackgroundFile { get; set; } - public Beatmap(Beatmap original = null) + public BeatmapMetadata(BeatmapMetadata original = null) { if (original == null) { diff --git a/osu!Lyrics/Formats/BeatmapDecoder.cs b/osu!Lyrics/Beatmap/Formats/BeatmapDecoder.cs similarity index 82% rename from osu!Lyrics/Formats/BeatmapDecoder.cs rename to osu!Lyrics/Beatmap/Formats/BeatmapDecoder.cs index 1d5ca9c..3badcad 100644 --- a/osu!Lyrics/Formats/BeatmapDecoder.cs +++ b/osu!Lyrics/Beatmap/Formats/BeatmapDecoder.cs @@ -1,12 +1,11 @@ -using osu_Lyrics.Models; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace osu_Lyrics.Formats +namespace osu_Lyrics.Beatmap.Formats { using Predicate = Predicate; internal abstract class BeatmapDecoder @@ -50,24 +49,24 @@ protected static void AddDecoder(Predicate predict) where T : BeatmapDecoder decoders.Add(new Tuple(predict, typeof(T))); } - public virtual Beatmap Decode(StreamReader stream) + public virtual BeatmapMetadata Decode(StreamReader stream) { return ParseFile(stream); } - public virtual void Decode(StreamReader stream, Beatmap beatmap) + public virtual void Decode(StreamReader stream, BeatmapMetadata beatmap) { ParseFile(stream, beatmap); } - protected virtual Beatmap ParseFile(StreamReader stream) + protected virtual BeatmapMetadata ParseFile(StreamReader stream) { - var beatmap = new Beatmap(); + var beatmap = new BeatmapMetadata(); ParseFile(stream, beatmap); return beatmap; } - protected abstract void ParseFile(StreamReader stream, Beatmap beatmap); + protected abstract void ParseFile(StreamReader stream, BeatmapMetadata beatmap); } } diff --git a/osu!Lyrics/Formats/OsuLegacyDecoder.cs b/osu!Lyrics/Beatmap/Formats/OsuLegacyDecoder.cs similarity index 96% rename from osu!Lyrics/Formats/OsuLegacyDecoder.cs rename to osu!Lyrics/Beatmap/Formats/OsuLegacyDecoder.cs index 9689e55..65fbe7e 100644 --- a/osu!Lyrics/Formats/OsuLegacyDecoder.cs +++ b/osu!Lyrics/Beatmap/Formats/OsuLegacyDecoder.cs @@ -4,9 +4,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using osu_Lyrics.Models; -namespace osu_Lyrics.Formats +namespace osu_Lyrics.Beatmap.Formats { class OsuLegacyDecoder : BeatmapDecoder { @@ -38,7 +37,7 @@ private enum Section Variables, } - private void handleMetadata(Beatmap beatmap, string line) + private void handleMetadata(BeatmapMetadata beatmap, string line) { if (beatmap == null) { @@ -77,7 +76,7 @@ private void handleMetadata(Beatmap beatmap, string line) } } - protected override void ParseFile(StreamReader stream, Beatmap beatmap) + protected override void ParseFile(StreamReader stream, BeatmapMetadata beatmap) { if (beatmap == null) { diff --git a/osu!Lyrics/Lyrics.Designer.cs b/osu!Lyrics/CanvasWindow.Designer.cs similarity index 99% rename from osu!Lyrics/Lyrics.Designer.cs rename to osu!Lyrics/CanvasWindow.Designer.cs index b7858dd..d77333d 100644 --- a/osu!Lyrics/Lyrics.Designer.cs +++ b/osu!Lyrics/CanvasWindow.Designer.cs @@ -1,6 +1,6 @@ namespace osu_Lyrics { - partial class Lyrics + partial class CanvasWindow { /// /// Required designer variable. diff --git a/osu!Lyrics/Lyrics.cs b/osu!Lyrics/CanvasWindow.cs similarity index 97% rename from osu!Lyrics/Lyrics.cs rename to osu!Lyrics/CanvasWindow.cs index 8e3cfa3..6c5a5eb 100644 --- a/osu!Lyrics/Lyrics.cs +++ b/osu!Lyrics/CanvasWindow.cs @@ -14,18 +14,18 @@ using System.Threading; using osu_Lyrics.Interop; using osu_Lyrics.Forms; -using osu_Lyrics.Models; -using osu_Lyrics.Formats; +using osu_Lyrics.Audio; +using osu_Lyrics.Lyrics; namespace osu_Lyrics { - internal partial class Lyrics : GhostLayeredWindow + internal partial class CanvasWindow : GhostLayeredWindow { #region Lyrics() - public static Lyrics Constructor; + public static CanvasWindow Constructor; - public Lyrics() + public CanvasWindow() { if (Constructor == null) { @@ -182,7 +182,7 @@ private static async Task> GetLyricsAsync(IDictionary + CanvasWindow.Constructor.Invoke(new MethodInvoker(() => { - Lyrics.Constructor.Visible = true; - Lyrics.Constructor.Refresh(); + CanvasWindow.Constructor.Visible = true; + CanvasWindow.Constructor.Refresh(); })); } diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index dbda6ed..e618b59 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -51,23 +51,23 @@ - - - - - + + + + + - - - - Lyrics.cs + + + + CanvasWindow.cs - - + + From afbdac3eaa92d34859491fec331ecc20eb7116df Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 21:37:36 +0900 Subject: [PATCH 29/48] =?UTF-8?q?=ED=95=AB=ED=82=A4=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/CanvasWindow.cs | 34 ++++++++++++++++++++--------- osu!Lyrics/Interop/NativeMethods.cs | 10 +++++++++ osu!Lyrics/Interop/Osu.cs | 31 ++++++++++++++------------ 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/osu!Lyrics/CanvasWindow.cs b/osu!Lyrics/CanvasWindow.cs index 6c5a5eb..d1db44d 100644 --- a/osu!Lyrics/CanvasWindow.cs +++ b/osu!Lyrics/CanvasWindow.cs @@ -48,7 +48,8 @@ public override void Render(Graphics g) private void Lyrics_Load(object sender, EventArgs e) { Notice(Osu.Listen(Osu_Signal) ? Constants._MutexName : "초기화 실패"); - Osu.HookKeyboard(Osu_KeyDown); + Osu.KeyDown += Osu_KeyDown; + Osu.HookKeyboard(); } private async void Lyrics_Shown(object sender, EventArgs e) @@ -60,7 +61,7 @@ private async void Lyrics_Shown(object sender, EventArgs e) } while (!Osu.Process.HasExited) { - if (Osu.IsForeground()) + if (Osu.IsForeground) { if (!Location.Equals(Osu.ClientLocation)) { @@ -439,31 +440,44 @@ private void DrawLyric(Graphics g) - private bool Osu_KeyDown(Keys key) + private void Osu_KeyDown(object sender, KeyEventArgs e) { - if (key == Settings.KeyToggle) + // 설정 중이면 키보드 후킹 안 하기! + if (Settings?.Visible ?? false) + { + return; + } + + // 매칭되는 핫키가 있다면 osu!로 키 전송 방지 + e.SuppressKeyPress = Settings.SuppressKey; + + if (e.KeyData == Settings.KeyToggle) { showLyric = !showLyric; Notice("가사 {0}", showLyric ? "보임" : "숨김"); - return true; + return; } + + // 가사 보임 상태에서만 처리하는 핫키들 if (!Settings.BlockSyncOnHide || (Settings.BlockSyncOnHide && showLyric)) { - if (key == Settings.KeyBackward) + if (e.KeyData == Settings.KeyBackward) { curAudio.Sync += 0.5; lyricsCache = lyricsCache; Notice("싱크 느리게({0}초)", curAudio.Sync.ToString("F1")); - return true; + return; } - if (key == Settings.KeyForward) + if (e.KeyData == Settings.KeyForward) { curAudio.Sync -= 0.5; Notice("싱크 빠르게({0}초)", curAudio.Sync.ToString("F1")); - return true; + return; } } - return false; + + // 매칭되는 핫키가 없으므로 osu!로 키 전송 + e.SuppressKeyPress = false; } diff --git a/osu!Lyrics/Interop/NativeMethods.cs b/osu!Lyrics/Interop/NativeMethods.cs index b141a5c..9d2dd06 100644 --- a/osu!Lyrics/Interop/NativeMethods.cs +++ b/osu!Lyrics/Interop/NativeMethods.cs @@ -179,6 +179,16 @@ public struct BLENDFUNCTION public const int WM_SYSCHAR = 0x0106; public const int WM_SYSDEADCHAR = 0x0107; + [StructLayout(LayoutKind.Sequential)] + public struct KBDLLHOOKSTRUCT + { + public int vkCode; + public int scanCode; + public int flags; + public int time; + public IntPtr dwExtraInfo; + } + [DllImport(ExternDll.User32)] public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); diff --git a/osu!Lyrics/Interop/Osu.cs b/osu!Lyrics/Interop/Osu.cs index 932d1aa..4fb688d 100644 --- a/osu!Lyrics/Interop/Osu.cs +++ b/osu!Lyrics/Interop/Osu.cs @@ -58,7 +58,7 @@ public static Process Process #region Show() - public static bool IsForeground() => GetForegroundWindow() == Process.MainWindowHandle; + public static bool IsForeground => GetForegroundWindow() == Process.MainWindowHandle; public static void Show() { @@ -70,35 +70,36 @@ public static void Show() #region HookKeyboard(Action action), UnhookKeyboard() + public static event KeyEventHandler KeyDown; + private static IntPtr _hhkk = IntPtr.Zero; // hookHandleKeyKeyboard private static HookProc _hpk; // hookProcKeyboard - private static Func _hak; // hookActionKeyboard - public static void HookKeyboard(Func action) + public static void HookKeyboard() { if (_hhkk != IntPtr.Zero) { - throw new StackOverflowException(); + throw new InvalidOperationException(); } - _hak = action; _hpk = new HookProc(LowLevelKeyboardProc); _hhkk = SetWindowsHookEx(WH_KEYBOARD_LL, _hpk, IntPtr.Zero, 0); } private static IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam) { - if (IsForeground() && nCode == HC_ACTION) + if (IsForeground && nCode == HC_ACTION) { var state = wParam.ToInt32(); - // 설정 중이면 키보드 후킹 안 하기! - if (!(CanvasWindow.Settings?.Visible ?? false) - && (state == WM_KEYDOWN || state == WM_SYSKEYDOWN) - && _hak((Keys) Marshal.ReadInt32(lParam)) - && Settings.SuppressKey) + if (state == WM_KEYDOWN || state == WM_SYSKEYDOWN) { - // 설정 중 "핫키 전송 막기" 활성화시 osu!로 핫기 전송 막는 부분.. - return (IntPtr) 1; + //var keyData = (Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)) as KBDLLHOOKSTRUCT)?.vkCode; + var e = new KeyEventArgs((Keys) Marshal.ReadInt32(lParam)); + KeyDown?.Invoke(null, e); + if (e.SuppressKeyPress) + { + return (IntPtr) 1; + } } } return CallNextHookEx(_hhkk, nCode, wParam, lParam); @@ -110,7 +111,6 @@ public static void UnhookKeyboard() { UnhookWindowsHookEx(_hhkk); _hpk = null; - _hak = null; } } @@ -118,6 +118,8 @@ public static void UnhookKeyboard() #region Listen(Action onSignal) + public static event Action ReceivedMessage; + private static bool PrepareIPC() { // dll의 fileVersion을 바탕으로 버전별로 겹치지 않는 경로에 압축 풀기: @@ -172,6 +174,7 @@ public static bool Listen(Action onSignal) { return false; } + ReceivedMessage += onSignal; Task.Run(() => ListenIPC(onSignal)); return true; From 6c11a6b9d762bc1794caaf4fc808cf5c4e5e7be1 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 23:18:26 +0900 Subject: [PATCH 30/48] =?UTF-8?q?osu!=20IPC=EC=97=90=20=EC=93=B0=EB=8D=98?= =?UTF-8?q?=20=EC=BD=9C=EB=B0=B1=20=ED=95=A8=EC=88=98=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/CanvasWindow.Designer.cs | 1 - osu!Lyrics/CanvasWindow.cs | 33 +++++++------------ osu!Lyrics/Forms/GhostLayeredWindow.cs | 2 +- osu!Lyrics/Forms/LayeredWindow.cs | 5 +++ .../Interop/MessageReceivedEventArgs.cs | 29 ++++++++++++++++ osu!Lyrics/Interop/Osu.cs | 25 +++++--------- osu!Lyrics/Program.cs | 11 +++++-- osu!Lyrics/osu!Lyrics.csproj | 1 + 8 files changed, 64 insertions(+), 43 deletions(-) create mode 100644 osu!Lyrics/Interop/MessageReceivedEventArgs.cs diff --git a/osu!Lyrics/CanvasWindow.Designer.cs b/osu!Lyrics/CanvasWindow.Designer.cs index d77333d..5c6b96f 100644 --- a/osu!Lyrics/CanvasWindow.Designer.cs +++ b/osu!Lyrics/CanvasWindow.Designer.cs @@ -73,7 +73,6 @@ private void InitializeComponent() // this.Name = "Lyrics"; this.Text = "osu!Lyrics"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Lyrics_FormClosing); this.Load += new System.EventHandler(this.Lyrics_Load); this.Shown += new System.EventHandler(this.Lyrics_Shown); this.trayMenu.ResumeLayout(false); diff --git a/osu!Lyrics/CanvasWindow.cs b/osu!Lyrics/CanvasWindow.cs index d1db44d..c01a5e8 100644 --- a/osu!Lyrics/CanvasWindow.cs +++ b/osu!Lyrics/CanvasWindow.cs @@ -32,6 +32,9 @@ public CanvasWindow() Constructor = this; } InitializeComponent(); + + Osu.MessageReceived += Osu_MessageReceived; + Osu.KeyDown += Osu_KeyDown; } public override void Render(Graphics g) @@ -47,9 +50,7 @@ public override void Render(Graphics g) private void Lyrics_Load(object sender, EventArgs e) { - Notice(Osu.Listen(Osu_Signal) ? Constants._MutexName : "초기화 실패"); - Osu.KeyDown += Osu_KeyDown; - Osu.HookKeyboard(); + Notice(Constants._MutexName); } private async void Lyrics_Shown(object sender, EventArgs e) @@ -97,10 +98,6 @@ private async void Lyrics_Shown(object sender, EventArgs e) Close(); } - private void Lyrics_FormClosing(object sender, FormClosingEventArgs e) - { - Osu.UnhookKeyboard(); - } @@ -225,32 +222,24 @@ private List lyricsCache } } - private void Osu_Signal(string line) + private void Osu_MessageReceived(object sender, MessageReceivedEventArgs e) { - var data = line.Split('|'); - if (data.Length != 5) - { - return; - } - // [ time, audioPath, audioCurrentTime, audioPlaybackRate, beatmapPath ] // 재생 중인 곡이 바꼈다! - if (data[1] != curAudio.Path) + if (e.AudioPath != curAudio.Path) { - using (var fs = new FileStream(data[1], FileMode.Open, FileAccess.Read)) + using (var fs = new FileStream(e.AudioPath, FileMode.Open, FileAccess.Read)) { curAudio = Audio.Formats.AudioDecoder.GetDecoder(fs)?.Decode(fs); } - curAudio.Path = data[1]; - using (var sr = new StreamReader(data[4])) + curAudio.Path = e.AudioPath; + using (var sr = new StreamReader(e.BeatmapPath)) { curAudio.Beatmap = Beatmap.Formats.BeatmapDecoder.GetDecoder(sr)?.Decode(sr); } UpdateLyrics(); } - curTime = DateTimeOffset.Now.Subtract( - DateTimeOffset.FromFileTime(Convert.ToInt64(data[0], 16)) - ).TotalSeconds + Convert.ToDouble(data[2]); - _playbackRate = 1 + Convert.ToDouble(data[3]) / 100; + curTime = DateTimeOffset.Now.Subtract(DateTimeOffset.FromFileTime(e.SystemTime)).TotalSeconds + e.AudioPlayTime; + _playbackRate = 1 + e.AudioPlaySpeed / 100; } private CancellationTokenSource cts; diff --git a/osu!Lyrics/Forms/GhostLayeredWindow.cs b/osu!Lyrics/Forms/GhostLayeredWindow.cs index 1edb2f6..c646017 100644 --- a/osu!Lyrics/Forms/GhostLayeredWindow.cs +++ b/osu!Lyrics/Forms/GhostLayeredWindow.cs @@ -10,7 +10,7 @@ namespace osu_Lyrics.Forms { class GhostLayeredWindow : LayeredWindow { - public GhostLayeredWindow() : base() + public GhostLayeredWindow() { ShowInTaskbar = false; } diff --git a/osu!Lyrics/Forms/LayeredWindow.cs b/osu!Lyrics/Forms/LayeredWindow.cs index 7bb5935..fa844d0 100644 --- a/osu!Lyrics/Forms/LayeredWindow.cs +++ b/osu!Lyrics/Forms/LayeredWindow.cs @@ -13,6 +13,11 @@ namespace osu_Lyrics.Forms [System.ComponentModel.DesignerCategory("code")] class LayeredWindow : Form { + public LayeredWindow() + { + FormBorderStyle = FormBorderStyle.None; + } + protected override CreateParams CreateParams { get diff --git a/osu!Lyrics/Interop/MessageReceivedEventArgs.cs b/osu!Lyrics/Interop/MessageReceivedEventArgs.cs new file mode 100644 index 0000000..3fa5ef0 --- /dev/null +++ b/osu!Lyrics/Interop/MessageReceivedEventArgs.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Interop +{ + class MessageReceivedEventArgs + { + private string[] dataFetched; + + public MessageReceivedEventArgs(string data) + { + dataFetched = data.Split('|'); + } + + public long SystemTime => long.Parse(dataFetched[0], NumberStyles.HexNumber); + + public string AudioPath => dataFetched[1]; + + public double AudioPlayTime => double.Parse(dataFetched[2]); + + public double AudioPlaySpeed => double.Parse(dataFetched[3]); + + public string BeatmapPath => dataFetched[4]; + } +} diff --git a/osu!Lyrics/Interop/Osu.cs b/osu!Lyrics/Interop/Osu.cs index 4fb688d..5e2844b 100644 --- a/osu!Lyrics/Interop/Osu.cs +++ b/osu!Lyrics/Interop/Osu.cs @@ -70,7 +70,7 @@ public static void Show() #region HookKeyboard(Action action), UnhookKeyboard() - public static event KeyEventHandler KeyDown; + public static event EventHandler KeyDown; private static IntPtr _hhkk = IntPtr.Zero; // hookHandleKeyKeyboard private static HookProc _hpk; // hookProcKeyboard @@ -118,9 +118,9 @@ public static void UnhookKeyboard() #region Listen(Action onSignal) - public static event Action ReceivedMessage; + public static event EventHandler MessageReceived; - private static bool PrepareIPC() + public static void RunMessageServer() { // dll의 fileVersion을 바탕으로 버전별로 겹치지 않는 경로에 압축 풀기: // 시스템 커널에 이전 버전의 dll이 같은 이름으로 남아있을 수 있음 @@ -128,7 +128,7 @@ private static bool PrepareIPC() var dest = Constants._Server + "." + FileVersionInfo.GetVersionInfo(Constants._Server).FileVersion; IO.FileEx.Move(Constants._Server, dest); - return InjectDll(dest); + InjectDll(dest); } private static bool InjectDll(string dllPath) @@ -154,7 +154,7 @@ private static bool InjectDll(string dllPath) return hThread != IntPtr.Zero; } - private static void ListenIPC(Action onSignal) + private static void ListenMessage() { // 백그라운드에서 서버로부터 데이터를 받아 전달 using (var pipe = new NamedPipeClientStream(".", "osu!Lyrics", PipeDirection.In, PipeOptions.None)) @@ -163,22 +163,13 @@ private static void ListenIPC(Action onSignal) pipe.Connect(); while (pipe.IsConnected && !sr.EndOfStream) { - onSignal.BeginInvoke(sr.ReadLine(), null, null); + var e = new MessageReceivedEventArgs(sr.ReadLine()); + MessageReceived?.BeginInvoke(null, e, null, null); } } } - public static bool Listen(Action onSignal) - { - if (!PrepareIPC()) - { - return false; - } - ReceivedMessage += onSignal; - - Task.Run(() => ListenIPC(onSignal)); - return true; - } + public static Task ListenMessageAsync() => Task.Run(() => ListenMessage()); #endregion diff --git a/osu!Lyrics/Program.cs b/osu!Lyrics/Program.cs index 3ecaf70..04e41bf 100644 --- a/osu!Lyrics/Program.cs +++ b/osu!Lyrics/Program.cs @@ -1,4 +1,5 @@ -using System; +using osu_Lyrics.Interop; +using System; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -13,15 +14,21 @@ private static void Main() { using (new Mutex(true, Constants._MutexName, out bool createdNew)) { - Interop.Osu.Show(); + Osu.Show(); if (createdNew) { // 업데이트 전의 파일 삭제 Task.Run(() => IO.FileEx.PostDel(Application.ExecutablePath + Constants._BakExt)); + Osu.RunMessageServer(); + Osu.ListenMessageAsync(); + Osu.HookKeyboard(); + Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new CanvasWindow()); + + Osu.UnhookKeyboard(); } } } diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index e618b59..ad502ec 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -58,6 +58,7 @@ + From 5a4df6bc4b090a600ff0bd1cca518275e0941527 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Thu, 16 Nov 2017 23:52:44 +0900 Subject: [PATCH 31/48] =?UTF-8?q?LayeredWindow=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...dow.Designer.cs => CanvasForm.Designer.cs} | 2 +- osu!Lyrics/{CanvasWindow.cs => CanvasForm.cs} | 6 +- ...stLayeredWindow.cs => GhostLayeredForm.cs} | 4 +- .../{LayeredWindow.cs => LayeredForm.cs} | 56 +++++++++---------- osu!Lyrics/Program.cs | 2 +- osu!Lyrics/Settings.cs | 10 ++-- osu!Lyrics/osu!Lyrics.csproj | 10 ++-- 7 files changed, 45 insertions(+), 45 deletions(-) rename osu!Lyrics/{CanvasWindow.Designer.cs => CanvasForm.Designer.cs} (99%) rename osu!Lyrics/{CanvasWindow.cs => CanvasForm.cs} (99%) rename osu!Lyrics/Forms/{GhostLayeredWindow.cs => GhostLayeredForm.cs} (87%) rename osu!Lyrics/Forms/{LayeredWindow.cs => LayeredForm.cs} (59%) diff --git a/osu!Lyrics/CanvasWindow.Designer.cs b/osu!Lyrics/CanvasForm.Designer.cs similarity index 99% rename from osu!Lyrics/CanvasWindow.Designer.cs rename to osu!Lyrics/CanvasForm.Designer.cs index 5c6b96f..5a6019d 100644 --- a/osu!Lyrics/CanvasWindow.Designer.cs +++ b/osu!Lyrics/CanvasForm.Designer.cs @@ -1,6 +1,6 @@ namespace osu_Lyrics { - partial class CanvasWindow + partial class CanvasForm { /// /// Required designer variable. diff --git a/osu!Lyrics/CanvasWindow.cs b/osu!Lyrics/CanvasForm.cs similarity index 99% rename from osu!Lyrics/CanvasWindow.cs rename to osu!Lyrics/CanvasForm.cs index c01a5e8..72c2ee2 100644 --- a/osu!Lyrics/CanvasWindow.cs +++ b/osu!Lyrics/CanvasForm.cs @@ -19,13 +19,13 @@ namespace osu_Lyrics { - internal partial class CanvasWindow : GhostLayeredWindow + internal partial class CanvasForm : GhostLayeredForm { #region Lyrics() - public static CanvasWindow Constructor; + public static CanvasForm Constructor; - public CanvasWindow() + public CanvasForm() { if (Constructor == null) { diff --git a/osu!Lyrics/Forms/GhostLayeredWindow.cs b/osu!Lyrics/Forms/GhostLayeredForm.cs similarity index 87% rename from osu!Lyrics/Forms/GhostLayeredWindow.cs rename to osu!Lyrics/Forms/GhostLayeredForm.cs index c646017..30cc3b7 100644 --- a/osu!Lyrics/Forms/GhostLayeredWindow.cs +++ b/osu!Lyrics/Forms/GhostLayeredForm.cs @@ -8,9 +8,9 @@ namespace osu_Lyrics.Forms { - class GhostLayeredWindow : LayeredWindow + class GhostLayeredForm : LayeredForm { - public GhostLayeredWindow() + public GhostLayeredForm() { ShowInTaskbar = false; } diff --git a/osu!Lyrics/Forms/LayeredWindow.cs b/osu!Lyrics/Forms/LayeredForm.cs similarity index 59% rename from osu!Lyrics/Forms/LayeredWindow.cs rename to osu!Lyrics/Forms/LayeredForm.cs index fa844d0..8a12f24 100644 --- a/osu!Lyrics/Forms/LayeredWindow.cs +++ b/osu!Lyrics/Forms/LayeredForm.cs @@ -11,9 +11,9 @@ namespace osu_Lyrics.Forms { [System.ComponentModel.DesignerCategory("code")] - class LayeredWindow : Form + class LayeredForm : Form { - public LayeredWindow() + public LayeredForm() { FormBorderStyle = FormBorderStyle.None; } @@ -70,32 +70,32 @@ protected override void OnSizeChanged(EventArgs e) protected void UpdateLayer() { - var hScreenDC = GetDC(IntPtr.Zero); - var hDC = CreateCompatibleDC(hScreenDC); - - try - { - var hBitmap = IntPtr.Zero; - using (var bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb)) - using (var g = Graphics.FromImage(bmp)) - { - Render(g); - hBitmap = bmp.GetHbitmap(Color.FromArgb(0)); - } - var hOldBitmap = SelectObject(hDC, hBitmap); - - UpdateLayeredWindow(Handle, hScreenDC, ref DestinationPoint, ref DestinationSize, hDC, ref SourcePoint, 0, ref BlendFunction, ULW_ALPHA); - - if (hBitmap != IntPtr.Zero) - { - SelectObject(hDC, hOldBitmap); - DeleteObject(hBitmap); - } - } - catch { } - - DeleteDC(hDC); - ReleaseDC(IntPtr.Zero, hScreenDC); + // スクリーンのGraphicsと、hdcを取得 + var gScreen = Graphics.FromHwnd(IntPtr.Zero); + var hdcScreen = gScreen.GetHdc(); + + // BITMAPのGraphicsと、hdcを取得 + var bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); + var gBitmap = Graphics.FromImage(bitmap); + Render(gBitmap); + var hdcBitmap = gBitmap.GetHdc(); + + // BITMAPのhdcで、サーフェイスのBITMAPを選択する + // このとき背景を無色透明にしておく + var hOldBitmap = SelectObject(hdcBitmap, bitmap.GetHbitmap(Color.FromArgb(0))); + + // レイヤードウィンドウの設定 + UpdateLayeredWindow( + Handle, hdcScreen, ref DestinationPoint, ref DestinationSize, + hdcBitmap, ref SourcePoint, 0, ref BlendFunction, ULW_ALPHA); + + // 後始末 + gScreen.ReleaseHdc(hdcScreen); + gScreen.Dispose(); + DeleteObject(SelectObject(hdcBitmap, hOldBitmap)); + gBitmap.ReleaseHdc(hdcBitmap); + gBitmap.Dispose(); + bitmap.Dispose(); } public virtual void Render(Graphics g) { } diff --git a/osu!Lyrics/Program.cs b/osu!Lyrics/Program.cs index 04e41bf..2f4c91d 100644 --- a/osu!Lyrics/Program.cs +++ b/osu!Lyrics/Program.cs @@ -26,7 +26,7 @@ private static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new CanvasWindow()); + Application.Run(new CanvasForm()); Osu.UnhookKeyboard(); } diff --git a/osu!Lyrics/Settings.cs b/osu!Lyrics/Settings.cs index f011e0f..bb96f4a 100644 --- a/osu!Lyrics/Settings.cs +++ b/osu!Lyrics/Settings.cs @@ -539,8 +539,8 @@ public static Point DrawingOrigin if (_DrawingOrigin.IsEmpty) { _DrawingOrigin = new Point( - HorizontalOffset + (int) HorizontalAlign * CanvasWindow.Constructor.Width / 2, - VerticalOffset + (int) VerticalAlign * CanvasWindow.Constructor.Height / 2); + HorizontalOffset + (int) HorizontalAlign * CanvasForm.Constructor.Width / 2, + VerticalOffset + (int) VerticalAlign * CanvasForm.Constructor.Height / 2); } return _DrawingOrigin; } @@ -663,10 +663,10 @@ private static void UpdateScreen() _Border = null; _DrawingOrigin = Point.Empty; - CanvasWindow.Constructor.Invoke(new MethodInvoker(() => + CanvasForm.Constructor.Invoke(new MethodInvoker(() => { - CanvasWindow.Constructor.Visible = true; - CanvasWindow.Constructor.Refresh(); + CanvasForm.Constructor.Visible = true; + CanvasForm.Constructor.Refresh(); })); } diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index ad502ec..4a7d1f2 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -57,15 +57,15 @@ - + - + - - - CanvasWindow.cs + + + CanvasForm.cs From 45f4c2205b16fc62fc3938687811702c74a2ccab Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Fri, 17 Nov 2017 21:18:23 +0900 Subject: [PATCH 32/48] =?UTF-8?q?CanvasForm=EC=97=90=EC=84=9C=20LyricManag?= =?UTF-8?q?er=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Audio/AudioInfo.cs | 7 +- osu!Lyrics/CanvasForm.cs | 263 ++---------------- osu!Lyrics/Forms/LayeredForm.cs | 10 +- .../Interop/MessageReceivedEventArgs.cs | 2 +- osu!Lyrics/Lyrics/Lyric.cs | 33 ++- osu!Lyrics/Lyrics/LyricLine.cs | 27 ++ osu!Lyrics/Lyrics/LyricManager.cs | 241 ++++++++++++++++ osu!Lyrics/osu!Lyrics.csproj | 2 + 8 files changed, 316 insertions(+), 269 deletions(-) create mode 100644 osu!Lyrics/Lyrics/LyricLine.cs create mode 100644 osu!Lyrics/Lyrics/LyricManager.cs diff --git a/osu!Lyrics/Audio/AudioInfo.cs b/osu!Lyrics/Audio/AudioInfo.cs index 1902699..9074f0c 100644 --- a/osu!Lyrics/Audio/AudioInfo.cs +++ b/osu!Lyrics/Audio/AudioInfo.cs @@ -7,11 +7,8 @@ internal class AudioInfo public string CheckSum { get; set; } public Beatmap.BeatmapMetadata Beatmap { get; set; } - public double Sync; + public double Sync = 0; - public AudioInfo() - { - this.Sync = 0; - } + public AudioInfo() { } } } diff --git a/osu!Lyrics/CanvasForm.cs b/osu!Lyrics/CanvasForm.cs index 72c2ee2..3a38bef 100644 --- a/osu!Lyrics/CanvasForm.cs +++ b/osu!Lyrics/CanvasForm.cs @@ -24,6 +24,7 @@ internal partial class CanvasForm : GhostLayeredForm #region Lyrics() public static CanvasForm Constructor; + public LyricManager lyricManager = new LyricManager(); public CanvasForm() { @@ -33,10 +34,20 @@ public CanvasForm() } InitializeComponent(); - Osu.MessageReceived += Osu_MessageReceived; + //Osu.MessageReceived += Osu_MessageReceived; + // Invoke these + lyricManager.LyricChanged += (s, e) => Refresh(); + lyricManager.PlaySpeedChanged += (s, e) => Refresh(); + lyricManager.PlayTimeChanged += (s, e) => Refresh(); + lyricManager.AudioChanged += (s, e) => Refresh(); Osu.KeyDown += Osu_KeyDown; } + ~CanvasForm() + { + Osu.KeyDown -= Osu_KeyDown; + } + public override void Render(Graphics g) { g.SmoothingMode = SmoothingMode.AntiAlias; @@ -88,10 +99,7 @@ private async void Lyrics_Shown(object sender, EventArgs e) Visible = false; } - if (NewLyricAvailable()) - { - Refresh(); - } + Refresh(); await Task.Delay(Settings.RefreshRate); } @@ -131,234 +139,6 @@ private void timer1_Tick(object sender, EventArgs e) #endregion - private static double Now() => new TimeSpan(DateTime.Now.Ticks).TotalSeconds; - - /// - /// 알송 서버에서 가사를 가져옴. - /// - /// [HASH]: ... | [ARTIST]: ..., [TITLE]: ... - /// List<string> - private static async Task> GetLyricsAsync(IDictionary data) - { - try - { - var act = "GetLyric5"; - if (!data.ContainsKey("[HASH]")) - { - act = "GetResembleLyric2"; - } - var content = data.Aggregate(Resources.ResourceManager.GetString(act), (o, i) => o.Replace(i.Key, i.Value)); - - var wr = Request.Create(@"http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"); - wr.Method = "POST"; - wr.UserAgent = "gSOAP"; - wr.ContentType = "application/soap+xml; charset=UTF-8"; - wr.Headers.Add("SOAPAction", "ALSongWebServer/" + act); - - using (var rq = new StreamWriter(wr.GetRequestStream())) - { - rq.Write(content); - } - - using (var rp = new StreamReader(wr.GetResponse().GetResponseStream())) - { - return WebUtility.HtmlDecode(rp.ReadToEnd().Split(new[] { "", "" }, StringSplitOptions.None)[1]) - .Split(new[] { "
" }, StringSplitOptions.RemoveEmptyEntries) - .Select(i => new Lyric(i)) - .Where(i => i.Text.Length != 0) - .ToList(); - } - } - catch - { - return null; - } - } - - - - - - - private AudioInfo curAudio = new AudioInfo(); - - private double _curTimeChanged; - private double _curTime; - private double _playbackRate; - - private double curTime - { - get - { - var elapsedTime = (Now() - _curTimeChanged) *_playbackRate; - return _curTime + elapsedTime - curAudio.Sync; - } - set - { - if (value < _curTime) - { - lyricsCache = lyricsCache; - } - _curTimeChanged = Now(); - _curTime = value; - } - } - - private readonly Queue lyrics = new Queue(); - private List _lyricsCache = new List { new Lyric() }; - - private List lyricsCache - { - get - { - return _lyricsCache; - } - set - { - _lyricsCache = value; - lyrics.Clear(); - value.ForEach(lyrics.Enqueue); - curLyric = new Lyric(); - } - } - - private void Osu_MessageReceived(object sender, MessageReceivedEventArgs e) - { - // 재생 중인 곡이 바꼈다! - if (e.AudioPath != curAudio.Path) - { - using (var fs = new FileStream(e.AudioPath, FileMode.Open, FileAccess.Read)) - { - curAudio = Audio.Formats.AudioDecoder.GetDecoder(fs)?.Decode(fs); - } - curAudio.Path = e.AudioPath; - using (var sr = new StreamReader(e.BeatmapPath)) - { - curAudio.Beatmap = Beatmap.Formats.BeatmapDecoder.GetDecoder(sr)?.Decode(sr); - } - UpdateLyrics(); - } - curTime = DateTimeOffset.Now.Subtract(DateTimeOffset.FromFileTime(e.SystemTime)).TotalSeconds + e.AudioPlayTime; - _playbackRate = 1 + e.AudioPlaySpeed / 100; - } - - private CancellationTokenSource cts; - - private void UpdateLyrics() - { - if (cts != null) - { - cts.Cancel(); - return; - } - - lyricsCache = new List - { - new Lyric(0, "가사 받는 중...") - }; - cts = new CancellationTokenSource(); - Task.Run(async () => - { - cts.Token.ThrowIfCancellationRequested(); - // 파일 해시로 가사 검색 - var newLyrics = await GetLyricsAsync(new Dictionary - { - { "[HASH]", curAudio.CheckSum } - }); - - if (newLyrics == null && curAudio.Beatmap != null) - { - cts.Token.ThrowIfCancellationRequested(); - // 음악 정보로 가사 검색 - newLyrics = await GetLyricsAsync(new Dictionary - { - { "[TITLE]", curAudio.Beatmap.TitleUnicode ?? curAudio.Beatmap.Title }, - { "[ARTIST]", curAudio.Beatmap.ArtistUnicode ?? curAudio.Beatmap.Artist } - }); - } - - if (newLyrics != null) - { - newLyrics.Insert(0, new Lyric()); - } - else - { - newLyrics = new List - { - new Lyric(0, "가사 없음") - }; - } - - cts.Token.ThrowIfCancellationRequested(); - Invoke(new MethodInvoker(() => - { - lyricsCache = newLyrics; - })); - }, cts.Token).ContinueWith(result => Invoke(new MethodInvoker(() => - { - cts = null; - if (result.IsCanceled) - { - UpdateLyrics(); - } - }))); - } - - - - - private Lyric _curLyric = new Lyric(); - - private Lyric curLyric - { - get { return _curLyric; } - set - { - _curLyric = value; - lyricBuffer.Clear(); - } - } - - private readonly List lyricBuffer = new List - { - "선곡하세요" - }; - - private bool NewLyricAvailable() - { - var flag = false; - while (lyrics.Count > 0) - { - var lyric = lyrics.Peek(); - - if (lyric.Time < curLyric.Time) - { - lyrics.Dequeue(); - continue; - } - - if (lyric.Time <= curTime) - { - if (!lyric.Time.Equals(curLyric.Time) || (lyric.Time.Equals(0) && curLyric.Time.Equals(0))) - { - curLyric = lyric; - flag = true; - } - lyricBuffer.Add(lyric.Text); - lyrics.Dequeue(); - } - else - { - break; - } - } - return flag; - } - - - - - private bool showLyric = true; private void DrawLyric(Graphics g) @@ -384,19 +164,20 @@ private void DrawLyric(Graphics g) } var lyricBuilder = new StringBuilder(); + var lyricBuffer = lyricManager.GetLyric(); var lyricCount = lyricBuffer.Count; if (Settings.LineCount == 0) { foreach (var i in lyricBuffer) { - lyricBuilder.AppendLine(i); + lyricBuilder.AppendLine(i.Text); } } else if (Settings.LineCount > 0) { for (var i = 0; i < Settings.LineCount && i < lyricCount; i++) { - lyricBuilder.AppendLine(lyricBuffer[i]); + lyricBuilder.AppendLine(lyricBuffer[i].Text); } } else @@ -408,7 +189,7 @@ private void DrawLyric(Graphics g) } for (; i < lyricCount; i++) { - lyricBuilder.AppendLine(lyricBuffer[i]); + lyricBuilder.AppendLine(lyricBuffer[i].Text); } } @@ -452,15 +233,14 @@ private void Osu_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Settings.KeyBackward) { - curAudio.Sync += 0.5; - lyricsCache = lyricsCache; - Notice("싱크 느리게({0}초)", curAudio.Sync.ToString("F1")); + lyricManager.LyricSync += 0.5; + Notice("싱크 느리게({0}초)", lyricManager.LyricSync.ToString("F1")); return; } if (e.KeyData == Settings.KeyForward) { - curAudio.Sync -= 0.5; - Notice("싱크 빠르게({0}초)", curAudio.Sync.ToString("F1")); + lyricManager.LyricSync -= 0.5; + Notice("싱크 빠르게({0}초)", lyricManager.LyricSync.ToString("F1")); return; } } @@ -495,6 +275,7 @@ private void menuSetting_Click(object sender, EventArgs e) TopMost = true }; Settings.ShowDialog(); + Settings.Dispose(); Settings = null; } else diff --git a/osu!Lyrics/Forms/LayeredForm.cs b/osu!Lyrics/Forms/LayeredForm.cs index 8a12f24..e9dafa4 100644 --- a/osu!Lyrics/Forms/LayeredForm.cs +++ b/osu!Lyrics/Forms/LayeredForm.cs @@ -31,13 +31,13 @@ protected override CreateParams CreateParams protected override void OnLoad(EventArgs e) { base.OnLoad(e); - UpdateLayer(); + UpdateWindow(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); - UpdateLayer(); + UpdateWindow(); } private Point DestinationPoint = Point.Empty; @@ -46,7 +46,7 @@ protected override void OnLocationChanged(EventArgs e) { base.OnLocationChanged(e); DestinationPoint = Location; - UpdateLayer(); + UpdateWindow(); } private Size DestinationSize = Size.Empty; @@ -55,7 +55,7 @@ protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); DestinationSize = Size; - UpdateLayer(); + UpdateWindow(); } protected Point SourcePoint = Point.Empty; @@ -68,7 +68,7 @@ protected override void OnSizeChanged(EventArgs e) AlphaFormat = AC_SRC_ALPHA }; - protected void UpdateLayer() + protected void UpdateWindow() { // スクリーンのGraphicsと、hdcを取得 var gScreen = Graphics.FromHwnd(IntPtr.Zero); diff --git a/osu!Lyrics/Interop/MessageReceivedEventArgs.cs b/osu!Lyrics/Interop/MessageReceivedEventArgs.cs index 3fa5ef0..5c8a245 100644 --- a/osu!Lyrics/Interop/MessageReceivedEventArgs.cs +++ b/osu!Lyrics/Interop/MessageReceivedEventArgs.cs @@ -16,7 +16,7 @@ public MessageReceivedEventArgs(string data) dataFetched = data.Split('|'); } - public long SystemTime => long.Parse(dataFetched[0], NumberStyles.HexNumber); + public DateTime CreatedTime => DateTime.FromFileTime(long.Parse(dataFetched[0], NumberStyles.HexNumber)); public string AudioPath => dataFetched[1]; diff --git a/osu!Lyrics/Lyrics/Lyric.cs b/osu!Lyrics/Lyrics/Lyric.cs index 840d759..6d614fe 100644 --- a/osu!Lyrics/Lyrics/Lyric.cs +++ b/osu!Lyrics/Lyrics/Lyric.cs @@ -1,30 +1,29 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace osu_Lyrics.Lyrics { - internal class Lyric + class Lyric : List { - public double Time { get; private set; } - public string Text { get; private set; } + public string Title { get; set; } + public string Artist { get; set; } + public double Sync { get; set; } - public Lyric(string data) - { - // [0:2.4]가사@ - var lyric = data.Split(new[] { ']' }, 2); - var time = lyric[0].Substring(1).Split(':'); - Time = Convert.ToDouble(time[0]) * 60 + Convert.ToDouble(time[1]); - Text = lyric[1].Trim(); - } + public Lyric() { } - public Lyric() + public Lyric(string[] data) { - Text = ""; + AddRange(data.Select(i => new LyricLine(i))); } - public Lyric(double time, string text) + public Lyric(string line) { - Time = time; - Text = text; + Add(new LyricLine(0, line)); } + + public IEnumerator EnumeratorAt(double time) => this.SkipWhile(i => i.Time < time).GetEnumerator(); } -} \ No newline at end of file +} diff --git a/osu!Lyrics/Lyrics/LyricLine.cs b/osu!Lyrics/Lyrics/LyricLine.cs new file mode 100644 index 0000000..e7eff52 --- /dev/null +++ b/osu!Lyrics/Lyrics/LyricLine.cs @@ -0,0 +1,27 @@ +using System; + +namespace osu_Lyrics.Lyrics +{ + internal class LyricLine + { + public double Time { get; private set; } + public string Text { get; private set; } + + public LyricLine() { } + + public LyricLine(string data) + { + // [0:2.4]가사@ + var lyric = data.Split(new[] { ']' }, 2); + var time = lyric[0].TrimStart('[').Split(':'); + Time = double.Parse(time[0]) * 60 + double.Parse(time[1]); + Text = lyric.Length > 1 ? lyric[1].Trim() : string.Empty; + } + + public LyricLine(double time, string text) + { + Time = time; + Text = text; + } + } +} \ No newline at end of file diff --git a/osu!Lyrics/Lyrics/LyricManager.cs b/osu!Lyrics/Lyrics/LyricManager.cs new file mode 100644 index 0000000..de5bfea --- /dev/null +++ b/osu!Lyrics/Lyrics/LyricManager.cs @@ -0,0 +1,241 @@ +using osu_Lyrics.Interop; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace osu_Lyrics.Lyrics +{ + class LyricManager + { + private LyricLine currentLine = new LyricLine(); + private Lyric lyric = new Lyric(); + public Lyric Lyric + { + get { return lyric; } + set + { + lyric = value; + LyricSync = 0; + LyricChanged?.Invoke(null, null); + } + } + private string status = "선곡하세요"; + + private static double Now => new TimeSpan(DateTime.Now.Ticks).TotalSeconds; + + /// + /// TODO when lyric reset, sync reset + /// + private double lyricSync = 0; + public double LyricSync + { + get { return lyricSync; } + set + { + lyricSync = value; + currentLine = Lyric.FirstOrDefault() ?? new LyricLine(); + } + } + + public double PlayTimeElapsed + { + get + { + var elapsedTime = (Now - playTimeChanged) * PlaySpeed; + return PlayTime + elapsedTime - LyricSync; + } + } + + private double playTimeChanged = 0; + private double playTime = 0; + public double PlayTime + { + get { return playTime; } + set + { + playTime = value; + playTimeChanged = Now; + currentLine = Lyric.FirstOrDefault() ?? new LyricLine(); + PlayTimeChanged?.Invoke(null, null); + } + } + + private double playSpeed = 0; + public double PlaySpeed + { + get { return playSpeed; } + set + { + playSpeed = value; + PlaySpeedChanged?.Invoke(null, null); + } + } + + public string AudioPath { get; set; } + public Audio.AudioInfo AudioInfo { get; set; } + public Beatmap.BeatmapMetadata BeatmapMetadata { get; set; } + + public LyricManager() + { + Osu.MessageReceived += Osu_MessageReceived; + } + + ~LyricManager() + { + Osu.MessageReceived -= Osu_MessageReceived; + } + + public event EventHandler AudioChanged; + public event EventHandler LyricChanged; + public event EventHandler PlayTimeChanged; + public event EventHandler PlaySpeedChanged; + + private void Osu_MessageReceived(object sender, MessageReceivedEventArgs e) + { + // 재생 중인 곡이 바꼈다! + if (e.AudioPath != AudioPath) + { + AudioPath = e.AudioPath; + using (var fs = new FileStream(e.AudioPath, FileMode.Open, FileAccess.Read)) + { + AudioInfo = Audio.Formats.AudioDecoder.GetDecoder(fs)?.Decode(fs); + } + using (var sr = new StreamReader(e.BeatmapPath)) + { + BeatmapMetadata = Beatmap.Formats.BeatmapDecoder.GetDecoder(sr)?.Decode(sr); + } + + FetchLyric(); + } + PlayTime = DateTime.Now.Subtract(e.CreatedTime).TotalSeconds + e.AudioPlayTime; + PlaySpeed = 1 + e.AudioPlaySpeed / 100; + } + + private CancellationTokenSource cts; + private void FetchLyric() + { + if (cts != null) + { + cts.Cancel(); + return; + } + + cts = new CancellationTokenSource(); + status = "가사 받는 중..."; + Lyric.Clear(); + AudioChanged?.BeginInvoke(null, null, null, null); + Task.Run(async () => + { + cts.Token.ThrowIfCancellationRequested(); + // 파일 해시로 가사 검색 + var newLyrics = await GetLyricsAsync(new Dictionary + { + { "[HASH]", AudioInfo.CheckSum } + }); + + if (newLyrics == null && BeatmapMetadata != null) + { + cts.Token.ThrowIfCancellationRequested(); + // 음악 정보로 가사 검색 + newLyrics = await GetLyricsAsync(new Dictionary + { + { "[TITLE]", BeatmapMetadata.TitleUnicode ?? BeatmapMetadata.Title }, + { "[ARTIST]", BeatmapMetadata.ArtistUnicode ?? BeatmapMetadata.Artist } + }); + } + + newLyrics?.Insert(0, new LyricLine()); + + cts.Token.ThrowIfCancellationRequested(); + if (newLyrics == null) + { + status = "가사 없음"; + Lyric.Clear(); + } + else + { + Lyric = newLyrics; + } + }, cts.Token).ContinueWith(result => + { + cts = null; + if (result.IsCanceled) + { + FetchLyric(); + } + }); + } + + public Lyric GetLyric() + { + if (!lyric.Any()) + { + return new Lyric + { + new LyricLine(0, status) + }; + } + + var ret = new Lyric(); + var end = Lyric.SkipWhile(i => i.Time < PlayTimeElapsed).FirstOrDefault(); + foreach (var line in Lyric.SkipWhile(i => i.Time < currentLine.Time)) + { + if (end != null && line.Time >= end.Time) + { + break; + } + if (line.Time > currentLine.Time) + { + currentLine = line; + ret.Clear(); + } + ret.Add(line); + } + return ret; + } + + /// + /// 알송 서버에서 가사를 가져옴. + /// + /// [HASH]: ... | [ARTIST]: ..., [TITLE]: ... + /// List<string> + private static async Task GetLyricsAsync(IDictionary data) + { + try + { + var act = "GetLyric5"; + if (!data.ContainsKey("[HASH]")) + { + act = "GetResembleLyric2"; + } + var content = data.Aggregate(Properties.Resources.ResourceManager.GetString(act), (o, i) => o.Replace(i.Key, i.Value)); + + var wr = Request.Create(@"http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"); + wr.Method = "POST"; + wr.UserAgent = "gSOAP"; + wr.ContentType = "application/soap+xml; charset=UTF-8"; + wr.Headers.Add("SOAPAction", "ALSongWebServer/" + act); + + using (var rq = new StreamWriter(wr.GetRequestStream())) + { + rq.Write(content); + } + + using (var rp = new StreamReader(wr.GetResponse().GetResponseStream())) + { + return new Lyric(System.Net.WebUtility.HtmlDecode( + rp.ReadToEnd().Split(new[] { "", "" }, StringSplitOptions.None)[1]) + .Split(new[] { "
" }, StringSplitOptions.RemoveEmptyEntries)); + } + } + catch + { + return null; + } + } + } +} diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 4a7d1f2..07902dd 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -63,6 +63,7 @@ + CanvasForm.cs @@ -70,6 +71,7 @@ + From 001f2ac9869dd39e8c6027901b73a9929cf4cf07 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Sat, 18 Nov 2017 13:55:49 +0900 Subject: [PATCH 33/48] =?UTF-8?q?LayeredForm=EC=97=90=20ClickThrough=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Forms/GhostLayeredForm.cs | 2 +- osu!Lyrics/Forms/LayeredForm.cs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/osu!Lyrics/Forms/GhostLayeredForm.cs b/osu!Lyrics/Forms/GhostLayeredForm.cs index 30cc3b7..7f1101b 100644 --- a/osu!Lyrics/Forms/GhostLayeredForm.cs +++ b/osu!Lyrics/Forms/GhostLayeredForm.cs @@ -20,7 +20,7 @@ protected override CreateParams CreateParams get { var cp = base.CreateParams; - cp.ExStyle |= WS_EX_NOACTIVATE | WS_EX_TRANSPARENT; + cp.ExStyle |= WS_EX_NOACTIVATE; return cp; } } diff --git a/osu!Lyrics/Forms/LayeredForm.cs b/osu!Lyrics/Forms/LayeredForm.cs index e9dafa4..1e02ce3 100644 --- a/osu!Lyrics/Forms/LayeredForm.cs +++ b/osu!Lyrics/Forms/LayeredForm.cs @@ -13,6 +13,8 @@ namespace osu_Lyrics.Forms [System.ComponentModel.DesignerCategory("code")] class LayeredForm : Form { + public bool ClickThrough { get; set; } = true; + public LayeredForm() { FormBorderStyle = FormBorderStyle.None; @@ -24,6 +26,10 @@ protected override CreateParams CreateParams { var cp = base.CreateParams; cp.ExStyle |= WS_EX_LAYERED; + if (ClickThrough) + { + cp.ExStyle |= WS_EX_TRANSPARENT; + } return cp; } } From 5354bdc6495d2d5e85c0fe10bf5645df55f906d6 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Sat, 18 Nov 2017 14:53:53 +0900 Subject: [PATCH 34/48] =?UTF-8?q?LyricManager=EC=97=90=EC=84=9C=20AlsongSo?= =?UTF-8?q?urce=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Lyrics/LyricManager.cs | 77 +++++------------------ osu!Lyrics/Lyrics/Sources/AlsongSource.cs | 68 ++++++++++++++++++++ osu!Lyrics/Lyrics/Sources/LyricSource.cs | 31 +++++++++ osu!Lyrics/osu!Lyrics.csproj | 2 + 4 files changed, 115 insertions(+), 63 deletions(-) create mode 100644 osu!Lyrics/Lyrics/Sources/AlsongSource.cs create mode 100644 osu!Lyrics/Lyrics/Sources/LyricSource.cs diff --git a/osu!Lyrics/Lyrics/LyricManager.cs b/osu!Lyrics/Lyrics/LyricManager.cs index de5bfea..942672e 100644 --- a/osu!Lyrics/Lyrics/LyricManager.cs +++ b/osu!Lyrics/Lyrics/LyricManager.cs @@ -1,4 +1,5 @@ using osu_Lyrics.Interop; +using osu_Lyrics.Lyrics.Sources; using System; using System.Collections.Generic; using System.IO; @@ -130,36 +131,21 @@ private void FetchLyric() AudioChanged?.BeginInvoke(null, null, null, null); Task.Run(async () => { - cts.Token.ThrowIfCancellationRequested(); - // 파일 해시로 가사 검색 - var newLyrics = await GetLyricsAsync(new Dictionary - { - { "[HASH]", AudioInfo.CheckSum } - }); - - if (newLyrics == null && BeatmapMetadata != null) + Lyric ret = null; + foreach (var source in LyricSource.sources) { cts.Token.ThrowIfCancellationRequested(); - // 음악 정보로 가사 검색 - newLyrics = await GetLyricsAsync(new Dictionary + ret = await source.GetLyricAsync(AudioInfo); + if (ret != null) { - { "[TITLE]", BeatmapMetadata.TitleUnicode ?? BeatmapMetadata.Title }, - { "[ARTIST]", BeatmapMetadata.ArtistUnicode ?? BeatmapMetadata.Artist } - }); + break; + } } - newLyrics?.Insert(0, new LyricLine()); + ret?.Insert(0, new LyricLine()); cts.Token.ThrowIfCancellationRequested(); - if (newLyrics == null) - { - status = "가사 없음"; - Lyric.Clear(); - } - else - { - Lyric = newLyrics; - } + Lyric = ret ?? throw new Exception(); }, cts.Token).ContinueWith(result => { cts = null; @@ -167,6 +153,11 @@ private void FetchLyric() { FetchLyric(); } + else if (result.IsFaulted) + { + status = "가사 없음"; + lyric.Clear(); + } }); } @@ -197,45 +188,5 @@ public Lyric GetLyric() } return ret; } - - /// - /// 알송 서버에서 가사를 가져옴. - /// - /// [HASH]: ... | [ARTIST]: ..., [TITLE]: ... - /// List<string> - private static async Task GetLyricsAsync(IDictionary data) - { - try - { - var act = "GetLyric5"; - if (!data.ContainsKey("[HASH]")) - { - act = "GetResembleLyric2"; - } - var content = data.Aggregate(Properties.Resources.ResourceManager.GetString(act), (o, i) => o.Replace(i.Key, i.Value)); - - var wr = Request.Create(@"http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"); - wr.Method = "POST"; - wr.UserAgent = "gSOAP"; - wr.ContentType = "application/soap+xml; charset=UTF-8"; - wr.Headers.Add("SOAPAction", "ALSongWebServer/" + act); - - using (var rq = new StreamWriter(wr.GetRequestStream())) - { - rq.Write(content); - } - - using (var rp = new StreamReader(wr.GetResponse().GetResponseStream())) - { - return new Lyric(System.Net.WebUtility.HtmlDecode( - rp.ReadToEnd().Split(new[] { "", "" }, StringSplitOptions.None)[1]) - .Split(new[] { "
" }, StringSplitOptions.RemoveEmptyEntries)); - } - } - catch - { - return null; - } - } } } diff --git a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs new file mode 100644 index 0000000..5640122 --- /dev/null +++ b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using osu_Lyrics.Audio; +using System.IO; + +namespace osu_Lyrics.Lyrics.Sources +{ + class AlsongSource : LyricSource + { + public static void Register() + { + AddSource(); + } + + public override Task GetLyricAsync(AudioInfo audio) + { + return GetLyric5Async(audio.CheckSum) + ?? GetResembleLyric2Async( + audio.Beatmap.TitleUnicode ?? audio.Beatmap.Title, + audio.Beatmap.ArtistUnicode ?? audio.Beatmap.ArtistUnicode); + } + + public Task GetLyric5Async(string checkSum) + { + var data = Properties.Resources.ResourceManager.GetString("GetLyric5"); + data = data.Replace("[HASH]", checkSum); + return GetResponseAsync("GetLyric5", data); + } + + public Task GetResembleLyric2Async(string title, string artist) + { + var data = Properties.Resources.ResourceManager.GetString("GetResembleLyric2"); + data = data.Replace("[TITLE]", title).Replace("[ARTIST]", artist); + return GetResponseAsync("GetResembleLyric2", data); + } + + private async Task GetResponseAsync(string action, string data) + { + try + { + var wr = Request.Create(@"http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"); + wr.Method = "POST"; + wr.UserAgent = "gSOAP"; + wr.ContentType = "application/soap+xml; charset=UTF-8"; + wr.Headers.Add("SOAPAction", "ALSongWebServer/" + action); + + using (var rq = new StreamWriter(wr.GetRequestStream())) + { + rq.Write(data); + } + + using (var rp = new StreamReader(wr.GetResponse().GetResponseStream())) + { + return new Lyric(System.Net.WebUtility.HtmlDecode( + rp.ReadToEnd().Split(new[] { "", "" }, StringSplitOptions.None)[1]) + .Split(new[] { "
" }, StringSplitOptions.RemoveEmptyEntries)); + } + } + catch + { + return null; + } + } + } +} diff --git a/osu!Lyrics/Lyrics/Sources/LyricSource.cs b/osu!Lyrics/Lyrics/Sources/LyricSource.cs new file mode 100644 index 0000000..2681a80 --- /dev/null +++ b/osu!Lyrics/Lyrics/Sources/LyricSource.cs @@ -0,0 +1,31 @@ +using osu_Lyrics.Audio; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Lyrics.Sources +{ + internal abstract class LyricSource + { + public static readonly List sources = new List(); + + static LyricSource() + { + AlsongSource.Register(); + } + + protected static void AddSource() where T : LyricSource + { + sources.Add((LyricSource) Activator.CreateInstance(typeof(T))); + } + + public Lyric GetLyric(AudioInfo audio) + { + return GetLyricAsync(audio).GetAwaiter().GetResult(); + } + + public abstract Task GetLyricAsync(AudioInfo audio); + } +} diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 07902dd..59e9f42 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -72,6 +72,8 @@ + + From a19aabf386ad5ef2a15ded98260e4af305f59f65 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Mon, 27 Nov 2017 08:36:08 +0900 Subject: [PATCH 35/48] =?UTF-8?q?TruncateLyric=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/CanvasForm.cs | 29 +++-------------------------- osu!Lyrics/Lyrics/LyricManager.cs | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/osu!Lyrics/CanvasForm.cs b/osu!Lyrics/CanvasForm.cs index 3a38bef..2cd62f0 100644 --- a/osu!Lyrics/CanvasForm.cs +++ b/osu!Lyrics/CanvasForm.cs @@ -164,33 +164,10 @@ private void DrawLyric(Graphics g) } var lyricBuilder = new StringBuilder(); - var lyricBuffer = lyricManager.GetLyric(); - var lyricCount = lyricBuffer.Count; - if (Settings.LineCount == 0) + var lyric = lyricManager.GetLyricAtNow(); + foreach (var l in lyricManager.TruncateLyric(lyric)) { - foreach (var i in lyricBuffer) - { - lyricBuilder.AppendLine(i.Text); - } - } - else if (Settings.LineCount > 0) - { - for (var i = 0; i < Settings.LineCount && i < lyricCount; i++) - { - lyricBuilder.AppendLine(lyricBuffer[i].Text); - } - } - else - { - var i = lyricCount + Settings.LineCount; - if (i < 0) - { - i = 0; - } - for (; i < lyricCount; i++) - { - lyricBuilder.AppendLine(lyricBuffer[i].Text); - } + lyricBuilder.AppendLine(l.Text); } using (var path = new GraphicsPath()) diff --git a/osu!Lyrics/Lyrics/LyricManager.cs b/osu!Lyrics/Lyrics/LyricManager.cs index 942672e..2324be1 100644 --- a/osu!Lyrics/Lyrics/LyricManager.cs +++ b/osu!Lyrics/Lyrics/LyricManager.cs @@ -161,7 +161,7 @@ private void FetchLyric() }); } - public Lyric GetLyric() + public Lyric GetLyricAtNow() { if (!lyric.Any()) { @@ -188,5 +188,21 @@ public Lyric GetLyric() } return ret; } + + public Lyric TruncateLyric(Lyric lyric) + { + if (Settings.LineCount == 0) + { + return lyric; + } + else if (Settings.LineCount > 0) + { + return (Lyric) lyric.Take(Settings.LineCount); + } + else + { + return (Lyric) lyric.Skip(Math.Max(0, lyric.Count + Settings.LineCount)); + } + } } } From 5156f4c3c005c639da4bea2d0f0af9d3714998d5 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Mon, 25 Dec 2017 10:18:08 +0900 Subject: [PATCH 36/48] =?UTF-8?q?=EA=B0=80=EC=82=AC=20=EB=B0=9B=EB=8A=94?= =?UTF-8?q?=20=EB=B9=84=EB=8F=99=EA=B8=B0=20=EC=9E=91=EC=97=85=20=EB=B3=91?= =?UTF-8?q?=EB=A0=AC=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Interop/Osu.cs | 2 +- osu!Lyrics/Lyrics/LyricManager.cs | 4 ++-- osu!Lyrics/Lyrics/Sources/AlsongSource.cs | 7 ++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/osu!Lyrics/Interop/Osu.cs b/osu!Lyrics/Interop/Osu.cs index 5e2844b..40c74a9 100644 --- a/osu!Lyrics/Interop/Osu.cs +++ b/osu!Lyrics/Interop/Osu.cs @@ -141,7 +141,7 @@ private static bool InjectDll(string dllPath) WriteProcessMemory(hProcess, pParameter, szFileName, nFileNameLength, out _); Marshal.FreeHGlobal(szFileName); - var pThreadProc = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"); + var pThreadProc = GetProcAddress(GetModuleHandle(ExternDll.Kernel32), "LoadLibraryW"); var hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, pThreadProc, pParameter, 0, IntPtr.Zero); WaitForSingleObject(hThread, INFINITE); diff --git a/osu!Lyrics/Lyrics/LyricManager.cs b/osu!Lyrics/Lyrics/LyricManager.cs index 2324be1..bd10b6a 100644 --- a/osu!Lyrics/Lyrics/LyricManager.cs +++ b/osu!Lyrics/Lyrics/LyricManager.cs @@ -132,10 +132,10 @@ private void FetchLyric() Task.Run(async () => { Lyric ret = null; - foreach (var source in LyricSource.sources) + foreach (var lyricTask in LyricSource.sources.Select(i => i.GetLyricAsync(AudioInfo))) { cts.Token.ThrowIfCancellationRequested(); - ret = await source.GetLyricAsync(AudioInfo); + ret = await lyricTask; if (ret != null) { break; diff --git a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs index 5640122..64ee022 100644 --- a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs +++ b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs @@ -15,6 +15,11 @@ public static void Register() AddSource(); } + /// + /// TODO CONFIRM GETLYRIC5ASYNC RETURNS NULL + /// + /// + /// public override Task GetLyricAsync(AudioInfo audio) { return GetLyric5Async(audio.CheckSum) @@ -45,7 +50,7 @@ private async Task GetResponseAsync(string action, string data) wr.Method = "POST"; wr.UserAgent = "gSOAP"; wr.ContentType = "application/soap+xml; charset=UTF-8"; - wr.Headers.Add("SOAPAction", "ALSongWebServer/" + action); + wr.Headers.Add("SOAPAction", $@"""ALSongWebServer/{action}"""); using (var rq = new StreamWriter(wr.GetRequestStream())) { From 48aa1bfc7a68c38c6bbfc69ee17bbeb2f14924b0 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Mon, 25 Dec 2017 10:53:50 +0900 Subject: [PATCH 37/48] =?UTF-8?q?AlsongSource=20=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Lyrics/Sources/AlsongSourceTests.cs | 42 +++++++++++ osu!Lyrics.Test/Properties/AssemblyInfo.cs | 20 +++++ osu!Lyrics.Test/osu!Lyrics.Test.csproj | 73 +++++++++++++++++++ osu!Lyrics.Test/packages.config | 5 ++ osu!Lyrics.sln | 13 +++- osu!Lyrics/Audio/AudioInfo.cs | 2 +- osu!Lyrics/Beatmap/BeatmapMetadata.cs | 2 +- .../Beatmap/Formats/OsuLegacyDecoder.cs | 2 +- osu!Lyrics/Lyrics/Lyric.cs | 2 +- osu!Lyrics/Lyrics/LyricLine.cs | 2 +- osu!Lyrics/Lyrics/Sources/AlsongSource.cs | 2 +- osu!Lyrics/Lyrics/Sources/LyricSource.cs | 2 +- 12 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs create mode 100644 osu!Lyrics.Test/Properties/AssemblyInfo.cs create mode 100644 osu!Lyrics.Test/osu!Lyrics.Test.csproj create mode 100644 osu!Lyrics.Test/packages.config diff --git a/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs b/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs new file mode 100644 index 0000000..5b2eb8e --- /dev/null +++ b/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs @@ -0,0 +1,42 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using osu_Lyrics.Beatmap.Formats; +using osu_Lyrics.Lyrics.Sources; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Lyrics.Sources.Tests +{ + [TestClass()] + public class AlsongSourceTests + { + [TestMethod()] + public void RegisterTest() + { + } + + [TestMethod()] + public void GetLyricAsyncTest() + { + var al = new AlsongSource(); + Assert.IsNull(al.GetLyricAsync(new Audio.AudioInfo()).GetAwaiter().GetResult()); + Assert.IsNotNull(al.GetLyricAsync(new Audio.AudioInfo { Beatmap = new Beatmap.BeatmapMetadata { Artist = "아이유", Title = "좋은 날" } }).GetAwaiter().GetResult()); + } + + [TestMethod()] + public void GetLyric5AsyncTest() + { + var al = new AlsongSource(); + Assert.IsNull(al.GetLyric5Async("좋은 날").GetAwaiter().GetResult()); + } + + [TestMethod()] + public void GetResembleLyric2AsyncTest() + { + var al = new AlsongSource(); + Assert.IsNotNull(al.GetResembleLyric2Async("좋은 날", "아이유").GetAwaiter().GetResult()); + } + } +} \ No newline at end of file diff --git a/osu!Lyrics.Test/Properties/AssemblyInfo.cs b/osu!Lyrics.Test/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6805e69 --- /dev/null +++ b/osu!Lyrics.Test/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("osu!Lyrics.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("osu!Lyrics.Test")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("04660bb7-c1ab-430d-988b-33d8a29b37b4")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/osu!Lyrics.Test/osu!Lyrics.Test.csproj b/osu!Lyrics.Test/osu!Lyrics.Test.csproj new file mode 100644 index 0000000..fc63256 --- /dev/null +++ b/osu!Lyrics.Test/osu!Lyrics.Test.csproj @@ -0,0 +1,73 @@ + + + + + Debug + AnyCPU + {04660BB7-C1AB-430D-988B-33D8A29B37B4} + Library + Properties + osu_Lyrics.Test + osu!Lyrics.Test + v4.6.1 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + + + + + + + + + + + + + + {9161CC52-C03B-4CCD-AC44-A94C208D31F3} + osu!Lyrics + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/osu!Lyrics.Test/packages.config b/osu!Lyrics.Test/packages.config new file mode 100644 index 0000000..cf2d094 --- /dev/null +++ b/osu!Lyrics.Test/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/osu!Lyrics.sln b/osu!Lyrics.sln index 9052fc6..9ba62a8 100644 --- a/osu!Lyrics.sln +++ b/osu!Lyrics.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu!Lyrics", "osu!Lyrics\osu!Lyrics.csproj", "{9161CC52-C03B-4CCD-AC44-A94C208D31F3}" ProjectSection(ProjectDependencies) = postProject @@ -15,6 +15,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution LICENSE = LICENSE EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu!Lyrics.Test", "osu!Lyrics.Test\osu!Lyrics.Test.csproj", "{04660BB7-C1AB-430D-988B-33D8A29B37B4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -29,8 +31,15 @@ Global {55B49E76-AA07-447F-ADE2-B170269EC1EB}.Debug|Win32.Build.0 = Debug|Win32 {55B49E76-AA07-447F-ADE2-B170269EC1EB}.Release|Win32.ActiveCfg = Release|Win32 {55B49E76-AA07-447F-ADE2-B170269EC1EB}.Release|Win32.Build.0 = Release|Win32 + {04660BB7-C1AB-430D-988B-33D8A29B37B4}.Debug|Win32.ActiveCfg = Debug|Any CPU + {04660BB7-C1AB-430D-988B-33D8A29B37B4}.Debug|Win32.Build.0 = Debug|Any CPU + {04660BB7-C1AB-430D-988B-33D8A29B37B4}.Release|Win32.ActiveCfg = Release|Any CPU + {04660BB7-C1AB-430D-988B-33D8A29B37B4}.Release|Win32.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7195031E-664B-44D8-8EB0-E7060C85AFB5} + EndGlobalSection EndGlobal diff --git a/osu!Lyrics/Audio/AudioInfo.cs b/osu!Lyrics/Audio/AudioInfo.cs index 9074f0c..2ae56c3 100644 --- a/osu!Lyrics/Audio/AudioInfo.cs +++ b/osu!Lyrics/Audio/AudioInfo.cs @@ -1,6 +1,6 @@ namespace osu_Lyrics.Audio { - internal class AudioInfo + public class AudioInfo { public string Path { get; set; } diff --git a/osu!Lyrics/Beatmap/BeatmapMetadata.cs b/osu!Lyrics/Beatmap/BeatmapMetadata.cs index ca6daa9..972d87c 100644 --- a/osu!Lyrics/Beatmap/BeatmapMetadata.cs +++ b/osu!Lyrics/Beatmap/BeatmapMetadata.cs @@ -1,6 +1,6 @@ namespace osu_Lyrics.Beatmap { - internal class BeatmapMetadata + public class BeatmapMetadata { public string Title { get; set; } public string TitleUnicode { get; set; } diff --git a/osu!Lyrics/Beatmap/Formats/OsuLegacyDecoder.cs b/osu!Lyrics/Beatmap/Formats/OsuLegacyDecoder.cs index 65fbe7e..f3440de 100644 --- a/osu!Lyrics/Beatmap/Formats/OsuLegacyDecoder.cs +++ b/osu!Lyrics/Beatmap/Formats/OsuLegacyDecoder.cs @@ -7,7 +7,7 @@ namespace osu_Lyrics.Beatmap.Formats { - class OsuLegacyDecoder : BeatmapDecoder + internal class OsuLegacyDecoder : BeatmapDecoder { public static void Register() { diff --git a/osu!Lyrics/Lyrics/Lyric.cs b/osu!Lyrics/Lyrics/Lyric.cs index 6d614fe..d68b118 100644 --- a/osu!Lyrics/Lyrics/Lyric.cs +++ b/osu!Lyrics/Lyrics/Lyric.cs @@ -6,7 +6,7 @@ namespace osu_Lyrics.Lyrics { - class Lyric : List + public class Lyric : List { public string Title { get; set; } public string Artist { get; set; } diff --git a/osu!Lyrics/Lyrics/LyricLine.cs b/osu!Lyrics/Lyrics/LyricLine.cs index e7eff52..7d1af6f 100644 --- a/osu!Lyrics/Lyrics/LyricLine.cs +++ b/osu!Lyrics/Lyrics/LyricLine.cs @@ -2,7 +2,7 @@ namespace osu_Lyrics.Lyrics { - internal class LyricLine + public class LyricLine { public double Time { get; private set; } public string Text { get; private set; } diff --git a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs index 64ee022..72a41ef 100644 --- a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs +++ b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs @@ -8,7 +8,7 @@ namespace osu_Lyrics.Lyrics.Sources { - class AlsongSource : LyricSource + public class AlsongSource : LyricSource { public static void Register() { diff --git a/osu!Lyrics/Lyrics/Sources/LyricSource.cs b/osu!Lyrics/Lyrics/Sources/LyricSource.cs index 2681a80..323f85e 100644 --- a/osu!Lyrics/Lyrics/Sources/LyricSource.cs +++ b/osu!Lyrics/Lyrics/Sources/LyricSource.cs @@ -7,7 +7,7 @@ namespace osu_Lyrics.Lyrics.Sources { - internal abstract class LyricSource + public abstract class LyricSource { public static readonly List sources = new List(); From d3363fefcc2f7fcda4036efd677be89ababeae2c Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Mon, 25 Dec 2017 15:15:25 +0900 Subject: [PATCH 38/48] =?UTF-8?q?AlsongSource=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EC=B6=9C,=20GetLyricAsync=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Lyrics/Sources/AlsongSourceTests.cs | 27 ++++---- .../Lyrics/Sources/LyricSourceTests.cs | 34 ++++++++++ osu!Lyrics.Test/osu!Lyrics.Test.csproj | 1 + osu!Lyrics/Lyrics/LyricManager.cs | 8 ++- osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs | 24 +++++++ .../Lyrics/Sources/AlsongGetResembleLyric2.cs | 26 +++++++ osu!Lyrics/Lyrics/Sources/AlsongSource.cs | 67 ++++--------------- osu!Lyrics/Lyrics/Sources/LyricSource.cs | 5 +- osu!Lyrics/Properties/AssemblyInfo.cs | 3 + osu!Lyrics/osu!Lyrics.csproj | 2 + 10 files changed, 128 insertions(+), 69 deletions(-) create mode 100644 osu!Lyrics.Test/Lyrics/Sources/LyricSourceTests.cs create mode 100644 osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs create mode 100644 osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs diff --git a/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs b/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs index 5b2eb8e..989442d 100644 --- a/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs +++ b/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs @@ -17,26 +17,29 @@ public void RegisterTest() { } - [TestMethod()] - public void GetLyricAsyncTest() - { - var al = new AlsongSource(); - Assert.IsNull(al.GetLyricAsync(new Audio.AudioInfo()).GetAwaiter().GetResult()); - Assert.IsNotNull(al.GetLyricAsync(new Audio.AudioInfo { Beatmap = new Beatmap.BeatmapMetadata { Artist = "아이유", Title = "좋은 날" } }).GetAwaiter().GetResult()); - } - [TestMethod()] public void GetLyric5AsyncTest() { - var al = new AlsongSource(); - Assert.IsNull(al.GetLyric5Async("좋은 날").GetAwaiter().GetResult()); + var al = new AlsongGetLyric5(); + var au = new Audio.AudioInfo { CheckSum = "좋은 날" }; + try + { + al.GetLyricAsync(au).GetAwaiter().GetResult(); + Assert.Fail(); + } + catch (IndexOutOfRangeException) { } } [TestMethod()] public void GetResembleLyric2AsyncTest() { - var al = new AlsongSource(); - Assert.IsNotNull(al.GetResembleLyric2Async("좋은 날", "아이유").GetAwaiter().GetResult()); + var al = new AlsongGetResembleLyric2(); + var au = new Audio.AudioInfo { Beatmap = new Beatmap.BeatmapMetadata { Artist = "아이유", Title = "좋은 날" } }; + try + { + Assert.IsNotNull(al.GetLyricAsync(au).GetAwaiter().GetResult()); + } + catch (IndexOutOfRangeException) { } } } } \ No newline at end of file diff --git a/osu!Lyrics.Test/Lyrics/Sources/LyricSourceTests.cs b/osu!Lyrics.Test/Lyrics/Sources/LyricSourceTests.cs new file mode 100644 index 0000000..4da50d4 --- /dev/null +++ b/osu!Lyrics.Test/Lyrics/Sources/LyricSourceTests.cs @@ -0,0 +1,34 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using osu_Lyrics.Lyrics.Sources; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Lyrics.Sources.Tests +{ + [TestClass()] + public class LyricSourceTests + { + [TestMethod()] + public void GetLyricsAsyncTest() + { + var au = new Audio.AudioInfo { CheckSum = "좋은 날", Beatmap = new Beatmap.BeatmapMetadata { Artist = "아이유", Title = "좋은 날" } }; + var a = LyricSource.GetLyricsAsync(au); + Lyric ret; + int inc = 0; + foreach (var lyricTask in a) + { + try + { + ret = lyricTask.GetAwaiter().GetResult(); + break; + } + catch { } + inc++; + } + Assert.IsTrue(inc > 0); + } + } +} \ No newline at end of file diff --git a/osu!Lyrics.Test/osu!Lyrics.Test.csproj b/osu!Lyrics.Test/osu!Lyrics.Test.csproj index fc63256..87967fc 100644 --- a/osu!Lyrics.Test/osu!Lyrics.Test.csproj +++ b/osu!Lyrics.Test/osu!Lyrics.Test.csproj @@ -49,6 +49,7 @@ + diff --git a/osu!Lyrics/Lyrics/LyricManager.cs b/osu!Lyrics/Lyrics/LyricManager.cs index bd10b6a..a5f8946 100644 --- a/osu!Lyrics/Lyrics/LyricManager.cs +++ b/osu!Lyrics/Lyrics/LyricManager.cs @@ -132,14 +132,16 @@ private void FetchLyric() Task.Run(async () => { Lyric ret = null; - foreach (var lyricTask in LyricSource.sources.Select(i => i.GetLyricAsync(AudioInfo))) + var a = LyricSource.GetLyricsAsync(AudioInfo); + foreach (var lyricTask in a) { cts.Token.ThrowIfCancellationRequested(); - ret = await lyricTask; - if (ret != null) + try { + ret = await lyricTask; break; } + catch { } } ret?.Insert(0, new LyricLine()); diff --git a/osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs b/osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs new file mode 100644 index 0000000..acd5a08 --- /dev/null +++ b/osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using osu_Lyrics.Audio; + +namespace osu_Lyrics.Lyrics.Sources +{ + class AlsongGetLyric5 : AlsongSource + { + public static void Register() + { + AddSource(); + } + + public override Task GetLyricAsync(AudioInfo audio) + { + var data = Properties.Resources.ResourceManager.GetString("GetLyric5"); + data = data.Replace("[HASH]", audio.CheckSum); + return GetLyricAsync("GetLyric5", data); + } + } +} diff --git a/osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs b/osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs new file mode 100644 index 0000000..2dd1f11 --- /dev/null +++ b/osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs @@ -0,0 +1,26 @@ +using osu_Lyrics.Audio; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Lyrics.Sources +{ + class AlsongGetResembleLyric2 : AlsongSource + { + public static void Register() + { + AddSource(); + } + + public override Task GetLyricAsync(AudioInfo audio) + { + var data = Properties.Resources.ResourceManager.GetString("GetResembleLyric2"); + var title = audio.Beatmap.TitleUnicode ?? audio.Beatmap.Title; + var artist = audio.Beatmap.ArtistUnicode ?? audio.Beatmap.Artist; + data = data.Replace("[TITLE]", title).Replace("[ARTIST]", artist); + return GetLyricAsync("GetResembleLyric2", data); + } + } +} diff --git a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs index 72a41ef..924981f 100644 --- a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs +++ b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs @@ -8,65 +8,26 @@ namespace osu_Lyrics.Lyrics.Sources { - public class AlsongSource : LyricSource + abstract class AlsongSource : LyricSource { - public static void Register() + protected async Task GetLyricAsync(string action, string data) { - AddSource(); - } - - /// - /// TODO CONFIRM GETLYRIC5ASYNC RETURNS NULL - /// - /// - /// - public override Task GetLyricAsync(AudioInfo audio) - { - return GetLyric5Async(audio.CheckSum) - ?? GetResembleLyric2Async( - audio.Beatmap.TitleUnicode ?? audio.Beatmap.Title, - audio.Beatmap.ArtistUnicode ?? audio.Beatmap.ArtistUnicode); - } - - public Task GetLyric5Async(string checkSum) - { - var data = Properties.Resources.ResourceManager.GetString("GetLyric5"); - data = data.Replace("[HASH]", checkSum); - return GetResponseAsync("GetLyric5", data); - } + var wr = Request.Create(@"http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"); + wr.Method = "POST"; + wr.UserAgent = "gSOAP"; + wr.ContentType = "application/soap+xml; charset=UTF-8"; + wr.Headers.Add("SOAPAction", $@"""ALSongWebServer/{action}"""); - public Task GetResembleLyric2Async(string title, string artist) - { - var data = Properties.Resources.ResourceManager.GetString("GetResembleLyric2"); - data = data.Replace("[TITLE]", title).Replace("[ARTIST]", artist); - return GetResponseAsync("GetResembleLyric2", data); - } - - private async Task GetResponseAsync(string action, string data) - { - try + using (var rq = new StreamWriter(wr.GetRequestStream())) { - var wr = Request.Create(@"http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"); - wr.Method = "POST"; - wr.UserAgent = "gSOAP"; - wr.ContentType = "application/soap+xml; charset=UTF-8"; - wr.Headers.Add("SOAPAction", $@"""ALSongWebServer/{action}"""); - - using (var rq = new StreamWriter(wr.GetRequestStream())) - { - rq.Write(data); - } - - using (var rp = new StreamReader(wr.GetResponse().GetResponseStream())) - { - return new Lyric(System.Net.WebUtility.HtmlDecode( - rp.ReadToEnd().Split(new[] { "", "" }, StringSplitOptions.None)[1]) - .Split(new[] { "
" }, StringSplitOptions.RemoveEmptyEntries)); - } + rq.Write(data); } - catch + + using (var rp = new StreamReader(wr.GetResponse().GetResponseStream())) { - return null; + return new Lyric(System.Net.WebUtility.HtmlDecode( + rp.ReadToEnd().Split(new[] { "", "" }, StringSplitOptions.None)[1]) + .Split(new[] { "
" }, StringSplitOptions.RemoveEmptyEntries)); } } } diff --git a/osu!Lyrics/Lyrics/Sources/LyricSource.cs b/osu!Lyrics/Lyrics/Sources/LyricSource.cs index 323f85e..9d3b73e 100644 --- a/osu!Lyrics/Lyrics/Sources/LyricSource.cs +++ b/osu!Lyrics/Lyrics/Sources/LyricSource.cs @@ -13,7 +13,8 @@ public abstract class LyricSource static LyricSource() { - AlsongSource.Register(); + AlsongGetLyric5.Register(); + AlsongGetResembleLyric2.Register(); } protected static void AddSource() where T : LyricSource @@ -27,5 +28,7 @@ public Lyric GetLyric(AudioInfo audio) } public abstract Task GetLyricAsync(AudioInfo audio); + + public static IEnumerable> GetLyricsAsync(AudioInfo audio) => sources.Select(i => i.GetLyricAsync(audio)); } } diff --git a/osu!Lyrics/Properties/AssemblyInfo.cs b/osu!Lyrics/Properties/AssemblyInfo.cs index 44c5f49..e566bea 100644 --- a/osu!Lyrics/Properties/AssemblyInfo.cs +++ b/osu!Lyrics/Properties/AssemblyInfo.cs @@ -1,6 +1,7 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Resources; +using System.Runtime.CompilerServices; // 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다. // 어셈블리와 관련된 정보를 수정하려면 @@ -33,3 +34,5 @@ [assembly: AssemblyFileVersion("1.8.62")] [assembly: AssemblyInformationalVersion("1.8.64")] [assembly: NeutralResourcesLanguageAttribute("ko-KR")] + +[assembly: InternalsVisibleTo("osu!Lyrics.Test")] diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 59e9f42..04d7c01 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -72,6 +72,8 @@ + + From d994619ba68078751e51a110ee4e5bedff907ab5 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Fri, 2 Feb 2018 13:03:10 +0900 Subject: [PATCH 39/48] =?UTF-8?q?GetLyricAsync=EB=A5=BC=20Async=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Lyrics/LyricManager.cs | 2 +- osu!Lyrics/Lyrics/LyricNotFoundException.cs | 12 ++++++++++++ osu!Lyrics/Lyrics/Sources/AlsongSource.cs | 6 +++--- osu!Lyrics/osu!Lyrics.csproj | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 osu!Lyrics/Lyrics/LyricNotFoundException.cs diff --git a/osu!Lyrics/Lyrics/LyricManager.cs b/osu!Lyrics/Lyrics/LyricManager.cs index a5f8946..d5342fd 100644 --- a/osu!Lyrics/Lyrics/LyricManager.cs +++ b/osu!Lyrics/Lyrics/LyricManager.cs @@ -147,7 +147,7 @@ private void FetchLyric() ret?.Insert(0, new LyricLine()); cts.Token.ThrowIfCancellationRequested(); - Lyric = ret ?? throw new Exception(); + Lyric = ret ?? throw new LyricNotFoundException(); }, cts.Token).ContinueWith(result => { cts = null; diff --git a/osu!Lyrics/Lyrics/LyricNotFoundException.cs b/osu!Lyrics/Lyrics/LyricNotFoundException.cs new file mode 100644 index 0000000..ff56155 --- /dev/null +++ b/osu!Lyrics/Lyrics/LyricNotFoundException.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace osu_Lyrics.Lyrics +{ + class LyricNotFoundException : Exception + { + } +} diff --git a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs index 924981f..4cd2a10 100644 --- a/osu!Lyrics/Lyrics/Sources/AlsongSource.cs +++ b/osu!Lyrics/Lyrics/Sources/AlsongSource.cs @@ -18,12 +18,12 @@ protected async Task GetLyricAsync(string action, string data) wr.ContentType = "application/soap+xml; charset=UTF-8"; wr.Headers.Add("SOAPAction", $@"""ALSongWebServer/{action}"""); - using (var rq = new StreamWriter(wr.GetRequestStream())) + using (var rq = new StreamWriter(await wr.GetRequestStreamAsync())) { - rq.Write(data); + await rq.WriteAsync(data); } - using (var rp = new StreamReader(wr.GetResponse().GetResponseStream())) + using (var rp = new StreamReader((await wr.GetResponseAsync()).GetResponseStream())) { return new Lyric(System.Net.WebUtility.HtmlDecode( rp.ReadToEnd().Split(new[] { "", "" }, StringSplitOptions.None)[1]) diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 04d7c01..34d0711 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -72,6 +72,7 @@ + From 35c85e13f7efc528743ff96ae70190128dfacfd7 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Sun, 12 Aug 2018 13:49:07 +0900 Subject: [PATCH 40/48] =?UTF-8?q?=EC=84=9C=EB=B2=84=20Inject=20=ED=9B=84?= =?UTF-8?q?=20=EA=B7=B8=20=ED=95=B8=EB=93=A4=EC=9D=84=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=EC=98=A4=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Interop/NativeMethods.cs | 4 ++++ osu!Lyrics/Interop/Osu.cs | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/osu!Lyrics/Interop/NativeMethods.cs b/osu!Lyrics/Interop/NativeMethods.cs index 9d2dd06..27c25db 100644 --- a/osu!Lyrics/Interop/NativeMethods.cs +++ b/osu!Lyrics/Interop/NativeMethods.cs @@ -112,6 +112,10 @@ public struct BLENDFUNCTION public const uint INFINITE = 0xFFFFFFFF; + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport(ExternDll.Kernel32, SetLastError = true)] + public static extern bool GetExitCodeThread(IntPtr hThread, out uint lpExitCode); + [DllImport(ExternDll.Kernel32, SetLastError = true)] public static extern uint GlobalSize(IntPtr hMem); diff --git a/osu!Lyrics/Interop/Osu.cs b/osu!Lyrics/Interop/Osu.cs index 40c74a9..3787d2e 100644 --- a/osu!Lyrics/Interop/Osu.cs +++ b/osu!Lyrics/Interop/Osu.cs @@ -120,6 +120,8 @@ public static void UnhookKeyboard() public static event EventHandler MessageReceived; + private static IntPtr MessageServerHandle; + public static void RunMessageServer() { // dll의 fileVersion을 바탕으로 버전별로 겹치지 않는 경로에 압축 풀기: @@ -128,11 +130,13 @@ public static void RunMessageServer() var dest = Constants._Server + "." + FileVersionInfo.GetVersionInfo(Constants._Server).FileVersion; IO.FileEx.Move(Constants._Server, dest); - InjectDll(dest); + MessageServerHandle = LoadLibrary(dest); } - private static bool InjectDll(string dllPath) + private static IntPtr LoadLibrary(string dllPath) { + uint dwExitCode; + var hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Process.Id); var szFileName = Marshal.StringToHGlobalUni(dllPath); @@ -145,13 +149,14 @@ private static bool InjectDll(string dllPath) var hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, pThreadProc, pParameter, 0, IntPtr.Zero); WaitForSingleObject(hThread, INFINITE); + GetExitCodeThread(hThread, out dwExitCode); CloseHandle(hThread); VirtualFreeEx(hProcess, pParameter, 0, MEM_RELEASE); CloseHandle(hProcess); - return hThread != IntPtr.Zero; + return new IntPtr(dwExitCode); } private static void ListenMessage() From 8d775d80f7cda7312ce669f48d4055ce53d05fe7 Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Sun, 12 Aug 2018 15:31:08 +0900 Subject: [PATCH 41/48] =?UTF-8?q?TargetPlatform=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Server.vcxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj index 224a243..7cdc59f 100644 --- a/Server/Server.vcxproj +++ b/Server/Server.vcxproj @@ -15,19 +15,19 @@ Win32Proj osu_Lyrics Server - 8.1 + 10.0.17134.0 DynamicLibrary true - v140 + v141 Unicode DynamicLibrary false - v140_xp + v141 true Unicode From 9622f1c4bee8652169df0f38a8175b20afd71f3f Mon Sep 17 00:00:00 2001 From: Bang Sunghwan Date: Sun, 12 Aug 2018 15:39:33 +0900 Subject: [PATCH 42/48] =?UTF-8?q?NamedPipe=20=EC=9E=98=EB=AA=BB=EB=90=9C?= =?UTF-8?q?=20client=20=EC=B2=98=EB=A6=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Core.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Server/Core.h b/Server/Core.h index 83ab610..3c5f9d7 100644 --- a/Server/Core.h +++ b/Server/Core.h @@ -113,13 +113,15 @@ class NamedPipe while (m_isThreadRunning) { // - // ConnectNamedPipe Ŭ̾Ʈ \ : + // ConnectNamedPipe Ŭ̾Ʈ : // Ҵ DisconnectNamedPipe // if (ConnectNamedPipe(m_hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED) { m_isPipeConnected = true; + // ޽ ť ִ 3ʰ ٸ ٽ õ: + // Ŭ̾Ʈ ؾ ϱ INTINITE if (!m_ThreadQueues.try_pop(wMessage)) { WaitForSingleObject(m_hEvent, 3000); @@ -130,12 +132,15 @@ class NamedPipe { continue; } - - m_isPipeConnected = false; - DisconnectNamedPipe(m_hPipe); } + + // ConnectedNamedPipe Ǵ WriteFile + // client ̹Ƿ handle + m_isPipeConnected = false; + DisconnectNamedPipe(m_hPipe); } + // Ŭ̾Ʈ m_isPipeConnected = false; DisconnectNamedPipe(m_hPipe); CloseHandle(m_hPipe); @@ -147,6 +152,8 @@ class NamedPipe void Stop() { m_isThreadRunning = false; + // ConnectNamedPipe + DisconnectNamedPipe(m_hPipe); m_ThreadObject->join(); delete m_ThreadObject; From d477a0ae47ce0b9f4eb60edaf2f07f2debaa4f4e Mon Sep 17 00:00:00 2001 From: Jinsung Date: Fri, 15 Nov 2019 01:16:35 +0900 Subject: [PATCH 43/48] =?UTF-8?q?=EA=B0=80=EC=82=AC=20=EB=AA=BB=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=98=A4=EB=8A=94=20=EC=A0=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Server.vcxproj | 2 +- osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs | 24 +++++++++++++++++++ osu!Lyrics/Lyrics/Sources/LyricSource.cs | 2 +- osu!Lyrics/Properties/Resources.Designer.cs | 15 +++++++++++- osu!Lyrics/Properties/Resources.resx | 16 +++++++++++++ osu!Lyrics/Server.dll | Bin 280576 -> 272896 bytes osu!Lyrics/osu!Lyrics.csproj | 1 + 7 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj index 7cdc59f..2a1e4ff 100644 --- a/Server/Server.vcxproj +++ b/Server/Server.vcxproj @@ -15,7 +15,7 @@ Win32Proj osu_Lyrics Server - 10.0.17134.0 + 10.0.16299.0 diff --git a/osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs b/osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs new file mode 100644 index 0000000..b52f1ae --- /dev/null +++ b/osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using osu_Lyrics.Audio; + +namespace osu_Lyrics.Lyrics.Sources +{ + class AlsongGetLyric7 : AlsongSource + { + public static void Register() + { + AddSource(); + } + + public override Task GetLyricAsync(AudioInfo audio) + { + var data = Properties.Resources.ResourceManager.GetString("GetLyric7"); + data = data.Replace("[HASH]", audio.CheckSum); + return GetLyricAsync("GetLyric7", data); + } + } +} diff --git a/osu!Lyrics/Lyrics/Sources/LyricSource.cs b/osu!Lyrics/Lyrics/Sources/LyricSource.cs index 9d3b73e..e6ff802 100644 --- a/osu!Lyrics/Lyrics/Sources/LyricSource.cs +++ b/osu!Lyrics/Lyrics/Sources/LyricSource.cs @@ -13,7 +13,7 @@ public abstract class LyricSource static LyricSource() { - AlsongGetLyric5.Register(); + AlsongGetLyric7.Register(); AlsongGetResembleLyric2.Register(); } diff --git a/osu!Lyrics/Properties/Resources.Designer.cs b/osu!Lyrics/Properties/Resources.Designer.cs index 52693a5..cee20d1 100644 --- a/osu!Lyrics/Properties/Resources.Designer.cs +++ b/osu!Lyrics/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace osu_Lyrics.Properties { // 클래스에서 자동으로 생성되었습니다. // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -69,6 +69,19 @@ internal static string GetLyric5 { } } + /// + /// <?xml version="1.0" encoding="UTF-8"?> + ///<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="ALSongWebServer/Service1Soap" xmlns:ns1="ALSongWebServer" xmlns:ns3="ALSongWebServer/Service1Soap12"> + /// <SOAP-ENV:Body> + /// <ns1:GetLyric7> + /// <ns1:encData>7c2d15b8f51ac2f3b2a37d7a445c3158455defb8a58d621eb77a3ff8ae4921318e49cefe2[나머지 문자열은 잘림]";과(와) 유사한 지역화된 문자열을 찾습니다. + /// + internal static string GetLyric7 { + get { + return ResourceManager.GetString("GetLyric7", resourceCulture); + } + } + /// /// <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body><GetResembleLyric2 xmlns="ALSongWebServer"><stQuery><strTitle>[TITLE]</strTitle><strArtistName>[ARTIST]</strArtistName></stQuery></GetResembleLyric2></Body></Envelope>과(와) 유사한 지역화된 문자열을 찾습니다. /// diff --git a/osu!Lyrics/Properties/Resources.resx b/osu!Lyrics/Properties/Resources.resx index c776cf8..d7552cd 100644 --- a/osu!Lyrics/Properties/Resources.resx +++ b/osu!Lyrics/Properties/Resources.resx @@ -120,6 +120,22 @@ <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body><GetLyric5 xmlns="ALSongWebServer"><stQuery><strChecksum>[HASH]</strChecksum><strVersion/><strMACAddress/><strIPAddress/></stQuery></GetLyric5></Body></Envelope> + + <?xml version="1.0" encoding="UTF-8"?> +<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="ALSongWebServer/Service1Soap" xmlns:ns1="ALSongWebServer" xmlns:ns3="ALSongWebServer/Service1Soap12"> + <SOAP-ENV:Body> + <ns1:GetLyric7> + <ns1:encData>7c2d15b8f51ac2f3b2a37d7a445c3158455defb8a58d621eb77a3ff8ae4921318e49cefe24e515f79892a4c29c9a3e204358698c1cfe79c151c04f9561e945096ccd1d1c0a8d8f265a2f3fa7995939b21d8f663b246bbc433c7589da7e68047524b80e16f9671b6ea0faaf9d6cde1b7dbcf1b89aa8a1d67a8bbc566664342e12</ns1:encData> + <ns1:stQuery> + <ns1:strChecksum>[HASH]</ns1:strChecksum> + <ns1:strVersion/> + <ns1:strMACAddress/> + <ns1:strIPAddress/> + </ns1:stQuery> + </ns1:GetLyric7> + </SOAP-ENV:Body> +</SOAP-ENV:Envelope> + <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body><GetResembleLyric2 xmlns="ALSongWebServer"><stQuery><strTitle>[TITLE]</strTitle><strArtistName>[ARTIST]</strArtistName></stQuery></GetResembleLyric2></Body></Envelope> diff --git a/osu!Lyrics/Server.dll b/osu!Lyrics/Server.dll index 0b9533f4b97162d3c10df3e4499a3391280b120b..a6b7b628671f1a78d19ed7339fba8592a26fc554 100644 GIT binary patch literal 272896 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 z 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 J`oHx0{{W$kaHjwO literal 280576 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�aYrA9oW z{EO_dVvlOu1Q$&j>sTG3DaGF$I3D|&5YN~=SyV9`^8_&vs4t%EJX9Gh|?nR_Yq0P*N2*BXRK5k$Cw6!ER#6 z=W7gw;|qbIIQYLBihl?P=E?E+)+fM0DgC9}9_e-p4(>P!2S@up2@dYo*vi;25)K~H z`-uU>2pl*Q;!{sJ1Mtb9@CSGU8WbM*KL7||fxrLPbsHR=_q1gl6n zkGrD_xiu1J&(SFY36Py@!OV!Hl5q2ZO$P%lzaUqQx|=LeuuRMWD}x=zft#!7pp#0d zGAVF$v>3y{=q)CqSL{_xrL$p*WDsSyfN@TiZPeDNiP97iHfDU$;ladV&f_`J(o`9< zL5#7|oKp%}a!Lb@oEmi~f4C6z{*Ap%UN@BWX7L&{j2uP|$^&`|^hWe%YEZUQi0t9k z;E3vJj&8xJ-FW$wZUkEXT@O*@WGkdAzt`ycXB<(vj-=}KSfk~+eIy7Q}zQhLaXcI#|{+4nejTn8sTn1 zdxJI>jlrY4qBB+A4x+(L(aX`jq%;?D!;YyvK|+Z3eiN;yf#aOPzb@zr`c+P?lhoDZ zW0_AveN}4&3~Ef*f4)?LYQ^{E*p*~hP_RC!iyu2NF~$*H5K&D9yWlg(od~GvR$U}E z8-?m%W9S3Bzw&L98uJ;gNmXpr8$ohhQc2}tM)CBAqF#-DI^Xfa~ILVWF16gBO zeW86}_eS4hHT}DM-Gi1c?MRNRn3A0JX)ZOcN<$i>#_KQ&!kdL%5KV7zEw;~A=}=3U z_QlVR7WfKl%Y@vxyDMqj#GeZnO_*pAxaBx{CGIj-iDp6|%C<*jC>9W*#p~5|7IYHo z3k;+jrG1=3D@m~a0b16nPC#2Z2VO=w`RQxqNJ^(F1|p)q1id-T#}8-!hI^0qjkNbW z-tYZAtBtPN=TWfAx|w7Q+v(i?3DNXN&WqsNC;5@jf4xb6j=tnbkCk$AFQ4t{4m@3w z6R*tm>>-eGTi+DV`{9>SDqH9eU+Z5r+Pd23x!ND@UgbBpO$onjyd(T~(MLS4LNIZt z%`>g7W5uH|L|l>Q9z%k`s_@$0@SZ4af9pjNbRZc*0OB{CV)4c;`KXp81Lmo+W$#n^$Jny3%v5efT*wO zdJKH(`Q3)*04~fC$W`}2PbI1$JGrjURd+6zkzLxM>YR4@>mR2JYUnniJJhsWq_Kfb z>HJE2zDy;xy&-B5utxLE$m~pSBZFJD`lkoTDupPzO+r) zj4W}k6LB8sHrA_mvh|o;1b(@|ssEc&Kf@&4?V9>uN|Wv-YT!WaS#2lU?75mV0W+@# zzh%!$iyQK43%a=s-rpU<`yI}MwUR7*HyHnU$?rsr;Qu+-Mh)p|9kuUl@YO%UWtRE? zuoXz%y6^^XUu^XUe@TRq?4l37^_X>ka z2?6aWW>l!{8G)<&oY8BVBLnV=W{489%&brSg`tt(FQN}vTbmqZJwz76A;W`cCkgg< zi|lfy;tI-TXE`H%JK4wEl zrm~>H4lp)haMSyf-aXg{PQ6SzO%S*iUnx}c7%JB1M1D9{$r=ty1+tWCZ8R%`qF*it zE+sB9(8TZ~qFLW2^RyVW0bm(2*g%|!-Sv=7eGWEVYw4R$x?7jNE%Rv3c|?y^W<#cW zAPa_1y1Y}GOMS=T=-sN;0s!?>-$xqDMeEgtyduZD^F1OE@lUAfPQ=aU<5qeB5A`=0 zGeI<;Qd6Bm^6Jawt5?2$QGazR5~5_)a zWQN6B#=*KAy!wg|lrJaJx6^9GXw)OD-j2;n-%c2Bs(q3J`RV!|8IfYXJSxeMf)LA0 z*OhOPH&qS)p*1OCrUxSp^H!PKOM=Rv_2y(fLa7FFW6HqFG(0H9*M@d*YJV6|Rg%Tfxx$7M&?*O8?or1Cn6wQ%p8)ZgbqAWcL32x2IL>lbyr9t~L9(cJH7~{K` z)IKcE>xHG{M881M!_oH*M_+m+3>ir+7xd?YE6&A=8l{XQUY{w{{bY1PHU*YMJh~g5&YK#D()-L!J93OLguB_2eKlLVuh)wG( zx+@DHV$CQ7^l6KRXpLrtTP)2w47m<>)2XiOVjGy@XimXV(coX0qn?&d>;j|9m1%3~Fr?)W zukNBam|+wo1scB1rEjxZvN-hBaK|FcprawTzF2B@kyN@Vw^npk$daoIa0m=(K`jWp z2~}I2Q)a&b8bh?v;(s_RhhW4s&%9;z9X-*kE_f}HuJk~Mx;;!_7`Z9At4wJ!a(|_l zb4Oybiv=@6fo-`%cUQjOftB0P@84HJI2iBuz6!`ytVn>}V2sSo_ZO_l_j9osn_{UX ziyA-}VtPo2`SxQgwn)nNJN|$2Aiw>;%697~XWO}RXT+MDpOb}jg|#3*NZ23RH}D?k z^tt&ye*3JBffdAeTb=Uj*=yr$)4GY6>+}7RW^eD_gL~iEdmw9vactnI)kmrvQq0W{ z4!q^ryJ}3BbZdR90%6jw8MUZ@4`*MWkK_m;A0hw1s{;qjS6!%Q>_>i`dX_Qfv@7)w zkX_pQd$<9;1;F;sot5zg`9Ai|*8`sRvv*{**Y>{17Bn22nTq`-u~LRKQo5Ga&C_p; z;@vy&I(1YHyq@ePP4+k)e%-VG##5_DyUH1#+*8JfLK&THp?!A6e>ooAG9F)XhHiK; z#^}NDF#>ul_#HVCA8CL&=WxF4omVgr<`JKHc<@gX^4||k_2%#BNPRooJmP(2cK(t& zv!}7n9Bhp4k3W{LA#c8>dXD6ohx=Y>d*%B4+}GCU2Vc8g&tEP*lXW@!&%G`C?mqXG z3Hg>kzxh4#H8r;bm5t^e7t@?$?sM5wlV6?q15W&_E+p?sFtANh8(UwwDL+^Kc66}i z-7E_fN)3;ZxSU`+L6SebG>GgTOH*9oBB;pPWV3ab`mP~~{rV}m0NT!_ZsoC!YssZO z4i?}lE*DOiMpgr0^^To8>-+o|FLV}~bSOsW;`|l#u-x=gyR395^g>1KRwX<$w5uK3 zg=0Aix2a{v+FcQ2&t#K4xu6+www1BhV;>6am>63@pnjCs)i$iRxP%x@Rx}^U2U|3Z zQ}fc?LI$PdKk4_M+R}YKR9yCUd5&$9=Q+QT=ZvlLobyYbb@z|$(LdQQ>7R3+&_C%v z(La+P*FP6O#?N;iNI$@jRqEQZQ~!Fm?BN&Dm@S9oz2y*t+LfM5*v+}v(^~%TJvR>-f zvq1F6C8>{-^-4F7Oo4B3&8TzsFyalP)!!1%f#we8&AheGg=#^zd`b)LU_UuW^29eB zs0#e6b@WE`mezV>$g0;MQ^l>{VW7PEz0coy>wLDp8Fxl+y&W`IdZ@uYW8STI8d=>- z8eFv>%V}Ig-pPGeB?5EWkO+!SnsYN(uF(l|R?5%VITaZm+|UroPbQHbmvNdkN6`** zw>zc-2w6E18wNAEi;Hm?g2`s#IvrU*ts!$sXopj4eCdIhC$`!f`?N2H@s83%KXd_0 zqNIf4{U~#Hnp52JW$@X-fp<7P_jaXAuLbIa|L%)c%TF-6D6}Ks-Xo``Y8Lu2c*JH; z27)_-8Ab>W;-!zuu$kRHCp&=3C1YRS7Kx3XZg%H6@z6;w9T#d7hFS+CEPqAmLsPv$ zIn^@9&T6lUu-C8CvA&V#AY0!nd&U)Q%I&*i_m(pxLh#D9^NF+ z?>5QvSL@~Z+jTta?tl0({S*I&{`s!xB-P#DvQq#2;CB7<(|Ufs^FYgY__0d8v6hDj z#3k?ufiB$w!2nkAP(wwmMQGx9>Emc6e&sA7biA~stMu`)E?03^=}!b1V1gtu_GVC7 zB)%juaFE1;9CbNop${~4qQgOg7+XMdTd*MKh-@Sq#Ddnubm^q#J$9IrC9KIzZI1mI z06XZ?NH|jS{GzvtfBhV^q*yS_Zt0AU8rZW%u!>zL%OEj!Ct`=NtwVAQ9&&WZLEQwX zkbnqnCdU3!5-se5#S~h2B(!iS)E(Y!WIl5pW!u4)UEDskXP-9DS2Vmi&tKNYul%)BRR34`${nba4rpO&l-{99> zpKZIX?UQlQn+SKmzbeaWuYCyW)tmo*$Hn64v&ChO!!wldKEj<4~? zGUJV2qCBflI~qU%sMi-?#Qwfxs*)4&mB%iD;u<#o7hpB-bR!wufyef z&EvuKXB-WDfe{PF*U+;@Ml5Knz_YJ^d~{#`q|vp!@ngq0Aoe&D6+L5fMr-DLv(s&M zxt%EEKdrqQMt%mcwD+bR{ek(0Cz1cK&Xynd{>>eHP#%8%a`~IeUlK+hl)^@aHoO zJo8bVMMPMvy)>2Y=3l+$yWYPa{lO4TeuSny_ymuw{B`qph`&^wo69_{^E@Nkrr%F( zmy^bcJEboJU9uFSf%%KBlRi1G#(U0^T2~$OO zB}c{f$a$&L?9m3H-=tzdU z6uekzZ4=7_p6IB}XSR;hxwxyu5F{mo!@ywW#?jhdOpxGi=vnV%VQ#@HAMKFJ4hxqS z?eFf0sDli@+&!@^>{2_p@k+d`vP&GE?GzjOxlAs@wZ7;V9ZrO?+FTd(7iFpC1SU#g6oK;z7>lj)35?IDtx7MWbD=P)7AIEbsu%~|P~WkTaY%rPB<}6ykh?Cc>86gwC!12XyXAP3Owjj)s}_J#xNl zM25pEMK%`1@&uu!UMV|h_8T!2a2xsubFk*D><>Hhr)Bi zUXpJ--_l_p;l?v>YtOOf&h*lb9_v~x!M78zM`0fAfZVZkRxB1d;qWMF5Z=BHYo;On zPR>MEX&W`W93}M*^>)qV2-DP}=d(+8cC-2KrCP`jJ#q=e# zqa;?Ihjs~Mye`Q+GFL9eMQ%J-WUa(=adV@$i3vLeRtC9x2;Bcy_Qmi#Zy^2`0`Mc7 zuavn7w0vKPtBpZVpk)^sn>RXhbS444ZnFuHEY zvUo-PO_}_Pw3~$!wNkwK1U4Cbb}BOpq#|Q-s*=-Fm5fSOVvN=mY`R)XEYcO=#H~bK zB83-E0Cd$Pg2CnB^~eW+#MMhqqPiKnT;O0@`Llk*Sfmnob!&C)(^IR%Jjd|Try zWG?3(8uWsvCv;9Ov8s34Pa@4K`Hg(Q1bYYIqwYi@Xa{KJM)DXuY2i2kvh+$M6iWxM zHrsPz)rt;D7r%rI7S?x}5ALEP>H|cIYiq?bXP~87x}eSdo;OE;X4Pu5k+taWpO@#2 ze$HgA8K04`aYte;O5WQUOg(E0R5fQxRUwa0^N0aI*YIm@$Y<(~MZh4&@+x~d(9Ddp)Ghh&foSU@-PZWR->9R6>VLz| z6)*h__G-|qp)hqZ`r{1=DX&Tu0z@DI8mhhpXHKh{BY3&N*L)Sg))d(EA=Odqx8)GJ zG}l~*m%LJ8uN{&TU7s?EFIwq~UeRpvJJD%1Tt7$b&|jl2g&0FC zP-J!=lRkVANZa%%ArV;7hg8`z@~YIEBor>d_8hBvDE#8;yW{8#mQDzl9b11(xNNX- z8KONKz3n|-YklT14smB#5wCSq+A&f$eGw^_rMbpT5|~|mo-TUQ?Ep0$aWoqK}}Wx1^g(NPAD-uv4uVuesNXY5ku@yqb8*oL8z#Uu7)i1FVS@C%Fsbn ziS80Cw;xt1t5(1o<8WT_%M1gh8z^K^ax@1t!=O6OYYOu(T2%kgUalX?w(Z9m1c7M?o8z)YNHwQ=zd6gb!D}72GvasqJ@+`b zM@CL$aV2V3Rq95WYql9KV<(C<&2(&OqEUhyd38Ta3^l>Tnp{Nd2-~@-FPMED{<55K za(`A?RH|7!LMW}CD5P1i{t;=;k9)<05du6M{6)%mG^=iAtuL?%mL_hhF-B$higE+- z_hr_6%wfxpb?FF&d)}96+mN$q$KCn;nZf9JkGdwqG8Nf!0IOSV`wP`0#M^BLRT>pC z)BWu}1V_uUz8yURv8ZBW#PLt1eQAHDJ37N$hjERUh~JY~n**g6Q9*bCU@x;V$7?K? zJJ=hvqoB*x{Sc*4SsC{HqUE{91x}IQBm-<;_#LDlh1lm7Ey)dRx{F2$ z41S*9{!FhpN_eE;eatry``iHwW&QQXN=g8^(sBLd8S^qXC^o3iRwuR z5%cC;SMQm5V5uL-8~s6s{#yhS<+-vKGvr%^jGRe{40!W8Z<7pasZX}yl|r(ulzTn( zImuG2ZDogzoajyFiNwamAh+;c-VN8Hm1*Vl#j2&n%#h1m-{*BjFQk-Mg|FU2R0T;A z(LS#V0=jm#kc@NaiY6I_?7?~vwb+lT+n|P000P~C0CkS>juf=gr(T5@grWPx>Q%^^ zWLI_*q$@HQEE*^n^}R9ZyQ-&&w-)AN#j4u(Yic_0d7%V~R^}P!H_y`dj%PK`x&W+* zShsspN4RU%=>C#CwCq7Qf8KAi@pu8GPr|?0o+%B)&@+ql{bq_2sW`YL_LHMZ2@&^3L(P)^}rUU=vpK&<*lkX?6w8xBCiqJ4I|uDxC{yfM5xO&8u!rwbR$n<>r|@Vez`GUh?!2Jcl?PvzxYb7n+MzC7(a*-$7xfH( zPqu%coih@bs;!yxU|%|K#`^>9ko2yo5B4pbP2u1oT7<2LNuG9bTjw=P6NeO=wgY6?tJ zmsgl`ZiWr%ie6GLziP0T-F>@|A7@!JB*xmMO%tj`B8K%cG`hJRPLmI*@?8+w5LFxf z(cA4Mn-?am56urxK!h(H>|HIbUphz!X_d>)-?Sq-m3RAWbEE%6bYi`9l|DZU^_8fg zpjrxomaJ0W)btn?97`UcQ%S8qO1jHPhuKxEJ#bhYRPb1led&`H?dM3Oda{R)g!-lw zR*8A5a)sJOEJ1FA5@@N)FFck?)8rcI)BT9V*qN?s#dp(h>Z;aHiExTi$6*2v0kFrw5bIjEzS3q1m zEpVC^{_1spoEt4?n1(oXUJe`AZ1Z_K%;SmZd|=a5IrEFwiNN57(Y%Id655!~S6sGL z4=vKU?%v06m&BOR+*mMN<6j#Lzqr;Fu=%m=RC;3Zz3FShpFBvAY0V|hOFfdi^O z3@~?_cY9sNd$v!Klz8n|)!Fd+WR%puN!sFk7N|JzDe^_7b8ssD2J{WHWh<*-P57;H zUkKwZFN!u0LnvcVhp(Pee^;^Sk;~P9eY@R&;eb*OT0QF{Xx(s7#%%1Qu+HcebG$8i^bn`YgrAW4|!@>$BD5kfz?wWk+I+=skTyXl71to z7--t&*rRhkU8z4k_DP>6=}%9b@=5fs(ya0!RJBUH=G|}&(+etn1!+l6zD#{+-^A); z<__ejxnIKF4!&HfQLh~o3t?ay1O9HGsDuQVW^4NQtd4^AaOtr%*TVfX`7PQwT% zNMdtv)@d9}_i-?-aL=lggK1kDXVXpljKiEoQwLKV7grC#1Tp|~>x2vv=$Vp&lyvF; ztfX@_mr8&Ko;zNnOLL4Yau+# z_eB4YGEO8c3~Z4*ZZnI~2lB%vzz#M&?T?m;EVlnkGNPlxyQ9VN8jSwRIsUAZ=lC0v z=lE^<93R@jaP7c4yA0Ki=$PVg=c?Zh*A*{!hj*=pKTpdx_ZP#=I&8TR3M!I4KSuWWgur0gO{UR1)5`>RI~-jDr2IbOGyPmo2zkFS+KA#yzofizWezG+(w~57|voC#m3nHLU3~# zv)+H;thW9==kKAfmT~MCZuv2~xb#LvQ7GLFKGqgMtpYCz?^pB&YV=)2Epp%it7NEPgTLTIi_56_mvSbb*y{1ck0dcBq)-ZD+TxzH+tL4G*b`%m*(n&N z(;`-3h3e!iWOa&Dxc8V|O>m+Xr#0e2Z7GGgEh1!rG(|m)#Xkm^NW>}bfiggx;(3S_ zp)F{akQH-$q{ShRx}B1>BOSgy+5^eXC2sUW*(0fJOojR*17h{*FSXp?C^zz+wY3rT z3rZEThGJ!yHZ7wZ1ni}Rgmy)W{>|74+*KuJNSrmO;!@IqTJyt1bQ~rXY8w*HC-pNv zXk9CB=%9Udq=7plwN5V8F`rK-PLCwh-J42xdgx$PGH#WQ!%xPaae}A5Pp;Z!RQw=nK24(lC^dA9=wTbLjHbqC)QiMJSi1`Gw}`p-^C3s$Nz`?P^(!D_eX`xaMH zZH~f_ux=EzK4P?mOmwKf!BzhVx0^L;BeOt@Sp#De>E(PgJ9EvhT=PWks)O9fIdC91 zbhx#eA>V<(yxTf+YvNmTc>}f{5unc2S>Me?EX=T%iwhN5KXT+vtxMn{wJ=ji7cp+! z*Gy=+Ntz_WP+8Vkon?0deV+G`h6?rV-xVH+ex6FbkSn)XMo?~W&Vo{{Wn4ue@lp|( z<)YFRY0S z-990DLpy3hZSmRPT|fhA9~)@fYm zEO&FT#>kFDhQElBEilO_6nF1KVGu7Eo%dxj`k9f$*u#>y6FV!q0g?J&E=FPGC-OKv z!xL=q>YE$1C%4Nah*>$%*^hV7F?8-amMu+87Kc5Id!+t1l1XRplbq?w(lEe9Il0K3 zMb5i)PCLW#&_fA2=XS}dvkywn3W}StmbXc}Xf2k?b#+KD#CmM z;G!M9RUm8suF#Iq41ufgp0oFvZw#2*ki#mB7kk4m8vPnj^&WO%BF6<95&!FqKbtbWMx)?J`9=T!4?{4ovOz@;sc=W24B#vhQ& zQx;nl`HK~|Oe{v<$Iyo$#ku*x>WYRF^?g*5)K^O4!U_}wy-BXY-25qm3k3@%qO;8P z`BM|ojBqr6>Y9tef|mcu82nN}gX^CJ4~}#2;M^yDYCct45?D^aep=98Qllw}2t#cv zELctOQt$Rk8<>(xzqQz3ROvI)HEQgrs{C~y!)#|I0~F#H)eL---{!BbtXNVDq6f<* z_H6_hn(iy}E$c5NeL7Tj?Lj8=fMN1v7R$DZqM6Osbu&M`_)R z^JGQF>FP7&>~bLs%FaVOajDv8mn8df8kBc@5t6`I5`!i2o;@WJ`K0z5+3Kv}Vr)-* zB@#`?kZ8h^n)#^A!{4pW)PfPnNX>C(z09$;89b~){89WRG0iPl(6YlUS7r%EG7UZy)51U3%Y-`3L{>w^EeZlZFNl zfvjyYogntzhj@!U{0*MQ=+=k7!!HMn%+3}GiKJM(MGA6S5^rfD%tFbH>y`l!l@;;$ zV??Soj9)T13DO0@;Y3u<;+R)7yHUJ?xPti4SGdEt1kPq*_~@Fc_Gc~KCP`LB zm(FhKznkHbSq`RBM=L@*>SF$R@%Uk>>`E$Y`fV#g7gqtg*d$!=YeoVF z7B!~>4t7VXFyqOF6U(H6xyw)3KQ*86GX5?jW2>lbby&?VUiT_z`ByU3p?yMl5Awj+*$2L+UC7=*lxHbnkhf4jkI6D7oW8k+j%0^w6sHvgIGB8z<2F)y7Dxz0+a3a zblPd2E{H1)k1(Kc_q(Xr(&NJSG#s00^EgX=<(|RV#_86gDJ?r1y-ZbMXdk-OhJSw3 zw!+w=Db|6e4~jOPCial1^+b1mkM}cEXQl12%BHsl6N{$XFAyrAh?&L9V`bCDbgbXO zabk$;6RN$LRfdP#a;TsYHD_2IS=*wRTVh9!mn0Tf#mc6r<7o9ZwHJ!`(t)Pqx)nL6 zw4z&D;geQ8^O07_NTaJSOFn|cm=WAKv8pcc+)`o1W2DVjQ>E@>(=o4N7b`QRp!PjC&ViAVwL%^$|I9YfO!haO~c4`NqXbhFm(prh}2sJr}m-%V4Zy)HX+R zB|#Rt;a~u9ZzD413`=q^`vIky|5iakE_L2aD#R<8urehRN3RT zF><2PD%6KX^nIaR6XFk`%x}&-9~A}M{FDV(WinMPf9w{USAk$yFln*#l8k2A+@;_z z%QUMOF4e4#bkNPR4$w)_vLN~^GHvyj52OC&+`$Rze~$RrGMp<<=)ISqSr$wyT9zBQ zU#k+VnGkroY??S4_!)}_*NEnzFZzr*n7MX)BEO~OB5urfsXvp=E;ScTNyL`rw=OG; zEz657o7%c;wk@9JP5F8uful6d#_i%1dm?XdO0?t_aWq@pZma=&iOBWm1Zc~Gfv2HI z%BI!9d1#R+X;|W3fj;v&d8P$gMEVZ4-HifffB#fkFoX7-&0ju$7xOobzc7Du`NJ&K zG*jh8FE*7YdcLWA(Qz6JX7O%JFz4s_>@#_Ku~;)d&ux$9nP+=>;truhokeQ_t25Mv z+)^d?&U0DCuo?J_-Kox!+3v-Grz@v5x62ePR$Jhj@Ttzcd)h_O(eaWg%q^Q~hgp&X z&6k5FYOG{ROWWO4F$MFbxE`f_gJmMTX7>2ly#g(tWn{Wa#B8anx0bLuxClW;cZ2VS zN!xUS5+Xqe>R+Z0H!8+1LZi&Pr@D-{&B2Di1HUJGV3W+UIXFLBWezTgUTqFuAHA%h z{)X_jK+6zctdd||Q4ot;ZE0O4Qz_LID+%_#!7r~&i>vo#Crp=Jy)Qapj)yJ{J$Qi$ zJe_6^hK%ub<~?cC@RxM8myBF%>TC?TuGPFK6U7J;a+icun*wb8zm)bIiecfiE}fs461>JpU){5nH*B5I3!@_b|hX z-#US2R79a&``ezs1LNrYgO;( zdCpu`7-%V`g;oSVI5pNb%nE`MOX|4HX~>YfDFEAmyHqY&%&=?yIXIX^363l$lTw%8NeY_?dU2T$jAz3>mCbk<1LRkz zkzCHOTVfkB`{7rqceW_Fg%cH83!h^hPO53y%O3EWvgPNl0H2<;k&1xR4y=HUpcl zxP7Q4m!-*TcwYy}@)~{?0?(CA)4flunNopqN0rAQh|$slQi}#fRfU?!shHU}w@(3} zZxjeHH%@UG*Fw-?0LbhAm6+L*c?WyqqSmes>wb z4oj}>?y;R^g>E}Aa)9e%xvAG^nk6JW4FVQqx*UV6Nmhfv8%@#xe&l0D;Ca4I3_Q*A?2mtZj%aV-sp6q;THUyx%d@(4v0Pp3Ydm8;a(An<2VTL{ z&%mqZ?&8?SJelp~8w7TxtM+MTUEY8`<`tDq+2|24Y|q+ec!_?^p_t7NeMT0l8oSi3 zNSfF2q|blD2)0!PFRbkce)D`Wi#P7bD$B5^wd?WvS2y@ z={f2<90HT1$X9`WQ0ZJ5?X8?+YvpKHAdho2x<|&xYwUtl`X;h*HD0_v;mRV@9#hA! zoQ%^qm*uu*%2YFzP*at8DWpBB`NbwW%b5dqpikvP1$M|T)>Se^_J8(J+2xgA;y;36 zHo~?W0*RO~1Ja*olW9B^&3r+NhXld;a-3(uPyY@`rG}*>psX${6z+~aHu+5uP6LXT zyYzJw2R=PQ4$1-H97nUDW_pp~+c>#ua~fry6L_lo*Dl(Q|6B-jS6$15@~Hdjt2uJ{ z*8d3;=yGyN68uOO9SKv3Cs@l00-aZJg~gB39WDg&Q{FVU+^DDfh@5XByk=bInD$Xz(O=vc#I1PAb7VLPm}79O)p0O5yiloLtaemO05~ ziR_nkkGJR^pOM>i58Z=JB?47$w+&k*NI&fb1@~|s^oIvmv8W^Q=~s!RpTsovSEQ%3 z#+cu7y9+J%GWR;4@{ z6Z_v4xeSJ9 z2K7(;i2nJmxHG}<%y#|rgEsy1)8Fv(od;U___4&^j3S^7&m1GrrQ4G%)Y*;@a172sYz!uC%jjlv=aV!qa|Ya#fQ*AP4FCF!U{zsGEmuE(oN`hJ zf5zyU-%Q5Jjt^P06l3A!NJdog1%g4MGpr|WVvJ!g;%VWO3E^TwOCcgB%2aO83H^SV zT9B-Qq?W#UklTwKE+ME%+a={v!ohm*<(^Z3wri)B3ahBl`eziwVud3Tk$*}^PokU` zL8m*h9CXf8x?$-J=~xPjG`OD|hlQ?4Lz?Pk145V!QbktF= z6RZak=V-6> z8{^9G^Ys{KamFbxqSkSc5N6xhNP{miqy8c>m$S~fynn^cR;OPmm{?97j#*)0p@?1G z=*7$hjHP6b^*RTBrqt`q0QXk<^1MRbz#E!sG)r9xQ-OMX4QHw^3xAh9p$tbvu>nqEk~jj0J?sp7YVVg_v=a$(=$|QNwUUT%bQ`g}ted%nVcWrpiF$}Z7(m46L|ZH3?vSF^6$$M$C%LF9l=v{x=1Rr(W)D{x zzlZRt)!KKWeSRA!UWc8Z1kuUnMxbew5SnABNbfd+!gt zhF1`#(^l&VX(nspKbtlpCZ4W}H8smoBN5F4L1tnVu}*6$BMmw9 z?|C2&G}WihaF!*7iqI)+D;SIMGJi#7gEuxNF?JI}gz58z3024p3oAW^qVRtUR~H)Q zz@%XsW;b*Tm&X-y{UA(76_ZSke8^Nsg*i7;|H>@6k94j{E2Oz%hd(d1lBy`KHY5&* z5=#6Paq;C;x=`$dq$8Mxba%h~nqL0&PT?IWLEn%e=muy<$PjD}>&2FvNOxVB5+Gd>@uC&?S$QFZftF4jAg_ zrM*kJtIXGL{(5ng?bv0(o#OJX*>w1uqk7Qq+vq6l67>;Pg#YxieZpLLQIO%CbI3U z54}h==8Ajo71{cw$f))pLLIemOmTpdYNSS$0d}?Ac*$;I&7YiqP=r&HPQS+r~ z0=N?srH5@HD04}(SCJ%8qY9E=4bLb{98jZUg{1T)(1iUkwW05dQ3E9gG;2Fjw`z>H zi{g>ai+V7Ppx*h35V=czG<~r&J#}er&hcI>_DJtU9y;)|n^3>u@_KSpqsui%?3Wk; z43XAZ-u$|xEz%mms+5eNgf!yX=Yo49oh}NjubDd*0u*o>@l@H80*B8*6 zK+83xeippsif2Co@!ea@`wv~NzD8r}4>9%aGA45ukMa0(?VaielwhClM8EGu+mp%K z6n)}P2M%8B`n)Ho@6(41e~Szw3Rmwga=C7Bwq@4kGhSAWDhCZFfw6KV{UWr5HYGHU zq$g<=4VfYfk07O{i@Y<|?2PUBDKP$K{SJ(kY27Unn%rOZW|PNEq#Ie>4%PaKd;d;F zn9vSv66>@gSqrJp^-dWA;a*>$WjnF)tMlU(x7!)9CG2#5m@56KC~f@;R_lx0Yp;vW zZ7zxvj)t0xzAV4zHy1r1zo#`9J;<-|g|0GRGsW0-1n!l120;bA=GU%hZ2-*O_FE8$)d<^k{1|a#6{=7s|Z9^DD;401tEb ze>DTiMy-z$_Ykgyz6>L0s)3n6*hF)=NYmbe)Jvikk*$o-_yigN=I{N%U0N$u1(SMP(C(>V3WLRSr|cSOZlu7i9uCtga8~y3q~ydW#)!KA&Df3kVG0b)Yrc~ z0yH4*w#XC#7H*MkQh#>H7iTbt5p(@&hZBheu1vl24TK6gpB8})zrlwmZ8h<1c==~8 zixsNzFm|lY-eYvBsz%*gjSm7b@bg?QnIS~j>+ff{taCPjQ)4sk=Lx?xy@}&-n)PQm z(x{WbT^xdQUQxr%@GmGw^z@Fw2~gwNJw;wDk2&_MpK=G);9nk_XoMns(@ArZbELDF%T4A&u7DApQbIcx}a ziBPOuIx~g7*i3DX$Ukid+KWwBo^NDt+VRBsxX&o#-JX%~u*s*3`Mr7En6{Rl2t3zT zp^9q&I&%9*d@kEudIF#wkESB*&|l5YgHJlj_$k>lJLkc)aWCpbC$s5FF1@x<{pO5h z3Qw7RRLA~A8nqA`B{Zr?48m}3EX_%{Li?_U{!A+?Zo2ZO=y7S{Wh{nsbv@AlB0)_> z=i^`eJv)o2(7sJO0uPlY_9{E8oVvZ8nK#X&m2Jj*n=@!$Sj-t2KI*<~_NeH^n5UaW zDi7V$m&c!rBs*3%qGt(DS?^lbwNspn;(BNBN?W<*rMVt+BBM!5hv{e;>}Ej)SFIA; z5OZow#7q~WIAC=RAXeJFIy><5g~9f>(h5$5kFS*^t#}5TxL5z7eOi_J6#b&@A!&3i_kb=nMS>hA9A(E8W1}3yF{d2V&a*OV ztP?hbzyO~xkZ5Jf`1D28+q_diiZU2M&xoYTMlYl|WPNhCsP@&02=IVmgU4`*x=j84 zYcz7C3=d4raJme&Ncf9^pA^vnnv+jclAo51_!Ni1xu;;Sxy=I~rv06?aJ#mtyA7$Q zYF}CGwD^3~7Lgwnp^W-F=cfhrgsN*PqCO_C`7*U(UK2C)EW343s#5)cAt%^gVUMxx zE|G0_^`j2CMU&W-UWW7SP+TZ8j@Gzs1feB_DumX(WDzkQw1rB8Wa^bnvX8Hm0?$9C zz?P8(%7(4|iljEjWPvk2Qs6gqfqLr!tclyY5 zdQLx4HauBf?#Wq4wx?8yv`a2W6|Vaey}i-_Ei2B-2wU%4H+s#t&I^5jvYxdo^y>cI z`+p}Am(P(5j(T7d+qjEuBet|p=)(VFI7^7N>PWm`RJR(F+kE;Kq9HQvwxYmF~7h$Q{){k!)6E_@=;0&mP!a8&cV z+E1i~`_`seo$=X)kX9bnD%3%blU52x$!z}fo-_D$M@=3q2v zRUd<_be0&Dw z9A8`+(A~(4on&!VR_da08X?NwvV5rEML8bn3hLWn+&!~Ekb`K3alP%d4&X`PnMu>Y zvfYW+4gagnP9j}>M5{1_`bCLhmm}#OQRnvJOIjUZ!-}Y>oGv5kcBYGXZGI_7G&I1} zvtJa9@#qtoux)lEB7K2&pK-Q+eeS_@2=vZqc7>{aheWX%k|;6bdTHW3ViGf!5JU~m ziJGpXg!YN)4{DN*Xwnf9txhL`xroh>IH|vW5IVKKiHCX{G7E&L_Kguvk|>#}aRg-; zP9`elOf7srVRj1j842(%;*}qxjUl7BPc?i6oj?_=R{#rH?XwRK?4NWXIst>mV%82N zi0;%DGRO`xFZ>~hlr2O{B*Y#ZvD!wE-BN6gJx&{KA9M1k#lAIKb|ECf59<@P-iYRo zEJT>xj`kay*T~%%DGJf!mWv&0u$EQm6%7!22$3v4*qx2oi$d<(sl9aQ?bKeXC8Z-& zKaaDuF-|?npd>Fke?+3KOjM(NB`)z?(Knxy7lbU=pk+H9 zuA$0cZ7^l2jo3WmcqrTSed3`>w1|73TC|4(Hu!YukYi)ee}`P=vMU(gwdQm+@nluG zRAnzh&D7lbI7PtisicoZ)Jh)_D-RWXh&23p__%=0yY)0s2zazF@RWzwAM#3Dt}*Wj zy3q(lAqbY&-h#fS4MX~du5W}G@{O9Uky^Lx*AZw+Xa=EUM>}WRah+){buTdH98EU9 zC4)dmYpf3n-rwxK65mIKhatAXPjTx zAY@HlxG(UfY61 z`XxzUDv21O9hpQv^!Borw${NX)1~yt${JCMeCX|zByXjX{PrVB5Dc64_iG1jtrIRrII*F*1oYGuAXibEzZ>5rq z`A8D^pby(y>wo}Vip?aPQVJh>_Y%3a0)W&>x<8UcKJ@-flI%$(`N2n$$cJ7_lH{@0 zbtzvunPjxgk$kXk+gcpd-&fTo8==2Rqpch$8cze%JW+8WGtzFm_1c7c>B zk@mQ)XE{)^T9+jtgD66G0`|61sAb|h*ZLZ65a3!fDqi;ex^U?bHZ7e1rL6TJ=xVm@ z(3w~_*{t=_uF@PP$z{(*qRRnfk+D1%8O!K+zGKTGhXaxeXS9A*%S{nLj`t9FJF)7V zVc4e;_(H=pVmDx~2j!n|{t*cMC!B-BG~E8*g>$+4xeRk5tEXDVp!qvr_`OwGhBv%z zO}hCzuRV%;{TvVe7YB!7xwi;Xn43bsY5?y0JAB4yc5z&@mHM$E0>_|A6$!@_GvLuF z>QW>Cx?Jb$l(>Kt4WP67J8;7JYoeO$;IB1NGD@P-2L5dQxoJb6Ygu5^t(3t1k@<*L z2;tEFIl`6t0#AEOY`;2p9;NXO=%uNxv)o_iE#NkuY2PdB#q<_Rjnnh?N7ZS z;vu30Fi3s%Tjjj{A77E?%i(?en+%1%E`eJH8^M)86o~la>`JwAD|dptN-&7(Ad?*7 z_4)l%l26JzAmx2_xV#;2q{`#sSk9p3<+Lvs1OvhDHUiDZg;0h0kCa8ESBym5gm zIwi4Yfhv*3SGJ%woGu67XwDot1V^(?#N`Yab&*n*3t$v0TcF)JRH&}G#BkdnqA&XX z8n0x_VD;+@&NGD2mM`j2q9UrDx`l%(_X=Wo1FIdWe6SoZlx!joF~5EV^TPG}*ns^K$C zPdO|l8xcA{P&dO><&9>My-14L>Q+Ok0w};Fx+@4zS7LqC%hcYHgcC_izh2{Xb3)Gh4C%m-S z_MyO!_snbM7qiW8aC%C&aFcL(;HfjkgM6|1dS?4Op8Y+W=8ioSJ#X{5SbH8{1}kXu zxw;s>k;3_GylI`d(H{3nISpSKcNkda_I75t%Ctknp;%$Tz`&o+?hpNb(!g>KeCp9A zXN9Y~;;ADw`$4EJ?0-Qx577(h!NsfIi$Mn%GT0a{3*)(hzz{uB>siOHvpJD?PS$PF484di!c4_@ z@Pgj|B6_W;N?EqGTjYCcBVdhIw5f=iB7G+;~#(=1wL#QzVw zn^YK&juG~SPd&l>Xr>4W7lgM;X#&i8d}EeNchdOZ$>~g2OHEUBdX7gIs?~<1ytv z7%e#20h`5IJxJ{F_BVW4dp_2`ZJJ@A0SDN0ETwMOY(>Ae4|gCr%zR9G>hY;fdLu{? zSgF~PduwJ(EHc3c?Y70bW4z>fb8tMzvUcrrM^_`;8zR`%{umyf&^16*`m|&vl~R9@ zt$DjcrB$dGrEkc1VvY(P3>Uq_YXbh2um#0PKrUt-U{akX2m%{`J|-bOgr2)_Y<2fi z%&ohAtCwAhVKtT(Qhx?Iu86gV67zaDG1mg8TI*E{%E*isTN{p3;Pk+hw7P)N zUKdF9AxLAzAH*m3!NzuIYRIEwbW5Ec?xBYa*K%vy$?FSBc_zUzt180%buQM;tj>0o zGpW4>6{>5(`;4os6IMqv?ACxQtIO~d+l83s+}8X$oo&i$XDFa3v%{|%qr!tmI$Cpf za8h5^%cv-(*+&~Z_Pa?tNU7CFCFS0e`MH1Iylohn7V7Ki3F3g}?lkK|F$uD85AL~I z&sCvkLE`hWib{iPb5t$|x`y)+%22_*_+x*Z69%kVv_!5&Agf1|3v(t*pXSKJSR6iR zECNU8V>m4(aUWT%EXjpSo_r{-%+_;zKg)Z=tr7K0B&r--I&*0rk`gC&G`-%_)V{LS z*Sf@Geb_sTbWZm%VbG2ULdL~qR4h!)yoSQSLkKb+OF#&I8vn>|_DIUUMziC>takiG zEiukRMcumEYmJ_)N3`2WpNM~}Z1S8Sj}RD_m07#W#26&{JDqM9T3|?KrnK{2t!{Gb zyj%*d9fhNsz`ZXB5F%dr3_FW(M#1cultd7HlNxUBIKNuKxd-%p?rC zFaZ(_f)XVtHfqs`5=Uyd3`8ZG7)glArLCqkYKzGXcp;EDiDq(~if^U0^-`?b+PAi) zZx!)^W)jQ=sRr=XL$K!_#w)P1t>x6L5=`(vgkxtmz;Hghugj0S}m#?XvXl)&|I? zCZ>A#>MJ+vH2hk-tGRR>HZ1vh`p+M-SnSjM3-{9)CGZWAGv89m!Jy<8V%+&H zF=ADWSYli^ECxA6HD`otqzJ6>d(;}=8d>8}&KOz+Igqjfu(C`vhiYJrHJ2G$h>aje z=^xFfqgz;sQZjSY_6o2wU-_{MXpr<~0EK#-zu`gF5ZOQH0V|?D2F*{lcWl92-9HN= z+`qC;HIA@^@TxME6jYrVf>Jl)d(I@tr-_tm>TxUC$pM94lt>@R1rpkxzPgc_?)X)w z>3)nhOU@R(tjfQ$OrX;u3#H6B*>2vwDIBg{n9AM=e8wqS&O}NRrl7e{$dsaEUdn=! zuZuA$5h)wc7}`-EMw&5=whIDfR`N_1H>ff=j}4m(C{9=H6benYZe$pghRdRc^hTRI ze)%mwz+|OBpUZU&Yxqs@{*{4iqh`31JhsLdx3+MiHrr7#W18o?%n)3<-W}8Xfeew7 zTb8=sU+vK9f7Khd%!?|C9sX*w6xf0GiNaVdbDGy#Vng=@Rqv<=R37HK>Fze=PNIyX(~d?u2%d!Bx@26nsh$)TNjEmeOq&NPjc}stBcCP- z*X7!dP9EZE(y!Q>GGXsNPjY0N66|erHHi%w{q`>`_pSSPgAk>XQ|M4 zeIG}04o6vrwFLfC@cQ}c^MM8Y6b7!Srl4WJcYDB&HcKl;1AcEeOV}d5YM$!X0`pJ_ z+Z@62@@{q=nNT;MN!k$RD{?HW_l@@_uW3P@{X_Cbg zBOqO?#_4Yj#%wTR9+iC@;3NaHFf|`=V>>@E&oi>o4OYy+e6O7cj1$rfxDfBfvJw6p zXBHYtw(Do3LMr4_yw!OxFK``kW~o|6LQYn!_}8mhAYILwk5ai#0PLm*Y6>Cvxu2 z7Js{FGIJyW#OiZ2Lf5NWACTUz<&mS)w7?>~Y-BLgHd|6b_vl{D0$-p%hbHe+%P{mS za&@mE1dR)hSOsiJa6pLTge>22AX#h2_S9QFm-N(Q=baZ$ew2)8`Lnbp?H$bCg2!WS zYn?_CTT(z7zghgVQ)+EBv!@a^pII}9TwMd+KMhVZ7)1s~OM|Jqr`ax1NquWlkjC+M zz!Ot(?bM3Uy;@V_ys4EwU637ht7k;XF@8cZCI6rwdlrce5{1#)1d2C-kv0;vPAQ%& zmlW~LDO@T7`-3rFlvgNbh0gQ!*}Q2yIznekK-0VwhDul&+L0nwvu|$7Qnq^YePO^u z7V?pTi*DWwk(%6pH{*PS-pyGRmC2gLpP{6guP?iSJuE%w)R#j|A5WscS@{?dns6&@ zscq07B5_0Q;?E$^D+ENwiADGQ(rjc7Oz%he@Vnp1J4*8cT`Bl#r5&Pl^VBW$Q$slU zan<}!FXv6vZG2PYNfd5GeNc+{@m-7@?2i~!>|y3fMqjf4@sQ>u3lOf8MKSRU(u#y% z^l1{q7wNfXF_p%`x9SnzM}3EnWo3;I1d*Ky4e;7TpB`iMpRyp?ESWEE*u28{xy$&u zUHzzI%WVnS2;|5u-qsAjgp)03X09EZ5zIS+UNp-h{3qZJ=VB4MnCypXd%+A|7Hayz z|K$TOl99g8e38uccg+{cTW{h8(cXjTT_F%`C^>)mB5B6Qkq>ZBw)ow%7H=14G#?`? zEpaS$^{!3vOlP+(!VHOOcY4XPm5(PQ*yLxY^)@dg;o4vHp9lBof?O)P#AcWon5C`wBN^TxdgB}NY0kJS4YHrFf! zr`=gCY=ZGSmV^$-771B?o6*Aq#h2>D!6^sq-pLw}pzc=R5A7DV>Mp&Jx`}n?c4dgz zWO)!ed^r2I=mpY+Hrs6px$2?W@7_vZP7w@u`Z3h4R@vcNg@#U{meb}RwEVaTY8B

-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 F{XYRrGk^d9 diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 34d0711..8a9a596 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -73,6 +73,7 @@ + From cf3b1d13fcb29b09eb10090822b7a678aec942e5 Mon Sep 17 00:00:00 2001 From: Sunghwan Bang Date: Wed, 5 Feb 2020 23:18:42 +0900 Subject: [PATCH 44/48] =?UTF-8?q?SDK=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Server.vcxproj | 6 +++--- osu!Lyrics/Server.dll | Bin 272896 -> 163328 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/Server.vcxproj b/Server/Server.vcxproj index 2a1e4ff..bc74693 100644 --- a/Server/Server.vcxproj +++ b/Server/Server.vcxproj @@ -15,19 +15,19 @@ Win32Proj osu_Lyrics Server - 10.0.16299.0 + 10.0 DynamicLibrary true - v141 + v142 Unicode DynamicLibrary false - v141 + v142 true Unicode diff --git a/osu!Lyrics/Server.dll b/osu!Lyrics/Server.dll index a6b7b628671f1a78d19ed7339fba8592a26fc554..62a86a5c69983c5eb20f208a4c597a4e4c088215 100644 GIT binary patch literal 163328 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 z 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 J`oHx0{{W$kaHjwO From 6c681f9c4280009aa91f0344426dba6f63570c0e Mon Sep 17 00:00:00 2001 From: Sunghwan Bang Date: Wed, 5 Feb 2020 23:19:00 +0900 Subject: [PATCH 45/48] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs b/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs index 989442d..91b636b 100644 --- a/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs +++ b/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs @@ -18,9 +18,9 @@ public void RegisterTest() } [TestMethod()] - public void GetLyric5AsyncTest() + public void GetLyric7AsyncTest() { - var al = new AlsongGetLyric5(); + var al = new AlsongGetLyric7(); var au = new Audio.AudioInfo { CheckSum = "좋은 날" }; try { From c27a0df061678f7acd540340221b1fc4798fff36 Mon Sep 17 00:00:00 2001 From: Sunghwan Bang Date: Wed, 5 Feb 2020 23:19:41 +0900 Subject: [PATCH 46/48] =?UTF-8?q?=EC=9E=91=EB=8F=99=20=EC=95=88=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B0=80=EC=82=AC=20=EC=86=8C=EC=8A=A4=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs | 24 -------------------- osu!Lyrics/osu!Lyrics.csproj | 1 - 2 files changed, 25 deletions(-) delete mode 100644 osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs diff --git a/osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs b/osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs deleted file mode 100644 index acd5a08..0000000 --- a/osu!Lyrics/Lyrics/Sources/AlsongGetLyric5.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using osu_Lyrics.Audio; - -namespace osu_Lyrics.Lyrics.Sources -{ - class AlsongGetLyric5 : AlsongSource - { - public static void Register() - { - AddSource(); - } - - public override Task GetLyricAsync(AudioInfo audio) - { - var data = Properties.Resources.ResourceManager.GetString("GetLyric5"); - data = data.Replace("[HASH]", audio.CheckSum); - return GetLyricAsync("GetLyric5", data); - } - } -} diff --git a/osu!Lyrics/osu!Lyrics.csproj b/osu!Lyrics/osu!Lyrics.csproj index 8a9a596..9042b8a 100644 --- a/osu!Lyrics/osu!Lyrics.csproj +++ b/osu!Lyrics/osu!Lyrics.csproj @@ -74,7 +74,6 @@ - From 52a8abb9749e97a4a5669432072c3de8ed68b059 Mon Sep 17 00:00:00 2001 From: Sunghwan Bang Date: Wed, 5 Feb 2020 23:33:04 +0900 Subject: [PATCH 47/48] =?UTF-8?q?=EA=B0=80=EC=82=AC=20Payload=EB=A5=BC=20r?= =?UTF-8?q?esx=EC=97=90=EC=84=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs | 25 +++++--- .../Lyrics/Sources/AlsongGetResembleLyric2.cs | 24 ++++---- osu!Lyrics/Properties/Resources.Designer.cs | 59 +++++-------------- osu!Lyrics/Properties/Resources.resx | 22 ------- 4 files changed, 45 insertions(+), 85 deletions(-) diff --git a/osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs b/osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs index b52f1ae..242e78c 100644 --- a/osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs +++ b/osu!Lyrics/Lyrics/Sources/AlsongGetLyric7.cs @@ -7,18 +7,27 @@ namespace osu_Lyrics.Lyrics.Sources { - class AlsongGetLyric7 : AlsongSource + internal class AlsongGetLyric7 : AlsongSource { public static void Register() { AddSource(); } - public override Task GetLyricAsync(AudioInfo audio) - { - var data = Properties.Resources.ResourceManager.GetString("GetLyric7"); - data = data.Replace("[HASH]", audio.CheckSum); - return GetLyricAsync("GetLyric7", data); - } + public override Task GetLyricAsync(AudioInfo audio) => + GetLyricAsync("GetLyric7", $@" + + + + 7c2d15b8f51ac2f3b2a37d7a445c3158455defb8a58d621eb77a3ff8ae4921318e49cefe24e515f79892a4c29c9a3e204358698c1cfe79c151c04f9561e945096ccd1d1c0a8d8f265a2f3fa7995939b21d8f663b246bbc433c7589da7e68047524b80e16f9671b6ea0faaf9d6cde1b7dbcf1b89aa8a1d67a8bbc566664342e12 + + {audio.CheckSum} + + + + + + +"); } -} +} \ No newline at end of file diff --git a/osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs b/osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs index 2dd1f11..312b30c 100644 --- a/osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs +++ b/osu!Lyrics/Lyrics/Sources/AlsongGetResembleLyric2.cs @@ -7,20 +7,24 @@ namespace osu_Lyrics.Lyrics.Sources { - class AlsongGetResembleLyric2 : AlsongSource + internal class AlsongGetResembleLyric2 : AlsongSource { public static void Register() { AddSource(); } - public override Task GetLyricAsync(AudioInfo audio) - { - var data = Properties.Resources.ResourceManager.GetString("GetResembleLyric2"); - var title = audio.Beatmap.TitleUnicode ?? audio.Beatmap.Title; - var artist = audio.Beatmap.ArtistUnicode ?? audio.Beatmap.Artist; - data = data.Replace("[TITLE]", title).Replace("[ARTIST]", artist); - return GetLyricAsync("GetResembleLyric2", data); - } + public override Task GetLyricAsync(AudioInfo audio) => + GetLyricAsync("GetResembleLyric2", $@" + + + + + {audio.Beatmap.TitleUnicode ?? audio.Beatmap.Title} + {audio.Beatmap.ArtistUnicode ?? audio.Beatmap.Artist} + + + +"); } -} +} \ No newline at end of file diff --git a/osu!Lyrics/Properties/Resources.Designer.cs b/osu!Lyrics/Properties/Resources.Designer.cs index cee20d1..a81cdb2 100644 --- a/osu!Lyrics/Properties/Resources.Designer.cs +++ b/osu!Lyrics/Properties/Resources.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// 이 코드는 도구를 사용하여 생성되었습니다. -// 런타임 버전:4.0.30319.42000 +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // -// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 -// 이러한 변경 내용이 손실됩니다. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -13,13 +13,13 @@ namespace osu_Lyrics.Properties { ///

- /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// A strongly-typed resource class, for looking up localized strings, etc. /// - // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder - // 클래스에서 자동으로 생성되었습니다. - // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 - // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -33,7 +33,7 @@ internal Resources() { } /// - /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ internal Resources() { } /// - /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대한 현재 스레드의 CurrentUICulture - /// 속성을 재정의합니다. + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,38 +61,7 @@ internal Resources() { } /// - /// <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body><GetLyric5 xmlns="ALSongWebServer"><stQuery><strChecksum>[HASH]</strChecksum><strVersion/><strMACAddress/><strIPAddress/></stQuery></GetLyric5></Body></Envelope>과(와) 유사한 지역화된 문자열을 찾습니다. - /// - internal static string GetLyric5 { - get { - return ResourceManager.GetString("GetLyric5", resourceCulture); - } - } - - /// - /// <?xml version="1.0" encoding="UTF-8"?> - ///<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="ALSongWebServer/Service1Soap" xmlns:ns1="ALSongWebServer" xmlns:ns3="ALSongWebServer/Service1Soap12"> - /// <SOAP-ENV:Body> - /// <ns1:GetLyric7> - /// <ns1:encData>7c2d15b8f51ac2f3b2a37d7a445c3158455defb8a58d621eb77a3ff8ae4921318e49cefe2[나머지 문자열은 잘림]";과(와) 유사한 지역화된 문자열을 찾습니다. - /// - internal static string GetLyric7 { - get { - return ResourceManager.GetString("GetLyric7", resourceCulture); - } - } - - /// - /// <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body><GetResembleLyric2 xmlns="ALSongWebServer"><stQuery><strTitle>[TITLE]</strTitle><strArtistName>[ARTIST]</strArtistName></stQuery></GetResembleLyric2></Body></Envelope>과(와) 유사한 지역화된 문자열을 찾습니다. - /// - internal static string GetResembleLyric2 { - get { - return ResourceManager.GetString("GetResembleLyric2", resourceCulture); - } - } - - /// - /// (아이콘)과(와) 유사한 System.Drawing.Icon 형식의 지역화된 리소스를 찾습니다. + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// internal static System.Drawing.Icon Icon { get { diff --git a/osu!Lyrics/Properties/Resources.resx b/osu!Lyrics/Properties/Resources.resx index d7552cd..fd06b82 100644 --- a/osu!Lyrics/Properties/Resources.resx +++ b/osu!Lyrics/Properties/Resources.resx @@ -117,28 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body><GetLyric5 xmlns="ALSongWebServer"><stQuery><strChecksum>[HASH]</strChecksum><strVersion/><strMACAddress/><strIPAddress/></stQuery></GetLyric5></Body></Envelope> - - - <?xml version="1.0" encoding="UTF-8"?> -<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="ALSongWebServer/Service1Soap" xmlns:ns1="ALSongWebServer" xmlns:ns3="ALSongWebServer/Service1Soap12"> - <SOAP-ENV:Body> - <ns1:GetLyric7> - <ns1:encData>7c2d15b8f51ac2f3b2a37d7a445c3158455defb8a58d621eb77a3ff8ae4921318e49cefe24e515f79892a4c29c9a3e204358698c1cfe79c151c04f9561e945096ccd1d1c0a8d8f265a2f3fa7995939b21d8f663b246bbc433c7589da7e68047524b80e16f9671b6ea0faaf9d6cde1b7dbcf1b89aa8a1d67a8bbc566664342e12</ns1:encData> - <ns1:stQuery> - <ns1:strChecksum>[HASH]</ns1:strChecksum> - <ns1:strVersion/> - <ns1:strMACAddress/> - <ns1:strIPAddress/> - </ns1:stQuery> - </ns1:GetLyric7> - </SOAP-ENV:Body> -</SOAP-ENV:Envelope> - - - <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body><GetResembleLyric2 xmlns="ALSongWebServer"><stQuery><strTitle>[TITLE]</strTitle><strArtistName>[ARTIST]</strArtistName></stQuery></GetResembleLyric2></Body></Envelope> - ..\Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a From a128d8b933a51e133de695cd552e7f4602968dfc Mon Sep 17 00:00:00 2001 From: Sunghwan Bang Date: Thu, 6 Feb 2020 01:09:42 +0900 Subject: [PATCH 48/48] =?UTF-8?q?csproj=20=EC=B5=9C=EC=8B=A0=ED=99=94=20?= =?UTF-8?q?=EA=B2=B8=20=EB=B2=84=EC=A0=84=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Directory.Build.props | 6 + Server/Resource.rc | Bin 4524 -> 4596 bytes osu!Lyrics.Test/Properties/AssemblyInfo.cs | 20 --- osu!Lyrics.Test/osu!Lyrics.Test.csproj | 74 ----------- osu!Lyrics.Test/packages.config | 5 - .../Lyrics/Sources/AlsongSourceTests.cs | 8 +- .../Lyrics/Sources/LyricSourceTests.cs | 9 +- osu!Lyrics.Tests/osu!Lyrics.Tests.csproj | 17 +++ osu!Lyrics.sln | 17 +-- osu!Lyrics/Program.cs | 4 +- osu!Lyrics/Properties/AssemblyInfo.cs | 38 ------ osu!Lyrics/Server.dll | Bin 163328 -> 163328 bytes osu!Lyrics/osu!Lyrics.csproj | 123 ++++-------------- 13 files changed, 66 insertions(+), 255 deletions(-) create mode 100644 Directory.Build.props delete mode 100644 osu!Lyrics.Test/Properties/AssemblyInfo.cs delete mode 100644 osu!Lyrics.Test/osu!Lyrics.Test.csproj delete mode 100644 osu!Lyrics.Test/packages.config rename {osu!Lyrics.Test => osu!Lyrics.Tests}/Lyrics/Sources/AlsongSourceTests.cs (93%) rename {osu!Lyrics.Test => osu!Lyrics.Tests}/Lyrics/Sources/LyricSourceTests.cs (84%) create mode 100644 osu!Lyrics.Tests/osu!Lyrics.Tests.csproj delete mode 100644 osu!Lyrics/Properties/AssemblyInfo.cs diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..77497eb --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,6 @@ + + + + win-x86 + + \ No newline at end of file diff --git a/Server/Resource.rc b/Server/Resource.rc index 02ba198d4fb8ccce08f5eb6d6df6e7c640919385..6bceb96f6e4ef835414e9250b17f12fb45e87243 100644 GIT binary patch delta 130 zcmZ3Z{6%@gIu1tD&FeV?nSwJIN`SC{p_svnK_3Xy88U(V42DvMBnCZ(WQKf(T%c$% zke>&X%U~#HNCdKs7|a - - - - Debug - AnyCPU - {04660BB7-C1AB-430D-988B-33D8A29B37B4} - Library - Properties - osu_Lyrics.Test - osu!Lyrics.Test - v4.6.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - - - ..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll - - - - - - - - - - - - - - - {9161CC52-C03B-4CCD-AC44-A94C208D31F3} - osu!Lyrics - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - \ No newline at end of file diff --git a/osu!Lyrics.Test/packages.config b/osu!Lyrics.Test/packages.config deleted file mode 100644 index cf2d094..0000000 --- a/osu!Lyrics.Test/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs b/osu!Lyrics.Tests/Lyrics/Sources/AlsongSourceTests.cs similarity index 93% rename from osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs rename to osu!Lyrics.Tests/Lyrics/Sources/AlsongSourceTests.cs index 91b636b..a3c2ff9 100644 --- a/osu!Lyrics.Test/Lyrics/Sources/AlsongSourceTests.cs +++ b/osu!Lyrics.Tests/Lyrics/Sources/AlsongSourceTests.cs @@ -9,15 +9,15 @@ namespace osu_Lyrics.Lyrics.Sources.Tests { - [TestClass()] + [TestClass] public class AlsongSourceTests { - [TestMethod()] + [TestMethod] public void RegisterTest() { } - [TestMethod()] + [TestMethod] public void GetLyric7AsyncTest() { var al = new AlsongGetLyric7(); @@ -30,7 +30,7 @@ public void GetLyric7AsyncTest() catch (IndexOutOfRangeException) { } } - [TestMethod()] + [TestMethod] public void GetResembleLyric2AsyncTest() { var al = new AlsongGetResembleLyric2(); diff --git a/osu!Lyrics.Test/Lyrics/Sources/LyricSourceTests.cs b/osu!Lyrics.Tests/Lyrics/Sources/LyricSourceTests.cs similarity index 84% rename from osu!Lyrics.Test/Lyrics/Sources/LyricSourceTests.cs rename to osu!Lyrics.Tests/Lyrics/Sources/LyricSourceTests.cs index 4da50d4..020124e 100644 --- a/osu!Lyrics.Test/Lyrics/Sources/LyricSourceTests.cs +++ b/osu!Lyrics.Tests/Lyrics/Sources/LyricSourceTests.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using osu_Lyrics.Lyrics; using osu_Lyrics.Lyrics.Sources; using System; using System.Collections.Generic; @@ -8,11 +9,11 @@ namespace osu_Lyrics.Lyrics.Sources.Tests { - [TestClass()] + [TestClass] public class LyricSourceTests { - [TestMethod()] - public void GetLyricsAsyncTest() + [TestMethod] + public async Task GetLyricsAsyncTest() { var au = new Audio.AudioInfo { CheckSum = "좋은 날", Beatmap = new Beatmap.BeatmapMetadata { Artist = "아이유", Title = "좋은 날" } }; var a = LyricSource.GetLyricsAsync(au); @@ -22,7 +23,7 @@ public void GetLyricsAsyncTest() { try { - ret = lyricTask.GetAwaiter().GetResult(); + ret = await lyricTask; break; } catch { } diff --git a/osu!Lyrics.Tests/osu!Lyrics.Tests.csproj b/osu!Lyrics.Tests/osu!Lyrics.Tests.csproj new file mode 100644 index 0000000..97736c6 --- /dev/null +++ b/osu!Lyrics.Tests/osu!Lyrics.Tests.csproj @@ -0,0 +1,17 @@ + + + + net461 + osu_Lyrics.Test + + + + + + + + + + + + \ No newline at end of file diff --git a/osu!Lyrics.sln b/osu!Lyrics.sln index 9ba62a8..138a695 100644 --- a/osu!Lyrics.sln +++ b/osu!Lyrics.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29728.190 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu!Lyrics", "osu!Lyrics\osu!Lyrics.csproj", "{9161CC52-C03B-4CCD-AC44-A94C208D31F3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "osu!Lyrics", "osu!Lyrics\osu!Lyrics.csproj", "{9161CC52-C03B-4CCD-AC44-A94C208D31F3}" ProjectSection(ProjectDependencies) = postProject {55B49E76-AA07-447F-ADE2-B170269EC1EB} = {55B49E76-AA07-447F-ADE2-B170269EC1EB} EndProjectSection @@ -12,10 +12,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Server", "Server\Server.vcx EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D28D2AA9-2B4A-44A6-8DDC-5EA3BD35B112}" ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props LICENSE = LICENSE EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu!Lyrics.Test", "osu!Lyrics.Test\osu!Lyrics.Test.csproj", "{04660BB7-C1AB-430D-988B-33D8A29B37B4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "osu!Lyrics.Tests", "osu!Lyrics.Tests\osu!Lyrics.Tests.csproj", "{04660BB7-C1AB-430D-988B-33D8A29B37B4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -23,10 +24,10 @@ Global Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Debug|Win32.ActiveCfg = Debug|x86 - {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Debug|Win32.Build.0 = Debug|x86 - {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Release|Win32.ActiveCfg = Release|x86 - {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Release|Win32.Build.0 = Release|x86 + {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Debug|Win32.ActiveCfg = Debug|Any CPU + {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Debug|Win32.Build.0 = Debug|Any CPU + {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Release|Win32.ActiveCfg = Release|Any CPU + {9161CC52-C03B-4CCD-AC44-A94C208D31F3}.Release|Win32.Build.0 = Release|Any CPU {55B49E76-AA07-447F-ADE2-B170269EC1EB}.Debug|Win32.ActiveCfg = Debug|Win32 {55B49E76-AA07-447F-ADE2-B170269EC1EB}.Debug|Win32.Build.0 = Debug|Win32 {55B49E76-AA07-447F-ADE2-B170269EC1EB}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/osu!Lyrics/Program.cs b/osu!Lyrics/Program.cs index 2f4c91d..a419f12 100644 --- a/osu!Lyrics/Program.cs +++ b/osu!Lyrics/Program.cs @@ -5,6 +5,8 @@ using System.Threading.Tasks; using System.Windows.Forms; +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("osu!Lyrics.Tests")] + namespace osu_Lyrics { internal class Program @@ -54,7 +56,7 @@ public static long LongB(byte[] buff, int offset, int len = 8) len = 8; } len -= 4; - return (long) IntB(buff, offset) << 8 * len | IntB(buff, offset + 4, len); + return (long)IntB(buff, offset) << 8 * len | IntB(buff, offset + 4, len); } public static int Int(byte[] buff, int offset, int len = 4) diff --git a/osu!Lyrics/Properties/AssemblyInfo.cs b/osu!Lyrics/Properties/AssemblyInfo.cs deleted file mode 100644 index e566bea..0000000 --- a/osu!Lyrics/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; -using System.Resources; -using System.Runtime.CompilerServices; - -// 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다. -// 어셈블리와 관련된 정보를 수정하려면 -// 이 특성 값을 변경하십시오. -[assembly: AssemblyTitle("osu!Lyrics")] -[assembly: AssemblyDescription("가사가 궁금해")] -[assembly: AssemblyCompany("BloodCat")] -[assembly: AssemblyProduct("osu!Lyrics")] -[assembly: AssemblyCopyright("BloodCat 2014-2016")] - -// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 -// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 -// 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오. -[assembly: ComVisible(false)] - -// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. -[assembly: Guid("f03b1886-b735-41af-951d-ea20eaacced0")] - -// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. -// -// 주 버전 -// 부 버전 -// 빌드 번호 -// 수정 버전 -// -// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 버전이 자동으로 -// 지정되도록 할 수 있습니다. -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.8.62")] -[assembly: AssemblyInformationalVersion("1.8.64")] -[assembly: NeutralResourcesLanguageAttribute("ko-KR")] - -[assembly: InternalsVisibleTo("osu!Lyrics.Test")] diff --git a/osu!Lyrics/Server.dll b/osu!Lyrics/Server.dll index 62a86a5c69983c5eb20f208a4c597a4e4c088215..a1a2eb001238f6f1c78ddf7036070cdc171ea500 100644 GIT binary patch delta 3078 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 - - + + - Debug - AnyCPU - {9161CC52-C03B-4CCD-AC44-A94C208D31F3} WinExe - Properties + net45 osu_Lyrics - osu!Lyrics - v4.5 - 512 - + + osu!Lyrics + https://github.com/sunghwan2789/osu-lyrics + osu!Lyrics + ko-KR + 가사가 궁금해 + BloodCat 2014-2020 + 1.8.65 + 1.8.65 Icon.ico - - - - - true - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - latest - - - bin\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset + + + + + + + copy /y "$(SolutionDir)Server\bin\$(Configuration)\Server.dll" "$(MSBuildProjectDirectory)" + - - - - - - - - - - - - - - - - - - - - - - - CanvasForm.cs - - - - - - - - - - - - - - True - True - Resources.resx - - - - Form - - - Settings.cs - - + - - ResXFileCodeGenerator - Resources.Designer.cs - - - - + - - - - copy /y "$(SolutionDir)Server\bin\$(ConfigurationName)\Server.dll" "$(ProjectDir)" - - \ No newline at end of file