Integrating the ublox LISA C200 modem

Fork of SprintUSBModemHTTPClientTest by Donatien Garnier

Committer:
sam_grove
Date:
Thu Sep 26 00:44:20 2013 -0500
Revision:
5:3f93dd1d4cb3
Exported program and replaced contents of the repo with the source
to build and debug using keil mdk. Libs NOT upto date are lwip, lwip-sys
and socket. these have newer versions under mbed_official but were starting
from a know working point

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 5:3f93dd1d4cb3 1 /* HTTPMap.cpp */
sam_grove 5:3f93dd1d4cb3 2 /* Copyright (C) 2012 mbed.org, MIT License
sam_grove 5:3f93dd1d4cb3 3 *
sam_grove 5:3f93dd1d4cb3 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sam_grove 5:3f93dd1d4cb3 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
sam_grove 5:3f93dd1d4cb3 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
sam_grove 5:3f93dd1d4cb3 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
sam_grove 5:3f93dd1d4cb3 8 * furnished to do so, subject to the following conditions:
sam_grove 5:3f93dd1d4cb3 9 *
sam_grove 5:3f93dd1d4cb3 10 * The above copyright notice and this permission notice shall be included in all copies or
sam_grove 5:3f93dd1d4cb3 11 * substantial portions of the Software.
sam_grove 5:3f93dd1d4cb3 12 *
sam_grove 5:3f93dd1d4cb3 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sam_grove 5:3f93dd1d4cb3 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sam_grove 5:3f93dd1d4cb3 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sam_grove 5:3f93dd1d4cb3 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sam_grove 5:3f93dd1d4cb3 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sam_grove 5:3f93dd1d4cb3 18 */
sam_grove 5:3f93dd1d4cb3 19
sam_grove 5:3f93dd1d4cb3 20 #include "HTTPMap.h"
sam_grove 5:3f93dd1d4cb3 21
sam_grove 5:3f93dd1d4cb3 22 #include <cstring>
sam_grove 5:3f93dd1d4cb3 23
sam_grove 5:3f93dd1d4cb3 24 #include <cctype>
sam_grove 5:3f93dd1d4cb3 25
sam_grove 5:3f93dd1d4cb3 26 #define OK 0
sam_grove 5:3f93dd1d4cb3 27
sam_grove 5:3f93dd1d4cb3 28 using std::strncpy;
sam_grove 5:3f93dd1d4cb3 29
sam_grove 5:3f93dd1d4cb3 30 HTTPMap::HTTPMap() : m_pos(0), m_count(0)
sam_grove 5:3f93dd1d4cb3 31 {
sam_grove 5:3f93dd1d4cb3 32
sam_grove 5:3f93dd1d4cb3 33 }
sam_grove 5:3f93dd1d4cb3 34
sam_grove 5:3f93dd1d4cb3 35 void HTTPMap::put(const char* key, const char* value)
sam_grove 5:3f93dd1d4cb3 36 {
sam_grove 5:3f93dd1d4cb3 37 if(m_count >= HTTPMAP_TABLE_SIZE)
sam_grove 5:3f93dd1d4cb3 38 {
sam_grove 5:3f93dd1d4cb3 39 return;
sam_grove 5:3f93dd1d4cb3 40 }
sam_grove 5:3f93dd1d4cb3 41 m_keys[m_count] = key;
sam_grove 5:3f93dd1d4cb3 42 m_values[m_count] = value;
sam_grove 5:3f93dd1d4cb3 43 m_count++;
sam_grove 5:3f93dd1d4cb3 44 }
sam_grove 5:3f93dd1d4cb3 45
sam_grove 5:3f93dd1d4cb3 46 void HTTPMap::clear()
sam_grove 5:3f93dd1d4cb3 47 {
sam_grove 5:3f93dd1d4cb3 48 m_count = 0;
sam_grove 5:3f93dd1d4cb3 49 m_pos = 0;
sam_grove 5:3f93dd1d4cb3 50 }
sam_grove 5:3f93dd1d4cb3 51
sam_grove 5:3f93dd1d4cb3 52 /*virtual*/ void HTTPMap::readReset()
sam_grove 5:3f93dd1d4cb3 53 {
sam_grove 5:3f93dd1d4cb3 54 m_pos = 0;
sam_grove 5:3f93dd1d4cb3 55 }
sam_grove 5:3f93dd1d4cb3 56
sam_grove 5:3f93dd1d4cb3 57 /*virtual*/ int HTTPMap::read(char* buf, size_t len, size_t* pReadLen)
sam_grove 5:3f93dd1d4cb3 58 {
sam_grove 5:3f93dd1d4cb3 59 if(m_pos >= m_count)
sam_grove 5:3f93dd1d4cb3 60 {
sam_grove 5:3f93dd1d4cb3 61 *pReadLen = 0;
sam_grove 5:3f93dd1d4cb3 62 m_pos = 0;
sam_grove 5:3f93dd1d4cb3 63 return OK;
sam_grove 5:3f93dd1d4cb3 64 }
sam_grove 5:3f93dd1d4cb3 65
sam_grove 5:3f93dd1d4cb3 66 //URL encode
sam_grove 5:3f93dd1d4cb3 67 char* out = buf;
sam_grove 5:3f93dd1d4cb3 68 const char* in = m_keys[m_pos];
sam_grove 5:3f93dd1d4cb3 69 if( (m_pos != 0) && (out - buf < len - 1) )
sam_grove 5:3f93dd1d4cb3 70 {
sam_grove 5:3f93dd1d4cb3 71 *out='&';
sam_grove 5:3f93dd1d4cb3 72 out++;
sam_grove 5:3f93dd1d4cb3 73 }
sam_grove 5:3f93dd1d4cb3 74
sam_grove 5:3f93dd1d4cb3 75 while( (*in != '\0') && (out - buf < len - 3) )
sam_grove 5:3f93dd1d4cb3 76 {
sam_grove 5:3f93dd1d4cb3 77 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~')
sam_grove 5:3f93dd1d4cb3 78 {
sam_grove 5:3f93dd1d4cb3 79 *out = *in;
sam_grove 5:3f93dd1d4cb3 80 out++;
sam_grove 5:3f93dd1d4cb3 81 }
sam_grove 5:3f93dd1d4cb3 82 else if( *in == ' ' )
sam_grove 5:3f93dd1d4cb3 83 {
sam_grove 5:3f93dd1d4cb3 84 *out='+';
sam_grove 5:3f93dd1d4cb3 85 out++;
sam_grove 5:3f93dd1d4cb3 86 }
sam_grove 5:3f93dd1d4cb3 87 else
sam_grove 5:3f93dd1d4cb3 88 {
sam_grove 5:3f93dd1d4cb3 89 char hex[] = "0123456789abcdef";
sam_grove 5:3f93dd1d4cb3 90 *out='%';
sam_grove 5:3f93dd1d4cb3 91 out++;
sam_grove 5:3f93dd1d4cb3 92 *out=hex[(*in>>4)&0xf];
sam_grove 5:3f93dd1d4cb3 93 out++;
sam_grove 5:3f93dd1d4cb3 94 *out=hex[(*in)&0xf];
sam_grove 5:3f93dd1d4cb3 95 out++;
sam_grove 5:3f93dd1d4cb3 96 }
sam_grove 5:3f93dd1d4cb3 97 in++;
sam_grove 5:3f93dd1d4cb3 98 }
sam_grove 5:3f93dd1d4cb3 99
sam_grove 5:3f93dd1d4cb3 100 if( out - buf < len - 1 )
sam_grove 5:3f93dd1d4cb3 101 {
sam_grove 5:3f93dd1d4cb3 102 *out='=';
sam_grove 5:3f93dd1d4cb3 103 out++;
sam_grove 5:3f93dd1d4cb3 104 }
sam_grove 5:3f93dd1d4cb3 105
sam_grove 5:3f93dd1d4cb3 106 in = m_values[m_pos];
sam_grove 5:3f93dd1d4cb3 107 while( (*in != '\0') && (out - buf < len - 3) )
sam_grove 5:3f93dd1d4cb3 108 {
sam_grove 5:3f93dd1d4cb3 109 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~')
sam_grove 5:3f93dd1d4cb3 110 {
sam_grove 5:3f93dd1d4cb3 111 *out = *in;
sam_grove 5:3f93dd1d4cb3 112 out++;
sam_grove 5:3f93dd1d4cb3 113 }
sam_grove 5:3f93dd1d4cb3 114 else if( *in == ' ' )
sam_grove 5:3f93dd1d4cb3 115 {
sam_grove 5:3f93dd1d4cb3 116 *out='+';
sam_grove 5:3f93dd1d4cb3 117 out++;
sam_grove 5:3f93dd1d4cb3 118 }
sam_grove 5:3f93dd1d4cb3 119 else
sam_grove 5:3f93dd1d4cb3 120 {
sam_grove 5:3f93dd1d4cb3 121 char hex[] = "0123456789abcdef";
sam_grove 5:3f93dd1d4cb3 122 *out='%';
sam_grove 5:3f93dd1d4cb3 123 out++;
sam_grove 5:3f93dd1d4cb3 124 *out=hex[(*in>>4)&0xf];
sam_grove 5:3f93dd1d4cb3 125 out++;
sam_grove 5:3f93dd1d4cb3 126 *out=hex[(*in)&0xf];
sam_grove 5:3f93dd1d4cb3 127 out++;
sam_grove 5:3f93dd1d4cb3 128 }
sam_grove 5:3f93dd1d4cb3 129 in++;
sam_grove 5:3f93dd1d4cb3 130 }
sam_grove 5:3f93dd1d4cb3 131
sam_grove 5:3f93dd1d4cb3 132 *pReadLen = out - buf;
sam_grove 5:3f93dd1d4cb3 133
sam_grove 5:3f93dd1d4cb3 134 m_pos++;
sam_grove 5:3f93dd1d4cb3 135 return OK;
sam_grove 5:3f93dd1d4cb3 136 }
sam_grove 5:3f93dd1d4cb3 137
sam_grove 5:3f93dd1d4cb3 138 /*virtual*/ int HTTPMap::getDataType(char* type, size_t maxTypeLen) //Internet media type for Content-Type header
sam_grove 5:3f93dd1d4cb3 139 {
sam_grove 5:3f93dd1d4cb3 140 strncpy(type, "application/x-www-form-urlencoded", maxTypeLen-1);
sam_grove 5:3f93dd1d4cb3 141 type[maxTypeLen-1] = '\0';
sam_grove 5:3f93dd1d4cb3 142 return OK;
sam_grove 5:3f93dd1d4cb3 143 }
sam_grove 5:3f93dd1d4cb3 144
sam_grove 5:3f93dd1d4cb3 145 /*virtual*/ bool HTTPMap::getIsChunked() //For Transfer-Encoding header
sam_grove 5:3f93dd1d4cb3 146 {
sam_grove 5:3f93dd1d4cb3 147 return false; ////Data is computed one key/value pair at a time
sam_grove 5:3f93dd1d4cb3 148 }
sam_grove 5:3f93dd1d4cb3 149
sam_grove 5:3f93dd1d4cb3 150 /*virtual*/ size_t HTTPMap::getDataLen() //For Content-Length header
sam_grove 5:3f93dd1d4cb3 151 {
sam_grove 5:3f93dd1d4cb3 152 size_t count = 0;
sam_grove 5:3f93dd1d4cb3 153 for(size_t i = 0; i< m_count; i++)
sam_grove 5:3f93dd1d4cb3 154 {
sam_grove 5:3f93dd1d4cb3 155 //URL encode
sam_grove 5:3f93dd1d4cb3 156 const char* in = m_keys[i];
sam_grove 5:3f93dd1d4cb3 157 if( i != 0 )
sam_grove 5:3f93dd1d4cb3 158 {
sam_grove 5:3f93dd1d4cb3 159 count++;
sam_grove 5:3f93dd1d4cb3 160 }
sam_grove 5:3f93dd1d4cb3 161
sam_grove 5:3f93dd1d4cb3 162 while( (*in != '\0') )
sam_grove 5:3f93dd1d4cb3 163 {
sam_grove 5:3f93dd1d4cb3 164 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~')
sam_grove 5:3f93dd1d4cb3 165 {
sam_grove 5:3f93dd1d4cb3 166 count++;
sam_grove 5:3f93dd1d4cb3 167 }
sam_grove 5:3f93dd1d4cb3 168 else if( *in == ' ' )
sam_grove 5:3f93dd1d4cb3 169 {
sam_grove 5:3f93dd1d4cb3 170 count++;
sam_grove 5:3f93dd1d4cb3 171 }
sam_grove 5:3f93dd1d4cb3 172 else
sam_grove 5:3f93dd1d4cb3 173 {
sam_grove 5:3f93dd1d4cb3 174 count+=3;
sam_grove 5:3f93dd1d4cb3 175 }
sam_grove 5:3f93dd1d4cb3 176 in++;
sam_grove 5:3f93dd1d4cb3 177 }
sam_grove 5:3f93dd1d4cb3 178
sam_grove 5:3f93dd1d4cb3 179 count ++;
sam_grove 5:3f93dd1d4cb3 180
sam_grove 5:3f93dd1d4cb3 181 in = m_values[i];
sam_grove 5:3f93dd1d4cb3 182 while( (*in != '\0') )
sam_grove 5:3f93dd1d4cb3 183 {
sam_grove 5:3f93dd1d4cb3 184 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~')
sam_grove 5:3f93dd1d4cb3 185 {
sam_grove 5:3f93dd1d4cb3 186 count++;
sam_grove 5:3f93dd1d4cb3 187 }
sam_grove 5:3f93dd1d4cb3 188 else if( *in == ' ' )
sam_grove 5:3f93dd1d4cb3 189 {
sam_grove 5:3f93dd1d4cb3 190 count++;
sam_grove 5:3f93dd1d4cb3 191 }
sam_grove 5:3f93dd1d4cb3 192 else
sam_grove 5:3f93dd1d4cb3 193 {
sam_grove 5:3f93dd1d4cb3 194 count+=3;
sam_grove 5:3f93dd1d4cb3 195 }
sam_grove 5:3f93dd1d4cb3 196 in++;
sam_grove 5:3f93dd1d4cb3 197 }
sam_grove 5:3f93dd1d4cb3 198 }
sam_grove 5:3f93dd1d4cb3 199 return count;
sam_grove 5:3f93dd1d4cb3 200 }