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

Committer:
dan_ackme
Date:
Mon Aug 11 09:58:24 2014 +0000
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad
initial check-in

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_ackme 0:ea85c4bb5e1f 1 /*
dan_ackme 0:ea85c4bb5e1f 2 * Copyright 2014, ACKme Networks
dan_ackme 0:ea85c4bb5e1f 3 * All Rights Reserved.
dan_ackme 0:ea85c4bb5e1f 4 *
dan_ackme 0:ea85c4bb5e1f 5 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
dan_ackme 0:ea85c4bb5e1f 6 * the contents of this file may not be disclosed to third parties, copied
dan_ackme 0:ea85c4bb5e1f 7 * or duplicated in any form, in whole or in part, without the prior
dan_ackme 0:ea85c4bb5e1f 8 * written permission of ACKme Networks.
dan_ackme 0:ea85c4bb5e1f 9 */
dan_ackme 0:ea85c4bb5e1f 10
dan_ackme 0:ea85c4bb5e1f 11
dan_ackme 0:ea85c4bb5e1f 12 #include "Wiconnect.h"
dan_ackme 0:ea85c4bb5e1f 13 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 14 #include "StringUtil.h"
dan_ackme 0:ea85c4bb5e1f 15
dan_ackme 0:ea85c4bb5e1f 16
dan_ackme 0:ea85c4bb5e1f 17 static bool nameMatches(const char *needle, const char* haystack);
dan_ackme 0:ea85c4bb5e1f 18
dan_ackme 0:ea85c4bb5e1f 19
dan_ackme 0:ea85c4bb5e1f 20
dan_ackme 0:ea85c4bb5e1f 21 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 22 WiconnectResult FileInterface::listFiles(FileList &list, const char *name, FileType type, uint32_t version)
dan_ackme 0:ea85c4bb5e1f 23 {
dan_ackme 0:ea85c4bb5e1f 24 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 25
dan_ackme 0:ea85c4bb5e1f 26 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 27
dan_ackme 0:ea85c4bb5e1f 28 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("ls -v")))
dan_ackme 0:ea85c4bb5e1f 29 {
dan_ackme 0:ea85c4bb5e1f 30 result = processFileList(wiconnect->internalBuffer, list, name, type, version);
dan_ackme 0:ea85c4bb5e1f 31 }
dan_ackme 0:ea85c4bb5e1f 32
dan_ackme 0:ea85c4bb5e1f 33 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 34
dan_ackme 0:ea85c4bb5e1f 35 return result;
dan_ackme 0:ea85c4bb5e1f 36 }
dan_ackme 0:ea85c4bb5e1f 37
dan_ackme 0:ea85c4bb5e1f 38 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 39 WiconnectResult FileInterface::processFileList(char *responseStr, FileList &list, const char *name, FileType type, uint32_t version)
dan_ackme 0:ea85c4bb5e1f 40 {
dan_ackme 0:ea85c4bb5e1f 41 WiconnectResult result = WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 42 char *line, *savedLine;
dan_ackme 0:ea85c4bb5e1f 43
dan_ackme 0:ea85c4bb5e1f 44 for(savedLine = responseStr; (line = StringUtil::strtok_r(savedLine, "\r\n", &savedLine)) != NULL;)
dan_ackme 0:ea85c4bb5e1f 45 {
dan_ackme 0:ea85c4bb5e1f 46 uint32_t tmp;
dan_ackme 0:ea85c4bb5e1f 47 char *toks[7], *savedTok;
dan_ackme 0:ea85c4bb5e1f 48
dan_ackme 0:ea85c4bb5e1f 49 if(*line != '#')
dan_ackme 0:ea85c4bb5e1f 50 {
dan_ackme 0:ea85c4bb5e1f 51 continue;
dan_ackme 0:ea85c4bb5e1f 52 }
dan_ackme 0:ea85c4bb5e1f 53 savedTok = line + 2;
dan_ackme 0:ea85c4bb5e1f 54
dan_ackme 0:ea85c4bb5e1f 55 for(int i = 0; i < 6 && (toks[i] = StringUtil::strtok_r(savedTok, " ", &savedTok)) != NULL; ++i)
dan_ackme 0:ea85c4bb5e1f 56 {
dan_ackme 0:ea85c4bb5e1f 57 if(toks[i] == NULL)
dan_ackme 0:ea85c4bb5e1f 58 {
dan_ackme 0:ea85c4bb5e1f 59 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 60 goto exit;
dan_ackme 0:ea85c4bb5e1f 61 }
dan_ackme 0:ea85c4bb5e1f 62 }
dan_ackme 0:ea85c4bb5e1f 63
dan_ackme 0:ea85c4bb5e1f 64
dan_ackme 0:ea85c4bb5e1f 65 if(name != NULL && !nameMatches(name, savedTok+1))
dan_ackme 0:ea85c4bb5e1f 66 {
dan_ackme 0:ea85c4bb5e1f 67 continue;
dan_ackme 0:ea85c4bb5e1f 68 }
dan_ackme 0:ea85c4bb5e1f 69 else if((type != FILE_TYPE_ANY) &&
dan_ackme 0:ea85c4bb5e1f 70 StringUtil::strHexToUint32((const char*)&toks[1][2], &tmp) &&
dan_ackme 0:ea85c4bb5e1f 71 (type != (FileType)tmp))
dan_ackme 0:ea85c4bb5e1f 72 {
dan_ackme 0:ea85c4bb5e1f 73 continue;
dan_ackme 0:ea85c4bb5e1f 74 }
dan_ackme 0:ea85c4bb5e1f 75 else if((version != 0) &&
dan_ackme 0:ea85c4bb5e1f 76 FileInterface::fileVersionStrToInt(toks[5], &tmp) &&
dan_ackme 0:ea85c4bb5e1f 77 (version != tmp))
dan_ackme 0:ea85c4bb5e1f 78 {
dan_ackme 0:ea85c4bb5e1f 79 continue;
dan_ackme 0:ea85c4bb5e1f 80 }
dan_ackme 0:ea85c4bb5e1f 81 else if(WICONNECT_FAILED(result, list.add(toks[1], toks[2], toks[4], toks[5], savedTok+1)))
dan_ackme 0:ea85c4bb5e1f 82 {
dan_ackme 0:ea85c4bb5e1f 83 goto exit;
dan_ackme 0:ea85c4bb5e1f 84 }
dan_ackme 0:ea85c4bb5e1f 85 }
dan_ackme 0:ea85c4bb5e1f 86
dan_ackme 0:ea85c4bb5e1f 87 exit:
dan_ackme 0:ea85c4bb5e1f 88 return result;
dan_ackme 0:ea85c4bb5e1f 89 }
dan_ackme 0:ea85c4bb5e1f 90
dan_ackme 0:ea85c4bb5e1f 91
dan_ackme 0:ea85c4bb5e1f 92 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 93 static bool nameMatches(const char *needle, const char* haystack)
dan_ackme 0:ea85c4bb5e1f 94 {
dan_ackme 0:ea85c4bb5e1f 95 const int haystackLen = strlen(haystack);
dan_ackme 0:ea85c4bb5e1f 96
dan_ackme 0:ea85c4bb5e1f 97 if(*needle == '*')
dan_ackme 0:ea85c4bb5e1f 98 {
dan_ackme 0:ea85c4bb5e1f 99 const int n = strlen(needle + 1);
dan_ackme 0:ea85c4bb5e1f 100
dan_ackme 0:ea85c4bb5e1f 101 if(n > haystackLen)
dan_ackme 0:ea85c4bb5e1f 102 {
dan_ackme 0:ea85c4bb5e1f 103 return false;
dan_ackme 0:ea85c4bb5e1f 104 }
dan_ackme 0:ea85c4bb5e1f 105 return strcmp(needle+1, &haystack[haystackLen - n]) == 0;
dan_ackme 0:ea85c4bb5e1f 106 }
dan_ackme 0:ea85c4bb5e1f 107 else
dan_ackme 0:ea85c4bb5e1f 108 {
dan_ackme 0:ea85c4bb5e1f 109 return strcmp(needle, haystack) == 0;
dan_ackme 0:ea85c4bb5e1f 110 }
dan_ackme 0:ea85c4bb5e1f 111 }
dan_ackme 0:ea85c4bb5e1f 112