From 7bd1183b7f1cbf13b1b0c93b7a178834a35dabbf Mon Sep 17 00:00:00 2001 From: Kieran Date: Wed, 14 Dec 2022 17:04:02 +0000 Subject: [PATCH 1/2] Feat: Add C++ web interface for chat-client --- demos/chat-client/Enarx.toml | 7 + demos/chat-client/c++/README.md | 1 + demos/chat-client/c++/assets.h | 5 + demos/chat-client/c++/assets/index.html | 36 ++++++ demos/chat-client/c++/assets/script.js | 75 +++++++++++ demos/chat-client/c++/assets/style.css | 162 ++++++++++++++++++++++++ demos/chat-client/c++/main.cpp | 156 +++++++++++++++++++++-- demos/chat-client/c++/process_assets.py | 17 +++ demos/chat-client/rust/src/main.rs | 2 +- flake.nix | 5 +- 10 files changed, 455 insertions(+), 11 deletions(-) create mode 100644 demos/chat-client/c++/assets.h create mode 100644 demos/chat-client/c++/assets/index.html create mode 100644 demos/chat-client/c++/assets/script.js create mode 100644 demos/chat-client/c++/assets/style.css create mode 100644 demos/chat-client/c++/process_assets.py diff --git a/demos/chat-client/Enarx.toml b/demos/chat-client/Enarx.toml index 62034b3..24b6319 100644 --- a/demos/chat-client/Enarx.toml +++ b/demos/chat-client/Enarx.toml @@ -13,3 +13,10 @@ kind = "connect" port = 50000 prot = "tcp" host = "127.0.0.1" + +[[files]] +name = "web" +kind = "listen" +port = 50010 +prot = "tcp" +host = "127.0.0.1" \ No newline at end of file diff --git a/demos/chat-client/c++/README.md b/demos/chat-client/c++/README.md index 939c60c..b99774c 100644 --- a/demos/chat-client/c++/README.md +++ b/demos/chat-client/c++/README.md @@ -1 +1,2 @@ Compile to WASM first, then run with --wasmcfgfile directed to Enarx.toml +Use the --webinterface argument in the Enarx.toml to switch to a web interface (enabled by default), at localhost:50010 \ No newline at end of file diff --git a/demos/chat-client/c++/assets.h b/demos/chat-client/c++/assets.h new file mode 100644 index 0000000..d2e580d --- /dev/null +++ b/demos/chat-client/c++/assets.h @@ -0,0 +1,5 @@ +//This is an auto-generated file generated from the process_asets.py script + +unsigned char index_page[1050]= {0x3C,0x21,0x44,0x4F,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6D,0x6C,0x3E,0x0A,0x3C,0x68,0x74,0x6D,0x6C,0x20,0x6C,0x61,0x6E,0x67,0x3D,0x22,0x65,0x6E,0x22,0x3E,0x0A,0x0A,0x3C,0x68,0x65,0x61,0x64,0x3E,0x0A,0x20,0x20,0x20,0x20,0x3C,0x6D,0x65,0x74,0x61,0x20,0x63,0x68,0x61,0x72,0x73,0x65,0x74,0x3D,0x22,0x55,0x54,0x46,0x2D,0x38,0x22,0x3E,0x0A,0x20,0x20,0x20,0x20,0x3C,0x6D,0x65,0x74,0x61,0x20,0x6E,0x61,0x6D,0x65,0x3D,0x22,0x76,0x69,0x65,0x77,0x70,0x6F,0x72,0x74,0x22,0x20,0x63,0x6F,0x6E,0x74,0x65,0x6E,0x74,0x3D,0x22,0x77,0x69,0x64,0x74,0x68,0x3D,0x64,0x65,0x76,0x69,0x63,0x65,0x2D,0x77,0x69,0x64,0x74,0x68,0x2C,0x20,0x69,0x6E,0x69,0x74,0x69,0x61,0x6C,0x2D,0x73,0x63,0x61,0x6C,0x65,0x3D,0x31,0x2E,0x30,0x22,0x3E,0x0A,0x20,0x20,0x20,0x20,0x3C,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x73,0x72,0x63,0x3D,0x22,0x68,0x74,0x74,0x70,0x73,0x3A,0x2F,0x2F,0x61,0x6A,0x61,0x78,0x2E,0x67,0x6F,0x6F,0x67,0x6C,0x65,0x61,0x70,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x2F,0x61,0x6A,0x61,0x78,0x2F,0x6C,0x69,0x62,0x73,0x2F,0x6A,0x71,0x75,0x65,0x72,0x79,0x2F,0x33,0x2E,0x36,0x2E,0x31,0x2F,0x6A,0x71,0x75,0x65,0x72,0x79,0x2E,0x6D,0x69,0x6E,0x2E,0x6A,0x73,0x22,0x3E,0x3C,0x2F,0x73,0x63,0x72,0x69,0x70,0x74,0x3E,0x0A,0x20,0x20,0x20,0x20,0x3C,0x6C,0x69,0x6E,0x6B,0x20,0x72,0x65,0x6C,0x3D,0x22,0x73,0x74,0x79,0x6C,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x68,0x72,0x65,0x66,0x3D,0x22,0x2E,0x2F,0x73,0x74,0x79,0x6C,0x65,0x2E,0x63,0x73,0x73,0x22,0x3E,0x0A,0x20,0x20,0x20,0x20,0x3C,0x74,0x69,0x74,0x6C,0x65,0x3E,0x45,0x6E,0x61,0x72,0x78,0x20,0x43,0x68,0x61,0x74,0x3C,0x2F,0x74,0x69,0x74,0x6C,0x65,0x3E,0x0A,0x3C,0x2F,0x68,0x65,0x61,0x64,0x3E,0x0A,0x0A,0x3C,0x62,0x6F,0x64,0x79,0x3E,0x0A,0x0A,0x20,0x20,0x20,0x20,0x3C,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x68,0x31,0x3E,0x45,0x6E,0x61,0x72,0x78,0x20,0x43,0x68,0x61,0x74,0x3C,0x2F,0x68,0x31,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x70,0x3E,0x43,0x6C,0x69,0x63,0x6B,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x68,0x61,0x74,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20,0x74,0x6F,0x20,0x73,0x74,0x61,0x72,0x74,0x3C,0x2F,0x70,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x70,0x3E,0x43,0x6C,0x69,0x63,0x6B,0x20,0x74,0x68,0x65,0x20,0x73,0x74,0x6F,0x70,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20,0x74,0x6F,0x20,0x73,0x74,0x6F,0x70,0x20,0x74,0x68,0x65,0x20,0x63,0x68,0x61,0x74,0x20,0x63,0x6C,0x69,0x65,0x6E,0x74,0x3C,0x2F,0x70,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20,0x63,0x6C,0x61,0x73,0x73,0x3D,0x27,0x73,0x74,0x6F,0x70,0x2D,0x62,0x74,0x6E,0x27,0x3E,0x53,0x74,0x6F,0x70,0x3C,0x2F,0x62,0x75,0x74,0x74,0x6F,0x6E,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x64,0x69,0x76,0x20,0x69,0x64,0x3D,0x22,0x63,0x68,0x61,0x74,0x2D,0x64,0x69,0x76,0x22,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x64,0x69,0x76,0x20,0x63,0x6C,0x61,0x73,0x73,0x3D,0x27,0x63,0x68,0x61,0x74,0x2D,0x61,0x72,0x65,0x61,0x27,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x2F,0x64,0x69,0x76,0x3E,0x0A,0x20,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x64,0x69,0x76,0x20,0x63,0x6C,0x61,0x73,0x73,0x3D,0x27,0x63,0x68,0x61,0x74,0x2D,0x69,0x6E,0x70,0x75,0x74,0x2D,0x61,0x72,0x65,0x61,0x27,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x69,0x6E,0x70,0x75,0x74,0x20,0x74,0x79,0x70,0x65,0x3D,0x27,0x74,0x65,0x78,0x74,0x27,0x20,0x61,0x75,0x74,0x6F,0x66,0x6F,0x63,0x75,0x73,0x20,0x63,0x6C,0x61,0x73,0x73,0x3D,0x27,0x63,0x68,0x61,0x74,0x2D,0x69,0x6E,0x70,0x75,0x74,0x27,0x20,0x6F,0x6E,0x6B,0x65,0x79,0x70,0x72,0x65,0x73,0x73,0x3D,0x27,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x67,0x69,0x76,0x65,0x6E,0x55,0x73,0x65,0x72,0x49,0x6E,0x70,0x75,0x74,0x28,0x65,0x76,0x65,0x6E,0x74,0x29,0x27,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6C,0x61,0x63,0x65,0x68,0x6F,0x6C,0x64,0x65,0x72,0x3D,0x27,0x54,0x79,0x70,0x65,0x20,0x61,0x20,0x6D,0x65,0x73,0x73,0x61,0x67,0x65,0x20,0x2E,0x2E,0x2E,0x27,0x20,0x61,0x75,0x74,0x6F,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x3D,0x27,0x6F,0x66,0x66,0x27,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20,0x63,0x6C,0x61,0x73,0x73,0x3D,0x27,0x63,0x68,0x61,0x74,0x2D,0x73,0x75,0x62,0x6D,0x69,0x74,0x27,0x3E,0x3C,0x69,0x20,0x63,0x6C,0x61,0x73,0x73,0x3D,0x27,0x6D,0x61,0x74,0x65,0x72,0x69,0x61,0x6C,0x2D,0x69,0x63,0x6F,0x6E,0x73,0x27,0x3E,0x73,0x65,0x6E,0x64,0x3C,0x2F,0x69,0x3E,0x3C,0x2F,0x62,0x75,0x74,0x74,0x6F,0x6E,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x2F,0x64,0x69,0x76,0x3E,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x2F,0x64,0x69,0x76,0x3E,0x0A,0x20,0x20,0x20,0x20,0x3C,0x2F,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x3E,0x0A,0x0A,0x20,0x20,0x20,0x20,0x3C,0x73,0x63,0x72,0x69,0x70,0x74,0x20,0x73,0x72,0x63,0x3D,0x22,0x2E,0x2F,0x73,0x63,0x72,0x69,0x70,0x74,0x2E,0x6A,0x73,0x22,0x3E,0x3C,0x2F,0x73,0x63,0x72,0x69,0x70,0x74,0x3E,0x0A,0x0A,0x3C,0x2F,0x62,0x6F,0x64,0x79,0x3E,0x0A,0x0A,0x3C,0x2F,0x68,0x74,0x6D,0x6C,0x3E}; +unsigned char script[1814]= {0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x69,0x74,0x28,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x41,0x72,0x65,0x61,0x20,0x3D,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x71,0x75,0x65,0x72,0x79,0x53,0x65,0x6C,0x65,0x63,0x74,0x6F,0x72,0x28,0x22,0x2E,0x63,0x68,0x61,0x74,0x2D,0x61,0x72,0x65,0x61,0x22,0x29,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x53,0x75,0x62,0x6D,0x69,0x74,0x20,0x3D,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x71,0x75,0x65,0x72,0x79,0x53,0x65,0x6C,0x65,0x63,0x74,0x6F,0x72,0x28,0x22,0x2E,0x63,0x68,0x61,0x74,0x2D,0x73,0x75,0x62,0x6D,0x69,0x74,0x22,0x29,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x48,0x65,0x61,0x64,0x65,0x72,0x20,0x3D,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x71,0x75,0x65,0x72,0x79,0x53,0x65,0x6C,0x65,0x63,0x74,0x6F,0x72,0x28,0x22,0x2E,0x63,0x68,0x61,0x74,0x2D,0x68,0x65,0x61,0x64,0x65,0x72,0x22,0x29,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x20,0x3D,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x71,0x75,0x65,0x72,0x79,0x53,0x65,0x6C,0x65,0x63,0x74,0x6F,0x72,0x28,0x22,0x2E,0x63,0x68,0x61,0x74,0x2D,0x69,0x6E,0x70,0x75,0x74,0x22,0x29,0x0A,0x20,0x20,0x20,0x20,0x73,0x74,0x6F,0x70,0x42,0x75,0x74,0x74,0x6F,0x6E,0x20,0x3D,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x71,0x75,0x65,0x72,0x79,0x53,0x65,0x6C,0x65,0x63,0x74,0x6F,0x72,0x28,0x22,0x2E,0x73,0x74,0x6F,0x70,0x2D,0x62,0x74,0x6E,0x22,0x29,0x0A,0x20,0x20,0x20,0x20,0x72,0x6F,0x6F,0x74,0x20,0x3D,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x45,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x3B,0x0A,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x68,0x6F,0x73,0x74,0x20,0x3D,0x20,0x22,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x6C,0x6F,0x63,0x61,0x6C,0x68,0x6F,0x73,0x74,0x3A,0x35,0x30,0x30,0x31,0x30,0x22,0x0A,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x53,0x75,0x62,0x6D,0x69,0x74,0x2E,0x61,0x64,0x64,0x45,0x76,0x65,0x6E,0x74,0x4C,0x69,0x73,0x74,0x65,0x6E,0x65,0x72,0x28,0x22,0x63,0x6C,0x69,0x63,0x6B,0x22,0x2C,0x20,0x28,0x29,0x20,0x3D,0x3E,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6C,0x65,0x74,0x20,0x75,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x20,0x3D,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x76,0x61,0x6C,0x75,0x65,0x2E,0x74,0x72,0x69,0x6D,0x28,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x75,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x20,0x21,0x3D,0x3D,0x20,0x22,0x22,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x74,0x55,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x28,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6E,0x64,0x28,0x75,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x2C,0x20,0x68,0x6F,0x73,0x74,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x29,0x0A,0x0A,0x20,0x20,0x20,0x20,0x73,0x74,0x6F,0x70,0x42,0x75,0x74,0x74,0x6F,0x6E,0x2E,0x61,0x64,0x64,0x45,0x76,0x65,0x6E,0x74,0x4C,0x69,0x73,0x74,0x65,0x6E,0x65,0x72,0x28,0x22,0x63,0x6C,0x69,0x63,0x6B,0x22,0x2C,0x20,0x28,0x29,0x20,0x3D,0x3E,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6E,0x64,0x28,0x22,0x2F,0x30,0x34,0x22,0x2E,0x74,0x72,0x69,0x6D,0x28,0x29,0x2C,0x20,0x68,0x6F,0x73,0x74,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x29,0x0A,0x7D,0x0A,0x0A,0x2F,0x2F,0x20,0x65,0x6E,0x64,0x20,0x6F,0x66,0x20,0x69,0x6E,0x69,0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x0A,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x75,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x42,0x74,0x6E,0x28,0x65,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x73,0x65,0x6E,0x64,0x28,0x65,0x2E,0x76,0x61,0x6C,0x75,0x65,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x2F,0x2F,0x20,0x74,0x6F,0x20,0x73,0x75,0x62,0x6D,0x69,0x74,0x20,0x75,0x73,0x65,0x72,0x20,0x69,0x6E,0x70,0x75,0x74,0x20,0x77,0x68,0x65,0x6E,0x20,0x70,0x72,0x65,0x73,0x73,0x69,0x6E,0x67,0x20,0x65,0x6E,0x74,0x65,0x72,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x67,0x69,0x76,0x65,0x6E,0x55,0x73,0x65,0x72,0x49,0x6E,0x70,0x75,0x74,0x28,0x65,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x65,0x2E,0x6B,0x65,0x79,0x43,0x6F,0x64,0x65,0x20,0x3D,0x3D,0x20,0x31,0x33,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6C,0x65,0x74,0x20,0x75,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x20,0x3D,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x76,0x61,0x6C,0x75,0x65,0x2E,0x74,0x72,0x69,0x6D,0x28,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x75,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x20,0x21,0x3D,0x3D,0x20,0x22,0x22,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x74,0x55,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x28,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6E,0x64,0x28,0x75,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x7D,0x0A,0x0A,0x2F,0x2F,0x20,0x74,0x6F,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x20,0x75,0x73,0x65,0x72,0x20,0x6D,0x65,0x73,0x73,0x61,0x67,0x65,0x20,0x6F,0x6E,0x20,0x55,0x49,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x73,0x65,0x74,0x55,0x73,0x65,0x72,0x52,0x65,0x73,0x70,0x6F,0x6E,0x73,0x65,0x28,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x6C,0x65,0x74,0x20,0x75,0x73,0x65,0x72,0x49,0x6E,0x70,0x75,0x74,0x20,0x3D,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x76,0x61,0x6C,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x75,0x73,0x65,0x72,0x49,0x6E,0x70,0x75,0x74,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6C,0x65,0x74,0x20,0x74,0x65,0x6D,0x70,0x20,0x3D,0x20,0x60,0x3C,0x64,0x69,0x76,0x20,0x63,0x6C,0x61,0x73,0x73,0x3D,0x22,0x75,0x73,0x65,0x72,0x2D,0x6D,0x73,0x67,0x22,0x3E,0x3C,0x73,0x70,0x61,0x6E,0x20,0x63,0x6C,0x61,0x73,0x73,0x20,0x3D,0x20,0x22,0x6D,0x73,0x67,0x22,0x3E,0x24,0x7B,0x75,0x73,0x65,0x72,0x49,0x6E,0x70,0x75,0x74,0x7D,0x3C,0x2F,0x73,0x70,0x61,0x6E,0x3E,0x3C,0x2F,0x64,0x69,0x76,0x3E,0x60,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x41,0x72,0x65,0x61,0x2E,0x69,0x6E,0x6E,0x65,0x72,0x48,0x54,0x4D,0x4C,0x20,0x2B,0x3D,0x20,0x74,0x65,0x6D,0x70,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x76,0x61,0x6C,0x75,0x65,0x20,0x3D,0x20,0x22,0x22,0x0A,0x20,0x20,0x20,0x20,0x7D,0x20,0x65,0x6C,0x73,0x65,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x64,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x73,0x63,0x72,0x6F,0x6C,0x6C,0x54,0x6F,0x42,0x6F,0x74,0x74,0x6F,0x6D,0x4F,0x66,0x52,0x65,0x73,0x75,0x6C,0x74,0x73,0x28,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x0A,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x73,0x63,0x72,0x6F,0x6C,0x6C,0x54,0x6F,0x42,0x6F,0x74,0x74,0x6F,0x6D,0x4F,0x66,0x52,0x65,0x73,0x75,0x6C,0x74,0x73,0x28,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x41,0x72,0x65,0x61,0x2E,0x73,0x63,0x72,0x6F,0x6C,0x6C,0x54,0x6F,0x70,0x20,0x3D,0x20,0x63,0x68,0x61,0x74,0x41,0x72,0x65,0x61,0x2E,0x73,0x63,0x72,0x6F,0x6C,0x6C,0x48,0x65,0x69,0x67,0x68,0x74,0x3B,0x0A,0x7D,0x0A,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x73,0x65,0x6E,0x64,0x28,0x6D,0x65,0x73,0x73,0x61,0x67,0x65,0x2C,0x20,0x68,0x6F,0x73,0x74,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x74,0x79,0x70,0x65,0x20,0x3D,0x20,0x22,0x74,0x65,0x78,0x74,0x22,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x73,0x73,0x77,0x6F,0x72,0x64,0x49,0x6E,0x70,0x75,0x74,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x66,0x6F,0x63,0x75,0x73,0x28,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x6F,0x6E,0x73,0x6F,0x6C,0x65,0x2E,0x6C,0x6F,0x67,0x28,0x22,0x55,0x73,0x65,0x72,0x20,0x4D,0x65,0x73,0x73,0x61,0x67,0x65,0x3A,0x22,0x2C,0x20,0x6D,0x65,0x73,0x73,0x61,0x67,0x65,0x29,0x0A,0x20,0x20,0x20,0x20,0x24,0x2E,0x61,0x6A,0x61,0x78,0x28,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x72,0x6C,0x3A,0x20,0x68,0x6F,0x73,0x74,0x2C,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6D,0x65,0x74,0x68,0x6F,0x64,0x3A,0x20,0x27,0x50,0x55,0x54,0x27,0x2C,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x61,0x3A,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6D,0x65,0x73,0x73,0x61,0x67,0x65,0x3A,0x20,0x6D,0x65,0x73,0x73,0x61,0x67,0x65,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x74,0x49,0x6E,0x70,0x75,0x74,0x2E,0x66,0x6F,0x63,0x75,0x73,0x28,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x69,0x6E,0x69,0x74,0x28,0x29,0x3B}; +unsigned char style[3026]= {0x40,0x69,0x6D,0x70,0x6F,0x72,0x74,0x20,0x22,0x68,0x74,0x74,0x70,0x73,0x3A,0x2F,0x2F,0x63,0x64,0x6E,0x6A,0x73,0x2E,0x63,0x6C,0x6F,0x75,0x64,0x66,0x6C,0x61,0x72,0x65,0x2E,0x63,0x6F,0x6D,0x2F,0x61,0x6A,0x61,0x78,0x2F,0x6C,0x69,0x62,0x73,0x2F,0x6D,0x61,0x74,0x65,0x72,0x69,0x61,0x6C,0x2D,0x64,0x65,0x73,0x69,0x67,0x6E,0x2D,0x69,0x63,0x6F,0x6E,0x73,0x2F,0x33,0x2E,0x30,0x2E,0x31,0x2F,0x69,0x63,0x6F,0x6E,0x66,0x6F,0x6E,0x74,0x2F,0x6D,0x61,0x74,0x65,0x72,0x69,0x61,0x6C,0x2D,0x69,0x63,0x6F,0x6E,0x73,0x2E,0x6D,0x69,0x6E,0x2E,0x63,0x73,0x73,0x22,0x3B,0x0A,0x2A,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x3A,0x20,0x30,0x3B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x30,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x78,0x2D,0x73,0x69,0x7A,0x69,0x6E,0x67,0x3A,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x2D,0x62,0x6F,0x78,0x3B,0x0A,0x7D,0x0A,0x0A,0x3A,0x72,0x6F,0x6F,0x74,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x74,0x6F,0x74,0x61,0x6C,0x2D,0x77,0x69,0x64,0x74,0x68,0x3A,0x20,0x33,0x38,0x30,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x68,0x65,0x69,0x67,0x68,0x74,0x3A,0x20,0x35,0x30,0x30,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x2D,0x74,0x68,0x65,0x6D,0x65,0x3A,0x20,0x23,0x31,0x65,0x39,0x30,0x66,0x66,0x3B,0x0A,0x20,0x20,0x20,0x20,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x62,0x67,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x23,0x66,0x66,0x66,0x3B,0x0A,0x20,0x20,0x20,0x20,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x73,0x65,0x6E,0x64,0x2D,0x62,0x75,0x74,0x74,0x6F,0x6E,0x3A,0x20,0x23,0x31,0x65,0x39,0x30,0x66,0x66,0x3B,0x0A,0x20,0x20,0x20,0x20,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x75,0x73,0x65,0x72,0x2D,0x6D,0x73,0x67,0x2D,0x62,0x67,0x3A,0x20,0x23,0x64,0x64,0x64,0x3B,0x0A,0x20,0x20,0x20,0x20,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x68,0x65,0x61,0x64,0x65,0x72,0x2D,0x62,0x67,0x3A,0x20,0x6C,0x69,0x6E,0x65,0x61,0x72,0x2D,0x67,0x72,0x61,0x64,0x69,0x65,0x6E,0x74,0x28,0x31,0x36,0x30,0x64,0x65,0x67,0x2C,0x20,0x64,0x6F,0x64,0x67,0x65,0x72,0x62,0x6C,0x75,0x65,0x20,0x30,0x25,0x2C,0x20,0x23,0x38,0x30,0x44,0x30,0x43,0x37,0x20,0x31,0x30,0x30,0x25,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x62,0x6F,0x64,0x79,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x6E,0x74,0x2D,0x66,0x61,0x6D,0x69,0x6C,0x79,0x3A,0x20,0x41,0x72,0x69,0x61,0x6C,0x2C,0x20,0x48,0x65,0x6C,0x76,0x65,0x74,0x69,0x63,0x61,0x2C,0x20,0x73,0x61,0x6E,0x73,0x2D,0x73,0x65,0x72,0x69,0x66,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6B,0x67,0x72,0x6F,0x75,0x6E,0x64,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x23,0x65,0x35,0x65,0x35,0x65,0x35,0x3B,0x0A,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x3A,0x20,0x66,0x6C,0x65,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6A,0x75,0x73,0x74,0x69,0x66,0x79,0x2D,0x63,0x6F,0x6E,0x74,0x65,0x6E,0x74,0x3A,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3A,0x20,0x31,0x30,0x30,0x76,0x68,0x3B,0x0A,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3A,0x20,0x31,0x30,0x30,0x25,0x3B,0x0A,0x7D,0x0A,0x0A,0x73,0x65,0x63,0x74,0x69,0x6F,0x6E,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x78,0x2D,0x77,0x69,0x64,0x74,0x68,0x3A,0x20,0x31,0x31,0x30,0x30,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x3A,0x20,0x61,0x75,0x74,0x6F,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2D,0x61,0x6C,0x69,0x67,0x6E,0x3A,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x30,0x20,0x31,0x72,0x65,0x6D,0x3B,0x0A,0x7D,0x0A,0x0A,0x68,0x31,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x6E,0x74,0x2D,0x73,0x69,0x7A,0x65,0x3A,0x20,0x33,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x62,0x6F,0x74,0x74,0x6F,0x6D,0x3A,0x20,0x32,0x72,0x65,0x6D,0x3B,0x0A,0x7D,0x0A,0x0A,0x70,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x6E,0x74,0x2D,0x73,0x69,0x7A,0x65,0x3A,0x20,0x32,0x72,0x65,0x6D,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x69,0x63,0x6F,0x6E,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x74,0x72,0x61,0x6E,0x73,0x66,0x6F,0x72,0x6D,0x3A,0x20,0x73,0x63,0x61,0x6C,0x65,0x28,0x31,0x2E,0x32,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x73,0x74,0x6F,0x70,0x2D,0x62,0x74,0x6E,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x35,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x74,0x6F,0x70,0x3A,0x20,0x31,0x30,0x70,0x78,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x63,0x68,0x61,0x74,0x2D,0x73,0x75,0x62,0x6D,0x69,0x74,0x3A,0x68,0x6F,0x76,0x65,0x72,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x6F,0x70,0x61,0x63,0x69,0x74,0x79,0x3A,0x20,0x31,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x63,0x68,0x61,0x74,0x2D,0x61,0x72,0x65,0x61,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3A,0x20,0x33,0x30,0x30,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3A,0x20,0x36,0x30,0x30,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6F,0x76,0x65,0x72,0x66,0x6C,0x6F,0x77,0x2D,0x79,0x3A,0x20,0x61,0x75,0x74,0x6F,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6F,0x76,0x65,0x72,0x66,0x6C,0x6F,0x77,0x2D,0x78,0x3A,0x20,0x68,0x69,0x64,0x64,0x65,0x6E,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6B,0x67,0x72,0x6F,0x75,0x6E,0x64,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x76,0x61,0x72,0x28,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x62,0x67,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x2D,0x72,0x61,0x64,0x69,0x75,0x73,0x3A,0x20,0x33,0x30,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x3A,0x20,0x32,0x30,0x70,0x78,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x6D,0x73,0x67,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6B,0x67,0x72,0x6F,0x75,0x6E,0x64,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x76,0x61,0x72,0x28,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x2D,0x74,0x68,0x65,0x6D,0x65,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x77,0x68,0x69,0x74,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x2D,0x72,0x61,0x64,0x69,0x75,0x73,0x3A,0x20,0x35,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x78,0x2D,0x73,0x68,0x61,0x64,0x6F,0x77,0x3A,0x20,0x30,0x20,0x32,0x70,0x78,0x20,0x35,0x70,0x78,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2C,0x20,0x30,0x2C,0x20,0x30,0x2C,0x20,0x30,0x2E,0x34,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x75,0x73,0x65,0x72,0x2D,0x6D,0x73,0x67,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x3A,0x20,0x66,0x6C,0x65,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x61,0x6C,0x69,0x67,0x6E,0x2D,0x69,0x74,0x65,0x6D,0x73,0x3A,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x6C,0x65,0x66,0x74,0x3A,0x20,0x31,0x30,0x70,0x78,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x75,0x73,0x65,0x72,0x2D,0x6D,0x73,0x67,0x20,0x2E,0x6D,0x73,0x67,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6B,0x67,0x72,0x6F,0x75,0x6E,0x64,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x76,0x61,0x72,0x28,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x75,0x73,0x65,0x72,0x2D,0x6D,0x73,0x67,0x2D,0x62,0x67,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x62,0x6C,0x61,0x63,0x6B,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x2D,0x72,0x61,0x64,0x69,0x75,0x73,0x3A,0x20,0x35,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x78,0x2D,0x73,0x68,0x61,0x64,0x6F,0x77,0x3A,0x20,0x30,0x20,0x32,0x70,0x78,0x20,0x35,0x70,0x78,0x20,0x72,0x67,0x62,0x61,0x28,0x30,0x2C,0x20,0x30,0x2C,0x20,0x30,0x2C,0x20,0x30,0x2E,0x34,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x77,0x6F,0x72,0x64,0x2D,0x62,0x72,0x65,0x61,0x6B,0x3A,0x20,0x62,0x72,0x65,0x61,0x6B,0x2D,0x61,0x6C,0x6C,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2D,0x61,0x6C,0x69,0x67,0x6E,0x3A,0x20,0x6C,0x65,0x66,0x74,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x6D,0x73,0x67,0x2D,0x69,0x6D,0x61,0x67,0x65,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x78,0x2D,0x77,0x69,0x64,0x74,0x68,0x3A,0x20,0x39,0x30,0x25,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x78,0x2D,0x68,0x65,0x69,0x67,0x68,0x74,0x3A,0x20,0x34,0x30,0x30,0x70,0x78,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x63,0x68,0x61,0x74,0x2D,0x69,0x6E,0x70,0x75,0x74,0x2D,0x61,0x72,0x65,0x61,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x70,0x6F,0x73,0x69,0x74,0x69,0x6F,0x6E,0x3A,0x20,0x72,0x65,0x6C,0x61,0x74,0x69,0x76,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x3A,0x20,0x66,0x6C,0x65,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6A,0x75,0x73,0x74,0x69,0x66,0x79,0x2D,0x63,0x6F,0x6E,0x74,0x65,0x6E,0x74,0x3A,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x63,0x68,0x61,0x74,0x2D,0x69,0x6E,0x70,0x75,0x74,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3A,0x20,0x31,0x30,0x30,0x25,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x3A,0x20,0x31,0x70,0x78,0x20,0x73,0x6F,0x6C,0x69,0x64,0x20,0x23,0x63,0x63,0x63,0x3B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x6E,0x74,0x2D,0x73,0x69,0x7A,0x65,0x3A,0x20,0x31,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x2D,0x72,0x61,0x64,0x69,0x75,0x73,0x3A,0x20,0x35,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3A,0x20,0x32,0x2E,0x32,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x62,0x6F,0x74,0x74,0x6F,0x6D,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x6C,0x65,0x66,0x74,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6F,0x75,0x74,0x6C,0x69,0x6E,0x65,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x76,0x61,0x72,0x28,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x2D,0x74,0x68,0x65,0x6D,0x65,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x63,0x68,0x61,0x74,0x2D,0x73,0x75,0x62,0x6D,0x69,0x74,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x30,0x2E,0x32,0x35,0x72,0x65,0x6D,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x6C,0x65,0x66,0x74,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6B,0x67,0x72,0x6F,0x75,0x6E,0x64,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x76,0x61,0x72,0x28,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x73,0x65,0x6E,0x64,0x2D,0x62,0x75,0x74,0x74,0x6F,0x6E,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x77,0x68,0x69,0x74,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x3A,0x20,0x66,0x6C,0x65,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6A,0x75,0x73,0x74,0x69,0x66,0x79,0x2D,0x63,0x6F,0x6E,0x74,0x65,0x6E,0x74,0x3A,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x20,0x20,0x20,0x20,0x61,0x6C,0x69,0x67,0x6E,0x2D,0x69,0x74,0x65,0x6D,0x73,0x3A,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x2D,0x72,0x61,0x64,0x69,0x75,0x73,0x3A,0x20,0x35,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x3A,0x20,0x6E,0x6F,0x6E,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6F,0x75,0x74,0x6C,0x69,0x6E,0x65,0x3A,0x20,0x6E,0x6F,0x6E,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x3A,0x20,0x70,0x6F,0x69,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x62,0x6F,0x74,0x74,0x6F,0x6D,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x2D,0x72,0x69,0x67,0x68,0x74,0x3A,0x20,0x30,0x2E,0x35,0x72,0x65,0x6D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x2F,0x2A,0x20,0x6F,0x70,0x61,0x63,0x69,0x74,0x79,0x3A,0x20,0x30,0x2E,0x38,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x72,0x61,0x6E,0x73,0x69,0x74,0x69,0x6F,0x6E,0x3A,0x20,0x6F,0x70,0x61,0x63,0x69,0x74,0x79,0x20,0x30,0x2E,0x33,0x73,0x3B,0x20,0x2A,0x2F,0x0A,0x7D,0x0A,0x0A,0x2E,0x73,0x68,0x6F,0x77,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x3A,0x20,0x66,0x6C,0x65,0x78,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x62,0x74,0x6E,0x2D,0x70,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x2F,0x2A,0x20,0x62,0x61,0x63,0x6B,0x67,0x72,0x6F,0x75,0x6E,0x64,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x23,0x30,0x30,0x39,0x36,0x66,0x65,0x3B,0x20,0x2A,0x2F,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x3A,0x20,0x31,0x70,0x78,0x20,0x73,0x6F,0x6C,0x69,0x64,0x20,0x76,0x61,0x72,0x28,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x2D,0x74,0x68,0x65,0x6D,0x65,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6F,0x75,0x74,0x6C,0x69,0x6E,0x65,0x3A,0x20,0x6E,0x6F,0x6E,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x3A,0x20,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x2D,0x62,0x6C,0x6F,0x63,0x6B,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x76,0x61,0x72,0x28,0x2D,0x2D,0x63,0x68,0x61,0x74,0x2D,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x2D,0x74,0x68,0x65,0x6D,0x65,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x64,0x69,0x6E,0x67,0x3A,0x20,0x35,0x70,0x78,0x20,0x31,0x35,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x62,0x6F,0x72,0x64,0x65,0x72,0x2D,0x72,0x61,0x64,0x69,0x75,0x73,0x3A,0x20,0x34,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x3A,0x20,0x70,0x6F,0x69,0x6E,0x74,0x65,0x72,0x3B,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x72,0x67,0x69,0x6E,0x3A,0x20,0x35,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x6E,0x74,0x2D,0x77,0x65,0x69,0x67,0x68,0x74,0x3A,0x20,0x62,0x6F,0x6C,0x64,0x3B,0x0A,0x7D,0x0A,0x0A,0x2E,0x62,0x74,0x6E,0x2D,0x70,0x72,0x69,0x6D,0x61,0x72,0x79,0x3A,0x68,0x6F,0x76,0x65,0x72,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x62,0x61,0x63,0x6B,0x67,0x72,0x6F,0x75,0x6E,0x64,0x2D,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x23,0x30,0x30,0x39,0x36,0x66,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x63,0x6F,0x6C,0x6F,0x72,0x3A,0x20,0x23,0x66,0x66,0x66,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x72,0x61,0x6E,0x73,0x66,0x6F,0x72,0x6D,0x3A,0x20,0x73,0x63,0x61,0x6C,0x65,0x28,0x31,0x2E,0x31,0x29,0x3B,0x0A,0x7D,0x0A,0x0A,0x40,0x6D,0x65,0x64,0x69,0x61,0x20,0x28,0x6D,0x61,0x78,0x2D,0x77,0x69,0x64,0x74,0x68,0x3A,0x35,0x30,0x30,0x70,0x78,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x2E,0x63,0x68,0x61,0x74,0x2D,0x70,0x6F,0x70,0x75,0x70,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x6F,0x74,0x74,0x6F,0x6D,0x3A,0x20,0x31,0x32,0x30,0x70,0x78,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x69,0x67,0x68,0x74,0x3A,0x20,0x31,0x30,0x25,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x69,0x64,0x74,0x68,0x3A,0x20,0x38,0x30,0x76,0x77,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3A,0x20,0x31,0x30,0x30,0x25,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x7D}; diff --git a/demos/chat-client/c++/assets/index.html b/demos/chat-client/c++/assets/index.html new file mode 100644 index 0000000..99ce4e6 --- /dev/null +++ b/demos/chat-client/c++/assets/index.html @@ -0,0 +1,36 @@ + + + + + + + + + Enarx Chat + + + + +
+

