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/file/FileInterface.cpp

Committer:
dan_ackme
Date:
2014-08-11
Revision:
1:6ec9998427ad
Parent:
0:ea85c4bb5e1f
Child:
3:2dc2592bae5e

File content as of revision 1:6ec9998427ad:

/*
 * 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 "internal/common.h"
#include "StringUtil.h"


/*************************************************************************************************/
FileInterface::FileInterface(Wiconnect *wiconnect_)
{
    wiconnect = wiconnect_;
}

/*************************************************************************************************/
WiconnectResult FileInterface::openFile(File &file, const char *name)
{
    WiconnectResult result;

    CHECK_OTHER_COMMAND_EXECUTING();

    if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("fop %s", name)))
    {
        int32_t handle;
        if(!WICONNECT_FAILED(result, wiconnect->responseToInt32(&handle)))
        {
            file.openForRead(handle, name);
        }
    }

    CHECK_CLEANUP_COMMAND();

    return result;
}

/*************************************************************************************************/
WiconnectResult FileInterface::createFile(const ReaderFunc &reader, void *user, const char *name, uint32_t size, uint32_t version, FileType type, bool isEssential, int32_t checksum)
{
    WiconnectResult result;
    char cmdBuffer[WICONNECT_MAX_CMD_SIZE];

    if(WICONNECT_IS_IDLE())
    {
        char *ptr = cmdBuffer;

        ptr += sprintf(cmdBuffer, "fcr %s%s %d", isEssential ? "-e " : "", name, size);

        if(version != 0)
        {
            *ptr = ' ';
            ++ptr;
            FileInterface::fileVersionIntToStr(version, true, ptr);
            ptr = ptr + strlen(ptr);
        }
        if(type != FILE_TYPE_ANY)
        {
            ptr += sprintf(ptr, " %X", type);
        }
        if(checksum != -1)
        {
            ptr += sprintf(ptr, " %X", checksum);
        }
    }

    CHECK_OTHER_COMMAND_EXECUTING();

    result = wiconnect->sendCommand(reader, user, (const char *)cmdBuffer);

    CHECK_CLEANUP_COMMAND();

    return result;
}


/*************************************************************************************************/
WiconnectResult FileInterface::deleteFile(const char *name)
{
    WiconnectResult result;

    CHECK_OTHER_COMMAND_EXECUTING();

    result = wiconnect->sendCommand("fde %s", name);

    CHECK_CLEANUP_COMMAND();

    return result;
}

/*************************************************************************************************/
WiconnectResult FileInterface::deleteFile(const File &file)
{
    return deleteFile(file.getName());
}


/*************************************************************************************************/
const char* FileInterface::fileVersionIntToStr(uint32_t version, bool verbose, char *buffer)
{
    SET_STR_BUFFER(buffer, 32);
    const char *fmt = verbose ? "%u.%u.%u.%u" : "%u.%u.%u";
    sprintf(ptr, fmt, FILE_VERSION_ARGS(version));
    return ptr;
}

/*************************************************************************************************/
bool FileInterface::fileVersionStrToInt(const char *versionStr, uint32_t *versionIntPtr)
{
    const uint8_t offsets[] = {27, 21, 8, 0};
    char buffer[18];
    char *tok, *ptr = buffer;
    uint32_t version = 0;

    strcpy(buffer, versionStr);

    for(int i = 0; i < 4 && (tok = strtok(ptr, ".")) != NULL; ++i)
    {
        char *end;
        const uint32_t value = strtol(tok, &end, 10);
        if(*end != 0)
        {
            return false;
        }
        version |= (value << offsets[i]);
        ptr = NULL;
    }

    *versionIntPtr = version;

    return true;
}

/*************************************************************************************************/
const char* FileInterface::fileTypeToStr(FileType type)
{
    switch(type)
    {
    case FILE_TYPE_UPGRADE_APP:
        return "Upgrade App";
    case FILE_TYPE_WIFI_FW:
        return "Wifi Firmware";
    case FILE_TYPE_REGULAR_APP:
        return "Regular App";
    case FILE_TYPE_TEMPORY:
        return "Temporary";
    case FILE_TYPE_GPIO_CONFIG:
        return "GPIO Default Configuration";
    case FILE_TYPE_COMMAND_HELP:
        return "Command Help";
    case FILE_TYPE_SDC_CAPS:
        return "goHACK.me Capabilities";
    case FILE_TYPE_SETUP_SCRIPT:
        return "Setup Dcript";
    case FILE_TYPE_MISC_FIX_LEN:
        return "Miscellaneous";
    default:
        if(type >= FILE_TYPE_USER_RANGE_START && type <= FILE_TYPE_USER_RANGE_END)
            return "User";
        else
            return "Unknown";
    }
}

/*************************************************************************************************/
const char* FileInterface::fileFlagsToStr(FileFlags flags, char *buffer)
{
    SET_STR_BUFFER(buffer, 64);
    static const char* const flag_strings[] = {
            "Valid",
            "Executable",
            "Encrypted",
            "Internal",
            "Bootable",
            "User",
            "Essential",
    };

    int i = 0;
    *ptr = 0;

    for(uint16_t f = flags; f != 0 && i < 7; f >>= 1, ++i)
    {
        if(f & 0x0001)
        {
            ptr += sprintf(ptr, "%s,", flag_strings[i]);
        }
    }

    if(ptr == buffer)
    {
        strcpy(buffer, "None");
    }
    else
    {
        *(ptr-1) = 0;
    }

    return buf;
}