OSDN Git Service

backup
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Mon, 11 Mar 2013 13:17:02 +0000 (13:17 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Mon, 11 Mar 2013 13:17:02 +0000 (13:17 +0000)
ShortURL,RomFSの基本動作確認

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@199 47198e57-cb75-475f-84c4-a814cd6f29e0

27 files changed:
lib/src/flash/NyLPC_cMiMicConfiglation.c [new file with mode: 0644]
lib/src/flash/NyLPC_cMiMicConfiglation.h [new file with mode: 0644]
lib/src/http/NyLPC_cHttpHeaderWriter.c
lib/src/http/NyLPC_cHttpHeaderWriter.h
lib/src/net/NyLPC_cNetConfig.c
lib/src/net/NyLPC_cNetConfig.h
lib/src/net/httpd/NyLPC_cHttpd.c
lib/src/net/httpd/NyLPC_cHttpd.h
lib/src/net/httpd/NyLPC_cHttpdConnection.c
lib/src/net/httpd/NyLPC_cHttpdConnection.h
lib/src/net/httpd/NyLPC_cHttpdConnection_protected.h
lib/src/net/httpd/NyLPC_cHttpdThread.c
lib/src/net/httpd/NyLPC_cHttpdThread.h
lib/src/net/httpd/NyLPC_cHttpdThread_protected.h [new file with mode: 0644]
lib/src/net/httpd/NyLPC_cHttpd_protected.h [new file with mode: 0644]
lib/src/net/httpd/mod/NyLPC_cModMiMicSetting.c
lib/src/net/httpd/mod/NyLPC_cModMiMicSetting.h
lib/src/net/httpd/mod/NyLPC_cModRemoteMcu.c
lib/src/net/httpd/mod/NyLPC_cModRomFiles.c
lib/src/net/httpd/mod/NyLPC_cModRomFiles.h
lib/src/net/httpd/mod/NyLPC_cModRomFiles_protected.h
lib/src/net/httpd/mod/NyLPC_cModShortUrl.c
projects/example/ledflash/src/sketch.c [new file with mode: 0644]
projects/example/sample.net.simplehttpd/src/sketch.c
projects/example/sample.romfsmod/src/fsdata.c [new file with mode: 0644]
projects/example/sample.romfsmod/src/sketch.c [new file with mode: 0644]
projects/example/test.tcprto/src/sketch.c [new file with mode: 0644]

diff --git a/lib/src/flash/NyLPC_cMiMicConfiglation.c b/lib/src/flash/NyLPC_cMiMicConfiglation.c
new file mode 100644 (file)
index 0000000..e9b294d
--- /dev/null
@@ -0,0 +1,110 @@
+#include "NyLPC_flash.h"\r
+#include "NyLPC_httpService.h"\r
+#include "NyLPC_cMiMicConfiglation.h"\r
+\r
+/**\r
+ * Onchip flashを使ったコンフィギュレーション保存システムです。\r
+ */\r
+\r
+\r
+\r
+\r
+#define IP2Int(a0,a1,a2,a3) ((0xff000000&(a0<<24))|(0x00ff0000&(a1<<16))|(0x0000ff00&(a2<<8))|(0x000000ff&(a3)))\r
+/**\r
+ * コンフィギュレーションの保存セクタ\r
+ */\r
+#define MIMIC_CONFIGLATION_FLASH_SECTOR 29\r
+#define MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR 0x00078000\r
+\r
+/**\r
+ * コンフィギュレーション値はホストオーダーで保存する。\r
+ */\r
+const struct NyLPC_TMimicConfigulation factory_default=\r
+{\r
+       0xffffffff,\r
+       0x02010203,0x0405ffff,\r
+       IP2Int(192,168,0,39),\r
+       IP2Int(255,255,255,0),\r
+       IP2Int(192,168,0,254),\r
+       80,\r
+       0x0000FFFF\r
+};\r
+\r
+static NyLPC_TBool setUserConfigulation(void);\r
+static NyLPC_TBool hasUserConfigulation(void);\r
+\r
+/**\r
+ * ユーザコンフィギュレーションを更新する。\r
+ * この関数をコールするときは、割込/FreeRTOSを一時停止すること。\r
+ */\r
+NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMimicConfigulation* i_congfiglation)\r
+{\r
+       NyLPC_TcOnchipFlashWriter_t s;\r
+       NyLPC_cOnchipFlashWriter_initialize(&s);\r
+       //イレース\r
+       if(!NyLPC_cOnchipFlashWriter_elase(&s,MIMIC_CONFIGLATION_FLASH_SECTOR,MIMIC_CONFIGLATION_FLASH_SECTOR)){\r
+               NyLPC_OnErrorGoto(Error);\r
+       }\r
+       //コンフィギュレーションを書き込む。\r
+       if(!NyLPC_cOnchipFlashWriter_writeSector(&s,MIMIC_CONFIGLATION_FLASH_SECTOR,0x00000000,i_congfiglation,sizeof(struct NyLPC_TMimicConfigulation))){\r
+               NyLPC_OnErrorGoto(Error);\r
+       }\r
+       //ユーザコンフィギュレーションをONにする。\r
+       if(setUserConfigulation()){\r
+               NyLPC_OnErrorGoto(Error);\r
+       }\r
+       NyLPC_cOnchipFlashWriter_finalize(&s);\r
+       return NyLPC_TBool_TRUE;\r
+Error:\r
+       NyLPC_cOnchipFlashWriter_finalize(&s);\r
+       return NyLPC_TBool_FALSE;\r
+}\r
+/**\r
+ * コンフィギュレーション値を返す。\r
+ */\r
+const struct NyLPC_TMimicConfigulation* NyLPC_cMiMicConfiglation_loadMiMicConfigulation(void)\r
+{\r
+       if(hasUserConfigulation()){\r
+               //userコンフィギュレーション読むよ\r
+               return (const struct NyLPC_TMimicConfigulation*)(MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR);\r
+       }else{\r
+               //Userコンフィギュレーションない\r
+               return &factory_default;\r
+       }\r
+}\r
+\r
+\r
+\r
+\r
+/**\r
+ * ユーザコンフィギュレーションが存在すると、true.\r
+ */\r
+static NyLPC_TBool hasUserConfigulation(void)\r
+{\r
+       volatile const NyLPC_TUInt32* fast_boot=&(factory_default.fast_boot);\r
+       return (*fast_boot)!=0xffffffff;\r
+}\r
+/**\r
+ * コンフィギュレーションモードを、ユーザコンフィギュレーションにセットする。\r
+ */\r
+static NyLPC_TBool setUserConfigulation(void)\r
+{\r
+       const NyLPC_TUInt32* volatile fast_boot=&(factory_default.fast_boot);\r
+       NyLPC_TUInt32 data=0xFFFFFFFE;\r
+       NyLPC_TcOnchipFlashWriter_t s;\r
+\r
+       if(*fast_boot==0xffffffff){\r
+               //フラグ値のアドレスが4バイトアライメントにあるFlashメモリか確認する。\r
+               if(((NyLPC_TUInt32)fast_boot)%4==0 && (!NyLPC_cOnchipFlashWriter_isOnchipFlash(fast_boot))){\r
+                       //書き込み\r
+                       NyLPC_cOnchipFlashWriter_initialize(&s);\r
+                       NyLPC_cOnchipFlashWriter_write(&s,fast_boot,&data,4);\r
+                       NyLPC_cOnchipFlashWriter_finalize(&s);\r
+               }else{\r
+                       //しくじった\r
+                       return NyLPC_TBool_FALSE;\r
+               }\r
+       }\r
+       return NyLPC_TBool_TRUE;\r
+}\r
+\r
diff --git a/lib/src/flash/NyLPC_cMiMicConfiglation.h b/lib/src/flash/NyLPC_cMiMicConfiglation.h
new file mode 100644 (file)
index 0000000..122564a
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+ * cConfiglationStorage.h\r
+ *\r
+ *  Created on: 2011/10/18\r
+ *      Author: nyatla\r
+ */\r
+\r
+#include "NyLPC_stdlib.h"\r
+#ifndef NYLPC_CCONFIGLATIONSTORAGE_H_\r
+#define NYLPC_CCONFIGLATIONSTORAGE_H_\r
+\r
+\r
+/**\r
+ * IPアドレスはネットワークオーダーで格納する。\r
+ */\r
+struct NyLPC_TMimicConfigulation{\r
+       /**\r
+        * ROM焼検出用。0xFFFFFFFFを書く\r
+        */\r
+       NyLPC_TUInt32   fast_boot;\r
+       NyLPC_TUInt32   mac_00_01_02_03;\r
+       NyLPC_TUInt32   mac_04_05_xx_xx;\r
+       NyLPC_TUInt32   ipv4_addr_net;\r
+       NyLPC_TUInt32   ipv4_mask_net;\r
+       NyLPC_TUInt32   ipv4_drut_net;\r
+       NyLPC_TUInt32   ipv4_port;\r
+       NyLPC_TUInt32   accessmode;\r
+};\r
+\r
+/**\r
+ * ユーザコンフィギュレーションを更新する。\r
+ * この関数は、RTOSが停止中に実行すること。\r
+ */\r
+NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMimicConfigulation* i_congfiglation);\r
+/**\r
+ * コンフィギュレーション値を返す。\r
+ * この関数は、RTOSが停止中に実行すること。\r
+ */\r
+const struct NyLPC_TMimicConfigulation* NyLPC_cMiMicConfiglation_loadMiMicConfigulation(void);\r
+\r
+\r
+#endif /* CCONFIGLATIONSTORAGE_H_ */\r
index 3a82735..5333d0e 100644 (file)
@@ -72,9 +72,9 @@ void NyLPC_cHttpHeaderWriter_setContentLength(NyLPC_TcHttpHeaderWriter_t* i_inst
        i_inst->_content_length=i_content_length;\r
        return;\r
 }\r
-void NyLPC_cHttpHeaderWriter_setClose(NyLPC_TcHttpHeaderWriter_t* i_inst)\r
+void NyLPC_cHttpHeaderWriter_setConnectionClose(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TBool i_is_close)\r
 {\r
-       i_inst->_is_close=NyLPC_TUInt8_TRUE;\r
+       i_inst->_is_close=i_is_close;\r
        return;\r
 }\r
 \r
index 715d01d..faa6706 100644 (file)
@@ -53,8 +53,10 @@ struct NyLPC_TcHttpHeaderWriter
 /**\r
  * Httpリクエストヘッダに対応したHttpヘッダライタを構築します。\r
  * インスタンスは、正常/異常の2状態を持ちます。\r
+ * <p>初期値について -\r
+ * ConnectionCloseは有効です。\r
+ * </p>\r
  */\r
-\r
 NyLPC_TBool NyLPC_cHttpHeaderWriter_initialize(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TcHttpStream_t* i_ref_stream,const struct NyLPC_THttpBasicHeader* i_req_header);\r
 \r
 #define NyLPC_cHttpHeaderWriter_finalize(i)\r
