Server that executes RPC commands through HTTP.

Dependencies:   EthernetInterface mbed-rpc mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers RPCCommand.cpp Source File

RPCCommand.cpp

00001 #include "RPCCommand.h"
00002 #include "mbed.h"
00003 #include "RPCType.h"
00004 
00005 
00006 RPCCommand::RPCCommand():
00007 cmd(),
00008 obj_name(NULL),
00009 func_name(NULL)
00010 {
00011 
00012 }
00013 
00014 bool RPCCommand::decode(char *buffer)
00015 {
00016     if(buffer == NULL)
00017         return false;
00018     if(buffer[0] != '/')
00019         return false;
00020     
00021     ++buffer;
00022     char *tmp = strchr(buffer ,'/');
00023 
00024     if(tmp == NULL)
00025         return false;
00026     if(tmp == buffer)
00027         return false;
00028     
00029     tmp[0] = '\0';
00030     obj_name = buffer;
00031     
00032     buffer = tmp+1;
00033     
00034     if(buffer[0] == '\0' || buffer[0] == '?')
00035         return false;
00036     
00037     func_name = buffer;
00038     
00039     tmp = strchr(buffer, '?');
00040     if(tmp != NULL)
00041     {
00042         if(tmp[1] == '\0')
00043             return false;
00044         tmp[0] = '\0';
00045     }
00046     
00047     cmd[0] = '\0';
00048     strcat(cmd, "/");
00049     strcat(cmd, obj_name);
00050     strcat(cmd, "/");
00051     strcat(cmd, func_name);
00052 
00053     if(tmp == NULL)
00054         return true;
00055     
00056     buffer = tmp+1;
00057     do
00058     {
00059         tmp = strchr(buffer, '&');
00060         
00061         if(tmp != NULL)
00062         {
00063             if(tmp[1] == '\0' || buffer == tmp)
00064                 return false;
00065             tmp[0] = '\0';
00066         }
00067 
00068         char *sep = strchr(buffer, '=');
00069         if(sep == NULL)
00070             return false;
00071         if(sep == buffer)
00072             return false;
00073         if(sep[1] == '\0' || sep[1] == '&')
00074             return false;
00075         
00076         strcat(cmd, " ");
00077         strcat(cmd, sep+1);
00078         
00079         if(tmp != NULL)
00080             buffer = tmp+1;
00081         else
00082             buffer = NULL;
00083     }while(buffer);
00084     
00085     return true;
00086 }
00087 
00088 
00089 
00090 char* RPCCommand::get_cmd() const
00091 {
00092     return (char*)cmd;
00093 }
00094 
00095 RPC_COMMAND_TYPE RPCCommand::get_type() const
00096 {
00097     if(!strcmp(func_name, "new") && RPCType::instance().is_supported_type(obj_name))
00098         return CREATE;
00099     
00100     RPC* r = RPC::lookup(obj_name);
00101     if(r == NULL)
00102         return INVALID;
00103     
00104     if(!strcmp(func_name, "delete"))
00105         return DELETE;
00106         
00107     const struct rpc_method *methods = r->get_rpc_methods();
00108     int i = 0;
00109     while(methods[i].name != NULL)
00110     {
00111         if(!strcmp(func_name, methods[i].name))
00112         {
00113             return FUNCTION_CALL;
00114         }
00115         ++i;
00116     }
00117     
00118     return INVALID;
00119 }
00120 
00121 char* RPCCommand::get_obj_name() const
00122 {
00123     return obj_name;
00124 }
00125 
00126 char* RPCCommand::get_func_name() const
00127 {
00128     return func_name;
00129 }
00130