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
|