work in progress

This commit is contained in:
Isaikin Roman
2014-09-10 22:11:41 +04:00
parent 27e2bae3de
commit bf1f9977ce
4 changed files with 157 additions and 359 deletions

View File

@ -2,16 +2,12 @@
#include <msgpack.h>
#include <QDebug>
void test(quint8 *p) {
p++;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "MsgPack";
qDebug() << MsgPack::deserialize(QByteArray::fromHex("c403010203"));
qDebug() << MsgPack::deserialize(QByteArray::fromHex("dc 00 33 c2 c3 c0 00 00 00 00 00 00 00 00 00 ff ff ff ff ff 7f 7f cc ff cd ff ff ce ff ff ff ff e0 e0 d1 ff 80 d2 ff ff 80 00 d3 ff ff ff ff 80 00 00 00 00 00 01 ff a1 61 a1 61 a1 61 a0 a0 a0 91 00 91 00 91 00 90 90 90 80 80 80 81 a1 61 61 81 a1 61 61 81 a1 61 61 91 90 91 91 a1 61"));
return a.exec();
}

View File

@ -1,233 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.2.0, 2014-09-08T22:50:44. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{293bfe28-51d8-4f1a-a70e-1e515004ec8c}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.3 GCC 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.3 GCC 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.53.gcc_64_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/roman/build/build-msgpack-qt-Desktop_Qt_5_3_GCC_64bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Отладка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/roman/build/build-msgpack-qt-Desktop_Qt_5_3_GCC_64bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Выпуск</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Установка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Локальная установка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">msgpack-qt</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/roman/git/msgpack-qt/msgpack-qt.pro</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">msgpack-qt.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">false</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">16</value>
</data>
<data>
<variable>Version</variable>
<value type="int">16</value>
</data>
</qtcreator>

View File

