From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/Library/ml_wire/util.cpp | 271 +++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 Src/Plugins/Library/ml_wire/util.cpp (limited to 'Src/Plugins/Library/ml_wire/util.cpp') diff --git a/Src/Plugins/Library/ml_wire/util.cpp b/Src/Plugins/Library/ml_wire/util.cpp new file mode 100644 index 00000000..78ad4277 --- /dev/null +++ b/Src/Plugins/Library/ml_wire/util.cpp @@ -0,0 +1,271 @@ +#include "main.h" +#include "./util.h" +#include "api__ml_wire.h" + +#include + +LPWSTR Plugin_MallocString( size_t cchLen ) +{ + return (LPWSTR)calloc( cchLen, sizeof( WCHAR ) ); +} + +void Plugin_FreeString( LPWSTR pszString ) +{ + if ( NULL != pszString ) + { + free( pszString ); + } +} + +LPWSTR Plugin_ReAllocString( LPWSTR pszString, size_t cchLen ) +{ + return (LPWSTR)realloc( pszString, sizeof( WCHAR ) * cchLen ); +} + +LPWSTR Plugin_CopyString( LPCWSTR pszSource ) +{ + if ( NULL == pszSource ) + return NULL; + + //INT cchSource = lstrlenW( pszSource ) + 1; + + //LPWSTR copy = Plugin_MallocString( cchSource ); + //if ( NULL != copy ) + //{ + // CopyMemory( copy, pszSource, sizeof( WCHAR ) * cchSource ); + //} + // + return _wcsdup( pszSource ); +} + +LPSTR Plugin_MallocAnsiString( size_t cchLen ) +{ + return (LPSTR)calloc( cchLen, sizeof( CHAR ) ); +} + +LPSTR Plugin_CopyAnsiString( LPCSTR pszSource ) +{ + if ( NULL == pszSource ) + return NULL; + + //INT cchSource = lstrlenA(pszSource) + 1; + // + //LPSTR copy = Plugin_MallocAnsiString(cchSource); + //if (NULL != copy) + //{ + // CopyMemory(copy, pszSource, sizeof(CHAR) * cchSource); + //} + + return _strdup( pszSource ); +} + +void Plugin_FreeAnsiString( LPSTR pszString ) +{ + Plugin_FreeString( (LPWSTR)pszString ); +} + +LPSTR Plugin_WideCharToMultiByte( UINT codePage, DWORD dwFlags, LPCWSTR lpWideCharStr, INT cchWideChar, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ) +{ + INT cchBuffer = WideCharToMultiByte( codePage, dwFlags, lpWideCharStr, cchWideChar, NULL, 0, lpDefaultChar, lpUsedDefaultChar ); + if ( 0 == cchBuffer ) + return NULL; + + LPSTR buffer = Plugin_MallocAnsiString( cchBuffer ); + if ( NULL == buffer ) + return NULL; + + if ( 0 == WideCharToMultiByte( codePage, dwFlags, lpWideCharStr, cchWideChar, buffer, cchBuffer, lpDefaultChar, lpUsedDefaultChar ) ) + { + Plugin_FreeAnsiString( buffer ); + return NULL; + } + + return buffer; +} + +LPWSTR Plugin_MultiByteToWideChar( UINT codePage, DWORD dwFlags, LPCSTR lpMultiByteStr, INT cbMultiByte ) +{ + if ( NULL == lpMultiByteStr ) + return NULL; + + INT cchBuffer = MultiByteToWideChar( codePage, dwFlags, lpMultiByteStr, cbMultiByte, NULL, 0 ); + + if ( NULL == cchBuffer ) + return NULL; + + if ( cbMultiByte > 0 ) + cchBuffer++; + + LPWSTR buffer = Plugin_MallocString( cchBuffer ); + + if ( NULL == buffer ) + return NULL; + + if ( 0 == MultiByteToWideChar( codePage, dwFlags, lpMultiByteStr, cbMultiByte, buffer, cchBuffer ) ) + { + Plugin_FreeString( buffer ); + return NULL; + } + + if ( cbMultiByte > 0 ) + { + buffer[ cchBuffer - 1 ] = L'\0'; + } + + return buffer; +} + + +LPWSTR Plugin_DuplicateResString( LPCWSTR pszResource ) +{ + return ( IS_INTRESOURCE( pszResource ) ) ? (LPWSTR)pszResource : Plugin_CopyString( pszResource ); +} + +void Plugin_FreeResString( LPWSTR pszResource ) +{ + if ( !IS_INTRESOURCE( pszResource ) ) + Plugin_FreeString( pszResource ); +} + +HRESULT Plugin_CopyResString( LPWSTR pszBuffer, INT cchBufferMax, LPCWSTR pszString ) +{ + if ( NULL == pszBuffer ) + return E_INVALIDARG; + + HRESULT hr = S_OK; + + if ( NULL == pszString ) + { + pszBuffer[ 0 ] = L'\0'; + } + else if ( IS_INTRESOURCE( pszString ) ) + { + if ( NULL == WASABI_API_LNG ) + hr = E_FAIL; + else + WASABI_API_LNGSTRINGW_BUF( (INT)(INT_PTR)pszString, pszBuffer, cchBufferMax ); + } + else + { + hr = StringCchCopy( pszBuffer, cchBufferMax, pszString ); + } + + return hr; +} + +void Plugin_SafeRelease( IUnknown *pUnk ) +{ + if ( NULL != pUnk ) + pUnk->Release(); +} + +HRESULT Plugin_FileExtensionFromUrl( LPWSTR pszBuffer, INT cchBufferMax, LPCWSTR pszUrl, LPCWSTR defaultExtension ) +{ + LPCWSTR cursor = pszUrl; + while ( L'\0' != *cursor && L'?' != *cursor ) + cursor = CharNext( cursor ); + + LPCWSTR end = cursor; + + while ( cursor != pszUrl && L'/' != *cursor && L'\\' != *cursor && L'.' != *cursor ) + cursor = CharPrev( pszUrl, cursor ); + + if ( L'.' == *cursor && cursor != pszUrl ) + { + if ( CharNext( cursor ) < end ) + { + INT cchExtension = (INT)(INT_PTR)( end - cursor ); + return StringCchCopyN( pszBuffer, cchBufferMax, cursor, cchExtension ); + } + } + + return StringCchCopy( pszBuffer, cchBufferMax, defaultExtension ); +} + +void Plugin_ReplaceBadPathChars( LPWSTR pszPath ) +{ + if ( NULL == pszPath ) + return; + + while ( L'\0' != *pszPath ) + { + switch ( *pszPath ) + { + case L'?': + case L'/': + case L'\\': + case L':': + case L'*': + case L'\"': + case L'<': + case L'>': + case L'|': + *pszPath = L'_'; + break; + default: + if ( *pszPath < 32 ) + *pszPath = L'_'; + break; + } + + pszPath = CharNextW( pszPath ); + } +} + +INT Plugin_CleanDirectory( LPWSTR pszPath ) +{ + if ( NULL == pszPath ) + return 0; + + INT cchPath = lstrlen( pszPath ); + LPWSTR cursor = pszPath + cchPath; + while ( cursor-- != pszPath && ( L' ' == *cursor || L'.' == *cursor ) ) + *cursor = L'\0'; + + return ( cchPath - (INT)(INT_PTR)( cursor - pszPath ) - 1 ); +} + +HRESULT Plugin_EnsurePathExist( LPCWSTR pszDirectory ) +{ + DWORD ec = ERROR_SUCCESS; + + UINT errorMode = SetErrorMode( SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS ); + + if ( 0 == CreateDirectory( pszDirectory, NULL ) ) + { + ec = GetLastError(); + if ( ERROR_PATH_NOT_FOUND == ec ) + { + LPCWSTR pszBlock = pszDirectory; + WCHAR szBuffer[ MAX_PATH ] = { 0 }; + + LPCTSTR pszCursor = PathFindNextComponent( pszBlock ); + ec = ( pszCursor == pszBlock || S_OK != StringCchCopyN( szBuffer, ARRAYSIZE( szBuffer ), pszBlock, ( pszCursor - pszBlock ) ) ) ? ERROR_INVALID_NAME : ERROR_SUCCESS; + + pszBlock = pszCursor; + + while ( ERROR_SUCCESS == ec && NULL != ( pszCursor = PathFindNextComponent( pszBlock ) ) ) + { + if ( pszCursor == pszBlock || S_OK != StringCchCatN( szBuffer, ARRAYSIZE( szBuffer ), pszBlock, ( pszCursor - pszBlock ) ) ) + ec = ERROR_INVALID_NAME; + + if ( ERROR_SUCCESS == ec && !CreateDirectory( szBuffer, NULL ) ) + { + ec = GetLastError(); + if ( ERROR_ALREADY_EXISTS == ec ) + ec = ERROR_SUCCESS; + } + + pszBlock = pszCursor; + } + } + + if ( ERROR_ALREADY_EXISTS == ec ) + ec = ERROR_SUCCESS; + } + + SetErrorMode( errorMode ); + SetLastError( ec ); + + return HRESULT_FROM_WIN32( ec ); +} \ No newline at end of file -- cgit