From f7fcfa6a421e67ecf22fa5297b7a405fe0e2de84 Mon Sep 17 00:00:00 2001
From: Sergey Lyubka <valenok@gmail.com>
Date: Wed, 12 Mar 2014 12:31:53 +0000
Subject: [PATCH] Fixed C# example to work with 5.3

---
 examples/c#/example.cs  |  54 +++++++++++---------
 examples/c#/mongoose.cs | 107 +++++++++++++++-------------------------
 2 files changed, 71 insertions(+), 90 deletions(-)

diff --git a/examples/c#/example.cs b/examples/c#/example.cs
index e7fc453b4..3b0ced68d 100644
--- a/examples/c#/example.cs
+++ b/examples/c#/example.cs
@@ -2,36 +2,42 @@
 // https://github.com/cesanta/mongoose
 
 using System;
-using System.Runtime.InteropServices;
 
 public class Program {
-  static private int EventHandler(MongooseEvent ev) {
-    if (ev.type != 1) {
-      return 0; // Mark as unhandled
-    }
-
-    MongooseRequestInfo request_info = (MongooseRequestInfo)
-      Marshal.PtrToStructure(ev.request_info, typeof(MongooseRequestInfo));
-
-    if (request_info.uri != "/test") {
-      return 0; // Mark as unhandled
-    }
-
-    Mongoose.write(ev.conn, "HTTP/1.1 200 OK\r\n\r\n");
-    Mongoose.write(ev.conn, "Hello from C#!\n");
-
-    return 1; // Mark as handled
+  static private int EventHandler(IntPtr conn_ptr, int ev) {
+		MongooseConnection conn = (MongooseConnection)
+			System.Runtime.InteropServices.Marshal.PtrToStructure(
+				conn_ptr , typeof(MongooseConnection));
+
+		if (ev == 102) {
+			// MG_AUTH
+			return 1;
+		} else if (ev == 103) {
+			// MG_REQUEST
+	    Mongoose.send_data(conn_ptr, "Hello from C#!\n");
+			Mongoose.send_data(conn_ptr, "URI: " + conn.uri + "\n");
+			Mongoose.send_data(conn_ptr, "HTTP Headers:\n");
+			
+			for (int i = 0; i < conn.num_headers; i++) {
+				IntPtr name = conn.http_headers[i].name;
+				IntPtr val = conn.http_headers[i].value;
+				System.Runtime.InteropServices.Marshal.PtrToStringAnsi(name);
+				Mongoose.send_data(conn_ptr, "  " +
+					System.Runtime.InteropServices.Marshal.PtrToStringAnsi(name) + ": " +
+						System.Runtime.InteropServices.Marshal.PtrToStringAnsi(val) + "\n");
+			}			
+      return 1;
+		}
+		return 0;
   }
 
   static void Main() {
-    Mongoose web_server = new Mongoose(".", "9000",
+    Mongoose web_server = new Mongoose(".", "9001",
         new MongooseEventHandler(EventHandler));
 
-    Console.WriteLine("Mongoose v." + web_server.version_ + " started.");
-    Console.WriteLine("Press enter to exit program.");
-
-    // Serve requests until user presses "enter" on a keyboard
-    Console.ReadLine();
-    web_server.stop();
+    Console.WriteLine("Mongoose started, press Ctrl-C to exit.");
+		for (;;) {
+			web_server.poll(1000);
+		}
   }
 }
diff --git a/examples/c#/mongoose.cs b/examples/c#/mongoose.cs
index 61ad282b3..efd26581e 100644
--- a/examples/c#/mongoose.cs
+++ b/examples/c#/mongoose.cs
@@ -9,85 +9,60 @@ using System.Runtime.InteropServices;
   [MarshalAs(UnmanagedType.LPTStr)] public IntPtr value;
 };
 
-// mongoose.h :: struct mg_request_info
-[StructLayout(LayoutKind.Sequential)] public struct MongooseRequestInfo {
+// mongoose.h :: struct mg_connection
+[StructLayout(LayoutKind.Sequential)] public struct MongooseConnection {
   [MarshalAs(UnmanagedType.LPTStr)] public string request_method;
   [MarshalAs(UnmanagedType.LPTStr)] public string uri;
   [MarshalAs(UnmanagedType.LPTStr)] public string http_version;
   [MarshalAs(UnmanagedType.LPTStr)] public string query_string;
-  [MarshalAs(UnmanagedType.LPTStr)] public string remote_user;
-  public int remote_ip;
-  public int remote_port;
-  public int is_ssl;
-  [MarshalAs(UnmanagedType.ByValArray,SizeConst=64)]
-    public MongooseHeader[] http_headers;
-};
 
-[StructLayout(LayoutKind.Sequential)] public struct MongooseEvent {
-  public int type;
-  public IntPtr user_data;
-  public IntPtr conn_data;
-  public IntPtr event_param;
-  public IntPtr conn;
-  public IntPtr request_info;
+	[MarshalAs(UnmanagedType.ByValArray,SizeConst=48)] public char[] remote_ip;
+	[MarshalAs(UnmanagedType.LPTStr)] public string local_ip;
+	[MarshalAs(UnmanagedType.U2)] public short remote_port;
+	[MarshalAs(UnmanagedType.U2)] public short local_port;
+	
+	[MarshalAs(UnmanagedType.SysInt)] public int num_headers;
+  [MarshalAs(UnmanagedType.ByValArray,SizeConst=30)]
+    public MongooseHeader[] http_headers;
+	
+	[MarshalAs(UnmanagedType.LPTStr)] public IntPtr content;
+	[MarshalAs(UnmanagedType.SysInt)] public int content_len;
+	
+	[MarshalAs(UnmanagedType.SysInt)] public int is_websocket;
+	[MarshalAs(UnmanagedType.SysInt)] public int status_code;
+	[MarshalAs(UnmanagedType.SysInt)] public int wsbits;
 };
 
-public delegate int MongooseEventHandlerN(ref MongooseEvent ev);
-public delegate int MongooseEventHandler(MongooseEvent ev);
+public delegate int MongooseEventHandler(IntPtr c, int ev);
 
 public class Mongoose {
-  public const string dll_name_ = "mongoose";
-  public string version_ = "??";
-
-  // These are here to store a ref to the callbacks
-  // while they are over in unmanaged code, to prevent garbage collection.
-  private event MongooseEventHandlerN delegates;
-
-  private IntPtr ctx_;
-
-  [DllImport(dll_name_)] private static extern
-    IntPtr mg_start([MarshalAs(UnmanagedType.LPArray,
-                     ArraySubType=UnmanagedType.LPTStr)] string[] options,
-                    MongooseEventHandlerN callback,
-                    IntPtr user_data);
-  [DllImport(dll_name_)] private static extern void mg_stop(IntPtr ctx);
-  [DllImport(dll_name_)] private static extern IntPtr mg_version();
-  [DllImport(dll_name_)] public static extern int mg_write(IntPtr conn,
-      string data, int length);
+  public const string dll_ = "mongoose";
+  private IntPtr server_;
+
+	[DllImport(dll_)] private static extern IntPtr
+		mg_create_server(IntPtr user_data, MongooseEventHandler eh);
+	[DllImport(dll_)] private static extern int
+		mg_poll_server(IntPtr server, int milli);
+  [DllImport(dll_)] private static extern IntPtr
+		mg_set_option(IntPtr server, string name, string value);
+	[DllImport(dll_)] public static extern int
+		mg_send_data(IntPtr conn, string data, int length);	
 
   public Mongoose(string document_root,
-                  string listening_ports,
+                  string listening_port,
                   MongooseEventHandler event_handler) {
-    version_ = Marshal.PtrToStringAnsi(mg_version());
-
-    string[] options = {
-      "document_root", document_root,
-      "listening_ports", listening_ports,
-      null
-    };
-
-    MongooseEventHandlerN cb = delegate(ref MongooseEvent ev) {
-      return event_handler(ev);
-    };
-
-    // Prevent garbage collection
-    delegates += cb;
-
-    ctx_ = mg_start(options, cb, IntPtr.Zero);
+    server_ = mg_create_server(IntPtr.Zero, event_handler);
+		mg_set_option(server_, "document_root", document_root);
+		mg_set_option(server_, "listening_port", listening_port);
   }
-
-  public static int write(IntPtr conn, string data) {
-    return mg_write(conn, data, data.Length);
+	
+  public static int send_data(IntPtr conn, string data) {
+    return mg_send_data(conn, data, data.Length);
   }
-
-  public void stop() {
-    if (this.ctx_ != IntPtr.Zero) {
-      mg_stop(this.ctx_);
-    }
-    this.ctx_ = IntPtr.Zero;
-  }
-
-  ~Mongoose() {
-    stop();
+	
+	public void poll(int milli) {
+    mg_poll_server(server_, milli);
   }
+	
+	// TODO: add destructor and call mg_destroy_server()
 }
-- 
GitLab