@@ -67,7 +69,10 @@ NyLPC_TBool NyLPC_cHttpHeaderWriter_writeMessage(NyLPC_TcHttpHeaderWriter_t* i_i
 NyLPC_TBool NyLPC_cHttpHeaderWriter_writeRawMessage(NyLPC_TcHttpHeaderWriter_t* i_inst,const NyLPC_TChar* i_additional_header);\r
 NyLPC_TBool NyLPC_cHttpHeaderWriter_close(NyLPC_TcHttpHeaderWriter_t* i_inst);\r
 void NyLPC_cHttpHeaderWriter_setContentLength(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TUInt32 i_content_length);\r
-void NyLPC_cHttpHeaderWriter_setClose(NyLPC_TcHttpHeaderWriter_t* i_inst);\r
+/**\r
+ * ConnectionCloseのON/OFFを設定します。\r
+ */\r
+void NyLPC_cHttpHeaderWriter_setConnectionClose(NyLPC_TcHttpHeaderWriter_t* i_inst,NyLPC_TBool i_is_close);\r
 void NyLPC_cHttpHeaderWriter_setChunked(NyLPC_TcHttpHeaderWriter_t* i_inst);\r
 \r
 #ifdef __cplusplus\r
index 3768939..e232508 100644 (file)
@@ -1,5 +1,5 @@
 #include "NyLPC_cNetConfig.h"\r
-#include "../flash/NyLPC_cOnchipFlashWriter.h"\r
+#include "../flash/NyLPC_cMiMicConfiglation.h"\r
 /**\r
  * IPアドレスはネットワークオーダーで格納する。\r
  * 構造体は4バイトアライメントであること。\r
@@ -24,36 +24,12 @@ struct TNetConfigMemMap
 //     NyLPC_TUInt32   accessmode;\r
 };\r
 \r
-#define IP2Int(a0,a1,a2,a3) ((0xff000000&(a0<<24))|(0x00ff0000&(a1<<16))|(0x0000ff00&(a2<<8))|(0x000000ff&(a3)))\r
-/**\r
- * コンフィギュレーションの保存セクタ\r
- */\r
-#define MIMIC_CONFIGLATION_FLASH_SECTOR 29\r
-#define MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR 0x00078000\r
-\r
-/**\r
- * コンフィギュレーション値はホストオーダーで保存する。\r
- */\r
-const struct TNetConfigMemMap factory_default=\r
-{\r
-       0xffffffff,\r
-       1,\r
-       NyLPC_cNetConfig_INTERFACE_TYPE_ETHERNET,\r
-       0x02010203,0x0405ffff,\r
-       IP2Int(192,168,0,39),\r
-       IP2Int(255,255,255,0),\r
-       IP2Int(192,168,0,254),\r
-//     80,\r
-//     0x0000FFFF\r
-};\r
-\r
-static NyLPC_TBool setUserConfigulation(void);\r
-static NyLPC_TBool hasUserConfigulation(void);\r
-static void loadFromMemory(NyLPC_TcNetConfig_t* i_inst,const struct TNetConfigMemMap* pdata);\r
+static void loadFromMemory(NyLPC_TcNetConfig_t* i_inst);\r
 \r
 void NyLPC_cNetConfig_initialize(NyLPC_TcNetConfig_t* i_inst)\r
 {\r
-       NyLPC_cNetConfig_loadFactoryDefault(i_inst);\r
+       loadFromMemory(i_inst);\r
+\r
 \r
 }\r
 \r
@@ -61,6 +37,7 @@ void NyLPC_cNetConfig_initialize(NyLPC_TcNetConfig_t* i_inst)
  * ユーザコンフィギュレーションを更新する。\r
  * この関数をコールするときは、割込/FreeRTOSを一時停止すること。\r
  */\r
+/*\r
 NyLPC_TBool NyLPC_cNetConfig_saveToOnchipFlash(NyLPC_TcNetConfig_t* i_inst)\r
 {\r
        NyLPC_TUInt8* pdata;\r
@@ -96,29 +73,13 @@ Error:
        NyLPC_cOnchipFlashWriter_finalize(&s);\r
        return NyLPC_TBool_FALSE;\r
 }\r
+*/\r
 \r
 \r
 \r
-NyLPC_TBool NyLPC_cNetConfig_loadFromOnchipFlash(NyLPC_TcNetConfig_t* i_inst)\r
-{\r
-       if(!hasUserConfigulation()){\r
-               //user configlationが無い場合\r
-               loadFromMemory(i_inst,&factory_default);\r
-       }else{\r
-               //user configlationが有る場合\r
-               loadFromMemory(i_inst,(const struct TNetConfigMemMap*)(MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR));\r
-       }\r
-       return NyLPC_TBool_TRUE;\r
-}\r
-void NyLPC_cNetConfig_loadFactoryDefault(NyLPC_TcNetConfig_t* i_inst)\r
-{\r
-       loadFromMemory(i_inst,&factory_default);\r
-       return;\r
-}\r
-\r
-\r
-static void loadFromMemory(NyLPC_TcNetConfig_t* i_inst,const struct TNetConfigMemMap* pdata)\r
+static void loadFromMemory(NyLPC_TcNetConfig_t* i_inst)\r
 {\r
+       const struct NyLPC_TMimicConfigulation* pdata=NyLPC_cMiMicConfiglation_loadMiMicConfigulation();\r
        NyLPC_TUInt8* ptr;\r
        //値の読み出し\r
        i_inst->version=1;\r
@@ -136,34 +97,5 @@ static void loadFromMemory(NyLPC_TcNetConfig_t* i_inst,const struct TNetConfigMe
        return;\r
 }\r
 \r
-/**\r
- * ユーザコンフィギュレーションが存在すると、true.\r
- */\r
-static NyLPC_TBool hasUserConfigulation(void)\r
-{\r
-       volatile const NyLPC_TUInt32* fast_boot=&(factory_default.fast_boot);\r
-       return (*fast_boot)!=0xffffffff;\r
-}\r
-/**\r
- * コンフィギュレーションモードを、ユーザコンフィギュレーションにセットする。\r
- */\r
-static NyLPC_TBool setUserConfigulation(void)\r
-{\r
-       const NyLPC_TUInt32* volatile fast_boot=&(factory_default.fast_boot);\r
-       NyLPC_TUInt32 data=0xFFFFFFFE;\r
-       NyLPC_TcOnchipFlashWriter_t s;\r
 \r
-       if(*fast_boot==0xffffffff){\r
-               //フラグ値のアドレスが4バイトアライメントにあるFlashメモリか確認する。\r
-               if(((NyLPC_TUInt32)fast_boot)%4==0 && (!NyLPC_cOnchipFlashWriter_isOnchipFlash(fast_boot))){\r
-                       //書き込み\r
-                       NyLPC_cOnchipFlashWriter_initialize(&s);\r
-                       NyLPC_cOnchipFlashWriter_write(&s,fast_boot,&data,4);\r
-                       NyLPC_cOnchipFlashWriter_finalize(&s);\r
-               }else{\r
-                       //しくじった\r
-                       return NyLPC_TBool_FALSE;\r
-               }\r
-       }\r
-       return NyLPC_TBool_TRUE;\r
-}\r
+\r
index 539ba12..efb98ec 100644 (file)
@@ -49,15 +49,5 @@ void NyLPC_cNetConfig_initialize(NyLPC_TcNetConfig_t* i_inst);
  * インスタンスを終期化します。\r
  */\r
 #define NyLPC_cNetConfig_finalize(i_inst);\r
-/**\r
- * オンチップフラッシュメモリから、ネットワーク設定値を読み出します。\r
- */\r
-NyLPC_TBool NyLPC_cNetConfig_loadFromOnchipFlash(NyLPC_TcNetConfig_t* i_inst);\r
-/**\r
- * オンチップフラッシュメモリへ、ネットワーク設定値を保存します。\r
- */\r
-NyLPC_TBool NyLPC_cNetConfig_saveToOnchipFlash(NyLPC_TcNetConfig_t* i_inst);\r
-\r
-void NyLPC_cNetConfig_loadFactoryDefault(NyLPC_TcNetConfig_t* i_inst);\r
 \r
 #endif /* NYLPC_CNETCONFIG_H_ */\r
index bcadc92..e526d0e 100644 (file)
@@ -1,4 +1,4 @@
-#include "NyLPC_cHttpd.h"\r
+#include "NyLPC_cHttpd_protected.h"\r
 \r
 \r
 \r
index 29e9830..261cee5 100644 (file)
@@ -1,17 +1,28 @@
-#include "NyLPC_stdlib.h"\r
-#include "NyLPC_uipService.h"\r
-#include "../NyLPC_cNetConfig.h"\r
-#include "NyLPC_cHttpdThread.h"\r
 \r
 #ifndef NYLPC_CHTTPD_H_\r
 #define NYLPC_CHTTPD_H_\r
 \r
+#include "NyLPC_stdlib.h"\r
+#include "../NyLPC_cNetConfig.h"\r
+#include "NyLPC_cHttpd.h"\r
+#include "NyLPC_cHttpdThread.h"\r
+#ifndef DEFINE_NyLPC_TcHttpdConnection_t\r
+       typedef struct NyLPC_TcHttpdConnection NyLPC_TcHttpdConnection_t;\r
+       #define DEFINE_NyLPC_TcHttpdConnection_t\r
+#endif\r
+\r
 \r
 \r
 #define NyLPC_cNet_NUMBER_OF_THREAD 2\r
-\r
 typedef void (*NyLPC_TcHttpd_onRequest)(NyLPC_TcHttpdConnection_t* i_inst);\r
 \r
+/**\r
+ * class definition\r
+ */\r
+#ifndef DEFINE_NyLPC_TcHttpd_t\r
+       typedef struct NyLPC_TcHttpd NyLPC_TcHttpd_t;\r
+       #define DEFINE_NyLPC_TcHttpd_t\r
+#endif\r
 struct NyLPC_TcHttpd\r
 {\r
        struct{\r
@@ -24,31 +35,12 @@ struct NyLPC_TcHttpd
 };\r
 \r
 \r
+\r
+\r
 void NyLPC_cHttpd_initialize(NyLPC_TcHttpd_t* i_inst,NyLPC_TUInt16 i_port_number);\r
 void NyLPC_cHttpd_finalize(NyLPC_TcHttpd_t* i_inst);\r
-\r
 void NyLPC_cHttpd_loop(NyLPC_TcHttpd_t* i_inst);\r
 \r
-//////\r
-//protected\r
-//////\r
-\r
-#define NyLPC_cHttpd_getNumOfConnection(i_inst) ((i_inst)->_num_of_active_connection)\r
-\r
-NyLPC_TUInt16 NyLPC_cHttpd_incNumOfConnection(NyLPC_TcHttpd_t* i_inst);\r
-\r
-NyLPC_TUInt16 NyLPC_cHttpd_decNumOfConnection(NyLPC_TcHttpd_t* i_inst);\r
-\r
-/**\r
-* Httpd全体で唯一のロックを取得する。\r
-*/\r
-void NyLPC_cHttpd_lock(NyLPC_TcHttpd_t* i_inst);\r
-\r
-/**\r
-* Httpd全体で唯一のロックを開放する。\r
-*/\r
-void NyLPC_cHttpd_unlock(NyLPC_TcHttpd_t* i_inst);\r
-\r
 \r
 \r
 \r
index 291a2a4..7d73346 100644 (file)
@@ -1,7 +1,7 @@
 #include "NyLPC_cHttpdConnection_protected.h"\r
 #include "../http/NyLPC_cHttpNullRequestHeaderParser.h"\r
 #include "./mod/NyLPC_cHttpModUtils_protected.h"\r
-#include "NyLPC_cHttpd.h"\r
+#include "./NyLPC_cHttpd_protected.h"\r
 \r
 \r
 \r
@@ -26,6 +26,10 @@ const NyLPC_TChar* NyLPC_cHttpdConnection_getUrlPrefix(const NyLPC_TcHttpdConnec
 {\r
        return NyLPC_cHttpRequestPrefixParser_getUrlPrefix(&i_inst->_pparser);\r
 }\r
+void NyLPC_cHttpdConnection_setReqStatusParsed(NyLPC_TcHttpdConnection_t* i_inst)\r
+{\r
+       i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_END;\r
+}\r
 \r
 #define NyLPC_cHttpHeaderWriter_CONTENT_LENGTH_UNLIMITED 0xFFFFFFFF\r
 /**\r
@@ -54,11 +58,8 @@ NyLPC_TBool NyLPC_cHttpdConnection_sendResponseHeader2(NyLPC_TcHttpdConnection_t
        }else{\r
                NyLPC_cHttpHeaderWriter_setContentLength(h,i_content_length);\r
        }\r
-       //closeがセットされていればclose\r
-       if(i_inst->_connection_message_mode==NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE)\r
-       {\r
-               NyLPC_cHttpHeaderWriter_setClose(h);\r
-       }\r
+       //continueにセットされていたらcloseをFALSEに\r
+       NyLPC_cHttpHeaderWriter_setConnectionClose(h,(i_inst->_connection_message_mode!=NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE));\r
 \r
        if(!NyLPC_cHttpHeaderWriter_writeHeader(h,i_response_code)){\r
                NyLPC_OnErrorGoto(ERROR_SEND);\r
@@ -147,7 +148,7 @@ static void sendErrorResponse(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TInt16 i_s
        NyLPC_TcHttpHeaderWriter_t* h=&(i_inst->_head_writer);\r
        if(NyLPC_cHttpHeaderWriter_initialize(h,&i_inst->_in_stream,NULL)){\r
                //ヘッダを送信\r
-               NyLPC_cHttpHeaderWriter_setClose(h);\r
+               NyLPC_cHttpHeaderWriter_setConnectionClose(h,NyLPC_TBool_TRUE);\r
                NyLPC_cHttpHeaderWriter_writeHeader(h,i_status);\r
                NyLPC_cHttpHeaderWriter_close(h);\r
                NyLPC_cHttpHeaderWriter_finalize(h);\r
@@ -177,7 +178,7 @@ NyLPC_TBool NyLPC_cHttpdConnection_closeResponse(NyLPC_TcHttpdConnection_t* i_in
                NyLPC_cHttpBodyWriter_close(b);\r
                NyLPC_cHttpBodyWriter_finalize(&b);\r
                i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_HEAD;\r
-               if(i_inst->_connection_message_mode==NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE)\r
+               if(i_inst->_connection_message_mode!=NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE)\r
                {\r
                        i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_CLOSED;\r
                        return NyLPC_TBool_FALSE;\r
@@ -326,6 +327,7 @@ void NyLPC_cHttpdConnection_closeSocket(NyLPC_TcHttpdConnection_t* i_inst)
        case NyLPC_cHttpdConnection_ReqStatus_LISTEN:\r
                //何も出来ない。\r
                break;\r
+       case NyLPC_cHttpdConnection_ReqStatus_END:\r
        case NyLPC_cHttpdConnection_ReqStatus_REQPARSE:\r
        case NyLPC_cHttpdConnection_ReqStatus_PREFETCH:\r
                NyLPC_cHttpStream_finalize(&i_inst->_in_stream);\r
index 02c42fd..9c46465 100644 (file)
@@ -8,9 +8,11 @@
 #ifndef NYLPC_CHTTPDCONNECTION_H_\r
 #define NYLPC_CHTTPDCONNECTION_H_\r
 #include "NyLPC_stdlib.h"\r
-#include "NyLPC_uipService.h"\r
 #include "NyLPC_cHttpRequestPrefixParser.h"\r
-\r
+#ifndef DEFINE_NyLPC_TcHttpd_t\r
+       typedef struct NyLPC_TcHttpd NyLPC_TcHttpd_t;\r
+       #define DEFINE_NyLPC_TcHttpd_t\r
+#endif\r
 \r
 \r
 /** 受信バッファのサイズ*/\r
@@ -31,6 +33,8 @@ typedef NyLPC_TUInt8 NyLPC_TcHttpdConnection_Status;
 #define NyLPC_cHttpdConnection_ReqStatus_END                   4\r
 \r
 \r
+\r
+\r
 /** レスポンスヘッダ送付済*/\r
 #define NyLPC_cHttpdConnection_ResStatus_HEAD   1\r
 /** レスポンスヘッダ送付済*/\r
@@ -41,12 +45,15 @@ typedef NyLPC_TUInt8 NyLPC_TcHttpdConnection_Status;
 #define NyLPC_cHttpdConnection_ResStatus_ERROR 4\r
 \r
 \r
-typedef struct NyLPC_TcHttpd NyLPC_TcHttpd_t;\r
+\r
 /**\r
  * Httpdのハンドラが引き渡す、HTTPDコネクションクラス。\r
  *\r
  */\r
-typedef struct NyLPC_TcHttpdConnection NyLPC_TcHttpdConnection_t;\r
+#ifndef DEFINE_NyLPC_TcHttpdConnection_t\r
+       typedef struct NyLPC_TcHttpdConnection NyLPC_TcHttpdConnection_t;\r
+       #define DEFINE_NyLPC_TcHttpdConnection_t\r
+#endif\r
 struct NyLPC_TcHttpdConnection\r
 {\r
        NyLPC_TUInt8 _req_status;//リクエストステータス\r
index 9ac548b..4a6a705 100644 (file)
@@ -7,6 +7,7 @@
 \r
 #ifndef NYLPC_CHTTPDCONNECTION_PROTECTED_H_\r
 #define NYLPC_CHTTPDCONNECTION_PROTECTED_H_\r
+#include "../../uip/NyLPC_cTcpListener.h"\r
 #include "NyLPC_cHttpdConnection.h"\r
 #include "NyLPC_stdlib.h"\r
 /**\r
@@ -27,6 +28,12 @@ typedef NyLPC_TUInt8 NyLPC_TcHttpdConnection_CONNECTION_MODE;
  */\r
 const NyLPC_TChar* NyLPC_cHttpdConnection_getUrlPrefix(const NyLPC_TcHttpdConnection_t* i_inst);\r
 \r
+/**\r
+ * コネクションステータスをパース済みに設定します。\r
+ * HttpModで処理を行った後にコールします。\r
+ */\r
+void NyLPC_cHttpdConnection_setReqStatusParsed(NyLPC_TcHttpdConnection_t* i_inst);\r
+\r
 \r
 /**\r
  * 関数を実行後、_res_statusはCLOSEDかHEADかERRORに遷移する。\r
@@ -93,4 +100,7 @@ void NyLPC_cHttpdConnection_lock(NyLPC_TcHttpdConnection_t* i_inst);
  */\r
 void NyLPC_cHttpdConnection_unlock(NyLPC_TcHttpdConnection_t* i_inst);\r
 \r
+NyLPC_TUInt16 NyLPC_cHttpd_incNumOfConnection(NyLPC_TcHttpd_t* i_inst);\r
+NyLPC_TUInt16 NyLPC_cHttpd_decNumOfConnection(NyLPC_TcHttpd_t* i_inst);\r
+\r
 #endif /* NYLPC_CHTTPDCONNECTION_H_ */\r
index b7b2bd4..1a920c3 100644 (file)
@@ -1,5 +1,5 @@
-#include "NyLPC_cHttpdThread.h"\r
-#include "NyLPC_cHttpd.h"\r
+#include "NyLPC_cHttpd_protected.h"\r
+#include "NyLPC_cHttpdConnection.h"\r
 #include "NyLPC_cHttpdConnection_protected.h"\r
 \r
 #define LIMIT_OF_PERSISTENT_CONNECTION (NyLPC_cNet_NUMBER_OF_THREAD-1)\r
index f622c45..eee96bc 100644 (file)
@@ -7,25 +7,21 @@
 \r
 #ifndef NYLPC_TCHTTPDTHREAD_H_\r
 #define NYLPC_TCHTTPDTHREAD_H_\r
-\r
 #include "NyLPC_stdlib.h"\r
-#include "NyLPC_uipService.h"\r
 #include "../NyLPC_cNetConfig.h"\r
 #include "NyLPC_cHttpdConnection.h"\r
-\r
-#ifndef NYLPC_CHTTPD_H_\r
+#ifndef DEFINE_NyLPC_TcHttpd_t\r
        typedef struct NyLPC_TcHttpd NyLPC_TcHttpd_t;\r
+       #define DEFINE_NyLPC_TcHttpd_t\r
 #endif\r
 \r
 /** Httpdセッションスレッドのスタックサイズ*/\r
 #define NyLPC_TcHttpdThread_SIZE_OF_THREAD_STACK 1024\r
 \r
-\r
+typedef struct NyLPC_TcHttpdThread NyLPC_TcHttpdThread_t;\r
 /**\r
  * このクラスは、httpdのワーカースレッドです。1セッションを担当します。\r
  */\r
-typedef struct NyLPC_TcHttpdThread NyLPC_TcHttpdThread_t;\r
-\r
 struct NyLPC_TcHttpdThread\r
 {\r
        NyLPC_TcThread_t _super;\r
diff --git a/lib/src/net/httpd/NyLPC_cHttpdThread_protected.h b/lib/src/net/httpd/NyLPC_cHttpdThread_protected.h
new file mode 100644 (file)
index 0000000..eee96bc
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ * NyLPC_TcHttpd_Thread.h\r
+ *\r
+ *  Created on: 2013/02/07\r
+ *      Author: nyatla\r
+ */\r
+\r
+#ifndef NYLPC_TCHTTPDTHREAD_H_\r
+#define NYLPC_TCHTTPDTHREAD_H_\r
+#include "NyLPC_stdlib.h"\r
+#include "../NyLPC_cNetConfig.h"\r
+#include "NyLPC_cHttpdConnection.h"\r
+#ifndef DEFINE_NyLPC_TcHttpd_t\r
+       typedef struct NyLPC_TcHttpd NyLPC_TcHttpd_t;\r
+       #define DEFINE_NyLPC_TcHttpd_t\r
+#endif\r
+\r
+/** Httpdセッションスレッドのスタックサイズ*/\r
+#define NyLPC_TcHttpdThread_SIZE_OF_THREAD_STACK 1024\r
+\r
+typedef struct NyLPC_TcHttpdThread NyLPC_TcHttpdThread_t;\r
+/**\r
+ * このクラスは、httpdのワーカースレッドです。1セッションを担当します。\r
+ */\r
+struct NyLPC_TcHttpdThread\r
+{\r
+       NyLPC_TcThread_t _super;\r
+       /** 関数アドレスを格納したポインタ*/\r
+       NyLPC_TcHttpdConnection_t _connection;\r
+};\r
+\r
+\r
+void NyLPC_cHttpdThread_initialize(NyLPC_TcHttpdThread_t* i_inst,NyLPC_TcHttpd_t* i_parent,NyLPC_TInt32 i_prio);\r
+void NyLPC_cHttpdThread_finalize(NyLPC_TcHttpdThread_t* i_inst);\r
+NyLPC_TBool NyLPC_cHttpdThread_start(NyLPC_TcHttpdThread_t* i_inst,NyLPC_TcTcpListener_t* i_listener);\r
+\r
+#endif /* NYLPC_TCHTTPDTHREAD_H_ */\r
diff --git a/lib/src/net/httpd/NyLPC_cHttpd_protected.h b/lib/src/net/httpd/NyLPC_cHttpd_protected.h
new file mode 100644 (file)
index 0000000..da4d93f
--- /dev/null
@@ -0,0 +1,25 @@
+\r
+#ifndef NYLPC_CHTTPD_PROTECTED_H_\r
+#define NYLPC_CHTTPD_PROTECTED_H_\r
+\r
+#include "NyLPC_stdlib.h"\r
+#include "../NyLPC_cNetConfig.h"\r
+#include "NyLPC_cHttpd.h"\r
+#include "NyLPC_cHttpdThread.h"\r
+#ifndef DEFINE_NyLPC_TcHttpdConnection_t\r
+       typedef struct NyLPC_TcHttpdConnection NyLPC_TcHttpdConnection_t;\r
+       #define DEFINE_NyLPC_TcHttpdConnection_t\r
+#endif\r
+\r
+\r
+\r
+\r
+void NyLPC_cHttpd_initialize(NyLPC_TcHttpd_t* i_inst,NyLPC_TUInt16 i_port_number);\r
+void NyLPC_cHttpd_finalize(NyLPC_TcHttpd_t* i_inst);\r
+void NyLPC_cHttpd_loop(NyLPC_TcHttpd_t* i_inst);\r
+\r
+\r
+void NyLPC_cHttpd_lock(NyLPC_TcHttpd_t* i_inst);\r
+void NyLPC_cHttpd_unlock(NyLPC_TcHttpd_t* i_inst);\r
+#define NyLPC_cHttpd_getNumOfConnection(i_inst) ((i_inst)->_num_of_active_connection)\r
+#endif /* NYLPC_CHTTPD_H_ */\r
index 404e393..6aaa340 100644 (file)
@@ -39,8 +39,8 @@ struct TModMiMicSettingRequest
        NyLPC_TUInt8 _content_id;\r
        //解析用\r
        NyLPC_TUInt8 _qery_name_id;\r
-       NyLPC_TUInt16 _prefix_len;\r
        NyLPC_TUInt8 _astate;\r
+       NyLPC_TInt16 _prefix_len;\r
        NyLPC_TcStr_t _tstr;\r
        NyLPC_TChar _tstr_buf[16];\r
        /** 文字列のパーサ*/\r
@@ -275,7 +275,7 @@ static void setup_proc(NyLPC_TcHttpdConnection_t* i_connection,struct TModMiMicS
 /**\r
  * モジュールを実行します。\r
  */\r
-NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModMiMicSetting_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path)\r
+NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModMiMicSetting_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
        struct TModMiMicSettingRequest header;\r
        NyLPC_TcHttpBasicHeaderParser_t parser;\r
@@ -284,6 +284,9 @@ NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModMiMicSetting_t* i_inst,NyL
        {\r
                NyLPC_OnErrorGoto(Error1);\r
        }\r
+       //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)\r
+       NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
+\r
        //URL解析の準備\r
        header._prefix_len=-(NyLPC_TInt16)strlen(i_inst->super._ref_root_path);\r
        header._astate=ST_PARSE_PATH;\r
index a3fc514..fa145a4 100644 (file)
@@ -23,8 +23,8 @@
  *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
  *\r
  *********************************************************************************/\r
-#ifndef NYLPC_CMODSHORTURL_H_\r
-#define NYLPC_CMODSHORTURL_H_\r
+#ifndef NYLPC_CMODMIMICSETTING_H_\r
+#define NYLPC_CMODMIMICSETTING_H_\r
 #include "../http/NyLPC_cHttpBasicHeaderParser.h"\r
 #include "../NyLPC_cHttpdConnection.h"\r
 #include "NyLPC_cModRomFiles.h"\r
@@ -82,7 +82,7 @@ NyLPC_TBool NyLPC_cModMiMicSetting_canHandle(NyLPC_TcModMiMicSetting_t* i_inst,N
 /**\r
  * モジュールを実行します。\r
  */\r
-NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModMiMicSetting_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path);\r
+NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModMiMicSetting_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection);\r
 \r
 \r
 #ifdef __cplusplus\r
index 3cc5515..1c5f5d8 100644 (file)
@@ -41,8 +41,8 @@ struct TModMiMicRemoteMcuHeader
        NyLPC_TUInt8 _content_id;\r
        //解析用\r
        NyLPC_TUInt8 _qery_name_id;\r
-       NyLPC_TUInt16 _prefix_len;\r
        NyLPC_TUInt8 _astate;\r
+       NyLPC_TInt16 _prefix_len;\r
        NyLPC_TcStr_t _tstr;\r
        NyLPC_TChar _tstr_buf[16];\r
        struct NyLPC_TUInt32ArrayPtr _binarray;\r
@@ -343,7 +343,10 @@ NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_
        {\r
                NyLPC_OnErrorGoto(Error1);\r
        }\r
-//リソース占有\r
+       //リクエストParse済へ遷移(この関数の後はModが責任を持ってリクエストを返却)\r
+       NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
+\r
+\r
        //VM起動の為の排他ロック\r
        NyLPC_cHttpdConnection_lock(i_connection);\r
 \r
index 90984e2..3c1bfd0 100644 (file)
@@ -43,6 +43,7 @@ void NyLPC_cModRomFiles_initialize(NyLPC_TcModRomFiles_t* i_inst,const NyLPC_TCh
 {\r
        i_inst->_data=i_data;\r
        i_inst->_num_of_data=i_num_of_data;\r
+       i_inst->_ref_root_path=i_ref_root_path;\r
 }\r
 void NyLPC_cModRomFiles_finalize(NyLPC_TcModRomFiles_t* i_inst)\r
 {\r
@@ -115,22 +116,26 @@ static const struct NyLPC_TcHttpBasicHeaderParser_Handler _handler=
 /**\r
  * モジュールを実行します。\r
  */\r
-NyLPC_TBool NyLPC_cModRomFiles_execute(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path)\r
+NyLPC_TBool NyLPC_cModRomFiles_execute(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
        int i;\r
        NyLPC_TUInt16 status_code;\r
        NyLPC_TChar urls[32];\r
        struct NyLPC_TRomFileRequestHeader header;\r
+\r
        //connectonの状態を確認\r
        if(!NyLPC_cHttpdConnection_getReqStatus(i_connection)==NyLPC_cHttpdConnection_ReqStatus_REQPARSE)\r
        {\r
                NyLPC_OnErrorGoto(Error1);\r
        }\r
+       //リクエストParse済へ遷移\r
+       NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
+\r
        //URL解析の準備\r
        header.url_max=32;\r
        header.url=urls;\r
        //URLパース\r
-       status_code=NyLPC_cModRomFiles_getUrlSuffix(i_inst,i_connection,i_root_path,&header);\r
+       status_code=NyLPC_cModRomFiles_getUrlSuffix(i_inst,i_connection,&header);\r
        if(status_code!=200)\r
        {\r
                //エラー送信\r
@@ -148,10 +153,10 @@ NyLPC_TBool NyLPC_cModRomFiles_execute(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHtt
                {\r
                        NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
                }\r
-               return NyLPC_cHttpdModUtils_sendFixedContentBatch(i_connection,i_inst->_data[i].content_type,i_inst->_data[i].data,i_inst->_data[i].size);\r
+               return NyLPC_cHttpdModUtils_sendFixedContentBatch(i_connection,i_inst->_data[i].content_type,i_inst->_data[i].data,i_inst->_data[i].size>0?i_inst->_data[i].size:strlen(i_inst->_data[i].data));\r
        }\r
        //404Error\r
-       NyLPC_cHttpdConnection_sendResponseHeader2(i_connection,405,"text/html",0,NULL);\r
+       NyLPC_cHttpdConnection_sendResponseHeader2(i_connection,404,"text/html",0,NULL);\r
        return NyLPC_TBool_FALSE;\r
 Error1:\r
        return NyLPC_TBool_FALSE;\r
@@ -161,7 +166,7 @@ Error1:
 /**\r
  * URLサフィックスを取得する。\r
  */\r
-NyLPC_TUInt16 NyLPC_cModRomFiles_getUrlSuffix(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path,struct NyLPC_TRomFileRequestHeader* header)\r
+NyLPC_TUInt16 NyLPC_cModRomFiles_getUrlSuffix(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,struct NyLPC_TRomFileRequestHeader* header)\r
 {\r
        NyLPC_TcHttpBasicHeaderParser_t parser;\r
        //URL解析の準備\r
index 2082503..5957a08 100644 (file)
@@ -58,6 +58,9 @@ struct NyLPC_TcModRomFiles
  * 16文字以内のルートパスを指定します。文字列は外部参照です。インスタンスをfinalizeするまで維持してください。\r
  * 文字列は/で開始され/で終了する必要があります。\r
  * path:= /({.,14}/)?\r
+ * @param i_ref_root_path\r
+ * Must set static variable or hold value until instance is finished.\r
+ * 静的に宣言された文字列を指定してください。\r
  */\r
 void NyLPC_cModRomFiles_initialize(NyLPC_TcModRomFiles_t* i_inst,const NyLPC_TChar* i_ref_root_path,const struct NyLPC_TRomFileData* i_data,int i_num_of_data);\r
 void NyLPC_cModRomFiles_finalize(NyLPC_TcModRomFiles_t* i_inst);\r
@@ -69,7 +72,7 @@ NyLPC_TBool NyLPC_cModRomFiles_canHandle(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcH
 /**\r
  * モジュールを実行します。\r
  */\r
-NyLPC_TBool NyLPC_cModRomFiles_execute(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path);\r
+NyLPC_TBool NyLPC_cModRomFiles_execute(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection);\r
 \r
 \r
 \r
index d380e36..87554b2 100644 (file)
 struct NyLPC_TRomFileRequestHeader\r
 {\r
        struct NyLPC_THttpBasicHeader super;\r
-       NyLPC_TUInt16 _prefix_len;\r
+       NyLPC_TInt16 _prefix_len;\r
        NyLPC_TUInt16 url_max;\r
        NyLPC_TChar* url;\r
 };\r
 /**\r
  * URLサフィックスを取得する。\r
  */\r
-NyLPC_TUInt16 NyLPC_cModRomFiles_getUrlSuffix(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,const NyLPC_TChar* i_root_path,struct NyLPC_TRomFileRequestHeader* header);\r
+NyLPC_TUInt16 NyLPC_cModRomFiles_getUrlSuffix(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHttpdConnection_t* i_connection,struct NyLPC_TRomFileRequestHeader* header);\r
 \r
 #endif /* NYLPC_CMODROMFILES_PROTECTED_H_ */\r
index 4eb2e42..c7ed05e 100644 (file)
@@ -69,6 +69,9 @@ NyLPC_TBool NyLPC_cModShortUrl_execute(NyLPC_TcModShortUrl_t* i_inst,NyLPC_TcHtt
        {\r
                NyLPC_OnErrorGoto(Error1);\r
        }\r
+       //リクエストParse済へ遷移\r
+       NyLPC_cHttpdConnection_setReqStatusParsed(i_connection);\r
+\r
        NyLPC_cHttpShortRequestHeaderParser_initialize(&parser);\r
        //プリフェッチしたデータを流す\r
        NyLPC_cHttpShortRequestHeaderParser_parseInit(&parser,&(i_inst->_header));\r
@@ -85,10 +88,11 @@ NyLPC_TBool NyLPC_cModShortUrl_execute(NyLPC_TcModShortUrl_t* i_inst,NyLPC_TcHtt
        {\r
                NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
        }\r
-\r
        NyLPC_cHttpShortRequestHeaderParser_finalize(&parser);\r
        return NyLPC_TBool_TRUE;\r
 Error2:\r
+       //400Error\r
+       NyLPC_cHttpdConnection_sendResponseHeader2(i_connection,400,"text/html",0,NULL);\r
        NyLPC_cHttpShortRequestHeaderParser_finalize(&parser);\r
 Error1:\r
        return NyLPC_TBool_FALSE;\r
diff --git a/projects/example/ledflash/src/sketch.c b/projects/example/ledflash/src/sketch.c
new file mode 100644 (file)
index 0000000..ac4ec62
--- /dev/null
@@ -0,0 +1,43 @@
+/**\r
+ * Nyarudinoのスケッチシステムを使用するプロジェクトのテンプレートです。\r
+ */\r
+//#define SKETCH_STACK_SIZE 80 //スケッチのスタックサイズを変えるときは、ここで設定。\r
+#include "boot/sketch.h"\r
+#include "NyLPC_stdlib.h"\r
+#include "LPC17xx.h"\r
+void setup(void)\r
+{\r
+       //Setup and initialization before run scheduler\r
+       //通常は、各種サービスの起動設定をします。\r
+}\r
+void loop(void)\r
+{\r
+       int i;\r
+       LPC_PINCON->PINSEL0=0;\r
+       LPC_PINCON->PINSEL1=0;\r
+       LPC_PINCON->PINSEL2=0;\r
+       LPC_PINCON->PINSEL3=0;\r
+       LPC_PINCON->PINMODE0=0xffffffff;\r
+       LPC_PINCON->PINMODE1=0xffffffff;\r
+       LPC_PINCON->PINMODE2=0xffffffff;\r
+       LPC_PINCON->PINMODE3=0xffffffff;\r
+       LPC_PINCON->PINMODE_OD0=0x0;\r
+       LPC_PINCON->PINMODE_OD1=0x0;\r
+       LPC_GPIO0->FIODIR=0xffffffff;\r
+       LPC_GPIO0->FIOMASK=0;\r
+       LPC_GPIO1->FIODIR=0xffffffff;\r
+       LPC_GPIO1->FIOMASK=0;\r
+\r
+       //Implementation\r
+       //ここにメインタスクを書きます。\r
+       for(;;){\r
+               LPC_GPIO0->FIOPIN=0xffffffff;\r
+               LPC_GPIO1->FIOPIN=0xffffffff;\r
+               NyLPC_cThread_sleep(100);\r
+               LPC_GPIO0->FIOPIN=0x00;\r
+               LPC_GPIO1->FIOPIN=0x00;\r
+               NyLPC_cThread_sleep(100);\r
+\r
+//             LPC_PINCON_TypeDef *PINSEL0=0;\r
+       }\r
+}\r
index e46e82a..39b53d8 100644 (file)
@@ -20,10 +20,16 @@ struct MyHttpd{
 \r
 void handler(NyLPC_TcHttpdConnection_t* i_connection)\r
 {\r
-       NyLPC_THttpMethodType m;\r
        NyLPC_TcModShortUrl_t mod_surl;\r
+\r
+       NyLPC_THttpMethodType m;\r
+\r
+\r
+\r
        NyLPC_cModShortUrl_initialize(&mod_surl);\r
-       NyLPC_cModShortUrl_execute(&mod_surl,i_connection);\r
+       if(!NyLPC_cModShortUrl_execute(&mod_surl,i_connection)){\r
+               return;\r
+       }\r
        m=NyLPC_cModShortUrl_getMethod(&mod_surl);\r
        if(m!=NyLPC_THttpMethodType_HEAD || m!=NyLPC_THttpMethodType_GET){\r
                NyLPC_cHttpdConnection_sendResponseHeader(i_connection,200,"text/html",NULL);\r
diff --git a/projects/example/sample.romfsmod/src/fsdata.c b/projects/example/sample.romfsmod/src/fsdata.c
new file mode 100644 (file)
index 0000000..e5d7729
--- /dev/null
@@ -0,0 +1,15 @@
+#include "NyLPC_utils.h"\r
+\r
+const struct NyLPC_TRomFileData file_cat_jpg={\r
+       name:"logo.png",\r
+       size:5705,\r
+       content_type:"image/png",\r
+       "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x01\x54\x00\x00\x00\xCA\x08\x06\x00\x00\x00\xFA\x89\xB8\x32\x00\x00\x16\x10\x49\x44\x41\x54\x78\xDA\xED\x9D\x5B\x6C\x14\x55\x03\xC7\xF1\x43\x28\x97\x52\xAE\x42\xA9\x88\x94\x00\x72\x2B\x60\x20\x5C\x04\x2F\x80\x09\x8A\x04\x35\x80\x14\x2F\x44\x11\x30\xC4\x70\x51\x50\x0C\x68\x41\x49\x4A\x80\x04\x88\x42\x48\x4C\x10\x25\x26\x1A\x42\xC2\x8B\xA6\x26\x22\x3C\x18\x43\xC2\x0B\xD1\x17\x7C\x6B\x7D\xAA\x6F\x3C\xF2\x38\x5F\xFE\xF3\x65\xFA\x6D\x97\x9D\xDD\x3D\xBB\x67\x66\xCF\xD9\xF9\xFD\x92\x13\xB6\x65\x3B\x9D\x9E\x99\xF9\xED\x39\xE7\x7F\xE6\xCC\x80\x00\x00\x00\xAC\x30\xA0\xD4\x1B\xEE\xDF\xBF\x1F\x5C\xBA\x74\x29\x58\xB2\x64\x49\xB0\x62\xC5\x8A\xF0\xB5\xBE\x07\x7E\x71\xEB\xD6\xAD\x60\xE7\xCE\x9D\xC1\x94\x29\x53\x82\xE3\xC7\x8F\x07\xDD\xDD\xDD\x54\x0A\x40\x9A\x42\xBD\x72\xE5\x4A\x30\x64\xC8\x90\xA0\xB1\xB1\x31\x18\x30\x60\x40\x58\xF4\x5A\xDF\xBB\x7C\xF9\x32\xB5\xE7\x01\x12\x67\x6B\x6B\x6B\x30\x6A\xD4\xA8\xF0\xF8\x3D\xF4\xD0\x43\xC1\xC3\x0F\x3F\x1C\x1E\xC7\xF6\xF6\x76\x2A\x08\x20\x0D\xA1\x76\x76\x76\x06\x63\xC6\x8C\xE9\x13\x69\x7E\x19\x3D\x7A\x74\x70\xE8\xD0\x21\x6A\xD0\x61\xEE\xDC\xB9\x13\xB4\xB4\xB4\xF4\x3B\x6E\x12\x6A\xF4\x7A\xE8\xD0\xA1\xC1\xE2\xC5\x8B\xE9\x71\x00\x24\x29\xD4\x6B\xD7\xAE\x05\x4D\x4D\x4D\xB1\x32\x8D\xCA\xC0\x81\x03\x83\x63\xC7\x8E\x51\x8B\x0E\xD2\xD3\xD3\x13\x1E\x9F\xFC\x63\x96\x2B\x54\x95\x41\x83\x06\x05\x6B\xD6\xAC\xA1\xC2\x00\x92\x12\xEA\xCC\x99\x33\x4B\xCA\x34\xF7\x82\xA4\x85\xE3\x1E\x6D\x6D\x6D\x05\x8F\x57\xBE\x50\x55\xF4\xE1\x79\xF7\xEE\x5D\x2A\x0D\xC0\xB6\x50\xEF\xDD\xBB\x57\xB0\x65\x53\xAC\x1C\x3C\x78\x90\x9A\x74\xAC\xAB\xAF\x71\xD2\x72\x85\xDA\xD0\xD0\x10\x86\x8D\x00\x60\x59\xA8\x9B\x36\x6D\x32\x92\x69\x14\x54\xF5\xF6\xF6\x52\x9B\x8E\xB0\x60\xC1\x02\xE3\x63\xF8\x9F\xFF\xFC\x87\x8A\x03\xB0\x2D\x54\x8D\x89\x9A\x5E\x8C\x2A\x2B\x57\xAE\xA4\x36\x1D\x40\xB3\x2F\x14\x18\x9A\x1E\xBF\xE6\xE6\x66\x2A\x0F\xC0\xB6\x50\x95\xEE\x57\x22\x54\x4D\xCB\xE9\xEA\xEA\xA2\x46\x6B\x88\xC6\xB2\x8B\xCD\xCC\x28\x56\xE6\xCD\x9B\x47\x05\x02\xD8\x16\xEA\x91\x23\x47\x2A\xBA\x20\x55\x26\x4F\x9E\x4C\x40\x55\x43\x76\xEC\xD8\x11\x3B\x76\x5A\xAA\x28\x88\x04\x00\xCB\x42\xED\xE8\xE8\xA8\x58\xA8\xC3\x87\x0F\x0F\x85\x0C\xE9\xA3\x20\x6A\xEC\xD8\xB1\x15\x1F\xBB\x59\xB3\x66\x51\x89\x00\xB6\x85\x7A\xE6\xCC\x99\x8A\x2F\xCA\x68\x0A\x0E\x01\x55\xFA\x54\x12\x44\xE5\x96\xA5\x4B\x97\x52\x89\x00\xB6\x85\x7A\xE2\xC4\x89\xAA\x2E\x4C\x02\xAA\xF4\xA9\x34\x88\xCA\x2D\xF3\xE7\xCF\xA7\x22\x01\x5C\x6B\xA1\x12\x50\xA5\x4B\x35\x41\x54\x6E\x59\xBE\x7C\x39\x95\x09\x90\x84\x50\x0B\x4D\xFE\x26\xA0\x72\x93\x6A\x82\xA8\xDC\xF2\xEC\xB3\xCF\x52\x99\x00\xAE\x0A\x95\x80\x2A\x79\xAA\x0D\xA2\x10\x2A\x80\x27\x42\x25\xA0\x4A\x9E\x6A\x83\x28\x84\x0A\x90\xB0\x50\xAB\x99\x36\x45\x40\x95\x1E\x36\x82\x28\xA6\x4D\x01\xA4\xD0\x42\xB5\x29\x54\x02\x2A\xFB\xD8\x0A\xA2\x98\x36\x05\xE0\x51\x97\x9F\x80\x2A\x19\x6C\x05\x51\x74\xF9\x01\x3C\x14\x2A\x01\x95\x3D\x6C\x06\x51\x08\x15\xC0\x43\xA1\x12\x50\xD9\xC3\x66\x10\x85\x50\x01\x3C\x15\x2A\x01\x55\xF5\xD8\x0E\xA2\x10\x2A\x80\xC7\x42\x25\xA0\xAA\x9C\x24\x82\x28\x84\x0A\xE0\xB1\x50\x09\xA8\x2A\x27\x89\x20\x0A\xA1\x02\x78\x2E\x54\x02\x2A\x73\x92\x0A\xA2\x10\x2A\x80\xE7\x42\x25\xA0\x32\x27\xA9\x20\x0A\xA1\x02\x38\x28\x54\xD3\xA7\xA4\x12\x50\x95\x4F\x92\x41\x14\x42\x05\x70\x4C\xA8\x7A\xAF\x5A\x9C\xA6\x17\xF0\xC8\x91\x23\x83\x6B\xD7\xAE\x71\x04\x8A\x50\x69\x10\xA5\xBA\x35\xFD\x50\x44\xA8\x00\x8E\x08\xF5\xD3\x4F\x3F\xAD\xF8\x49\x9B\x04\x54\xF1\x54\x1A\x44\xE9\x36\x52\x3D\x16\x1A\xA1\x02\x78\xD8\xE5\xFF\xFD\xF7\xDF\x2B\x1A\xE7\x6B\x6C\x6C\x0C\xF6\xEF\xDF\xCF\x51\x28\x40\xA5\x41\x94\x5A\xB4\x77\xEF\xDE\xA5\x85\x0A\xE0\x82\x50\x4F\x9E\x3C\x69\x7C\x11\xDF\xB8\x71\xA3\x62\x01\x68\x6E\x6A\x77\x77\x37\x47\x22\x8F\x4A\x3E\xA0\x86\x0C\x19\x12\xEC\xDE\xBD\x3B\xFC\x79\x53\xA1\xB6\xB5\xB5\x51\xE9\x00\x2E\x74\xF9\xD5\x42\xAD\xA6\x8B\x4A\x40\xD5\x9F\x4A\x83\x28\xB5\x4E\xA3\x21\x14\xBA\xFC\x00\x9E\x0B\xB5\x9A\x10\x85\x80\x2A\xB0\x5A\x87\x08\x15\xC0\x73\xA1\x56\xD3\xBA\x22\xA0\x0A\xAA\x6A\xE5\xE7\xAF\x67\x8A\x50\x01\xEA\x40\xA8\x82\x80\xAA\x32\xAA\x0D\xA2\x10\x2A\x40\x1D\x0A\x95\x80\xAA\x32\xAA\x0D\xA2\x10\x2A\x40\x1D\x0A\xB5\x9A\xAE\x6B\x56\x03\x2A\x1B\x41\x14\x42\x05\xA8\x53\xA1\x12\x50\x95\x4F\x12\x75\x85\x50\x01\xEA\x48\xA8\xD5\xB4\xBA\xB2\x16\x50\xD9\x0A\xA2\x10\x2A\x40\x1D\x0B\x55\x10\x50\x15\xC7\x66\x10\x85\x50\x01\xEA\x5C\xA8\x04\x54\xC5\xB1\x19\x44\x21\x54\x80\x3A\x17\x6A\x35\x5D\xDA\x7A\x0F\xA8\x6C\x07\x51\x08\x15\x20\x03\x42\x25\xA0\x4A\xBF\x4E\x10\x2A\x40\x9D\x0A\xB5\x9A\xD6\x58\xBD\x06\x54\x49\x04\x51\x08\x15\x20\x23\x42\x15\x04\x54\xFF\x23\xA9\x20\x0A\xA1\x02\x64\x48\xA8\x04\x54\x95\x7F\xB0\x94\x13\x44\x21\x54\x80\x0C\x09\xB5\x9A\xAE\x6E\xBD\x04\x54\x49\x06\x51\x08\x15\xC0\x31\xA1\x1E\x3F\x7E\xDC\xF8\x62\x37\x11\x6A\x96\x03\xAA\x34\xFF\x76\xD3\x05\xA6\xD5\x6A\x06\x00\xCB\x42\xBD\x78\xF1\x62\xA2\x42\xAD\xA6\x95\xE6\x7B\x40\x95\x74\x10\x85\x50\x01\x1C\x13\xEA\x0F\x3F\xFC\x90\x68\x97\x3F\x22\x6B\x01\x55\x1A\x41\x14\x5D\x7E\x80\x8C\x0A\x35\x6B\x01\x55\x1A\x41\x14\x42\x05\xC8\xA8\x50\xAB\xE9\x02\xFB\x16\x50\xA5\x15\x44\x21\x54\x80\x0C\x0B\x35\x0B\x01\x55\xAD\xFE\x46\x84\x0A\x90\x31\xA1\x56\xD3\x7A\xF3\x25\xA0\x4A\x33\x88\x42\xA8\x00\x19\x17\xAA\xA8\xD7\x80\x2A\xED\x20\x0A\xA1\x02\x20\xD4\xBA\x0D\xA8\xD2\x0E\xA2\x10\x2A\x00\x42\xAD\xAA\x6B\xEC\x6A\x40\x55\x8B\x20\x0A\xA1\x42\xDA\xDC\xBE\x7D\x3B\x58\xB8\x70\xA1\xF1\xF9\xE6\x73\x99\x3A\x75\x6A\x70\xF8\xF0\xE1\xA0\xB7\xB7\xD7\x5D\xA1\xD6\x53\x40\xE5\xC2\xDF\x82\x50\x21\x69\x4E\x9E\x3C\x99\x29\x91\xE6\x16\x35\xFE\xD4\xAB\x56\xEF\xDA\x49\xA1\x56\xD3\xAA\x73\x2D\xA0\xAA\x55\x10\x85\x50\x21\x2D\xCE\x9E\x3D\x9B\x59\x99\xE6\x96\x96\x96\x96\x7E\xC3\x8E\x4E\x09\xB5\xD2\x71\x47\x97\x02\xAA\x5A\x06\x51\x08\x15\xD2\xEA\x81\x99\xDE\xDA\x5C\xCF\x25\xF7\xB6\x6D\xE7\x84\xEA\x7B\x40\x55\xCB\x20\x0A\xA1\x42\x1A\x9C\x38\x71\x02\xA1\xE6\x94\x61\xC3\x86\xF5\x8D\xA7\x3A\x27\xD4\x6A\xBA\xCC\xB5\x0E\xA8\x6A\x1D\x44\x21\x54\x48\x83\x89\x13\x27\x22\xD2\x9C\xD2\xD0\xD0\x10\x5E\xFB\xCE\x0A\xD5\xC7\x80\xCA\xB5\x7D\x46\xA8\x90\x14\x59\x17\xE8\xC0\x81\x03\xFB\x15\x5D\x6B\x9D\x9D\x9D\xEE\x0A\xB5\x9A\xD6\x5E\xAD\x02\x2A\x17\x82\x28\x84\x0A\x69\x30\x78\xF0\x60\x5A\xA6\x79\xC3\x8D\xB7\x6E\xDD\x72\x5B\xA8\x95\x8E\x47\xD6\x22\xA0\x72\x25\x88\x42\xA8\x90\x06\x23\x46\x8C\x40\xA4\x39\xA5\xA9\xA9\xE9\xFF\xAD\x77\x97\x85\xEA\x4B\x40\xE5\x4A\x10\x85\x50\x21\x0D\x74\x7D\x21\xD2\xFF\xBB\xE6\xF4\xE9\xD3\x7E\x08\xB5\x9A\xAE\x74\x5A\x01\x95\x4B\x41\x14\x42\x85\x34\x50\x8B\x0C\x99\xFE\x2F\x8C\xDA\xB6\x6D\x5B\xFF\xF1\x65\xD7\x85\xEA\x72\x40\xE5\xF2\xBE\x21\x54\x48\x8A\x47\x1F\x7D\xD4\xF8\x9C\xCF\x75\x8A\x5E\xE7\x96\xB8\xEF\x97\x2A\xB6\x7F\xAE\xD0\xF7\xE3\x7A\x97\x43\x87\x0E\x0D\x0E\x1E\x3C\xF8\x40\xDD\x38\x2F\xD4\x6A\x5A\x81\x49\x07\x54\xAE\x05\x51\x08\x15\x5C\x14\xEA\xA0\x41\x83\xC2\xA7\x29\x7F\xFC\xF1\xC7\x61\x1A\xAE\xD7\xB9\x45\x43\x5F\xF9\xDF\x2B\xA7\xC4\x6D\xAF\x54\xD1\xCF\xE8\x67\xF3\xBF\xDF\xD1\xD1\x11\x96\xDC\xEF\xED\xD9\xB3\x27\x7C\xFF\xEB\xAF\xBF\x1E\x2C\x5B\xB6\x2C\x98\x36\x6D\x5A\x5F\x00\x55\x08\x2F\x84\x5A\xE9\x38\x65\x92\x01\x95\x8B\x41\x14\x42\x85\x34\x30\x6D\xDC\xA8\xD1\x91\x15\xBC\x11\xAA\x6B\x01\x95\x8B\x41\x14\x42\x85\x34\x50\xCF\xCF\x74\xAC\x11\xA1\x3A\x26\xD4\x6A\xBA\xD8\xB6\x03\x2A\x57\x83\x28\x84\x0A\x2E\x76\xF9\x35\xDE\x88\x50\x1D\x14\xAA\x0B\x21\x90\x2F\x77\x71\x21\x54\x40\xA8\x08\x35\xB1\xD6\xA1\xAD\x80\xCA\xE5\x20\x0A\xA1\x02\x42\x45\xA8\xC6\xD4\x6A\xFC\xD2\xF5\x20\x0A\xA1\x02\x42\x45\xA8\xDE\x88\xCD\xF5\x20\x2A\x0D\xA1\x9E\x3A\x75\xAA\xDF\x9D\x32\x5A\x1C\x62\xED\xDA\xB5\xA9\x9F\x03\x80\x50\x11\xAA\x45\xD2\xEE\x7A\xFB\x10\x44\x25\x29\xD4\x7B\xF7\xEE\x05\x4F\x3D\xF5\x54\xDF\xB9\xA1\x7F\x25\x53\xBD\xD6\xEF\xD2\x07\x87\x56\x71\x07\x84\x8A\x50\x3D\x14\x6A\x9A\xE1\x90\x8F\xCB\x09\xDA\x16\xEA\x86\x0D\x1B\xFA\x09\x34\xF7\xF8\xEB\x6B\xAD\x40\x24\xA9\xEA\xA1\x6D\x80\x50\x11\xAA\x67\x42\x4D\xB3\xD5\xE8\x4B\x10\x95\x94\x50\x35\xC4\x12\x4D\xD0\xD6\x76\xF3\xCF\x8F\x48\xAA\xFA\x57\x8B\x0F\x43\x7D\x63\x7A\x2F\x3F\x13\xFB\x3D\x11\x6A\x1A\xE3\x9A\x3E\x05\x51\x49\x09\x75\xEE\xDC\xB9\x05\x45\x5A\x48\xAA\x7A\x4D\x2B\xB5\xBE\x61\x62\x7F\x1D\x0B\x35\x69\xE1\xF9\x14\x44\x25\x25\x54\x93\x5E\x80\xCE\x87\xF3\xE7\xCF\x63\x1D\xBA\xFC\x74\xF9\x7D\x14\x6A\x92\x5D\x72\xDF\x82\xA8\xA4\x84\x6A\xB2\xFE\xA5\xC6\x59\x35\x13\x00\x10\x2A\x42\xF5\x54\xA8\x49\x84\x46\x3E\x06\x51\x49\x09\x75\xCE\x9C\x39\xFD\xBA\xF4\xC5\x64\xEA\xC2\xF9\x00\x08\x15\xA1\x56\x89\xED\xD6\xA4\x8F\x41\x54\x52\x42\xBD\x72\xE5\x4A\xDF\xC3\xC8\x0A\x8D\xA5\x46\xDF\x57\xC9\x7D\x1C\x04\x20\x54\x84\xEA\xA9\x50\x6D\x8E\x77\xFA\x1A\x44\x25\x25\x54\xA1\x60\x4A\x1F\x30\x2A\xF9\x8B\xF1\xEA\x77\x69\xCD\x4B\x5D\x38\xDF\x7D\xF7\x1D\xC6\x41\xA8\x08\xB5\x1E\x84\x6A\x4B\x84\xBE\x06\x51\x49\x0A\xB5\xA7\xA7\x27\x98\x3C\x79\x72\xBF\x89\xFD\x51\x6B\x55\xAD\x57\x09\x75\xE7\xCE\x9D\xD8\x06\xA1\x22\xD4\x7A\x11\xAA\x8D\xAE\xBA\xCF\x41\x54\x92\x42\x15\xFA\xFB\xB6\x6C\xD9\x12\x4E\xE2\x97\x40\xA3\x6E\x7E\x6B\x6B\x6B\x58\x6F\x80\x50\x11\x6A\x9D\x09\xB5\x9A\x30\x49\x63\x85\x3E\x07\x51\x49\x0B\x35\xBF\x37\xF0\xD3\x4F\x3F\x85\xB7\xA4\x02\x42\x45\xA8\x75\x2A\xD4\x6A\x5A\x99\x9A\x80\xEC\x73\x10\x95\xA6\x50\x01\xA1\x22\xD4\x8C\x08\x55\x54\x32\x0E\x6A\xF2\x77\xBB\x18\x44\x21\x54\x40\xA8\x8E\x09\xF5\xD2\xA5\x4B\xC6\x52\xB9\x71\xE3\x86\x73\x7F\x58\xA5\x01\x95\xCF\x41\x54\x2E\xA6\x1F\x0E\x33\x66\xCC\xC0\x14\x50\x16\x1A\xE2\x32\x39\xB7\x14\x5A\xD2\x42\xF5\xBC\x85\x2A\x2A\x0D\xA8\x7C\x0D\xA2\x68\xA1\x02\x2D\x54\x84\x9A\x18\x95\x06\x54\xBE\x06\x51\x08\x15\x10\x2A\x42\x4D\x94\x4A\x03\x2A\x1F\x83\xA8\x34\x85\xDA\xDB\xDB\x1B\x5C\xBF\x7E\x1D\xBB\x78\x8E\xAE\x5D\xD3\x5E\x16\x42\xCD\xB0\x50\x45\x25\x01\x95\x8F\x41\x54\x1A\x42\xD5\x18\xBB\xE6\x9D\x46\x73\x50\x35\xA4\xA2\x47\xA0\x68\xCC\x1A\xFC\xE0\xC7\x1F\x7F\x0C\xEF\x7C\xCB\x3D\xFE\xBA\x65\xF8\xD8\xB1\x63\x08\x15\xA1\x96\xC6\x66\x40\xE5\x72\x10\x95\xA4\x50\xD5\x8A\x69\x6F\x6F\x0F\x1A\x1B\x1B\xFB\x85\x0D\xD1\x6B\xD5\xAF\xE6\xF1\x82\xDB\xBC\xF9\xE6\x9B\xE1\x87\x60\xB4\x90\x4D\xEE\xA2\x37\xFA\x57\xA2\x2D\x35\xB7\x18\xA1\x66\x5C\xA8\xC2\x56\x40\xE5\x72\x10\x95\xA4\x50\x17\x2F\x5E\x1C\x5E\x18\xF9\xE9\x6D\xEE\xD7\x5A\xE6\x8F\x3B\xA6\xDC\xE5\xDC\xB9\x73\xE1\x5C\x6B\xDD\xE9\x96\xBF\xC8\x8D\x5E\x47\x6B\x35\x3C\xFF\xFC\xF3\x08\x15\xA1\x06\x25\x5B\x58\xD5\x06\x54\xAE\x07\x51\x49\x09\x55\x7F\x73\xA1\xA9\x32\xF9\x42\xF5\xE9\x03\x27\x8B\x48\x6C\xB9\x6B\x30\x14\x7A\xE2\x82\x8E\xA9\x4A\xB1\x21\x1C\x84\x8A\x50\x43\xAA\x0D\xA8\x5C\x0F\xA2\x92\x12\xEA\xD6\xAD\x5B\x63\xE7\x17\xFA\xFC\xA1\x93\x25\xB4\x0A\x58\xDC\x31\xCB\xBF\x9E\x55\x16\x2E\x5C\x88\x50\x11\x6A\x69\x2A\x0D\xA8\x7C\x08\xA2\x92\x12\xAA\xE9\x4D\x02\x93\x26\x4D\xC2\x60\x8E\xF1\xD9\x67\x9F\x19\x1D\xC7\x09\x13\x26\x20\x54\x84\x5A\x1A\x75\x65\x14\x2C\x99\xDE\x92\xEA\x43\x10\x95\x94\x50\x4D\x3F\x7C\xB2\xF4\x94\x4B\x9F\x84\x6A\x72\x0C\x11\x2A\x42\x2D\x9B\xE7\x9E\x7B\xCE\x58\x10\xBE\x8D\x0B\xD6\x52\xA8\x9A\x56\x05\x6E\xA1\xA9\x52\xA5\x1E\x63\x13\x5D\xF7\x7A\x4F\x5B\x5B\x1B\x42\x45\xA8\xE5\x21\x39\xE6\x2E\x94\x5C\xEC\x39\xF3\xFA\xFA\xF4\xE9\xD3\xDE\x1D\xD8\x5A\x0A\x75\xD6\xAC\x59\x18\xCC\x41\x34\xE5\x2D\x2E\x94\x8A\xC6\x57\xA3\xE9\x54\x84\x52\x08\xD5\xB8\x0B\xA4\x29\x24\xD1\x42\xC9\xF9\x53\x48\x74\x62\xA9\x65\x5A\x6C\x70\x3E\x2B\x42\x35\x1D\x43\x5D\xBE\x7C\x39\xF6\x72\x10\x5D\xDB\xE5\x9C\xF3\xAF\xBD\xF6\x5A\xD1\xED\x20\x54\x84\x5A\x90\x68\x92\x73\x24\x9F\xFC\x49\xCE\xEA\xF6\xF8\xBA\x80\x72\x2D\x85\xBA\x64\xC9\x12\xEC\xE5\x28\xFB\xF6\xED\xEB\x13\x6A\xFE\x39\xAF\xD7\xAB\x56\xAD\x2A\xB9\x0D\x84\x8A\x50\x8B\x8E\x2D\x49\x9C\x95\xDE\x86\x87\x50\x1F\x2C\x9A\x49\x01\xEE\xF2\xF3\xCF\x3F\x07\xCF\x3C\xF3\x4C\xBF\x73\xA4\xB9\xB9\x39\x9C\xF8\x5F\x0E\x08\x15\xA1\x96\x45\x25\x0B\x45\x64\x41\xA8\xAC\x5C\x55\xBF\xDC\xBE\x7D\xDB\xF8\x67\x10\x2A\x42\xCD\x1C\x08\x15\x92\x02\xA1\x22\x54\x84\x8A\x50\x01\xA1\x22\x54\x40\xA8\x80\x50\x11\x2A\xD4\x8D\x50\x09\xA5\x00\xA1\x22\x54\x84\x8A\x50\x01\xA1\x22\x54\xC8\x56\x97\x7F\xE7\xCE\x9D\xE1\xB4\x9D\x6D\xDB\xB6\x05\x07\x0F\x1E\x0C\xCE\x9C\x39\x13\x96\xDC\xD7\x85\xBE\x2E\x54\x4E\x9D\x3A\x15\x74\x74\x74\x94\x7C\xDF\x27\x9F\x7C\x12\xFB\xB5\x5E\x6B\xED\x06\xAD\x9C\xA5\x45\x71\x0E\x1C\x38\x10\x7C\xFE\xF9\xE7\x7D\xFF\x9F\xFB\x5A\xE5\xE8\xD1\xA3\x25\x7F\x5F\x39\xFB\x54\x68\xDB\x47\x8E\x1C\xE9\xF7\xFA\xFD\xF7\xDF\x0F\x66\xCE\x9C\x19\xFE\x9D\xD5\xA2\xC7\xD8\x68\x0A\x95\xE9\xA2\x3F\x08\x15\xA1\x22\x54\xC7\x84\xFA\xF7\xDF\x7F\x87\xF7\xFC\x97\xBA\xAF\x3C\xFF\xF6\xE0\xE8\x75\x5C\xC9\xFF\x99\x62\xEF\x8B\xFB\xBA\xD4\xD2\x76\xC5\x7E\xD6\xE6\x7E\x15\xAA\x8B\x42\xEB\x26\xF4\xF4\xF4\x18\x9D\x1B\x37\x6F\xDE\x0C\x7B\x11\xC3\x86\x0D\x0B\xB7\xA1\x7F\xC7\x8D\x1B\x17\x7E\x60\x21\x54\x84\x0A\x9E\x09\x55\x73\x1F\x93\x7C\xBC\x77\xD6\x8A\xEA\xF2\xCF\x3F\xFF\x2C\xEB\xBC\xE8\xEC\xEC\x0C\x9F\xAC\x50\x48\xD6\x5A\x85\x4D\x4F\x66\xE0\x11\x28\x08\x15\x3C\x11\xAA\x2E\x56\x64\x9A\x8C\x54\x4B\x89\x50\xC3\x18\x23\x46\x8C\x88\xED\x09\xA8\xE8\xF1\x28\x1A\x52\x40\xA8\x08\x15\x3C\x10\xEA\x9A\x35\x6B\x10\x60\x42\x65\xF5\xEA\xD5\x45\x3F\xC8\x86\x0F\x1F\x5E\x74\x68\xA5\xDC\xA7\x2E\x20\x54\x84\x8A\x50\x1D\x11\xAA\x56\x3B\x42\x7E\xC9\x14\xB5\x2E\xE3\x88\x7B\x2E\x58\xDC\xB5\xBE\x71\xE3\x46\x84\x8A\x50\x21\x09\x09\x9A\x4E\x9B\x2A\xB6\x1E\x2A\xE2\x4B\xB6\xD8\xFA\x20\xD3\x31\x8F\x43\x8B\x07\xF1\x04\x07\x84\x8A\x50\x53\x12\x6A\xB1\x87\x19\x22\xBD\xDA\x08\xB5\xD4\xC3\xF9\x4C\xB6\xA5\xC7\xA3\x98\x6C\x47\x32\x47\xA8\x08\x15\xA1\x26\xB0\x2D\xA4\x57\x1B\xA1\x6A\x9E\xAF\xAD\x16\x2A\x5D\x7E\x84\x8A\x50\x11\x6A\xA6\x85\x6A\xFA\xB4\x5F\x1D\x73\x84\x8A\x50\x01\xA1\x22\xD4\x02\x4C\x9D\x3A\x15\xA1\x22\x54\x40\xA8\x14\x1B\x42\xD5\x73\xBE\x4C\xB6\xA3\x31\x57\x84\x8A\x50\x01\xA1\x22\xD4\x02\xE8\x98\xD8\x4A\xE6\x11\x2A\x42\x45\xA8\x1E\x0A\x55\xE7\x56\xB9\xF7\x97\x57\x83\xAB\xE7\xFC\xBB\xEF\xBE\x6B\x3C\xC3\x02\xA1\x22\x54\x40\xA8\xB1\x65\xFF\xFE\xFD\xA9\x08\xD5\x74\xBF\xD2\x38\xE7\xDF\x7A\xEB\x2D\x6B\x2D\x54\x3D\x89\x96\x2E\x3F\x42\x2D\xC9\xD5\xAB\x57\x9D\x7C\xD4\xF3\xF5\xEB\xD7\x11\xAA\x05\xA1\x6E\xDD\xBA\x35\xF1\xBA\xBA\x70\xE1\x82\xF1\x7E\x75\x75\x75\x25\xBE\x5F\x2F\xBE\xF8\xA2\x35\xA1\xCE\x98\x31\x83\x69\x53\x08\xB5\x30\xDF\x7E\xFB\x6D\x30\x7E\xFC\xF8\x07\xF6\x43\xF7\x89\xD7\x92\xF3\xE7\xCF\x3F\x70\xB2\xB5\xB4\xB4\x84\x6B\x59\x22\x54\xBA\xFC\x74\xF9\x11\xAA\x73\x42\x7D\xE9\xA5\x97\x8A\xEE\x9F\x0E\xDE\x3F\xFF\xFC\x93\x7A\x45\x6A\x61\x0A\x75\x93\xB4\x6F\x91\x80\xA2\xAF\xF5\xEF\x8A\x15\x2B\x10\x2A\x42\x45\xA8\x08\xD5\x1D\xA1\xAA\xA5\x57\xCE\xBE\x35\x36\x36\xA6\x5A\x89\x1F\x7C\xF0\x41\x30\x68\xD0\xA0\x70\x71\x8A\x7C\xF9\x68\x7F\xF5\x7F\x2A\xEF\xBC\xF3\x0E\x42\x45\xA8\x08\x15\xA1\xBA\x21\x54\x93\xFB\x91\x25\xB9\x34\x88\xD6\xF7\x8C\x5A\xA6\xF9\x75\x17\xB5\x50\xA3\xFF\x33\x7D\xDC\x04\x42\x45\xA8\x08\xD5\x73\xA1\xBA\x98\x78\x7E\xFD\xF5\xD7\xD6\x52\x4A\x9B\x7C\xF8\xE1\x87\xFD\xBA\xF9\xC5\xEE\x3C\xD1\xFB\xDA\xDB\xDB\x53\xD9\x2F\xD3\x0B\x51\x29\xB0\x2D\xA1\x16\x5B\x97\xD3\xF4\xDC\xDA\xBB\x77\x6F\x2A\x42\x75\xF1\x9C\xDF\xBC\x79\x33\xB7\x9E\xFA\x2E\x54\x3D\x22\xC1\xF4\x20\xFE\xF6\xDB\x6F\x89\xEF\xE8\x96\x2D\x5B\xAC\xA5\x94\x36\xD9\xB4\x69\x93\xD1\x7E\x3D\xF9\xE4\x93\x4E\x0A\xB5\xD8\x93\x4A\x4D\x85\xFA\xF2\xCB\x2F\x5B\x13\xEA\xAE\x5D\xBB\x12\xAF\xAB\x8B\x17\x2F\x3A\x99\xF2\xAF\x5B\xB7\xCE\x9A\x50\x67\xCF\x9E\x8D\x50\x6B\x21\xD4\x72\xC7\x29\xD3\xEE\xFE\x98\x0A\xB5\xD8\xC9\x95\x05\xA1\xD6\xB2\xCB\x6F\x4B\xA8\x74\xF9\xE9\xF2\x23\xD4\x84\x38\x77\xEE\x9C\x93\x5D\x7E\x3D\x1E\xB8\xD4\xD3\x32\x73\x9F\x64\x59\x4C\x36\x08\x15\xA1\x22\x54\x84\x9A\x5A\x28\x65\x72\x61\xA7\x15\x4A\xDD\xBF\x7F\x3F\x3C\xF9\xB4\x6F\xD1\x34\xA9\x42\xA1\x54\x54\xBA\xBB\xBB\x11\x2A\x42\x45\xA8\x08\xB5\xF6\x42\x3D\x7C\xF8\xB0\x93\x07\xF0\x8B\x2F\xBE\xE8\x9B\x1A\x55\x6C\xDA\xD4\x47\x1F\x7D\x94\xDA\x3E\xD5\x72\xC5\xFE\x62\x01\x17\x42\x45\xA8\x08\xD5\xA1\x89\xFD\x8B\x16\x2D\x2A\x79\x22\xFC\xF5\xD7\x5F\xA9\x57\xE4\x1B\x6F\xBC\x51\x74\x62\xFF\x86\x0D\x1B\x52\xDD\x9F\x5A\x0A\x55\x4B\xC5\x21\x54\x84\x8A\x50\x3D\x10\xAA\x38\x79\xF2\x64\x30\x6A\xD4\xA8\x07\xF6\x65\xFE\xFC\xF9\x35\xAD\x4C\xDD\x7A\x3A\x69\xD2\x24\x6E\x3D\x65\x1E\x2A\x42\x45\xA8\xFE\x08\x35\x97\x4B\x97\x2E\x05\x3D\x3D\x3D\xCE\x55\x2C\x8B\xA3\x20\x54\x84\x8A\x50\xBD\x13\x2A\x20\x54\x84\x8A\x50\x11\x2A\x20\x54\x84\x8A\x50\x11\x2A\x42\x45\xA8\x08\x15\xA1\x22\x54\x84\x8A\x50\x11\x2A\x42\x45\xA8\x08\x15\x10\x2A\x42\x45\xA8\x08\x15\x10\x6A\xC5\x42\x55\x49\x4B\xA8\x2E\xAE\x36\x25\xA1\xBA\xF8\x18\xE9\xE6\xE6\x66\xA3\x6D\x35\x34\x34\x20\x54\x84\x8A\x50\x5D\x10\xEA\xF6\xED\xDB\x13\xAF\xAB\x6F\xBE\xF9\xC6\x78\xBF\xFE\xF8\xE3\x8F\xC4\xF7\x6B\xFD\xFA\xF5\xD6\x84\x3A\x73\xE6\x4C\x6B\xAB\xB5\x35\x35\x35\x59\x6B\xED\x22\x54\x84\x8A\x50\xE9\xF2\xD3\xE5\xA7\xCB\x8F\x50\x11\x2A\x42\x45\xA8\x08\x35\x55\xA1\x1E\x39\x72\xC4\xC9\xEE\x0F\x18\x1E\x58\xC3\x63\xA8\x2E\x21\x42\x45\xA8\x08\x35\x81\x16\xAA\x8B\x03\xF4\x60\x86\xCD\x05\x4D\x10\x2A\x42\x45\xA8\x74\xF9\xE9\xF2\xD3\xE5\x47\xA8\x08\x15\xA1\x02\x42\x45\xA8\x08\x15\xA1\x02\x42\x45\xA8\x08\x15\xA1\x22\x54\x84\x8A\x50\x11\x2A\x42\x45\xA8\x90\xB8\x04\x4D\x2F\xEA\xB6\xB6\x36\x84\x8A\x50\x11\x2A\x42\x45\xA8\x36\x84\x4A\x0B\x15\xA1\x22\x54\x84\x8A\x50\xE9\xF2\x23\xD4\x32\x84\xFA\xC8\x23\x8F\x18\x6D\x4B\x0F\xA8\x44\xA8\x08\x15\xA1\x22\x54\x84\x5A\x80\x31\x63\xC6\x20\x54\x84\x8A\x50\x11\x2A\x42\xA5\xCB\x8F\x50\x21\xA3\x42\x55\x79\xEF\xBD\xF7\x12\xAF\x2B\x3D\xE8\xD1\x74\xBF\x7E\xF9\xE5\x97\xC4\xF7\x6B\xF5\xEA\xD5\xD6\x56\x9B\x7A\xFC\xF1\xC7\xAD\xAD\x36\x85\x50\x11\x2A\x42\xA5\x85\x4A\x0B\x95\x16\x6A\x6D\x84\xCA\xBD\xFC\xFE\xC3\xBD\xFC\x08\x15\xA1\x3A\x20\xD4\x13\x27\x4E\x18\x0B\xB5\xAB\xAB\x0B\x83\x79\x2E\xD4\xF9\xF3\xE7\xA7\xB2\x2D\x84\x8A\x50\xE9\xF2\xD3\xE5\xA7\xCB\x4F\x0B\x15\xA1\x22\x54\x84\x8A\x50\x79\xA6\x54\x39\x42\xE5\x99\x52\xE5\x3F\x53\x0A\xA1\x22\x54\x84\xEA\xA9\x50\x77\xEC\xD8\x91\x78\x5D\xB9\x9A\xF2\xAF\x5A\xB5\xCA\x9A\x50\xA7\x4E\x9D\x6A\xB4\x1D\x1D\xF3\x38\x98\x87\x6A\x28\x54\x42\xA9\xEC\x8D\xA1\x12\x4A\xD1\xE5\x67\x62\x7F\x02\x42\xE5\x11\x28\xD9\x14\x2A\x8F\x40\x41\xA8\x8C\xA1\xD2\x42\x85\x14\x5A\xA8\xA6\xDB\x7A\xE2\x89\x27\x10\x6A\x1D\x0B\xB5\xA5\xA5\xC5\x68\x5B\x43\x86\x0C\xA1\x85\x4A\x0B\x95\x16\xAA\x0B\x63\xA8\x69\xDC\x29\xF5\xFD\xF7\xDF\x1B\xEF\xD7\x8D\x1B\x37\x12\xDF\xAF\xB5\x6B\xD7\x5A\x1B\x43\x9D\x3E\x7D\xBA\xB5\x31\xD4\x11\x23\x46\x58\x0B\xB8\xEA\x5E\xA8\xCC\x43\xCD\xA6\x50\x6D\xCD\x1D\x55\x99\x33\x67\x8E\xB5\x6D\x65\x39\xE5\x7F\xFB\xED\xB7\xAD\x09\x75\xD9\xB2\x65\xD6\x24\x38\x6A\xD4\x28\x6B\xAD\x5D\xBA\xFC\x74\xF9\xEB\x52\xA8\x8B\x16\x2D\xB2\x26\x41\x5B\x5D\x7E\x15\x75\x7B\x93\xA6\x92\x94\x3F\x8D\x5E\xD9\xBA\x75\xEB\x9C\x4C\xF9\x69\xA1\x1A\x08\x75\xCF\x9E\x3D\xC6\x07\xF1\xEA\xD5\xAB\x18\xCC\xB5\x03\x6B\x78\x0C\xC7\x8E\x1D\x6B\x6D\x5B\xE3\xC7\x8F\xB7\xB6\xAD\x57\x5E\x79\x25\xF1\xBA\x3A\x7B\xF6\xAC\x93\xE7\xFC\xBC\x79\xF3\xAC\x09\x75\xE4\xC8\x91\xD6\x16\x47\x51\x6A\x6F\x6B\x5B\x75\x2F\xD4\xCD\x9B\x37\x1B\x1F\xC4\xAF\xBE\xFA\x0A\x83\x79\x2E\xD4\x62\x2D\x92\x5A\x6E\xAB\x98\x9C\x6D\xB1\x75\xEB\x56\xE3\xFD\x3A\x7E\xFC\x78\xE2\xFB\x35\x78\xF0\x60\x6B\x42\x35\xED\xB1\xA4\xB5\xAD\xBA\x17\xEA\xBD\x7B\xF7\x8C\x42\x08\xBD\x57\x3F\x03\x6E\x31\x77\xEE\xDC\xD8\xD6\x42\xA1\x31\xAE\x2F\xBF\xFC\x32\x76\x5B\x13\x27\x4E\x8C\xED\xCA\x15\xDA\xFE\xD1\xA3\x47\x8D\x25\x11\xB7\xAD\x5F\x7F\xFD\x35\xF1\xBA\xFA\xF7\xDF\x7F\x8D\x05\xA1\x9F\x49\x9A\xCB\x97\x2F\x17\x3C\x5E\x85\xEA\xAA\xD4\xF4\xA4\xED\xDB\xB7\x17\xDC\x56\x9C\x1C\x75\xCC\xE3\xE8\xE8\xE8\x88\x3D\x5E\x85\xB6\xF5\xF4\xD3\x4F\x67\x57\xA8\x62\xDC\xB8\x71\x65\x9F\x58\x7A\x2F\xB8\xC7\xBE\x7D\xFB\x42\x51\x96\x73\xD2\x37\x35\x35\x05\x77\xEF\xDE\x8D\xDD\xD6\xE1\xC3\x87\x0B\x6E\xAB\xD0\x45\xA5\xC0\xE2\xD6\xAD\x5B\xB1\xDB\xDA\xB8\x71\x63\x6C\x70\x51\x68\xBA\xCD\xFD\xFB\xF7\x53\xA9\xAF\xD6\xD6\xD6\xB2\xCF\x79\xBD\x37\x0D\xF4\xB7\xAB\x0E\xCA\x15\xAA\xEA\x36\x8E\x3B\x77\xEE\x14\xEC\xF6\xC7\x7D\xC0\xEA\x98\xC7\x71\xF3\xE6\xCD\x82\xC1\x54\xA1\x6D\x0D\x1B\x36\x2C\xB8\x70\xE1\x42\xB6\x85\x7A\xEA\xD4\xA9\xB2\x06\x9E\xF5\x9E\x62\x2D\x1B\xA8\x1D\xBD\xBD\xBD\x65\x5F\x40\x2B\x57\xAE\x2C\xB9\x2D\x49\xB7\x9C\x0B\x7B\xE9\xD2\xA5\x45\xB7\x15\x77\x61\xE7\x0B\x55\x5F\xA7\x71\xDB\x69\xEE\x39\x3F\x7C\xF8\xF0\x92\xE7\xBC\xDE\xA3\xF7\xA6\x85\xEA\x20\xBF\x6E\x0A\xD5\xBB\xEA\x54\x75\x6B\xFA\xA1\x11\xF7\x01\xAB\x63\x6E\x63\x5B\xBA\xAB\x2A\xAD\x0F\x45\x67\x85\x2A\x76\xED\xDA\x55\x74\x7A\x84\x2A\x7D\xEF\xDE\xBD\x98\xCB\x61\xD4\x52\x6C\x6E\x6E\x8E\x3D\xE9\xD5\xFD\xD6\xD0\x40\x39\x43\x36\xEA\x7E\x2A\xB8\x8A\xBB\xB0\xB5\x2D\xCD\x65\x2D\x67\x5B\x87\x0E\x1D\x0A\x46\x8F\x1E\x1D\x2B\x54\x85\x1E\xE5\xEE\x97\xCD\xD6\xE0\x9A\x35\x6B\x82\xC6\xC6\xC6\xD8\x73\x5E\xFF\xB7\x7E\xFD\xFA\x54\x8F\xA1\xEA\x40\x75\x91\x1B\x04\xE5\x0B\x55\x75\xA9\x3A\x2D\x85\x84\x9B\x7F\x97\x53\xBE\x04\xD5\xE3\x3C\x7F\xFE\x7C\xC9\x6D\x75\x77\x77\x87\x52\xCD\x1D\xC2\xC9\xDF\xD6\x84\x09\x13\x4A\x4A\x3E\x33\x42\x15\xA7\x4F\x9F\x0E\x4F\xA2\x86\x86\x86\xBE\x4A\xD2\x6B\x7D\xAF\xB3\xB3\x13\x63\x79\x80\x4E\x68\x49\x35\x6A\x61\x46\x27\xBD\x5A\x34\x8B\x17\x2F\x36\x6A\x3D\x68\x5B\x6A\x71\x44\xDB\x8A\xC6\xDA\xA3\x6D\x99\x08\x50\x82\xD6\x76\xD4\x25\xCC\x95\x84\xB6\x25\xB1\xD5\xAA\x55\xB3\x7F\xFF\xFE\x70\xBF\xF2\xCF\x79\x7D\x4F\xFF\x57\x0B\x22\xD9\x47\x2D\xFB\xA8\xDE\x55\x77\xDA\x2F\xD5\xA5\x89\xA0\x17\x2C\x58\xD0\xD7\x58\x8A\xCE\x07\x5D\xD3\xFA\x9E\xBA\xF3\x26\xDB\xD2\x71\xCF\xDF\x96\xF6\x53\x62\x2E\x36\x8C\x94\x49\xA1\x46\x9F\x44\x9A\x9B\x3A\x6D\xDA\xB4\x60\xF6\xEC\xD9\xE1\x6B\x7D\x0F\xFC\x41\x17\xA4\x26\xAF\xBF\xF0\xC2\x0B\xC1\x63\x8F\x3D\x16\xF6\x3E\x2A\x6D\x39\x44\xDB\xD2\xAD\xAA\x7A\x4E\x51\x35\xDB\x52\xB7\x52\xE3\x6B\xBA\xA9\x60\xCA\x94\x29\xC1\x81\x03\x07\x9C\x68\xD1\x48\x04\xD1\x39\xAF\xA2\xD7\x2E\xC8\x41\x75\xA3\xFA\x9E\x3C\x79\x72\x58\xFF\xAA\xBB\x52\x5D\xF3\x38\x24\x4E\xCD\x6E\xD0\xF9\xA0\xF3\x42\x73\x71\x2B\xED\x11\xE4\x6E\xEB\xD5\x57\x5F\x0D\xAE\x5D\xBB\x96\xD9\x6B\x6D\x00\xBA\x01\x00\x40\xA8\x00\x00\x08\x15\x00\x00\xA1\x02\x00\x00\x42\x05\x00\x40\xA8\x00\x00\x08\x15\x00\x00\xA1\x02\x00\x40\x12\x42\xD5\x64\x5F\x4D\xFA\x8D\xEE\xCE\xD0\xDD\x10\x7A\xAD\x5B\xCE\x74\x07\x89\xEE\x70\xD1\x2A\x37\xB9\xAF\x55\x74\x2B\xA1\xDE\x13\x7D\x1D\x57\xB4\xAD\x52\xEF\xA9\xB6\x68\xBF\xB4\x7F\x49\xFF\x9E\x62\x25\xBF\x7E\x28\xE6\x25\x8D\x73\xA5\x9E\x8B\xAE\x49\xDD\xC2\x5A\xCB\x7D\xD0\x62\x2F\x69\x5D\xF3\xFA\x5D\x26\xD7\x64\x6E\xFD\x44\xAF\xF5\x1E\xED\x6F\x74\x17\x98\xFE\xD5\x8D\x1E\x71\x37\x54\x14\x15\xAA\xEE\x8A\xD1\x4A\xEE\xC5\xEE\x6F\xA6\x50\x28\x94\x2C\x15\x49\x56\x77\xAB\x15\xBA\x63\xB4\xA8\x50\x75\xFF\xB0\xE9\xEA\xDC\x14\x0A\x85\x92\x85\xA2\x35\x32\xF2\xD7\x9C\x88\x15\xAA\xEC\x4B\xCB\x94\x42\xA1\x50\xE2\x57\xDC\xD3\xBA\x16\x65\x09\x55\x0B\x1C\x50\x69\x14\x0A\x85\x12\x5F\x76\xEF\xDE\x5D\x9E\x50\x35\xE8\x1A\x2D\xAD\x46\xA1\x50\x28\x94\x07\x9F\x4E\xD1\xD5\xD5\x55\xFE\x18\x6A\x7B\x7B\x7B\x98\x78\x51\x79\x14\x0A\x85\xD2\xBF\x4C\x9F\x3E\xBD\xFC\x31\xD4\x28\xE5\x5F\xB6\x6C\x99\xF1\x23\x68\x29\x14\x0A\xA5\x5E\x8B\xB2\xA5\x8A\x52\xFE\x48\xAA\x1A\x4F\x8D\xD2\x7E\xCD\xC9\xD2\xDC\xAD\x68\x1E\xAA\xE6\x6B\x45\x73\xBA\xA2\xD7\x26\xF3\x50\xD3\x98\x9B\xA9\x7D\x71\x61\x1E\x6A\x6E\xFD\x50\x2A\x9B\x5B\x48\x3D\xF8\x7D\x1D\xA4\x75\x1C\xCB\xF9\x1D\xF9\xD7\xA4\x1C\x17\xCD\x43\x8D\x5E\x47\x73\x55\x73\xE7\xE1\x6B\x5E\x7E\x45\xF3\x50\x01\x00\xA0\x7C\xFE\x0B\xA5\xBE\x6D\xBF\xD6\xEF\x3B\x93\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"\r
+};\r
+const struct NyLPC_TRomFileData file_index_html={\r
+"index.html",\r
+242,\r
+"text/html",\r
+"\x3C\x68\x74\x6D\x6C\x3E\x0D\x0A\x3C\x62\x6F\x64\x79\x3E\x0D\x0A\x3C\x68\x31\x3E\x54\x68\x69\x73\x20\x70\x61\x67\x65\x20\x69\x73\x20\x68\x6F\x73\x74\x65\x64\x20\x62\x79\x20\x4D\x69\x4D\x69\x63\x20\x68\x74\x74\x70\x64\x3C\x2F\x68\x31\x3E\x0D\x0A\x3C\x68\x72\x2F\x3E\x0D\x0A\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x2F\x72\x66\x2E\x61\x70\x69\x3F\x6C\x6F\x67\x6F\x2E\x70\x6E\x67\x22\x20\x2F\x3E\x0D\x0A\x3C\x62\x72\x2F\x3E\x0D\x0A\x3C\x62\x72\x2F\x3E\x0D\x0A\x3C\x64\x69\x76\x3E\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x30\x2D\x32\x30\x31\x33\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x79\x61\x74\x6C\x61\x2E\x6A\x70\x2F\x6D\x69\x6D\x69\x63\x2F\x77\x70\x2F\x22\x3E\x4D\x69\x6D\x69\x63\x20\x70\x72\x6F\x6A\x65\x63\x74\x3C\x2F\x61\x3E\x20\x41\x6C\x6C\x20\x52\x69\x67\x68\x74\x73\x20\x52\x65\x73\x65\x72\x76\x65\x64\x2E\x3C\x2F\x64\x69\x76\x3E\x0D\x0A\x3C\x2F\x62\x6F\x64\x79\x3E\x0D\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E"\r
+};\r
+\r
diff --git a/projects/example/sample.romfsmod/src/sketch.c b/projects/example/sample.romfsmod/src/sketch.c
new file mode 100644 (file)
index 0000000..7405113
--- /dev/null
@@ -0,0 +1,392 @@
+/**\r
+ * httpdサーバのサンプルです。\r
+ * ROMにある定義済みファイルの入出力と、クロスドメインRESTが確認できます。\r
+ */\r
+#include "boot/sketch.h"\r
+#include "NyLPC_uipService.h"\r
+#include "NyLPC_httpService.h"\r
+#include "NyLPC_utils.h"\r
+#include <stdio.h>\r
+\r
+#include "../net/NyLPC_cNet.h"\r
+#include "../net/httpd/NyLPC_cHttpd.h"\r
+#include "../net/httpd/mod/NyLPC_cModShortUrl.h"\r
+#include "../net/httpd/mod/NyLPC_cModRemoteMcu.h"\r
+#include "../net/httpd/mod/NyLPC_cModMiMicSetting.h"\r
+#include "../net/httpd/mod/NyLPC_cModRomFiles.h"\r
+\r
+NyLPC_TcNet_t net;\r
+struct MyHttpd{\r
+       NyLPC_TcHttpd_t super;\r
+}httpd;\r
+struct NyLPC_TRomFileData rom_fs[]={\r
+               {"test1",0,"text/html","<html>1</html>"},\r
+               {"test2",0,"text/html","<html>2</html>"}\r
+};\r
+\r
+const static char* ROM_PATH="/rom/";\r
+void handler(NyLPC_TcHttpdConnection_t* i_connection)\r
+{\r
+       union{\r
+               NyLPC_TcModShortUrl_t surl;\r
+               NyLPC_TcModRomFiles_t rom;\r
+       }mod;\r
+\r
+       NyLPC_THttpMethodType m;\r
+\r
+       NyLPC_cModRomFiles_initialize(&mod.rom,ROM_PATH,rom_fs,2);\r
+       if(NyLPC_cModRomFiles_canHandle(&mod.rom,i_connection)){\r
+               NyLPC_cModRomFiles_execute(&mod.rom,i_connection);\r
+               NyLPC_cModRomFiles_finalize(&mod.rom);\r
+               return;\r
+       }\r
+       NyLPC_cModRomFiles_finalize(&mod.rom);\r
+\r
+\r
+       NyLPC_cModShortUrl_initialize(&mod.surl);\r
+       if(!NyLPC_cModShortUrl_execute(&mod.surl,i_connection)){\r
+               return;\r
+       }\r
+       m=NyLPC_cModShortUrl_getMethod(&mod.surl);\r
+       if(m!=NyLPC_THttpMethodType_HEAD || m!=NyLPC_THttpMethodType_GET){\r
+               NyLPC_cHttpdConnection_sendResponseHeader(i_connection,200,"text/html",NULL);\r
+       }\r
+       if(m==NyLPC_THttpMethodType_GET){\r
+               NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"<html><body>");\r
+               NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"your request is %s",NyLPC_cModShortUrl_getPath(&mod.surl));\r
+\r
+               NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,"</body></html>");\r
+       }\r
+       NyLPC_cModShortUrl_finalize(&mod.surl);\r
+       return;\r
+}\r
+void setup(void)\r
+{\r
+       //uipサービス初期化。いろいろ利用可能に。\r
+       NyLPC_cNet_initialize(&net);\r
+       NyLPC_cHttpd_initialize(&httpd.super,80);\r
+       httpd.super.function._handler=handler;\r
+\r
+}\r
+\r
+\r
+void loop(void)\r
+{\r
+       NyLPC_TcNetConfig_t c2;\r
+       NyLPC_cNetConfig_initialize(&c2);\r
+       NyLPC_cNet_start(&net,&c2);\r
+       NyLPC_cHttpd_loop(&httpd.super);\r
+       for(;;);\r
+}\r
+\r
+\r
+#ifdef COMMENT\r
+\r
+\r
+//イーサネット用の初期化情報\r
+const struct NyLPC_TEthAddr ethaddr=NyLPC_TEthAddr_pack(0x02,0x01,0x02,0x03,0x04,0x05);\r
+const struct NyLPC_TIPv4Addr ipaddr=NyLPC_TIPv4Addr_pack(192,168,0,39);\r
+const struct NyLPC_TIPv4Addr netmask=NyLPC_TIPv4Addr_pack(255,255,255,0);\r
+const struct NyLPC_TIPv4Addr gateway=NyLPC_TIPv4Addr_pack(192,168,0,254);\r
+\r
+//TCP処理スレッドの定義\r
+#define SIZE_OF_RX 256\r
+#define NUM_OF_TH 7\r
+struct TProc{\r
+       NyLPC_TcThread_t th;\r
+       NyLPC_TcTcpSocket_t socket;\r
+       char rbuf[SIZE_OF_RX];\r
+}proc[NUM_OF_TH];\r
+\r
+//ROMFSの定義\r
+extern struct NyLPC_TRomFileData file_cat_jpg;\r
+extern struct NyLPC_TRomFileData file_index_html;\r
+NyLPC_TcRomFileSet_t rfs;\r
+const struct NyLPC_TRomFileData* rfsd[]={\r
+               &file_index_html,\r
+               &file_cat_jpg};\r
+\r
+//private 関数\r
+\r
+static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh);\r
+static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status);\r
+static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file);\r
+static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh);\r
+\r
+\r
+//スケッチ\r
+\r
+void setup(void)\r
+{\r
+       int i;\r
+       //uipサービス初期化。いろいろ利用可能に。\r
+       NyLPC_cUipService_initialize();\r
+//     for(i=0;i<NUM_OF_TH;i++){\r
+//             NyLPC_cThread_initialize(&(proc[i].th),200,NyLPC_TcThread_PRIORITY_IDLE);\r
+//             NyLPC_cTcpSocket_initialize(&(proc[i].socket),proc[i].rbuf,SIZE_OF_RX);\r
+//     }\r
+//     //ROMのファイルシステムを初期化\r
+//     NyLPC_cRomFileSet_initialize(&rfs,rfsd,2);\r
+\r
+}\r
+\r
+//ステータス用。\r
+static int num_of_reqest=0;\r
+static int num_of_error=0;\r
+static int num_of_connect=0;\r
+static int num_of_tx=0;\r
+\r
+//Httpのセッション関数\r
+static int server(void* p)\r
+{\r
+       struct TProc* proc=(struct TProc*)p;\r
+       NyLPC_TUInt16 ret;\r
+       const struct NyLPC_TRomFileData* rf;\r
+       NyLPC_TcHttpStream_t st;\r
+       struct NyLPC_THttpShortRequestHeader reqheader;\r
+       if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){\r
+               return -1;\r
+       }\r
+       num_of_connect++;\r
+\r
+       //TCPのオープン\r
+       if(NyLPC_cHttpStream_initialize(&st,&(proc->socket))){\r
+               for(;;){\r
+                       ret=parseReqHeader(&st,&reqheader);\r
+                       num_of_reqest++;\r
+                       //コネクションが増えすぎたら持続性接続を停止するために上書き。\r
+                       if(num_of_connect>5){\r
+                               reqheader.super.connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;\r
+                       }\r
+                       if(ret!=200){\r
+                               //エラーならエラーレスポンスを生成。持続性接続しない。\r
+                               writeError(&st,&(reqheader.super),ret);\r
+                               num_of_error++;\r
+                               break;\r
+                       }\r
+                       //URLから判定。\r
+                       if(strncmp("/rf.api?",reqheader.url,8)==0){\r
+                               //ファイル検索\r
+                               rf=NyLPC_cRomFileSet_getFilaData(&rfs,reqheader.url+8);\r
+                               if(rf==NULL){\r
+                                       num_of_error++;\r
+                                       if(!writeError(&st,&(reqheader.super),404)){\r
+                                               break;\r
+                                       }\r
+                               }else{\r
+                                       if(!writeFile(&st,&(reqheader.super),rf)){\r
+                                               num_of_error++;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }else if(strncmp("/status.json",reqheader.url,8)==0){\r
+                               if(!writeJson(&st,&(reqheader.super))){\r
+                                       break;\r
+                               }\r
+                               //httpdの状態を返す。\r
+                       }else{\r
+                               if(!writeFile(&st,&(reqheader.super),NyLPC_cRomFileSet_getFilaData(&rfs,"index.html"))){\r
+                                       num_of_error++;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+               }\r
+               NyLPC_cHttpStream_finalize(&st);\r
+       }\r
+       //5秒以内に切断\r
+       NyLPC_cTcpSocket_close(&(proc->socket),5000);\r
+       num_of_connect--;\r
+       return 0;\r
+}\r
+\r
+\r
+void loop(void)\r
+{\r
+       NyLPC_TcIPv4Config_t config;\r
+       NyLPC_TcTcpListener_t listener;\r
+       int i;\r
+\r
+\r
+       NyLPC_cIPv4Config_initialzeForEthernet(&config,&ethaddr,1480);\r
+       NyLPC_cIPv4Config_setDefaultRoute(&config,&gateway);\r
+       NyLPC_cIPv4Config_setIp(&config,&ipaddr,&netmask);\r
+\r
+\r
+//     NyLPC_cTcpListener_initialize(&listener,80);\r
+       NyLPC_cUipService_start(&config);\r
+/*     for(;;){\r
+               //ターミネイト状態のタスクを検索\r
+               for(i=0;i<NUM_OF_TH;i++){\r
+                       if(NyLPC_cThread_isTerminated(&(proc[i].th))){\r
+                               //リスニング\r
+                               if(!NyLPC_cTcpListener_listen(&listener,&(proc[i].socket),5000)){\r
+                                       continue;\r
+                               }\r
+                               //タスク起動\r
+                               NyLPC_cThread_start(&(proc[i].th),server,&(proc[i]));\r
+                       }\r
+               }\r
+       }*/\r
+       for(;;){}\r
+}\r
+\r
+\r
+\r
+/**\r
+ * リクエストヘッダのパーサ\r
+ */\r
+static NyLPC_TUInt16 parseReqHeader(NyLPC_TcHttpStream_t* i_st,struct NyLPC_THttpShortRequestHeader* o_reqh)\r
+{\r
+       NyLPC_TUInt16 ret=200;\r
+       NyLPC_TcHttpShortRequestHeaderParser_t hp;\r
+       NyLPC_cHttpShortRequestHeaderParser_initialize(&hp);\r
+\r
+       //ヘッダ解析\r
+       if(!NyLPC_cHttpShortRequestHeaderParser_parse(&hp,i_st,o_reqh)){\r
+               ret=NyLPC_cHttpBasicHeaderParser_getStatusCode(&hp.super);\r
+       }\r
+       //ヘッダの内容確認\r
+       if(o_reqh->super.type!=NyLPC_THttpHeaderType_REQUEST){\r
+               ret=400;\r
+       }\r
+       //GETだけネ\r
+       if(o_reqh->super.startline.req.method!=NyLPC_THttpMethodType_GET){\r
+               ret=405;\r
+       }\r
+       NyLPC_cHttpBasicHeaderParser_finalize(&hp);\r
+       return ret;\r
+}\r
+/**\r
+ * エラーレスポンスのライタ。\r
+ * 戻り値はpersistentConnectionが有効かどうか。\r
+ */\r
+static NyLPC_TBool writeError(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,NyLPC_TUInt16 i_status)\r
+{\r
+       static const char* HTML_FORMAT="<html><h1>STATUS %d</h1><hr/>"NyLPC_cHttpdConfig_SERVER"</html>";\r
+       NyLPC_TcHttpHeaderWriter_t hw;\r
+       NyLPC_TcHttpBodyWriter_t bw;\r
+       //ヘッダライタの生成\r
+       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       //ヘッダ書込み\r
+       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
+               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
+       }\r
+       //@bug HTTP/1.1未満のクライアントを考慮していない。\r
+       NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
+       //ヘッダの基本情報出力\r
+       NyLPC_cHttpHeaderWriter_writeHeader(&hw,i_status);\r
+       //拡張メッセージヘッダの出力\r
+       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","text/html");\r
+\r
+       //ヘッダ書込み終わり。(最後だけチェック)\r
+       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
+               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
+\r
+       //Bodyの書込み\r
+       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
+       //チャンク転送設定\r
+       NyLPC_cHttpBodyWriter_setChunked(&bw);\r
+       NyLPC_cHttpBodyWriter_format(&bw,HTML_FORMAT,(NyLPC_TInt32)i_status);\r
+       //エラーチェック\r
+       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
+               NyLPC_cHttpBodyWriter_finalize(&hw);\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       NyLPC_cHttpBodyWriter_finalize(&hw);\r
+       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
+}\r
+\r
+/**\r
+ * エラーレスポンスのライタ。\r
+ * 戻り値はpersistentConnectionが有効かどうか。\r
+ */\r
+static NyLPC_TBool writeJson(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh)\r
+{\r
+       static const char* JSON_FORMAT="{nr:%d,ne:%d,ac:%d,er:\"%d/%d/%d\",tx:%d}";\r
+       NyLPC_TcHttpHeaderWriter_t hw;\r
+       NyLPC_TcHttpBodyWriter_t bw;\r
+       //ヘッダライタの生成\r
+       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       //ヘッダ書込み\r
+       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
+               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
+       }\r
+       //@bug HTTP/1.1未満のクライアントを考慮していない。\r
+       NyLPC_cHttpHeaderWriter_setChunked(&hw);\r
+       //ヘッダの基本情報出力\r
+       NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
+       //拡張メッセージヘッダの出力\r
+       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type","application/json");\r
+       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Access-Control-Allow-Origin","*");\r
+\r
+       //ヘッダ書込み終わり。(最後だけチェック)\r
+       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
+               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
+\r
+       //Bodyの書込み\r
+       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
+       //チャンク転送設定\r
+       NyLPC_cHttpBodyWriter_setChunked(&bw);\r
+       NyLPC_cHttpBodyWriter_format(&bw,JSON_FORMAT,\r
+               (NyLPC_TInt32)num_of_reqest,(NyLPC_TInt32)num_of_error,(NyLPC_TInt32)num_of_connect,\r
+               NyLPC_assert_counter,NyLPC_abort_counter,NyLPC_debug_counter,dbg_getNumofUsedTx());\r
+       //エラーチェック\r
+       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
+               NyLPC_cHttpBodyWriter_finalize(&hw);\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       NyLPC_cHttpBodyWriter_finalize(&hw);\r
+       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
+}\r
+/**\r
+ * ROMファイルのレスポンスライタ。\r
+ * 戻り値はpersistentConnectionが有効かどうか。\r
+ */\r
+static NyLPC_TBool writeFile(NyLPC_TcHttpStream_t* i_st,const struct NyLPC_THttpBasicHeader* i_rqh,const struct NyLPC_TRomFileData* i_file)\r
+{\r
+       NyLPC_TcHttpHeaderWriter_t hw;\r
+       NyLPC_TcHttpBodyWriter_t bw;\r
+       //ヘッダライタの生成\r
+       if(!NyLPC_cHttpHeaderWriter_initialize(&hw,i_st,i_rqh)){\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       //ヘッダ書込み\r
+       if(!NyLPC_THttpBasicHeader_isPersistent(i_rqh)){\r
+               NyLPC_cHttpHeaderWriter_setClose(&hw);\r
+       }\r
+       NyLPC_cHttpHeaderWriter_setContentLength(&hw,i_file->size);\r
+       //ヘッダの基本情報出力\r
+       NyLPC_cHttpHeaderWriter_writeHeader(&hw,200);\r
+       //拡張メッセージヘッダの出力\r
+       NyLPC_cHttpHeaderWriter_writeMessage(&hw,"Content-type",i_file->content_type);\r
+\r
+       //ヘッダ書込み終わり。(最後だけチェック)\r
+       if(!NyLPC_cHttpHeaderWriter_close(&hw)){\r
+               NyLPC_cHttpHeaderWriter_finalize(&hw);\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       NyLPC_cHttpHeaderWriter_finalize(&hw);\r
+\r
+       //Bodyの書込み\r
+       NyLPC_cHttpBodyWriter_initialize(&bw,i_st);\r
+       NyLPC_cHttpBodyWriter_write(&bw,i_file->data,i_file->size);\r
+       //エラーチェック\r
+       if(!NyLPC_cHttpBodyWriter_close(&bw)){\r
+               NyLPC_cHttpBodyWriter_finalize(&hw);\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       NyLPC_cHttpBodyWriter_finalize(&hw);\r
+       return NyLPC_THttpBasicHeader_isPersistent(i_rqh);\r
+}\r
+#endif\r
diff --git a/projects/example/test.tcprto/src/sketch.c b/projects/example/test.tcprto/src/sketch.c
new file mode 100644 (file)
index 0000000..c802cd2
--- /dev/null
@@ -0,0 +1,166 @@
+/**\r
+ * 同時に8接続まで出来るtelnetサーバ。\r
+ * 23番ポートでListenして、受信データをエコーバックします。\r
+ */\r
+#include "boot/sketch.h"\r
+#include "NyLPC_uipService.h"\r
+#include <string.h>\r
+#include <stdio.h>\r
+//イーサネット用の初期化情報\r
+const struct NyLPC_TEthAddr ethaddr=NyLPC_TEthAddr_pack(0x02,0x01,0x02,0x03,0x04,0x05);\r
+const struct NyLPC_TIPv4Addr ipaddr=NyLPC_TIPv4Addr_pack(192,168,128,201);\r
+const struct NyLPC_TIPv4Addr netmask=NyLPC_TIPv4Addr_pack(255,255,255,0);\r
+const struct NyLPC_TIPv4Addr gateway=NyLPC_TIPv4Addr_pack(192,168,128,254);\r
+\r
+\r
+\r
+#define NUM_OF_TH 1\r
+struct TProc{\r
+       NyLPC_TcThread_t th;\r
+       NyLPC_TcTcpSocket_t socket;\r
+       char rbuf[512];\r
+}proc[NUM_OF_TH];\r
+\r
+\r
+void setup(void)\r
+{\r
+       int i;\r
+       //UipServiceの初期化\r
+       NyLPC_cUipService_initialize();\r
+       //TCPスレッドの準備\r
+       for(i=0;i<NUM_OF_TH;i++){\r
+               NyLPC_cThread_initialize(&(proc[i].th),160);\r
+               NyLPC_cTcpSocket_initialize(&(proc[i].socket),proc[i].rbuf,512);\r
+       }\r
+}\r
+\r
+void\r
+myprint(const char *buf)\r
+{\r
+  int i = 0;\r
+  while (buf[i] != '\0')\r
+    putchar(buf[i++]);\r
+}\r
+\r
+\r
+\r
+/**\r
+ * センシング情報を起こすセッション。1番目の接続。\r
+ */\r
+\r
+extern NyLPC_TUInt32 rto_log[];\r
+extern int rto_log_st;\r
+char* work=(char*)0x20080000;\r
+void log_out()\r
+{\r
+       char* w=work;\r
+       int i,t=0;\r
+       for(i=0;i<rto_log_st;i++){\r
+               NyLPC_itoa(rto_log[i],w,10);\r
+               w+=strlen(w);\r
+               *(w++)=',';\r
+       }\r
+       *(w++)='\n';\r
+       *(w++)='\0';\r
+       rto_log_st=0;\r
+       //LPCXpressoIDEないと死ぬ。\r
+       puts(work);\r
+}\r
+\r
+/**\r
+ * サーバプロセス。\r
+ * 接続済のソケットを処理します。\r
+ */\r
+int server2(void* p)\r
+{\r
+       struct TProc* proc=(struct TProc*)p;\r
+       NyLPC_TInt32 s;\r
+       const char* buf;\r
+       const char* src;\r
+       NyLPC_TInt16 sent;\r
+\r
+       if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){\r
+               return -1;\r
+       }\r
+       //接続中は送信する。\r
+       s=NyLPC_cTcpSocket_precv(&(proc->socket),(const void**)&buf,1000);\r
+       while(s>=0){\r
+               if(s>0){\r
+                       //受信した内容をそのまま送信。\r
+                       src=buf;\r
+\r
+                       while(s>0){\r
+                               sent=NyLPC_cTcpSocket_send(&(proc->socket),src,s,30000);\r
+                               if(sent<=0){\r
+                                       NyLPC_cTcpSocket_close(&(proc->socket),10000);\r
+                                       return -1;\r
+                               }\r
+                               //読み出し位置を調整\r
+                               src+=sent;\r
+                               s-=sent;\r
+                               NyLPC_cTcpSocket_pseek(&(proc->socket),sent);\r
+                       }\r
+               }\r
+               s=NyLPC_cTcpSocket_precv(&(proc->socket),(const void**)&buf,1000);\r
+       }\r
+       NyLPC_cTcpSocket_close(&(proc->socket),10000);\r
+       return 1;\r
+}\r
+int server3(void* p)\r
+{\r
+       struct TProc* proc=(struct TProc*)p;\r
+       NyLPC_TInt32 s;\r
+       const char* buf;\r
+       const char* src;\r
+       NyLPC_TInt16 sent;\r
+\r
+       if(!NyLPC_cTcpSocket_accept(&(proc->socket),3000)){\r
+               return -1;\r
+       }\r
+       for(;;){\r
+               //1024バイトのゴミデータを送信。ひたすら。\r
+               sent=NyLPC_cTcpSocket_send(&(proc->socket),rto_log,1024,30000);\r
+               if(sent<=0){\r
+                       NyLPC_cTcpSocket_close(&(proc->socket),10000);\r
+                       return -1;\r
+               }\r
+       }\r
+       NyLPC_cTcpSocket_close(&(proc->socket),10000);\r
+       return 1;\r
+}\r
+\r
+\r
+\r
+\r
+void loop(void)\r
+{\r
+       NyLPC_TcIPv4Config_t config;\r
+       NyLPC_TcTcpListener_t listener;\r
+       int i;\r
+\r
+\r
+       NyLPC_cIPv4Config_initialzeForEthernet(&config,&ethaddr,1480);\r
+       NyLPC_cIPv4Config_setDefaultRoute(&config,&gateway);\r
+       NyLPC_cIPv4Config_setIp(&config,&ipaddr,&netmask);\r
+\r
+\r
+       NyLPC_cTcpListener_initialize(&listener,23);\r
+       NyLPC_cUipService_start(&config);\r
+//     NyLPC_cThread_start(&(proc[0].th),server1,NULL);\r
+\r
+       for(;;){\r
+               //ターミネイト状態のタスクを検索\r
+               for(i=0;i<NUM_OF_TH;i++){\r
+                       if(NyLPC_cThread_isTerminated(&(proc[i].th))){\r
+                               //ログ出力\r
+                               log_out();\r
+                               //リスニング\r
+                               if(!NyLPC_cTcpListener_listen(&listener,&(proc[i].socket),10000)){\r
+                                       continue;\r
+                               }\r
+                               NyLPC_cThread_start(&(proc[i].th),server3,&(proc[i]));\r
+                       }\r
+               }\r
+       }\r
+       for(;;){}\r
+}\r