/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/

/*-----------------------------------------------------------------------------
 * $RCSfile: x_nwl.h,v $
 * $Revision: #1 $
 * $Date: 2015/05/29 $
 * $Author: brianpc.huang $
 * $CCRevision: /main/DTV_X/DTV_X_HQ_int/20 $
 * $SWAuthor: Pedro Tsai $
 * $MD5HEX: aa3109d410702d35a82d86c6386592c7 $
 *
 * Description:
 *         This header file contains Network list related API definitions,
 *         which are exported to other Middleware components.
 *
 *---------------------------------------------------------------------------*/

#ifndef _X_NWL_H_
#define _X_NWL_H_

#include "u_nwl.h"

extern INT32 x_nwl_create            (const CHAR*      s_nwl_name,
                                      UINT16           ui2_nwl_id,
                                      NWL_MEM_POLICY_T e_mem_policy,
                                      UINT16           ui2_max_nb_rec,
                                      VOID*            pv_tag,
                                      x_nwl_nfy_fct    pf_nfy,
                                      HANDLE_T*        ph_nwl);

extern  INT32 x_nwl_delete           (HANDLE_T    	   h_nwl);

extern  INT32 x_nwl_open             (UINT16           ui2_nwl_id,
                                      VOID*            pv_tag,
                                      x_nwl_nfy_fct    pf_nfy,
                                      HANDLE_T*        ph_nwl);

extern INT32 x_nwl_close             (HANDLE_T         h_nwl);

                                      
extern INT32 x_nwl_clean             (HANDLE_T         h_nwl);

extern INT32 x_nwl_add_rec           (HANDLE_T         h_nwl,
                                      const NWL_REC_T* pt_nwl_rec);

extern INT32 x_nwl_del_rec           (HANDLE_T         h_nwl,
                                      UINT16           ui2_nwl_rec_id);

extern INT32 x_nwl_update_rec        (HANDLE_T         h_nwl,
                                      const NWL_REC_T* pt_nwl_rec,
                                      BOOL             b_must_exist);

extern INT32 x_nwl_qry_rec_id        (HANDLE_T         h_nwl,
                                      NWL_REC_ID_QRY_T e_nwl_qry_option,
                                      UINT16*          pui2_rec_id);
     
extern INT32 x_nwl_lock              (HANDLE_T         h_nwl);

extern INT32 x_nwl_unlock            (HANDLE_T         h_nwl);

extern INT32 x_nwl_read_lock         (HANDLE_T         h_nwl);

extern INT32 x_nwl_read_unlock       (HANDLE_T         h_nwl);

extern INT32 x_nwl_get_rec           (HANDLE_T         h_nwl,
                                      UINT16           ui2_nwl_rec_id,
                                      NWL_REC_T*       pt_nwl_rec,
                                      UINT32*          pui4_ver_id);

extern INT32 x_nwl_get_num_rec       (HANDLE_T            h_nwl,
                                      UINT16*             pui2_num_recs,
                                      UINT32*             pui4_ver_id);

extern INT32 x_nwl_get_rec_by_rec_idx(HANDLE_T      h_nwl,
                                      UINT16        ui2_idx,
                                      NWL_REC_T*    pt_nwl_rec,
                                      UINT32*       pui4_ver_id);

extern INT32 x_nwl_get_rec_by_nw_id  (HANDLE_T         h_nwl,
                                      UINT16           ui2_network_id,
                                      UINT16		   ui2_idx,
                                      NWL_REC_T*       pt_nwl_rec,
                                      UINT32*          pui4_ver_id);

extern INT32 x_nwl_get_num_rec_by_nw_id(HANDLE_T            h_nwl,
                                        UINT16              ui2_network_id,
                                        UINT16*             pui2_num_recs,
                                        UINT32*             pui4_ver_id);

extern INT32 x_nwl_get_rec_by_sat    (HANDLE_T         h_nwl,
                                      UINT16           ui2_satl_id,
                                      UINT16           ui2_satl_rec_id,
                                      UINT16		   ui2_idx,
                                      NWL_REC_T*       pt_nwl_rec,
                                      UINT32*          pui4_ver_id);

extern INT32 x_nwl_get_num_rec_by_sat  (HANDLE_T            h_nwl,
                                        UINT16              ui2_satl_id,
                                        UINT16              ui2_satl_rec_id,
                                        UINT16*             pui2_num_recs,
                                        UINT32*             pui4_ver_id);

extern INT32 x_nwl_rec_init          (NWL_REC_T*        pt_nwl_rec);

/********************************************
   NWL data persistent storage related APIs
*********************************************/

extern INT32 x_nwl_fs_load           (HANDLE_T            h_dir,
                                      const CHAR*         ps_nwl_path,
                                      UINT16              ui2_nwl_id,
                                      const CHAR*	      ps_nwl_name,
                                      VOID*               pv_tag,
                                      x_nwl_nfy_fct       pf_nfy,
                                      HANDLE_T*           ph_nwl);

extern  INT32 x_nwl_fs_store         (HANDLE_T            h_dir,
                                      const CHAR*         ps_nwl_path,
                                      UINT16              ui2_nwl_id);
	

extern  INT32 x_nwl_fs_del           (HANDLE_T            h_dir,
                                      const CHAR*         ps_nwl_path,
                                      UINT16              ui2_nwl_id);



extern  INT32 x_nwl_fs_qry           (HANDLE_T        h_dir,
                                      const CHAR*     ps_nwl_path,
                                      UINT16          ui2_idx,
                                      UINT16*         pui2_nwl_id,
                                      CHAR*           ps_nwl_name);

extern  INT32 x_nwl_fs_sync          (HANDLE_T        h_nwl,
                                      HANDLE_T        h_dir,
                                      const CHAR*     ps_nwl_path,
                                      UINT16          ui2_nwl_id);

extern INT32 x_nwl_init_mem_dump     (NWL_MEM_DUMP_T*        pt_mem_dump);
extern INT32 x_nwl_init_mem_dump_64     (NWL_MEM_DUMP_EX_T*        pt_mem_dump);


extern INT32 x_nwl_free_mem_dump     (NWL_MEM_DUMP_T*        pt_mem_dump);
extern INT32 x_nwl_free_mem_dump_64     (NWL_MEM_DUMP_EX_T*        pt_mem_dump);


extern INT32 x_nwl_dump_to_mem       (HANDLE_T               h_nwl,
                                      NWL_MEM_DUMP_T*        pt_mem_dump);
extern INT32 x_nwl_dump_to_mem_64       (HANDLE_T               h_nwl,
                                      NWL_MEM_DUMP_EX_T*        pt_mem_dump);


extern INT32 x_nwl_load_from_mem     (HANDLE_T               h_nwl,
                                      NWL_MEM_DUMP_T*        pt_mem_dump);
extern INT32 x_nwl_load_from_mem_64     (HANDLE_T               h_nwl,
                                      NWL_MEM_DUMP_EX_T*        pt_mem_dump);


extern INT32 x_nwl_fs_store_given_file_handle
(
    HANDLE_T        h_file,
    UINT16          ui2_nwl_id  
);

extern
INT32 x_nwl_fs_sync_given_file_handle
(
    HANDLE_T		h_nwl,	
    HANDLE_T        h_file,
    UINT16		    ui2_nwl_id
);
/******************************************************
Utility function to get information about Network list
*****************************************************/
INT32 x_nwl_get_info                 (HANDLE_T        h_nwl);


#endif /* _X_NWL_H_ */


