/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */


#ifndef _GUACD_PROC_MAP_H
#define _GUACD_PROC_MAP_H

#include "config.h"
#include "guac_list.h"
#include "proc.h"
#include "user.h"

#include <guacamole/client.h>

/**
 * The number of hash buckets in each process map.
 */
#define GUACD_PROC_MAP_BUCKETS GUACD_CLIENT_MAX_CONNECTIONS*2

/**
 * Set of all active connections to guacd, indexed by connection ID.
 */
typedef struct guacd_proc_map {

    /**
     * Internal hash buckets. Each bucket is a linked list containing all
     * guac_client instances which hash to this bucket location.
     */
    guac_common_list* __buckets[GUACD_PROC_MAP_BUCKETS];

} guacd_proc_map;

/**
 * Allocates a new client process map. There is intended to be exactly one
 * process map instance, which persists for the life of guacd.
 *
 * @return
 *     A newly-allocated client process map.
 */
guacd_proc_map* guacd_proc_map_alloc();

/**
 * Adds the given process to the client process map. On success, zero is
 * returned. If adding the client fails (due to lack of space, or duplicate
 * ID), a non-zero value is returned instead. The client process is stored by
 * the connection ID of the underlying guac_client.
 *
 * @param map
 *     The map in which the given client process should be stored.
 *
 * @param proc
 *     The client process to store in the given map.
 *
 * @return
 *     Zero if the process was successfully stored in the map, or non-zero if
 *     storing the process fails for any reason.
 */
int guacd_proc_map_add(guacd_proc_map* map, guacd_proc* proc);

/**
 * Retrieves the client process having the client with the given ID, or NULL if
 * no such process is stored.
 *
 * @param map
 *     The map from which to retrieve the process associated with the client
 *     having the given ID.
 *
 * @param id
 *     The ID of the client whose process should be retrieved.
 *
 * @return
 *     The process associated with the client having the given ID, or NULL if
 *     no such process exists.
 */
guacd_proc* guacd_proc_map_retrieve(guacd_proc_map* map, const char* id);

/**
 * Removes the client process having the client with the given ID, returning
 * the corresponding process. If no such process exists, NULL is returned.
 *
 * @param map
 *     The map from which to remove the process associated with the client
 *     having the given ID.
 *
 * @param id
 *     The ID of the client whose process should be removed.
 *
 * @return
 *     The process associated with the client having the given ID which has now
 *     been removed from the given map, or NULL if no such process exists.
 */
guacd_proc* guacd_proc_map_remove(guacd_proc_map* map, const char* id);

#endif