@ -19,7 +19,7 @@ MsgPackPrivate::type_parser_f MsgPackPrivate::unpackers[32] = {
QVariant MsgPackPrivate::unpack(quint8 *p, quint8 *end)
{
QVariantList d;
int typesz = 0;
quint32 typesz = 0;
while (p <= end) {
typesz = 0;
@ -30,12 +30,12 @@ QVariant MsgPackPrivate::unpack(quint8 *p, quint8 *end)
if (p - end > 1)
return QVariant();
if (d.length() == 1)
return d[0];
// if (d.length() == 1)
// return d[0];
return d;
}
QVariant MsgPackPrivate::unpack_type(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_type(quint8 *p, quint32 &sz)
{
QVariant d;
@ -57,34 +57,54 @@ QVariant MsgPackPrivate::unpack_type(quint8 *p, int &sz)
return d;
}
QVariant MsgPackPrivate::unpack_positive_fixint(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_positive_fixint(quint8 *p, quint32 &sz)
{
sz += 1;
quint32 val = (quint32)*p;
sz = 1;
return val;
}
QVariant MsgPackPrivate::unpack_negative_fixint(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_negative_fixint(quint8 *p, quint32 &sz)
{
sz += 1;
quint8 val8 = (quint8)*p;
val8 &= ~((1 << 7) | (1 << 6) | (1 << 5));
qint32 val = 0xffffffff;
val &= (0xffffffe0 | val8);
sz = 1;
return val;
}
QVariant MsgPackPrivate::unpack_fixmap(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_map_len(quint8 *p, quint32 &sz, quint32 len)
{
quint32 elemsz = 0;
QMap<QString, QVariant> map;
for (quint32 i = 0; i < len; ++i) {
elemsz = 0;
QVariant key = unpack_type(p, elemsz);
p += elemsz; sz += elemsz;
elemsz = 0;
QVariant val = unpack_type(p, elemsz);
p += elemsz; sz += elemsz;
map.insert(key.toString(), val);
}
return map;
}
QVariant MsgPackPrivate::unpack_array_len(quint8 *p, int &sz, int len)
QVariant MsgPackPrivate::unpack_fixmap(quint8 *p, quint32 &sz)
{
int elemsz = 0;
sz += 1;
quint32 len = (*p++) & 0x0f; // 0b00001111
return unpack_map_len(p, sz ,len);
}
QVariant MsgPackPrivate::unpack_array_len(quint8 *p, quint32 &sz, quint32 len)
{
quint32 elemsz = 0;
QVariantList arr;
for (int i = 0; i < len; ++i) {
for (quint32 i = 0; i < len; ++i) {
elemsz = 0;
arr.append(unpack_type(p, elemsz));
p += elemsz;
@ -117,241 +137,255 @@ quint32 MsgPackPrivate::unpack_uint32(quint8 *p)
return val;
}
QVariant MsgPackPrivate::unpack_fixarray(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_fixarray(quint8 *p, quint32 &sz)
{
int len = (*p++) & 0x0f; // 0b00001111
sz++;
sz += 1;
quint32 len = (*p++) & 0x0f; // 0b00001111
return unpack_array_len(p, sz, len);
}
QVariant MsgPackPrivate::unpack_fixstr(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_fixstr(quint8 *p, quint32 &sz)
{
int len = (*p) & 0x1f; // 0b00011111
sz += 1;
quint32 len = (*p) & 0x1f; // 0b00011111
QString str = QString::fromUtf8((char*)(p + 1), len);
sz = len + 1;
sz += len;
return QVariant(str);
}
QVariant MsgPackPrivate::unpack_nil(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_nil(quint8 *p, quint32 &sz)
{
Q_UNUSED(p)
sz = 1;
sz += 1;
return 0;
}
QVariant MsgPackPrivate::unpack_never_used(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_never_used(quint8 *p, quint32 &sz)
{
Q_UNUSED(p)
sz = 1;
sz += 1;
return QVariant();
}
QVariant MsgPackPrivate::unpack_false(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_false(quint8 *p, quint32 &sz)
{
Q_UNUSED(p)
sz = 1;
sz += 1;
return false;
}
QVariant MsgPackPrivate::unpack_true(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_true(quint8 *p, quint32 &sz)
{
Q_UNUSED(p)
sz = 1;
sz += 1;
return true;
}
QVariant MsgPackPrivate::unpack_bin8(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_bin8(quint8 *p, quint32 &sz)
{
sz += 2;
quint32 len = unpack_uint8(++p);
QByteArray arr((const char *)(++p), len);
sz = len + 2;
QByteArray arr((const char *)(p + 1), len);
sz += len;
return arr;
}
QVariant MsgPackPrivate::unpack_bin16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_bin16(quint8 *p, quint32 &sz)
{
sz += 3;
quint32 len = unpack_uint16(++p);
QByteArray arr((const char *)(++p), len);
sz = len + 2;
QByteArray arr((const char *)(p + 2), len);
sz += len;
return arr;
}
QVariant MsgPackPrivate::unpack_bin32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_bin32(quint8 *p, quint32 &sz)
{
sz += 5;
quint32 len = unpack_uint32(++p);
QByteArray arr((const char *)(++p), len);
sz = len + 2;
QByteArray arr((const char *)(p + 4), len);
sz = len;
return arr;
}
QVariant MsgPackPrivate::unpack_ext8(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_ext8(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_ext16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_ext16(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_ext32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_ext32(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_float32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_float32(quint8 *p, quint32 &sz)
{
sz += 5;
float val = 0;
quint8 *vp = ( (quint8 *)&val ) + 3;
for (int i = 0; i < 4; ++i)
*(vp--) = *(++p);
sz = 5;
return val;
}
QVariant MsgPackPrivate::unpack_float64(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_float64(quint8 *p, quint32 &sz)
{
sz += 9;
double val = 0;
quint8 *vp = ( (quint8 *)&val ) + 7;
for (int i = 0; i < 8; ++i)
*(vp--) = *(++p);
sz = 9;
return val;
}
QVariant MsgPackPrivate::unpack_uint8(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_uint8(quint8 *p, quint32 &sz)
{
sz = 2;
sz += 2;
return unpack_uint8(++p);
}
QVariant MsgPackPrivate::unpack_uint16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_uint16(quint8 *p, quint32 &sz)
{
sz = 3;
sz += 3;
return unpack_uint16(++p);
}
QVariant MsgPackPrivate::unpack_uint32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_uint32(quint8 *p, quint32 &sz)
{
sz = 5;
sz += 5;
return unpack_uint32(++p);
}
QVariant MsgPackPrivate::unpack_uint64(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_uint64(quint8 *p, quint32 &sz)
{
sz += 9;
quint64 val = 0;
for (int i = 56; i >= 0; i -= 8)
val |= (quint64)(*(++p)) << i;
sz = 9;
return val;
}
QVariant MsgPackPrivate::unpack_int8(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_int8(quint8 *p, quint32 &sz)
{
sz += 2;
qint32 val = 0xffffff00;
val |= *(++p);
sz = 2;
return val;
}
QVariant MsgPackPrivate::unpack_int16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_int16(quint8 *p, quint32 &sz)
{
sz += 3;
qint32 val = 0xffff0000;
quint8 *pv = (quint8 *)&val;
pv[1] = *(++p); pv[0] = *(++p);
sz = 3;
return val;
}
QVariant MsgPackPrivate::unpack_int32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_int32(quint8 *p, quint32 &sz)
{
sz += 5;
qint32 val = 0;
quint8 *pv = (quint8 *)&val;
pv[3] = *(++p); pv[2] = *(++p);
pv[1] = *(++p); pv[0] = *(++p);
sz = 5;
return val;
}
QVariant MsgPackPrivate::unpack_int64(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_int64(quint8 *p, quint32 &sz)
{
sz += 9;
qint64 val = 0;
for (int i = 56; i >= 0; i -= 8)
val |= (quint64)(*(++p)) << i;
sz = 9;
return val;
}
QVariant MsgPackPrivate::unpack_fixext1(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_fixext1(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_fixext2(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_fixext2(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_fixext4(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_fixext4(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_fixext8(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_fixext8(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_fixext16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_fixext16(quint8 *p, quint32 &sz)
{
}
QVariant MsgPackPrivate::unpack_str8(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_str8(quint8 *p, quint32 &sz)
{
sz += 2;
quint32 len = unpack_uint8(++p);
QString str = QString::fromUtf8((char*)(p + 1), len);
sz = len + 1;
sz += len;
return QVariant(str);
}
QVariant MsgPackPrivate::unpack_str16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_str16(quint8 *p, quint32 &sz)
{
sz += 3;
quint32 len = unpack_uint16(++p);
QString str = QString::fromUtf8((char*)(p + 1), len);
sz = len + 1;
QString str = QString::fromUtf8((char*)(p + 2), len);
sz += len;
return QVariant(str);
}
QVariant MsgPackPrivate::unpack_str32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_str32(quint8 *p, quint32 &sz)
{
sz += 5;
quint32 len = unpack_uint32(++p);
QString str = QString::fromUtf8((char*)(p + 1), len);
sz = len + 1;
QString str = QString::fromUtf8((char*)(p + 4), len);
sz += len;
return QVariant(str);
}
QVariant MsgPackPrivate::unpack_array16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_array16(quint8 *p, quint32 &sz)
{
sz += 3;
quint32 len = unpack_uint16(++p);
return unpack_array_len(p, sz, len);
return unpack_array_len(p + 2, sz, len);
}
QVariant MsgPackPrivate::unpack_array32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_array32(quint8 *p, quint32 &sz)
{
sz += 5;
quint32 len = unpack_uint32(++p);
return unpack_array_len(p, sz, len);
return unpack_array_len(p + 4, sz, len);
}
QVariant MsgPackPrivate::unpack_map16(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_map16(quint8 *p, quint32 &sz)
{
sz += 3;
quint32 len = unpack_uint16(p);
return unpack_map_len(p + 2, sz, len);
}
QVariant MsgPackPrivate::unpack_map32(quint8 *p, int &sz)
QVariant MsgPackPrivate::unpack_map32(quint8 *p, quint32 &sz)
{
sz += 5;
quint32 len = unpack_uint32(p);
return unpack_map_len(p + 4, sz, len);
}

View File

@ -7,62 +7,63 @@
namespace MsgPackPrivate
{
/* unpack functions:
* QVariant _type_(quint8 *p, int &sz);
* QVariant _type_(quint8 *p, quint32 &sz);
* parses some type, which data is stored at p
* fill sz with type size (sz is there at the moment of calling
* parser function)
*/
typedef QVariant (* type_parser_f)(quint8 *p, int &sz);
typedef QVariant (* type_parser_f)(quint8 *p, quint32 &sz);
extern type_parser_f unpackers[32];
// goes from p to end unpacking types with unpack_type function below
QVariant unpack(quint8 *p, quint8 *end);
// unpack some type, can be called recursively from other unpack functions
QVariant unpack_type(quint8 *p, int &sz);
QVariant unpack_type(quint8 *p, quint32 &sz);
QVariant unpack_array_len(quint8 *p, int &sz, int len);
QVariant unpack_map_len(quint8 *p, quint32 &sz, quint32 len);
QVariant unpack_array_len(quint8 *p, quint32 &sz, quint32 len);
quint32 unpack_uint8(quint8 *p);
quint32 unpack_uint16(quint8 *p);
quint32 unpack_uint32(quint8 *p);
QVariant unpack_positive_fixint(quint8 *p, int &sz);
QVariant unpack_negative_fixint(quint8 *p, int &sz);
QVariant unpack_fixmap(quint8 *p, int &sz);
QVariant unpack_fixarray(quint8 *p, int &sz);
QVariant unpack_fixstr(quint8 *p, int &sz);
QVariant unpack_nil(quint8 *p, int &sz);
QVariant unpack_never_used(quint8 *p, int &sz);
QVariant unpack_false(quint8 *p, int &sz);
QVariant unpack_true(quint8 *p, int &sz);
QVariant unpack_bin8(quint8 *p, int &sz);
QVariant unpack_bin16(quint8 *p, int &sz);
QVariant unpack_bin32(quint8 *p, int &sz);
QVariant unpack_ext8(quint8 *p, int &sz);
QVariant unpack_ext16(quint8 *p, int &sz);
QVariant unpack_ext32(quint8 *p, int &sz);
QVariant unpack_float32(quint8 *p, int &sz);
QVariant unpack_float64(quint8 *p, int &sz);
QVariant unpack_uint8(quint8 *p, int &sz);
QVariant unpack_uint16(quint8 *p, int &sz);
QVariant unpack_uint32(quint8 *p, int &sz);
QVariant unpack_uint64(quint8 *p, int &sz);
QVariant unpack_int8(quint8 *p, int &sz);
QVariant unpack_int16(quint8 *p, int &sz);
QVariant unpack_int32(quint8 *p, int &sz);
QVariant unpack_int64(quint8 *p, int &sz);
QVariant unpack_fixext1(quint8 *p, int &sz);
QVariant unpack_fixext2(quint8 *p, int &sz);
QVariant unpack_fixext4(quint8 *p, int &sz);
QVariant unpack_fixext8(quint8 *p, int &sz);
QVariant unpack_fixext16(quint8 *p, int &sz);
QVariant unpack_str8(quint8 *p, int &sz);
QVariant unpack_str16(quint8 *p, int &sz);
QVariant unpack_str32(quint8 *p, int &sz);
QVariant unpack_array16(quint8 *p, int &sz);
QVariant unpack_array32(quint8 *p, int &sz);
QVariant unpack_map16(quint8 *p, int &sz);
QVariant unpack_map32(quint8 *p, int &sz);
QVariant unpack_positive_fixint(quint8 *p, quint32 &sz);
QVariant unpack_negative_fixint(quint8 *p, quint32 &sz);
QVariant unpack_fixmap(quint8 *p, quint32 &sz);
QVariant unpack_fixarray(quint8 *p, quint32 &sz);
QVariant unpack_fixstr(quint8 *p, quint32 &sz);
QVariant unpack_nil(quint8 *p, quint32 &sz);
QVariant unpack_never_used(quint8 *p, quint32 &sz);
QVariant unpack_false(quint8 *p, quint32 &sz);
QVariant unpack_true(quint8 *p, quint32 &sz);
QVariant unpack_bin8(quint8 *p, quint32 &sz);
QVariant unpack_bin16(quint8 *p, quint32 &sz);
QVariant unpack_bin32(quint8 *p, quint32 &sz);
QVariant unpack_ext8(quint8 *p, quint32 &sz);
QVariant unpack_ext16(quint8 *p, quint32 &sz);
QVariant unpack_ext32(quint8 *p, quint32 &sz);
QVariant unpack_float32(quint8 *p, quint32 &sz);
QVariant unpack_float64(quint8 *p, quint32 &sz);
QVariant unpack_uint8(quint8 *p, quint32 &sz);
QVariant unpack_uint16(quint8 *p, quint32 &sz);
QVariant unpack_uint32(quint8 *p, quint32 &sz);
QVariant unpack_uint64(quint8 *p, quint32 &sz);
QVariant unpack_int8(quint8 *p, quint32 &sz);
QVariant unpack_int16(quint8 *p, quint32 &sz);
QVariant unpack_int32(quint8 *p, quint32 &sz);
QVariant unpack_int64(quint8 *p, quint32 &sz);
QVariant unpack_fixext1(quint8 *p, quint32 &sz);
QVariant unpack_fixext2(quint8 *p, quint32 &sz);
QVariant unpack_fixext4(quint8 *p, quint32 &sz);
QVariant unpack_fixext8(quint8 *p, quint32 &sz);
QVariant unpack_fixext16(quint8 *p, quint32 &sz);
QVariant unpack_str8(quint8 *p, quint32 &sz);
QVariant unpack_str16(quint8 *p, quint32 &sz);
QVariant unpack_str32(quint8 *p, quint32 &sz);
QVariant unpack_array16(quint8 *p, quint32 &sz);
QVariant unpack_array32(quint8 *p, quint32 &sz);
QVariant unpack_map16(quint8 *p, quint32 &sz);
QVariant unpack_map32(quint8 *p, quint32 &sz);
}
#endif // MSGPACK_P_H