Host library for controlling a WiConnect enabled Wi-Fi module.

Dependents:   wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more

internal/types/FileList.cpp

Committer:
dan_ackme
Date:
2014-08-11
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad

File content as of revision 0:ea85c4bb5e1f:

/*
 * Copyright 2014, ACKme Networks
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
 * the contents of this file may not be disclosed to third parties, copied
 * or duplicated in any form, in whole or in part, without the prior
 * written permission of ACKme Networks.
 */



#include "Wiconnect.h"
#include "types/FileList.h"



/*************************************************************************************************/
FileList::FileList(int bufferLen_, void *buffer_)
{
    count = 0;
    listHead = listTail = NULL;
    buffer = (uint8_t*)buffer_;
    bufferPtr = buffer;
    bufferLen = bufferLen_;
}

/*************************************************************************************************/
FileList::~FileList()
{
    if(buffer == NULL)
    {
        File* result = listHead;
        while(result != NULL)
        {
            File* tmp = result;
            result = result->next;
            delete tmp;
        }
    }
}

/*************************************************************************************************/
WiconnectResult FileList::add(const char *typeStr, const char *flagsStr, const char* sizeStr, const char *versionStr, const char *nameStr)
{
    WiconnectResult result;
    File *res;

    if(buffer == NULL)
    {
        res = new File();
        if(res == NULL)
        {
            return WICONNECT_NULL_BUFFER;
        }
    }
    else
    {
        if(bufferLen < sizeof(File))
        {
            return WICONNECT_OVERFLOW;
        }
        res = (File*)bufferPtr;
        memset(res, 0, sizeof(File));
        bufferLen -= sizeof(File);
        bufferPtr += sizeof(File);
    }

    if(WICONNECT_FAILED(result, res->initWithListing(typeStr, flagsStr, sizeStr, versionStr, nameStr)))
    {
        if(buffer == NULL)
        {
            delete res;
        }
    }
    else
    {
        if(listHead == NULL)
        {
            listHead = listTail = res;
        }
        else
        {
            res->previous = listTail;
            listTail->next = res;
            listTail = res;
        }
        ++count;
    }

    return result;
}

/*************************************************************************************************/
const File* FileList::getListHead() const
{
    return listHead;
}

/*************************************************************************************************/
int FileList::getCount() const
{
    return count;
}

/*************************************************************************************************/
const File* FileList::getResult(int i) const
{
    if(i >= count)
        return NULL;

    File* result = listHead;
    while(i-- != 0)
        result = result->next;

    return result;
}

/*************************************************************************************************/
const File* FileList::operator [](int i) const
{
    return getResult(i);
}