/***********************************************************************
 * 
 *  Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; version 2.1
 *  of the License.
 *
 *  This library 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 the GNU
 *  Library Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, Novell, Inc.
 * 
 *  To contact Novell about this file by physical or electronic mail, 
 *  you may find current contact information at www.novell.com.
 * 
 ***********************************************************************/

#ifndef  _SSCSLLDEFS__H
#define  _SSCSLLDEFS__H


#if defined(__cplusplus) || defined(c_plusplus)
extern "C"
{
#endif

#include "sscs_utf8.h"
#include "micasa_types.h"

/* ############################## ERROR CODES ############################ */

#define  NSSCS_LL_SUCCESS				0x00000000				/*	  0 */
#define  NSSCS_E_LL_SYS_FAILURE			0xFFFFFCDD				/* -803 */

#ifndef	TRUE
#define	TRUE	1
#endif

#ifndef	FALSE
#define	FALSE	0
#endif

/* ######################## STRUCTURE DEFINITIONS ######################### */

typedef	struct	_ll_link
{
	struct	_ll_link	*next;						/* next in the list */
	void				*item;
} LL_LINK_T;

/* this is the link list information structure */
typedef struct _link_lst
{
	uint32_t		elemCount;	/* number of links in the list */
	LL_LINK_T		*head;		/* real head of the link list (for caching & GC)*/
	LL_LINK_T		*clp;		/* current link pointer */
} LL_LINKLIST_T;


typedef struct _shared_secret_key_val 
{
	uint32_t		kLen;
	SS_UTF8_T		*key;   
	uint32_t		vLen;
	uint8_t			*value;
} LL_SHSEC_KEY_VAL_T;


int	ll_InsertSharedSecretLink
		(
			LL_LINKLIST_T	*	list,
			uint32_t			kLen, //in bytes
			SS_UTF8_T		*	key,
			uint32_t			vLen, // in bytes
			uint8_t	*			value
		);

int	ll_RemoveSharedSecretLink
		(
			LL_LINKLIST_T	*	list,
			uint32_t			kLen,
			SS_UTF8_T		*	key
		);

#define	ll_GetSHSecItem(list)		((LL_SHSEC_KEY_VAL_T *)(list)->clp->item)		   
#define	ll_GetSHSecKey(list)		(((LL_SHSEC_KEY_VAL_T *)(list)->clp->item)->key)   
#define	ll_GetSHSecKeyLen(list)		(((LL_SHSEC_KEY_VAL_T *)(list)->clp->item)->kLen)  
#define	ll_GetSHSecVal(list)		(((LL_SHSEC_KEY_VAL_T *)(list)->clp->item)->value) 
#define	ll_GetSHSecValLen(list)		(((LL_SHSEC_KEY_VAL_T *)(list)->clp->item)->vLen)  

#define	ll_Head(list)				{(list)->clp = (list)->head;}
#define	ll_IsListPopulated(list)	((list)->elemCount)
#define	ll_GetElemCount(list)		((list)->elemCount)
#define	ll_GetItemPtr(list);		(((list)->elemCount) ? ((list)->clp->item) : NULL)


void	ll_DestroyList(LL_LINKLIST_T		*list);
int	ll_Next(LL_LINKLIST_T	 			*list);
void*	ll_GetEntry(LL_LINKLIST_T	 		*list);


#if defined(__cplusplus) || defined(c_plusplus)
}
#endif

#endif	/* _SSCSLLDEFS__H */