build(tgbot-gen): Changes and additions required to generate the API client with auth (cookie)
I use a standard set of templates, changes are made in api-header.mustache and api-source.mustache. Their _old versions contain the originals. Additions are necessary for the header argument in the generated functions so that you can authenticate using cookies.
This commit is contained in:
parent
ba4dfec459
commit
20cf8b1fc2
32 changed files with 4213 additions and 0 deletions
|
|
@ -0,0 +1,653 @@
|
|||
{{>licenseInfo}}
|
||||
#include "{{packageName}}/ModelBase.h"
|
||||
|
||||
{{#modelNamespaceDeclarations}}
|
||||
namespace {{this}} {
|
||||
{{/modelNamespaceDeclarations}}
|
||||
|
||||
ModelBase::ModelBase(): m_IsSet(false)
|
||||
{
|
||||
}
|
||||
ModelBase::~ModelBase()
|
||||
{
|
||||
}
|
||||
bool ModelBase::isSet() const
|
||||
{
|
||||
return m_IsSet;
|
||||
}
|
||||
utility::string_t ModelBase::toString( const bool val )
|
||||
{
|
||||
utility::stringstream_t ss;
|
||||
ss << val;
|
||||
return utility::string_t(ss.str());
|
||||
}
|
||||
utility::string_t ModelBase::toString( const float val )
|
||||
{
|
||||
utility::stringstream_t ss;
|
||||
ss << val;
|
||||
return utility::string_t(ss.str());
|
||||
}
|
||||
utility::string_t ModelBase::toString( const double val )
|
||||
{
|
||||
utility::stringstream_t ss;
|
||||
ss << val;
|
||||
return utility::string_t(ss.str());
|
||||
}
|
||||
utility::string_t ModelBase::toString( const int32_t val )
|
||||
{
|
||||
utility::stringstream_t ss;
|
||||
ss << val;
|
||||
return utility::string_t(ss.str());
|
||||
}
|
||||
utility::string_t ModelBase::toString( const int64_t val )
|
||||
{
|
||||
utility::stringstream_t ss;
|
||||
ss << val;
|
||||
return utility::string_t(ss.str());
|
||||
}
|
||||
utility::string_t ModelBase::toString (const utility::string_t &val )
|
||||
{
|
||||
utility::stringstream_t ss;
|
||||
ss << val;
|
||||
return utility::string_t(ss.str());
|
||||
}
|
||||
utility::string_t ModelBase::toString( const utility::datetime &val )
|
||||
{
|
||||
return val.to_string(utility::datetime::ISO_8601);
|
||||
}
|
||||
utility::string_t ModelBase::toString( const web::json::value &val )
|
||||
{
|
||||
return val.serialize();
|
||||
}
|
||||
utility::string_t ModelBase::toString( const std::shared_ptr<HttpContent>& val )
|
||||
{
|
||||
utility::stringstream_t ss;
|
||||
if( val != nullptr )
|
||||
{
|
||||
ss << val->getData();
|
||||
}
|
||||
return utility::string_t(ss.str());
|
||||
}
|
||||
web::json::value ModelBase::toJson(bool value)
|
||||
{
|
||||
return web::json::value::boolean(value);
|
||||
}
|
||||
web::json::value ModelBase::toJson( float value )
|
||||
{
|
||||
return web::json::value::number(value);
|
||||
}
|
||||
web::json::value ModelBase::toJson( double value )
|
||||
{
|
||||
return web::json::value::number(value);
|
||||
}
|
||||
web::json::value ModelBase::toJson( int32_t value )
|
||||
{
|
||||
return web::json::value::number(value);
|
||||
}
|
||||
web::json::value ModelBase::toJson( int64_t value )
|
||||
{
|
||||
return web::json::value::number(value);
|
||||
}
|
||||
web::json::value ModelBase::toJson( const utility::string_t& value )
|
||||
{
|
||||
return web::json::value::string(value);
|
||||
}
|
||||
web::json::value ModelBase::toJson( const utility::datetime& value )
|
||||
{
|
||||
return web::json::value::string(value.to_string(utility::datetime::ISO_8601));
|
||||
}
|
||||
web::json::value ModelBase::toJson( const web::json::value& value )
|
||||
{
|
||||
return value;
|
||||
}
|
||||
web::json::value ModelBase::toJson( const std::shared_ptr<HttpContent>& content )
|
||||
{
|
||||
web::json::value value;
|
||||
if(content != nullptr)
|
||||
{
|
||||
value[utility::conversions::to_string_t("ContentDisposition")] = ModelBase::toJson(content->getContentDisposition());
|
||||
value[utility::conversions::to_string_t("ContentType")] = ModelBase::toJson(content->getContentType());
|
||||
value[utility::conversions::to_string_t("FileName")] = ModelBase::toJson(content->getFileName());
|
||||
value[utility::conversions::to_string_t("InputStream")] = web::json::value::string( ModelBase::toBase64(content->getData()) );
|
||||
}
|
||||
return value;
|
||||
}
|
||||
web::json::value ModelBase::toJson( const std::shared_ptr<utility::datetime>& val )
|
||||
{
|
||||
web::json::value retVal;
|
||||
if(val != nullptr)
|
||||
{
|
||||
retVal = toJson(*val);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, bool &outVal )
|
||||
{
|
||||
utility::stringstream_t ss(val);
|
||||
bool success = true;
|
||||
try
|
||||
{
|
||||
ss >> outVal;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
success = false;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, float &outVal )
|
||||
{
|
||||
utility::stringstream_t ss(val);
|
||||
bool success = true;
|
||||
try
|
||||
{
|
||||
ss >> outVal;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
int64_t intVal = 0;
|
||||
success = ModelBase::fromString(val, intVal);
|
||||
if(success)
|
||||
{
|
||||
outVal = static_cast<float>(intVal);
|
||||
}
|
||||
}
|
||||
return success;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, double &outVal )
|
||||
{
|
||||
utility::stringstream_t ss(val);
|
||||
bool success = true;
|
||||
try
|
||||
{
|
||||
ss >> outVal;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
int64_t intVal = 0;
|
||||
success = ModelBase::fromString(val, intVal);
|
||||
if(success)
|
||||
{
|
||||
outVal = static_cast<double>(intVal);
|
||||
}
|
||||
}
|
||||
return success;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, int32_t &outVal )
|
||||
{
|
||||
utility::stringstream_t ss(val);
|
||||
bool success = true;
|
||||
try
|
||||
{
|
||||
ss >> outVal;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
success = false;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, int64_t &outVal )
|
||||
{
|
||||
utility::stringstream_t ss(val);
|
||||
bool success = true;
|
||||
try
|
||||
{
|
||||
ss >> outVal;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
success = false;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, utility::string_t &outVal )
|
||||
{
|
||||
utility::stringstream_t ss(val);
|
||||
bool success = true;
|
||||
try
|
||||
{
|
||||
ss >> outVal;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
success = false;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, utility::datetime &outVal )
|
||||
{
|
||||
bool success = true;
|
||||
auto dt = utility::datetime::from_string(val, utility::datetime::ISO_8601);
|
||||
if( dt.is_initialized() )
|
||||
{
|
||||
outVal = dt;
|
||||
}
|
||||
else
|
||||
{
|
||||
success = false;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, web::json::value &outVal )
|
||||
{
|
||||
outVal = web::json::value::parse(val);
|
||||
return !outVal.is_null();
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, std::shared_ptr<HttpContent>& outVal )
|
||||
{
|
||||
bool ok = true;
|
||||
if(outVal == nullptr)
|
||||
{
|
||||
outVal = std::shared_ptr<HttpContent>(new HttpContent());
|
||||
}
|
||||
if(outVal != nullptr)
|
||||
{
|
||||
outVal->setData(std::shared_ptr<std::istream>(new std::stringstream(utility::conversions::to_utf8string(val))));
|
||||
}
|
||||
else
|
||||
{
|
||||
ok = false;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
bool ModelBase::fromString( const utility::string_t& val, std::shared_ptr<utility::datetime>& outVal )
|
||||
{
|
||||
bool ok = false;
|
||||
if(outVal == nullptr)
|
||||
{
|
||||
outVal = std::shared_ptr<utility::datetime>(new utility::datetime());
|
||||
}
|
||||
if( outVal != nullptr )
|
||||
{
|
||||
ok = fromJson(web::json::value::parse(val), *outVal);
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, bool & outVal )
|
||||
{
|
||||
outVal = !val.is_boolean() ? false : val.as_bool();
|
||||
return val.is_boolean();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, float & outVal )
|
||||
{
|
||||
outVal = (!val.is_double() && !val.is_integer()) ? std::numeric_limits<float>::quiet_NaN(): static_cast<float>(val.as_double());
|
||||
return val.is_double() || val.is_integer();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, double & outVal )
|
||||
{
|
||||
outVal = (!val.is_double() && !val.is_integer()) ? std::numeric_limits<double>::quiet_NaN(): val.as_double();
|
||||
return val.is_double() || val.is_integer();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, int32_t & outVal )
|
||||
{
|
||||
outVal = !val.is_integer() ? std::numeric_limits<int32_t>::quiet_NaN() : val.as_integer();
|
||||
return val.is_integer();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, int64_t & outVal )
|
||||
{
|
||||
outVal = !val.is_number() ? std::numeric_limits<int64_t>::quiet_NaN() : val.as_number().to_int64();
|
||||
return val.is_number();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, utility::string_t & outVal )
|
||||
{
|
||||
outVal = val.is_string() ? val.as_string() : utility::conversions::to_string_t("");
|
||||
return val.is_string();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, utility::datetime & outVal )
|
||||
{
|
||||
outVal = val.is_null() ? utility::datetime::from_string(utility::conversions::to_string_t("NULL"), utility::datetime::ISO_8601) : utility::datetime::from_string(val.as_string(), utility::datetime::ISO_8601);
|
||||
return outVal.is_initialized();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, web::json::value & outVal )
|
||||
{
|
||||
outVal = val;
|
||||
return !val.is_null();
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, std::shared_ptr<HttpContent>& content )
|
||||
{
|
||||
bool result = false;
|
||||
if( content != nullptr)
|
||||
{
|
||||
result = true;
|
||||
if(content == nullptr)
|
||||
{
|
||||
content = std::shared_ptr<HttpContent>(new HttpContent());
|
||||
}
|
||||
if(val.has_field(utility::conversions::to_string_t("ContentDisposition")))
|
||||
{
|
||||
utility::string_t value;
|
||||
result = result && ModelBase::fromJson(val.at(utility::conversions::to_string_t("ContentDisposition")), value);
|
||||
content->setContentDisposition( value );
|
||||
}
|
||||
if(val.has_field(utility::conversions::to_string_t("ContentType")))
|
||||
{
|
||||
utility::string_t value;
|
||||
result = result && ModelBase::fromJson(val.at(utility::conversions::to_string_t("ContentType")), value);
|
||||
content->setContentType( value );
|
||||
}
|
||||
if(val.has_field(utility::conversions::to_string_t("FileName")))
|
||||
{
|
||||
utility::string_t value;
|
||||
result = result && ModelBase::fromJson(val.at(utility::conversions::to_string_t("FileName")), value);
|
||||
content->setFileName( value );
|
||||
}
|
||||
if(val.has_field(utility::conversions::to_string_t("InputStream")))
|
||||
{
|
||||
utility::string_t value;
|
||||
result = result && ModelBase::fromJson(val.at(utility::conversions::to_string_t("InputStream")), value);
|
||||
content->setData( ModelBase::fromBase64( value ) );
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
bool ModelBase::fromJson( const web::json::value& val, std::shared_ptr<utility::datetime> &outVal )
|
||||
{
|
||||
bool ok = false;
|
||||
if(outVal == nullptr)
|
||||
{
|
||||
outVal = std::shared_ptr<utility::datetime>(new utility::datetime());
|
||||
}
|
||||
if( outVal != nullptr )
|
||||
{
|
||||
ok = fromJson(val, *outVal);
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, bool value, const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
std::stringstream* valueAsStringStream = new std::stringstream();
|
||||
(*valueAsStringStream) << value;
|
||||
content->setData( std::shared_ptr<std::istream>( valueAsStringStream ) );
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, float value, const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
std::stringstream* valueAsStringStream = new std::stringstream();
|
||||
(*valueAsStringStream) << value;
|
||||
content->setData( std::shared_ptr<std::istream>( valueAsStringStream ) );
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, double value, const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
std::stringstream* valueAsStringStream = new std::stringstream();
|
||||
(*valueAsStringStream) << value;
|
||||
content->setData( std::shared_ptr<std::istream>( valueAsStringStream ) );
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, int32_t value, const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
std::stringstream* valueAsStringStream = new std::stringstream();
|
||||
(*valueAsStringStream) << value;
|
||||
content->setData( std::shared_ptr<std::istream>( valueAsStringStream ) );
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, int64_t value, const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
std::stringstream* valueAsStringStream = new std::stringstream();
|
||||
(*valueAsStringStream) << value;
|
||||
content->setData( std::shared_ptr<std::istream>( valueAsStringStream) ) ;
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, const utility::string_t& value, const utility::string_t& contentType)
|
||||
{
|
||||
std::shared_ptr<HttpContent> content(new HttpContent);
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
content->setData( std::shared_ptr<std::istream>( new std::stringstream( utility::conversions::to_utf8string(value) ) ) );
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, const utility::datetime& value, const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
content->setData( std::shared_ptr<std::istream>( new std::stringstream( utility::conversions::to_utf8string(value.to_string(utility::datetime::ISO_8601) ) ) ) );
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, const web::json::value& value, const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
content->setData( std::shared_ptr<std::istream>( new std::stringstream( utility::conversions::to_utf8string(value.serialize()) ) ) );
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent( const utility::string_t& name, const std::shared_ptr<HttpContent>& value )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
if( value != nullptr )
|
||||
{
|
||||
content->setName( name );
|
||||
content->setContentDisposition( value->getContentDisposition() );
|
||||
content->setContentType( value->getContentType() );
|
||||
content->setData( value->getData() );
|
||||
content->setFileName( value->getFileName() );
|
||||
}
|
||||
return content;
|
||||
}
|
||||
std::shared_ptr<HttpContent> ModelBase::toHttpContent(const utility::string_t& name, const std::shared_ptr<utility::datetime>& value , const utility::string_t& contentType )
|
||||
{
|
||||
std::shared_ptr<HttpContent> content( new HttpContent );
|
||||
if (value != nullptr )
|
||||
{
|
||||
content->setName( name );
|
||||
content->setContentDisposition( utility::conversions::to_string_t("form-data") );
|
||||
content->setContentType( contentType );
|
||||
content->setData( std::shared_ptr<std::istream>( new std::stringstream( utility::conversions::to_utf8string( toJson(*value).serialize() ) ) ) );
|
||||
}
|
||||
return content;
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, bool & outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
return fromString(str, outVal);
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, float & outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
return fromString(str, outVal);
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, double & outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
return fromString(str, outVal);
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, int32_t & outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
return fromString(str, outVal);
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, int64_t & outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
return fromString(str, outVal);
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, utility::string_t & outVal )
|
||||
{
|
||||
if( val == nullptr ) return false;
|
||||
std::shared_ptr<std::istream> data = val->getData();
|
||||
data->seekg( 0, data->beg );
|
||||
|
||||
std::string str((std::istreambuf_iterator<char>(*data.get())),
|
||||
std::istreambuf_iterator<char>());
|
||||
outVal = utility::conversions::to_string_t(str);
|
||||
return true;
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, utility::datetime & outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
outVal = utility::datetime::from_string(str, utility::datetime::ISO_8601);
|
||||
return true;
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, web::json::value & outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
return fromString(str, outVal);
|
||||
}
|
||||
bool ModelBase::fromHttpContent(std::shared_ptr<HttpContent> val, std::shared_ptr<HttpContent>& outVal )
|
||||
{
|
||||
utility::string_t str;
|
||||
if( val == nullptr ) return false;
|
||||
if( outVal == nullptr )
|
||||
{
|
||||
outVal = std::shared_ptr<HttpContent>(new HttpContent());
|
||||
}
|
||||
ModelBase::fromHttpContent(val, str);
|
||||
return fromString(str, outVal);
|
||||
}
|
||||
// base64 encoding/decoding based on : https://en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/Base64#C.2B.2B
|
||||
const static char Base64Chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
const static char Base64PadChar = '=';
|
||||
utility::string_t ModelBase::toBase64( utility::string_t value )
|
||||
{
|
||||
std::shared_ptr<std::istream> source( new std::stringstream( utility::conversions::to_utf8string(value) ) );
|
||||
return ModelBase::toBase64(source);
|
||||
}
|
||||
utility::string_t ModelBase::toBase64( std::shared_ptr<std::istream> value )
|
||||
{
|
||||
value->seekg( 0, value->end );
|
||||
size_t length = value->tellg();
|
||||
value->seekg( 0, value->beg );
|
||||
utility::string_t base64;
|
||||
base64.reserve( ((length / 3) + (length % 3 > 0)) * 4 );
|
||||
char read[3] = { 0 };
|
||||
uint32_t temp;
|
||||
for ( size_t idx = 0; idx < length / 3; idx++ )
|
||||
{
|
||||
value->read( read, 3 );
|
||||
temp = (read[0]) << 16;
|
||||
temp += (read[1]) << 8;
|
||||
temp += (read[2]);
|
||||
base64.append( 1, Base64Chars[(temp & 0x00FC0000) >> 18] );
|
||||
base64.append( 1, Base64Chars[(temp & 0x0003F000) >> 12] );
|
||||
base64.append( 1, Base64Chars[(temp & 0x00000FC0) >> 6] );
|
||||
base64.append( 1, Base64Chars[(temp & 0x0000003F)] );
|
||||
}
|
||||
switch ( length % 3 )
|
||||
{
|
||||
case 1:
|
||||
value->read( read, 1 );
|
||||
temp = read[0] << 16;
|
||||
base64.append( 1, Base64Chars[(temp & 0x00FC0000) >> 18] );
|
||||
base64.append( 1, Base64Chars[(temp & 0x0003F000) >> 12] );
|
||||
base64.append( 2, Base64PadChar );
|
||||
break;
|
||||
case 2:
|
||||
value->read( read, 2 );
|
||||
temp = read[0] << 16;
|
||||
temp += read[1] << 8;
|
||||
base64.append( 1, Base64Chars[(temp & 0x00FC0000) >> 18] );
|
||||
base64.append( 1, Base64Chars[(temp & 0x0003F000) >> 12] );
|
||||
base64.append( 1, Base64Chars[(temp & 0x00000FC0) >> 6] );
|
||||
base64.append( 1, Base64PadChar );
|
||||
break;
|
||||
}
|
||||
return base64;
|
||||
}
|
||||
std::shared_ptr<std::istream> ModelBase::fromBase64( const utility::string_t& encoded )
|
||||
{
|
||||
std::shared_ptr<std::stringstream> result(new std::stringstream);
|
||||
|
||||
char outBuf[3] = { 0 };
|
||||
uint32_t temp = 0;
|
||||
|
||||
utility::string_t::const_iterator cursor = encoded.begin();
|
||||
while ( cursor < encoded.end() )
|
||||
{
|
||||
for ( size_t quantumPosition = 0; quantumPosition < 4; quantumPosition++ )
|
||||
{
|
||||
temp <<= 6;
|
||||
if ( *cursor >= 0x41 && *cursor <= 0x5A )
|
||||
{
|
||||
temp |= *cursor - 0x41;
|
||||
}
|
||||
else if ( *cursor >= 0x61 && *cursor <= 0x7A )
|
||||
{
|
||||
temp |= *cursor - 0x47;
|
||||
}
|
||||
else if ( *cursor >= 0x30 && *cursor <= 0x39 )
|
||||
{
|
||||
temp |= *cursor + 0x04;
|
||||
}
|
||||
else if ( *cursor == 0x2B )
|
||||
{
|
||||
temp |= 0x3E; //change to 0x2D for URL alphabet
|
||||
}
|
||||
else if ( *cursor == 0x2F )
|
||||
{
|
||||
temp |= 0x3F; //change to 0x5F for URL alphabet
|
||||
}
|
||||
else if ( *cursor == Base64PadChar ) //pad
|
||||
{
|
||||
switch ( encoded.end() - cursor )
|
||||
{
|
||||
case 1: //One pad character
|
||||
outBuf[0] = (temp >> 16) & 0x000000FF;
|
||||
outBuf[1] = (temp >> 8) & 0x000000FF;
|
||||
result->write( outBuf, 2 );
|
||||
return result;
|
||||
case 2: //Two pad characters
|
||||
outBuf[0] = (temp >> 10) & 0x000000FF;
|
||||
result->write( outBuf, 1 );
|
||||
return result;
|
||||
default:
|
||||
throw web::json::json_exception( utility::conversions::to_string_t( "Invalid Padding in Base 64!" ).c_str() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw web::json::json_exception( utility::conversions::to_string_t( "Non-Valid Character in Base 64!" ).c_str() );
|
||||
}
|
||||
++cursor;
|
||||
}
|
||||
|
||||
outBuf[0] = (temp >> 16) & 0x000000FF;
|
||||
outBuf[1] = (temp >> 8) & 0x000000FF;
|
||||
outBuf[2] = (temp) & 0x000000FF;
|
||||
result->write( outBuf, 3 );
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
{{#modelNamespaceDeclarations}}
|
||||
}
|
||||
{{/modelNamespaceDeclarations}}
|
||||
Loading…
Add table
Add a link
Reference in a new issue