aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_wire/util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_wire/util.cpp')
-rw-r--r--Src/Plugins/Library/ml_wire/util.cpp271
1 files changed, 271 insertions, 0 deletions
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 <strsafe.h>
+
+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