| Index: chrome/test/logging/win/mof_data_parser.h
|
| diff --git a/chrome/test/logging/win/mof_data_parser.h b/chrome/test/logging/win/mof_data_parser.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0590adf062f29a474e26c7a92831a8f7fea66c70
|
| --- /dev/null
|
| +++ b/chrome/test/logging/win/mof_data_parser.h
|
| @@ -0,0 +1,91 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef CHROME_TEST_LOGGING_WIN_MOF_DATA_PARSER_H_
|
| +#define CHROME_TEST_LOGGING_WIN_MOF_DATA_PARSER_H_
|
| +#pragma once
|
| +
|
| +#include <stddef.h>
|
| +#include <windows.h>
|
| +#include <wmistr.h>
|
| +#include <evntrace.h>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/string_piece.h"
|
| +
|
| +namespace logging_win {
|
| +
|
| +// A parser for Mof data found in an EVENT_TRACE object as formatted by
|
| +// Chromium-related classes. Instances have an implicit cursor that scans the
|
| +// data. Callers invoke Read* methods to extract primitive data types values or
|
| +// pointers to complex data types (arrays and strings). In the latter case, the
|
| +// pointers are only valid for the lifetime of the underlying event.
|
| +class MofDataParser {
|
| + public:
|
| + explicit MofDataParser(const EVENT_TRACE* event);
|
| +
|
| + bool ReadDWORD(DWORD* value) {
|
| + return ReadPrimitive(value);
|
| + }
|
| +
|
| + bool ReadInt(int* value) {
|
| + return ReadPrimitive(value);
|
| + }
|
| +
|
| + bool ReadPointer(intptr_t* value) {
|
| + return ReadPrimitive(value);
|
| + }
|
| +
|
| + // Populates |values| with a pointer to an array of |size| pointer-sized
|
| + // values in the data.
|
| + bool ReadPointerArray(DWORD size, const intptr_t** values) {
|
| + return ReadPrimitiveArray(size, values);
|
| + }
|
| +
|
| + // Populates |value| with a pointer to an arbitrary data structure at the
|
| + // current position.
|
| + template<typename T> bool ReadStructure(const T** value) {
|
| + if (length_ < sizeof(**value))
|
| + return false;
|
| + *value = reinterpret_cast<const T*>(scan_);
|
| + Advance(sizeof(**value));
|
| + return true;
|
| + }
|
| +
|
| + // Sets |value| such that it points to the string in the data at the current
|
| + // position. A trailing newline, if present, is not included in the returned
|
| + // piece. The returned piece is not null-terminated.
|
| + bool ReadString(base::StringPiece* value);
|
| +
|
| + bool empty() { return length_ == 0; }
|
| +
|
| + private:
|
| + void Advance(size_t num_bytes) {
|
| + scan_ += num_bytes;
|
| + length_ -= num_bytes;
|
| + }
|
| +
|
| + template<typename T> bool ReadPrimitive(T* value) {
|
| + if (length_ < sizeof(*value))
|
| + return false;
|
| + *value = *reinterpret_cast<const T*>(scan_);
|
| + Advance(sizeof(*value));
|
| + return true;
|
| + }
|
| +
|
| + template<typename T> bool ReadPrimitiveArray(DWORD size, const T** values) {
|
| + if (length_ < sizeof(**values) * size)
|
| + return false;
|
| + *values = reinterpret_cast<const T*>(scan_);
|
| + Advance(sizeof(**values) * size);
|
| + return true;
|
| + }
|
| +
|
| + const uint8* scan_;
|
| + uint32 length_;
|
| +};
|
| +
|
| +} // namespace logging_win
|
| +
|
| +#endif // CHROME_TEST_LOGGING_WIN_MOF_DATA_PARSER_H_
|
|
|