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 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/*
This file is part of Android File Transfer For Linux.
Copyright (C) 2015-2020 Vladimir Menshakov
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License,
or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef AFTL_MTP_PTP_OBJECTPROPERTYLISTPARSER_H
#define AFTL_MTP_PTP_OBJECTPROPERTYLISTPARSER_H
#include <mtp/ptp/ObjectId.h>
#include <mtp/ptp/ObjectProperty.h>
#include <mtp/ByteArray.h>
#include <mtp/ptp/InputStream.h>
#include <functional>
namespace mtp
{
namespace impl
{
template<typename PropertyType>
struct ObjectPropertyParser
{
static PropertyType Parse(InputStream &stream, DataTypeCode dataType)
{
switch(dataType)
{
#define HANDLE_TYPE(TYPE, METHOD) case DataTypeCode::TYPE : { return static_cast<PropertyType> (stream . METHOD ()) ; }
HANDLE_TYPE(Uint8, Read8)
HANDLE_TYPE(Uint16, Read16)
HANDLE_TYPE(Uint32, Read32)
HANDLE_TYPE(Uint64, Read64)
HANDLE_TYPE(Int8, Read8)
HANDLE_TYPE(Int16, Read16)
HANDLE_TYPE(Int32, Read32)
HANDLE_TYPE(Int64, Read64)
#undef HANDLE_TYPE
default:
throw std::runtime_error("got invalid type");
}
}
};
template<>
struct ObjectPropertyParser<std::string>
{
static std::string Parse(InputStream &stream, DataTypeCode dataType)
{
if (dataType != DataTypeCode::String)
throw std::runtime_error("got invalid type");
std::string value;
stream >> value;
return value;
}
};
}
template<typename PropertyValueType, template <typename> class Parser = impl::ObjectPropertyParser>
struct ObjectPropertyListParser
{
static u32 GetSize(const ByteArray & data)
{
InputStream stream(data);
u32 n;
stream >> n;
return n;
}
static void Parse(const ByteArray & data, const std::function<void (ObjectId, ObjectProperty property, const PropertyValueType &)> &func)
{
InputStream stream(data);
u32 n;
stream >> n;
while(n--)
{
ObjectId objectId;
ObjectProperty property;
DataTypeCode dataType;
stream >> objectId;
stream >> property;
stream >> dataType;
PropertyValueType value = Parser<PropertyValueType>::Parse(stream, dataType);
func(objectId, property, value);
}
}
};
using ObjectStringPropertyListParser = ObjectPropertyListParser<std::string>;
}
#endif
|