student test for professor
Dependencies: EthernetInterface mbed-rpc mbed-rtos mbed
Fork of HTTP-Server by
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
Generated on Thu Jul 14 2022 02:04:22 by 1.7.2