Enarx Chat

+

Click on the chat button to start

+

Click the stop button to stop the chat client

+ +
+
+ +
+ +
+ + +
+
+
+ + + + + + \ No newline at end of file diff --git a/demos/chat-client/c++/assets/script.js b/demos/chat-client/c++/assets/script.js new file mode 100644 index 0000000..9cbe8b2 --- /dev/null +++ b/demos/chat-client/c++/assets/script.js @@ -0,0 +1,75 @@ +function init() { + chatArea = document.querySelector(".chat-area") + chatSubmit = document.querySelector(".chat-submit") + chatHeader = document.querySelector(".chat-header") + chatInput = document.querySelector(".chat-input") + stopButton = document.querySelector(".stop-btn") + root = document.documentElement; + var host = "http://localhost:50010" + + chatSubmit.addEventListener("click", () => { + let userResponse = chatInput.value.trim(); + if (userResponse !== "") { + setUserResponse(); + send(userResponse, host) + } + }) + + stopButton.addEventListener("click", () => { + send("/04".trim(), host); + chatInput.disabled = true; + }) +} + +// end of init function + +function userResponseBtn(e) { + send(e.value); +} + +// to submit user input when pressing enter +function givenUserInput(e) { + if (e.keyCode == 13) { + let userResponse = chatInput.value.trim(); + if (userResponse !== "") { + setUserResponse() + send(userResponse) + } + } +} + +// to display user message on UI +function setUserResponse() { + let userInput = chatInput.value; + if (userInput) { + let temp = `
${userInput}
` + chatArea.innerHTML += temp; + chatInput.value = "" + } else { + chatInput.disabled = false; + } + scrollToBottomOfResults(); +} + + + +function scrollToBottomOfResults() { + chatArea.scrollTop = chatArea.scrollHeight; +} + +function send(message, host) { + chatInput.type = "text" + passwordInput = false; + chatInput.focus(); + console.log("User Message:", message) + $.ajax({ + url: host, + method: 'PUT', + data: { + message: message + } + }); + chatInput.focus(); +} + +init(); \ No newline at end of file diff --git a/demos/chat-client/c++/assets/style.css b/demos/chat-client/c++/assets/style.css new file mode 100644 index 0000000..2c73c63 --- /dev/null +++ b/demos/chat-client/c++/assets/style.css @@ -0,0 +1,162 @@ +@import "https://cdnjs.cloudflare.com/ajax/libs/material-design-icons/3.0.1/iconfont/material-icons.min.css"; +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + --chat-window-total-width: 380px; + --chat-window-height: 500px; + --chat-window-color-theme: #1e90ff; + --chat-window-bg-color: #fff; + --chat-send-button: #1e90ff; + --chat-user-msg-bg: #ddd; + --chat-header-bg: linear-gradient(160deg, dodgerblue 0%, #80D0C7 100%); +} + +body { + font-family: Arial, Helvetica, sans-serif; + background-color: #e5e5e5; + display: flex; + justify-content: center; + height: 100vh; + width: 100%; +} + +section { + max-width: 1100px; + margin: auto; + text-align: center; + padding: 0 1rem; +} + +h1 { + font-size: 3rem; + margin-bottom: 2rem; +} + +p { + font-size: 2rem; +} + +.icon { + transform: scale(1.2); +} + +.stop-btn { + padding: 5px; + margin-top: 10px; +} + +.chat-submit:hover { + opacity: 1; +} + +.chat-area { + height: 300px; + width: 600px; + overflow-y: auto; + overflow-x: hidden; + background-color: var(--chat-window-bg-color); + border-radius: 30px; + margin: 20px; +} + +.msg { + background-color: var(--chat-window-color-theme); + color: white; + padding: 0.5rem; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4); +} + +.user-msg { + display: flex; + align-items: center; + margin-left: 10px; +} + +.user-msg .msg { + background-color: var(--chat-user-msg-bg); + color: black; + margin: 0.5rem; + padding: 0.5rem; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4); + word-break: break-all; + text-align: left; +} + +.msg-image { + max-width: 90%; + max-height: 400px; +} + +.chat-input-area { + position: relative; + display: flex; + justify-content: center; +} + +.chat-input { + width: 100%; + border: 1px solid #ccc; + padding: 0.5rem; + font-size: 1rem; + border-radius: 5px; + height: 2.2rem; + margin-bottom: 0.5rem; + margin-left: 0.5rem; + outline-color: var(--chat-window-color-theme); +} + +.chat-submit { + padding: 0.25rem 0.5rem; + margin-left: 0.5rem; + background-color: var(--chat-send-button); + color: white; + display: flex; + justify-content: center; + align-items: center; + border-radius: 5px; + border: none; + outline: none; + cursor: pointer; + margin-bottom: 0.5rem; + margin-right: 0.5rem; + /* opacity: 0.8; + transition: opacity 0.3s; */ +} + +.show { + display: flex; +} + +.btn-primary { + /* background-color: #0096fe; */ + border: 1px solid var(--chat-window-color-theme); + outline: none; + display: inline-block; + color: var(--chat-window-color-theme); + padding: 5px 15px; + border-radius: 4px; + cursor: pointer; + margin: 5px; + font-weight: bold; +} + +.btn-primary:hover { + background-color: #0096fe; + color: #fff; + transform: scale(1.1); +} + +@media (max-width:500px) { + .chat-popup { + bottom: 120px; + right: 10%; + width: 80vw; + height: 100%; + } +} \ No newline at end of file diff --git a/demos/chat-client/c++/main.cpp b/demos/chat-client/c++/main.cpp index 6f8b0cd..ddd163e 100644 --- a/demos/chat-client/c++/main.cpp +++ b/demos/chat-client/c++/main.cpp @@ -3,24 +3,164 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include "assets.h" + +// C backend code based on https://github.com/rjzak/web_wordpuzzle + +const unsigned char HTTP_OK[14] = "HTTP/1.0 200\n"; +const unsigned char CONTENT_TYPE_HTML[26] = "Content-Type: text/html\n\n"; +const unsigned char CONTENT_TYPE_JAVASCRIPT[32] = "Content-Type: text/javascript\n\n"; +const unsigned char CONTENT_TYPE_CSS[25] = "Content-Type: text/css\n\n"; +const unsigned int PORT = 50010; + +ssize_t write_all(const int fd, unsigned char *buf, size_t n); + +int main(int argc, char *argv[]) +{ + if (argc > 2) + { + std::cout << "Too many arguments provided" << std::endl; + return 1; + } + + bool isWebInterface = true; + if (argc == 2) + { + if (strcmp("--nowebinterface", argv[1]) == 0) + { + isWebInterface = false; + } + } -int main(int argc, char* argv[]) { int envVarCount = atoi(std::getenv("FD_COUNT")); - if (envVarCount != 4) { - std::cout << "expected exactly 4 pre-opened file descriptors" << std::endl; + if (envVarCount != 5) + { + std::cout << "expected exactly 5 pre-opened file descriptors" << std::endl; return 1; } - int serverFd = --envVarCount; + int serverFd, interfaceFd, newSocket; + interfaceFd = envVarCount - 1; + serverFd = envVarCount - 2; + + if (isWebInterface) + { + std::cout << "Running in web interface mode..." << std::endl; + + struct sockaddr_in addr; + socklen_t addrlen = 0; + + addr.sin_port = htons(PORT); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + + char buffer[4096] = {0}; + + while (1) + { + if ((newSocket = accept(interfaceFd, (struct sockaddr *)&addr, (socklen_t *)&addrlen)) < 0) + { + std::cout << "Error accepting interface fd" << std::endl; + break; + } + + ssize_t bytes_read = read(newSocket, buffer, 4096); + if (bytes_read < 0) + { + std::cout << "Error reading into buffer" << std::endl; + break; + } - std::string input; - while (1) { - while (std::cin >> input) { + if (buffer[0] != 0x47 || buffer[1] != 0x45 || buffer[2] != 0x54) + { // !GET + if (buffer[0] == 0x50 && buffer[1] == 0x55 && buffer[2] == 0x54) + { // PUT + char *loc = strstr(buffer, "message="); + loc += strlen("message="); + if (write(serverFd, loc, strlen(loc)) < 0) + { + std::cout << "failed to write" << std::endl; + } + + if (strcmp(loc, "%2F04") == 0) { + break; + } + + write(serverFd, "\n", 1); + } + } + + if (buffer[4] == 0x2F && buffer[5] == 0x20) + { // Forward slash and space + write(newSocket, HTTP_OK, sizeof(HTTP_OK) - 1); + write(newSocket, CONTENT_TYPE_HTML, sizeof(CONTENT_TYPE_HTML) - 1); + write_all(newSocket, index_page, sizeof(index_page)); + } + + if (buffer[4] == 0x2F && buffer[5] == 0x73 && buffer[6] == 0x63 && buffer[7] == 0x72) + { // Forward slash and scr + write(newSocket, HTTP_OK, sizeof(HTTP_OK) - 1); + write(newSocket, CONTENT_TYPE_JAVASCRIPT, sizeof(CONTENT_TYPE_JAVASCRIPT) - 1); + write_all(newSocket, script, sizeof(script)); + } + + if (buffer[4] == 0x2F && buffer[5] == 0x73 && buffer[6] == 0x74 && buffer[7] == 0x79) + { // Forward slash and sty + write(newSocket, HTTP_OK, sizeof(HTTP_OK) - 1); + write(newSocket, CONTENT_TYPE_CSS, sizeof(CONTENT_TYPE_CSS) - 1); + write_all(newSocket, style, sizeof(style)); + } + + memset(buffer, 0, 4096); + close(newSocket); + newSocket = 0; + } + + close(newSocket); + } + else + { + std::cout << "Running in stdin mode..." << std::endl; + + std::string input; + while (std::cin >> input) + { input += "\n"; - std::cout << write(serverFd, input.c_str(), strlen(input.c_str())) << std::endl; + if (write(serverFd, input.c_str(), strlen(input.c_str())) < 0) + { + std::cout << "Error writing input to server" << std::endl; + } } } + char buffer[4096] = {0}; + if (read(serverFd, &buffer, 4096) < 0) + { + std::cout << "Error reading server message" << std::endl; + } + + std::cout << buffer << std::endl; + + close(interfaceFd); close(serverFd); return 0; +} + +ssize_t write_all(const int fd, unsigned char *buf, size_t n) +{ + size_t total_written = 0; + while (total_written < n) + { + size_t written = write(fd, buf + total_written, n - total_written); + if (written < 0) + return written; + total_written += written; + } + return total_written; } \ No newline at end of file diff --git a/demos/chat-client/c++/process_assets.py b/demos/chat-client/c++/process_assets.py new file mode 100644 index 0000000..a2b6d84 --- /dev/null +++ b/demos/chat-client/c++/process_assets.py @@ -0,0 +1,17 @@ +# Python script from https://github.com/rjzak/web_wordpuzzle + +ASSETS = ( ("index_page", open("assets/index.html", "rb").read()), ("script", open("assets/script.js", "rb").read()), ("style", open("assets/style.css", "rb").read()) ) + +output_file = open("assets.h", "w") + +output_file.write("//This is an auto-generated file generated from the process_asets.py script\n\n") + +for asset in ASSETS: + name = asset[0] + data = asset[1] + output_file.write("unsigned char %s[%d]= {" % (name, len(data))); + output_file.write(",".join(["0x%02X"%x for x in data])) + output_file.write("};\n") + + +output_file.close() \ No newline at end of file diff --git a/demos/chat-client/rust/src/main.rs b/demos/chat-client/rust/src/main.rs index 91d71eb..93cb779 100644 --- a/demos/chat-client/rust/src/main.rs +++ b/demos/chat-client/rust/src/main.rs @@ -17,7 +17,7 @@ async fn main() -> anyhow::Result<()> { let fd_count = usize::from_str(&fd_count).context("failed to parse `FD_COUNT`")?; assert_eq!( fd_count, - 4, // STDIN, STDOUT, STDERR and a socket + 5, // STDIN, STDOUT, STDERR and 2 sockets "unexpected amount of file descriptors received" ); let mut stream = match env::var("FD_NAMES") diff --git a/flake.nix b/flake.nix index 7fe75a5..cd15460 100644 --- a/flake.nix +++ b/flake.nix @@ -23,7 +23,8 @@ demos.chat-client.conf = ./demos/chat-client/Enarx.toml; demos.chat-client.c.src = ./demos/chat-client/c/main.c; - demos.chat-client.cpp.src = ./demos/chat-client/c++/main.cpp; + demos.chat-client.cpp.src = ./demos/chat-client/c++; + demos.chat-client.rust.src = ./demos/chat-client/rust; demos.chat-client.rust.package = cargoPackage ./demos/chat-client/rust/Cargo.toml; @@ -128,7 +129,7 @@ } '' mkdir -p "$out/bin" - $CXX -Wall -pedantic ${demos.chat-client.cpp.src} \ + $CXX -Wall -I"${demos.chat-client.cpp.src}/assets.h" -pedantic ${demos.chat-client.cpp.src}/main.cpp \ -o "$out/bin/chat-client.wasm" ''; From ebd8ef7dea42f7913f5a99c26fb596e64614a1b3 Mon Sep 17 00:00:00 2001 From: Kieran Date: Wed, 14 Dec 2022 17:08:35 +0000 Subject: [PATCH 2/2] fix: Rust config changes --- demos/chat-client/rust/.cargo/config | 2 +- demos/chat-client/rust/Cargo.lock | 20 ++++++++++---------- demos/chat-server/rust/Cargo.lock | 11 ----------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/demos/chat-client/rust/.cargo/config b/demos/chat-client/rust/.cargo/config index b105d9c..d3f9ec0 100644 --- a/demos/chat-client/rust/.cargo/config +++ b/demos/chat-client/rust/.cargo/config @@ -2,5 +2,5 @@ target = "wasm32-wasi" [target.wasm32-wasi] -runner = ["enarx", "run", "--wasmcfgfile", "Enarx.toml"] +runner = ["enarx", "run", "--wasmcfgfile", "../Enarx.toml"] rustflags = [ "--cfg", "tokio_unstable"] diff --git a/demos/chat-client/rust/Cargo.lock b/demos/chat-client/rust/Cargo.lock index 3c26279..4922415 100644 --- a/demos/chat-client/rust/Cargo.lock +++ b/demos/chat-client/rust/Cargo.lock @@ -42,6 +42,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chat-client" +version = "0.1.0" +dependencies = [ + "anyhow", + "futures 0.3.24", + "tokio", + "tokio-stream", +] + [[package]] name = "futures" version = "0.1.31" @@ -264,16 +274,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "tokio-chat-client" -version = "0.1.0" -dependencies = [ - "anyhow", - "futures 0.3.24", - "tokio", - "tokio-stream", -] - [[package]] name = "tokio-io" version = "0.1.13" diff --git a/demos/chat-server/rust/Cargo.lock b/demos/chat-server/rust/Cargo.lock index 8d2183e..f2792fc 100644 --- a/demos/chat-server/rust/Cargo.lock +++ b/demos/chat-server/rust/Cargo.lock @@ -311,17 +311,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "tokio-chat-server" -version = "0.1.0" -dependencies = [ - "anyhow", - "futures 0.3.24", - "tokio", - "tokio-stream", - "ulid", -] - [[package]] name = "tokio-io" version = "0.1.13"