Sensor with Web Server

Dependencies:   EthernetInterface mbed-rpc mbed-rtos mbed

Committer:
afilipem
Date:
Tue Apr 08 12:13:32 2014 +0000
Revision:
0:c385e589a779
1 version;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
afilipem 0:c385e589a779 1 #include "RPCCommand.h"
afilipem 0:c385e589a779 2 #include "mbed.h"
afilipem 0:c385e589a779 3 #include "RPCType.h"
afilipem 0:c385e589a779 4
afilipem 0:c385e589a779 5
afilipem 0:c385e589a779 6 RPCCommand::RPCCommand():
afilipem 0:c385e589a779 7 cmd(),
afilipem 0:c385e589a779 8 obj_name(NULL),
afilipem 0:c385e589a779 9 func_name(NULL)
afilipem 0:c385e589a779 10 {
afilipem 0:c385e589a779 11
afilipem 0:c385e589a779 12 }
afilipem 0:c385e589a779 13
afilipem 0:c385e589a779 14 bool RPCCommand::decode(char *buffer)
afilipem 0:c385e589a779 15 {
afilipem 0:c385e589a779 16 if(buffer == NULL)
afilipem 0:c385e589a779 17 return false;
afilipem 0:c385e589a779 18 if(buffer[0] != '/')
afilipem 0:c385e589a779 19 return false;
afilipem 0:c385e589a779 20
afilipem 0:c385e589a779 21 ++buffer;
afilipem 0:c385e589a779 22 char *tmp = strchr(buffer ,'/');
afilipem 0:c385e589a779 23
afilipem 0:c385e589a779 24 if(tmp == NULL)
afilipem 0:c385e589a779 25 return false;
afilipem 0:c385e589a779 26 if(tmp == buffer)
afilipem 0:c385e589a779 27 return false;
afilipem 0:c385e589a779 28
afilipem 0:c385e589a779 29 tmp[0] = '\0';
afilipem 0:c385e589a779 30 obj_name = buffer;
afilipem 0:c385e589a779 31
afilipem 0:c385e589a779 32 buffer = tmp+1;
afilipem 0:c385e589a779 33
afilipem 0:c385e589a779 34 if(buffer[0] == '\0' || buffer[0] == '?')
afilipem 0:c385e589a779 35 return false;
afilipem 0:c385e589a779 36
afilipem 0:c385e589a779 37 func_name = buffer;
afilipem 0:c385e589a779 38
afilipem 0:c385e589a779 39 tmp = strchr(buffer, '?');
afilipem 0:c385e589a779 40 if(tmp != NULL)
afilipem 0:c385e589a779 41 {
afilipem 0:c385e589a779 42 if(tmp[1] == '\0')
afilipem 0:c385e589a779 43 return false;
afilipem 0:c385e589a779 44 tmp[0] = '\0';
afilipem 0:c385e589a779 45 }
afilipem 0:c385e589a779 46
afilipem 0:c385e589a779 47 cmd[0] = '\0';
afilipem 0:c385e589a779 48 strcat(cmd, "/");
afilipem 0:c385e589a779 49 strcat(cmd, obj_name);
afilipem 0:c385e589a779 50 strcat(cmd, "/");
afilipem 0:c385e589a779 51 strcat(cmd, func_name);
afilipem 0:c385e589a779 52
afilipem 0:c385e589a779 53 if(tmp == NULL)
afilipem 0:c385e589a779 54 return true;
afilipem 0:c385e589a779 55
afilipem 0:c385e589a779 56 buffer = tmp+1;
afilipem 0:c385e589a779 57 do
afilipem 0:c385e589a779 58 {
afilipem 0:c385e589a779 59 tmp = strchr(buffer, '&');
afilipem 0:c385e589a779 60
afilipem 0:c385e589a779 61 if(tmp != NULL)
afilipem 0:c385e589a779 62 {
afilipem 0:c385e589a779 63 if(tmp[1] == '\0' || buffer == tmp)
afilipem 0:c385e589a779 64 return false;
afilipem 0:c385e589a779 65 tmp[0] = '\0';
afilipem 0:c385e589a779 66 }
afilipem 0:c385e589a779 67
afilipem 0:c385e589a779 68 char *sep = strchr(buffer, '=');
afilipem 0:c385e589a779 69 if(sep == NULL)
afilipem 0:c385e589a779 70 return false;
afilipem 0:c385e589a779 71 if(sep == buffer)
afilipem 0:c385e589a779 72 return false;
afilipem 0:c385e589a779 73 if(sep[1] == '\0' || sep[1] == '&')
afilipem 0:c385e589a779 74 return false;
afilipem 0:c385e589a779 75
afilipem 0:c385e589a779 76 strcat(cmd, " ");
afilipem 0:c385e589a779 77 strcat(cmd, sep+1);
afilipem 0:c385e589a779 78
afilipem 0:c385e589a779 79 if(tmp != NULL)
afilipem 0:c385e589a779 80 buffer = tmp+1;
afilipem 0:c385e589a779 81 else
afilipem 0:c385e589a779 82 buffer = NULL;
afilipem 0:c385e589a779 83 }while(buffer);
afilipem 0:c385e589a779 84
afilipem 0:c385e589a779 85 return true;
afilipem 0:c385e589a779 86 }
afilipem 0:c385e589a779 87
afilipem 0:c385e589a779 88
afilipem 0:c385e589a779 89
afilipem 0:c385e589a779 90 char* RPCCommand::get_cmd() const
afilipem 0:c385e589a779 91 {
afilipem 0:c385e589a779 92 return (char*)cmd;
afilipem 0:c385e589a779 93 }
afilipem 0:c385e589a779 94
afilipem 0:c385e589a779 95 RPC_COMMAND_TYPE RPCCommand::get_type() const
afilipem 0:c385e589a779 96 {
afilipem 0:c385e589a779 97 if(!strcmp(func_name, "new") && RPCType::instance().is_supported_type(obj_name))
afilipem 0:c385e589a779 98 return CREATE;
afilipem 0:c385e589a779 99
afilipem 0:c385e589a779 100 RPC* r = RPC::lookup(obj_name);
afilipem 0:c385e589a779 101 if(r == NULL)
afilipem 0:c385e589a779 102 return INVALID;
afilipem 0:c385e589a779 103
afilipem 0:c385e589a779 104 if(!strcmp(func_name, "delete"))
afilipem 0:c385e589a779 105 return DELETE;
afilipem 0:c385e589a779 106
afilipem 0:c385e589a779 107 const struct rpc_method *methods = r->get_rpc_methods();
afilipem 0:c385e589a779 108 int i = 0;
afilipem 0:c385e589a779 109 while(methods[i].name != NULL)
afilipem 0:c385e589a779 110 {
afilipem 0:c385e589a779 111 if(!strcmp(func_name, methods[i].name))
afilipem 0:c385e589a779 112 {
afilipem 0:c385e589a779 113 return FUNCTION_CALL;
afilipem 0:c385e589a779 114 }
afilipem 0:c385e589a779 115 ++i;
afilipem 0:c385e589a779 116 }
afilipem 0:c385e589a779 117
afilipem 0:c385e589a779 118 return INVALID;
afilipem 0:c385e589a779 119 }
afilipem 0:c385e589a779 120
afilipem 0:c385e589a779 121 char* RPCCommand::get_obj_name() const
afilipem 0:c385e589a779 122 {
afilipem 0:c385e589a779 123 return obj_name;
afilipem 0:c385e589a779 124 }
afilipem 0:c385e589a779 125
afilipem 0:c385e589a779 126 char* RPCCommand::get_func_name() const
afilipem 0:c385e589a779 127 {
afilipem 0:c385e589a779 128 return func_name;
afilipem 0:c385e589a779 129 }
afilipem 0:c385e589a779 130