data.h

/*
 * File Name:     data.h
 * Author:        Jade Cheng
 * Date:          March 29, 2009
 * Course:        ICS 451
 * Assignment:    Project 2
 */

#ifndef DATA_H_
#define DATA_H_

#include "common.h"

/** The maximum number of items that can exist in the data cache. */
#define MAX_DATA_CACHE_ITEMS 5

/** The maximum number of items that can exist in the content directory. */
#define MAX_CONTENT_DIR_ITEMS 16

/** The maximum number of requests that can exist at one time. */
#define MAX_REQUESTS 5

/** The maximum number of items that can exist in the local content. */
#define MAX_LOCAL_CONTENT_ITEMS (MAX_ARGS - 2)

/** The maximum number of peers that can be assigned from the command line. */
#define MAX_PEERS ((MAX_ARGS - 2) + MAX_CONTENT_DIR_ITEMS)

/** Data corresponding to one entry in the local content or the data cache. */
typedef struct content_item_t {

    /** The name of the content. */
    char name[NAME_BUFFER_SIZE];

    /** The contents of the file. */
    u_char buffer[MAX_CONTENT_LENGTH];

    /** The length of the contents in bytes. */
    size_t size;

} content_item_t;

/** Data corresponding to one item in the content directory. */
typedef struct content_dir_item_t {

    /** The name of the file. */
    char   name[NAME_BUFFER_SIZE];

    /** The peer that has the file. */
    peer_t peer;

} content_dir_item_t;

/** Data corresponding to the content directory cache. */
typedef struct content_dir_t {

    /** An array of items in the cache. */
    content_dir_item_t items[MAX_CONTENT_DIR_ITEMS];

    /**
     * An array of values set to the time when a corresponding item in the
     * items array has been accessed.
     */
    timeval time[MAX_CONTENT_DIR_ITEMS];

    /** The number of items in the content directory. */
    size_t count;

} content_dir_t;

/** Data corresponding to the data cache. */
typedef struct data_cache_t {

    /** An array of content items in the data cache. */
    content_item_t items[MAX_DATA_CACHE_ITEMS];

    /**
     * An array of values set to the time when a corresponding item in the
     * items array has been accessed.
     */
    timeval time[MAX_DATA_CACHE_ITEMS];

    /** The number of items in the data cache. */
    size_t count;

} data_cache_t;

/** Data corresponding to the local content. */
typedef struct local_content_t {

    /** An array of items in the local content. */
    content_item_t items[MAX_LOCAL_CONTENT_ITEMS];

    /** The number of items in the local content. */
    size_t count;

} local_content_t;

/** Data corresponding to the cache of requests. */
typedef struct request_cache_t {

    /** An array of requested file names. */
    char names[MAX_REQUESTS][NAME_BUFFER_SIZE];

    /**
     * An array of values set to the time when a corresponding item in the
     * names array has been accessed.
     */
    timeval time[MAX_REQUESTS];

    /** The number of items in the request cache. */
    size_t count;

} request_cache_t;

/** Data corresponding to a collection of peers. */
typedef struct peers_t {

    /** The array of peers. */
    peer_t peers[MAX_PEERS];

    /** The number of peers in the collection. */
    size_t count;

} peers_t;

/**
 * Adds an item to the content directory.  The corresponding time for the item
 * is set to the current time.  If the item already exists, then the time is
 * reset to the current time.
 *
 * @param dst The content directory.
 * @param name The name of the item.
 * @param peer The peer address and port.
 */
extern void content_dir_add(
    content_dir_t * dst,
    const char *    name,
    const peer_t *  peer);

/**
 * Removes all items from the content directory with a given name.
 *
 * @param dst The content directory.
 * @param name The name of the items to remove.
 */
extern void content_dir_remove(content_dir_t * dst, const char * name);

/**
 * Finds an item with a given name in the content directory.  The index
 * argument is used as both input and output.  For input, it must be the
 * starting index for the search (the first time the function is called, it
 * should be zero).  For output, it contains the index of an item that matches
 * the name.  If no item is found with the name, the function returns
 * EXIT_FAILURE and the value of index should be ignored.  When an item is
 * found, its corresponding time is reset to the current time.
 *
 * @param src The content directory.
 * @param name The name of the item to find.
 * @param index The starting index and then the index of the found item.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int content_dir_find(
    content_dir_t * src,
    const char *    name,
    size_t *        index);

/**
 * Prints the content directory.
 *
 * @param src The content directory.
 */
