Program Listing for File persistence.h

Return to documentation for file (include_public/anj/persistence.h)

/*
 * Copyright 2023-2026 AVSystem <avsystem@avsystem.com>
 * AVSystem Anjay Lite LwM2M SDK
 * All rights reserved.
 *
 * Licensed under AVSystem Anjay Lite LwM2M Client SDK - Non-Commercial License.
 * See the attached LICENSE file for details.
 */

#include <anj/init.h>

#ifndef ANJ_PERSISTENCE_H
#    define ANJ_PERSISTENCE_H

#    include <stdbool.h>
#    include <stdint.h>
#    include <string.h>

#    ifdef __cplusplus
extern "C" {
#    endif

#    ifdef ANJ_WITH_PERSISTENCE

#        define ANJ_PERSISTENCE_MAGIC_MAX_SIZE 16

typedef int anj_persistence_read_cb_t(void *ctx, void *buf, size_t size);

typedef int anj_persistence_write_cb_t(void *ctx, const void *buf, size_t size);

typedef enum {
    ANJ_PERSISTENCE_STORE = 0,

    ANJ_PERSISTENCE_RESTORE
} anj_persistence_direction_t;

typedef struct {
    anj_persistence_direction_t direction;
    anj_persistence_read_cb_t *read;
    anj_persistence_write_cb_t *write;
    void *ctx;
} anj_persistence_context_t;

anj_persistence_context_t
anj_persistence_store_context_create(anj_persistence_write_cb_t *write_cb,
                                     void *ctx);

anj_persistence_context_t
anj_persistence_restore_context_create(anj_persistence_read_cb_t *read_cb,
                                       void *ctx);

static inline anj_persistence_direction_t
anj_persistence_direction(const anj_persistence_context_t *ctx) {
    return ctx->direction;
}

int anj_persistence_bytes(const anj_persistence_context_t *ctx,
                          void *inout_buffer,
                          size_t buffer_size);

int anj_persistence_string(const anj_persistence_context_t *ctx,
                           char *inout_str,
                           size_t out_max_size);

int anj_persistence_magic(const anj_persistence_context_t *ctx,
                          const void *magic,
                          size_t magic_size);

static inline int anj_persistence_bool(const anj_persistence_context_t *ctx,
                                       bool *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_u8(const anj_persistence_context_t *ctx,
                                     uint8_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_u16(const anj_persistence_context_t *ctx,
                                      uint16_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_u32(const anj_persistence_context_t *ctx,
                                      uint32_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_u64(const anj_persistence_context_t *ctx,
                                      uint64_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_i8(const anj_persistence_context_t *ctx,
                                     int8_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_i16(const anj_persistence_context_t *ctx,
                                      int16_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_i32(const anj_persistence_context_t *ctx,
                                      int32_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

static inline int anj_persistence_i64(const anj_persistence_context_t *ctx,
                                      int64_t *inout_value) {
    return anj_persistence_bytes(ctx, inout_value, sizeof(*inout_value));
}

#    endif // ANJ_WITH_PERSISTENCE

#    ifdef __cplusplus
}
#    endif

#endif // ANJ_PERSISTENCE_H