Skip to content

Commit

Permalink
proj file support for custom spacing & encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
jjallaire committed Aug 9, 2011
1 parent 6fc6b19 commit 7ecf696
Show file tree
Hide file tree
Showing 11 changed files with 393 additions and 34 deletions.
165 changes: 163 additions & 2 deletions src/cpp/core/include/core/json/JsonRpc.hpp
Expand Up @@ -312,7 +312,28 @@ core::Error readObject(const json::Object& object,

return Success() ;
}


template <typename T>
core::Error readObject(const json::Object& object,
const std::string& name,
const T& defaultValue,
T* pValue)
{
json::Object::const_iterator it = object.find(name) ;
if (it == object.end())
{
*pValue = defaultValue;
return Success();
}

if (!isType<T>(it->second))
return Error(errc::ParamTypeMismatch, ERROR_LOCATION) ;

*pValue = it->second.get_value<T>() ;

return Success() ;
}

template <typename T>
core::Error readObjectParam(const json::Array& params,
unsigned int index,
Expand Down Expand Up @@ -419,7 +440,147 @@ core::Error readObjectParam(const json::Array& params,
name4, pValue4);
}



template <typename T1, typename T2, typename T3, typename T4, typename T5>
core::Error readObject(const json::Object& object,
const std::string& name1, T1* pValue1,
const std::string& name2, T2* pValue2,
const std::string& name3, T3* pValue3,
const std::string& name4, T4* pValue4,
const std::string& name5, T5* pValue5)
{
Error error = readObject(object,
name1, pValue1,
name2, pValue2,
name3, pValue3,
name4, pValue4);
if (error)
return error;

return readObject(object, name5, pValue5);
}

template <typename T1, typename T2, typename T3, typename T4, typename T5>
core::Error readObjectParam(const json::Array& params,
unsigned int index,
const std::string& name1, T1* pValue1,
const std::string& name2, T2* pValue2,
const std::string& name3, T3* pValue3,
const std::string& name4, T4* pValue4,
const std::string& name5, T5* pValue5)
{
json::Object object;
Error error = json::readParam(params, index, &object);
if (error)
return error;

return readObject(object,
name1, pValue1,
name2, pValue2,
name3, pValue3,
name4, pValue4,
name5, pValue5);
}


template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
core::Error readObject(const json::Object& object,
const std::string& name1, T1* pValue1,
const std::string& name2, T2* pValue2,
const std::string& name3, T3* pValue3,
const std::string& name4, T4* pValue4,
const std::string& name5, T5* pValue5,
const std::string& name6, T6* pValue6)
{
Error error = readObject(object,
name1, pValue1,
name2, pValue2,
name3, pValue3,
name4, pValue4,
name5, pValue5);
if (error)
return error;

return readObject(object, name6, pValue6);
}


template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
core::Error readObjectParam(const json::Array& params,
unsigned int index,
const std::string& name1, T1* pValue1,
const std::string& name2, T2* pValue2,
const std::string& name3, T3* pValue3,
const std::string& name4, T4* pValue4,
const std::string& name5, T5* pValue5,
const std::string& name6, T6* pValue6)
{
json::Object object;
Error error = json::readParam(params, index, &object);
if (error)
return error;

return readObject(object,
name1, pValue1,
name2, pValue2,
name3, pValue3,
name4, pValue4,
name5, pValue5,
name6, pValue6);
}


template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
core::Error readObject(const json::Object& object,
const std::string& name1, T1* pValue1,
const std::string& name2, T2* pValue2,
const std::string& name3, T3* pValue3,
const std::string& name4, T4* pValue4,
const std::string& name5, T5* pValue5,
const std::string& name6, T6* pValue6,
const std::string& name7, T7* pValue7)
{
Error error = readObject(object,
name1, pValue1,
name2, pValue2,
name3, pValue3,
name4, pValue4,
name5, pValue5,
name6, pValue6);
if (error)
return error;

return readObject(object, name7, pValue7);
}

template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
core::Error readObjectParam(const json::Array& params,
unsigned int index,
const std::string& name1, T1* pValue1,
const std::string& name2, T2* pValue2,
const std::string& name3, T3* pValue3,
const std::string& name4, T4* pValue4,
const std::string& name5, T5* pValue5,
const std::string& name6, T6* pValue6,
const std::string& name7, T7* pValue7)
{
json::Object object;
Error error = json::readParam(params, index, &object);
if (error)
return error;

return readObject(object,
name1, pValue1,
name2, pValue2,
name3, pValue3,
name4, pValue4,
name5, pValue5,
name6, pValue6,
name7, pValue7);
}



// json rpc response

class JsonRpcResponse
Expand Down
10 changes: 9 additions & 1 deletion src/cpp/core/include/core/r_util/RProjectFile.hpp
Expand Up @@ -40,19 +40,27 @@ struct RProjectConfig
: version(1.0),
saveWorkspace(DefaultValue),
restoreWorkspace(DefaultValue),
alwaysSaveHistory(DefaultValue)
alwaysSaveHistory(DefaultValue),
useSpacesForTab(true),
numSpacesForTab(2),
encoding()
{
}

double version;
int saveWorkspace;
int restoreWorkspace;
int alwaysSaveHistory;
bool useSpacesForTab;
int numSpacesForTab;
std::string encoding;
};


