123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- #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 );
- }
|