100 lines
3.7 KiB
Text
100 lines
3.7 KiB
Text
//+------------------------------------------------------------------+
|
|
//| Main.mqh |
|
|
//| Copyright 2026, Niquel Mendoza. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2026, Niquel Mendoza."
|
|
#property link "https://www.mql5.com"
|
|
#property strict
|
|
|
|
#ifndef MQLARTICLES_UTILS_BUFFERBUILD_MAIN_MQH
|
|
#define MQLARTICLES_UTILS_BUFFERBUILD_MAIN_MQH
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include "UrlEncode\\Main.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
namespace TSN
|
|
{
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
// Esta clase noramlte se usara con web requeset.. para evita concatener string
|
|
// cuando se arma los datos.. es como un builder general...
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#define MQLART_BUFFER_INCREASE(req) \
|
|
if((req) >= m_r) \
|
|
{ \
|
|
m_r += (req) + 128; \
|
|
ArrayResize(m_raw, m_r, m_r); \
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
struct CBufferBuild
|
|
{
|
|
public:
|
|
CBufferBuild(int reserve) : m_s(0), m_r(reserve) { ArrayResize(m_raw, reserve, reserve); }
|
|
CBufferBuild() : m_s(0), m_r(0) {}
|
|
|
|
//---
|
|
int m_s;
|
|
int m_r;
|
|
uchar m_raw[];
|
|
|
|
//---
|
|
// Escribe decodificando con URL Encode
|
|
// retorna i (posicion leida en str)
|
|
void WriteUrlEncode(const string& str, int len = WHOLE_ARRAY);
|
|
|
|
//---
|
|
// Escribe tal cual un CharArrayToString
|
|
void WriteRaw(const string& str, uint cp = CP_UTF8);
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CBufferBuild::WriteRaw(const string &str, uint cp = CP_UTF8)
|
|
{
|
|
//---
|
|
const int l = StringLen(str);
|
|
const int max_bytes = (l << 2) + 1;
|
|
MQLART_BUFFER_INCREASE(max_bytes)
|
|
|
|
//---
|
|
int written = StringToCharArray(str, m_raw, m_s, WHOLE_ARRAY, cp);
|
|
if(written > 0 && m_raw[m_s + written - 1] == 0)
|
|
written--;
|
|
|
|
//---
|
|
m_s += written;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CBufferBuild::WriteUrlEncode(const string &str, int len = WHOLE_ARRAY)
|
|
{
|
|
//---
|
|
if(len == WHOLE_ARRAY)
|
|
len = StringLen(str);
|
|
|
|
//---
|
|
const int req = (len << 3) + len; // *9
|
|
MQLART_BUFFER_INCREASE(req)
|
|
|
|
//---
|
|
CUrlEncode::UrlEncode(str, len, m_raw, m_s);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
#endif // MQLARTICLES_UTILS_BUFFERBUILD_MAIN_MQH
|