Error readProjectFile(const FilePath& projectFilePath,
const RProjectConfig& defaultConfig,
RProjectConfig* pConfig,
bool* pProvidedDefaults,
std::string* pUserErrMsg);

Error writeProjectFile(const FilePath& projectFilePath,
Expand Down
112 changes: 104 additions & 8 deletions src/cpp/core/r_util/RProjectFile.cpp
Expand Up @@ -76,6 +76,48 @@ bool interpretYesNoAskValue(const std::string& value,
}
}

std::string boolValueToString(bool value)
{
if (value)
return "Yes";
else
return "No";
}

bool interpretBoolValue(const std::string& value, bool* pValue)
{
std::string valueLower = string_utils::toLower(value);
boost::algorithm::trim(valueLower);
if (valueLower == "yes")
{
*pValue = true;
return true;
}
else if (valueLower == "no")
{
*pValue = false;
return true;
}
else
{
return false;
}
}


bool interpretIntValue(const std::string& value, int* pValue)
{
try
{
*pValue = boost::lexical_cast<int>(value);
return true;
}
catch(const boost::bad_lexical_cast& e)
{
return false;
}
}

} // anonymous namespace

std::ostream& operator << (std::ostream& stream, const YesNoAskValue& val)
Expand All @@ -102,9 +144,14 @@ std::ostream& operator << (std::ostream& stream, const YesNoAskValue& val)


Error readProjectFile(const FilePath& projectFilePath,
const RProjectConfig& defaultConfig,
RProjectConfig* pConfig,
bool* pProvidedDefaults,
std::string* pUserErrMsg)
{
// default to not providing defaults
*pProvidedDefaults = false;

// first read the project DCF file
typedef std::map<std::string,std::string> Fields;
Fields dcfFields;
Expand Down Expand Up @@ -144,7 +191,7 @@ Error readProjectFile(const FilePath& projectFilePath,
ERROR_LOCATION);
}

// extract restore workspace (optional)
// extract restore workspace
it = dcfFields.find("RestoreWorkspace");
if (it != dcfFields.end())
{
Expand All @@ -153,10 +200,11 @@ Error readProjectFile(const FilePath& projectFilePath,
}
else
{
pConfig->restoreWorkspace = DefaultValue;
pConfig->restoreWorkspace = defaultConfig.restoreWorkspace;
*pProvidedDefaults = true;
}

// extract save workspace (optional)
// extract save workspace
it = dcfFields.find("SaveWorkspace");
if (it != dcfFields.end())
{
Expand All @@ -165,10 +213,11 @@ Error readProjectFile(const FilePath& projectFilePath,
}
else
{
pConfig->saveWorkspace = DefaultValue;
pConfig->saveWorkspace = defaultConfig.saveWorkspace;
*pProvidedDefaults = true;
}

// extract always save history (optional)
// extract always save history
it = dcfFields.find("AlwaysSaveHistory");
if (it != dcfFields.end())
{
Expand All @@ -177,7 +226,46 @@ Error readProjectFile(const FilePath& projectFilePath,
}
else
{
pConfig->alwaysSaveHistory = DefaultValue;
pConfig->alwaysSaveHistory = defaultConfig.alwaysSaveHistory;
*pProvidedDefaults = true;
}

// extract spaces for tab
it = dcfFields.find("UseSpacesForTab");
if (it != dcfFields.end())
{
if (!interpretBoolValue(it->second, &(pConfig->useSpacesForTab)))
return requiredFieldError("UseSpacesForTab", pUserErrMsg);
}
else
{
pConfig->useSpacesForTab = defaultConfig.useSpacesForTab;
*pProvidedDefaults = true;
}

// extract num spaces for tab
it = dcfFields.find("NumSpacesForTab");
if (it != dcfFields.end())
{
if (!interpretIntValue(it->second, &(pConfig->numSpacesForTab)))
return requiredFieldError("NumSpacesForTab", pUserErrMsg);
}
else
{
pConfig->numSpacesForTab = defaultConfig.numSpacesForTab;
*pProvidedDefaults = true;
}

// extract encoding
it = dcfFields.find("Encoding");
if (it != dcfFields.end())
{
pConfig->encoding = it->second;
}
else
{
pConfig->encoding = defaultConfig.encoding;
*pProvidedDefaults = true;
}

return Success();
Expand All @@ -193,13 +281,21 @@ Error writeProjectFile(const FilePath& projectFilePath,
"\n"
"RestoreWorkspace: %2%\n"
"SaveWorkspace: %3%\n"
"AlwaysSaveHistory: %4%\n");
"AlwaysSaveHistory: %4%\n"
"\n"
"UseSpacesForTab: %5%\n"
"NumSpacesForTab: %6%\n"
"\n"
"Encoding: %7%\n");

std::string contents = boost::str(fmt %
boost::io::group(std::fixed, std::setprecision(1), config.version) %
yesNoAskValueToString(config.restoreWorkspace) %
yesNoAskValueToString(config.saveWorkspace) %
yesNoAskValueToString(config.alwaysSaveHistory));
yesNoAskValueToString(config.alwaysSaveHistory) %
boolValueToString(config.useSpacesForTab) %
config.numSpacesForTab %
config.encoding);

// write it
return writeStringToFile(projectFilePath,
Expand Down

0 comments on commit 7ecf696

Please sign in to comment.