An application to log WiFi SSIDs for position lookup testing

Dependencies:   C027_Support SWO mbed-rtos mbed picojson

Fork of lpc4088_ebb_ublox_Cellular_PubNubDemo_rtos by EmbeddedArtists AB

Committer:
rosterloh84
Date:
Sun Feb 15 22:04:12 2015 +0000
Revision:
1:cac9b2960637
First working version. Lots to do still.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosterloh84 1:cac9b2960637 1 #include "DeviceConfiguration.h"
rosterloh84 1:cac9b2960637 2 #include <stdlib.h>
rosterloh84 1:cac9b2960637 3 #include <stdio.h>
rosterloh84 1:cac9b2960637 4 #include <string.h>
rosterloh84 1:cac9b2960637 5
rosterloh84 1:cac9b2960637 6 DeviceConfiguration::DeviceConfiguration()
rosterloh84 1:cac9b2960637 7 {
rosterloh84 1:cac9b2960637 8 size_t i;
rosterloh84 1:cac9b2960637 9
rosterloh84 1:cac9b2960637 10 for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
rosterloh84 1:cac9b2960637 11 _items[i].key = NULL;
rosterloh84 1:cac9b2960637 12 _items[i].value = NULL;
rosterloh84 1:cac9b2960637 13 }
rosterloh84 1:cac9b2960637 14 }
rosterloh84 1:cac9b2960637 15
rosterloh84 1:cac9b2960637 16 DeviceConfiguration::~DeviceConfiguration()
rosterloh84 1:cac9b2960637 17 {
rosterloh84 1:cac9b2960637 18 clear();
rosterloh84 1:cac9b2960637 19 }
rosterloh84 1:cac9b2960637 20
rosterloh84 1:cac9b2960637 21 bool DeviceConfiguration::read(const char *str)
rosterloh84 1:cac9b2960637 22 {
rosterloh84 1:cac9b2960637 23 const char *ptr, *ptr2, *ptr3; size_t i, j, len1, len2;
rosterloh84 1:cac9b2960637 24 DeviceConfiguration::KeyValue items[DEVICE_CONFIGURATION_SIZE];
rosterloh84 1:cac9b2960637 25
rosterloh84 1:cac9b2960637 26 for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
rosterloh84 1:cac9b2960637 27 items[i].key = NULL;
rosterloh84 1:cac9b2960637 28 items[i].value = NULL;
rosterloh84 1:cac9b2960637 29 }
rosterloh84 1:cac9b2960637 30
rosterloh84 1:cac9b2960637 31 ptr = str;
rosterloh84 1:cac9b2960637 32 i = 0;
rosterloh84 1:cac9b2960637 33 while ((*ptr != '\0') && (i < DEVICE_CONFIGURATION_SIZE)) {
rosterloh84 1:cac9b2960637 34 if (((ptr2 = strchr(ptr, '=')) == NULL) ||
rosterloh84 1:cac9b2960637 35 ((ptr3 = strchr(ptr2+1, ';')) == NULL))
rosterloh84 1:cac9b2960637 36 goto failure;
rosterloh84 1:cac9b2960637 37
rosterloh84 1:cac9b2960637 38 len1 = ptr2-ptr;
rosterloh84 1:cac9b2960637 39 len2 = ptr3-ptr2 - 1;
rosterloh84 1:cac9b2960637 40
rosterloh84 1:cac9b2960637 41 if ((memchr(ptr, ';', len1) != NULL) ||
rosterloh84 1:cac9b2960637 42 (memchr(ptr2+1, '=', len2) != NULL))
rosterloh84 1:cac9b2960637 43 goto failure;
rosterloh84 1:cac9b2960637 44
rosterloh84 1:cac9b2960637 45 for (j = 0; j < DEVICE_CONFIGURATION_SIZE; j++) {
rosterloh84 1:cac9b2960637 46 if ((items[j].key != NULL) && (strlen(items[j].key) == len1) && (strncmp(items[j].key, ptr, len1) == 0))
rosterloh84 1:cac9b2960637 47 goto failure;
rosterloh84 1:cac9b2960637 48 }
rosterloh84 1:cac9b2960637 49
rosterloh84 1:cac9b2960637 50 if ((items[i].key = (char*)malloc(len1+1)) == NULL)
rosterloh84 1:cac9b2960637 51 goto failure;
rosterloh84 1:cac9b2960637 52 if ((items[i].value = (char*)malloc(len2+1)) == NULL) {
rosterloh84 1:cac9b2960637 53 free(items[i].key);
rosterloh84 1:cac9b2960637 54 items[i].key = NULL;
rosterloh84 1:cac9b2960637 55 goto failure;
rosterloh84 1:cac9b2960637 56 }
rosterloh84 1:cac9b2960637 57
rosterloh84 1:cac9b2960637 58 strncpy(items[i].key, ptr, len1);
rosterloh84 1:cac9b2960637 59 strncpy(items[i].value, ptr2+1, len2);
rosterloh84 1:cac9b2960637 60 items[i].key[len1] = '\0';
rosterloh84 1:cac9b2960637 61 items[i].value[len2] = '\0';
rosterloh84 1:cac9b2960637 62
rosterloh84 1:cac9b2960637 63 i++;
rosterloh84 1:cac9b2960637 64 ptr = ptr3+1;
rosterloh84 1:cac9b2960637 65 }
rosterloh84 1:cac9b2960637 66
rosterloh84 1:cac9b2960637 67 if (*ptr != '\0')
rosterloh84 1:cac9b2960637 68 goto failure;
rosterloh84 1:cac9b2960637 69
rosterloh84 1:cac9b2960637 70 clear();
rosterloh84 1:cac9b2960637 71 memcpy(_items, items, sizeof(DeviceConfiguration::KeyValue)*DEVICE_CONFIGURATION_SIZE);
rosterloh84 1:cac9b2960637 72 return true;
rosterloh84 1:cac9b2960637 73
rosterloh84 1:cac9b2960637 74 failure:
rosterloh84 1:cac9b2960637 75 for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
rosterloh84 1:cac9b2960637 76 if (items[i].key != NULL) {
rosterloh84 1:cac9b2960637 77 free(items[i].key);
rosterloh84 1:cac9b2960637 78 free(items[i].value);
rosterloh84 1:cac9b2960637 79 }
rosterloh84 1:cac9b2960637 80 }
rosterloh84 1:cac9b2960637 81
rosterloh84 1:cac9b2960637 82 return false;
rosterloh84 1:cac9b2960637 83 }
rosterloh84 1:cac9b2960637 84
rosterloh84 1:cac9b2960637 85 bool DeviceConfiguration::write(char *buf, size_t len)
rosterloh84 1:cac9b2960637 86 {
rosterloh84 1:cac9b2960637 87 char *ptr; size_t i; int ret, ln;
rosterloh84 1:cac9b2960637 88
rosterloh84 1:cac9b2960637 89 ptr = buf;
rosterloh84 1:cac9b2960637 90 for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
rosterloh84 1:cac9b2960637 91 if (_items[i].key == NULL)
rosterloh84 1:cac9b2960637 92 continue;
rosterloh84 1:cac9b2960637 93
rosterloh84 1:cac9b2960637 94 ret = snprintf(ptr, len, "%s=%s;%n", _items[i].key, _items[i].value, &ln);
rosterloh84 1:cac9b2960637 95 if ((ret < 0) || (ret >= len))
rosterloh84 1:cac9b2960637 96 return false;
rosterloh84 1:cac9b2960637 97
rosterloh84 1:cac9b2960637 98 ptr += ln;
rosterloh84 1:cac9b2960637 99 len -= ln;
rosterloh84 1:cac9b2960637 100 }
rosterloh84 1:cac9b2960637 101
rosterloh84 1:cac9b2960637 102 return true;
rosterloh84 1:cac9b2960637 103 }
rosterloh84 1:cac9b2960637 104
rosterloh84 1:cac9b2960637 105 bool DeviceConfiguration::set(const char *key, const char *value)
rosterloh84 1:cac9b2960637 106 {
rosterloh84 1:cac9b2960637 107 KeyValue *item; size_t i;
rosterloh84 1:cac9b2960637 108
rosterloh84 1:cac9b2960637 109 if ((item = search(key)) == NULL) {
rosterloh84 1:cac9b2960637 110 for (i = 0; (i < DEVICE_CONFIGURATION_SIZE) && (item == NULL); i++) {
rosterloh84 1:cac9b2960637 111 if (_items[i].key == NULL)
rosterloh84 1:cac9b2960637 112 item = &_items[i];
rosterloh84 1:cac9b2960637 113 }
rosterloh84 1:cac9b2960637 114 }
rosterloh84 1:cac9b2960637 115
rosterloh84 1:cac9b2960637 116 if (item == NULL)
rosterloh84 1:cac9b2960637 117 return false;
rosterloh84 1:cac9b2960637 118
rosterloh84 1:cac9b2960637 119 if ((item->key = (char*)malloc(strlen(key)+1)) == NULL)
rosterloh84 1:cac9b2960637 120 return false;
rosterloh84 1:cac9b2960637 121 if ((item->value = (char*)malloc(strlen(value)+1)) == NULL) {
rosterloh84 1:cac9b2960637 122 free(item->key);
rosterloh84 1:cac9b2960637 123 item->key = NULL;
rosterloh84 1:cac9b2960637 124 return false;
rosterloh84 1:cac9b2960637 125 }
rosterloh84 1:cac9b2960637 126
rosterloh84 1:cac9b2960637 127 strcpy(item->key, key);
rosterloh84 1:cac9b2960637 128 strcpy(item->value, value);
rosterloh84 1:cac9b2960637 129 return true;
rosterloh84 1:cac9b2960637 130 }
rosterloh84 1:cac9b2960637 131
rosterloh84 1:cac9b2960637 132 const char * DeviceConfiguration::get(const char *key)
rosterloh84 1:cac9b2960637 133 {
rosterloh84 1:cac9b2960637 134 KeyValue *item;
rosterloh84 1:cac9b2960637 135
rosterloh84 1:cac9b2960637 136 if ((item = search(key)) == NULL)
rosterloh84 1:cac9b2960637 137 return NULL;
rosterloh84 1:cac9b2960637 138
rosterloh84 1:cac9b2960637 139 return item->value;
rosterloh84 1:cac9b2960637 140 }
rosterloh84 1:cac9b2960637 141
rosterloh84 1:cac9b2960637 142 bool DeviceConfiguration::unset(const char *key)
rosterloh84 1:cac9b2960637 143 {
rosterloh84 1:cac9b2960637 144 KeyValue *item;
rosterloh84 1:cac9b2960637 145
rosterloh84 1:cac9b2960637 146 if ((item = search(key)) == NULL)
rosterloh84 1:cac9b2960637 147 return false;
rosterloh84 1:cac9b2960637 148
rosterloh84 1:cac9b2960637 149 free(item->key);
rosterloh84 1:cac9b2960637 150 free(item->value);
rosterloh84 1:cac9b2960637 151 item->key = NULL;
rosterloh84 1:cac9b2960637 152 item->value = NULL;
rosterloh84 1:cac9b2960637 153 return true;
rosterloh84 1:cac9b2960637 154 }
rosterloh84 1:cac9b2960637 155
rosterloh84 1:cac9b2960637 156 bool DeviceConfiguration::has(const char *key)
rosterloh84 1:cac9b2960637 157 {
rosterloh84 1:cac9b2960637 158 return (search(key) != NULL);
rosterloh84 1:cac9b2960637 159 }
rosterloh84 1:cac9b2960637 160
rosterloh84 1:cac9b2960637 161 void DeviceConfiguration::clear()
rosterloh84 1:cac9b2960637 162 {
rosterloh84 1:cac9b2960637 163 size_t i;
rosterloh84 1:cac9b2960637 164
rosterloh84 1:cac9b2960637 165 for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
rosterloh84 1:cac9b2960637 166 if (_items[i].key != NULL) {
rosterloh84 1:cac9b2960637 167 free(_items[i].key);
rosterloh84 1:cac9b2960637 168 free(_items[i].value);
rosterloh84 1:cac9b2960637 169 }
rosterloh84 1:cac9b2960637 170 }
rosterloh84 1:cac9b2960637 171 }
rosterloh84 1:cac9b2960637 172
rosterloh84 1:cac9b2960637 173 DeviceConfiguration::KeyValue * DeviceConfiguration::search(const char *key)
rosterloh84 1:cac9b2960637 174 {
rosterloh84 1:cac9b2960637 175 size_t i;
rosterloh84 1:cac9b2960637 176
rosterloh84 1:cac9b2960637 177 for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) {
rosterloh84 1:cac9b2960637 178 if (strcmp(key, _items[i].key) == 0)
rosterloh84 1:cac9b2960637 179 return &_items[i];
rosterloh84 1:cac9b2960637 180 }
rosterloh84 1:cac9b2960637 181
rosterloh84 1:cac9b2960637 182 return NULL;
rosterloh84 1:cac9b2960637 183 }