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:
- 3:2dc2592bae5e
- Parent:
- 1:6ec9998427ad
- Child:
- 16:7f1d6d359787
File content as of revision 3:2dc2592bae5e:
/* * 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); char *buf = ptr; 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; }