#pragma once
#include "../result.h"
#include "../display/binder.h"

typedef struct {
    u32 payload_size;
    u32 payload_off;
    u32 objects_size;
    u32 objects_off;
} ParcelHeader;

#define PARCEL_MAX_PAYLOAD 0x400

typedef struct {
    u8  payload[PARCEL_MAX_PAYLOAD];
    u32 payload_size;
    u8* objects;
    u32 objects_size;

    u32 capacity;
    u32 pos;
} Parcel;

void parcelCreate(Parcel *ctx);
Result parcelTransact(Binder *session, u32 code, Parcel *in_parcel, Parcel *reply_parcel);

void* parcelWriteData(Parcel *ctx, const void* data, size_t data_size);
void* parcelReadData(Parcel *ctx, void* data, size_t data_size);

void parcelWriteInt32(Parcel *ctx, s32 val);
void parcelWriteUInt32(Parcel *ctx, u32 val);
void parcelWriteString16(Parcel *ctx, const char *str);

s32 parcelReadInt32(Parcel *ctx);
u32 parcelReadUInt32(Parcel *ctx);
void parcelWriteInterfaceToken(Parcel *ctx, const char *str);

void* parcelReadFlattenedObject(Parcel *ctx, size_t *size);
void* parcelWriteFlattenedObject(Parcel *ctx, const void* data, size_t size);