diff options
Diffstat (limited to 'protocols/Tox/src/tox_address.h')
-rw-r--r-- | protocols/Tox/src/tox_address.h | 118 |
1 files changed, 38 insertions, 80 deletions
diff --git a/protocols/Tox/src/tox_address.h b/protocols/Tox/src/tox_address.h index 2688118fe2..9ef57caba2 100644 --- a/protocols/Tox/src/tox_address.h +++ b/protocols/Tox/src/tox_address.h @@ -7,115 +7,73 @@ class ToxBinAddress; class ToxHexAddress
{
private:
- std::string hexData;
+ size_t hexSize;
+ char *hexData;
void Init(const char *hex, size_t size)
{
- hexData = std::string(hex, size);
+ hexSize = size;
+ hexData = (char*)mir_calloc(hexSize + 1);
+ memcpy(hexData, hex, hexSize);
}
void Init(const uint8_t *bin, size_t size)
{
- char *hex = (char*)mir_alloc(size * 2 + 1);
- hexData = bin2hex(bin, size, hex);
- std::transform(hexData.begin(), hexData.end(), hexData.begin(), ::toupper);
- mir_free(hex);
+ hexSize = size * 2;
+ hexData = (char*)mir_calloc(hexSize + 1);
+ char *p = bin2hex(bin, size, hexData);
+ while (*p++ = toupper(*p));
}
public:
- ToxHexAddress(const ToxHexAddress &address) : hexData(address.hexData) { }
- ToxHexAddress(const char *hex, size_t size = TOX_ADDRESS_SIZE * 2) : hexData(hex, hex + size) { }
- ToxHexAddress(const std::string &hex)
- {
- Init(hex.c_str(), hex.size());
- }
- ToxHexAddress(const uint8_t *bin, size_t size = TOX_ADDRESS_SIZE)
- {
- Init(bin, size);
- }
- ToxHexAddress(const std::vector<uint8_t> &bin)
- {
- Init(bin.data(), bin.size());
- }
+ ToxHexAddress(const char *hex, size_t size = TOX_ADDRESS_SIZE * 2) { Init(hex, size); }
+ ToxHexAddress(const std::string &hex) { Init(hex.c_str(), hex.size()); }
+ ToxHexAddress(const uint8_t *bin, size_t size = TOX_ADDRESS_SIZE) { Init(bin, size); }
+ ToxHexAddress(const ToxHexAddress &address) : hexData(address.hexData) { Init(address.hexData, address.hexSize); }
+ ~ToxHexAddress() { if (hexData) mir_free(hexData); }
ToxHexAddress& operator=(const char *hex)
{
Init(hex, mir_strlen(hex));
return *this;
}
- const size_t GetLength() const
- {
- return hexData.length();
- }
- const bool IsEmpty() const
- {
- return hexData.empty();
- }
- const ToxHexAddress GetPubKey() const
- {
- ToxHexAddress pubKey = hexData.substr(0, TOX_PUBLIC_KEY_SIZE * 2).c_str();
- return pubKey;
- }
- operator const char*() const
- {
- return hexData.c_str();
- }
- static ToxHexAddress Empty()
- {
- return ToxHexAddress("", 0);
- }
+ const size_t GetLength() const { return hexSize; }
+ const bool IsEmpty() const { return hexData[0] == 0; }
+ const ToxHexAddress GetPubKey() const { return ToxHexAddress(hexData, TOX_PUBLIC_KEY_SIZE * 2); }
+ operator const char*() const { return hexData; }
+ static ToxHexAddress Empty() { return ToxHexAddress("", 0); }
ToxBinAddress ToBin() const;
};
class ToxBinAddress
{
private:
- std::vector<uint8_t> binData;
+ size_t binSize;
+ uint8_t *binData;
void Init(const char *hex, size_t size)
{
- char *endptr;
- const char *pos = hex;
- size /= 2; binData.resize(size);
- for (size_t i = 0; i < size; i++)
- {
- char buf[5] = { '0', 'x', pos[0], pos[1], 0 };
- binData[i] = (uint8_t)strtol(buf, &endptr, 0);
- pos += 2;
- }
+ binSize = size / 2;
+ binData = (uint8_t*)mir_alloc(binSize);
+ hex2bin(hex, binData, binSize);
}
-public:
- ToxBinAddress(const ToxBinAddress &address) : binData(address.binData) { }
- ToxBinAddress(const uint8_t *bin, size_t size = TOX_ADDRESS_SIZE) : binData(bin, bin + size) { }
- ToxBinAddress(const std::vector<uint8_t> &bin, size_t size = TOX_ADDRESS_SIZE) : binData(bin.begin(), bin.begin() + size) { }
- ToxBinAddress(const char *hex, size_t size = TOX_ADDRESS_SIZE * 2)
- {
- Init(hex, size);
- }
- ToxBinAddress(const std::string &hex)
+ void Init(const uint8_t *bin, size_t size)
{
- Init(hex.c_str(), hex.size());
+ binSize = size;
+ binData = (uint8_t*)mir_alloc(binSize);
+ memcpy(binData, bin, binSize);
}
+public:
+ ToxBinAddress(const uint8_t *bin, size_t size = TOX_ADDRESS_SIZE) { Init(bin, size); }
+ ToxBinAddress(const char *hex, size_t size = TOX_ADDRESS_SIZE * 2) { Init(hex, size); }
+ ToxBinAddress(const std::string &hex) { Init(hex.c_str(), hex.size()); }
+ ToxBinAddress(const ToxBinAddress &address) { Init(address.binData, address.binSize); }
+ ~ToxBinAddress() { if (binData) mir_free(binData); }
ToxBinAddress& operator=(const char *hex)
{
Init(hex, mir_strlen(hex));
return *this;
}
- const ToxBinAddress GetPubKey() const
- {
- ToxBinAddress pubKey(binData.data(), TOX_PUBLIC_KEY_SIZE);
- return pubKey;
- }
- operator const uint8_t*() const
- {
- return binData.data();
- }
- ToxHexAddress ToHex() const
- {
- ToxHexAddress hex(binData.data(), binData.size());
- return hex;
- }
+ const ToxBinAddress GetPubKey() const { return ToxBinAddress(binData, TOX_PUBLIC_KEY_SIZE); }
+ operator const uint8_t*() const { return binData; }
+ ToxHexAddress ToHex() const { return ToxHexAddress(binData, binSize); }
};
-ToxBinAddress ToxHexAddress::ToBin() const
-{
- ToxBinAddress bin(hexData.c_str());
- return bin;
-}
+ToxBinAddress ToxHexAddress::ToBin() const { return ToxBinAddress(hexData, hexSize); }
#endif //_TOX_ADDRESS_H_
\ No newline at end of file |