Twitter library use the Stewgate U for PHS Shield. see: https://developer.mbed.org/users/phsfan/notebook/phsshield/

Dependents:   PHSShield_Twitter

Committer:
phsfan
Date:
Mon Jun 22 14:50:41 2015 +0000
Revision:
1:6ffd13808295
Parent:
0:4fc466e9fb48
fix buffer over run

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phsfan 0:4fc466e9fb48 1 /*
phsfan 0:4fc466e9fb48 2 Stewitter.cpp - Arduino library to Post messages to Twitter with OAuth.
phsfan 0:4fc466e9fb48 3 Copyright (c) arms22 2010 - 2012. All right reserved.
phsfan 0:4fc466e9fb48 4 */
phsfan 0:4fc466e9fb48 5 /*
phsfan 0:4fc466e9fb48 6 Twitter.cpp - Arduino library to Post messages to Twitter.
phsfan 0:4fc466e9fb48 7 Copyright (c) NeoCat 2009. All right reserved.
phsfan 0:4fc466e9fb48 8
phsfan 0:4fc466e9fb48 9 This library is distributed in the hope that it will be useful,
phsfan 0:4fc466e9fb48 10 but WITHOUT ANY WARRANTY; without even the implied warranty of
phsfan 0:4fc466e9fb48 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
phsfan 0:4fc466e9fb48 12 */
phsfan 0:4fc466e9fb48 13 /* Modified by 2015 phsfan
phsfan 0:4fc466e9fb48 14 * for ABIT PHS Shield on mbed
phsfan 0:4fc466e9fb48 15 */
phsfan 0:4fc466e9fb48 16
phsfan 0:4fc466e9fb48 17 #include "Stewitter_a3gs.h"
phsfan 0:4fc466e9fb48 18
phsfan 0:4fc466e9fb48 19 #define STEWGATE_POST_API "/api/post/"
phsfan 0:4fc466e9fb48 20 #define STEWGATE_LAST_MENTION_API "/api/last_mention/"
phsfan 0:4fc466e9fb48 21 #define STEWGATE_HOST "stewgate-u.appspot.com"
phsfan 0:4fc466e9fb48 22
phsfan 0:4fc466e9fb48 23 Stewitter_a3gs::Stewitter_a3gs(const char *token, A3GS &a3gs) : _a3gs(a3gs), token(token)
phsfan 0:4fc466e9fb48 24 {
phsfan 0:4fc466e9fb48 25 httpBody[0] = 0;
phsfan 0:4fc466e9fb48 26 }
phsfan 0:4fc466e9fb48 27
phsfan 0:4fc466e9fb48 28 bool Stewitter_a3gs::post(const char *msg)
phsfan 0:4fc466e9fb48 29 {
phsfan 0:4fc466e9fb48 30 int r;
phsfan 1:6ffd13808295 31 char buf[a3gsMAX_RESULT_LENGTH + 1];
phsfan 0:4fc466e9fb48 32 statusCode = 0;
phsfan 0:4fc466e9fb48 33 parseStatus = 0;
phsfan 0:4fc466e9fb48 34 httpBody[0] = 0;
phsfan 0:4fc466e9fb48 35
phsfan 0:4fc466e9fb48 36 int length = a3gsMAX_RESULT_LENGTH;
phsfan 1:6ffd13808295 37 char header[40], body[a3gsMAX_BODY_LENGTH];
phsfan 0:4fc466e9fb48 38 if (msg != NULL) {
phsfan 1:6ffd13808295 39 snprintf(body, sizeof(body), "_t=%s&msg=%s", token, msg);
phsfan 1:6ffd13808295 40 snprintf(header, sizeof(header), "Content-Length: %d", strlen(body));
phsfan 0:4fc466e9fb48 41 r = _a3gs.httpPOST(STEWGATE_HOST, 80, STEWGATE_POST_API, header, body, buf, &length, false);
phsfan 1:6ffd13808295 42 if (r == 0) _a3gs.read(&buf[length], sizeof(buf) - length);
phsfan 0:4fc466e9fb48 43 } else {
phsfan 1:6ffd13808295 44 snprintf(body, sizeof(body), "_t=%s", token);
phsfan 1:6ffd13808295 45 snprintf(header, sizeof(header), "Content-Length: %d", strlen(body));
phsfan 0:4fc466e9fb48 46 r = _a3gs.httpPOST(STEWGATE_HOST, 80, STEWGATE_LAST_MENTION_API, header, body, buf, &length, false);
phsfan 1:6ffd13808295 47 if (r == 0) _a3gs.read(&buf[length], sizeof(buf) - length);
phsfan 0:4fc466e9fb48 48 }
phsfan 0:4fc466e9fb48 49
phsfan 0:4fc466e9fb48 50 if (r == 0) {
phsfan 0:4fc466e9fb48 51 parse(buf);
phsfan 0:4fc466e9fb48 52 return true;
phsfan 0:4fc466e9fb48 53 } else {
phsfan 0:4fc466e9fb48 54 return false;
phsfan 0:4fc466e9fb48 55 }
phsfan 0:4fc466e9fb48 56 }
phsfan 0:4fc466e9fb48 57
phsfan 0:4fc466e9fb48 58 bool Stewitter_a3gs::lastMention(void)
phsfan 0:4fc466e9fb48 59 {
phsfan 0:4fc466e9fb48 60 return post(NULL);
phsfan 0:4fc466e9fb48 61 }
phsfan 0:4fc466e9fb48 62
phsfan 0:4fc466e9fb48 63 void Stewitter_a3gs::parse (char *buf) {
phsfan 0:4fc466e9fb48 64 int i, len = 0;
phsfan 0:4fc466e9fb48 65
phsfan 0:4fc466e9fb48 66 for (i = 0; i < strlen(buf); i ++) {
phsfan 0:4fc466e9fb48 67 char c = buf[i];
phsfan 0:4fc466e9fb48 68 // if (debug)
phsfan 0:4fc466e9fb48 69 // printf("%c", c);
phsfan 0:4fc466e9fb48 70 switch(parseStatus) {
phsfan 0:4fc466e9fb48 71 case 0: // skip "HTTP/1.1 "
phsfan 0:4fc466e9fb48 72 if (c == ' ') {
phsfan 0:4fc466e9fb48 73 parseStatus++;
phsfan 0:4fc466e9fb48 74 }
phsfan 0:4fc466e9fb48 75 break;
phsfan 0:4fc466e9fb48 76 case 1: // parse Status Code
phsfan 0:4fc466e9fb48 77 if (c >= '0' && c <= '9') {
phsfan 0:4fc466e9fb48 78 statusCode *= 10;
phsfan 0:4fc466e9fb48 79 statusCode += c - '0';
phsfan 0:4fc466e9fb48 80 } else {
phsfan 0:4fc466e9fb48 81 parseStatus++;
phsfan 0:4fc466e9fb48 82 }
phsfan 0:4fc466e9fb48 83 break;
phsfan 0:4fc466e9fb48 84 case 2: // skip HTTP Headers
phsfan 0:4fc466e9fb48 85 if (c == '\x0a') {
phsfan 0:4fc466e9fb48 86 parseStatus++;
phsfan 0:4fc466e9fb48 87 }
phsfan 0:4fc466e9fb48 88 break;
phsfan 0:4fc466e9fb48 89 case 3:
phsfan 0:4fc466e9fb48 90 if (c == '\x0d') {
phsfan 0:4fc466e9fb48 91 parseStatus++;
phsfan 0:4fc466e9fb48 92 }else{
phsfan 0:4fc466e9fb48 93 parseStatus = 2;
phsfan 0:4fc466e9fb48 94 }
phsfan 0:4fc466e9fb48 95 break;
phsfan 0:4fc466e9fb48 96 case 4:
phsfan 0:4fc466e9fb48 97 if (c == '\x0a') {
phsfan 0:4fc466e9fb48 98 parseStatus++;
phsfan 0:4fc466e9fb48 99 }else{
phsfan 0:4fc466e9fb48 100 parseStatus = 2;
phsfan 0:4fc466e9fb48 101 }
phsfan 0:4fc466e9fb48 102 break;
phsfan 0:4fc466e9fb48 103 case 5: // recv HTTP Body
phsfan 0:4fc466e9fb48 104 httpBody[len] = c;
phsfan 0:4fc466e9fb48 105 len ++;
phsfan 0:4fc466e9fb48 106 break;
phsfan 0:4fc466e9fb48 107 }
phsfan 0:4fc466e9fb48 108 }
phsfan 0:4fc466e9fb48 109 httpBody[len] = 0;
phsfan 0:4fc466e9fb48 110 }
phsfan 0:4fc466e9fb48 111
phsfan 0:4fc466e9fb48 112 bool Stewitter_a3gs::checkStatus()
phsfan 0:4fc466e9fb48 113 {
phsfan 0:4fc466e9fb48 114 return false;
phsfan 0:4fc466e9fb48 115 }
phsfan 0:4fc466e9fb48 116
phsfan 0:4fc466e9fb48 117 int Stewitter_a3gs::wait()
phsfan 0:4fc466e9fb48 118 {
phsfan 0:4fc466e9fb48 119 while (checkStatus());
phsfan 0:4fc466e9fb48 120 return statusCode;
phsfan 0:4fc466e9fb48 121 }