#include "IPCClient.h"

#include <string.h>
#include <sys/epoll.h>

#include "util.h"

IPCClient *
ipc_client_new(int fd)
{
  IPCClient *c = (IPCClient *)malloc(sizeof(IPCClient));

  if (c == NULL) return NULL;

  // Initialize struct
  memset(&c->event, 0, sizeof(struct epoll_event));

  c->buffer_size = 0;
  c->buffer = NULL;
  c->fd = fd;
  c->event.data.fd = fd;
  c->next = NULL;
  c->prev = NULL;
  c->subscriptions = 0;

  return c;
}

void
ipc_list_add_client(IPCClientList *list, IPCClient *nc)
{
  DEBUG("Adding client with fd %d to list\n", nc->fd);

  if (*list == NULL) {
    // List is empty, point list at first client
    *list = nc;
  } else {
    IPCClient *c;
    // Go to last client in list
    for (c = *list; c && c->next; c = c->next)
      ;
    c->next = nc;
    nc->prev = c;
  }
}

void
ipc_list_remove_client(IPCClientList *list, IPCClient *c)
{
  IPCClient *cprev = c->prev;
  IPCClient *cnext = c->next;

  if (cprev != NULL) cprev->next = c->next;
  if (cnext != NULL) cnext->prev = c->prev;
  if (c == *list) *list = c->next;
}

IPCClient *
ipc_list_get_client(IPCClientList list, int fd)
{
  for (IPCClient *c = list; c; c = c->next) {
    if (c->fd == fd) return c;
  }

  return NULL;
}