Ryo Iizuka / libMiMic

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

Committer:
nyatla
Date:
Sat May 04 12:11:59 2013 +0000
Revision:
29:e19aab0c4156
Parent:
27:eb66b517efe6
Child:
37:fc4b4fd6a649
update platform selector

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 2:b96c1e90d120 1 /*********************************************************************************
nyatla 2:b96c1e90d120 2 * PROJECT: MiMic
nyatla 2:b96c1e90d120 3 * --------------------------------------------------------------------------------
nyatla 2:b96c1e90d120 4 *
nyatla 2:b96c1e90d120 5 * This file is part of MiMic
nyatla 2:b96c1e90d120 6 * Copyright (C)2011 Ryo Iizuka
nyatla 2:b96c1e90d120 7 *
nyatla 2:b96c1e90d120 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 2:b96c1e90d120 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 2:b96c1e90d120 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 2:b96c1e90d120 11 * (at your option) any later version.
nyatla 2:b96c1e90d120 12 *
nyatla 2:b96c1e90d120 13 * This program is distributed in the hope that it will be useful,
nyatla 2:b96c1e90d120 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 2:b96c1e90d120 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 2:b96c1e90d120 16 * GNU General Public License for more details.
nyatla 2:b96c1e90d120 17 *
nyatla 2:b96c1e90d120 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 2:b96c1e90d120 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 2:b96c1e90d120 20 *
nyatla 2:b96c1e90d120 21 * For further information please contact.
nyatla 2:b96c1e90d120 22 * http://nyatla.jp/
nyatla 2:b96c1e90d120 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 2:b96c1e90d120 24 *
nyatla 2:b96c1e90d120 25 *********************************************************************************/
nyatla 2:b96c1e90d120 26 #include "NyLPC_cModMiMicSetting.h"
nyatla 2:b96c1e90d120 27 #include "NyLPC_stdlib.h"
nyatla 14:4618692ec239 28 #include "../NyLPC_cHttpdUtils.h"
nyatla 2:b96c1e90d120 29 #include "NyLPC_http.h"
nyatla 2:b96c1e90d120 30 #include "NyLPC_mimicVm.h"
nyatla 2:b96c1e90d120 31 #include "NyLPC_flash.h"
nyatla 2:b96c1e90d120 32 #include "../NyLPC_cHttpdConnection_protected.h"
nyatla 7:2b33a8d84eb3 33 #include "../../NyLPC_cNet.h"
nyatla 7:2b33a8d84eb3 34
nyatla 27:eb66b517efe6 35 #define MOD_VERSION "ModMiMicSetting/1.2"
nyatla 2:b96c1e90d120 36 #define SIZE_OF_SETUP_PARAM 7
nyatla 2:b96c1e90d120 37 struct TModMiMicSettingRequest
nyatla 2:b96c1e90d120 38 {
nyatla 2:b96c1e90d120 39 struct NyLPC_THttpBasicHeader super;
nyatla 2:b96c1e90d120 40 NyLPC_TUInt8 _content_id;
nyatla 2:b96c1e90d120 41 //解析用
nyatla 2:b96c1e90d120 42 NyLPC_TUInt8 _qery_name_id;
nyatla 2:b96c1e90d120 43 NyLPC_TUInt8 _astate;
nyatla 2:b96c1e90d120 44 NyLPC_TInt16 _prefix_len;
nyatla 2:b96c1e90d120 45 NyLPC_TcStr_t _tstr;
nyatla 2:b96c1e90d120 46 NyLPC_TChar _tstr_buf[16];
nyatla 2:b96c1e90d120 47 /** 文字列のパーサ*/
nyatla 2:b96c1e90d120 48 NyLPC_TcMiMicDbCompiler_t _binparser;
nyatla 2:b96c1e90d120 49 union{
nyatla 2:b96c1e90d120 50 struct{
nyatla 2:b96c1e90d120 51 /**pパラメータ。最大長さは16。長さ6であること。
nyatla 2:b96c1e90d120 52 * [0]:MACAddrの、[0][1][2][3]
nyatla 2:b96c1e90d120 53 * [1]:MACAddrの、[4][5][X][X]
nyatla 2:b96c1e90d120 54 * [2]:IPAddr(Networkorder)
nyatla 2:b96c1e90d120 55 * [3]:Subnetmask(Networkorder)
nyatla 2:b96c1e90d120 56 * [4]:Defaultgateway
nyatla 2:b96c1e90d120 57 * [5]:[0:port0][1:port1][X][X]
nyatla 2:b96c1e90d120 58 * [6]:accessmode [0:AC1][1:AC2][X][X]
nyatla 2:b96c1e90d120 59 */
nyatla 2:b96c1e90d120 60 NyLPC_TUInt32 param_buf[SIZE_OF_SETUP_PARAM];
nyatla 2:b96c1e90d120 61 NyLPC_TUInt16 param_len;
nyatla 2:b96c1e90d120 62 NyLPC_TUInt32 cval;//コマンド値
nyatla 2:b96c1e90d120 63 }setup;
nyatla 2:b96c1e90d120 64 struct{
nyatla 2:b96c1e90d120 65 /**
nyatla 2:b96c1e90d120 66 * 不明な名前の場合は、ここに名前をコピー
nyatla 2:b96c1e90d120 67 */
nyatla 2:b96c1e90d120 68 NyLPC_TChar path[32];
nyatla 2:b96c1e90d120 69 }unknown;
nyatla 2:b96c1e90d120 70 }content;
nyatla 2:b96c1e90d120 71 };
nyatla 2:b96c1e90d120 72
nyatla 2:b96c1e90d120 73
nyatla 2:b96c1e90d120 74 static NyLPC_TBool messageHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const NyLPC_TChar* i_name,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 2:b96c1e90d120 75 {
nyatla 2:b96c1e90d120 76 (void)i_inst;
nyatla 2:b96c1e90d120 77 (void)i_name;
nyatla 2:b96c1e90d120 78 (void)i_c;
nyatla 2:b96c1e90d120 79 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 80 }
nyatla 2:b96c1e90d120 81
nyatla 2:b96c1e90d120 82 #define ST_PARSE_PATH 1
nyatla 2:b96c1e90d120 83 #define ST_PARSE_QUERY_NAME 2
nyatla 2:b96c1e90d120 84 #define ST_PARSE_QUERY_VALUE 3 //Query読み出し中
nyatla 2:b96c1e90d120 85 #define ST_PARSE_QUERY_VALUE_P 4
nyatla 2:b96c1e90d120 86 #define ST_PARSE_QUERY_VALUE_C 5
nyatla 2:b96c1e90d120 87 /**
nyatla 2:b96c1e90d120 88 * コンテンツID定義(コンテンツ名に対応)
nyatla 2:b96c1e90d120 89 */
nyatla 2:b96c1e90d120 90 #define CONTENT_ID_UNKNOWN 1
nyatla 2:b96c1e90d120 91 #define CONTENT_ID_SETUP 2
nyatla 2:b96c1e90d120 92 #define CONTENT_ID_INDEX 3
nyatla 2:b96c1e90d120 93 #define CONTENT_ID_STATUS 4
nyatla 2:b96c1e90d120 94 #define CONTENT_ID_CSS 5
nyatla 2:b96c1e90d120 95 #define CONTENT_ID_LOGO 6
nyatla 2:b96c1e90d120 96
nyatla 2:b96c1e90d120 97 #define QNAME_ID_P 4
nyatla 2:b96c1e90d120 98 #define QNAME_ID_C 5
nyatla 2:b96c1e90d120 99 #define QNAME_ID_UNKNOWN 0
nyatla 2:b96c1e90d120 100
nyatla 2:b96c1e90d120 101 #define QVAL_C_GET 1
nyatla 2:b96c1e90d120 102 #define QVAL_C_UPDATE 2
nyatla 2:b96c1e90d120 103 #define QVAL_C_UNKNOWN 0
nyatla 2:b96c1e90d120 104
nyatla 2:b96c1e90d120 105
nyatla 2:b96c1e90d120 106 static const struct NyLPC_TTextIdTbl url_tbl[]=
nyatla 2:b96c1e90d120 107 {
nyatla 2:b96c1e90d120 108 {"setup.api",CONTENT_ID_SETUP},
nyatla 2:b96c1e90d120 109 {NULL,CONTENT_ID_UNKNOWN}
nyatla 2:b96c1e90d120 110 };
nyatla 2:b96c1e90d120 111
nyatla 2:b96c1e90d120 112 static const struct NyLPC_TTextIdTbl qname_id_table[]=
nyatla 2:b96c1e90d120 113 {
nyatla 2:b96c1e90d120 114 {"p",QNAME_ID_P},
nyatla 2:b96c1e90d120 115 {"c",QNAME_ID_C},
nyatla 2:b96c1e90d120 116 {NULL,QNAME_ID_UNKNOWN}
nyatla 2:b96c1e90d120 117 };
nyatla 2:b96c1e90d120 118
nyatla 2:b96c1e90d120 119
nyatla 2:b96c1e90d120 120
nyatla 2:b96c1e90d120 121
nyatla 2:b96c1e90d120 122 static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 2:b96c1e90d120 123 {
nyatla 2:b96c1e90d120 124
nyatla 2:b96c1e90d120 125 struct TModMiMicSettingRequest* out=(struct TModMiMicSettingRequest*)o_out;
nyatla 2:b96c1e90d120 126 //読み飛ばし
nyatla 2:b96c1e90d120 127 if(out->_prefix_len<0){
nyatla 2:b96c1e90d120 128 out->_prefix_len++;
nyatla 2:b96c1e90d120 129 return NyLPC_TBool_TRUE;//読み飛ばし
nyatla 2:b96c1e90d120 130 }
nyatla 2:b96c1e90d120 131 if(out->_astate==ST_PARSE_PATH){
nyatla 2:b96c1e90d120 132 if(i_c!='\0' && i_c!='?'){
nyatla 2:b96c1e90d120 133 if(!NyLPC_cStr_put(&(out->_tstr),i_c)){
nyatla 2:b96c1e90d120 134 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 135 }
nyatla 2:b96c1e90d120 136 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 137 }
nyatla 2:b96c1e90d120 138 out->_content_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),url_tbl);
nyatla 2:b96c1e90d120 139 switch(out->_content_id)
nyatla 2:b96c1e90d120 140 {
nyatla 2:b96c1e90d120 141 case CONTENT_ID_SETUP:
nyatla 2:b96c1e90d120 142 out->content.setup.param_len=0;
nyatla 2:b96c1e90d120 143 out->content.setup.cval=QVAL_C_UNKNOWN;
nyatla 2:b96c1e90d120 144 break;
nyatla 2:b96c1e90d120 145 default:
nyatla 2:b96c1e90d120 146 break;
nyatla 2:b96c1e90d120 147 }
nyatla 2:b96c1e90d120 148 NyLPC_cStr_clear(&(out->_tstr));
nyatla 2:b96c1e90d120 149 out->_astate=ST_PARSE_QUERY_NAME;//クエリ名解析へ
nyatla 2:b96c1e90d120 150 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 151 }
nyatla 2:b96c1e90d120 152 switch(out->_content_id)
nyatla 2:b96c1e90d120 153 {
nyatla 2:b96c1e90d120 154 case CONTENT_ID_SETUP:
nyatla 2:b96c1e90d120 155 switch(out->_astate){
nyatla 2:b96c1e90d120 156 case ST_PARSE_QUERY_NAME:
nyatla 2:b96c1e90d120 157 if(i_c!='\0' && i_c!='&' && i_c!='='){
nyatla 2:b96c1e90d120 158 if(!NyLPC_cStr_put(&(out->_tstr),i_c)){
nyatla 2:b96c1e90d120 159 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 160 }
nyatla 2:b96c1e90d120 161 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 162 }
nyatla 2:b96c1e90d120 163 //Query確定。
nyatla 2:b96c1e90d120 164 out->_qery_name_id=NyLPC_TTextIdTbl_getMatchId(NyLPC_cStr_str(&(out->_tstr)),qname_id_table);
nyatla 2:b96c1e90d120 165 NyLPC_cStr_clear(&(out->_tstr));
nyatla 2:b96c1e90d120 166 //クエリ値がある場合
nyatla 2:b96c1e90d120 167 switch(out->_qery_name_id){
nyatla 2:b96c1e90d120 168 case QNAME_ID_P:
nyatla 2:b96c1e90d120 169 out->_astate=ST_PARSE_QUERY_VALUE_P;//MIMICBCのDBパラメータパーサを借用。
nyatla 2:b96c1e90d120 170 out->content.setup.param_len=0;
nyatla 2:b96c1e90d120 171 break;
nyatla 2:b96c1e90d120 172 case QNAME_ID_C:
nyatla 2:b96c1e90d120 173 out->_astate=ST_PARSE_QUERY_VALUE_C;
nyatla 2:b96c1e90d120 174 break;
nyatla 2:b96c1e90d120 175 default:
nyatla 2:b96c1e90d120 176 out->_astate=ST_PARSE_QUERY_VALUE;
nyatla 2:b96c1e90d120 177 break;
nyatla 2:b96c1e90d120 178 }
nyatla 2:b96c1e90d120 179 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 180 case ST_PARSE_QUERY_VALUE:
nyatla 2:b96c1e90d120 181 //未知のクエリは無視
nyatla 2:b96c1e90d120 182 if(i_c!='\0' && i_c!='&'){
nyatla 2:b96c1e90d120 183 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 184 }
nyatla 2:b96c1e90d120 185 //クエリ値解析完了
nyatla 2:b96c1e90d120 186 out->_astate=ST_PARSE_QUERY_NAME;
nyatla 2:b96c1e90d120 187 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 188 case ST_PARSE_QUERY_VALUE_C:
nyatla 2:b96c1e90d120 189 if(i_c!='\0' && i_c!='&'){
nyatla 2:b96c1e90d120 190 if(!NyLPC_cStr_put(&(out->_tstr),i_c)){
nyatla 2:b96c1e90d120 191 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 192 }
nyatla 2:b96c1e90d120 193 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 194 }
nyatla 2:b96c1e90d120 195 if(NyLPC_cStr_isEqual(&out->_tstr,"get")){
nyatla 2:b96c1e90d120 196 out->content.setup.cval=QVAL_C_GET;
nyatla 2:b96c1e90d120 197 }else if(NyLPC_cStr_isEqual(&out->_tstr,"update")){
nyatla 2:b96c1e90d120 198 out->content.setup.cval=QVAL_C_UPDATE;
nyatla 2:b96c1e90d120 199 }else{
nyatla 2:b96c1e90d120 200 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 201 }
nyatla 2:b96c1e90d120 202 out->_astate=ST_PARSE_QUERY_NAME;
nyatla 2:b96c1e90d120 203 NyLPC_cStr_clear(&(out->_tstr));
nyatla 2:b96c1e90d120 204 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 205 case ST_PARSE_QUERY_VALUE_P:
nyatla 2:b96c1e90d120 206 if(i_c!='\0' && i_c!='&'){
nyatla 2:b96c1e90d120 207 if(out->content.setup.param_len>=SIZE_OF_SETUP_PARAM)
nyatla 2:b96c1e90d120 208 {
nyatla 2:b96c1e90d120 209 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 210 }
nyatla 2:b96c1e90d120 211 switch(NyLPC_cMiMicDbCompiler_compileFragment2(&(out->_binparser),i_c,out->content.setup.param_buf+out->content.setup.param_len))
nyatla 2:b96c1e90d120 212 {
nyatla 2:b96c1e90d120 213 case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:
nyatla 2:b96c1e90d120 214 break;
nyatla 2:b96c1e90d120 215 case NyLPC_TcMiMicDbCompiler_RET_OK:
nyatla 2:b96c1e90d120 216 out->content.setup.param_len++;
nyatla 2:b96c1e90d120 217 break;
nyatla 2:b96c1e90d120 218 case NyLPC_TcMiMicDbCompiler_RET_ERROR:
nyatla 2:b96c1e90d120 219 default:
nyatla 2:b96c1e90d120 220 //ERROR
nyatla 2:b96c1e90d120 221 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 222 }
nyatla 2:b96c1e90d120 223 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 224 }
nyatla 2:b96c1e90d120 225 //区切りのいいところで終わってる?
nyatla 2:b96c1e90d120 226 if(NyLPC_cMiMicDbCompiler_hasFragment(&(out->_binparser))){
nyatla 2:b96c1e90d120 227 //ERROR
nyatla 2:b96c1e90d120 228 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 229 }
nyatla 2:b96c1e90d120 230 //終端しているなら、次のクエリへ
nyatla 2:b96c1e90d120 231 out->_astate=ST_PARSE_QUERY_NAME;
nyatla 2:b96c1e90d120 232 NyLPC_cStr_clear(&(out->_tstr));
nyatla 2:b96c1e90d120 233 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 234 default:
nyatla 2:b96c1e90d120 235 break;
nyatla 2:b96c1e90d120 236 }
nyatla 2:b96c1e90d120 237 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 238 default:
nyatla 2:b96c1e90d120 239 NyLPC_OnErrorGoto(ERROR);
nyatla 2:b96c1e90d120 240 }
nyatla 2:b96c1e90d120 241 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 242 ERROR:
nyatla 2:b96c1e90d120 243 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 244 }
nyatla 2:b96c1e90d120 245 /**
nyatla 2:b96c1e90d120 246 * デフォルトハンドラ
nyatla 2:b96c1e90d120 247 */
nyatla 2:b96c1e90d120 248 static const struct NyLPC_TcHttpBasicHeaderParser_Handler handler=
nyatla 2:b96c1e90d120 249 {
nyatla 2:b96c1e90d120 250 messageHandler,
nyatla 2:b96c1e90d120 251 urlHandler
nyatla 2:b96c1e90d120 252 };
nyatla 2:b96c1e90d120 253
nyatla 2:b96c1e90d120 254
nyatla 2:b96c1e90d120 255 /**
nyatla 2:b96c1e90d120 256 * コンストラクタ。
nyatla 2:b96c1e90d120 257 */
nyatla 2:b96c1e90d120 258 void NyLPC_cModMiMicSetting_initialize(NyLPC_TcModMiMicSetting_t* i_inst,const NyLPC_TChar* i_ref_root_path)
nyatla 2:b96c1e90d120 259 {
nyatla 2:b96c1e90d120 260 NyLPC_cModRomFiles_initialize(&i_inst->super,i_ref_root_path,NULL,0);
nyatla 2:b96c1e90d120 261 }
nyatla 2:b96c1e90d120 262 void NyLPC_cModMiMicSetting_finalize(NyLPC_TcModMiMicSetting_t* i_inst)
nyatla 2:b96c1e90d120 263 {
nyatla 2:b96c1e90d120 264 NyLPC_cModRomFiles_finalize(&i_inst->super);
nyatla 2:b96c1e90d120 265 }
nyatla 2:b96c1e90d120 266 /**
nyatla 2:b96c1e90d120 267 * モジュールがコネクションをハンドリングできるかを返します。
nyatla 2:b96c1e90d120 268 */
nyatla 2:b96c1e90d120 269 NyLPC_TBool NyLPC_cModMiMicSetting_canHandle(NyLPC_TcModMiMicSetting_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)
nyatla 2:b96c1e90d120 270 {
nyatla 2:b96c1e90d120 271 return NyLPC_cModRomFiles_canHandle(&i_inst->super,i_connection);
nyatla 2:b96c1e90d120 272 }
nyatla 2:b96c1e90d120 273
nyatla 2:b96c1e90d120 274
nyatla 2:b96c1e90d120 275
nyatla 2:b96c1e90d120 276 static void setup_proc(NyLPC_TcHttpdConnection_t* i_connection,struct TModMiMicSettingRequest* i_req);
nyatla 2:b96c1e90d120 277
nyatla 2:b96c1e90d120 278 /**
nyatla 2:b96c1e90d120 279 * モジュールを実行します。
nyatla 2:b96c1e90d120 280 */
nyatla 2:b96c1e90d120 281 NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModMiMicSetting_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)
nyatla 2:b96c1e90d120 282 {
nyatla 19:33b9ba0859ee 283 NyLPC_TUInt8 method_type;
nyatla 2:b96c1e90d120 284 struct TModMiMicSettingRequest header;
nyatla 2:b96c1e90d120 285 NyLPC_TcHttpBasicHeaderParser_t parser;
nyatla 19:33b9ba0859ee 286
nyatla 2:b96c1e90d120 287 //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)
nyatla 2:b96c1e90d120 288 NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);
nyatla 2:b96c1e90d120 289
nyatla 2:b96c1e90d120 290 //URL解析の準備
nyatla 7:2b33a8d84eb3 291 header._prefix_len=-((NyLPC_TInt16)strlen(i_inst->super._ref_root_path)+2);
nyatla 2:b96c1e90d120 292 header._astate=ST_PARSE_PATH;
nyatla 2:b96c1e90d120 293 NyLPC_cStr_initialize(&header._tstr,header._tstr_buf,16);
nyatla 2:b96c1e90d120 294 NyLPC_cMiMicDbCompiler_initialize(&header._binparser);
nyatla 2:b96c1e90d120 295
nyatla 2:b96c1e90d120 296 NyLPC_cHttpBasicHeaderParser_initialize(&parser,&handler);
nyatla 2:b96c1e90d120 297 //プリフェッチしたデータを流す
nyatla 2:b96c1e90d120 298 NyLPC_cHttpBasicHeaderParser_parseInit(&parser,&(header.super));
nyatla 2:b96c1e90d120 299 NyLPC_cHttpdConnection_pushPrefetchInfo(i_connection,&parser,&header.super);
nyatla 2:b96c1e90d120 300 //後続をストリームから取り込む
nyatla 2:b96c1e90d120 301 if(!NyLPC_cHttpBasicHeaderParser_parseStream(&parser,NyLPC_cHttpdConnection_refStream(i_connection),&(header.super))){
nyatla 19:33b9ba0859ee 302 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 2:b96c1e90d120 303 NyLPC_OnErrorGoto(Error2);
nyatla 2:b96c1e90d120 304 }
nyatla 2:b96c1e90d120 305 if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&parser,&(header.super))){
nyatla 19:33b9ba0859ee 306 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 2:b96c1e90d120 307 NyLPC_OnErrorGoto(Error2);
nyatla 2:b96c1e90d120 308 }
nyatla 19:33b9ba0859ee 309 //GETかHEADに制限
nyatla 19:33b9ba0859ee 310 method_type=NyLPC_cHttpdConnection_getMethod(i_connection);
nyatla 19:33b9ba0859ee 311 if(method_type!=NyLPC_THttpMethodType_GET && method_type!=NyLPC_THttpMethodType_HEAD)
nyatla 2:b96c1e90d120 312 {
nyatla 19:33b9ba0859ee 313 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);
nyatla 19:33b9ba0859ee 314 NyLPC_OnErrorGoto(Error2);
nyatla 2:b96c1e90d120 315 }
nyatla 2:b96c1e90d120 316 //Connection Modeの設定 1.1 && !closeの場合はCONTINUE
nyatla 2:b96c1e90d120 317 if(header.super.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE && header.super.startline.req.version==NyLPC_THttpVersion_11)
nyatla 2:b96c1e90d120 318 {
nyatla 2:b96c1e90d120 319 NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);
nyatla 2:b96c1e90d120 320 }
nyatla 2:b96c1e90d120 321 //CGIの実行
nyatla 2:b96c1e90d120 322 switch(header._content_id)
nyatla 2:b96c1e90d120 323 {
nyatla 2:b96c1e90d120 324 case CONTENT_ID_SETUP:
nyatla 2:b96c1e90d120 325 setup_proc(i_connection,&header);
nyatla 2:b96c1e90d120 326 break;
nyatla 2:b96c1e90d120 327 case CONTENT_ID_UNKNOWN:
nyatla 2:b96c1e90d120 328 default:
nyatla 19:33b9ba0859ee 329 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 2:b96c1e90d120 330 NyLPC_OnErrorGoto(Error2);
nyatla 2:b96c1e90d120 331 }
nyatla 2:b96c1e90d120 332 NyLPC_cHttpBasicHeaderParser_finalize(&parser);
nyatla 2:b96c1e90d120 333 NyLPC_cMiMicDbCompiler_finalize(&header._binparser);
nyatla 2:b96c1e90d120 334 NyLPC_cStr_finalize(&(header._tstr));
nyatla 2:b96c1e90d120 335 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 336 Error2:
nyatla 2:b96c1e90d120 337 NyLPC_cHttpBasicHeaderParser_finalize(&parser);
nyatla 2:b96c1e90d120 338 NyLPC_cMiMicDbCompiler_finalize(&header._binparser);
nyatla 2:b96c1e90d120 339 NyLPC_cStr_finalize(&(header._tstr));
nyatla 19:33b9ba0859ee 340
nyatla 2:b96c1e90d120 341 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 342 }
nyatla 2:b96c1e90d120 343
nyatla 2:b96c1e90d120 344
nyatla 2:b96c1e90d120 345 static void setup_proc(NyLPC_TcHttpdConnection_t* i_connection,struct TModMiMicSettingRequest* i_req)
nyatla 2:b96c1e90d120 346 {
nyatla 2:b96c1e90d120 347 NyLPC_TBool ret;
nyatla 2:b96c1e90d120 348 const struct NyLPC_TMimicConfigulation* config;
nyatla 2:b96c1e90d120 349 struct NyLPC_TMimicConfigulation cfg_image;
nyatla 21:f2a70f15301f 350 const NyLPC_TcIPv4Config_t* currebt_cfg;
nyatla 19:33b9ba0859ee 351 NyLPC_Assert(
nyatla 19:33b9ba0859ee 352 (NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET)||
nyatla 19:33b9ba0859ee 353 (NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_HEAD));
nyatla 2:b96c1e90d120 354
nyatla 2:b96c1e90d120 355 switch(i_req->content.setup.cval){
nyatla 2:b96c1e90d120 356 case QVAL_C_GET:
nyatla 14:4618692ec239 357 if(!NyLPC_cHttpdUtils_sendJsonHeader(i_connection)){
nyatla 2:b96c1e90d120 358 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 359 }
nyatla 19:33b9ba0859ee 360 if(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET){
nyatla 19:33b9ba0859ee 361 config=NyLPC_cMiMicConfiglation_loadFromFlash();
nyatla 19:33b9ba0859ee 362 //JSONを書く。
nyatla 19:33b9ba0859ee 363 if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 21:f2a70f15301f 364 "{"
nyatla 21:f2a70f15301f 365 "\"application\":\""MOD_VERSION";"NyLPC_cMiMicEnv_VERSION";%s\","
nyatla 21:f2a70f15301f 366 "\"mac00010203\":%u,"
nyatla 21:f2a70f15301f 367 "\"mac0405xxxx\":%u,"
nyatla 21:f2a70f15301f 368 "\"ip\":%u,"
nyatla 21:f2a70f15301f 369 "\"mask\":%u,"
nyatla 21:f2a70f15301f 370 "\"droute\":%u,"
nyatla 21:f2a70f15301f 371 "\"port\":%u,"
nyatla 21:f2a70f15301f 372 "\"access\":%u,",
nyatla 19:33b9ba0859ee 373 NyLPC_cNet_PlatformName,
nyatla 19:33b9ba0859ee 374 config->mac_00_01_02_03,
nyatla 19:33b9ba0859ee 375 config->mac_04_05_xx_xx,
nyatla 19:33b9ba0859ee 376 config->ipv4_addr_net,
nyatla 19:33b9ba0859ee 377 config->ipv4_mask_net,
nyatla 19:33b9ba0859ee 378 config->ipv4_drut_net,
nyatla 19:33b9ba0859ee 379 config->ipv4_port,
nyatla 19:33b9ba0859ee 380 config->accessmode
nyatla 19:33b9ba0859ee 381 )){
nyatla 19:33b9ba0859ee 382 NyLPC_OnErrorGoto(Error);
nyatla 19:33b9ba0859ee 383 }
nyatla 27:eb66b517efe6 384 //write current status
nyatla 21:f2a70f15301f 385 currebt_cfg=NyLPC_cUipService_refCurrentConfig();
nyatla 21:f2a70f15301f 386 if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 27:eb66b517efe6 387 "\"info\":{"
nyatla 27:eb66b517efe6 388 "\"landev\":\"%s\","
nyatla 21:f2a70f15301f 389 "\"mac00010203\":%u,"
nyatla 21:f2a70f15301f 390 "\"mac0405xxxx\":%u,"
nyatla 21:f2a70f15301f 391 "\"ip\":%u,"
nyatla 21:f2a70f15301f 392 "\"mask\":%u,"
nyatla 21:f2a70f15301f 393 "\"droute\":%u"
nyatla 21:f2a70f15301f 394 "}}",
nyatla 27:eb66b517efe6 395 NyLPC_cUipService_refDeviceName(),
nyatla 21:f2a70f15301f 396 (currebt_cfg->eth_mac.addr[0]<<24)|(currebt_cfg->eth_mac.addr[1]<<16)|(currebt_cfg->eth_mac.addr[2]<<8)|currebt_cfg->eth_mac.addr[3],
nyatla 21:f2a70f15301f 397 (currebt_cfg->eth_mac.addr[4]<<24)|(currebt_cfg->eth_mac.addr[5]<<16),
nyatla 21:f2a70f15301f 398 NyLPC_ntohl(currebt_cfg->ip_addr.v),
nyatla 21:f2a70f15301f 399 NyLPC_ntohl(currebt_cfg->netmask.v),
nyatla 21:f2a70f15301f 400 NyLPC_ntohl(currebt_cfg->dr_addr.v)
nyatla 21:f2a70f15301f 401 )){
nyatla 21:f2a70f15301f 402 NyLPC_OnErrorGoto(Error);
nyatla 21:f2a70f15301f 403 }
nyatla 2:b96c1e90d120 404 }
nyatla 2:b96c1e90d120 405 break;
nyatla 2:b96c1e90d120 406 case QVAL_C_UPDATE:
nyatla 2:b96c1e90d120 407 //check parameter length
nyatla 2:b96c1e90d120 408 if(i_req->content.setup.param_len!=SIZE_OF_SETUP_PARAM)
nyatla 2:b96c1e90d120 409 {
nyatla 19:33b9ba0859ee 410 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 2:b96c1e90d120 411 }else{
nyatla 2:b96c1e90d120 412 //パラメータ→ROMイメージ変換
nyatla 2:b96c1e90d120 413 cfg_image.fast_boot=0xffffffff;
nyatla 2:b96c1e90d120 414 cfg_image.mac_00_01_02_03=(i_req->content.setup.param_buf[0]);
nyatla 2:b96c1e90d120 415 cfg_image.mac_04_05_xx_xx=(i_req->content.setup.param_buf[1]&0xffff0000);
nyatla 2:b96c1e90d120 416 cfg_image.ipv4_addr_net =i_req->content.setup.param_buf[2];
nyatla 2:b96c1e90d120 417 cfg_image.ipv4_mask_net =i_req->content.setup.param_buf[3];
nyatla 2:b96c1e90d120 418 cfg_image.ipv4_drut_net =i_req->content.setup.param_buf[4];
nyatla 2:b96c1e90d120 419 cfg_image.ipv4_port =(NyLPC_TUInt16)(i_req->content.setup.param_buf[5]>>16);
nyatla 2:b96c1e90d120 420 cfg_image.accessmode=(i_req->content.setup.param_buf[6]);
nyatla 2:b96c1e90d120 421 //一応確認。
nyatla 2:b96c1e90d120 422 if((cfg_image.ipv4_port==0)|| (cfg_image.accessmode & 0xFEFE0000)!=0x00000000){
nyatla 19:33b9ba0859ee 423 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 2:b96c1e90d120 424 }else{
nyatla 2:b96c1e90d120 425 //FreeRTOSの停止
nyatla 2:b96c1e90d120 426 NyLPC_cIsr_enterCritical();
nyatla 2:b96c1e90d120 427 //Flashへの書き込み
nyatla 2:b96c1e90d120 428 ret=NyLPC_cMiMicConfiglation_updateConfigulation(&cfg_image);
nyatla 2:b96c1e90d120 429 //FreeRTOSの復帰
nyatla 2:b96c1e90d120 430 NyLPC_cIsr_exitCritical();
nyatla 2:b96c1e90d120 431 if(!ret){
nyatla 19:33b9ba0859ee 432 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);
nyatla 2:b96c1e90d120 433 }else{
nyatla 14:4618692ec239 434 if(!NyLPC_cHttpdUtils_sendJsonHeader(i_connection)){
nyatla 2:b96c1e90d120 435 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 436 }
nyatla 19:33b9ba0859ee 437 if(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET){
nyatla 19:33b9ba0859ee 438 NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,
nyatla 19:33b9ba0859ee 439 "{\"application\":\""MOD_VERSION";%s\",\"result\":%u}",
nyatla 19:33b9ba0859ee 440 NyLPC_cNet_PlatformName,ret?0x00000000:0x80000000);
nyatla 19:33b9ba0859ee 441 }
nyatla 2:b96c1e90d120 442 }
nyatla 2:b96c1e90d120 443 }
nyatla 2:b96c1e90d120 444 }
nyatla 2:b96c1e90d120 445 //JSONを書く。
nyatla 2:b96c1e90d120 446 break;
nyatla 2:b96c1e90d120 447 default:
nyatla 19:33b9ba0859ee 448 NyLPC_cHttpdUtils_sendErrorResponse(i_connection,400);
nyatla 2:b96c1e90d120 449 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 450 break;
nyatla 2:b96c1e90d120 451 }
nyatla 2:b96c1e90d120 452 return;
nyatla 2:b96c1e90d120 453 Error:
nyatla 2:b96c1e90d120 454 return;
nyatla 2:b96c1e90d120 455 }