Skip to content

Commit

Permalink
Merge 9792551 into f2e38fe
Browse files Browse the repository at this point in the history
  • Loading branch information
sanomari authored Feb 21, 2021
2 parents f2e38fe + 9792551 commit 385ec24
Show file tree
Hide file tree
Showing 6 changed files with 193 additions and 104 deletions.
22 changes: 12 additions & 10 deletions sakura_core/CDataProfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#define SAKURA_CDATAPROFILE_401640FD_5B27_454A_B0DE_098E1C4FAEAD_H_
#pragma once

#include "basis/SakuraBasis.h"
#include "debug/Debug2.h"
#include "util/StaticType.h"
#include "CProfile.h"

Expand Down Expand Up @@ -166,8 +168,8 @@ class CDataProfile : public CProfile{
*/
template <class T> //T=={bool, int, WORD, wchar_t, char, StringBufferW, StaticString}
bool IOProfileData(
const std::wstring& strSectionName, //!< [in] セクション名
const std::wstring& strEntryKey, //!< [in] エントリ名
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
T& tEntryValue //!< [in,out] エントリ値
) noexcept
{
Expand All @@ -177,16 +179,17 @@ class CDataProfile : public CProfile{
bool ret = false;
if( IsReadingMode() ){
//文字列読み込み
if( GetProfileDataImp( strSectionName, strEntryKey, buf ) ){
if( GetProfileData(sectionName, entryKey, buf) ){
//Tに変換
profile_to_value(buf, &tEntryValue);
ret = true;
}
}else{
//文字列に変換
value_to_profile(tEntryValue, &buf);
ret = true; //TODO: 変換成否の反映
//文字列書き込み
ret = SetProfileDataImp( strSectionName, strEntryKey, buf );
SetProfileData(sectionName, entryKey, buf);
}
return ret;
}
Expand All @@ -208,19 +211,18 @@ class CDataProfile : public CProfile{
*/
template <> inline
bool CDataProfile::IOProfileData<std::wstring>(
const std::wstring& strSectionName, //!< [in] セクション名
const std::wstring& strEntryKey, //!< [in] エントリ名
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
std::wstring& strEntryValue //!< [in,out] エントリ値
) noexcept
{
bool ret = false;
if( IsReadingMode() ){
//文字列読み込み
ret = GetProfileDataImp( strSectionName, strEntryKey, strEntryValue );
return GetProfileData(sectionName, entryKey, strEntryValue);
}else{
//文字列書き込み
ret = SetProfileDataImp( strSectionName, strEntryKey, strEntryValue );
SetProfileData(sectionName, entryKey, strEntryValue);
return true;
}
return ret;
}
#endif /* SAKURA_CDATAPROFILE_401640FD_5B27_454A_B0DE_098E1C4FAEAD_H_ */
77 changes: 31 additions & 46 deletions sakura_core/CProfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@
*/
#include "StdAfx.h"
#include "CProfile.h"

#include <algorithm>
#include <map>
#include <string>
#include <string_view>
#include <vector>

#include "io/CTextStream.h"
#include "charset/CUtf8.h" // Resource読み込みに使用
#include "CEol.h"
Expand Down Expand Up @@ -313,73 +320,51 @@ bool CProfile::_WriteFile(
return true;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// Imp //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //

/*! エントリ値をProfileから読み込む
@retval true 成功
@retval false 失敗
@date 2003-10-22 D.S.Koba 作成
*/
bool CProfile::GetProfileDataImp(
const wstring& strSectionName, //!< [in] セクション名
const wstring& strEntryKey, //!< [in] エントリ名
wstring& strEntryValue //!< [out] エントリ値
)
bool CProfile::GetProfileData(
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
std::wstring& strEntryValue //!< [out] エントリ値
) const
{
for(auto iter = m_ProfileData.begin(); iter != m_ProfileData.end(); iter++ ) {
if( iter->strSectionName == strSectionName ) {
auto mapiter = iter->mapEntries.find( strEntryKey );
if( iter->mapEntries.end() != mapiter ) {
strEntryValue = mapiter->second;
return true;
}
// セクション名が一致するセクションを探す
if (const auto iter = std::find_if(m_ProfileData.begin(), m_ProfileData.end(), [&sectionName](const auto& section) {return section.strSectionName == sectionName; }); iter != m_ProfileData.end()) {
// キーが一致するエントリを探す
if (const auto mapiter = iter->mapEntries.find(entryKey.data()); iter->mapEntries.end() != mapiter) {
// エントリの値をコピーする
strEntryValue = mapiter->second;
return true;
}
}
return false;
}

/*! エントリをProfileへ書き込む
@retval true 成功
@retval false 失敗(処理を入れていないのでfalseは返らない)
@date 2003-10-21 D.S.Koba 作成
*/
bool CProfile::SetProfileDataImp(
const wstring& strSectionName, //!< [in] セクション名
const wstring& strEntryKey, //!< [in] エントリ名
const wstring& strEntryValue //!< [in] エントリ値
void CProfile::SetProfileData(
std::wstring_view sectionName, //!< [in] セクション名
std::wstring_view entryKey, //!< [in] エントリ名
std::wstring_view entryValue //!< [in] エントリ値
)
{
auto iter = m_ProfileData.begin();
for(; iter != m_ProfileData.end(); iter++ ) {
if( iter->strSectionName == strSectionName ) {
//既存のセクションの場合
auto mapiter = iter->mapEntries.find( strEntryKey );
if( iter->mapEntries.end() != mapiter ) {
//既存のエントリの場合は値を上書き
mapiter->second = strEntryValue;
break;
}
else {
//既存のエントリが見つからない場合は追加
iter->mapEntries.insert( PAIR_STR_STR( strEntryKey, strEntryValue ) );
break;
}
}
// セクション名が一致するセクションがない場合、空のセクションを追加する
if (const auto iter = std::find_if(m_ProfileData.begin(), m_ProfileData.end(), [&sectionName](const auto& section) {return section.strSectionName == sectionName; }); iter == m_ProfileData.end()) {
m_ProfileData.emplace_back(Section{ sectionName.data() });
}
//既存のセクションではない場合,セクション及びエントリを追加
if( iter == m_ProfileData.end() ) {
Section Buffer;
Buffer.strSectionName = strSectionName;
Buffer.mapEntries.insert( PAIR_STR_STR( strEntryKey, strEntryValue ) );
m_ProfileData.push_back( Buffer );
// セクション名が一致するセクションを探す
if (auto iter = std::find_if(m_ProfileData.begin(), m_ProfileData.end(), [&sectionName](const auto& section) {return section.strSectionName == sectionName; }); iter != m_ProfileData.end()) {
// エントリに指定された値を書き込む
auto& sectionEntries = iter->mapEntries;
sectionEntries[entryKey.data()] = entryValue;
}
return true;
}

void CProfile::DUMP( void )
Expand Down
11 changes: 5 additions & 6 deletions sakura_core/CProfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

#include <Windows.h>
#include <string>
#include <string_view>
#include <vector>
#include <map>

Expand All @@ -61,26 +62,24 @@ class CProfile
};

public:
CProfile() {}
~CProfile() {}
CProfile() = default;
virtual ~CProfile() = default;
void Init( void );
bool IsReadingMode( void ) { return m_bRead; }
void SetReadingMode( void ) { m_bRead = true; }
void SetWritingMode( void ) { m_bRead = false; }
bool ReadProfile( const WCHAR* );
bool ReadProfileRes( const WCHAR*, const WCHAR*, std::vector<std::wstring>* = NULL ); // 200/5/19 Uchi
bool WriteProfile( const WCHAR*, const WCHAR* pszComment);
bool GetProfileData(std::wstring_view sectionName, std::wstring_view entryKey, std::wstring& strEntryValue) const;
void SetProfileData(std::wstring_view sectionName, std::wstring_view entryKey, std::wstring_view entryValue);

void DUMP( void );

protected:
void ReadOneline( const wstring& line );
bool _WriteFile( const wstring& strFilename, const std::vector< wstring >& vecLine);

bool GetProfileDataImp( const wstring& strSectionName, const wstring& strEntryKey, wstring& strEntryValue);

bool SetProfileDataImp( const wstring& strSectionName, const wstring& strEntryKey, const wstring& strEntryValue );

protected:
// メンバ変数
wstring m_strProfileName; //!< 最後に読み書きしたファイル名
Expand Down
44 changes: 27 additions & 17 deletions tests/unittests/test-cdlgprofilemgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include "env/DLLSHAREDATA.h"
#include "_main/CCommandLine.h"
#include "_main/CControlProcess.h"
#include "CDataProfile.h"
#include "util/file.h"

/*!
Expand Down Expand Up @@ -132,12 +133,16 @@ TEST_F( CDlgProfileMgrTest, TrySelectProfile_003 )
TEST_F( CDlgProfileMgrTest, TrySelectProfile_004 )
{
// プロファイル設定を作る
SProfileSettings settings;
settings.m_szDllLanguage[0] = L'\0';
settings.m_nDefaultIndex = 3;
settings.m_vProfList = { L"保存用", L"鑑賞用", L"使用用" };
settings.m_bDefaultSelect = true;
CDlgProfileMgr::WriteProfSettings( settings );
CDataProfile cProfile;
cProfile.SetWritingMode();
cProfile.SetProfileData(L"Profile", L"szDllLanguage", L"");
cProfile.SetProfileData(L"Profile", L"nDefaultIndex", L"3");
cProfile.SetProfileData(L"Profile", L"nCount", L"3");
cProfile.SetProfileData(L"Profile", L"P[1]", L"保存用");
cProfile.SetProfileData(L"Profile", L"P[2]", L"鑑賞用");
cProfile.SetProfileData(L"Profile", L"P[3]", L"使用用");
cProfile.SetProfileData(L"Profile", L"bDefaultSelect", L"1");
cProfile.WriteProfile(profileMgrIniPath.c_str(), L"Sakura Profile ini");

// プロファイルマネージャー設定にデフォルト定義があればプロファイルは確定する
CCommandLineWrapper cCommandLine;
Expand All @@ -150,12 +155,16 @@ TEST_F( CDlgProfileMgrTest, TrySelectProfile_004 )
TEST_F( CDlgProfileMgrTest, TrySelectProfile_005 )
{
// プロファイル設定を作る
SProfileSettings settings;
settings.m_szDllLanguage[0] = L'\0';
settings.m_nDefaultIndex = 4;
settings.m_vProfList = { L"保存用", L"鑑賞用", L"使用用" };
settings.m_bDefaultSelect = true;
CDlgProfileMgr::WriteProfSettings( settings );
CDataProfile cProfile;
cProfile.SetWritingMode();
cProfile.SetProfileData(L"Profile", L"szDllLanguage", L"");
cProfile.SetProfileData(L"Profile", L"nDefaultIndex", L"4");
cProfile.SetProfileData(L"Profile", L"nCount", L"3");
cProfile.SetProfileData(L"Profile", L"P[1]", L"保存用");
cProfile.SetProfileData(L"Profile", L"P[2]", L"鑑賞用");
cProfile.SetProfileData(L"Profile", L"P[3]", L"使用用");
cProfile.SetProfileData(L"Profile", L"bDefaultSelect", L"1");
cProfile.WriteProfile(profileMgrIniPath.c_str(), L"Sakura Profile ini");

// プロファイルマネージャー設定のデフォルト定義がおかしればプロファイルは確定しない
CCommandLineWrapper cCommandLine;
Expand All @@ -168,11 +177,12 @@ TEST_F( CDlgProfileMgrTest, TrySelectProfile_005 )
TEST_F( CDlgProfileMgrTest, TrySelectProfile_006 )
{
// 空のプロファイル設定を作る
SProfileSettings settings;
settings.m_szDllLanguage[0] = L'\0';
settings.m_nDefaultIndex = -1;
settings.m_bDefaultSelect = false;
CDlgProfileMgr::WriteProfSettings( settings );
CDataProfile cProfile;
cProfile.SetWritingMode();
cProfile.SetProfileData(L"Profile", L"szDllLanguage", L"");
cProfile.SetProfileData(L"Profile", L"nDefaultIndex", L"-1");
cProfile.SetProfileData(L"Profile", L"bDefaultSelect", L"0");
cProfile.WriteProfile(profileMgrIniPath.c_str(), L"Sakura Profile ini");

// プロファイルマネージャー設定が空定義ならプロファイルは確定しない
CCommandLineWrapper cCommandLine;
Expand Down
Loading

0 comments on commit 385ec24

Please sign in to comment.