#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "CredentialsCache.h"
#include "datastore.h"
cc_int32
cci_generic_iterate_has_next(cc_generic_iterate_t *iterate)
{
return ((iterate == NULL || iterate->next == NULL) ? 0 : 1);
}
cc_int32
cci_generic_iterate_next(cc_generic_iterate_t *iterator, cc_generic_list_node_t** nodepp)
{
cc_generic_list_node_t* ret;
if (iterator == NULL || nodepp == NULL)
return ccErrBadParam;
ret = iterator->next;
if (iterator->next != NULL)
iterator->next = iterator->next->next;
*nodepp = ret;
return ccNoError;
}
cc_int32
cci_context_iterate_has_next(cc_context_iterate_t *iterate)
{
if ( iterate == NULL )
return 0;
return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate);
}
cc_int32
cci_context_iterate_next(cc_context_iterate_t *iterate, cc_context_list_node_t ** nodepp)
{
if ( iterate == NULL || nodepp == NULL)
return ccErrBadParam;
return cci_generic_iterate_next((cc_generic_iterate_t*)iterate,(cc_context_list_node_t**)nodepp);
}
cc_int32
cci_ccache_iterate_has_next(cc_ccache_iterate_t *iterate)
{
if ( iterate == NULL )
return 0;
return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate);
}
cc_int32
cci_ccache_iterate_next(cc_ccache_iterate_t *iterate, cc_ccache_list_node_t ** nodepp)
{
if ( iterate == NULL || nodepp == NULL)
return ccErrBadParam;
return cci_generic_iterate_next((cc_generic_iterate_t*)iterate, (cc_ccache_list_node_t**)nodepp);
}
cc_int32
cci_credentials_iterate_has_next(cc_credentials_iterate_t *iterate)
{
if ( iterate == NULL )
return 0;
return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate);
}
cc_int32
cci_credentials_iterate_next(cc_credentials_iterate_t *iterate, cc_credentials_list_node_t** nodepp)
{
if ( iterate == NULL || nodepp == NULL )
return ccErrBadParam;
return cci_generic_iterate_next((cc_generic_iterate_t*)iterate, (cc_credentials_list_node_t**)nodepp);
}
cc_int32
cci_generic_list_new(cc_generic_list_head_t ** listpp)
{
cc_generic_list_head_t* ret = (cc_generic_list_head_t *)malloc(sizeof(cc_generic_list_head_t));
if (ret == NULL)
return ccErrNoMem;
ret->type = generic;
ret->head = ret->tail = NULL;
*listpp = ret;
return ccNoError;
}
cc_int32
cci_generic_list_append(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t** nodepp)
{
cc_generic_list_node_t* new_node;
if ( data == NULL || len == 0 )
return ccErrBadParam;
new_node = (cc_generic_list_node_t *)malloc(sizeof(cc_generic_list_node_t));
if (new_node == NULL)
return ccErrNoMem;
new_node->data = malloc(len);
if ( new_node->data == NULL ) {
free(new_node);
return ccErrNoMem;
}
memcpy(new_node->data,data,len);
new_node->len = len;
if (head->head == NULL) {
head->head = new_node;
head->tail = new_node;
new_node->next = new_node->prev = NULL;
} else {
new_node->prev = head->tail;
head->tail->next = new_node;
head->tail = new_node;
new_node->next = NULL;
}
if (nodepp != NULL)
*nodepp = new_node;
return ccNoError;
}
cc_int32
cci_generic_list_prepend(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t** nodepp)
{
cc_generic_list_node_t* new_node;
if ( data == NULL || len == 0 )
return ccErrBadParam;
new_node = (cc_generic_list_node_t *)malloc(sizeof(cc_generic_list_node_t));
if (new_node == NULL)
return ccErrNoMem;
new_node->data = malloc(len);
if ( new_node->data == NULL ) {
free(new_node);
return ccErrNoMem;
}
memcpy(new_node->data,data,len);
new_node->len = len;
if (head->head == NULL) {
head->head = new_node;
head->tail = new_node;
new_node->prev = new_node->next = NULL;
} else {
new_node->next = head->head;
head->head->prev = new_node;
new_node->prev = NULL;
head->head = new_node;
}
if (nodepp != NULL)
*nodepp = new_node;
return ccNoError;
}
cc_int32
cci_generic_list_remove_element(cc_generic_list_head_t* head, cc_generic_list_node_t* rem)
{
if (head->head == NULL || rem == NULL)
return ccErrBadParam;
if (head->head == rem && head->tail == rem) {
head->head = head->tail = NULL;
} else if (head->head == rem) {
head->head = head->head->next;
} else if (head->tail == rem) {
head->tail = head->tail->prev;
head->tail->next = NULL;
} else {
rem->prev->next = rem->next;
rem->next->prev = rem->prev;
}
free(rem);
return ccNoError;
}
cc_int32
cci_generic_free_element(cc_generic_list_node_t* node)
{
if ( node == NULL )
return ccErrBadParam;
if ( node->data ) {
free(node->data);
node->data = NULL;
}
node->len = 0;
node->next = node->prev = NULL;
free(node);
return ccNoError;
}
cc_int32
cci_generic_list_destroy(cc_generic_list_head_t* head)
{
cc_generic_list_node_t *cur, *next;
cc_int32 ret = ccNoError;
if ( head == NULL )
return ccErrBadParam;
for (cur = head->head; ret == ccNoError && cur != NULL; cur = next) {
next = cur->next;
ret = cci_generic_free_element(cur);
}
free(head);
return(ret);
}
cc_int32
cci_context_list_destroy(cc_context_list_head_t* head)
{
return cci_generic_list_destroy((cc_generic_list_head_t*)head);
}
cc_int32
cci_ccache_list_destroy(cc_ccache_list_head_t* head)
{
return cci_generic_list_destroy((cc_generic_list_head_t*)head);
}
cc_int32
cci_credentials_list_destroy(cc_credentials_list_head_t* head)
{
return cci_generic_list_destroy((cc_generic_list_head_t*)head);
}
cc_int32
cci_generic_list_copy(cc_generic_list_head_t* head, cc_generic_list_head_t** headpp)
{
cc_generic_list_head_t* copy;
cc_generic_list_node_t *src_node, *dst_node;
cc_int32 code;
if (head == NULL || headpp == NULL)
return ccErrBadParam;
code = cci_generic_list_new(©);
if (code != ccNoError)
return code;
for (src_node = head->head; src_node != NULL; src_node = src_node->next) {
code = cci_generic_list_append(copy, src_node->data, src_node->len, &dst_node);
if (code != ccNoError) {
cci_generic_list_destroy(copy);
return code;
}
}
*headpp = copy;
return ccNoError;
}
cc_int32
cci_context_list_copy(cc_context_list_head_t* head, cc_context_list_head_t** headpp )
{
return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_context_list_head_t **)headpp);
}
cc_int32
cci_ccache_list_copy(cc_ccache_list_head_t* head, cc_ccache_list_head_t** headpp)
{
return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_ccache_list_head_t **)headpp);
}
cc_int32
cci_credentials_list_copy(cc_credentials_list_head_t* head, cc_credentials_list_head_t** headpp)
{
return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_credentials_list_head_t **)headpp);
}
cc_int32
cci_generic_list_iterator(cc_generic_list_head_t *head, cc_generic_iterate_t** headpp)
{
cc_generic_iterate_t* iterator;
if ( head == NULL || headpp == NULL )
return ccErrBadParam;
iterator = (cc_generic_iterate_t*)malloc(sizeof(cc_generic_iterate_t));
if (iterator == NULL)
return ccErrNoMem;
iterator->next = head->head;
*headpp = iterator;
return ccNoError;
}
cc_int32
cci_generic_free_iterator(cc_generic_iterate_t* iterator)
{
if ( iterator == NULL )
return ccErrBadParam;
iterator->next = NULL;
free(iterator);
return ccNoError;
}
cc_int32
cci_context_list_new(cc_context_list_head_t ** headpp)
{
cc_context_list_head_t *ret;
if ( headpp == NULL )
return ccErrBadParam;
ret = (cc_context_list_head_t *)malloc(sizeof(cc_context_list_head_t));
if (ret == NULL)
return ccErrNoMem;
ret->head = ret->tail = NULL;
*headpp = ret;
return ccNoError;
}
cc_int32
cci_context_list_append(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t** nodepp)
{
return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_context_t), (cc_context_list_node_t**)nodepp);
}
cc_int32
cci_context_list_prepend(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t** nodepp )
{
return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_context_t), (cc_context_list_node_t**)nodepp);
}
cc_int32
cci_context_list_remove_element(cc_context_list_head_t* head, cc_context_list_node_t* rem)
{
return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem);
}
cc_int32
cci_context_list_iterator(cc_context_list_head_t *head, cc_context_iterate_t** iterpp)
{
cc_context_iterate_t* iterator;
if ( head == NULL || iterpp == NULL )
return ccErrBadParam;
iterator = (cc_context_iterate_t*)malloc(sizeof(cc_context_iterate_t));
if (iterator == NULL)
return ccErrNoMem;
iterator->next = head->head;
*iterpp = iterator;
return ccNoError;
}
cc_int32
cci_context_free_iterator(cc_context_iterate_t* iterator)
{
if ( iterator == NULL )
return ccErrBadParam;
iterator->next = NULL;
free(iterator);
return ccNoError;
}
cc_int32
cci_ccache_list_new(cc_ccache_list_head_t ** listpp)
{
cc_ccache_list_head_t *ret;
if ( listpp == NULL )
return ccErrBadParam;
ret = (cc_ccache_list_head_t *)malloc(sizeof(cc_ccache_list_head_t));
if (ret == NULL)
return ccErrNoMem;
ret->head = ret->tail = NULL;
*listpp = ret;
return ccNoError;
}
cc_int32
cci_ccache_list_append(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t** nodepp)
{
return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_ccache_t), (cc_ccache_list_node_t**)nodepp);
}
cc_int32
cci_ccache_list_prepend(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t** nodepp)
{
return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_ccache_t), (cc_ccache_list_node_t**)nodepp);
}
cc_int32
cci_ccache_list_remove_element(cc_ccache_list_head_t* head, cc_ccache_list_node_t* rem)
{
return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem);
}
cc_int32
cci_ccache_list_iterator(cc_ccache_list_head_t *head, cc_ccache_iterate_t** iterpp)
{
cc_ccache_iterate_t* iterator;
if ( head == NULL || iterpp == NULL )
return ccErrBadParam;
iterator = (cc_ccache_iterate_t*)malloc(sizeof(cc_ccache_iterate_t));
if (iterator == NULL)
return ccErrNoMem;
iterator->next = head->head;
*iterpp = iterator;
return ccNoError;
}
cc_int32
cci_ccache_free_iterator(cc_ccache_iterate_t* iterator)
{
if ( iterator == NULL )
return ccErrBadParam;
iterator->next = NULL;
free(iterator);
return ccNoError;
}
cc_int32
cci_credentials_list_new(cc_credentials_list_head_t ** list)
{
if ( list == NULL )
return ccErrBadParam;
*list = (cc_credentials_list_head_t *)malloc(sizeof(cc_credentials_list_head_t));
if (*list == NULL)
return ccErrNoMem;
(*list)->head = (*list)->tail = NULL;
return ccNoError;
}
cc_int32
cci_credentials_list_append(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t** nodepp )
{
return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_credentials_t), (cc_credentials_list_node_t**)nodepp);
}
cc_int32
cci_credentials_list_prepend(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t** nodepp)
{
return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_credentials_t), (cc_credentials_list_node_t**)nodepp);
}
cc_int32
cci_credentials_list_remove_element(cc_credentials_list_head_t* head, cc_credentials_list_node_t* rem)
{
return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem);
}
cc_int32
cci_credentials_list_iterator(cc_credentials_list_head_t *head, cc_credentials_iterate_t** iterpp)
{
cc_credentials_iterate_t* iterator;
if ( head == NULL || iterpp == NULL )
return ccErrBadParam;
iterator = (cc_credentials_iterate_t*)malloc(sizeof(cc_credentials_iterate_t));
if (iterator == NULL)
return ccErrNoMem;
iterator->next = head->head;
*iterpp = iterator;
return ccNoError;
}
cc_int32
cci_credentials_free_iterator(cc_credentials_iterate_t* iterator)
{
if ( iterator == NULL )
return ccErrBadParam;
iterator->next = NULL;
free(iterator);
return ccNoError;
}