/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkValidatingReadBuffer_DEFINED
#define SkValidatingReadBuffer_DEFINED

#include "SkRefCnt.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkPath.h"
#include "SkPicture.h"
#include "SkReader32.h"

class SkBitmap;

class SkValidatingReadBuffer : public SkReadBuffer {
public:
    SkValidatingReadBuffer(const void* data, size_t size);
    ~SkValidatingReadBuffer() override;

    SkReadBuffer* clone(const void* data, size_t size) const override {
        return new SkValidatingReadBuffer(data, size);
    }

    const void* skip(size_t size) override;

    // primitives
    bool readBool() override;
    SkColor readColor() override;
    int32_t readInt() override;
    SkScalar readScalar() override;
    uint32_t readUInt() override;
    int32_t read32() override;

    // peek
    uint8_t peekByte() override;

    // strings -- the caller is responsible for freeing the string contents
    void readString(SkString* string) override;

    // common data structures
    SkFlattenable* readFlattenable(SkFlattenable::Type type) override;
    void readColor4f(SkColor4f* color) override;
    void readPoint(SkPoint* point) override;
    void readMatrix(SkMatrix* matrix) override;
    void readIRect(SkIRect* rect) override;
    void readRect(SkRect* rect) override;
    void readRRect(SkRRect* rrect) override;
    void readRegion(SkRegion* region) override;
    void readPath(SkPath* path) override;

    // binary data and arrays
    bool readByteArray(void* value, size_t size) override;
    bool readColorArray(SkColor* colors, size_t size) override;
    bool readColor4fArray(SkColor4f* colors, size_t size) override;
    bool readIntArray(int32_t* values, size_t size) override;
    bool readPointArray(SkPoint* points, size_t size) override;
    bool readScalarArray(SkScalar* values, size_t size) override;

    // helpers to get info about arrays and binary data
    uint32_t getArrayCount() override;

    bool validate(bool isValid) override;
    bool isValid() const override;

    bool validateAvailable(size_t size) override;

private:
    bool readArray(void* value, size_t size, size_t elementSize);

    void setMemory(const void* data, size_t size);

    static bool IsPtrAlign4(const void* ptr) {
        return SkIsAlign4((uintptr_t)ptr);
    }

    bool fError;

    typedef SkReadBuffer INHERITED;
};

#endif // SkValidatingReadBuffer_DEFINED
