dcdd144598 2011-02-23 kinaba: #include "stdafx.h" dcdd144598 2011-02-23 kinaba: #include "registry.h" dcdd144598 2011-02-23 kinaba: using namespace ki; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void IniFile::SetFileName( const TCHAR* ini, bool exepath ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: iniName_ = dcdd144598 2011-02-23 kinaba: (exepath ? iniName_.BeSpecialPath(Path::Exe) : Path(TEXT(""))); dcdd144598 2011-02-23 kinaba: if( ini != NULL ) dcdd144598 2011-02-23 kinaba: iniName_ += ini; dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: iniName_ += (Path(Path::ExeName).body()+=TEXT(".ini")); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void IniFile::SetSectionAsUserName() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TCHAR usr[256]; dcdd144598 2011-02-23 kinaba: DWORD siz = countof(usr); dcdd144598 2011-02-23 kinaba: if( !::GetUserName( usr, &siz ) ) dcdd144598 2011-02-23 kinaba: ::lstrcpy( usr, TEXT("Default") ); dcdd144598 2011-02-23 kinaba: SetSection( usr ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool IniFile::HasSectionEnabled( const TCHAR* section ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (0!=::GetPrivateProfileInt( dcdd144598 2011-02-23 kinaba: section, TEXT("Enable"), 0, iniName_.c_str() )); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int IniFile::GetInt ( const TCHAR* key, int defval ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return ::GetPrivateProfileInt( dcdd144598 2011-02-23 kinaba: section_.c_str(), key, defval, iniName_.c_str() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool IniFile::GetBool( const TCHAR* key, bool defval ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (0!=::GetPrivateProfileInt( dcdd144598 2011-02-23 kinaba: section_.c_str(), key, defval?1:0, iniName_.c_str() )); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: String IniFile::GetStr ( const TCHAR* key, const String& defval ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: RawString str; dcdd144598 2011-02-23 kinaba: ulong l=256, s; dcdd144598 2011-02-23 kinaba: for(;;) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TCHAR* x = str.AllocMem(l); dcdd144598 2011-02-23 kinaba: s = ::GetPrivateProfileString( section_.c_str(), key, dcdd144598 2011-02-23 kinaba: defval.c_str(), x, l, iniName_.c_str() ); dcdd144598 2011-02-23 kinaba: if( s < l-1 ) dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: l <<= 1; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: str.UnlockMem(); dcdd144598 2011-02-23 kinaba: return str; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Path IniFile::GetPath( const TCHAR* key, const Path& defval ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: #ifdef _UNICODE dcdd144598 2011-02-23 kinaba: String s = GetStr( key, defval ); dcdd144598 2011-02-23 kinaba: if( s.len()==0 || s[0]!='#' ) dcdd144598 2011-02-23 kinaba: return s; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // UTF-decoder dcdd144598 2011-02-23 kinaba: String buf; dcdd144598 2011-02-23 kinaba: for(uint i=0; 4*i+4<s.len(); ++i) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: unsigned short v = 0; dcdd144598 2011-02-23 kinaba: for(int j=1; j<=4; ++j) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: int ch = s[4*i+j]; dcdd144598 2011-02-23 kinaba: if( '0'<=ch && ch<='9' ) v = 16*v + ch-'0'; dcdd144598 2011-02-23 kinaba: if( 'a'<=ch && ch<='z' ) v = 16*v + ch-'a'+10; dcdd144598 2011-02-23 kinaba: if( 'A'<=ch && ch<='Z' ) v = 16*v + ch-'A'+10; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: buf += (wchar_t) v; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return buf; dcdd144598 2011-02-23 kinaba: #else dcdd144598 2011-02-23 kinaba: return GetStr( key, defval ); dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool IniFile::PutStr ( const TCHAR* key, const TCHAR* val ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( val[0]==TEXT('"') && val[::lstrlen(val)-1]==TEXT('"') ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 両端に " があると勝手に削られるので対処 dcdd144598 2011-02-23 kinaba: String nval; dcdd144598 2011-02-23 kinaba: nval += TEXT('"'); dcdd144598 2011-02-23 kinaba: nval += val; dcdd144598 2011-02-23 kinaba: nval += TEXT('"'); dcdd144598 2011-02-23 kinaba: return (FALSE != ::WritePrivateProfileString( dcdd144598 2011-02-23 kinaba: section_.c_str(), key, nval.c_str(), iniName_.c_str() ) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (FALSE != ::WritePrivateProfileString( dcdd144598 2011-02-23 kinaba: section_.c_str(), key, val, iniName_.c_str() ) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool IniFile::PutInt ( const TCHAR* key, int val ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TCHAR buf[20]; dcdd144598 2011-02-23 kinaba: ::wsprintf( buf, TEXT("%d"), val ); dcdd144598 2011-02-23 kinaba: return PutStr( key, buf ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool IniFile::PutBool( const TCHAR* key, bool val ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return PutStr( key, val ? TEXT("1") : TEXT("0") ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool IniFile::PutPath( const TCHAR* key, const Path& val ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: #ifdef _UNICODE dcdd144598 2011-02-23 kinaba: BOOL err = FALSE; dcdd144598 2011-02-23 kinaba: ::WideCharToMultiByte( CP_ACP, 0, val.c_str(), -1, NULL, 0, NULL, &err ); dcdd144598 2011-02-23 kinaba: if( !err ) dcdd144598 2011-02-23 kinaba: return PutStr( key , val.c_str() ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // UTF-encoder dcdd144598 2011-02-23 kinaba: const TCHAR* hex = TEXT("0123456789abcdef"); dcdd144598 2011-02-23 kinaba: String buf = TEXT("#"); dcdd144598 2011-02-23 kinaba: for(int i=0; i!=val.len(); ++i) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: unsigned short u = (unsigned short) val[i]; dcdd144598 2011-02-23 kinaba: buf += hex[(u>>12) & 0xf]; dcdd144598 2011-02-23 kinaba: buf += hex[(u>> 8) & 0xf]; dcdd144598 2011-02-23 kinaba: buf += hex[(u>> 4) & 0xf]; dcdd144598 2011-02-23 kinaba: buf += hex[(u>> 0) & 0xf]; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return PutStr( key, buf.c_str() ); dcdd144598 2011-02-23 kinaba: #else dcdd144598 2011-02-23 kinaba: return PutStr( key, val.c_str() ); dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: