//////////////////////////////////////////////////////////////////////////////// // Plainamp, Open source Winamp core // // Copyright © 2005 Sebastian Pipping // // --> http://www.hartwork.org // // This source code is released under the GNU General Public License (GPL). // See GPL.txt for details. Any non-GPL usage is strictly forbidden. //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /// Include and declarations, definitions //////////////////////////////////////////////////////////////////////////////// #include "Config.h" #include "Console.h" #include using namespace std; map * conf_map = NULL; TCHAR * szIniPath = NULL; const TCHAR * SECTION = TEXT( "Plainamp" ); // ============================================================================ //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfVar::ConfVar( TCHAR * szKey, ConfMode mode ) { // MessageBox( 0, TEXT( "no const @ ConfVar" ), TEXT( "" ), 0 ); //wprintf("ConfVar::ConfVar(TCHAR) > Got <%s>\n", szKey); // Init const int iLen = ( int )_tcslen( szKey ); m_szKey = new TCHAR[ iLen + 1 ]; memcpy( m_szKey, szKey, iLen * sizeof( TCHAR ) ); m_szKey[ iLen ] = TEXT( '\0' ); m_bCopyKey = true; m_Mode = mode; m_bRead = false; // Register if( !conf_map ) conf_map = new map; conf_map->insert( pair( m_szKey, this ) ); } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfVar::ConfVar( const TCHAR * szKey, ConfMode mode ) { //wprintf("ConfVar::ConfVar(const TCHAR) > Got <%s>\n", szKey); // Init m_szKey = ( TCHAR * )szKey; m_bCopyKey = false; m_Mode = mode; m_bRead = false; // Register if( !conf_map ) conf_map = new map; conf_map->insert( pair( m_szKey, this ) ); //wprintf("ConfVar::ConfVar(const TCHAR) > Insert <%s>\n", ConfVar::m_szKey); } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfVar::~ConfVar() { if( m_bCopyKey && m_szKey ) delete [] m_szKey; } // ======================================================================================= // The line name is collected in ConfVar, then ConfBool gets the boolean //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfBool::ConfBool( bool * pbData, TCHAR * szKey, ConfMode mode, bool bDefault ) : ConfVar( szKey, mode ) { // MessageBox( 0, TEXT( "no const @ ConfBool" ), TEXT( "" ), 0 ); //wprintf("ConfBool(TCHAR) > Get <%s>\n", szKey); m_pbData = pbData; m_bDefault = bDefault; // *pbData = bDefault; } // ======================================================================================= //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfBool::ConfBool( bool * pbData, const TCHAR * szKey, ConfMode mode, bool bDefault ) : ConfVar( szKey, mode ) { //wprintf("ConfBool(TCHAR) > Get <%s>\n", szKey); m_pbData = pbData; m_bDefault = bDefault; // *pbData = bDefault; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfBool::Read() { //wprintf("ConfBool::Read() > Begin and \n", m_bRead, szIniPath); if( m_bRead || !szIniPath ) return; *m_pbData = ( GetPrivateProfileInt( SECTION, m_szKey, ( int )m_bDefault, szIniPath ) != 0 ); m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfBool::Write() { WritePrivateProfileString( SECTION, m_szKey, *m_pbData ? TEXT( "1" ) : TEXT( "0" ), szIniPath ); m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfInt::ConfInt( int * piData, TCHAR * szKey, ConfMode mode, int iDefault ) : ConfVar( szKey, mode ) { MessageBox( 0, TEXT( "no const" ), TEXT( "" ), 0 ); m_piData = piData; m_iDefault = iDefault; // *piData = iDefault; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfInt::ConfInt( int * piData, const TCHAR * szKey, ConfMode mode, int iDefault ) : ConfVar( szKey, mode ) { m_piData = piData; m_iDefault = iDefault; // *piData = iDefault; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfInt::Read() { if( m_bRead || !szIniPath ) return; *m_piData = GetPrivateProfileInt( SECTION, m_szKey, m_iDefault, szIniPath ); m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfInt::Write() { TCHAR szNumber[ 12 ] = TEXT( "" ); _stprintf( szNumber, TEXT( "%i" ), *m_piData ); WritePrivateProfileString( SECTION, m_szKey, szNumber, szIniPath ); m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfIntMinMax::ConfIntMinMax( int * piData, TCHAR * szKey, ConfMode mode, int iDefault, int iMin, int iMax ) : ConfInt( piData, szKey, mode, iDefault ) { MessageBox( 0, TEXT( "no const" ), TEXT( "" ), 0 ); m_iMin = iMin; m_iMax = iMax; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfIntMinMax::ConfIntMinMax( int * piData, const TCHAR * szKey, ConfMode mode, int iDefault, int iMin, int iMax ) : ConfInt( piData, szKey, mode, iDefault ) { m_iMin = iMin; m_iMax = iMax; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfWinPlaceCallback::ConfWinPlaceCallback( WINDOWPLACEMENT * pwpData, TCHAR * szKey, RECT * prDefault, ConfCallback fpCallback ) : ConfVar( szKey, CONF_MODE_INTERNAL ) { MessageBox( 0, TEXT( "no const" ), TEXT( "" ), 0 ); m_pwpData = pwpData; m_prDefault = prDefault; m_fpCallback = fpCallback; pwpData->length = sizeof( WINDOWPLACEMENT ); pwpData->flags = 0; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfWinPlaceCallback::ConfWinPlaceCallback( WINDOWPLACEMENT * pwpData, const TCHAR * szKey, RECT * prDefault, ConfCallback fpCallback ) : ConfVar( szKey, CONF_MODE_INTERNAL ) { m_pwpData = pwpData; m_prDefault = prDefault; m_fpCallback = fpCallback; pwpData->length = sizeof( WINDOWPLACEMENT ); pwpData->flags = 0; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfWinPlaceCallback::Read() { if( m_bRead || !szIniPath ) return; POINT ptMinPosition = { -1, -1 }; POINT ptMaxPosition = { -GetSystemMetrics( SM_CXBORDER ), -GetSystemMetrics( SM_CYBORDER ) }; m_pwpData->length = sizeof( WINDOWPLACEMENT ); m_pwpData->flags = 0; m_pwpData->ptMinPosition = ptMinPosition; m_pwpData->ptMaxPosition = ptMaxPosition; TCHAR szOut[ 111 ] = TEXT( "" ); int iChars = GetPrivateProfileString( SECTION, m_szKey, TEXT( "" ), szOut, 110, szIniPath ); bool bApplyDefault = true; if( iChars ) { int iFields = _stscanf( szOut, TEXT( "(%u,(%i,%i,%i,%i))" ), &m_pwpData->showCmd, &m_pwpData->rcNormalPosition.left, &m_pwpData->rcNormalPosition.top, &m_pwpData->rcNormalPosition.right, &m_pwpData->rcNormalPosition.bottom ); if( iFields == 5 ) { bApplyDefault = false; } } if( bApplyDefault ) { m_pwpData->showCmd = SW_SHOWNORMAL; m_pwpData->rcNormalPosition = *m_prDefault; } m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfWinPlaceCallback::Write() { // Refresh data if( m_fpCallback ) m_fpCallback( this ); TCHAR szData[ 111 ] = TEXT( "" ); _stprintf( szData, TEXT( "(%u,(%i,%i,%i,%i))" ), m_pwpData->showCmd, m_pwpData->rcNormalPosition.left, m_pwpData->rcNormalPosition.top, m_pwpData->rcNormalPosition.right, m_pwpData->rcNormalPosition.bottom ); WritePrivateProfileString( SECTION, m_szKey, szData, szIniPath ); m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfBandInfoCallback::ConfBandInfoCallback( BandInfo * pbiData, TCHAR * szKey, BandInfo * pbiDefault, ConfCallback fpCallback ) : ConfVar( szKey, CONF_MODE_INTERNAL ) { MessageBox( 0, TEXT( "no const" ), TEXT( "" ), 0 ); m_pbiData = pbiData; m_pbiDefault = pbiDefault; m_fpCallback = fpCallback; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfBandInfoCallback::ConfBandInfoCallback( BandInfo * pbiData, const TCHAR * szKey, BandInfo * pbiDefault, ConfCallback fpCallback ) : ConfVar( szKey, CONF_MODE_INTERNAL ) { m_pbiData = pbiData; m_pbiDefault = pbiDefault; m_fpCallback = fpCallback; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfBandInfoCallback::Read() { if( m_bRead || !szIniPath ) return; int iBreak; int iVisible; TCHAR szOut[ 91 ] = TEXT( "" ); int iChars = GetPrivateProfileString( SECTION, m_szKey, TEXT( "" ), szOut, 90, szIniPath ); bool bApplyDefault = true; if( iChars ) { int iFields = _stscanf( szOut, TEXT( "(%i,%i,%i,%i)" ), &m_pbiData->m_iIndex, &m_pbiData->m_iWidth, &iBreak, &iVisible ); if( iFields == 4 ) { m_pbiData->m_bBreak = ( iBreak != 0 ); m_pbiData->m_bVisible = ( iVisible != 0 ); bApplyDefault = false; } } if( bApplyDefault ) { *m_pbiData = *m_pbiDefault; } m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfBandInfoCallback::Write() { // Refresh data if( m_fpCallback ) m_fpCallback( this ); TCHAR szData[ 91 ] = TEXT( "" ); _stprintf( szData, TEXT( "(%i,%i,%i,%i)" ), m_pbiData->m_iIndex, m_pbiData->m_iWidth, ( int )m_pbiData->m_bBreak, ( int )m_pbiData->m_bVisible ); WritePrivateProfileString( SECTION, m_szKey, szData, szIniPath ); m_bRead = true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// bool ConfBandInfoCallback::Apply( HWND hRebar, int iBandId ) { const int iOldIndex = ( int )SendMessage( hRebar, RB_IDTOINDEX, iBandId, 0 ); if( iOldIndex == -1 ) return false; int & iNewIndex = m_pbiData->m_iIndex; if( iOldIndex != iNewIndex ) { // Move band if( !SendMessage( hRebar, RB_MOVEBAND, iOldIndex, iNewIndex ) ) { return false; } } REBARBANDINFO rbbi; rbbi.cbSize = sizeof( REBARBANDINFO ); rbbi.fMask = RBBIM_STYLE; // Get current info if( !SendMessage( hRebar, RB_GETBANDINFO, iNewIndex, ( LPARAM )&rbbi ) ) { return false; } rbbi.fMask = RBBIM_SIZE | RBBIM_STYLE; rbbi.cx = m_pbiData->m_iWidth; if( ( rbbi.fStyle & RBBS_BREAK ) == RBBS_BREAK ) { if( !m_pbiData->m_bBreak ) rbbi.fStyle -= RBBS_BREAK; } else { if( m_pbiData->m_bBreak ) rbbi.fStyle |= RBBS_BREAK; } // Update info if( !SendMessage( hRebar, RB_SETBANDINFO, iNewIndex, ( LPARAM )&rbbi ) ) { return false; } // Show/hide band if( !SendMessage( hRebar, RB_SHOWBAND, iNewIndex, m_pbiData->m_bVisible ? TRUE : FALSE ) ) { return false; } return true; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfString::ConfString( TCHAR * szData, TCHAR * szKey, ConfMode mode, TCHAR * szDefault, int iMaxLen ) : ConfVar( szKey, mode ) { MessageBox( 0, TEXT( "no const" ), TEXT( "" ), 0 ); m_szData = szData; m_szDefault = szDefault; m_iMaxLen = iMaxLen; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfString::ConfString( TCHAR * szData, const TCHAR * szKey, ConfMode mode, TCHAR * szDefault, int iMaxLen ) : ConfVar( szKey, mode ) { m_szData = szData; m_szDefault = szDefault; m_iMaxLen = iMaxLen; } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfString::Read() { //wprintf( "ConfString::Read() > Begin\n"); if( m_bRead || !szIniPath ) return; GetPrivateProfileString( SECTION, m_szKey, m_szDefault, m_szData, m_iMaxLen, szIniPath ); //wprintf( "ConfString::Read() > GetPrivateProfileString <%s> <%s> <%s>\n", m_szKey, m_szData, szIniPath); m_bRead = true; } // ======================================================================================= // I don't use this //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfString::Write() { /* WritePrivateProfileString( SECTION, m_szKey, m_szData, szIniPath ); m_bRead = true; */ } // ======================================================================================= //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfCurDir::ConfCurDir( TCHAR * szData, TCHAR * szKey ) : ConfString( szData, szKey, CONF_MODE_INTERNAL, TEXT( "C:\\" ), MAX_PATH ) { } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// ConfCurDir::ConfCurDir( TCHAR * szData, const TCHAR * szKey ) : ConfString( szData, szKey, CONF_MODE_INTERNAL, TEXT( "C:\\" ), MAX_PATH ) { } //////////////////////////////////////////////////////////////////////////////// /* IMPORTANT: This SetCurrentDirectory() has to be disabled or we change the relative paths for the entire application */ //////////////////////////////////////////////////////////////////////////////// void ConfCurDir::Read() { ConfString::Read(); // Apply //SetCurrentDirectory( m_szData ); //wprintf("ConfCurDir::Read > End <%s>\n", m_szData); } // ============================================================================== //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfCurDir::Write() { // Refresh GetCurrentDirectory( MAX_PATH, m_szData ); // Note: without trailing slash // MessageBox( 0, m_szData, TEXT( "CurDir" ), 0 ); //wprintf("ConfCurDir::Read <%s>\n", m_szData); ConfString::Write(); } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void Conf::Init() { if( szIniPath ) return; // ======================================================================================= // Find the right ini file // Long filename szIniPath = new TCHAR[ _MAX_PATH ]; TCHAR szFull[ _MAX_PATH ] = TEXT( "" ); TCHAR szDrive[ _MAX_DRIVE ] = TEXT( "" ); TCHAR szDir[ _MAX_DIR ] = TEXT( "" ); // --------------------------------------------------------------------------------------- // We place the full path in szFull //GetModuleFileName( hInstance, szFull, _MAX_PATH ); GetModuleFileName( NULL, szFull, _MAX_PATH ); // No don't use that // --------------------------------------------------------------------------------------- _tsplitpath( szFull, szDrive, szDir, NULL, NULL ); // Convert short to long path GetLongPathName( szDir, szDir, _MAX_DIR ); // --------------------------------------------------------------------------------------- // We place information about the file in fd // --------------------------------------------------------------------------------------- // Convert short to long file WIN32_FIND_DATA fd; HANDLE h = FindFirstFile( szFull, &fd ); // --------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------- // Convert File.exe to File.ini // --------------------------------------------------------------------------------------- // Search last dot TCHAR * szSearch = fd.cFileName + _tcslen( fd.cFileName ) - 1; while( ( *szSearch != TEXT( '.' ) ) && ( szSearch > fd.cFileName ) ) { szSearch--; } // --------------------------------------------------------------------------------------- // Replace extension _tcscpy( szSearch, TEXT( ".ini" ) ); // --------------------------------------------------------------------------------------- // Copy full filename //_sntprintf( szIniPath, _MAX_PATH, TEXT( "%s%s%s" ), szDrive, szDir, fd.cFileName ); _sntprintf( szIniPath, _MAX_PATH, TEXT( "%s%s%s" ), szDrive, szDir, TEXT( "Plainamp.ini" ) ); wprintf("DLL > We got the ini path <%s>\n", szIniPath); // ======================================================================================= // --------------------------------------------------------------------------------------- // Read all settings in it // --------------------------------------------------------------------------------------- // Read all (original comment) map::iterator iter = conf_map->begin(); // ======================================================================================= // This will lead us to the Read() function earlier in this file. For example ConfBool::Read() while( iter != conf_map->end() ) { /* By default there was a SetCurrentDirectory() here that would affect the entire process, exe and everything. It is disabled now. */ iter->second->Read(); iter++; } // ======================================================================================= // --------------------------------------------------------------------------------------- } //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void Conf::Write() { if( !szIniPath ) return; map::iterator iter = conf_map->begin(); while( iter != conf_map->end() ) { iter->second->Write(); iter++; } }