From afe67786e1c5484d69b61357233f616f43d3c280 Mon Sep 17 00:00:00 2001 From: Darryl Pogue Date: Wed, 30 Nov 2011 22:38:58 -0800 Subject: [PATCH] Move Base64 util into pfConsoleCore. --- .../FeatureLib/pfConsoleCore/CMakeLists.txt | 2 + .../pfConsoleCore/pfConsoleCommandsCore.cpp | 3 +- .../FeatureLib/pfConsoleCore/pfUtilBase64.cpp | 177 ++++++++++++++++++ .../FeatureLib/pfConsoleCore/pfUtilBase64.h | 80 ++++++++ 4 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.cpp create mode 100644 Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.h diff --git a/Sources/Plasma/FeatureLib/pfConsoleCore/CMakeLists.txt b/Sources/Plasma/FeatureLib/pfConsoleCore/CMakeLists.txt index c54c31a0..4bded426 100644 --- a/Sources/Plasma/FeatureLib/pfConsoleCore/CMakeLists.txt +++ b/Sources/Plasma/FeatureLib/pfConsoleCore/CMakeLists.txt @@ -8,12 +8,14 @@ set(pfConsoleCore_SOURCES pfConsoleCommandsCore.cpp pfConsoleContext.cpp pfConsoleEngine.cpp + pfUtilBase64.cpp ) set(pfConsoleCore_HEADERS pfConsoleCmd.h pfConsoleContext.h pfConsoleEngine.h + pfUtilBase64.h ) add_library(pfConsoleCore STATIC ${pfConsoleCore_SOURCES} ${pfConsoleCore_HEADERS}) diff --git a/Sources/Plasma/FeatureLib/pfConsoleCore/pfConsoleCommandsCore.cpp b/Sources/Plasma/FeatureLib/pfConsoleCore/pfConsoleCommandsCore.cpp index e19bd25e..2f0bb915 100644 --- a/Sources/Plasma/FeatureLib/pfConsoleCore/pfConsoleCommandsCore.cpp +++ b/Sources/Plasma/FeatureLib/pfConsoleCore/pfConsoleCommandsCore.cpp @@ -46,7 +46,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com ////////////////////////////////////////////////////////////////////////////// #include "pfConsoleCmd.h" -#include "pnNetBase/Pch.h" +#include "pnNetBase/pnNetBase.h" +#include "pfUtilBase64.h" #include diff --git a/Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.cpp b/Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.cpp new file mode 100644 index 00000000..9ab44714 --- /dev/null +++ b/Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.cpp @@ -0,0 +1,177 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#include "pfUtilBase64.h" + + +/***************************************************************************** +* +* Private +* +***/ + +static const char kEncode64[] = { +// 0000000000111111111122222222223333333333444444444455555555556666 +// 0123456789012345678901234567890123456789012345678901234567890123 + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +}; + +// Note that the decode table contains one special entry: +// The '-' character (0x2d) maps to 63 just like '/' (0x2f) +// so that URLs will work with Base64Decode when we implement them. +#define kTerminator 127 +#define xx kTerminator +static const char kDecode64[] = { +// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,62,xx,63,xx,63, + 52,53,54,55,56,57,58,59,60,61,xx,xx,xx,xx,xx,xx, + xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, + 15,16,17,18,19,20,21,22,23,24,25,xx,xx,xx,xx,xx, + xx,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, + 41,42,43,44,45,46,47,48,49,50,51,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, + xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx, +}; +#undef xx + +static const char kFillchar = '='; + + +/***************************************************************************** +* +* Exports +* +***/ + +//============================================================================ +unsigned Base64Encode ( + unsigned srcChars, + const byte srcData[], + unsigned dstChars, + char * dstData +) { + ASSERT(srcData); + ASSERT(dstChars >= Base64EncodeSize(srcChars)); + ASSERT(dstData); + + const char * dstBase = dstData; + const byte * srcTerm = srcData + srcChars; + for (;;) switch (srcTerm - srcData) { + case 0: + *dstData++ = 0; + return dstData - dstBase; + + case 1: + *dstData++ = kEncode64[ ((srcData[0] >> 2) & 0x3f) ]; + *dstData++ = kEncode64[ ((srcData[0] << 4) & 0x30) ]; + *dstData++ = kFillchar; + *dstData++ = kFillchar; + *dstData++ = 0; + return dstData - dstBase; + + case 2: + *dstData++ = kEncode64[ ((srcData[0] >> 2) & 0x3f) ]; + *dstData++ = kEncode64[ ((srcData[0] << 4) & 0x30) + ((srcData[1] >> 4) & 0x0f) ]; + *dstData++ = kEncode64[ ((srcData[1] << 2) & 0x3c) ]; + *dstData++ = kFillchar; + *dstData++ = 0; + return dstData - dstBase; + + default: + *dstData++ = kEncode64[ ((srcData[0] >> 2) & 0x3f) ]; + *dstData++ = kEncode64[ ((srcData[0] << 4) & 0x30) + ((srcData[1] >> 4) & 0x0f) ]; + *dstData++ = kEncode64[ ((srcData[1] << 2) & 0x3c) + ((srcData[2] >> 6) & 0x03) ]; + *dstData++ = kEncode64[ (srcData[2] & 0x3f) ]; + srcData += 3; + break; + } +} + +//============================================================================ +unsigned Base64Decode ( + unsigned srcChars, + const char srcData[], + unsigned dstChars, + byte * dstData +) { + ASSERT(srcData); + ASSERT(dstChars >= Base64DecodeSize(srcChars, srcData)); + ASSERT(dstData); + + const byte * dstBase = dstData; + const char * srcTerm = srcData + srcChars; + while (srcTerm - srcData >= 4) { + + *dstData++ = (byte) ( + (kDecode64[srcData[0]] << 2 & 0xfc) + +(kDecode64[srcData[1]] >> 4 & 0x03) + ); + + if (kDecode64[srcData[2]] == kTerminator) + break; + + *dstData++ = (byte) ( + (kDecode64[srcData[1]] << 4 & 0xf0) + +(kDecode64[srcData[2]] >> 2 & 0x0f) + ); + + if (kDecode64[srcData[3]] == kTerminator) + break; + + *dstData++ = (byte) ( + (kDecode64[srcData[2]] << 6 & 0xc0) + +(kDecode64[srcData[3]]) + ); + + srcData += 4; + } + + return dstData - dstBase; +} diff --git a/Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.h b/Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.h new file mode 100644 index 00000000..2e560715 --- /dev/null +++ b/Sources/Plasma/FeatureLib/pfConsoleCore/pfUtilBase64.h @@ -0,0 +1,80 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#ifndef pfUtilBase64_inc +#define pfUtilBase64_inc + +#include "hsTypes.h" + +/***************************************************************************** +* +* Base64 Codec API +* +***/ + +const unsigned kBase64EncodeBlock = 4; +const unsigned kBase64EncodeMultiple = 3; + +inline unsigned Base64EncodeSize (unsigned srcChars) { + return (srcChars + kBase64EncodeMultiple - 1) / kBase64EncodeMultiple + * kBase64EncodeBlock; +} +unsigned Base64Encode ( + unsigned srcChars, + const byte srcData[], + unsigned dstChars, + char * dstData +); + +inline unsigned Base64DecodeSize (unsigned srcChars, const char srcData[]) { + return srcChars * kBase64EncodeMultiple / kBase64EncodeBlock + - ((srcChars >= 1 && srcData[srcChars - 1] == '=') ? 1 : 0) + - ((srcChars >= 2 && srcData[srcChars - 2] == '=') ? 1 : 0); +} +unsigned Base64Decode ( + unsigned srcChars, + const char srcData[], + unsigned dstChars, + byte * dstData +); + +#endif //pnUtilBase64_inc