/*
 * Copyright (c)      2010 The Trustees of Indiana University.
 *                         All rights reserved.
 * $COPYRIGHT$
 *
 * Additional copyrights may follow
 *
 * $HEADER$
 */

/**
 * @file
 *
 * CENTRAL SSTORE component
 *
 */

#ifndef MCA_SSTORE_CENTRAL_EXPORT_H
#define MCA_SSTORE_CENTRAL_EXPORT_H

#include "orte_config.h"

#include "orte/mca/mca.h"

#include "orte/mca/sstore/sstore.h"

BEGIN_C_DECLS

typedef uint8_t orte_sstore_central_cmd_flag_t;
#define ORTE_SSTORE_CENTRAL_CMD OPAL_UINT8
#define ORTE_SSTORE_CENTRAL_PULL 1
#define ORTE_SSTORE_CENTRAL_PUSH 2

    /*
     * Local Component structures
     */
    struct orte_sstore_central_component_t {
        /** Base SSTORE component */
        orte_sstore_base_component_t super;
    };
    typedef struct orte_sstore_central_component_t orte_sstore_central_component_t;
    ORTE_MODULE_DECLSPEC extern orte_sstore_central_component_t mca_sstore_central_component;

    int orte_sstore_central_component_query(mca_base_module_t **module, int *priority);

    /*
     * Module functions
     */
    int orte_sstore_central_module_init(void);
    int orte_sstore_central_module_finalize(void);

    int orte_sstore_central_request_checkpoint_handle(orte_sstore_base_handle_t *handle, int seq, orte_jobid_t jobid);
    int orte_sstore_central_request_restart_handle(orte_sstore_base_handle_t *handle, char *basedir, char *ref, int seq,
                                                   orte_sstore_base_global_snapshot_info_t *snapshot);
    int orte_sstore_central_request_global_snapshot_data(orte_sstore_base_handle_t *handle,
                                                         orte_sstore_base_global_snapshot_info_t *snapshot);
    int orte_sstore_central_register(orte_sstore_base_handle_t handle);

    int orte_sstore_central_get_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char **value);
    int orte_sstore_central_set_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char *value);

    int orte_sstore_central_sync(orte_sstore_base_handle_t handle);
    int orte_sstore_central_remove(orte_sstore_base_handle_t handle);

    int orte_sstore_central_pack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t handle);
    int orte_sstore_central_unpack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t *handle);

    int orte_sstore_central_fetch_app_deps(orte_app_context_t *app);
    int orte_sstore_central_wait_all_deps(void);

    /*
     * HNP functions
     */
int orte_sstore_central_global_module_init(void);
int orte_sstore_central_global_module_finalize(void);
int orte_sstore_central_global_request_checkpoint_handle(orte_sstore_base_handle_t *handle, int seq, orte_jobid_t jobid);
int orte_sstore_central_global_request_global_snapshot_data(orte_sstore_base_handle_t *handle,
                                                            orte_sstore_base_global_snapshot_info_t *snapshot);
int orte_sstore_central_global_request_restart_handle(orte_sstore_base_handle_t *handle, char *basedir,
                                                      char *ref, int seq,
                                                      orte_sstore_base_global_snapshot_info_t *snapshot);
int orte_sstore_central_global_register(orte_sstore_base_handle_t handle);
int orte_sstore_central_global_get_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char **value);
int orte_sstore_central_global_set_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char *value);
int orte_sstore_central_global_sync(orte_sstore_base_handle_t handle);
int orte_sstore_central_global_remove(orte_sstore_base_handle_t handle);
int orte_sstore_central_global_pack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t handle);
int orte_sstore_central_global_unpack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t *handle);

    /*
     * Orted functions
     */
int orte_sstore_central_local_module_init(void);
int orte_sstore_central_local_module_finalize(void);
int orte_sstore_central_local_request_checkpoint_handle(orte_sstore_base_handle_t *handle, int seq, orte_jobid_t jobid);
int orte_sstore_central_local_register(orte_sstore_base_handle_t handle);
int orte_sstore_central_local_get_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char **value);
int orte_sstore_central_local_set_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char *value);
int orte_sstore_central_local_sync(orte_sstore_base_handle_t handle);
int orte_sstore_central_local_remove(orte_sstore_base_handle_t handle);
int orte_sstore_central_local_pack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t handle);
int orte_sstore_central_local_unpack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t *handle);
void orte_sstore_central_local_recv(int status, orte_process_name_t* sender, opal_buffer_t* buffer, orte_rml_tag_t tag, void* cbdata);

    /*
     * Application functions
     */
int orte_sstore_central_app_module_init(void);
int orte_sstore_central_app_module_finalize(void);
int orte_sstore_central_app_request_checkpoint_handle(orte_sstore_base_handle_t *handle, int seq, orte_jobid_t jobid);
int orte_sstore_central_app_register(orte_sstore_base_handle_t handle);
int orte_sstore_central_app_get_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char **value);
int orte_sstore_central_app_set_attr(orte_sstore_base_handle_t handle, orte_sstore_base_key_t key, char *value);
int orte_sstore_central_app_sync(orte_sstore_base_handle_t handle);
int orte_sstore_central_app_remove(orte_sstore_base_handle_t handle);
int orte_sstore_central_app_pack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t handle);
int orte_sstore_central_app_unpack(orte_process_name_t* peer, opal_buffer_t* buffer, orte_sstore_base_handle_t *handle);

    /*
     * Internal utility functions
     */

END_C_DECLS

#endif /* MCA_SSTORE_CENTRAL_EXPORT_H */
