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
device/DeviceConfiguration.cpp@1:cac9b2960637, 2015-02-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |