From c67fbc7caf4933f738f40ce91073b4b0a8b225ab Mon Sep 17 00:00:00 2001 From: Thomas Davis Date: Sun, 1 Sep 2013 03:53:52 -0400 Subject: [PATCH] Added new C embedding example --- RELEASE_NOTES.md | 1 + VS2012/civetweb.sln | 36 ++++ VS2012/ex_embedded_c/ex_embedded_c.vcxproj | 159 ++++++++++++++++++ .../ex_embedded_c.vcxproj.filters | 30 ++++ examples/embedded_c/Makefile | 36 ++++ examples/embedded_c/embedded_c.c | 88 ++++++++++ test/MakefileTest.mk | 6 +- 7 files changed, 354 insertions(+), 2 deletions(-) create mode 100644 VS2012/ex_embedded_c/ex_embedded_c.vcxproj create mode 100644 VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters create mode 100644 examples/embedded_c/Makefile create mode 100644 examples/embedded_c/embedded_c.c diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 7367e15f..1060e421 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -19,6 +19,7 @@ Changes - Externalized logging function cry() as mg_cry() - Added CivetServer::getCookie method (Hariprasad Kamath) - Added CivetServer::getHeader method (Hariprasad Kamath) +- Added new basic C embedding example Release Notes v1.3 === diff --git a/VS2012/civetweb.sln b/VS2012/civetweb.sln index 176da2d7..5fa21f5c 100644 --- a/VS2012/civetweb.sln +++ b/VS2012/civetweb.sln @@ -11,54 +11,90 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "civetweb_lua", "civetweb_lu EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua_lib", "lua_lib\lua_lib.vcxproj", "{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_embedded_c", "ex_embedded_c\ex_embedded_c.vcxproj", "{882EC43C-2EEE-434B-A711-C844108D29C6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E23B0040-F485-43D6-AA24-B34F9FED8484}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E23B0040-F485-43D6-AA24-B34F9FED8484}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Debug|Win32.ActiveCfg = Debug|Win32 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Debug|Win32.Build.0 = Debug|Win32 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Debug|x64.ActiveCfg = Debug|x64 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Debug|x64.Build.0 = Debug|x64 + {E23B0040-F485-43D6-AA24-B34F9FED8484}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E23B0040-F485-43D6-AA24-B34F9FED8484}.Release|Mixed Platforms.Build.0 = Release|Win32 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Release|Win32.ActiveCfg = Release|Win32 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Release|Win32.Build.0 = Release|Win32 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Release|x64.ActiveCfg = Release|x64 {E23B0040-F485-43D6-AA24-B34F9FED8484}.Release|x64.Build.0 = Release|x64 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Win32.ActiveCfg = Debug|Win32 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Win32.Build.0 = Debug|Win32 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|x64.ActiveCfg = Debug|x64 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|x64.Build.0 = Debug|x64 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Mixed Platforms.Build.0 = Release|Win32 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Win32.ActiveCfg = Release|Win32 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Win32.Build.0 = Release|Win32 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|x64.ActiveCfg = Release|x64 {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|x64.Build.0 = Release|x64 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.ActiveCfg = Debug|Win32 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.Build.0 = Debug|Win32 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|x64.ActiveCfg = Debug|x64 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|x64.Build.0 = Debug|x64 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Mixed Platforms.Build.0 = Release|Win32 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.ActiveCfg = Release|Win32 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.Build.0 = Release|Win32 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|x64.ActiveCfg = Release|x64 {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|x64.Build.0 = Release|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.ActiveCfg = Debug|Win32 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.Build.0 = Debug|Win32 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.ActiveCfg = Debug|x64 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.Build.0 = Debug|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Mixed Platforms.Build.0 = Release|Win32 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.ActiveCfg = Release|Win32 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.Build.0 = Release|Win32 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.ActiveCfg = Release|x64 {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.Build.0 = Release|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.ActiveCfg = Debug|Win32 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.Build.0 = Debug|Win32 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.ActiveCfg = Debug|x64 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.Build.0 = Debug|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Mixed Platforms.Build.0 = Release|Win32 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.ActiveCfg = Release|Win32 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.Build.0 = Release|Win32 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.ActiveCfg = Release|x64 {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.Build.0 = Release|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|x64.ActiveCfg = Debug|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|x64.Build.0 = Debug|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Mixed Platforms.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|x64.ActiveCfg = Release|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/VS2012/ex_embedded_c/ex_embedded_c.vcxproj b/VS2012/ex_embedded_c/ex_embedded_c.vcxproj new file mode 100644 index 00000000..4d11269c --- /dev/null +++ b/VS2012/ex_embedded_c/ex_embedded_c.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + {882EC43C-2EEE-434B-A711-C844108D29C6} + Win32Proj + ex_embedded_c + + + + Application + true + v110 + Unicode + + + Application + true + v110 + Unicode + + + Application + false + v110 + true + Unicode + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform) + + + true + $(SolutionDir)\$(Configuration)\$(Platform) + + + false + $(SolutionDir)\$(Configuration)\$(Platform) + + + false + $(SolutionDir)\$(Configuration)\$(Platform) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters b/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters new file mode 100644 index 00000000..cf2e4d05 --- /dev/null +++ b/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/examples/embedded_c/Makefile b/examples/embedded_c/Makefile new file mode 100644 index 00000000..9cd5c528 --- /dev/null +++ b/examples/embedded_c/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = embedded_c +SRC = embedded_c.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/examples/embedded_c/embedded_c.c b/examples/embedded_c/embedded_c.c new file mode 100644 index 00000000..b4f80247 --- /dev/null +++ b/examples/embedded_c/embedded_c.c @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2013 No Face Press, LLC +* License http://opensource.org/licenses/mit-license.php MIT License +*/ + +// Simple example program on how to use Embedded C++ interface. +#ifdef _WIN32 +#include +#else +#include +#endif + +#include +#include "civetweb.h" + + + +#define DOCUMENT_ROOT "." +#define PORT "8888" +#define EXAMPLE_URI "/example" +#define EXIT_URI "/exit" +int exitNow = 0; + +int ExampleHandler(struct mg_connection *conn, void *cbdata) { + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is example text!!!

"); + mg_printf(conn, "

To exit click here

", + EXIT_URI); + mg_printf(conn, "\n"); + return 1; +} + +int ExitHandler(struct mg_connection *conn, void *cbdata) { + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"); + mg_printf(conn, "Bye!\n"); + exitNow = 1; + return 1; +} + +int AHandler(struct mg_connection *conn, void *cbdata) { + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the A handler!!!

"); + mg_printf(conn, "\n"); + return 1; +} + +int ABHandler(struct mg_connection *conn, void *cbdata) { + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the AB handler!!!

"); + mg_printf(conn, "\n"); + return 1; +} + + +int main(int argc, char *argv[]) { + + const char * options[] = { "document_root", DOCUMENT_ROOT, + "listening_ports", PORT, 0 }; + struct mg_callbacks callbacks; + struct mg_context *ctx; + + memset(&callbacks, 0, sizeof(callbacks)); + ctx = mg_start(&callbacks, 0, options); + + mg_set_request_handler(ctx,EXAMPLE_URI, ExampleHandler,0); + mg_set_request_handler(ctx,EXIT_URI, ExitHandler,0); + mg_set_request_handler(ctx,"/a", AHandler,0); + mg_set_request_handler(ctx,"/a/b", ABHandler,0); // going out of order with this to see if it will work. + + printf("Browse files at http://localhost:%s/\n", PORT); + printf("Run example at http://localhost:%s%s\n", PORT, EXAMPLE_URI); + printf("Exit at http://localhost:%s%s\n", PORT, EXIT_URI); + + while (!exitNow) { +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); +#endif + } + + printf("Bye!\n"); + + return 0; +} diff --git a/test/MakefileTest.mk b/test/MakefileTest.mk index a88b6edc..37810859 100644 --- a/test/MakefileTest.mk +++ b/test/MakefileTest.mk @@ -26,6 +26,10 @@ dmg: $(MAKE) -C $(TOP) -f Makefile.osx clean package buildexamples: + $(MAKE) -C $(TOP)/examples/embedded_c clean all + $(MAKE) -C $(TOP)/examples/embedded_c clean + $(MAKE) -C $(TOP)/examples/embedded_cpp clean all + $(MAKE) -C $(TOP)/examples/embedded_cpp clean $(MAKE) -C $(TOP)/examples/chat clean all $(MAKE) -C $(TOP)/examples/chat clean $(MAKE) -C $(TOP)/examples/hello clean all @@ -36,8 +40,6 @@ buildexamples: $(MAKE) -C $(TOP)/examples/upload clean $(MAKE) -C $(TOP)/examples/websocket clean all $(MAKE) -C $(TOP)/examples/websocket clean - $(MAKE) -C $(TOP)/examples/embedded_cpp clean all - $(MAKE) -C $(TOP)/examples/embedded_cpp clean buildoptions: $(MAKE) -C $(TOP) clean build