extern void content_dir_print(const content_dir_t * src);

/**
 * Adds an item to the data cache.  The corresponding time for the item is
 * set to the current time.
 *
 * @param dst The data cache.
 * @param name The name of the item.
 * @param buffer The buffer of data.
 * @param size The number of valid bytes in the buffer.
 */
extern void data_cache_add(
    data_cache_t * dst,
    const char *   name,
    const u_char * buffer,
    size_t         size);

/**
 * Finds an item in the data cache.  If the item is found, the corresponding
 * time for the item is reset to the current time.  When the item is found,
 * the function returns EXIT_SUCCESS, and the index of the item is assigned to
 * the index parameter.
 *
 * @param src The data cache.
 * @param name The name of the item.
 * @param index The index of the item to find.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int data_cache_find(
    data_cache_t * src,
    const char *   name,
    size_t *       index);

/**
 * Prints the data cache.
 *
 * @param src The data cache.
 */
extern void data_cache_print(const data_cache_t * src);

/**
 * Adds an item to the local content.  The function fails if the item already
 * exists in the local content or if the item cannot be loaded from the file
 * system.
 *
 * @param dst The local content.
 * @param name The name of the item.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int local_content_add(local_content_t * dst, const char * name);

/**
 * Finds an item in the local content.  If the item is found, the function
 * returns EXIT_SUCCESS and assigns the index of the item to the index
 * parameter.
 *
 * @param src The local content.
 * @param name The name of the item to find.
 * @param index The index of the item that is found.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int local_content_find(
    const local_content_t * src,
    const char *            name,
    size_t *                index);

/**
 * Prints the local content.
 *
 * @param src The local content.
 */
extern void local_content_print(const local_content_t * src);

/**
 * Adds a peer to a collection.  If the peer already exists in the collection,
 * it is not added, and the function returns EXIT_FAILURE.
 *
 * @param dst The peer collection.
 * @param src The peer to add.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int peers_add(peers_t * dst, const peer_t * src);

/**
 * Combines peers from a content directory and a peer collection.  Duplicate
 * peers are not added.
 *
 * @param dst The peer collection.
 * @param src1 The content directory.
 * @param src2 The peer colleciton.
 */
extern void peers_combine(
    peers_t *             dst,
    const content_dir_t * src1,
    const peers_t *       src2);

/**
 * Prints the collection of peers.
 *
 * @param peers The collection of peers.
 */
extern void peers_print(const peers_t * src);

/**
 * Adds an item to the request cache.  If the item is found, the corresponding
 * time for the item is reset to the current time.
 *
 * @param dst The request cache.
 * @param name The name of the item.
 */
extern void request_add(request_cache_t * dst, const char * name);

/**
 * Expires old requests from the request cache.  When an item expires, all
 * items in the content directory that contain the same name are also deleted.
 * The function returns EXIT_SUCCESS if no items are expired.
 *
 * @param dst1 The request cache.
 * @param dst2 The content directory.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int request_expire(request_cache_t * dst1, content_dir_t * dst2);

/**
 * Finds an item in the request cache with the given name.  If the item is
 * found, then the corresponding time is reset to the current time.  If the
 * item is found, the function returns EXIT_SUCCESS and assigns the index of
 * the item found to the index parameter.
 *
 * @param src The request cache.
 * @param name The name of the file.
 * @param index The index of request that matched the name.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int request_find(
    request_cache_t * src,
    const char *      name,
    size_t *          index);

/**
 * Gets the next request timeout.
 *
 * @param src The request cache.
 * @param dst The time value.
 *
 * @return EXIT_SUCCESS or EXIT_FAILURE.
 */
extern int request_get_next_timeout(request_cache_t * src, timeval * dst);

/**
 * Removes the request with a given index from the request cache.
 *
 * @param dst The request cache.
 * @param index The index of the item to remove.
 */
extern void request_remove(request_cache_t * dst, size_t index);

/**
 * Prints the request cache.
 *
 * @param src The request cache.
 */
extern void request_print(const request_cache_t * src);

#endif /* DATA_H_ */
Valid HTML 4.01 Valid CSS