/* SPDX-License-Identifier: LGPL-2.1-or-later */

#ifndef __NM_KEYFILE_H__
#define __NM_KEYFILE_H__

#if !defined(__NETWORKMANAGER_H_INSIDE__) && !defined(NETWORKMANAGER_COMPILATION)
#error "Only <NetworkManager.h> can be included directly."
#endif

#include "nm-core-types.h"

G_BEGIN_DECLS

/**
 * NMKeyfileHandlerFlags:
 * @NM_KEYFILE_HANDLER_FLAGS_NONE: no flags set.
 *
 * Flags for customizing nm_keyfile_read() and nm_keyfile_write().
 *
 * Currently no flags are implemented.
 *
 * Since: 1.30
 */
typedef enum /*< flags >*/ {
    NM_KEYFILE_HANDLER_FLAGS_NONE = 0,
} NMKeyfileHandlerFlags;

/**
 * NMKeyfileHandlerType:
 * @NM_KEYFILE_HANDLER_TYPE_WARN: a warning.
 * @NM_KEYFILE_HANDLER_TYPE_WRITE_CERT: for handling certificates while writing
 *   a connection to keyfile.
 *
 * The type of the callback for %NMKeyfileReadHandler and %NMKeyfileWriteHandler.
 * Depending on the type, you can interpret %NMKeyfileHandlerData.
 *
 * Since: 1.30
 */
typedef enum {
    NM_KEYFILE_HANDLER_TYPE_WARN       = 1,
    NM_KEYFILE_HANDLER_TYPE_WRITE_CERT = 2,
} NMKeyfileHandlerType;

/**
 * NMKeyfileHandlerData:
 *
 * Opaque type with parameters for the callback. The actual content
 * depends on the %NMKeyfileHandlerType.
 *
 * Since: 1.30
 */
typedef struct _NMKeyfileHandlerData NMKeyfileHandlerData;

/**
 * NMKeyfileReadHandler:
 * @keyfile: the #GKeyFile that is currently read
 * @connection: the #NMConnection that is being constructed.
 * @handler_type: the %NMKeyfileHandlerType that indicates which type
 *   the request is.
 * @handler_data: the #NMKeyfileHandlerData. What you can do with it
 *   depends on the @handler_type.
 * @user_data: the user-data argument to nm_keyfile_read().
 *
 * Hook to nm_keyfile_read().
 *
 * The callee may abort the reading by setting an error via nm_keyfile_handler_data_fail_with_error().
 *
 * Returns: the callee should return TRUE, if the event was handled and/or recognized.
 *   Otherwise, a default action will be performed that depends on the @type.
 *   For %NM_KEYFILE_HANDLER_TYPE_WARN type, the default action is doing nothing.
 *
 * Since: 1.30
 */
typedef gboolean (*NMKeyfileReadHandler)(GKeyFile             *keyfile,
                                         NMConnection         *connection,
                                         NMKeyfileHandlerType  handler_type,
                                         NMKeyfileHandlerData *handler_data,
                                         void                 *user_data);

NM_AVAILABLE_IN_1_30
NMConnection *nm_keyfile_read(GKeyFile             *keyfile,
                              const char           *base_dir,
                              NMKeyfileHandlerFlags handler_flags,
                              NMKeyfileReadHandler  handler,
                              void                 *user_data,
                              GError              **error);

/**
 * NMKeyfileWriteHandler:
 * @connection: the #NMConnection that is currently written.
 * @keyfile: the #GKeyFile that is currently constructed.
 * @handler_type: the %NMKeyfileHandlerType that indicates which type
 *   the request is.
 * @handler_data: the #NMKeyfileHandlerData. What you can do with it
 *   depends on the @handler_type.
 * @user_data: the user-data argument to nm_keyfile_read().
 *
 * This is a hook to tweak the serialization.
 *
 * Handler for certain properties or events that are not entirely contained
 * within the keyfile or that might be serialized differently. The @type and
 * @handler_data arguments tell which kind of argument we have at hand.
 *
 * Currently only the type %NM_KEYFILE_HANDLER_TYPE_WRITE_CERT is supported.
 *
 * The callee may call nm_keyfile_handler_data_fail_with_error() to abort
 * the writing with error.
 *
 * Returns: the callee should return %TRUE if the event was handled. If the
 *   event was unhandled, a default action will be performed that depends on
 *   the @handler_type.
 *
 * Since: 1.30
 */
typedef gboolean (*NMKeyfileWriteHandler)(NMConnection         *connection,
                                          GKeyFile             *keyfile,
                                          NMKeyfileHandlerType  handler_type,
                                          NMKeyfileHandlerData *handler_data,
                                          void                 *user_data);

NM_AVAILABLE_IN_1_30
GKeyFile *nm_keyfile_write(NMConnection         *connection,
                           NMKeyfileHandlerFlags handler_flags,
                           NMKeyfileWriteHandler handler,
                           void                 *user_data,
                           GError              **error);

/*****************************************************************************/

NM_AVAILABLE_IN_1_30
void nm_keyfile_handler_data_fail_with_error(NMKeyfileHandlerData *handler_data, GError *src);

NM_AVAILABLE_IN_1_30
void nm_keyfile_handler_data_get_context(const NMKeyfileHandlerData *handler_data,
                                         const char                **out_kf_group_name,
                                         const char                **out_kf_key_name,
                                         NMSetting                 **out_cur_setting,
                                         const char                **out_cur_property_name);

/**
 * NMKeyfileWarnSeverity:
 * @NM_KEYFILE_WARN_SEVERITY_DEBUG: debug message
 * @NM_KEYFILE_WARN_SEVERITY_INFO: info message
 * @NM_KEYFILE_WARN_SEVERITY_INFO_MISSING_FILE: info message about a missing file
 * @NM_KEYFILE_WARN_SEVERITY_WARN: a warning message
 *
 * The severity level of %NM_KEYFILE_HANDLER_TYPE_WARN events.
 *
 * Since: 1.30
 */
typedef enum {
    NM_KEYFILE_WARN_SEVERITY_DEBUG             = 1000,
    NM_KEYFILE_WARN_SEVERITY_INFO              = 2000,
    NM_KEYFILE_WARN_SEVERITY_INFO_MISSING_FILE = 2901,
    NM_KEYFILE_WARN_SEVERITY_WARN              = 3000,
} NMKeyfileWarnSeverity;

NM_AVAILABLE_IN_1_30
void nm_keyfile_handler_data_warn_get(const NMKeyfileHandlerData *handler_data,
                                      const char                **out_message,
                                      NMKeyfileWarnSeverity      *out_severity);

G_END_DECLS

#endif /* __NM_KEYFILE_H__ */
