Пример #1
0
bool CheckPEHeaders::parseResponse(QPointer<RpcData> rd)
{
	if (!ICommand::parseResponse(rd))
		return false;

	try
	{
		rpc::CheckPEHeadersResult result;
		if (!hlp::protobuf::parseBigMessage(result, rd->response->rpc_result()))
		{
			msg("%s: rpc::CheckPEHeadersResult::ParseFromString() failed\n", __FUNCTION__);
			return false;
		}

		peValid = result.pe_valid();
		if (peValid)
		{
			const auto& exps = result.exps();
			for (auto it = exps.begin(), end = exps.end(); it != end; ++it)
			{
				ExportItem item = {
					it->ea(),
					it->ord(),
					it->name()
				};
				exports.append(item);
			}
			const auto& sects = result.sections();
			for (auto it = sects.begin(), end = sects.end(); it != end; ++it)
			{
				Section s = {
					it->name(),
					it->va(),
					it->v_size(),
					it->raw(),
					it->raw_size(),
					it->characteristics()
				};
				sections.append(s);
			}
		}
		return true;
	}
	catch (std::runtime_error e)
	{
		msg("%s: Runtime error: %s\n", __FUNCTION__, e.what());
	}
	catch (...)
	{
		msg("%s: Unable to parse CheckPEHeadersRequest response\n", __FUNCTION__);
	}
	return false;
}
Пример #2
0
geo::ShapePtr parseXMLShape(const std::string& filename, std::string& error)
{
    std::stringstream s_error;

    TiXmlDocument doc(filename);
    doc.LoadFile();

    if (doc.Error())
    {
        s_error << "While parsing '" << filename << "': " << std::endl << std::endl
                << doc.ErrorDesc() << " at line " << doc.ErrorRow() << ", col " << doc.ErrorCol() << std::endl;
        error = s_error.str();
        return geo::ShapePtr();
    }

    const TiXmlElement* model_xml = doc.FirstChildElement("model");
    if (!model_xml)
    {
        s_error << "Could not find 'model' element" << std::endl;
        return geo::ShapePtr();
    }

    boost::shared_ptr<geo::CompositeShape> shape(new geo::CompositeShape);

    const TiXmlElement* shape_xml = model_xml->FirstChildElement();
    while (shape_xml)
    {
        geo::Pose3D pose = geo::Pose3D::identity();

        // parse properties valid for all shapes
        const TiXmlElement* xyz_xml = shape_xml->FirstChildElement("xyz");
        if (xyz_xml)
        {
            std::vector<double> xyz = parseArray(xyz_xml);
            pose.setOrigin(geo::Vector3(xyz[0], xyz[1], xyz[2]));
        }

        const TiXmlElement* rpy_xml = shape_xml->FirstChildElement("rpy");
        if (rpy_xml)
        {
            std::vector<double> rpy = parseArray(rpy_xml);
            if (fabs(rpy[0]) > 0.0001 || fabs(rpy[1]) > 0.0001 || fabs(rpy[2]) > 0.0001)
            {
                geo::Matrix3 rot;
                rot.setRPY(rpy[0], rpy[1], rpy[2]);
                pose.setBasis(rot);
            }
        }

        std::vector<double> size;
        const TiXmlElement* size_xml = shape_xml->FirstChildElement("size");
        if (size_xml)
            size = parseArray(size_xml);

        std::string shape_type = shape_xml->Value();
        if (shape_type == "box") {
            const TiXmlElement* min_xml = shape_xml->FirstChildElement("min");
            const TiXmlElement* max_xml = shape_xml->FirstChildElement("max");

            if (min_xml && max_xml)
            {
                std::vector<double> min = parseArray(min_xml);
                std::vector<double> max = parseArray(max_xml);

                if (min.size() == 3 && max.size() == 3)
                {
                    shape->addShape(geo::Box(geo::Vector3(min[0], min[1], min[2]),
                                             geo::Vector3(max[0], max[1], max[2])), pose);
                }
            }
            else if (!size.empty())
            {
                geo::Vector3 v_size(size[0], size[1], size[2]);
                shape->addShape(geo::Box(-v_size / 2, v_size / 2), pose);
            }
            else
            {
                s_error << "In definition '" << filename << "': shape '" << shape_type << "' has no size property" << std::endl;
            }

        } else {
            s_error << "In definition '" << filename << "': Unknown shape type: '" << shape_type << "'" << std::endl;
        }

        shape_xml = shape_xml->NextSiblingElement();
    }

    error = s_error.str();
    if (error.empty())
        return shape;

    return geo::ShapePtr();
}