/*
 * Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
 *
 * SPDX-License-Identifier: LGPL-2.1+
 */

#pragma once

#include <glib-object.h>
#include <xmlb.h>
#include <jcat.h>

#define FU_TYPE_CABINET (fu_cabinet_get_type ())

G_DECLARE_FINAL_TYPE (FuCabinet, fu_cabinet, FU, CABINET, GObject)

/**
 * FuCabinetParseFlags:
 * @FU_CABINET_PARSE_FLAG_NONE:		No flags set
 *
 * The flags to use when loading the cabinet.
 **/
typedef enum {
	FU_CABINET_PARSE_FLAG_NONE		= 0,
	/*< private >*/
	FU_CABINET_PARSE_FLAG_LAST
} FuCabinetParseFlags;

/**
 * FuCabinetExportFlags:
 * @FU_CABINET_EXPORT_FLAG_NONE:		No flags set
 *
 * The flags to use when exporting the archive.
 **/
typedef enum {
	FU_CABINET_EXPORT_FLAG_NONE		= 0,
	/*< private >*/
	FU_CABINET_EXPORT_FLAG_LAST
} FuCabinetExportFlags;

/**
 * FuCabinetSignFlags:
 * @FU_CABINET_SIGN_FLAG_NONE:		No flags set
 *
 * The flags to use when signing the archive.
 **/
typedef enum {
	FU_CABINET_SIGN_FLAG_NONE		= 0,
	/*< private >*/
	FU_CABINET_SIGN_FLAG_LAST
} FuCabinetSignFlags;

FuCabinet	*fu_cabinet_new			(void);
void		 fu_cabinet_set_size_max	(FuCabinet		*self,
						 guint64		 size_max);
void		 fu_cabinet_set_jcat_context	(FuCabinet		*self,
						 JcatContext		*jcat_context);
gboolean	 fu_cabinet_parse		(FuCabinet		*self,
						 GBytes			*data,
						 FuCabinetParseFlags	 flags,
						 GError			**error)
						 G_GNUC_WARN_UNUSED_RESULT;
gboolean	 fu_cabinet_sign		(FuCabinet		*self,
						 GBytes			*cert,
						 GBytes			*privkey,
						 FuCabinetSignFlags	 flags,
						 GError			**error)
						 G_GNUC_WARN_UNUSED_RESULT;
void		 fu_cabinet_add_file		(FuCabinet		*self,
						 const gchar		*basename,
						 GBytes			*data);
GBytes		*fu_cabinet_get_file		(FuCabinet		*self,
						 const gchar		*basename,
						 GError			**error);
GBytes		*fu_cabinet_export		(FuCabinet		*self,
						 FuCabinetExportFlags	 flags,
						 GError			**error)
						 G_GNUC_WARN_UNUSED_RESULT;
XbSilo		*fu_cabinet_get_silo		(FuCabinet		*self);
