soc.2009.penguin.visualstudio: df6b96f9: Latest build of the generator... getting...

wade at soc.pidgin.im wade at soc.pidgin.im
Sun Jul 5 20:35:38 EDT 2009


-----------------------------------------------------------------
Revision: df6b96f9b22b2b1246ad5fb90ce16161fd6a246e
Ancestor: 1bb16d5b8cb6dd66fb84a1ef592124eccf83ec49
Author: wade at soc.pidgin.im
Date: 2009-07-06T00:30:54
Branch: im.pidgin.soc.2009.penguin.visualstudio
URL: http://d.pidgin.im/viewmtn/revision/info/df6b96f9b22b2b1246ad5fb90ce16161fd6a246e

Added files:
        libpurple/wrapper/PurpleCircBuffer.cs
        libpurple/wrapper/PurpleSoundUiOps.cs
        libpurple/wrapper/PurpleWhiteboardPrplOps.cs
        libpurple/wrapper/PurpleWhiteboardUiOps.cs
        libpurple/wrapper/PurpleWrapper.csproj
        libpurple/wrapper/UnmanagedWrapper.cs
        libpurple/wrapper/XMLNodeClass.cs
        libpurple/wrapper/generator/CNamed.cs
        libpurple/wrapper/generator/Logger.cs
        libpurple/wrapper/generator/Scripts.csproj
        libpurple/wrapper/generator/UnableToCreateWrapperException.cs
Modified files:
        libpurple/wrapper/Account.cs libpurple/wrapper/Accountopt.cs
        libpurple/wrapper/Blist.cs libpurple/wrapper/Buddyicon.cs
        libpurple/wrapper/Certificate.cs libpurple/wrapper/Cipher.cs
        libpurple/wrapper/Circbuffer.cs libpurple/wrapper/Cmds.cs
        libpurple/wrapper/Config.cs libpurple/wrapper/Connection.cs
        libpurple/wrapper/Conversation.cs libpurple/wrapper/Core.cs
        libpurple/wrapper/Debug.cs libpurple/wrapper/Desktopitem.cs
        libpurple/wrapper/Dnsquery.cs libpurple/wrapper/Dnssrv.cs
        libpurple/wrapper/Eventloop.cs libpurple/wrapper/Ft.cs
        libpurple/wrapper/Idle.cs libpurple/wrapper/Imgstore.cs
        libpurple/wrapper/Log.cs libpurple/wrapper/Media.cs
        libpurple/wrapper/Mediamanager.cs libpurple/wrapper/Mime.cs
        libpurple/wrapper/NatPmp.cs libpurple/wrapper/Network.cs
        libpurple/wrapper/Notify.cs libpurple/wrapper/Ntlm.cs
        libpurple/wrapper/Plugin.cs libpurple/wrapper/Pluginpref.cs
        libpurple/wrapper/Pounce.cs libpurple/wrapper/Prefs.cs
        libpurple/wrapper/Privacy.cs libpurple/wrapper/Proxy.cs
        libpurple/wrapper/Prpl.cs libpurple/wrapper/PurpleAccount.cs
        libpurple/wrapper/PurpleAccountUiOps.cs
        libpurple/wrapper/PurpleAttentionType.cs
        libpurple/wrapper/PurpleBlistNode.cs
        libpurple/wrapper/PurpleBlistUiOps.cs
        libpurple/wrapper/PurpleBuddy.cs
        libpurple/wrapper/PurpleBuddyIconSpec.cs
        libpurple/wrapper/PurpleBuddyList.cs
        libpurple/wrapper/PurpleCertificate.cs
        libpurple/wrapper/PurpleCertificatePool.cs
        libpurple/wrapper/PurpleCertificateScheme.cs
        libpurple/wrapper/PurpleCertificateVerificationRequest.cs
        libpurple/wrapper/PurpleCertificateVerifier.cs
        libpurple/wrapper/PurpleChat.cs
        libpurple/wrapper/PurpleCipherOps.cs
        libpurple/wrapper/PurpleClient.cs
        libpurple/wrapper/PurpleConnection.cs
        libpurple/wrapper/PurpleContact.cs
        libpurple/wrapper/PurpleConvChat.cs
        libpurple/wrapper/PurpleConvChatBuddy.cs
        libpurple/wrapper/PurpleConvIm.cs
        libpurple/wrapper/PurpleConvMessage.cs
        libpurple/wrapper/PurpleConversation.cs
        libpurple/wrapper/PurpleConversationUiOps.cs
        libpurple/wrapper/PurpleEventLoopUiOps.cs
        libpurple/wrapper/PurpleGroup.cs
        libpurple/wrapper/PurpleKeyValuePair.cs
        libpurple/wrapper/PurpleLog.cs
        libpurple/wrapper/PurpleLogCommonLoggerData.cs
        libpurple/wrapper/PurpleLogLogger.cs
        libpurple/wrapper/PurpleLogSet.cs
        libpurple/wrapper/PurpleMenuAction.cs
        libpurple/wrapper/PurplePlugin.cs
        libpurple/wrapper/PurplePluginAction.cs
        libpurple/wrapper/PurplePluginInfo.cs
        libpurple/wrapper/PurplePluginLoaderInfo.cs
        libpurple/wrapper/PurplePluginProtocolInfo.cs
        libpurple/wrapper/PurplePluginUiInfo.cs
        libpurple/wrapper/PurplePounce.cs
        libpurple/wrapper/PurpleRequestField.cs
        libpurple/wrapper/PurpleRoomlist.cs
        libpurple/wrapper/PurpleRoomlistField.cs
        libpurple/wrapper/PurpleRoomlistRoom.cs
        libpurple/wrapper/PurpleRoomlistUiOps.cs
        libpurple/wrapper/PurpleSoundTheme.cs
        libpurple/wrapper/PurpleSoundThemeClass.cs
        libpurple/wrapper/PurpleSoundThemeLoader.cs
        libpurple/wrapper/PurpleSoundThemeLoaderClass.cs
        libpurple/wrapper/PurpleSrvResponse.cs
        libpurple/wrapper/PurpleSslConnection.cs
        libpurple/wrapper/PurpleStunNatDiscovery.cs
        libpurple/wrapper/PurpleTheme.cs
        libpurple/wrapper/PurpleThemeClass.cs
        libpurple/wrapper/PurpleThemeLoader.cs
        libpurple/wrapper/PurpleThemeLoaderClass.cs
        libpurple/wrapper/PurpleThemeManager.cs
        libpurple/wrapper/PurpleThemeManagerClass.cs
        libpurple/wrapper/PurpleWhiteboard.cs
        libpurple/wrapper/PurpleXfer.cs libpurple/wrapper/Request.cs
        libpurple/wrapper/Roomlist.cs
        libpurple/wrapper/Savedstatuses.cs
        libpurple/wrapper/Server.cs libpurple/wrapper/Signals.cs
        libpurple/wrapper/Smiley.cs libpurple/wrapper/Sound.cs
        libpurple/wrapper/SoundTheme.cs
        libpurple/wrapper/SoundThemeLoader.cs
        libpurple/wrapper/Sslconn.cs libpurple/wrapper/Status.cs
        libpurple/wrapper/Stringref.cs libpurple/wrapper/Stun.cs
        libpurple/wrapper/Theme.cs libpurple/wrapper/ThemeLoader.cs
        libpurple/wrapper/ThemeManager.cs libpurple/wrapper/Upnp.cs
        libpurple/wrapper/Util.cs libpurple/wrapper/Value.cs
        libpurple/wrapper/Version.cs libpurple/wrapper/Whiteboard.cs
        libpurple/wrapper/generator/CArgument.cs
        libpurple/wrapper/generator/CEnum.cs
        libpurple/wrapper/generator/CFile.cs
        libpurple/wrapper/generator/CFunction.cs
        libpurple/wrapper/generator/CStruct.cs
        libpurple/wrapper/generator/CTyped.cs
        libpurple/wrapper/generator/Program.cs
        libpurple/wrapper/generator/WrapperGenerator.cs
        libpurple/wrapper/proto_chat_entry.cs
        libpurple/wrapper/xmlnode.cs

ChangeLog: 

Latest build of the generator... getting closer to being a complete compiled wrapper (yay)!

-------------- next part --------------
============================================================
--- libpurple/wrapper/PurpleCircBuffer.cs	8c6b470cfb8c8de494759a2d443cf308c32ff9a8
+++ libpurple/wrapper/PurpleCircBuffer.cs	8c6b470cfb8c8de494759a2d443cf308c32ff9a8
@@ -0,0 +1,182 @@
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+/*
+ * This file was auto-generated from the libpurple header files to provide a
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
+ *
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace PurpleWrapper
+{
+	public class PurpleCircBuffer : UnmanagedWrapper<_PurpleCircBuffer>
+	{
+		public PurpleCircBuffer()
+		{
+		}
+
+		public PurpleCircBuffer(IntPtr refernece)
+		{
+			this.Reference = reference;
+			this.Data = (_PurpleCircBuffer)Marshal.PtrToStructure(this.Reference, typeof(_PurpleCircBuffer));
+		}
+
+		public string buffer
+		{
+			get
+			{
+				return this.Data.buffer;
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				this.Data.buffer = value;
+			}
+		}
+
+		public ulong growsize
+		{
+			get
+			{
+				return this.Data.growsize;
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				this.Data.growsize = value;
+			}
+		}
+
+		public ulong buflen
+		{
+			get
+			{
+				return this.Data.buflen;
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				this.Data.buflen = value;
+			}
+		}
+
+		public ulong bufused
+		{
+			get
+			{
+				return this.Data.bufused;
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				this.Data.bufused = value;
+			}
+		}
+
+		public string inptr
+		{
+			get
+			{
+				return this.Data.inptr;
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				this.Data.inptr = value;
+			}
+		}
+
+		public string outptr
+		{
+			get
+			{
+				return this.Data.outptr;
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				this.Data.outptr = value;
+			}
+		}
+
+	}
+
+
+	[StructLayout(LayoutKind.Sequential)]
+	class _PurpleCircBuffer
+	{
+		/*
+		 * gchar * buffer
+		 */
+		string buffer;
+
+		/*
+		 * gsize growsize
+		 */
+		ulong growsize;
+
+		/*
+		 * gsize buflen
+		 */
+		ulong buflen;
+
+		/*
+		 * gsize bufused
+		 */
+		ulong bufused;
+
+		/*
+		 * gchar * inptr
+		 */
+		string inptr;
+
+		/*
+		 * gchar * outptr
+		 */
+		string outptr;
+
+	}
+
+}
+
============================================================
--- libpurple/wrapper/PurpleSoundUiOps.cs	09dba0e8018c98a51920b59d97946e0c82784a42
+++ libpurple/wrapper/PurpleSoundUiOps.cs	09dba0e8018c98a51920b59d97946e0c82784a42
@@ -0,0 +1,222 @@
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+/*
+ * This file was auto-generated from the libpurple header files to provide a
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
+ *
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace PurpleWrapper
+{
+	public class PurpleSoundUiOps : UnmanagedWrapper<_PurpleSoundUiOps>
+	{
+		public PurpleSoundUiOps()
+		{
+		}
+
+		public PurpleSoundUiOps(IntPtr refernece)
+		{
+			this.Reference = reference;
+			this.Data = (_PurpleSoundUiOps)Marshal.PtrToStructure(this.Reference, typeof(_PurpleSoundUiOps));
+		}
+
+		public void init
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void uninit
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void play_file
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void play_event
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved1
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved2
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved3
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved4
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+	}
+
+
+	[StructLayout(LayoutKind.Sequential)]
+	class _PurpleSoundUiOps
+	{
+		/*
+		 * void (*init)()
+		 */
+		void init;
+
+		/*
+		 * void (*uninit)()
+		 */
+		void uninit;
+
+		/*
+		 * void (*play_file)(char * filename)
+		 */
+		void play_file;
+
+		/*
+		 * void (*play_event)(PurpleSoundEventID event)
+		 */
+		void play_event;
+
+		/*
+		 * void (*purple_reserved1)()
+		 */
+		void purple_reserved1;
+
+		/*
+		 * void (*purple_reserved2)()
+		 */
+		void purple_reserved2;
+
+		/*
+		 * void (*purple_reserved3)()
+		 */
+		void purple_reserved3;
+
+		/*
+		 * void (*purple_reserved4)()
+		 */
+		void purple_reserved4;
+
+	}
+
+}
+
============================================================
--- libpurple/wrapper/PurpleWhiteboardPrplOps.cs	d365c02abfa2a9ad02613b400745eeab25fe461a
+++ libpurple/wrapper/PurpleWhiteboardPrplOps.cs	d365c02abfa2a9ad02613b400745eeab25fe461a
@@ -0,0 +1,302 @@
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+/*
+ * This file was auto-generated from the libpurple header files to provide a
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
+ *
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace PurpleWrapper
+{
+	public class PurpleWhiteboardPrplOps : UnmanagedWrapper<_PurpleWhiteboardPrplOps>
+	{
+		public PurpleWhiteboardPrplOps()
+		{
+		}
+
+		public PurpleWhiteboardPrplOps(IntPtr refernece)
+		{
+			this.Reference = reference;
+			this.Data = (_PurpleWhiteboardPrplOps)Marshal.PtrToStructure(this.Reference, typeof(_PurpleWhiteboardPrplOps));
+		}
+
+		public void start
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void end
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void get_dimensions
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void set_dimensions
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void get_brush
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void set_brush
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void send_draw_list
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void clear
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved1
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved2
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved3
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved4
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+	}
+
+
+	[StructLayout(LayoutKind.Sequential)]
+	class _PurpleWhiteboardPrplOps
+	{
+		/*
+		 * void (*start)(PurpleWhiteboard * wb)
+		 */
+		void start;
+
+		/*
+		 * void (*end)(PurpleWhiteboard * wb)
+		 */
+		void end;
+
+		/*
+		 * void (*get_dimensions)(PurpleWhiteboard * wb, int * width, int * height)
+		 */
+		void get_dimensions;
+
+		/*
+		 * void (*set_dimensions)(PurpleWhiteboard * wb, int width, int height)
+		 */
+		void set_dimensions;
+
+		/*
+		 * void (*get_brush)(PurpleWhiteboard * wb, int * size, int * color)
+		 */
+		void get_brush;
+
+		/*
+		 * void (*set_brush)(PurpleWhiteboard * wb, int size, int color)
+		 */
+		void set_brush;
+
+		/*
+		 * void (*send_draw_list)(PurpleWhiteboard * wb, GList * draw_list)
+		 */
+		void send_draw_list;
+
+		/*
+		 * void (*clear)(PurpleWhiteboard * wb)
+		 */
+		void clear;
+
+		/*
+		 * void (*purple_reserved1)()
+		 */
+		void purple_reserved1;
+
+		/*
+		 * void (*purple_reserved2)()
+		 */
+		void purple_reserved2;
+
+		/*
+		 * void (*purple_reserved3)()
+		 */
+		void purple_reserved3;
+
+		/*
+		 * void (*purple_reserved4)()
+		 */
+		void purple_reserved4;
+
+	}
+
+}
+
============================================================
--- libpurple/wrapper/PurpleWhiteboardUiOps.cs	0db4c273647a9133290c51b0cdebba582f9cc00e
+++ libpurple/wrapper/PurpleWhiteboardUiOps.cs	0db4c273647a9133290c51b0cdebba582f9cc00e
@@ -0,0 +1,282 @@
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+/*
+ * This file was auto-generated from the libpurple header files to provide a
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
+ *
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace PurpleWrapper
+{
+	public class PurpleWhiteboardUiOps : UnmanagedWrapper<_PurpleWhiteboardUiOps>
+	{
+		public PurpleWhiteboardUiOps()
+		{
+		}
+
+		public PurpleWhiteboardUiOps(IntPtr refernece)
+		{
+			this.Reference = reference;
+			this.Data = (_PurpleWhiteboardUiOps)Marshal.PtrToStructure(this.Reference, typeof(_PurpleWhiteboardUiOps));
+		}
+
+		public void create
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void destroy
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void set_dimensions
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void set_brush
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void draw_point
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void draw_line
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void clear
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved1
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved2
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved3
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+		public void purple_reserved4
+		{
+			get
+			{
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+			set
+			{
+				if (this.Reference != IntPtr.Zero)
+					this.Reference = IntPtr.Zero;
+
+				throw new NotImplementedException(); /* Non-native type. */
+			}
+		}
+
+	}
+
+
+	[StructLayout(LayoutKind.Sequential)]
+	class _PurpleWhiteboardUiOps
+	{
+		/*
+		 * void (*create)(PurpleWhiteboard * wb)
+		 */
+		void create;
+
+		/*
+		 * void (*destroy)(PurpleWhiteboard * wb)
+		 */
+		void destroy;
+
+		/*
+		 * void (*set_dimensions)(PurpleWhiteboard * wb, int width, int height)
+		 */
+		void set_dimensions;
+
+		/*
+		 * void (*set_brush)(PurpleWhiteboard * wb, int size, int color)
+		 */
+		void set_brush;
+
+		/*
+		 * void (*draw_point)(PurpleWhiteboard * wb, int x, int y, int color, int size)
+		 */
+		void draw_point;
+
+		/*
+		 * void (*draw_line)(PurpleWhiteboard * wb, int x1, int y1, int x2, int y2, int color, int size)
+		 */
+		void draw_line;
+
+		/*
+		 * void (*clear)(PurpleWhiteboard * wb)
+		 */
+		void clear;
+
+		/*
+		 * void (*purple_reserved1)()
+		 */
+		void purple_reserved1;
+
+		/*
+		 * void (*purple_reserved2)()
+		 */
+		void purple_reserved2;
+
+		/*
+		 * void (*purple_reserved3)()
+		 */
+		void purple_reserved3;
+
+		/*
+		 * void (*purple_reserved4)()
+		 */
+		void purple_reserved4;
+
+	}
+
+}
+
============================================================
--- libpurple/wrapper/PurpleWrapper.csproj	50ed879bb620d12334a884f2d53574b347c9ce88
+++ libpurple/wrapper/PurpleWrapper.csproj	50ed879bb620d12334a884f2d53574b347c9ce88
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8034DEA9-30CC-DEA0-3903-80210CE809FA}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Scripts</RootNamespace>
+    <AssemblyName>Scripts</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="UnmanagedWrapper.cs" />
+    <Compile Include="Account.cs" />
+    <Compile Include="PurpleAccountUiOps.cs" />
+    <Compile Include="PurpleAccount.cs" />
+    <Compile Include="Accountopt.cs" />
+    <Compile Include="Blist.cs" />
+    <Compile Include="PurpleBlistNode.cs" />
+    <Compile Include="PurpleBuddy.cs" />
+    <Compile Include="PurpleContact.cs" />
+    <Compile Include="PurpleGroup.cs" />
+    <Compile Include="PurpleChat.cs" />
+    <Compile Include="PurpleBuddyList.cs" />
+    <Compile Include="PurpleBlistUiOps.cs" />
+    <Compile Include="Buddyicon.cs" />
+    <Compile Include="Certificate.cs" />
+    <Compile Include="PurpleCertificate.cs" />
+    <Compile Include="PurpleCertificatePool.cs" />
+    <Compile Include="PurpleCertificateScheme.cs" />
+    <Compile Include="PurpleCertificateVerifier.cs" />
+    <Compile Include="PurpleCertificateVerificationRequest.cs" />
+    <Compile Include="Cipher.cs" />
+    <Compile Include="PurpleCipherOps.cs" />
+    <Compile Include="Circbuffer.cs" />
+    <Compile Include="PurpleCircBuffer.cs" />
+    <Compile Include="Cmds.cs" />
+    <Compile Include="Config.cs" />
+    <Compile Include="Connection.cs" />
+    <Compile Include="PurpleConnection.cs" />
+    <Compile Include="Conversation.cs" />
+    <Compile Include="PurpleConversationUiOps.cs" />
+    <Compile Include="PurpleConvIm.cs" />
+    <Compile Include="PurpleConvChat.cs" />
+    <Compile Include="PurpleConvChatBuddy.cs" />
+    <Compile Include="PurpleConvMessage.cs" />
+    <Compile Include="PurpleConversation.cs" />
+    <Compile Include="Core.cs" />
+    <Compile Include="Debug.cs" />
+    <Compile Include="Desktopitem.cs" />
+    <Compile Include="Dnsquery.cs" />
+    <Compile Include="Dnssrv.cs" />
+    <Compile Include="PurpleSrvResponse.cs" />
+    <Compile Include="Eventloop.cs" />
+    <Compile Include="PurpleEventLoopUiOps.cs" />
+    <Compile Include="Ft.cs" />
+    <Compile Include="PurpleXfer.cs" />
+    <Compile Include="Idle.cs" />
+    <Compile Include="Imgstore.cs" />
+    <Compile Include="Log.cs" />
+    <Compile Include="PurpleLogLogger.cs" />
+    <Compile Include="PurpleLog.cs" />
+    <Compile Include="PurpleLogCommonLoggerData.cs" />
+    <Compile Include="PurpleLogSet.cs" />
+    <Compile Include="Media.cs" />
+    <Compile Include="Mediamanager.cs" />
+    <Compile Include="Mime.cs" />
+    <Compile Include="NatPmp.cs" />
+    <Compile Include="Network.cs" />
+    <Compile Include="Notify.cs" />
+    <Compile Include="Ntlm.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="PurplePluginInfo.cs" />
+    <Compile Include="PurplePluginLoaderInfo.cs" />
+    <Compile Include="PurplePlugin.cs" />
+    <Compile Include="PurplePluginUiInfo.cs" />
+    <Compile Include="PurplePluginAction.cs" />
+    <Compile Include="Pluginpref.cs" />
+    <Compile Include="Pounce.cs" />
+    <Compile Include="PurplePounce.cs" />
+    <Compile Include="Prefs.cs" />
+    <Compile Include="Privacy.cs" />
+    <Compile Include="Proxy.cs" />
+    <Compile Include="Prpl.cs" />
+    <Compile Include="PurpleBuddyIconSpec.cs" />
+    <Compile Include="proto_chat_entry.cs" />
+    <Compile Include="PurpleAttentionType.cs" />
+    <Compile Include="PurplePluginProtocolInfo.cs" />
+    <Compile Include="PurpleClient.cs" />
+    <Compile Include="Request.cs" />
+    <Compile Include="PurpleRequestField.cs" />
+    <Compile Include="Roomlist.cs" />
+    <Compile Include="PurpleRoomlist.cs" />
+    <Compile Include="PurpleRoomlistRoom.cs" />
+    <Compile Include="PurpleRoomlistField.cs" />
+    <Compile Include="PurpleRoomlistUiOps.cs" />
+    <Compile Include="Savedstatuses.cs" />
+    <Compile Include="Server.cs" />
+    <Compile Include="Signals.cs" />
+    <Compile Include="Smiley.cs" />
+    <Compile Include="SoundThemeLoader.cs" />
+    <Compile Include="PurpleSoundThemeLoader.cs" />
+    <Compile Include="PurpleSoundThemeLoaderClass.cs" />
+    <Compile Include="SoundTheme.cs" />
+    <Compile Include="PurpleSoundTheme.cs" />
+    <Compile Include="PurpleSoundThemeClass.cs" />
+    <Compile Include="Sound.cs" />
+    <Compile Include="PurpleSoundUiOps.cs" />
+    <Compile Include="Sslconn.cs" />
+    <Compile Include="PurpleSslConnection.cs" />
+    <Compile Include="Status.cs" />
+    <Compile Include="Stringref.cs" />
+    <Compile Include="Stun.cs" />
+    <Compile Include="PurpleStunNatDiscovery.cs" />
+    <Compile Include="ThemeLoader.cs" />
+    <Compile Include="PurpleThemeLoader.cs" />
+    <Compile Include="PurpleThemeLoaderClass.cs" />
+    <Compile Include="ThemeManager.cs" />
+    <Compile Include="PurpleThemeManager.cs" />
+    <Compile Include="PurpleThemeManagerClass.cs" />
+    <Compile Include="Theme.cs" />
+    <Compile Include="PurpleTheme.cs" />
+    <Compile Include="PurpleThemeClass.cs" />
+    <Compile Include="Upnp.cs" />
+    <Compile Include="Util.cs" />
+    <Compile Include="PurpleMenuAction.cs" />
+    <Compile Include="PurpleKeyValuePair.cs" />
+    <Compile Include="Value.cs" />
+    <Compile Include="Version.cs" />
+    <Compile Include="Whiteboard.cs" />
+    <Compile Include="PurpleWhiteboard.cs" />
+    <Compile Include="PurpleWhiteboardUiOps.cs" />
+    <Compile Include="PurpleWhiteboardPrplOps.cs" />
+    <Compile Include="XMLNodeClass.cs" />
+    <Compile Include="xmlnode.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
============================================================
--- libpurple/wrapper/UnmanagedWrapper.cs	fe31f3258cf986dc7b387bdcf5d5aa3371d050c3
+++ libpurple/wrapper/UnmanagedWrapper.cs	fe31f3258cf986dc7b387bdcf5d5aa3371d050c3
@@ -0,0 +1,25 @@
+using System;
+
+namespace UnmanagedWrapper
+{
+    public abstract class UnmanagedWrapper<T>
+    {
+        private T data;
+        private IntPtr reference;
+
+        public Type GetUnmanagedType() { return typeof(T); }
+
+        public IntPtr Reference
+        {
+            get { return reference; }
+            set { reference = value; }
+        }
+
+        public T Data
+        {
+            get { return data; }
+            set { data = value; }
+        }
+    }
+}
+
============================================================
--- libpurple/wrapper/XMLNodeClass.cs	774b83c36fad7d54be32876eb9d13cda2c1d73c0
+++ libpurple/wrapper/XMLNodeClass.cs	774b83c36fad7d54be32876eb9d13cda2c1d73c0
@@ -0,0 +1,330 @@
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+/*
+ * This file was auto-generated from the libpurple header files to provide a
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
+ *
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace PurpleWrapper
+{
+	public class XMLNodeClass
+	{
+		public enum XMLNodeType
+		{
+			XMLNODE_TYPE_TAG,
+			XMLNODE_TYPE_ATTRIB,
+			XMLNODE_TYPE_DATA
+		};
+
+		/*
+		 * xmlnode * xmlnode_new(char * name)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_new(string name);
+
+		public static xmlnode XmlnodeNew(string name)
+		{
+			return new xmlnode(xmlnode_new(name));
+		}
+
+		/*
+		 * xmlnode * xmlnode_new_child(xmlnode * parent, char * name)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_new_child(IntPtr parent, string name);
+
+		public static xmlnode XmlnodeNewChild(xmlnode parent, string name)
+		{
+			return new xmlnode(xmlnode_new_child(parent.Reference, name));
+		}
+
+		/*
+		 * void xmlnode_insert_child(xmlnode * parent, xmlnode * child)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_insert_child(IntPtr parent, IntPtr child);
+
+		public static void XmlnodeInsertChild(xmlnode parent, xmlnode child)
+		{
+			xmlnode_insert_child(parent.Reference, child.Reference);
+		}
+
+		/*
+		 * xmlnode * xmlnode_get_child(xmlnode * parent, char * name)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_get_child(IntPtr parent, string name);
+
+		public static xmlnode XmlnodeGetChild(xmlnode parent, string name)
+		{
+			return new xmlnode(xmlnode_get_child(parent.Reference, name));
+		}
+
+		/*
+		 * xmlnode * xmlnode_get_child_with_namespace(xmlnode * parent, char * name, char * xmlns)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_get_child_with_namespace(IntPtr parent, string name, string xmlns);
+
+		public static xmlnode XmlnodeGetChildWithNamespace(xmlnode parent, string name, string xmlns)
+		{
+			return new xmlnode(xmlnode_get_child_with_namespace(parent.Reference, name, xmlns));
+		}
+
+		/*
+		 * xmlnode * xmlnode_get_next_twin(xmlnode * node)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_get_next_twin(IntPtr node);
+
+		public static xmlnode XmlnodeGetNextTwin(xmlnode node)
+		{
+			return new xmlnode(xmlnode_get_next_twin(node.Reference));
+		}
+
+		/*
+		 * void xmlnode_insert_data(xmlnode * node, char * data, gssize size)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_insert_data(IntPtr node, string data, long size);
+
+		public static void XmlnodeInsertData(xmlnode node, string data, long size)
+		{
+			xmlnode_insert_data(node.Reference, data, size);
+		}
+
+		/*
+		 * char * xmlnode_get_data(xmlnode * node)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string xmlnode_get_data(IntPtr node);
+
+		public static string XmlnodeGetData(xmlnode node)
+		{
+			return xmlnode_get_data(node.Reference);
+		}
+
+		/*
+		 * char * xmlnode_get_data_unescaped(xmlnode * node)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string xmlnode_get_data_unescaped(IntPtr node);
+
+		public static string XmlnodeGetDataUnescaped(xmlnode node)
+		{
+			return xmlnode_get_data_unescaped(node.Reference);
+		}
+
+		/*
+		 * void xmlnode_set_attrib(xmlnode * node, char * attr, char * value)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_set_attrib(IntPtr node, string attr, string value);
+
+		public static void XmlnodeSetAttrib(xmlnode node, string attr, string value)
+		{
+			xmlnode_set_attrib(node.Reference, attr, value);
+		}
+
+		/*
+		 * void xmlnode_set_attrib_with_prefix(xmlnode * node, char * attr, char * prefix, char * value)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_set_attrib_with_prefix(IntPtr node, string attr, string prefix, string value);
+
+		public static void XmlnodeSetAttribWithPrefix(xmlnode node, string attr, string prefix, string value)
+		{
+			xmlnode_set_attrib_with_prefix(node.Reference, attr, prefix, value);
+		}
+
+		/*
+		 * void xmlnode_set_attrib_with_namespace(xmlnode * node, char * attr, char * xmlns, char * value)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_set_attrib_with_namespace(IntPtr node, string attr, string xmlns, string value);
+
+		public static void XmlnodeSetAttribWithNamespace(xmlnode node, string attr, string xmlns, string value)
+		{
+			xmlnode_set_attrib_with_namespace(node.Reference, attr, xmlns, value);
+		}
+
+		/*
+		 * char * xmlnode_get_attrib(xmlnode * node, char * attr)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string xmlnode_get_attrib(IntPtr node, string attr);
+
+		public static string XmlnodeGetAttrib(xmlnode node, string attr)
+		{
+			return xmlnode_get_attrib(node.Reference, attr);
+		}
+
+		/*
+		 * char * xmlnode_get_attrib_with_namespace(xmlnode * node, char * attr, char * xmlns)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string xmlnode_get_attrib_with_namespace(IntPtr node, string attr, string xmlns);
+
+		public static string XmlnodeGetAttribWithNamespace(xmlnode node, string attr, string xmlns)
+		{
+			return xmlnode_get_attrib_with_namespace(node.Reference, attr, xmlns);
+		}
+
+		/*
+		 * void xmlnode_remove_attrib(xmlnode * node, char * attr)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_remove_attrib(IntPtr node, string attr);
+
+		public static void XmlnodeRemoveAttrib(xmlnode node, string attr)
+		{
+			xmlnode_remove_attrib(node.Reference, attr);
+		}
+
+		/*
+		 * void xmlnode_remove_attrib_with_namespace(xmlnode * node, char * attr, char * xmlns)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_remove_attrib_with_namespace(IntPtr node, string attr, string xmlns);
+
+		public static void XmlnodeRemoveAttribWithNamespace(xmlnode node, string attr, string xmlns)
+		{
+			xmlnode_remove_attrib_with_namespace(node.Reference, attr, xmlns);
+		}
+
+		/*
+		 * void xmlnode_set_namespace(xmlnode * node, char * xmlns)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_set_namespace(IntPtr node, string xmlns);
+
+		public static void XmlnodeSetNamespace(xmlnode node, string xmlns)
+		{
+			xmlnode_set_namespace(node.Reference, xmlns);
+		}
+
+		/*
+		 * char * xmlnode_get_namespace(xmlnode * node)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string xmlnode_get_namespace(IntPtr node);
+
+		public static string XmlnodeGetNamespace(xmlnode node)
+		{
+			return xmlnode_get_namespace(node.Reference);
+		}
+
+		/*
+		 * void xmlnode_set_prefix(xmlnode * node, char * prefix)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_set_prefix(IntPtr node, string prefix);
+
+		public static void XmlnodeSetPrefix(xmlnode node, string prefix)
+		{
+			xmlnode_set_prefix(node.Reference, prefix);
+		}
+
+		/*
+		 * char * xmlnode_get_prefix(xmlnode * node)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string xmlnode_get_prefix(IntPtr node);
+
+		public static string XmlnodeGetPrefix(xmlnode node)
+		{
+			return xmlnode_get_prefix(node.Reference);
+		}
+
+		/*
+		 * xmlnode * xmlnode_get_parent(xmlnode * child)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_get_parent(IntPtr child);
+
+		public static xmlnode XmlnodeGetParent(xmlnode child)
+		{
+			return new xmlnode(xmlnode_get_parent(child.Reference));
+		}
+
+		/*
+		 * char * xmlnode_to_str(xmlnode * node, int * len)
+		 * 
+		 * Could not generate a wrapper for xmlnode_to_str in file "xmlnode.h".
+		 * Message: The type could not be resolved (int * len).
+		 */
+
+		/*
+		 * char * xmlnode_to_formatted_str(xmlnode * node, int * len)
+		 * 
+		 * Could not generate a wrapper for xmlnode_to_formatted_str in file "xmlnode.h".
+		 * Message: The type could not be resolved (int * len).
+		 */
+
+		/*
+		 * xmlnode * xmlnode_from_str(char * str, gssize size)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_from_str(string str, long size);
+
+		public static xmlnode XmlnodeFromStr(string str, long size)
+		{
+			return new xmlnode(xmlnode_from_str(str, size));
+		}
+
+		/*
+		 * xmlnode * xmlnode_copy(xmlnode * src)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr xmlnode_copy(IntPtr src);
+
+		public static xmlnode XmlnodeCopy(xmlnode src)
+		{
+			return new xmlnode(xmlnode_copy(src.Reference));
+		}
+
+		/*
+		 * void xmlnode_free(xmlnode * node)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern void xmlnode_free(IntPtr node);
+
+		public static void XmlnodeFree(xmlnode node)
+		{
+			xmlnode_free(node.Reference);
+		}
+
+	}
+}
+
============================================================
--- libpurple/wrapper/generator/CNamed.cs	d63df543c34227a3a13fd20d65c76032b7b5c64f
+++ libpurple/wrapper/generator/CNamed.cs	d63df543c34227a3a13fd20d65c76032b7b5c64f
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Scripts
+{
+    abstract class CNamed
+    {
+        private String name;
+        private CFile file;
+
+        public CNamed(CFile file, String name)
+        {
+            this.File = file;
+            this.Name = name;
+        }
+
+        public String Name
+        {
+            get
+            {
+                return name;
+            }
+            set
+            {
+                if (value.Length > 0 && value[0] == '_')
+                    name = value.Substring(1);
+                else
+                    name = value;
+            }
+        }
+
+        public String SafeName
+        {
+            get
+            {
+                if (this.Name == "in" || this.Name == "event")
+                    return this.Name + "_";
+                else
+                    return this.Name;
+            }
+        }
+
+        public CFile File
+        {
+            get { return file; }
+            set { file = value; }
+        }
+
+    }
+}
============================================================
--- libpurple/wrapper/generator/Logger.cs	fb4041ddc443b42d8884b8e6fa2a5109cb5044b3
+++ libpurple/wrapper/generator/Logger.cs	fb4041ddc443b42d8884b8e6fa2a5109cb5044b3
@@ -0,0 +1,23 @@
+using System;
+using System.IO;
+
+namespace Scripts
+{
+    class Logger
+    {
+        private static StreamWriter writer = new StreamWriter("log.txt");
+
+        public static void Log(String message)
+        {
+            message = message.Replace("\n", "\\n").Replace("\t", "\\t");
+            while (message.Contains("  "))
+                message = message.Replace("  ", " ");
+            writer.WriteLine(message);
+        }
+
+        public static void CloseLog()
+        {
+            writer.Close();
+        }
+    }
+}
============================================================
--- libpurple/wrapper/generator/Scripts.csproj	1dfc82b28a5b02fed7d655c44ae69a1812bbb9e4
+++ libpurple/wrapper/generator/Scripts.csproj	1dfc82b28a5b02fed7d655c44ae69a1812bbb9e4
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{43BF057D-B023-463D-B2E0-FDDA18CDE11A}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Scripts</RootNamespace>
+    <AssemblyName>Scripts</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CEnum.cs" />
+    <Compile Include="CFile.cs" />
+    <Compile Include="CFunction.cs" />
+    <Compile Include="CArgument.cs" />
+    <Compile Include="CNamed.cs" />
+    <Compile Include="CStruct.cs" />
+    <Compile Include="CTyped.cs" />
+    <Compile Include="Logger.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="UnableToCreateWrapperException.cs" />
+    <Compile Include="WrapperGenerator.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
============================================================
--- libpurple/wrapper/generator/UnableToCreateWrapperException.cs	afefa62bdee49974b5a77f19cb696b7ec00b35c0
+++ libpurple/wrapper/generator/UnableToCreateWrapperException.cs	afefa62bdee49974b5a77f19cb696b7ec00b35c0
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Scripts
+{
+    class UnableToCreateWrapperException : Exception
+    {
+        public UnableToCreateWrapperException(String message)
+            : base(message)
+        {
+        }
+    }
+}
============================================================
--- libpurple/wrapper/Account.cs	70927698aa381839a83cc58fa092442e653e2e69
+++ libpurple/wrapper/Account.cs	d6f19bee421380762e7f484e568cfb396a358bbe
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,6 +40,11 @@ namespace PurpleWrapper
 {
 	public class Account
 	{
+		public enum PurpleAccountRequestType
+		{
+			PURPLE_ACCOUNT_REQUEST_AUTHORIZATION = 0
+		};
+
 		/*
 		 * PurpleAccount * purple_account_new(char * username, char * protocol_id)
 		 */
@@ -46,7 +53,7 @@ namespace PurpleWrapper
 
 		public static PurpleAccount New(string username, string protocol_id)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_account_new(username, protocol_id));
 		}
 
 		/*
@@ -57,7 +64,7 @@ namespace PurpleWrapper
 
 		public static void Destroy(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_destroy(account.Reference);
 		}
 
 		/*
@@ -68,20 +75,16 @@ namespace PurpleWrapper
 
 		public static void Connect(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_connect(account.Reference);
 		}
 
 		/*
 		 * void purple_account_set_register_callback(PurpleAccount * account, PurpleAccountRegistrationCb cb, void * user_data)
+		 * 
+		 * Could not generate a wrapper for purple_account_set_register_callback in file "account.h".
+		 * Message: The type could not be resolved (PurpleAccountRegistrationCb cb).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_register_callback(IntPtr account, UNKNOWN cb, IntPtr user_data);
 
-		public static void SetRegisterCallback(PurpleAccount account, PurpleAccountRegistrationCb cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_account_register(PurpleAccount * account)
 		 */
@@ -90,20 +93,16 @@ namespace PurpleWrapper
 
 		public static void Register(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_register(account.Reference);
 		}
 
 		/*
 		 * void purple_account_unregister(PurpleAccount * account, PurpleAccountUnregistrationCb cb, void * user_data)
+		 * 
+		 * Could not generate a wrapper for purple_account_unregister in file "account.h".
+		 * Message: The type could not be resolved (PurpleAccountUnregistrationCb cb).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_unregister(IntPtr account, UNKNOWN cb, IntPtr user_data);
 
-		public static void Unregister(PurpleAccount account, PurpleAccountUnregistrationCb cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_account_disconnect(PurpleAccount * account)
 		 */
@@ -112,43 +111,10 @@ namespace PurpleWrapper
 
 		public static void Disconnect(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_disconnect(account.Reference);
 		}
 
 		/*
-		 * void purple_account_notify_added(PurpleAccount * account, char * remote_user, char * id, char * alias, char * message)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_notify_added(IntPtr account, string remote_user, string id, string alias, string message);
-
-		public static void NotifyAdded(PurpleAccount account, string remote_user, string id, string alias, string message)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_request_add(PurpleAccount * account, char * remote_user, char * id, char * alias, char * message)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_request_add(IntPtr account, string remote_user, string id, string alias, string message);
-
-		public static void RequestAdd(PurpleAccount account, string remote_user, string id, string alias, string message)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_account_request_authorization(PurpleAccount * account, char * remote_user, char * id, char * alias, char * message, gboolean on_list, PurpleAccountRequestAuthorizationCb auth_cb, PurpleAccountRequestAuthorizationCb deny_cb, void * user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_request_authorization(IntPtr account, string remote_user, string id, string alias, string message, bool on_list, UNKNOWN auth_cb, UNKNOWN deny_cb, IntPtr user_data);
-
-		public static IntPtr RequestAuthorization(PurpleAccount account, string remote_user, string id, string alias, string message, bool on_list, PurpleAccountRequestAuthorizationCb auth_cb, PurpleAccountRequestAuthorizationCb deny_cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_request_close_with_account(PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
@@ -156,7 +122,7 @@ namespace PurpleWrapper
 
 		public static void RequestCloseWithAccount(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_request_close_with_account(account.Reference);
 		}
 
 		/*
@@ -167,21 +133,10 @@ namespace PurpleWrapper
 
 		public static void RequestClose(IntPtr ui_handle)
 		{
-			throw new NotImplementedException();
+			purple_account_request_close(ui_handle);
 		}
 
 		/*
-		 * void purple_account_request_password(PurpleAccount * account, GCallback ok_cb, GCallback cancel_cb, void * user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_request_password(IntPtr account, UNKNOWN ok_cb, UNKNOWN cancel_cb, IntPtr user_data);
-
-		public static void RequestPassword(PurpleAccount account, GCallback ok_cb, GCallback cancel_cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_request_change_password(PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
@@ -189,7 +144,7 @@ namespace PurpleWrapper
 
 		public static void RequestChangePassword(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_request_change_password(account.Reference);
 		}
 
 		/*
@@ -200,7 +155,7 @@ namespace PurpleWrapper
 
 		public static void RequestChangeUserInfo(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_request_change_user_info(account.Reference);
 		}
 
 		/*
@@ -211,7 +166,7 @@ namespace PurpleWrapper
 
 		public static void SetUsername(PurpleAccount account, string username)
 		{
-			throw new NotImplementedException();
+			purple_account_set_username(account.Reference, username);
 		}
 
 		/*
@@ -222,7 +177,7 @@ namespace PurpleWrapper
 
 		public static void SetPassword(PurpleAccount account, string password)
 		{
-			throw new NotImplementedException();
+			purple_account_set_password(account.Reference, password);
 		}
 
 		/*
@@ -233,7 +188,7 @@ namespace PurpleWrapper
 
 		public static void SetAlias(PurpleAccount account, string alias)
 		{
-			throw new NotImplementedException();
+			purple_account_set_alias(account.Reference, alias);
 		}
 
 		/*
@@ -244,7 +199,7 @@ namespace PurpleWrapper
 
 		public static void SetUserInfo(PurpleAccount account, string user_info)
 		{
-			throw new NotImplementedException();
+			purple_account_set_user_info(account.Reference, user_info);
 		}
 
 		/*
@@ -255,21 +210,10 @@ namespace PurpleWrapper
 
 		public static void SetBuddyIconPath(PurpleAccount account, string path)
 		{
-			throw new NotImplementedException();
+			purple_account_set_buddy_icon_path(account.Reference, path);
 		}
 
 		/*
-		 * void purple_account_set_protocol_id(PurpleAccount * account, char * protocol_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_protocol_id(IntPtr account, string protocol_id);
-
-		public static void SetProtocolId(PurpleAccount account, string protocol_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_set_connection(PurpleAccount * account, PurpleConnection * gc)
 		 */
 		[DllImport("libpurple.dll")]
@@ -277,7 +221,7 @@ namespace PurpleWrapper
 
 		public static void SetConnection(PurpleAccount account, PurpleConnection gc)
 		{
-			throw new NotImplementedException();
+			purple_account_set_connection(account.Reference, gc.Reference);
 		}
 
 		/*
@@ -288,7 +232,7 @@ namespace PurpleWrapper
 
 		public static void SetRememberPassword(PurpleAccount account, bool value)
 		{
-			throw new NotImplementedException();
+			purple_account_set_remember_password(account.Reference, value);
 		}
 
 		/*
@@ -299,65 +243,24 @@ namespace PurpleWrapper
 
 		public static void SetCheckMail(PurpleAccount account, bool value)
 		{
-			throw new NotImplementedException();
+			purple_account_set_check_mail(account.Reference, value);
 		}
 
 		/*
-		 * void purple_account_set_enabled(PurpleAccount * account, char * ui, gboolean value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_enabled(IntPtr account, string ui, bool value);
-
-		public static void SetEnabled(PurpleAccount account, string ui, bool value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_set_proxy_info(PurpleAccount * account, PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_account_set_proxy_info in file "account.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_proxy_info(IntPtr account, IntPtr info);
 
-		public static void SetProxyInfo(PurpleAccount account, PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_account_set_status_types(PurpleAccount * account, GList * status_types)
+		 * 
+		 * Could not generate a wrapper for purple_account_set_status_types in file "account.h".
+		 * Message: The type could not be resolved (GList * status_types).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_status_types(IntPtr account, IntPtr status_types);
 
-		public static void SetStatusTypes(PurpleAccount account, GList status_types)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_account_set_status(PurpleAccount * account, char * status_id, gboolean active, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_status(IntPtr account, string status_id, bool active, ...);
-
-		public static void SetStatus(PurpleAccount account, string status_id, bool active, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_set_status_list(PurpleAccount * account, char * status_id, gboolean active, GList * attrs)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_status_list(IntPtr account, string status_id, bool active, IntPtr attrs);
-
-		public static void SetStatusList(PurpleAccount account, string status_id, bool active, GList attrs)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_clear_settings(PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
@@ -365,7 +268,7 @@ namespace PurpleWrapper
 
 		public static void ClearSettings(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_clear_settings(account.Reference);
 		}
 
 		/*
@@ -376,65 +279,10 @@ namespace PurpleWrapper
 
 		public static void SetInt(PurpleAccount account, string name, int value)
 		{
-			throw new NotImplementedException();
+			purple_account_set_int(account.Reference, name, value);
 		}
 
 		/*
-		 * void purple_account_set_string(PurpleAccount * account, char * name, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_string(IntPtr account, string name, string value);
-
-		public static void SetString(PurpleAccount account, string name, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_set_bool(PurpleAccount * account, char * name, gboolean value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_bool(IntPtr account, string name, bool value);
-
-		public static void SetBool(PurpleAccount account, string name, bool value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_set_ui_int(PurpleAccount * account, char * ui, char * name, int value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_ui_int(IntPtr account, string ui, string name, int value);
-
-		public static void SetUiInt(PurpleAccount account, string ui, string name, int value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_set_ui_string(PurpleAccount * account, char * ui, char * name, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_ui_string(IntPtr account, string ui, string name, string value);
-
-		public static void SetUiString(PurpleAccount account, string ui, string name, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_set_ui_bool(PurpleAccount * account, char * ui, char * name, gboolean value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_set_ui_bool(IntPtr account, string ui, string name, bool value);
-
-		public static void SetUiBool(PurpleAccount account, string ui, string name, bool value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_account_is_connected(PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
@@ -442,7 +290,7 @@ namespace PurpleWrapper
 
 		public static bool IsConnected(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_is_connected(account.Reference);
 		}
 
 		/*
@@ -453,7 +301,7 @@ namespace PurpleWrapper
 
 		public static bool IsConnecting(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_is_connecting(account.Reference);
 		}
 
 		/*
@@ -464,7 +312,7 @@ namespace PurpleWrapper
 
 		public static bool IsDisconnected(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_is_disconnected(account.Reference);
 		}
 
 		/*
@@ -475,7 +323,7 @@ namespace PurpleWrapper
 
 		public static string GetUsername(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_username(account.Reference);
 		}
 
 		/*
@@ -486,7 +334,7 @@ namespace PurpleWrapper
 
 		public static string GetPassword(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_password(account.Reference);
 		}
 
 		/*
@@ -497,7 +345,7 @@ namespace PurpleWrapper
 
 		public static string GetAlias(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_alias(account.Reference);
 		}
 
 		/*
@@ -508,7 +356,7 @@ namespace PurpleWrapper
 
 		public static string GetUserInfo(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_user_info(account.Reference);
 		}
 
 		/*
@@ -519,7 +367,7 @@ namespace PurpleWrapper
 
 		public static string GetBuddyIconPath(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_buddy_icon_path(account.Reference);
 		}
 
 		/*
@@ -530,7 +378,7 @@ namespace PurpleWrapper
 
 		public static string GetProtocolId(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_protocol_id(account.Reference);
 		}
 
 		/*
@@ -541,7 +389,7 @@ namespace PurpleWrapper
 
 		public static string GetProtocolName(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_protocol_name(account.Reference);
 		}
 
 		/*
@@ -552,7 +400,7 @@ namespace PurpleWrapper
 
 		public static PurpleConnection GetConnection(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return new PurpleConnection(purple_account_get_connection(account.Reference));
 		}
 
 		/*
@@ -563,7 +411,7 @@ namespace PurpleWrapper
 
 		public static bool GetRememberPassword(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_remember_password(account.Reference);
 		}
 
 		/*
@@ -574,175 +422,38 @@ namespace PurpleWrapper
 
 		public static bool GetCheckMail(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_account_get_check_mail(account.Reference);
 		}
 
 		/*
-		 * gboolean purple_account_get_enabled(PurpleAccount * account, char * ui)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_account_get_enabled(IntPtr account, string ui);
-
-		public static bool GetEnabled(PurpleAccount account, string ui)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleProxyInfo * purple_account_get_proxy_info(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_account_get_proxy_info in file "account.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * purple_account_get_proxy_info(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_proxy_info(IntPtr account);
 
-		public static PurpleProxyInfo GetProxyInfo(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleStatus * purple_account_get_active_status(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_account_get_active_status in file "account.h".
+		 * Message: The type could not be resolved (PurpleStatus * purple_account_get_active_status(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_active_status(IntPtr account);
 
-		public static PurpleStatus GetActiveStatus(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleStatus * purple_account_get_status(PurpleAccount * account, char * status_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_status(IntPtr account, string status_id);
-
-		public static PurpleStatus GetStatus(PurpleAccount account, string status_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleStatusType * purple_account_get_status_type(PurpleAccount * account, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_status_type(IntPtr account, string id);
-
-		public static PurpleStatusType GetStatusType(PurpleAccount account, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleStatusType * purple_account_get_status_type_with_primitive(PurpleAccount * account, PurpleStatusPrimitive primitive)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_status_type_with_primitive(IntPtr account, UNKNOWN primitive);
-
-		public static PurpleStatusType GetStatusTypeWithPrimitive(PurpleAccount account, PurpleStatusPrimitive primitive)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurplePresence * purple_account_get_presence(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_account_get_presence in file "account.h".
+		 * Message: The type could not be resolved (PurplePresence * purple_account_get_presence(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_presence(IntPtr account);
 
-		public static PurplePresence GetPresence(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_account_is_status_active(PurpleAccount * account, char * status_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_account_is_status_active(IntPtr account, string status_id);
-
-		public static bool IsStatusActive(PurpleAccount account, string status_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_account_get_status_types(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_account_get_status_types in file "account.h".
+		 * Message: The type could not be resolved (GList * purple_account_get_status_types(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_status_types(IntPtr account);
 
-		public static GList GetStatusTypes(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * int purple_account_get_int(PurpleAccount * account, char * name, int default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_account_get_int(IntPtr account, string name, int default_value);
-
-		public static int GetInt(PurpleAccount account, string name, int default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_account_get_string(PurpleAccount * account, char * name, char * default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_get_string(IntPtr account, string name, string default_value);
-
-		public static string GetString(PurpleAccount account, string name, string default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_account_get_bool(PurpleAccount * account, char * name, gboolean default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_account_get_bool(IntPtr account, string name, bool default_value);
-
-		public static bool GetBool(PurpleAccount account, string name, bool default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * int purple_account_get_ui_int(PurpleAccount * account, char * ui, char * name, int default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_account_get_ui_int(IntPtr account, string ui, string name, int default_value);
-
-		public static int GetUiInt(PurpleAccount account, string ui, string name, int default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_account_get_ui_string(PurpleAccount * account, char * ui, char * name, char * default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_get_ui_string(IntPtr account, string ui, string name, string default_value);
-
-		public static string GetUiString(PurpleAccount account, string ui, string name, string default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_account_get_ui_bool(PurpleAccount * account, char * ui, char * name, gboolean default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_account_get_ui_bool(IntPtr account, string ui, string name, bool default_value);
-
-		public static bool GetUiBool(PurpleAccount account, string ui, string name, bool default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleLog * purple_account_get_log(PurpleAccount * account, gboolean create)
 		 */
 		[DllImport("libpurple.dll")]
@@ -750,7 +461,7 @@ namespace PurpleWrapper
 
 		public static PurpleLog GetLog(PurpleAccount account, bool create)
 		{
-			throw new NotImplementedException();
+			return new PurpleLog(purple_account_get_log(account.Reference, create));
 		}
 
 		/*
@@ -761,7 +472,7 @@ namespace PurpleWrapper
 
 		public static void DestroyLog(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_destroy_log(account.Reference);
 		}
 
 		/*
@@ -772,43 +483,17 @@ namespace PurpleWrapper
 
 		public static void AddBuddy(PurpleAccount account, PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			purple_account_add_buddy(account.Reference, buddy.Reference);
 		}
 
 		/*
 		 * void purple_account_add_buddies(PurpleAccount * account, GList * buddies)
+		 * 
+		 * Could not generate a wrapper for purple_account_add_buddies in file "account.h".
+		 * Message: The type could not be resolved (GList * buddies).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_add_buddies(IntPtr account, IntPtr buddies);
 
-		public static void AddBuddies(PurpleAccount account, GList buddies)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_account_remove_buddy(PurpleAccount * account, PurpleBuddy * buddy, PurpleGroup * group)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_remove_buddy(IntPtr account, IntPtr buddy, IntPtr group);
-
-		public static void RemoveBuddy(PurpleAccount account, PurpleBuddy buddy, PurpleGroup group)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_remove_buddies(PurpleAccount * account, GList * buddies, GList * groups)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_remove_buddies(IntPtr account, IntPtr buddies, IntPtr groups);
-
-		public static void RemoveBuddies(PurpleAccount account, GList buddies, GList groups)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_remove_group(PurpleAccount * account, PurpleGroup * group)
 		 */
 		[DllImport("libpurple.dll")]
@@ -816,21 +501,10 @@ namespace PurpleWrapper
 
 		public static void RemoveGroup(PurpleAccount account, PurpleGroup group)
 		{
-			throw new NotImplementedException();
+			purple_account_remove_group(account.Reference, group.Reference);
 		}
 
 		/*
-		 * void purple_account_change_password(PurpleAccount * account, char * orig_pw, char * new_pw)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_change_password(IntPtr account, string orig_pw, string new_pw);
-
-		public static void ChangePassword(PurpleAccount account, string orig_pw, string new_pw)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_account_supports_offline_message(PurpleAccount * account, PurpleBuddy * buddy)
 		 */
 		[DllImport("libpurple.dll")]
@@ -838,20 +512,16 @@ namespace PurpleWrapper
 
 		public static bool SupportsOfflineMessage(PurpleAccount account, PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_account_supports_offline_message(account.Reference, buddy.Reference);
 		}
 
 		/*
 		 * PurpleConnectionErrorInfo * purple_account_get_current_error(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_account_get_current_error in file "account.h".
+		 * Message: The type could not be resolved (PurpleConnectionErrorInfo * purple_account_get_current_error(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_get_current_error(IntPtr account);
 
-		public static PurpleConnectionErrorInfo GetCurrentError(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_account_clear_current_error(PurpleAccount * account)
 		 */
@@ -860,7 +530,7 @@ namespace PurpleWrapper
 
 		public static void ClearCurrentError(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_account_clear_current_error(account.Reference);
 		}
 
 		/*
@@ -871,7 +541,7 @@ namespace PurpleWrapper
 
 		public static void AccountsAdd(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_accounts_add(account.Reference);
 		}
 
 		/*
@@ -882,7 +552,7 @@ namespace PurpleWrapper
 
 		public static void AccountsRemove(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_accounts_remove(account.Reference);
 		}
 
 		/*
@@ -893,7 +563,7 @@ namespace PurpleWrapper
 
 		public static void AccountsDelete(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_accounts_delete(account.Reference);
 		}
 
 		/*
@@ -904,31 +574,23 @@ namespace PurpleWrapper
 
 		public static void AccountsReorder(PurpleAccount account, int new_index)
 		{
-			throw new NotImplementedException();
+			purple_accounts_reorder(account.Reference, new_index);
 		}
 
 		/*
 		 * GList * purple_accounts_get_all()
+		 * 
+		 * Could not generate a wrapper for purple_accounts_get_all in file "account.h".
+		 * Message: The type could not be resolved (GList * purple_accounts_get_all()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_accounts_get_all();
 
-		public static GList AccountsGetAll()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_accounts_get_all_active()
+		 * 
+		 * Could not generate a wrapper for purple_accounts_get_all_active in file "account.h".
+		 * Message: The type could not be resolved (GList * purple_accounts_get_all_active()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_accounts_get_all_active();
 
-		public static GList AccountsGetAllActive()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleAccount * purple_accounts_find(char * name, char * protocol)
 		 */
@@ -937,7 +599,7 @@ namespace PurpleWrapper
 
 		public static PurpleAccount AccountsFind(string name, string protocol)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_accounts_find(name, protocol));
 		}
 
 		/*
@@ -948,7 +610,7 @@ namespace PurpleWrapper
 
 		public static void AccountsRestoreCurrentStatuses()
 		{
-			throw new NotImplementedException();
+			purple_accounts_restore_current_statuses();
 		}
 
 		/*
@@ -959,7 +621,7 @@ namespace PurpleWrapper
 
 		public static void AccountsSetUiOps(PurpleAccountUiOps ops)
 		{
-			throw new NotImplementedException();
+			purple_accounts_set_ui_ops(ops.Reference);
 		}
 
 		/*
@@ -970,7 +632,7 @@ namespace PurpleWrapper
 
 		public static PurpleAccountUiOps AccountsGetUiOps()
 		{
-			throw new NotImplementedException();
+			return new PurpleAccountUiOps(purple_accounts_get_ui_ops());
 		}
 
 		/*
@@ -981,7 +643,7 @@ namespace PurpleWrapper
 
 		public static IntPtr AccountsGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_accounts_get_handle();
 		}
 
 		/*
@@ -992,7 +654,7 @@ namespace PurpleWrapper
 
 		public static void AccountsInit()
 		{
-			throw new NotImplementedException();
+			purple_accounts_init();
 		}
 
 		/*
@@ -1003,7 +665,7 @@ namespace PurpleWrapper
 
 		public static void AccountsUninit()
 		{
-			throw new NotImplementedException();
+			purple_accounts_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Accountopt.cs	e6d67721f2e0e0e7984f117f9e94f20f47b128b5
+++ libpurple/wrapper/Accountopt.cs	6c35b6cd6340f52913a46e0055a452ee4b233a75
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,313 +41,110 @@ namespace PurpleWrapper
 	public class Accountopt
 	{
 		/*
-		 * PurpleAccountOption * purple_account_option_new(PurplePrefType type, char * text, char * pref_name)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_option_new(UNKNOWN type, string text, string pref_name);
-
-		public static PurpleAccountOption AccountOptionNew(PurplePrefType type, string text, string pref_name)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleAccountOption * purple_account_option_bool_new(char * text, char * pref_name, gboolean default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_option_bool_new(string text, string pref_name, bool default_value);
-
-		public static PurpleAccountOption AccountOptionBoolNew(string text, string pref_name, bool default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleAccountOption * purple_account_option_int_new(char * text, char * pref_name, int default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_option_int_new(string text, string pref_name, int default_value);
-
-		public static PurpleAccountOption AccountOptionIntNew(string text, string pref_name, int default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleAccountOption * purple_account_option_string_new(char * text, char * pref_name, char * default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_option_string_new(string text, string pref_name, string default_value);
-
-		public static PurpleAccountOption AccountOptionStringNew(string text, string pref_name, string default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleAccountOption * purple_account_option_list_new(char * text, char * pref_name, GList * list)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_option_list_new(string text, string pref_name, IntPtr list);
-
-		public static PurpleAccountOption AccountOptionListNew(string text, string pref_name, GList list)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_option_destroy(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_destroy in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_option_destroy(IntPtr option);
 
-		public static void AccountOptionDestroy(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_account_option_set_default_bool(PurpleAccountOption * option, gboolean value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_option_set_default_bool(IntPtr option, bool value);
-
-		public static void AccountOptionSetDefaultBool(PurpleAccountOption option, bool value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_option_set_default_int(PurpleAccountOption * option, int value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_option_set_default_int(IntPtr option, int value);
-
-		public static void AccountOptionSetDefaultInt(PurpleAccountOption option, int value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_account_option_set_default_string(PurpleAccountOption * option, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_option_set_default_string(IntPtr option, string value);
-
-		public static void AccountOptionSetDefaultString(PurpleAccountOption option, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_option_set_masked(PurpleAccountOption * option, gboolean masked)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_set_masked in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_option_set_masked(IntPtr option, bool masked);
 
-		public static void AccountOptionSetMasked(PurpleAccountOption option, bool masked)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_account_option_set_list(PurpleAccountOption * option, GList * values)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_set_list in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_option_set_list(IntPtr option, IntPtr values);
 
-		public static void AccountOptionSetList(PurpleAccountOption option, GList values)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_account_option_add_list_item(PurpleAccountOption * option, char * key, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_option_add_list_item(IntPtr option, string key, string value);
-
-		public static void AccountOptionAddListItem(PurpleAccountOption option, string key, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurplePrefType purple_account_option_get_type(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_get_type in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_account_option_get_type(IntPtr option);
 
-		public static PurplePrefType AccountOptionGetType(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_account_option_get_text(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_get_text in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_option_get_text(IntPtr option);
 
-		public static string AccountOptionGetText(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_account_option_get_setting(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_get_setting in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_option_get_setting(IntPtr option);
 
-		public static string AccountOptionGetSetting(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_account_option_get_default_bool(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_get_default_bool in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_account_option_get_default_bool(IntPtr option);
 
-		public static bool AccountOptionGetDefaultBool(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * int purple_account_option_get_default_int(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_get_default_int in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_account_option_get_default_int(IntPtr option);
 
-		public static int AccountOptionGetDefaultInt(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char * purple_account_option_get_default_string(PurpleAccountOption * option)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_option_get_default_string(IntPtr option);
-
-		public static string AccountOptionGetDefaultString(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_account_option_get_default_list_value(PurpleAccountOption * option)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_option_get_default_list_value(IntPtr option);
-
-		public static string AccountOptionGetDefaultListValue(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_account_option_get_masked(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_get_masked in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountOption * option).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_account_option_get_masked(IntPtr option);
 
-		public static bool AccountOptionGetMasked(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_account_option_get_list(PurpleAccountOption * option)
+		 * 
+		 * Could not generate a wrapper for purple_account_option_get_list in file "accountopt.h".
+		 * Message: The type could not be resolved (GList * purple_account_option_get_list(PurpleAccountOption * option)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_option_get_list(IntPtr option);
 
-		public static GList AccountOptionGetList(PurpleAccountOption option)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleAccountUserSplit * purple_account_user_split_new(char * text, char * default_value, char sep)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_account_user_split_new(string text, string default_value, char sep);
-
-		public static PurpleAccountUserSplit AccountUserSplitNew(string text, string default_value, char sep)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_account_user_split_destroy(PurpleAccountUserSplit * split)
+		 * 
+		 * Could not generate a wrapper for purple_account_user_split_destroy in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountUserSplit * split).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_user_split_destroy(IntPtr split);
 
-		public static void AccountUserSplitDestroy(PurpleAccountUserSplit split)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_account_user_split_get_text(PurpleAccountUserSplit * split)
+		 * 
+		 * Could not generate a wrapper for purple_account_user_split_get_text in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountUserSplit * split).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_user_split_get_text(IntPtr split);
 
-		public static string AccountUserSplitGetText(PurpleAccountUserSplit split)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char * purple_account_user_split_get_default_value(PurpleAccountUserSplit * split)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_account_user_split_get_default_value(IntPtr split);
-
-		public static string AccountUserSplitGetDefaultValue(PurpleAccountUserSplit split)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char purple_account_user_split_get_separator(PurpleAccountUserSplit * split)
+		 * 
+		 * Could not generate a wrapper for purple_account_user_split_get_separator in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountUserSplit * split).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern char purple_account_user_split_get_separator(IntPtr split);
 
-		public static char AccountUserSplitGetSeparator(PurpleAccountUserSplit split)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_account_user_split_get_reverse(PurpleAccountUserSplit * split)
+		 * 
+		 * Could not generate a wrapper for purple_account_user_split_get_reverse in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountUserSplit * split).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_account_user_split_get_reverse(IntPtr split);
 
-		public static bool AccountUserSplitGetReverse(PurpleAccountUserSplit split)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_account_user_split_set_reverse(PurpleAccountUserSplit * split, gboolean reverse)
+		 * 
+		 * Could not generate a wrapper for purple_account_user_split_set_reverse in file "accountopt.h".
+		 * Message: The type could not be resolved (PurpleAccountUserSplit * split).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_account_user_split_set_reverse(IntPtr split, bool reverse);
 
-		public static void AccountUserSplitSetReverse(PurpleAccountUserSplit split, bool reverse)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Blist.cs	0113806aa65037779a4db8efa36f04ece107dc99
+++ libpurple/wrapper/Blist.cs	3205c6bf422ceaa0f02ac281f0afbc21d0683f03
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,6 +40,20 @@ namespace PurpleWrapper
 {
 	public class Blist
 	{
+		public enum PurpleBlistNodeType
+		{
+			PURPLE_BLIST_GROUP_NODE,
+			PURPLE_BLIST_CONTACT_NODE,
+			PURPLE_BLIST_BUDDY_NODE,
+			PURPLE_BLIST_CHAT_NODE,
+			PURPLE_BLIST_OTHER_NODE
+		};
+
+		public enum PurpleBlistNodeFlags
+		{
+			PURPLE_BLIST_NODE_FLAG_NO_SAVE = 1 << 0
+		};
+
 		/*
 		 * PurpleBuddyList * purple_blist_new()
 		 */
@@ -46,7 +62,7 @@ namespace PurpleWrapper
 
 		public static PurpleBuddyList New()
 		{
-			throw new NotImplementedException();
+			return new PurpleBuddyList(purple_blist_new());
 		}
 
 		/*
@@ -57,7 +73,7 @@ namespace PurpleWrapper
 
 		public static void SetBlist(PurpleBuddyList blist)
 		{
-			throw new NotImplementedException();
+			purple_set_blist(blist.Reference);
 		}
 
 		/*
@@ -68,7 +84,7 @@ namespace PurpleWrapper
 
 		public static PurpleBuddyList GetBlist()
 		{
-			throw new NotImplementedException();
+			return new PurpleBuddyList(purple_get_blist());
 		}
 
 		/*
@@ -79,20 +95,16 @@ namespace PurpleWrapper
 
 		public static PurpleBlistNode GetRoot()
 		{
-			throw new NotImplementedException();
+			return new PurpleBlistNode(purple_blist_get_root());
 		}
 
 		/*
 		 * GSList * purple_blist_get_buddies()
+		 * 
+		 * Could not generate a wrapper for purple_blist_get_buddies in file "blist.h".
+		 * Message: The type could not be resolved (GSList * purple_blist_get_buddies()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_blist_get_buddies();
 
-		public static GSList GetBuddies()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gpointer purple_blist_get_ui_data()
 		 */
@@ -101,7 +113,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetUiData()
 		{
-			throw new NotImplementedException();
+			return purple_blist_get_ui_data();
 		}
 
 		/*
@@ -112,7 +124,7 @@ namespace PurpleWrapper
 
 		public static void SetUiData(IntPtr ui_data)
 		{
-			throw new NotImplementedException();
+			purple_blist_set_ui_data(ui_data);
 		}
 
 		/*
@@ -123,7 +135,7 @@ namespace PurpleWrapper
 
 		public static PurpleBlistNode NodeNext(PurpleBlistNode node, bool offline)
 		{
-			throw new NotImplementedException();
+			return new PurpleBlistNode(purple_blist_node_next(node.Reference, offline));
 		}
 
 		/*
@@ -134,7 +146,7 @@ namespace PurpleWrapper
 
 		public static PurpleBlistNode NodeGetParent(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			return new PurpleBlistNode(purple_blist_node_get_parent(node.Reference));
 		}
 
 		/*
@@ -145,7 +157,7 @@ namespace PurpleWrapper
 
 		public static PurpleBlistNode NodeGetFirstChild(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			return new PurpleBlistNode(purple_blist_node_get_first_child(node.Reference));
 		}
 
 		/*
@@ -156,7 +168,7 @@ namespace PurpleWrapper
 
 		public static PurpleBlistNode NodeGetSiblingNext(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			return new PurpleBlistNode(purple_blist_node_get_sibling_next(node.Reference));
 		}
 
 		/*
@@ -167,7 +179,7 @@ namespace PurpleWrapper
 
 		public static PurpleBlistNode NodeGetSiblingPrev(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			return new PurpleBlistNode(purple_blist_node_get_sibling_prev(node.Reference));
 		}
 
 		/*
@@ -178,7 +190,7 @@ namespace PurpleWrapper
 
 		public static IntPtr NodeGetUiData(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			return purple_blist_node_get_ui_data(node.Reference);
 		}
 
 		/*
@@ -189,7 +201,7 @@ namespace PurpleWrapper
 
 		public static void NodeSetUiData(PurpleBlistNode node, IntPtr ui_data)
 		{
-			throw new NotImplementedException();
+			purple_blist_node_set_ui_data(node.Reference, ui_data);
 		}
 
 		/*
@@ -200,7 +212,7 @@ namespace PurpleWrapper
 
 		public static void Show()
 		{
-			throw new NotImplementedException();
+			purple_blist_show();
 		}
 
 		/*
@@ -211,7 +223,7 @@ namespace PurpleWrapper
 
 		public static void Destroy()
 		{
-			throw new NotImplementedException();
+			purple_blist_destroy();
 		}
 
 		/*
@@ -222,20 +234,16 @@ namespace PurpleWrapper
 
 		public static void SetVisible(bool show)
 		{
-			throw new NotImplementedException();
+			purple_blist_set_visible(show);
 		}
 
 		/*
 		 * void purple_blist_update_buddy_status(PurpleBuddy * buddy, PurpleStatus * old_status)
+		 * 
+		 * Could not generate a wrapper for purple_blist_update_buddy_status in file "blist.h".
+		 * Message: The type could not be resolved (PurpleStatus * old_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_blist_update_buddy_status(IntPtr buddy, IntPtr old_status);
 
-		public static void UpdateBuddyStatus(PurpleBuddy buddy, PurpleStatus old_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_blist_update_node_icon(PurpleBlistNode * node)
 		 */
@@ -244,7 +252,7 @@ namespace PurpleWrapper
 
 		public static void UpdateNodeIcon(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			purple_blist_update_node_icon(node.Reference);
 		}
 
 		/*
@@ -255,7 +263,7 @@ namespace PurpleWrapper
 
 		public static void UpdateBuddyIcon(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			purple_blist_update_buddy_icon(buddy.Reference);
 		}
 
 		/*
@@ -266,7 +274,7 @@ namespace PurpleWrapper
 
 		public static void RenameBuddy(PurpleBuddy buddy, string name)
 		{
-			throw new NotImplementedException();
+			purple_blist_rename_buddy(buddy.Reference, name);
 		}
 
 		/*
@@ -277,7 +285,7 @@ namespace PurpleWrapper
 
 		public static void AliasContact(PurpleContact contact, string alias)
 		{
-			throw new NotImplementedException();
+			purple_blist_alias_contact(contact.Reference, alias);
 		}
 
 		/*
@@ -288,7 +296,7 @@ namespace PurpleWrapper
 
 		public static void AliasBuddy(PurpleBuddy buddy, string alias)
 		{
-			throw new NotImplementedException();
+			purple_blist_alias_buddy(buddy.Reference, alias);
 		}
 
 		/*
@@ -299,7 +307,7 @@ namespace PurpleWrapper
 
 		public static void ServerAliasBuddy(PurpleBuddy buddy, string alias)
 		{
-			throw new NotImplementedException();
+			purple_blist_server_alias_buddy(buddy.Reference, alias);
 		}
 
 		/*
@@ -310,7 +318,7 @@ namespace PurpleWrapper
 
 		public static void AliasChat(PurpleChat chat, string alias)
 		{
-			throw new NotImplementedException();
+			purple_blist_alias_chat(chat.Reference, alias);
 		}
 
 		/*
@@ -321,20 +329,16 @@ namespace PurpleWrapper
 
 		public static void RenameGroup(PurpleGroup group, string name)
 		{
-			throw new NotImplementedException();
+			purple_blist_rename_group(group.Reference, name);
 		}
 
 		/*
 		 * PurpleChat * purple_chat_new(PurpleAccount * account, char * alias, GHashTable * components)
+		 * 
+		 * Could not generate a wrapper for purple_chat_new in file "blist.h".
+		 * Message: The type could not be resolved (GHashTable * components).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_chat_new(IntPtr account, string alias, IntPtr components);
 
-		public static PurpleChat ChatNew(PurpleAccount account, string alias, GHashTable components)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_chat_destroy(PurpleChat * chat)
 		 */
@@ -343,7 +347,7 @@ namespace PurpleWrapper
 
 		public static void ChatDestroy(PurpleChat chat)
 		{
-			throw new NotImplementedException();
+			purple_chat_destroy(chat.Reference);
 		}
 
 		/*
@@ -354,7 +358,7 @@ namespace PurpleWrapper
 
 		public static void AddChat(PurpleChat chat, PurpleGroup group, PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			purple_blist_add_chat(chat.Reference, group.Reference, node.Reference);
 		}
 
 		/*
@@ -365,7 +369,7 @@ namespace PurpleWrapper
 
 		public static PurpleBuddy BuddyNew(PurpleAccount account, string name, string alias)
 		{
-			throw new NotImplementedException();
+			return new PurpleBuddy(purple_buddy_new(account.Reference, name, alias));
 		}
 
 		/*
@@ -376,20 +380,16 @@ namespace PurpleWrapper
 
 		public static void BuddyDestroy(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			purple_buddy_destroy(buddy.Reference);
 		}
 
 		/*
 		 * void purple_buddy_set_icon(PurpleBuddy * buddy, PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_set_icon in file "blist.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_buddy_set_icon(IntPtr buddy, IntPtr icon);
 
-		public static void BuddySetIcon(PurpleBuddy buddy, PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleAccount * purple_buddy_get_account(PurpleBuddy * buddy)
 		 */
@@ -398,7 +398,7 @@ namespace PurpleWrapper
 
 		public static PurpleAccount BuddyGetAccount(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_buddy_get_account(buddy.Reference));
 		}
 
 		/*
@@ -409,20 +409,16 @@ namespace PurpleWrapper
 
 		public static string BuddyGetName(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_name(buddy.Reference);
 		}
 
 		/*
 		 * PurpleBuddyIcon * purple_buddy_get_icon(PurpleBuddy * buddy)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_get_icon in file "blist.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * purple_buddy_get_icon(PurpleBuddy * buddy)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_buddy_get_icon(IntPtr buddy);
 
-		public static PurpleBuddyIcon BuddyGetIcon(PurpleBuddy buddy)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gpointer purple_buddy_get_protocol_data(PurpleBuddy * buddy)
 		 */
@@ -431,7 +427,7 @@ namespace PurpleWrapper
 
 		public static IntPtr BuddyGetProtocolData(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_protocol_data(buddy.Reference);
 		}
 
 		/*
@@ -442,7 +438,7 @@ namespace PurpleWrapper
 
 		public static void BuddySetProtocolData(PurpleBuddy buddy, IntPtr data)
 		{
-			throw new NotImplementedException();
+			purple_buddy_set_protocol_data(buddy.Reference, data);
 		}
 
 		/*
@@ -453,20 +449,16 @@ namespace PurpleWrapper
 
 		public static PurpleContact BuddyGetContact(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return new PurpleContact(purple_buddy_get_contact(buddy.Reference));
 		}
 
 		/*
 		 * PurplePresence * purple_buddy_get_presence(PurpleBuddy * buddy)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_get_presence in file "blist.h".
+		 * Message: The type could not be resolved (PurplePresence * purple_buddy_get_presence(PurpleBuddy * buddy)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_buddy_get_presence(IntPtr buddy);
 
-		public static PurplePresence BuddyGetPresence(PurpleBuddy buddy)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_blist_add_buddy(PurpleBuddy * buddy, PurpleContact * contact, PurpleGroup * group, PurpleBlistNode * node)
 		 */
@@ -475,7 +467,7 @@ namespace PurpleWrapper
 
 		public static void AddBuddy(PurpleBuddy buddy, PurpleContact contact, PurpleGroup group, PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			purple_blist_add_buddy(buddy.Reference, contact.Reference, group.Reference, node.Reference);
 		}
 
 		/*
@@ -486,7 +478,7 @@ namespace PurpleWrapper
 
 		public static PurpleGroup GroupNew(string name)
 		{
-			throw new NotImplementedException();
+			return new PurpleGroup(purple_group_new(name));
 		}
 
 		/*
@@ -497,7 +489,7 @@ namespace PurpleWrapper
 
 		public static void GroupDestroy(PurpleGroup group)
 		{
-			throw new NotImplementedException();
+			purple_group_destroy(group.Reference);
 		}
 
 		/*
@@ -508,7 +500,7 @@ namespace PurpleWrapper
 
 		public static void AddGroup(PurpleGroup group, PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			purple_blist_add_group(group.Reference, node.Reference);
 		}
 
 		/*
@@ -519,7 +511,7 @@ namespace PurpleWrapper
 
 		public static PurpleContact ContactNew()
 		{
-			throw new NotImplementedException();
+			return new PurpleContact(purple_contact_new());
 		}
 
 		/*
@@ -530,7 +522,7 @@ namespace PurpleWrapper
 
 		public static void ContactDestroy(PurpleContact contact)
 		{
-			throw new NotImplementedException();
+			purple_contact_destroy(contact.Reference);
 		}
 
 		/*
@@ -541,7 +533,7 @@ namespace PurpleWrapper
 
 		public static void AddContact(PurpleContact contact, PurpleGroup group, PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			purple_blist_add_contact(contact.Reference, group.Reference, node.Reference);
 		}
 
 		/*
@@ -552,7 +544,7 @@ namespace PurpleWrapper
 
 		public static void MergeContact(PurpleContact source, PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			purple_blist_merge_contact(source.Reference, node.Reference);
 		}
 
 		/*
@@ -563,7 +555,7 @@ namespace PurpleWrapper
 
 		public static PurpleBuddy ContactGetPriorityBuddy(PurpleContact contact)
 		{
-			throw new NotImplementedException();
+			return new PurpleBuddy(purple_contact_get_priority_buddy(contact.Reference));
 		}
 
 		/*
@@ -574,7 +566,7 @@ namespace PurpleWrapper
 
 		public static void ContactSetAlias(PurpleContact contact, string alias)
 		{
-			throw new NotImplementedException();
+			purple_contact_set_alias(contact.Reference, alias);
 		}
 
 		/*
@@ -585,7 +577,7 @@ namespace PurpleWrapper
 
 		public static string ContactGetAlias(PurpleContact contact)
 		{
-			throw new NotImplementedException();
+			return purple_contact_get_alias(contact.Reference);
 		}
 
 		/*
@@ -596,7 +588,7 @@ namespace PurpleWrapper
 
 		public static bool ContactOnAccount(PurpleContact contact, PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_contact_on_account(contact.Reference, account.Reference);
 		}
 
 		/*
@@ -607,7 +599,7 @@ namespace PurpleWrapper
 
 		public static void ContactInvalidatePriorityBuddy(PurpleContact contact)
 		{
-			throw new NotImplementedException();
+			purple_contact_invalidate_priority_buddy(contact.Reference);
 		}
 
 		/*
@@ -618,7 +610,7 @@ namespace PurpleWrapper
 
 		public static void RemoveBuddy(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			purple_blist_remove_buddy(buddy.Reference);
 		}
 
 		/*
@@ -629,7 +621,7 @@ namespace PurpleWrapper
 
 		public static void RemoveContact(PurpleContact contact)
 		{
-			throw new NotImplementedException();
+			purple_blist_remove_contact(contact.Reference);
 		}
 
 		/*
@@ -640,7 +632,7 @@ namespace PurpleWrapper
 
 		public static void RemoveChat(PurpleChat chat)
 		{
-			throw new NotImplementedException();
+			purple_blist_remove_chat(chat.Reference);
 		}
 
 		/*
@@ -651,7 +643,7 @@ namespace PurpleWrapper
 
 		public static void RemoveGroup(PurpleGroup group)
 		{
-			throw new NotImplementedException();
+			purple_blist_remove_group(group.Reference);
 		}
 
 		/*
@@ -662,7 +654,7 @@ namespace PurpleWrapper
 
 		public static string BuddyGetAliasOnly(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_alias_only(buddy.Reference);
 		}
 
 		/*
@@ -673,7 +665,7 @@ namespace PurpleWrapper
 
 		public static string BuddyGetServerAlias(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_server_alias(buddy.Reference);
 		}
 
 		/*
@@ -684,7 +676,7 @@ namespace PurpleWrapper
 
 		public static string BuddyGetContactAlias(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_contact_alias(buddy.Reference);
 		}
 
 		/*
@@ -695,7 +687,7 @@ namespace PurpleWrapper
 
 		public static string BuddyGetLocalAlias(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_local_alias(buddy.Reference);
 		}
 
 		/*
@@ -706,7 +698,7 @@ namespace PurpleWrapper
 
 		public static string BuddyGetAlias(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_alias(buddy.Reference);
 		}
 
 		/*
@@ -717,7 +709,7 @@ namespace PurpleWrapper
 
 		public static string BuddyGetLocalBuddyAlias(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_get_local_buddy_alias(buddy.Reference);
 		}
 
 		/*
@@ -728,7 +720,7 @@ namespace PurpleWrapper
 
 		public static string ChatGetName(PurpleChat chat)
 		{
-			throw new NotImplementedException();
+			return purple_chat_get_name(chat.Reference);
 		}
 
 		/*
@@ -739,31 +731,16 @@ namespace PurpleWrapper
 
 		public static PurpleBuddy FindBuddy(PurpleAccount account, string name)
 		{
-			throw new NotImplementedException();
+			return new PurpleBuddy(purple_find_buddy(account.Reference, name));
 		}
 
 		/*
-		 * PurpleBuddy * purple_find_buddy_in_group(PurpleAccount * account, char * name, PurpleGroup * group)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_find_buddy_in_group(IntPtr account, string name, IntPtr group);
-
-		public static PurpleBuddy FindBuddyInGroup(PurpleAccount account, string name, PurpleGroup group)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GSList * purple_find_buddies(PurpleAccount * account, char * name)
+		 * 
+		 * Could not generate a wrapper for purple_find_buddies in file "blist.h".
+		 * Message: The type could not be resolved (GSList * purple_find_buddies(PurpleAccount * account, char * name)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_find_buddies(IntPtr account, string name);
 
-		public static GSList FindBuddies(PurpleAccount account, string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleGroup * purple_find_group(char * name)
 		 */
@@ -772,7 +749,7 @@ namespace PurpleWrapper
 
 		public static PurpleGroup FindGroup(string name)
 		{
-			throw new NotImplementedException();
+			return new PurpleGroup(purple_find_group(name));
 		}
 
 		/*
@@ -783,7 +760,7 @@ namespace PurpleWrapper
 
 		public static PurpleChat FindChat(PurpleAccount account, string name)
 		{
-			throw new NotImplementedException();
+			return new PurpleChat(purple_blist_find_chat(account.Reference, name));
 		}
 
 		/*
@@ -794,7 +771,7 @@ namespace PurpleWrapper
 
 		public static PurpleGroup ChatGetGroup(PurpleChat chat)
 		{
-			throw new NotImplementedException();
+			return new PurpleGroup(purple_chat_get_group(chat.Reference));
 		}
 
 		/*
@@ -805,20 +782,16 @@ namespace PurpleWrapper
 
 		public static PurpleAccount ChatGetAccount(PurpleChat chat)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_chat_get_account(chat.Reference));
 		}
 
 		/*
 		 * GHashTable * purple_chat_get_components(PurpleChat * chat)
+		 * 
+		 * Could not generate a wrapper for purple_chat_get_components in file "blist.h".
+		 * Message: The type could not be resolved (GHashTable * purple_chat_get_components(PurpleChat * chat)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_chat_get_components(IntPtr chat);
 
-		public static GHashTable ChatGetComponents(PurpleChat chat)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleGroup * purple_buddy_get_group(PurpleBuddy * buddy)
 		 */
@@ -827,20 +800,16 @@ namespace PurpleWrapper
 
 		public static PurpleGroup BuddyGetGroup(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return new PurpleGroup(purple_buddy_get_group(buddy.Reference));
 		}
 
 		/*
 		 * GSList * purple_group_get_accounts(PurpleGroup * g)
+		 * 
+		 * Could not generate a wrapper for purple_group_get_accounts in file "blist.h".
+		 * Message: The type could not be resolved (GSList * purple_group_get_accounts(PurpleGroup * g)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_group_get_accounts(IntPtr g);
 
-		public static GSList GroupGetAccounts(PurpleGroup g)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_group_on_account(PurpleGroup * g, PurpleAccount * account)
 		 */
@@ -849,7 +818,7 @@ namespace PurpleWrapper
 
 		public static bool GroupOnAccount(PurpleGroup g, PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return purple_group_on_account(g.Reference, account.Reference);
 		}
 
 		/*
@@ -860,7 +829,7 @@ namespace PurpleWrapper
 
 		public static string GroupGetName(PurpleGroup group)
 		{
-			throw new NotImplementedException();
+			return purple_group_get_name(group.Reference);
 		}
 
 		/*
@@ -871,7 +840,7 @@ namespace PurpleWrapper
 
 		public static void AddAccount(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_blist_add_account(account.Reference);
 		}
 
 		/*
@@ -882,7 +851,7 @@ namespace PurpleWrapper
 
 		public static void RemoveAccount(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_blist_remove_account(account.Reference);
 		}
 
 		/*
@@ -893,7 +862,7 @@ namespace PurpleWrapper
 
 		public static int GetGroupSize(PurpleGroup group, bool offline)
 		{
-			throw new NotImplementedException();
+			return purple_blist_get_group_size(group.Reference, offline);
 		}
 
 		/*
@@ -904,7 +873,7 @@ namespace PurpleWrapper
 
 		public static int GetGroupOnlineCount(PurpleGroup group)
 		{
-			throw new NotImplementedException();
+			return purple_blist_get_group_online_count(group.Reference);
 		}
 
 		/*
@@ -915,7 +884,7 @@ namespace PurpleWrapper
 
 		public static void Load()
 		{
-			throw new NotImplementedException();
+			purple_blist_load();
 		}
 
 		/*
@@ -926,32 +895,10 @@ namespace PurpleWrapper
 
 		public static void ScheduleSave()
 		{
-			throw new NotImplementedException();
+			purple_blist_schedule_save();
 		}
 
 		/*
-		 * void purple_blist_request_add_buddy(PurpleAccount * account, char * username, char * group, char * alias)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_blist_request_add_buddy(IntPtr account, string username, string group, string alias);
-
-		public static void RequestAddBuddy(PurpleAccount account, string username, string group, string alias)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_blist_request_add_chat(PurpleAccount * account, PurpleGroup * group, char * alias, char * name)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_blist_request_add_chat(IntPtr account, IntPtr group, string alias, string name);
-
-		public static void RequestAddChat(PurpleAccount account, PurpleGroup group, string alias, string name)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_blist_request_add_group()
 		 */
 		[DllImport("libpurple.dll")]
@@ -959,7 +906,7 @@ namespace PurpleWrapper
 
 		public static void RequestAddGroup()
 		{
-			throw new NotImplementedException();
+			purple_blist_request_add_group();
 		}
 
 		/*
@@ -970,7 +917,7 @@ namespace PurpleWrapper
 
 		public static void NodeSetBool(PurpleBlistNode node, string key, bool value)
 		{
-			throw new NotImplementedException();
+			purple_blist_node_set_bool(node.Reference, key, value);
 		}
 
 		/*
@@ -981,7 +928,7 @@ namespace PurpleWrapper
 
 		public static bool NodeGetBool(PurpleBlistNode node, string key)
 		{
-			throw new NotImplementedException();
+			return purple_blist_node_get_bool(node.Reference, key);
 		}
 
 		/*
@@ -992,7 +939,7 @@ namespace PurpleWrapper
 
 		public static void NodeSetInt(PurpleBlistNode node, string key, int value)
 		{
-			throw new NotImplementedException();
+			purple_blist_node_set_int(node.Reference, key, value);
 		}
 
 		/*
@@ -1003,21 +950,10 @@ namespace PurpleWrapper
 
 		public static int NodeGetInt(PurpleBlistNode node, string key)
 		{
-			throw new NotImplementedException();
+			return purple_blist_node_get_int(node.Reference, key);
 		}
 
 		/*
-		 * void purple_blist_node_set_string(PurpleBlistNode * node, char * key, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_blist_node_set_string(IntPtr node, string key, string value);
-
-		public static void NodeSetString(PurpleBlistNode node, string key, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_blist_node_get_string(PurpleBlistNode * node, char * key)
 		 */
 		[DllImport("libpurple.dll")]
@@ -1025,7 +961,7 @@ namespace PurpleWrapper
 
 		public static string NodeGetString(PurpleBlistNode node, string key)
 		{
-			throw new NotImplementedException();
+			return purple_blist_node_get_string(node.Reference, key);
 		}
 
 		/*
@@ -1036,17 +972,18 @@ namespace PurpleWrapper
 
 		public static void NodeRemoveSetting(PurpleBlistNode node, string key)
 		{
-			throw new NotImplementedException();
+			purple_blist_node_remove_setting(node.Reference, key);
 		}
 
 		/*
 		 * void purple_blist_node_set_flags(PurpleBlistNode * node, PurpleBlistNodeFlags flags)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_blist_node_set_flags(IntPtr node, UNKNOWN flags);
+		private static extern void purple_blist_node_set_flags(IntPtr node, Blist.PurpleBlistNodeFlags flags);
 
-		public static void NodeSetFlags(PurpleBlistNode node, PurpleBlistNodeFlags flags)
+		public static void NodeSetFlags(PurpleBlistNode node, Blist.PurpleBlistNodeFlags flags)
 		{
+			/* Unable to process flags, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -1054,35 +991,33 @@ namespace PurpleWrapper
 		 * PurpleBlistNodeFlags purple_blist_node_get_flags(PurpleBlistNode * node)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_blist_node_get_flags(IntPtr node);
+		private static extern Blist.PurpleBlistNodeFlags purple_blist_node_get_flags(IntPtr node);
 
-		public static PurpleBlistNodeFlags NodeGetFlags(PurpleBlistNode node)
+		public static Blist.PurpleBlistNodeFlags NodeGetFlags(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_blist_node_get_flags, a KnownEnum. */
+			
 		}
 
 		/*
 		 * PurpleBlistNodeType purple_blist_node_get_type(PurpleBlistNode * node)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_blist_node_get_type(IntPtr node);
+		private static extern Blist.PurpleBlistNodeType purple_blist_node_get_type(IntPtr node);
 
-		public static PurpleBlistNodeType NodeGetType(PurpleBlistNode node)
+		public static Blist.PurpleBlistNodeType NodeGetType(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_blist_node_get_type, a KnownEnum. */
+			
 		}
 
 		/*
 		 * GList * purple_blist_node_get_extended_menu(PurpleBlistNode * n)
+		 * 
+		 * Could not generate a wrapper for purple_blist_node_get_extended_menu in file "blist.h".
+		 * Message: The type could not be resolved (GList * purple_blist_node_get_extended_menu(PurpleBlistNode * n)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_blist_node_get_extended_menu(IntPtr n);
 
-		public static GList NodeGetExtendedMenu(PurpleBlistNode n)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_blist_set_ui_ops(PurpleBlistUiOps * ops)
 		 */
@@ -1091,7 +1026,7 @@ namespace PurpleWrapper
 
 		public static void SetUiOps(PurpleBlistUiOps ops)
 		{
-			throw new NotImplementedException();
+			purple_blist_set_ui_ops(ops.Reference);
 		}
 
 		/*
@@ -1102,7 +1037,7 @@ namespace PurpleWrapper
 
 		public static PurpleBlistUiOps GetUiOps()
 		{
-			throw new NotImplementedException();
+			return new PurpleBlistUiOps(purple_blist_get_ui_ops());
 		}
 
 		/*
@@ -1113,7 +1048,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_blist_get_handle();
 		}
 
 		/*
@@ -1124,7 +1059,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_blist_init();
 		}
 
 		/*
@@ -1135,7 +1070,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_blist_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Buddyicon.cs	5d7cba7346a131a30cfac1ae7dbb14793aa288db
+++ libpurple/wrapper/Buddyicon.cs	8948ae8b83ecc0afe85bc840b8a51b79959e7f07
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,146 +41,103 @@ namespace PurpleWrapper
 	public class Buddyicon
 	{
 		/*
-		 * PurpleBuddyIcon * purple_buddy_icon_new(PurpleAccount * account, char * username, void * icon_data, size_t icon_len, char * checksum)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_buddy_icon_new(IntPtr account, string username, IntPtr icon_data, UNKNOWN icon_len, string checksum);
-
-		public static PurpleBuddyIcon BuddyIconNew(PurpleAccount account, string username, IntPtr icon_data, size_t icon_len, string checksum)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleBuddyIcon * purple_buddy_icon_ref(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_ref in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * purple_buddy_icon_ref(PurpleBuddyIcon * icon)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_buddy_icon_ref(IntPtr icon);
 
-		public static PurpleBuddyIcon BuddyIconRef(PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleBuddyIcon * purple_buddy_icon_unref(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_unref in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * purple_buddy_icon_unref(PurpleBuddyIcon * icon)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_buddy_icon_unref(IntPtr icon);
 
-		public static PurpleBuddyIcon BuddyIconUnref(PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_buddy_icon_update(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_update in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_buddy_icon_update(IntPtr icon);
 
-		public static void BuddyIconUpdate(PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_buddy_icon_set_data(PurpleBuddyIcon * icon, guchar * data, size_t len, char * checksum)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_buddy_icon_set_data(IntPtr icon, IntPtr data, UNKNOWN len, string checksum);
-
-		public static void BuddyIconSetData(PurpleBuddyIcon icon, guchar data, size_t len, string checksum)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleAccount * purple_buddy_icon_get_account(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_get_account in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_buddy_icon_get_account(IntPtr icon);
 
-		public static PurpleAccount BuddyIconGetAccount(PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_buddy_icon_get_username(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_get_username in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_buddy_icon_get_username(IntPtr icon);
 
-		public static string BuddyIconGetUsername(PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_buddy_icon_get_checksum(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_get_checksum in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_buddy_icon_get_checksum(IntPtr icon);
 
-		public static string BuddyIconGetChecksum(PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gconstpointer purple_buddy_icon_get_data(PurpleBuddyIcon * icon, size_t * len)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_get_data in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_buddy_icon_get_data(IntPtr icon, IntPtr len);
 
-		public static gconstpointer BuddyIconGetData(PurpleBuddyIcon icon, size_t len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_buddy_icon_get_extension(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_get_extension in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_buddy_icon_get_extension(IntPtr icon);
 
-		public static string BuddyIconGetExtension(PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * char * purple_buddy_icon_get_full_path(PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_get_full_path in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
+		 */
 
 		/*
-		 * char * purple_buddy_icon_get_full_path(PurpleBuddyIcon * icon)
+		 * char * purple_buddy_icons_get_checksum_for_user(PurpleBuddy * buddy)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_buddy_icon_get_full_path(IntPtr icon);
+		private static extern string purple_buddy_icons_get_checksum_for_user(IntPtr buddy);
 
-		public static string BuddyIconGetFullPath(PurpleBuddyIcon icon)
+		public static string BuddyIconsGetChecksumForUser(PurpleBuddy buddy)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_icons_get_checksum_for_user(buddy.Reference);
 		}
 
 		/*
-		 * void purple_buddy_icons_set_for_user(PurpleAccount * account, char * username, void * icon_data, size_t icon_len, char * checksum)
+		 * PurpleBuddyIcon * purple_buddy_icons_find(PurpleAccount * account, char * username)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icons_find in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * purple_buddy_icons_find(PurpleAccount * account, char * username)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_buddy_icons_set_for_user(IntPtr account, string username, IntPtr icon_data, UNKNOWN icon_len, string checksum);
 
-		public static void BuddyIconsSetForUser(PurpleAccount account, string username, IntPtr icon_data, size_t icon_len, string checksum)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * PurpleStoredImage * purple_buddy_icons_find_account_icon(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icons_find_account_icon in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_buddy_icons_find_account_icon(PurpleAccount * account)).
+		 */
 
 		/*
 		 * time_t purple_buddy_icons_get_account_icon_timestamp(PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_buddy_icons_get_account_icon_timestamp(IntPtr account);
+		private static extern ulong purple_buddy_icons_get_account_icon_timestamp(IntPtr account);
 
-		public static time_t BuddyIconsGetAccountIconTimestamp(PurpleAccount account)
+		public static DateTime BuddyIconsGetAccountIconTimestamp(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_buddy_icons_get_account_icon_timestamp, a DateTime. */
+			
 		}
 
 		/*
@@ -189,10 +148,17 @@ namespace PurpleWrapper
 
 		public static bool BuddyIconsNodeHasCustomIcon(PurpleBlistNode node)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_icons_node_has_custom_icon(node.Reference);
 		}
 
 		/*
+		 * PurpleStoredImage * purple_buddy_icons_node_find_custom_icon(PurpleBlistNode * node)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icons_node_find_custom_icon in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_buddy_icons_node_find_custom_icon(PurpleBlistNode * node)).
+		 */
+
+		/*
 		 * gboolean purple_buddy_icons_has_custom_icon(PurpleContact * contact)
 		 */
 		[DllImport("libpurple.dll")]
@@ -200,10 +166,17 @@ namespace PurpleWrapper
 
 		public static bool BuddyIconsHasCustomIcon(PurpleContact contact)
 		{
-			throw new NotImplementedException();
+			return purple_buddy_icons_has_custom_icon(contact.Reference);
 		}
 
 		/*
+		 * PurpleStoredImage * purple_buddy_icons_find_custom_icon(PurpleContact * contact)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icons_find_custom_icon in file "buddyicon.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_buddy_icons_find_custom_icon(PurpleContact * contact)).
+		 */
+
+		/*
 		 * void purple_buddy_icons_set_caching(gboolean caching)
 		 */
 		[DllImport("libpurple.dll")]
@@ -211,7 +184,7 @@ namespace PurpleWrapper
 
 		public static void BuddyIconsSetCaching(bool caching)
 		{
-			throw new NotImplementedException();
+			purple_buddy_icons_set_caching(caching);
 		}
 
 		/*
@@ -222,7 +195,7 @@ namespace PurpleWrapper
 
 		public static bool BuddyIconsIsCaching()
 		{
-			throw new NotImplementedException();
+			return purple_buddy_icons_is_caching();
 		}
 
 		/*
@@ -233,7 +206,7 @@ namespace PurpleWrapper
 
 		public static void BuddyIconsSetCacheDir(string cache_dir)
 		{
-			throw new NotImplementedException();
+			purple_buddy_icons_set_cache_dir(cache_dir);
 		}
 
 		/*
@@ -244,7 +217,7 @@ namespace PurpleWrapper
 
 		public static string BuddyIconsGetCacheDir()
 		{
-			throw new NotImplementedException();
+			return purple_buddy_icons_get_cache_dir();
 		}
 
 		/*
@@ -255,7 +228,7 @@ namespace PurpleWrapper
 
 		public static IntPtr BuddyIconsGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_buddy_icons_get_handle();
 		}
 
 		/*
@@ -266,7 +239,7 @@ namespace PurpleWrapper
 
 		public static void BuddyIconsInit()
 		{
-			throw new NotImplementedException();
+			purple_buddy_icons_init();
 		}
 
 		/*
@@ -277,20 +250,16 @@ namespace PurpleWrapper
 
 		public static void BuddyIconsUninit()
 		{
-			throw new NotImplementedException();
+			purple_buddy_icons_uninit();
 		}
 
 		/*
 		 * void purple_buddy_icon_get_scale_size(PurpleBuddyIconSpec * spec, int * width, int * height)
+		 * 
+		 * Could not generate a wrapper for purple_buddy_icon_get_scale_size in file "buddyicon.h".
+		 * Message: The type could not be resolved (int * width).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_buddy_icon_get_scale_size(IntPtr spec, IntPtr width, IntPtr height);
 
-		public static void BuddyIconGetScaleSize(PurpleBuddyIconSpec spec, int width, int height)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Certificate.cs	c79e19d18abec5ebde4e742efd09f948b967ee7f
+++ libpurple/wrapper/Certificate.cs	5df1df5589dc6cb06f374c96c6cff7fb7e744c75
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,28 +40,30 @@ namespace PurpleWrapper
 {
 	public class Certificate
 	{
+		public enum PurpleCertificateVerificationStatus
+		{
+			PURPLE_CERTIFICATE_INVALID = 0,
+			PURPLE_CERTIFICATE_VALID = 1
+		};
+
 		/*
-		 * void purple_certificate_verify(PurpleCertificateVerifier * verifier, gchar * subject_name, GList * cert_chain, PurpleCertificateVerifiedCallback cb, gpointer cb_data)
+		 * PurpleCertificate * purple_certificate_copy(PurpleCertificate * crt)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_certificate_verify(IntPtr verifier, string subject_name, IntPtr cert_chain, UNKNOWN cb, IntPtr cb_data);
+		private static extern IntPtr purple_certificate_copy(IntPtr crt);
 
-		public static void Verify(PurpleCertificateVerifier verifier, string subject_name, GList cert_chain, PurpleCertificateVerifiedCallback cb, IntPtr cb_data)
+		public static PurpleCertificate Copy(PurpleCertificate crt)
 		{
-			throw new NotImplementedException();
+			return new PurpleCertificate(purple_certificate_copy(crt.Reference));
 		}
 
 		/*
-		 * void purple_certificate_verify_complete(PurpleCertificateVerificationRequest * vrq, PurpleCertificateVerificationStatus st)
+		 * GList * purple_certificate_copy_list(GList * crt_list)
+		 * 
+		 * Could not generate a wrapper for purple_certificate_copy_list in file "certificate.h".
+		 * Message: The type could not be resolved (GList * purple_certificate_copy_list(GList * crt_list)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_certificate_verify_complete(IntPtr vrq, UNKNOWN st);
 
-		public static void VerifyComplete(PurpleCertificateVerificationRequest vrq, PurpleCertificateVerificationStatus st)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_certificate_destroy(PurpleCertificate * crt)
 		 */
@@ -68,20 +72,16 @@ namespace PurpleWrapper
 
 		public static void Destroy(PurpleCertificate crt)
 		{
-			throw new NotImplementedException();
+			purple_certificate_destroy(crt.Reference);
 		}
 
 		/*
-		 * void purple_certificate_destroy_list( )
+		 * void purple_certificate_destroy_list(GList * crt_list)
+		 * 
+		 * Could not generate a wrapper for purple_certificate_destroy_list in file "certificate.h".
+		 * Message: The type could not be resolved (GList * crt_list).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_certificate_destroy_list(UNKNOWN );
 
-		public static void DestroyList( )
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_certificate_signed_by(PurpleCertificate * crt, PurpleCertificate * issuer)
 		 */
@@ -90,18 +90,25 @@ namespace PurpleWrapper
 
 		public static bool SignedBy(PurpleCertificate crt, PurpleCertificate issuer)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_signed_by(crt.Reference, issuer.Reference);
 		}
 
 		/*
 		 * gboolean purple_certificate_check_signature_chain(GList * chain)
+		 * 
+		 * Could not generate a wrapper for purple_certificate_check_signature_chain in file "certificate.h".
+		 * Message: The type could not be resolved (GList * chain).
 		 */
+
+		/*
+		 * PurpleCertificate * purple_certificate_import(PurpleCertificateScheme * scheme, gchar * filename)
+		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_certificate_check_signature_chain(IntPtr chain);
+		private static extern IntPtr purple_certificate_import(IntPtr scheme, string filename);
 
-		public static bool CheckSignatureChain(GList chain)
+		public static PurpleCertificate Import(PurpleCertificateScheme scheme, string filename)
 		{
-			throw new NotImplementedException();
+			return new PurpleCertificate(purple_certificate_import(scheme.Reference, filename));
 		}
 
 		/*
@@ -112,10 +119,50 @@ namespace PurpleWrapper
 
 		public static bool Export(string filename, PurpleCertificate crt)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_export(filename, crt.Reference);
 		}
 
 		/*
+		 * GByteArray * purple_certificate_get_fingerprint_sha1(PurpleCertificate * crt)
+		 * 
+		 * Could not generate a wrapper for purple_certificate_get_fingerprint_sha1 in file "certificate.h".
+		 * Message: The type could not be resolved (GByteArray * purple_certificate_get_fingerprint_sha1(PurpleCertificate * crt)).
+		 */
+
+		/*
+		 * gchar * purple_certificate_get_unique_id(PurpleCertificate * crt)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string purple_certificate_get_unique_id(IntPtr crt);
+
+		public static string GetUniqueId(PurpleCertificate crt)
+		{
+			return purple_certificate_get_unique_id(crt.Reference);
+		}
+
+		/*
+		 * gchar * purple_certificate_get_issuer_unique_id(PurpleCertificate * crt)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string purple_certificate_get_issuer_unique_id(IntPtr crt);
+
+		public static string GetIssuerUniqueId(PurpleCertificate crt)
+		{
+			return purple_certificate_get_issuer_unique_id(crt.Reference);
+		}
+
+		/*
+		 * gchar * purple_certificate_get_subject_name(PurpleCertificate * crt)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string purple_certificate_get_subject_name(IntPtr crt);
+
+		public static string GetSubjectName(PurpleCertificate crt)
+		{
+			return purple_certificate_get_subject_name(crt.Reference);
+		}
+
+		/*
 		 * gboolean purple_certificate_check_subject_name(PurpleCertificate * crt, gchar * name)
 		 */
 		[DllImport("libpurple.dll")]
@@ -123,18 +170,25 @@ namespace PurpleWrapper
 
 		public static bool CheckSubjectName(PurpleCertificate crt, string name)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_check_subject_name(crt.Reference, name);
 		}
 
 		/*
 		 * gboolean purple_certificate_get_times(PurpleCertificate * crt, time_t * activation, time_t * expiration)
+		 * 
+		 * Could not generate a wrapper for purple_certificate_get_times in file "certificate.h".
+		 * Message: The type could not be resolved (time_t * activation).
 		 */
+
+		/*
+		 * gchar * purple_certificate_pool_mkpath(PurpleCertificatePool * pool, gchar * id)
+		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_certificate_get_times(IntPtr crt, IntPtr activation, IntPtr expiration);
+		private static extern string purple_certificate_pool_mkpath(IntPtr pool, string id);
 
-		public static bool GetTimes(PurpleCertificate crt, time_t activation, time_t expiration)
+		public static string PoolMkpath(PurpleCertificatePool pool, string id)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_pool_mkpath(pool.Reference, id);
 		}
 
 		/*
@@ -145,10 +199,21 @@ namespace PurpleWrapper
 
 		public static bool PoolUsable(PurpleCertificatePool pool)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_pool_usable(pool.Reference);
 		}
 
 		/*
+		 * PurpleCertificateScheme * purple_certificate_pool_get_scheme(PurpleCertificatePool * pool)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr purple_certificate_pool_get_scheme(IntPtr pool);
+
+		public static PurpleCertificateScheme PoolGetScheme(PurpleCertificatePool pool)
+		{
+			return new PurpleCertificateScheme(purple_certificate_pool_get_scheme(pool.Reference));
+		}
+
+		/*
 		 * gboolean purple_certificate_pool_contains(PurpleCertificatePool * pool, gchar * id)
 		 */
 		[DllImport("libpurple.dll")]
@@ -156,10 +221,21 @@ namespace PurpleWrapper
 
 		public static bool PoolContains(PurpleCertificatePool pool, string id)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_pool_contains(pool.Reference, id);
 		}
 
 		/*
+		 * PurpleCertificate * purple_certificate_pool_retrieve(PurpleCertificatePool * pool, gchar * id)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr purple_certificate_pool_retrieve(IntPtr pool, string id);
+
+		public static PurpleCertificate PoolRetrieve(PurpleCertificatePool pool, string id)
+		{
+			return new PurpleCertificate(purple_certificate_pool_retrieve(pool.Reference, id));
+		}
+
+		/*
 		 * gboolean purple_certificate_pool_store(PurpleCertificatePool * pool, gchar * id, PurpleCertificate * crt)
 		 */
 		[DllImport("libpurple.dll")]
@@ -167,7 +243,7 @@ namespace PurpleWrapper
 
 		public static bool PoolStore(PurpleCertificatePool pool, string id, PurpleCertificate crt)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_pool_store(pool.Reference, id, crt.Reference);
 		}
 
 		/*
@@ -178,19 +254,22 @@ namespace PurpleWrapper
 
 		public static bool PoolDelete(PurpleCertificatePool pool, string id)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_pool_delete(pool.Reference, id);
 		}
 
 		/*
-		 * void purple_certificate_pool_destroy_idlist(GList * idlist)
+		 * GList * purple_certificate_pool_get_idlist(PurpleCertificatePool * pool)
+		 * 
+		 * Could not generate a wrapper for purple_certificate_pool_get_idlist in file "certificate.h".
+		 * Message: The type could not be resolved (GList * purple_certificate_pool_get_idlist(PurpleCertificatePool * pool)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_certificate_pool_destroy_idlist(IntPtr idlist);
 
-		public static void PoolDestroyIdlist(GList idlist)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * void purple_certificate_pool_destroy_idlist(GList * idlist)
+		 * 
+		 * Could not generate a wrapper for purple_certificate_pool_destroy_idlist in file "certificate.h".
+		 * Message: The type could not be resolved (GList * idlist).
+		 */
 
 		/*
 		 * void purple_certificate_init()
@@ -200,7 +279,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_certificate_init();
 		}
 
 		/*
@@ -211,7 +290,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_certificate_uninit();
 		}
 
 		/*
@@ -222,10 +301,28 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_certificate_get_handle();
 		}
 
 		/*
+		 * PurpleCertificateScheme * purple_certificate_find_scheme(gchar * name)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr purple_certificate_find_scheme(string name);
+
+		public static PurpleCertificateScheme FindScheme(string name)
+		{
+			return new PurpleCertificateScheme(purple_certificate_find_scheme(name));
+		}
+
+		/*
+		 * GList * purple_certificate_get_schemes()
+		 * 
+		 * Could not generate a wrapper for purple_certificate_get_schemes in file "certificate.h".
+		 * Message: The type could not be resolved (GList * purple_certificate_get_schemes()).
+		 */
+
+		/*
 		 * gboolean purple_certificate_register_scheme(PurpleCertificateScheme * scheme)
 		 */
 		[DllImport("libpurple.dll")]
@@ -233,7 +330,7 @@ namespace PurpleWrapper
 
 		public static bool RegisterScheme(PurpleCertificateScheme scheme)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_register_scheme(scheme.Reference);
 		}
 
 		/*
@@ -244,10 +341,28 @@ namespace PurpleWrapper
 
 		public static bool UnregisterScheme(PurpleCertificateScheme scheme)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_unregister_scheme(scheme.Reference);
 		}
 
 		/*
+		 * PurpleCertificateVerifier * purple_certificate_find_verifier(gchar * scheme_name, gchar * ver_name)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr purple_certificate_find_verifier(string scheme_name, string ver_name);
+
+		public static PurpleCertificateVerifier FindVerifier(string scheme_name, string ver_name)
+		{
+			return new PurpleCertificateVerifier(purple_certificate_find_verifier(scheme_name, ver_name));
+		}
+
+		/*
+		 * GList * purple_certificate_get_verifiers()
+		 * 
+		 * Could not generate a wrapper for purple_certificate_get_verifiers in file "certificate.h".
+		 * Message: The type could not be resolved (GList * purple_certificate_get_verifiers()).
+		 */
+
+		/*
 		 * gboolean purple_certificate_register_verifier(PurpleCertificateVerifier * vr)
 		 */
 		[DllImport("libpurple.dll")]
@@ -255,7 +370,7 @@ namespace PurpleWrapper
 
 		public static bool RegisterVerifier(PurpleCertificateVerifier vr)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_register_verifier(vr.Reference);
 		}
 
 		/*
@@ -266,10 +381,28 @@ namespace PurpleWrapper
 
 		public static bool UnregisterVerifier(PurpleCertificateVerifier vr)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_unregister_verifier(vr.Reference);
 		}
 
 		/*
+		 * PurpleCertificatePool * purple_certificate_find_pool(gchar * scheme_name, gchar * pool_name)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr purple_certificate_find_pool(string scheme_name, string pool_name);
+
+		public static PurpleCertificatePool FindPool(string scheme_name, string pool_name)
+		{
+			return new PurpleCertificatePool(purple_certificate_find_pool(scheme_name, pool_name));
+		}
+
+		/*
+		 * GList * purple_certificate_get_pools()
+		 * 
+		 * Could not generate a wrapper for purple_certificate_get_pools in file "certificate.h".
+		 * Message: The type could not be resolved (GList * purple_certificate_get_pools()).
+		 */
+
+		/*
 		 * gboolean purple_certificate_register_pool(PurpleCertificatePool * pool)
 		 */
 		[DllImport("libpurple.dll")]
@@ -277,7 +410,7 @@ namespace PurpleWrapper
 
 		public static bool RegisterPool(PurpleCertificatePool pool)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_register_pool(pool.Reference);
 		}
 
 		/*
@@ -288,7 +421,7 @@ namespace PurpleWrapper
 
 		public static bool UnregisterPool(PurpleCertificatePool pool)
 		{
-			throw new NotImplementedException();
+			return purple_certificate_unregister_pool(pool.Reference);
 		}
 
 		/*
@@ -299,7 +432,7 @@ namespace PurpleWrapper
 
 		public static void DisplayX509(PurpleCertificate crt)
 		{
-			throw new NotImplementedException();
+			purple_certificate_display_x509(crt.Reference);
 		}
 
 		/*
@@ -310,7 +443,7 @@ namespace PurpleWrapper
 
 		public static void AddCaSearchPath(string path)
 		{
-			throw new NotImplementedException();
+			purple_certificate_add_ca_search_path(path);
 		}
 
 	}
============================================================
--- libpurple/wrapper/Cipher.cs	6fa0d2192c52b3653a034b0808ae5ff859948b5d
+++ libpurple/wrapper/Cipher.cs	d608397d2572baff56baefd11eb88a4cad116b06
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,83 +40,77 @@ namespace PurpleWrapper
 {
 	public class Cipher
 	{
-		/*
-		 * gchar * purple_cipher_get_name(PurpleCipher * cipher)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_cipher_get_name(IntPtr cipher);
+		public enum PurpleCipherBatchMode
+		{
+			PURPLE_CIPHER_BATCH_MODE_ECB,
+			PURPLE_CIPHER_BATCH_MODE_CBC
+		};
 
-		public static string GetName(PurpleCipher cipher)
+		public enum PurpleCipherCaps
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_CIPHER_CAPS_SET_OPT = 1 << 1,
+			PURPLE_CIPHER_CAPS_GET_OPT = 1 << 2,
+			PURPLE_CIPHER_CAPS_INIT = 1 << 3,
+			PURPLE_CIPHER_CAPS_RESET = 1 << 4,
+			PURPLE_CIPHER_CAPS_UNINIT = 1 << 5,
+			PURPLE_CIPHER_CAPS_SET_IV = 1 << 6,
+			PURPLE_CIPHER_CAPS_APPEND = 1 << 7,
+			PURPLE_CIPHER_CAPS_DIGEST = 1 << 8,
+			PURPLE_CIPHER_CAPS_ENCRYPT = 1 << 9,
+			PURPLE_CIPHER_CAPS_DECRYPT = 1 << 10,
+			PURPLE_CIPHER_CAPS_SET_SALT = 1 << 11,
+			PURPLE_CIPHER_CAPS_GET_SALT_SIZE = 1 << 12,
+			PURPLE_CIPHER_CAPS_SET_KEY = 1 << 13,
+			PURPLE_CIPHER_CAPS_GET_KEY_SIZE = 1 << 14,
+			PURPLE_CIPHER_CAPS_SET_BATCH_MODE = 1 << 15,
+			PURPLE_CIPHER_CAPS_GET_BATCH_MODE = 1 << 16,
+			PURPLE_CIPHER_CAPS_GET_BLOCK_SIZE = 1 << 17,
+			PURPLE_CIPHER_CAPS_SET_KEY_WITH_LEN = 1 << 18,
+			PURPLE_CIPHER_CAPS_UNKNOWN = 1 << 19
+		};
 
 		/*
-		 * guint purple_cipher_get_capabilities(PurpleCipher * cipher)
+		 * gchar * purple_cipher_get_name(PurpleCipher * cipher)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_get_name in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipher * cipher).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_cipher_get_capabilities(IntPtr cipher);
 
-		public static uint GetCapabilities(PurpleCipher cipher)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_cipher_digest_region(gchar * name, guchar * data, size_t data_len, size_t in_len, guchar digest, size_t * out_len)
+		 * guint purple_cipher_get_capabilities(PurpleCipher * cipher)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_get_capabilities in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipher * cipher).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_cipher_digest_region(string name, IntPtr data, UNKNOWN data_len, UNKNOWN in_len, UNKNOWN digest, IntPtr out_len);
 
-		public static bool DigestRegion(string name, guchar data, size_t data_len, size_t in_len, guchar digest, size_t out_len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleCipher * purple_ciphers_find_cipher(gchar * name)
+		 * 
+		 * Could not generate a wrapper for purple_ciphers_find_cipher in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipher * purple_ciphers_find_cipher(gchar * name)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ciphers_find_cipher(string name);
 
-		public static PurpleCipher CiphersFindCipher(string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleCipher * purple_ciphers_register_cipher(gchar * name, PurpleCipherOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_ciphers_register_cipher in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipher * purple_ciphers_register_cipher(gchar * name, PurpleCipherOps * ops)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ciphers_register_cipher(string name, IntPtr ops);
 
-		public static PurpleCipher CiphersRegisterCipher(string name, PurpleCipherOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_ciphers_unregister_cipher(PurpleCipher * cipher)
+		 * 
+		 * Could not generate a wrapper for purple_ciphers_unregister_cipher in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipher * cipher).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_ciphers_unregister_cipher(IntPtr cipher);
 
-		public static bool CiphersUnregisterCipher(PurpleCipher cipher)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_ciphers_get_ciphers()
+		 * 
+		 * Could not generate a wrapper for purple_ciphers_get_ciphers in file "cipher.h".
+		 * Message: The type could not be resolved (GList * purple_ciphers_get_ciphers()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ciphers_get_ciphers();
 
-		public static GList CiphersGetCiphers()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gpointer purple_ciphers_get_handle()
 		 */
@@ -123,7 +119,7 @@ namespace PurpleWrapper
 
 		public static IntPtr CiphersGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_ciphers_get_handle();
 		}
 
 		/*
@@ -134,7 +130,7 @@ namespace PurpleWrapper
 
 		public static void CiphersInit()
 		{
-			throw new NotImplementedException();
+			purple_ciphers_init();
 		}
 
 		/*
@@ -145,273 +141,135 @@ namespace PurpleWrapper
 
 		public static void CiphersUninit()
 		{
-			throw new NotImplementedException();
+			purple_ciphers_uninit();
 		}
 
 		/*
 		 * void purple_cipher_context_set_option(PurpleCipherContext * context, gchar * name, gpointer value)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_set_option in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_set_option(IntPtr context, string name, IntPtr value);
 
-		public static void ContextSetOption(PurpleCipherContext context, string name, IntPtr value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gpointer purple_cipher_context_get_option(PurpleCipherContext * context, gchar * name)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_get_option in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_cipher_context_get_option(IntPtr context, string name);
 
-		public static IntPtr ContextGetOption(PurpleCipherContext context, string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleCipherContext * purple_cipher_context_new(PurpleCipher * cipher, void * extra)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_new in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * purple_cipher_context_new(PurpleCipher * cipher, void * extra)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_cipher_context_new(IntPtr cipher, IntPtr extra);
 
-		public static PurpleCipherContext ContextNew(PurpleCipher cipher, IntPtr extra)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleCipherContext * purple_cipher_context_new_by_name(gchar * name, void * extra)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_new_by_name in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * purple_cipher_context_new_by_name(gchar * name, void * extra)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_cipher_context_new_by_name(string name, IntPtr extra);
 
-		public static PurpleCipherContext ContextNewByName(string name, IntPtr extra)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_reset(PurpleCipherContext * context, gpointer extra)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_reset in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_reset(IntPtr context, IntPtr extra);
 
-		public static void ContextReset(PurpleCipherContext context, IntPtr extra)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_destroy(PurpleCipherContext * context)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_destroy in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_destroy(IntPtr context);
 
-		public static void ContextDestroy(PurpleCipherContext context)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_set_iv(PurpleCipherContext * context, guchar * iv, size_t len)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_set_iv in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_set_iv(IntPtr context, IntPtr iv, UNKNOWN len);
 
-		public static void ContextSetIv(PurpleCipherContext context, guchar iv, size_t len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_append(PurpleCipherContext * context, guchar * data, size_t len)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_append in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_append(IntPtr context, IntPtr data, UNKNOWN len);
 
-		public static void ContextAppend(PurpleCipherContext context, guchar data, size_t len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_cipher_context_digest(PurpleCipherContext * context, size_t in_len, guchar digest, size_t * out_len)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_cipher_context_digest(IntPtr context, UNKNOWN in_len, UNKNOWN digest, IntPtr out_len);
-
-		public static bool ContextDigest(PurpleCipherContext context, size_t in_len, guchar digest, size_t out_len)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_cipher_context_digest_to_str(PurpleCipherContext * context, size_t in_len, gchar digest_s, size_t * out_len)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_cipher_context_digest_to_str(IntPtr context, UNKNOWN in_len, char digest_s, IntPtr out_len);
-
-		public static bool ContextDigestToStr(PurpleCipherContext context, size_t in_len, char digest_s, size_t out_len)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gint purple_cipher_context_encrypt(PurpleCipherContext * context, guchar data, size_t len, guchar output, size_t * outlen)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_cipher_context_encrypt(IntPtr context, UNKNOWN data, UNKNOWN len, UNKNOWN output, IntPtr outlen);
-
-		public static int ContextEncrypt(PurpleCipherContext context, guchar data, size_t len, guchar output, size_t outlen)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gint purple_cipher_context_decrypt(PurpleCipherContext * context, guchar data, size_t len, guchar output, size_t * outlen)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_cipher_context_decrypt(IntPtr context, UNKNOWN data, UNKNOWN len, UNKNOWN output, IntPtr outlen);
-
-		public static int ContextDecrypt(PurpleCipherContext context, guchar data, size_t len, guchar output, size_t outlen)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_cipher_context_set_salt(PurpleCipherContext * context, guchar * salt)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_set_salt in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_set_salt(IntPtr context, IntPtr salt);
 
-		public static void ContextSetSalt(PurpleCipherContext context, guchar salt)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * size_t purple_cipher_context_get_salt_size(PurpleCipherContext * context)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_get_salt_size in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_cipher_context_get_salt_size(IntPtr context);
 
-		public static size_t ContextGetSaltSize(PurpleCipherContext context)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_set_key(PurpleCipherContext * context, guchar * key)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_set_key in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_set_key(IntPtr context, IntPtr key);
 
-		public static void ContextSetKey(PurpleCipherContext context, guchar key)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * size_t purple_cipher_context_get_key_size(PurpleCipherContext * context)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_get_key_size in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_cipher_context_get_key_size(IntPtr context);
 
-		public static size_t ContextGetKeySize(PurpleCipherContext context)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_set_batch_mode(PurpleCipherContext * context, PurpleCipherBatchMode mode)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_set_batch_mode in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_set_batch_mode(IntPtr context, UNKNOWN mode);
 
-		public static void ContextSetBatchMode(PurpleCipherContext context, PurpleCipherBatchMode mode)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleCipherBatchMode purple_cipher_context_get_batch_mode(PurpleCipherContext * context)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_get_batch_mode in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_cipher_context_get_batch_mode(IntPtr context);
 
-		public static PurpleCipherBatchMode ContextGetBatchMode(PurpleCipherContext context)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * size_t purple_cipher_context_get_block_size(PurpleCipherContext * context)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_get_block_size in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_cipher_context_get_block_size(IntPtr context);
 
-		public static size_t ContextGetBlockSize(PurpleCipherContext context)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_set_key_with_len(PurpleCipherContext * context, guchar * key, size_t len)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_set_key_with_len in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_set_key_with_len(IntPtr context, IntPtr key, UNKNOWN len);
 
-		public static void ContextSetKeyWithLen(PurpleCipherContext context, guchar key, size_t len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_cipher_context_set_data(PurpleCipherContext * context, gpointer data)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_set_data in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cipher_context_set_data(IntPtr context, IntPtr data);
 
-		public static void ContextSetData(PurpleCipherContext context, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gpointer purple_cipher_context_get_data(PurpleCipherContext * context)
+		 * 
+		 * Could not generate a wrapper for purple_cipher_context_get_data in file "cipher.h".
+		 * Message: The type could not be resolved (PurpleCipherContext * context).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_cipher_context_get_data(IntPtr context);
 
-		public static IntPtr ContextGetData(PurpleCipherContext context)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gchar * purple_cipher_http_digest_calculate_session_key(gchar * algorithm, gchar * username, gchar * realm, gchar * password, gchar * nonce, gchar * client_nonce)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_cipher_http_digest_calculate_session_key(string algorithm, string username, string realm, string password, string nonce, string client_nonce);
-
-		public static string HttpDigestCalculateSessionKey(string algorithm, string username, string realm, string password, string nonce, string client_nonce)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gchar * purple_cipher_http_digest_calculate_response(gchar * algorithm, gchar * method, gchar * digest_uri, gchar * qop, gchar * entity, gchar * nonce, gchar * nonce_count, gchar * client_nonce, gchar * session_key)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_cipher_http_digest_calculate_response(string algorithm, string method, string digest_uri, string qop, string entity, string nonce, string nonce_count, string client_nonce, string session_key);
-
-		public static string HttpDigestCalculateResponse(string algorithm, string method, string digest_uri, string qop, string entity, string nonce, string nonce_count, string client_nonce, string session_key)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Circbuffer.cs	cb58daa3d392c53494e31292553062df9553ef3d
+++ libpurple/wrapper/Circbuffer.cs	c9489e4526ea948b540961257cff14f3db1dd990
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,11 +44,11 @@ namespace PurpleWrapper
 		 * PurpleCircBuffer * purple_circ_buffer_new(gsize growsize)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_circ_buffer_new(UNKNOWN growsize);
+		private static extern IntPtr purple_circ_buffer_new(ulong growsize);
 
-		public static PurpleCircBuffer CircBufferNew(gsize growsize)
+		public static PurpleCircBuffer CircBufferNew(ulong growsize)
 		{
-			throw new NotImplementedException();
+			return new PurpleCircBuffer(purple_circ_buffer_new(growsize));
 		}
 
 		/*
@@ -57,40 +59,40 @@ namespace PurpleWrapper
 
 		public static void CircBufferDestroy(PurpleCircBuffer buf)
 		{
-			throw new NotImplementedException();
+			purple_circ_buffer_destroy(buf.Reference);
 		}
 
 		/*
 		 * void purple_circ_buffer_append(PurpleCircBuffer * buf, gconstpointer src, gsize len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_circ_buffer_append(IntPtr buf, UNKNOWN src, UNKNOWN len);
+		private static extern void purple_circ_buffer_append(IntPtr buf, IntPtr src, ulong len);
 
-		public static void CircBufferAppend(PurpleCircBuffer buf, gconstpointer src, gsize len)
+		public static void CircBufferAppend(PurpleCircBuffer buf, IntPtr src, ulong len)
 		{
-			throw new NotImplementedException();
+			purple_circ_buffer_append(buf.Reference, src, len);
 		}
 
 		/*
 		 * gsize purple_circ_buffer_get_max_read(PurpleCircBuffer * buf)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_circ_buffer_get_max_read(IntPtr buf);
+		private static extern ulong purple_circ_buffer_get_max_read(IntPtr buf);
 
-		public static gsize CircBufferGetMaxRead(PurpleCircBuffer buf)
+		public static ulong CircBufferGetMaxRead(PurpleCircBuffer buf)
 		{
-			throw new NotImplementedException();
+			return purple_circ_buffer_get_max_read(buf.Reference);
 		}
 
 		/*
 		 * gboolean purple_circ_buffer_mark_read(PurpleCircBuffer * buf, gsize len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_circ_buffer_mark_read(IntPtr buf, UNKNOWN len);
+		private static extern bool purple_circ_buffer_mark_read(IntPtr buf, ulong len);
 
-		public static bool CircBufferMarkRead(PurpleCircBuffer buf, gsize len)
+		public static bool CircBufferMarkRead(PurpleCircBuffer buf, ulong len)
 		{
-			throw new NotImplementedException();
+			return purple_circ_buffer_mark_read(buf.Reference, len);
 		}
 
 	}
============================================================
--- libpurple/wrapper/Cmds.cs	e38cff8d1660c307bf010bbc3df6923c2d145542
+++ libpurple/wrapper/Cmds.cs	e8dc6ebfbd3e525d165b7c54fd335f16b0439667
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,61 +40,68 @@ namespace PurpleWrapper
 {
 	public class Cmds
 	{
-		/*
-		 * PurpleCmdId purple_cmd_register(gchar * cmd, gchar * args, PurpleCmdPriority p, PurpleCmdFlag f, gchar * prpl_id, PurpleCmdFunc func, gchar * helpstr, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_cmd_register(string cmd, string args, UNKNOWN p, UNKNOWN f, string prpl_id, UNKNOWN func, string helpstr, IntPtr data);
+		public enum PurpleCmdStatus
+		{
+			PURPLE_CMD_STATUS_OK,
+			PURPLE_CMD_STATUS_FAILED,
+			PURPLE_CMD_STATUS_NOT_FOUND,
+			PURPLE_CMD_STATUS_WRONG_ARGS,
+			PURPLE_CMD_STATUS_WRONG_PRPL,
+			PURPLE_CMD_STATUS_WRONG_TYPE
+		};
 
-		public static PurpleCmdId CmdRegister(string cmd, string args, PurpleCmdPriority p, PurpleCmdFlag f, string prpl_id, PurpleCmdFunc func, string helpstr, IntPtr data)
+		public enum PurpleCmdRet
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_CMD_RET_OK,
+			PURPLE_CMD_RET_FAILED,
+			PURPLE_CMD_RET_CONTINUE
+		};
 
-		/*
-		 * void purple_cmd_unregister(PurpleCmdId id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_cmd_unregister(UNKNOWN id);
+		public enum PurpleCmdPriority
+		{
+			PURPLE_CMD_P_VERY_LOW = -1000,
+			PURPLE_CMD_P_LOW = 0,
+			PURPLE_CMD_P_DEFAULT = 1000,
+			PURPLE_CMD_P_PRPL = 2000,
+			PURPLE_CMD_P_PLUGIN = 3000,
+			PURPLE_CMD_P_ALIAS = 4000,
+			PURPLE_CMD_P_HIGH = 5000,
+			PURPLE_CMD_P_VERY_HIGH = 6000
+		};
 
-		public static void CmdUnregister(PurpleCmdId id)
+		public enum PurpleCmdFlag
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_CMD_FLAG_IM = 0x01,
+			PURPLE_CMD_FLAG_CHAT = 0x02,
+			PURPLE_CMD_FLAG_PRPL_ONLY = 0x04,
+			PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS = 0x08
+		};
 
 		/*
-		 * PurpleCmdStatus purple_cmd_do_command(PurpleConversation * conv, gchar * cmdline, gchar * markup, gchar ** errormsg)
+		 * void purple_cmd_unregister(PurpleCmdId id)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_cmd_do_command(IntPtr conv, string cmdline, string markup, IntPtr errormsg);
+		private static extern void purple_cmd_unregister(uint id);
 
-		public static PurpleCmdStatus CmdDoCommand(PurpleConversation conv, string cmdline, string markup, gchar errormsg)
+		public static void CmdUnregister(uint id)
 		{
-			throw new NotImplementedException();
+			purple_cmd_unregister(id);
 		}
 
 		/*
 		 * GList * purple_cmd_list(PurpleConversation * conv)
+		 * 
+		 * Could not generate a wrapper for purple_cmd_list in file "cmds.h".
+		 * Message: The type could not be resolved (GList * purple_cmd_list(PurpleConversation * conv)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_cmd_list(IntPtr conv);
 
-		public static GList CmdList(PurpleConversation conv)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_cmd_help(PurpleConversation * conv, gchar * cmd)
+		 * 
+		 * Could not generate a wrapper for purple_cmd_help in file "cmds.h".
+		 * Message: The type could not be resolved (GList * purple_cmd_help(PurpleConversation * conv, gchar * cmd)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_cmd_help(IntPtr conv, string cmd);
 
-		public static GList CmdHelp(PurpleConversation conv, string cmd)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gpointer purple_cmds_get_handle()
 		 */
@@ -101,7 +110,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_cmds_get_handle();
 		}
 
 		/*
@@ -112,7 +121,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_cmds_init();
 		}
 
 		/*
@@ -123,7 +132,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_cmds_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Config.cs	9940c35e2f6e2804575f1b65280f5406c842251d
+++ libpurple/wrapper/Config.cs	81ec3145c181871fb27de27ae3fb89cc46eea514
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,7 +48,7 @@ namespace PurpleWrapper
 
 		public static void StaticProtoInit()
 		{
-			throw new NotImplementedException();
+			static_proto_init();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Connection.cs	240fd18be4019a6e932adc021e8fdf26c6c69a13
+++ libpurple/wrapper/Connection.cs	a58cc36f21ddcccf9ab9b712fcf99af23ce12a5a
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,28 +40,54 @@ namespace PurpleWrapper
 {
 	public class Connection
 	{
-		/*
-		 * void purple_connection_new(PurpleAccount * account, gboolean regist, char * password)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_connection_new(IntPtr account, bool regist, string password);
+		public enum PurpleConnectionFlags
+		{
+			PURPLE_CONNECTION_HTML = 0x0001,
+			PURPLE_CONNECTION_NO_BGCOLOR = 0x0002,
+			PURPLE_CONNECTION_AUTO_RESP = 0x0004,
+			PURPLE_CONNECTION_FORMATTING_WBFO = 0x0008,
+			PURPLE_CONNECTION_NO_NEWLINES = 0x0010,
+			PURPLE_CONNECTION_NO_FONTSIZE = 0x0020,
+			PURPLE_CONNECTION_NO_URLDESC = 0x0040,
+			PURPLE_CONNECTION_NO_IMAGES = 0x0080,
+			PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY = 0x0100
+		};
 
-		public static void New(PurpleAccount account, bool regist, string password)
+		public enum PurpleConnectionState
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_DISCONNECTED = 0,
+			PURPLE_CONNECTED,
+			PURPLE_CONNECTING
+		};
 
+		public enum PurpleConnectionError
+		{
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR = 0,
+			PURPLE_CONNECTION_ERROR_INVALID_USERNAME = 1,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED = 2,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE = 3,
+			PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT = 4,
+			PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR = 5,
+			PURPLE_CONNECTION_ERROR_NAME_IN_USE = 6,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS = 7,
+			PURPLE_CONNECTION_ERROR_CERT_NOT_PROVIDED = 8,
+			PURPLE_CONNECTION_ERROR_CERT_UNTRUSTED = 9,
+			PURPLE_CONNECTION_ERROR_CERT_EXPIRED = 10,
+			PURPLE_CONNECTION_ERROR_CERT_NOT_ACTIVATED = 11,
+			PURPLE_CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH = 12,
+			PURPLE_CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH = 13,
+			PURPLE_CONNECTION_ERROR_CERT_SELF_SIGNED = 14,
+			PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR = 15,
+			PURPLE_CONNECTION_ERROR_OTHER_ERROR = 16
+		};
+
 		/*
 		 * void purple_connection_new_unregister(PurpleAccount * account, char * password, PurpleAccountUnregistrationCb cb, void * user_data)
+		 * 
+		 * Could not generate a wrapper for purple_connection_new_unregister in file "connection.h".
+		 * Message: The type could not be resolved (PurpleAccountUnregistrationCb cb).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_connection_new_unregister(IntPtr account, string password, UNKNOWN cb, IntPtr user_data);
 
-		public static void NewUnregister(PurpleAccount account, string password, PurpleAccountUnregistrationCb cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_connection_destroy(PurpleConnection * gc)
 		 */
@@ -68,17 +96,18 @@ namespace PurpleWrapper
 
 		public static void Destroy(PurpleConnection gc)
 		{
-			throw new NotImplementedException();
+			purple_connection_destroy(gc.Reference);
 		}
 
 		/*
 		 * void purple_connection_set_state(PurpleConnection * gc, PurpleConnectionState state)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_connection_set_state(IntPtr gc, UNKNOWN state);
+		private static extern void purple_connection_set_state(IntPtr gc, Connection.PurpleConnectionState state);
 
-		public static void SetState(PurpleConnection gc, PurpleConnectionState state)
+		public static void SetState(PurpleConnection gc, Connection.PurpleConnectionState state)
 		{
+			/* Unable to process state, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -90,7 +119,7 @@ namespace PurpleWrapper
 
 		public static void SetAccount(PurpleConnection gc, PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_connection_set_account(gc.Reference, account.Reference);
 		}
 
 		/*
@@ -101,7 +130,7 @@ namespace PurpleWrapper
 
 		public static void SetDisplayName(PurpleConnection gc, string name)
 		{
-			throw new NotImplementedException();
+			purple_connection_set_display_name(gc.Reference, name);
 		}
 
 		/*
@@ -112,18 +141,19 @@ namespace PurpleWrapper
 
 		public static void SetProtocolData(PurpleConnection connection, IntPtr proto_data)
 		{
-			throw new NotImplementedException();
+			purple_connection_set_protocol_data(connection.Reference, proto_data);
 		}
 
 		/*
 		 * PurpleConnectionState purple_connection_get_state(PurpleConnection * gc)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_connection_get_state(IntPtr gc);
+		private static extern Connection.PurpleConnectionState purple_connection_get_state(IntPtr gc);
 
-		public static PurpleConnectionState GetState(PurpleConnection gc)
+		public static Connection.PurpleConnectionState GetState(PurpleConnection gc)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_connection_get_state, a KnownEnum. */
+			
 		}
 
 		/*
@@ -134,10 +164,21 @@ namespace PurpleWrapper
 
 		public static PurpleAccount GetAccount(PurpleConnection gc)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_connection_get_account(gc.Reference));
 		}
 
 		/*
+		 * PurplePlugin * purple_connection_get_prpl(PurpleConnection * gc)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr purple_connection_get_prpl(IntPtr gc);
+
+		public static PurplePlugin GetPrpl(PurpleConnection gc)
+		{
+			return new PurplePlugin(purple_connection_get_prpl(gc.Reference));
+		}
+
+		/*
 		 * char * purple_connection_get_password(PurpleConnection * gc)
 		 */
 		[DllImport("libpurple.dll")]
@@ -145,7 +186,7 @@ namespace PurpleWrapper
 
 		public static string GetPassword(PurpleConnection gc)
 		{
-			throw new NotImplementedException();
+			return purple_connection_get_password(gc.Reference);
 		}
 
 		/*
@@ -156,7 +197,7 @@ namespace PurpleWrapper
 
 		public static string GetDisplayName(PurpleConnection gc)
 		{
-			throw new NotImplementedException();
+			return purple_connection_get_display_name(gc.Reference);
 		}
 
 		/*
@@ -167,21 +208,10 @@ namespace PurpleWrapper
 
 		public static IntPtr GetProtocolData(PurpleConnection connection)
 		{
-			throw new NotImplementedException();
+			return purple_connection_get_protocol_data(connection.Reference);
 		}
 
 		/*
-		 * void purple_connection_update_progress(PurpleConnection * gc, char * text, size_t step, size_t count)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_connection_update_progress(IntPtr gc, string text, UNKNOWN step, UNKNOWN count);
-
-		public static void UpdateProgress(PurpleConnection gc, string text, size_t step, size_t count)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_connection_notice(PurpleConnection * gc, char * text)
 		 */
 		[DllImport("libpurple.dll")]
@@ -189,7 +219,7 @@ namespace PurpleWrapper
 
 		public static void Notice(PurpleConnection gc, string text)
 		{
-			throw new NotImplementedException();
+			purple_connection_notice(gc.Reference, text);
 		}
 
 		/*
@@ -200,39 +230,18 @@ namespace PurpleWrapper
 
 		public static void Error(PurpleConnection gc, string reason)
 		{
-			throw new NotImplementedException();
+			purple_connection_error(gc.Reference, reason);
 		}
 
 		/*
-		 * void purple_connection_error_reason(PurpleConnection * gc, PurpleConnectionError reason, char * description)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_connection_error_reason(IntPtr gc, UNKNOWN reason, string description);
-
-		public static void ErrorReason(PurpleConnection gc, PurpleConnectionError reason, string description)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_connection_ssl_error(PurpleConnection * gc, PurpleSslErrorType ssl_error)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_connection_ssl_error(IntPtr gc, UNKNOWN ssl_error);
-
-		public static void SslError(PurpleConnection gc, PurpleSslErrorType ssl_error)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_connection_error_is_fatal(PurpleConnectionError reason)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_connection_error_is_fatal(UNKNOWN reason);
+		private static extern bool purple_connection_error_is_fatal(Connection.PurpleConnectionError reason);
 
-		public static bool ErrorIsFatal(PurpleConnectionError reason)
+		public static bool ErrorIsFatal(Connection.PurpleConnectionError reason)
 		{
+			/* Unable to process reason, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -244,53 +253,37 @@ namespace PurpleWrapper
 
 		public static void ConnectionsDisconnectAll()
 		{
-			throw new NotImplementedException();
+			purple_connections_disconnect_all();
 		}
 
 		/*
 		 * GList * purple_connections_get_all()
+		 * 
+		 * Could not generate a wrapper for purple_connections_get_all in file "connection.h".
+		 * Message: The type could not be resolved (GList * purple_connections_get_all()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_connections_get_all();
 
-		public static GList ConnectionsGetAll()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_connections_get_connecting()
+		 * 
+		 * Could not generate a wrapper for purple_connections_get_connecting in file "connection.h".
+		 * Message: The type could not be resolved (GList * purple_connections_get_connecting()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_connections_get_connecting();
 
-		public static GList ConnectionsGetConnecting()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_connections_set_ui_ops(PurpleConnectionUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_connections_set_ui_ops in file "connection.h".
+		 * Message: The type could not be resolved (PurpleConnectionUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_connections_set_ui_ops(IntPtr ops);
 
-		public static void ConnectionsSetUiOps(PurpleConnectionUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleConnectionUiOps * purple_connections_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_connections_get_ui_ops in file "connection.h".
+		 * Message: The type could not be resolved (PurpleConnectionUiOps * purple_connections_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_connections_get_ui_ops();
 
-		public static PurpleConnectionUiOps ConnectionsGetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_connections_init()
 		 */
@@ -299,7 +292,7 @@ namespace PurpleWrapper
 
 		public static void ConnectionsInit()
 		{
-			throw new NotImplementedException();
+			purple_connections_init();
 		}
 
 		/*
@@ -310,7 +303,7 @@ namespace PurpleWrapper
 
 		public static void ConnectionsUninit()
 		{
-			throw new NotImplementedException();
+			purple_connections_uninit();
 		}
 
 		/*
@@ -321,7 +314,7 @@ namespace PurpleWrapper
 
 		public static IntPtr ConnectionsGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_connections_get_handle();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Conversation.cs	2678e5a205e179d0fa6e79f9ba43e94ddc14045c
+++ libpurple/wrapper/Conversation.cs	34ee3343a49d5aa9229563b88afef6b3d06d5d38
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,17 +40,69 @@ namespace PurpleWrapper
 {
 	public class Conversation
 	{
-		/*
-		 * PurpleConversation * purple_conversation_new(PurpleConversationType type, PurpleAccount * account, char * name)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conversation_new(UNKNOWN type, IntPtr account, string name);
+		public enum PurpleConversationType
+		{
+			PURPLE_CONV_TYPE_UNKNOWN = 0,
+			PURPLE_CONV_TYPE_IM,
+			PURPLE_CONV_TYPE_CHAT,
+			PURPLE_CONV_TYPE_MISC,
+			PURPLE_CONV_TYPE_ANY
+		};
 
-		public static PurpleConversation New(PurpleConversationType type, PurpleAccount account, string name)
+		public enum PurpleConvUpdateType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_CONV_UPDATE_ADD = 0,
+			PURPLE_CONV_UPDATE_REMOVE,
+			PURPLE_CONV_UPDATE_ACCOUNT,
+			PURPLE_CONV_UPDATE_TYPING,
+			PURPLE_CONV_UPDATE_UNSEEN,
+			PURPLE_CONV_UPDATE_LOGGING,
+			PURPLE_CONV_UPDATE_TOPIC,
+			PURPLE_CONV_ACCOUNT_ONLINE,
+			PURPLE_CONV_ACCOUNT_OFFLINE,
+			PURPLE_CONV_UPDATE_AWAY,
+			PURPLE_CONV_UPDATE_ICON,
+			PURPLE_CONV_UPDATE_TITLE,
+			PURPLE_CONV_UPDATE_CHATLEFT,
+			PURPLE_CONV_UPDATE_FEATURES
+		};
 
+		public enum PurpleTypingState
+		{
+			PURPLE_NOT_TYPING = 0,
+			PURPLE_TYPING,
+			PURPLE_TYPED
+		};
+
+		public enum PurpleMessageFlags
+		{
+			PURPLE_MESSAGE_SEND = 0x0001,
+			PURPLE_MESSAGE_RECV = 0x0002,
+			PURPLE_MESSAGE_SYSTEM = 0x0004,
+			PURPLE_MESSAGE_AUTO_RESP = 0x0008,
+			PURPLE_MESSAGE_ACTIVE_ONLY = 0x0010,
+			PURPLE_MESSAGE_NICK = 0x0020,
+			PURPLE_MESSAGE_NO_LOG = 0x0040,
+			PURPLE_MESSAGE_WHISPER = 0x0080,
+			PURPLE_MESSAGE_ERROR = 0x0200,
+			PURPLE_MESSAGE_DELAYED = 0x0400,
+			PURPLE_MESSAGE_RAW = 0x0800,
+			PURPLE_MESSAGE_IMAGES = 0x1000,
+			PURPLE_MESSAGE_NOTIFY = 0x2000,
+			PURPLE_MESSAGE_NO_LINKIFY = 0x4000,
+			PURPLE_MESSAGE_INVISIBLE = 0x8000
+		};
+
+		public enum PurpleConvChatBuddyFlags
+		{
+			PURPLE_CBFLAGS_NONE = 0x0000,
+			PURPLE_CBFLAGS_VOICE = 0x0001,
+			PURPLE_CBFLAGS_HALFOP = 0x0002,
+			PURPLE_CBFLAGS_OP = 0x0004,
+			PURPLE_CBFLAGS_FOUNDER = 0x0008,
+			PURPLE_CBFLAGS_TYPING = 0x0010
+		};
+
 		/*
 		 * void purple_conversation_destroy(PurpleConversation * conv)
 		 */
@@ -57,7 +111,7 @@ namespace PurpleWrapper
 
 		public static void Destroy(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			purple_conversation_destroy(conv.Reference);
 		}
 
 		/*
@@ -68,32 +122,22 @@ namespace PurpleWrapper
 
 		public static void Present(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			purple_conversation_present(conv.Reference);
 		}
 
 		/*
 		 * PurpleConversationType purple_conversation_get_type(PurpleConversation * conv)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_conversation_get_type(IntPtr conv);
+		private static extern Conversation.PurpleConversationType purple_conversation_get_type(IntPtr conv);
 
-		public static PurpleConversationType GetType(PurpleConversation conv)
+		public static Conversation.PurpleConversationType GetType(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_conversation_get_type, a KnownEnum. */
+			
 		}
 
 		/*
-		 * void purple_conversation_set_ui_ops(PurpleConversation * conv, PurpleConversationUiOps * ops)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conversation_set_ui_ops(IntPtr conv, IntPtr ops);
-
-		public static void SetUiOps(PurpleConversation conv, PurpleConversationUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_conversations_set_ui_ops(PurpleConversationUiOps * ops)
 		 */
 		[DllImport("libpurple.dll")]
@@ -101,32 +145,10 @@ namespace PurpleWrapper
 
 		public static void ConversationsSetUiOps(PurpleConversationUiOps ops)
 		{
-			throw new NotImplementedException();
+			purple_conversations_set_ui_ops(ops.Reference);
 		}
 
 		/*
-		 * PurpleConversationUiOps * purple_conversation_get_ui_ops(PurpleConversation * conv)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conversation_get_ui_ops(IntPtr conv);
-
-		public static PurpleConversationUiOps GetUiOps(PurpleConversation conv)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conversation_set_account(PurpleConversation * conv, PurpleAccount * account)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conversation_set_account(IntPtr conv, IntPtr account);
-
-		public static void SetAccount(PurpleConversation conv, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleAccount * purple_conversation_get_account(PurpleConversation * conv)
 		 */
 		[DllImport("libpurple.dll")]
@@ -134,7 +156,7 @@ namespace PurpleWrapper
 
 		public static PurpleAccount GetAccount(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_conversation_get_account(conv.Reference));
 		}
 
 		/*
@@ -145,7 +167,7 @@ namespace PurpleWrapper
 
 		public static PurpleConnection GetGc(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return new PurpleConnection(purple_conversation_get_gc(conv.Reference));
 		}
 
 		/*
@@ -156,7 +178,7 @@ namespace PurpleWrapper
 
 		public static void SetTitle(PurpleConversation conv, string title)
 		{
-			throw new NotImplementedException();
+			purple_conversation_set_title(conv.Reference, title);
 		}
 
 		/*
@@ -167,7 +189,7 @@ namespace PurpleWrapper
 
 		public static string GetTitle(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return purple_conversation_get_title(conv.Reference);
 		}
 
 		/*
@@ -178,7 +200,7 @@ namespace PurpleWrapper
 
 		public static void AutosetTitle(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			purple_conversation_autoset_title(conv.Reference);
 		}
 
 		/*
@@ -189,7 +211,7 @@ namespace PurpleWrapper
 
 		public static void SetName(PurpleConversation conv, string name)
 		{
-			throw new NotImplementedException();
+			purple_conversation_set_name(conv.Reference, name);
 		}
 
 		/*
@@ -200,7 +222,7 @@ namespace PurpleWrapper
 
 		public static string GetName(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return purple_conversation_get_name(conv.Reference);
 		}
 
 		/*
@@ -211,7 +233,7 @@ namespace PurpleWrapper
 
 		public static void SetLogging(PurpleConversation conv, bool log)
 		{
-			throw new NotImplementedException();
+			purple_conversation_set_logging(conv.Reference, log);
 		}
 
 		/*
@@ -222,7 +244,7 @@ namespace PurpleWrapper
 
 		public static bool IsLogging(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return purple_conversation_is_logging(conv.Reference);
 		}
 
 		/*
@@ -233,7 +255,7 @@ namespace PurpleWrapper
 
 		public static void CloseLogs(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			purple_conversation_close_logs(conv.Reference);
 		}
 
 		/*
@@ -244,7 +266,7 @@ namespace PurpleWrapper
 
 		public static PurpleConvIm GetImData(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return new PurpleConvIm(purple_conversation_get_im_data(conv.Reference));
 		}
 
 		/*
@@ -255,21 +277,10 @@ namespace PurpleWrapper
 
 		public static PurpleConvChat GetChatData(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return new PurpleConvChat(purple_conversation_get_chat_data(conv.Reference));
 		}
 
 		/*
-		 * void purple_conversation_set_data(PurpleConversation * conv, char * key, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conversation_set_data(IntPtr conv, string key, IntPtr data);
-
-		public static void SetData(PurpleConversation conv, string key, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gpointer purple_conversation_get_data(PurpleConversation * conv, char * key)
 		 */
 		[DllImport("libpurple.dll")]
@@ -277,84 +288,40 @@ namespace PurpleWrapper
 
 		public static IntPtr GetData(PurpleConversation conv, string key)
 		{
-			throw new NotImplementedException();
+			return purple_conversation_get_data(conv.Reference, key);
 		}
 
 		/*
 		 * GList * purple_get_conversations()
+		 * 
+		 * Could not generate a wrapper for purple_get_conversations in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_get_conversations()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_get_conversations();
 
-		public static GList GetConversations()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_get_ims()
+		 * 
+		 * Could not generate a wrapper for purple_get_ims in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_get_ims()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_get_ims();
 
-		public static GList GetIms()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_get_chats()
+		 * 
+		 * Could not generate a wrapper for purple_get_chats in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_get_chats()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_get_chats();
 
-		public static GList GetChats()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleConversation * purple_find_conversation_with_account(PurpleConversationType type, char * name, PurpleAccount * account)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_find_conversation_with_account(UNKNOWN type, string name, IntPtr account);
-
-		public static PurpleConversation FindConversationWithAccount(PurpleConversationType type, string name, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conversation_write(PurpleConversation * conv, char * who, char * message, PurpleMessageFlags flags, time_t mtime)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conversation_write(IntPtr conv, string who, string message, UNKNOWN flags, UNKNOWN mtime);
-
-		public static void Write(PurpleConversation conv, string who, string message, PurpleMessageFlags flags, time_t mtime)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conversation_set_features(PurpleConversation * conv, PurpleConnectionFlags features)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conversation_set_features(IntPtr conv, UNKNOWN features);
-
-		public static void SetFeatures(PurpleConversation conv, PurpleConnectionFlags features)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleConnectionFlags purple_conversation_get_features(PurpleConversation * conv)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_conversation_get_features(IntPtr conv);
+		private static extern Connection.PurpleConnectionFlags purple_conversation_get_features(IntPtr conv);
 
-		public static PurpleConnectionFlags GetFeatures(PurpleConversation conv)
+		public static Connection.PurpleConnectionFlags GetFeatures(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_conversation_get_features, a KnownEnum. */
+			
 		}
 
 		/*
@@ -365,42 +332,28 @@ namespace PurpleWrapper
 
 		public static bool HasFocus(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			return purple_conversation_has_focus(conv.Reference);
 		}
 
 		/*
 		 * void purple_conversation_update(PurpleConversation * conv, PurpleConvUpdateType type)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_conversation_update(IntPtr conv, UNKNOWN type);
+		private static extern void purple_conversation_update(IntPtr conv, Conversation.PurpleConvUpdateType type);
 
-		public static void Update(PurpleConversation conv, PurpleConvUpdateType type)
+		public static void Update(PurpleConversation conv, Conversation.PurpleConvUpdateType type)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * void purple_conversation_foreach( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conversation_foreach(UNKNOWN );
-
-		public static void Foreach( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_conversation_get_message_history(PurpleConversation * conv)
+		 * 
+		 * Could not generate a wrapper for purple_conversation_get_message_history in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_conversation_get_message_history(PurpleConversation * conv)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conversation_get_message_history(IntPtr conv);
 
-		public static GList GetMessageHistory(PurpleConversation conv)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_conversation_clear_message_history(PurpleConversation * conv)
 		 */
@@ -409,7 +362,7 @@ namespace PurpleWrapper
 
 		public static void ClearMessageHistory(PurpleConversation conv)
 		{
-			throw new NotImplementedException();
+			purple_conversation_clear_message_history(conv.Reference);
 		}
 
 		/*
@@ -420,7 +373,7 @@ namespace PurpleWrapper
 
 		public static string MessageGetSender(PurpleConvMessage msg)
 		{
-			throw new NotImplementedException();
+			return purple_conversation_message_get_sender(msg.Reference);
 		}
 
 		/*
@@ -431,29 +384,31 @@ namespace PurpleWrapper
 
 		public static string MessageGetMessage(PurpleConvMessage msg)
 		{
-			throw new NotImplementedException();
+			return purple_conversation_message_get_message(msg.Reference);
 		}
 
 		/*
 		 * PurpleMessageFlags purple_conversation_message_get_flags(PurpleConvMessage * msg)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_conversation_message_get_flags(IntPtr msg);
+		private static extern Conversation.PurpleMessageFlags purple_conversation_message_get_flags(IntPtr msg);
 
-		public static PurpleMessageFlags MessageGetFlags(PurpleConvMessage msg)
+		public static Conversation.PurpleMessageFlags MessageGetFlags(PurpleConvMessage msg)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_conversation_message_get_flags, a KnownEnum. */
+			
 		}
 
 		/*
 		 * time_t purple_conversation_message_get_timestamp(PurpleConvMessage * msg)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_conversation_message_get_timestamp(IntPtr msg);
+		private static extern ulong purple_conversation_message_get_timestamp(IntPtr msg);
 
-		public static time_t MessageGetTimestamp(PurpleConvMessage msg)
+		public static DateTime MessageGetTimestamp(PurpleConvMessage msg)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_conversation_message_get_timestamp, a DateTime. */
+			
 		}
 
 		/*
@@ -464,39 +419,32 @@ namespace PurpleWrapper
 
 		public static PurpleConversation ConvImGetConversation(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			return new PurpleConversation(purple_conv_im_get_conversation(im.Reference));
 		}
 
 		/*
 		 * void purple_conv_im_set_icon(PurpleConvIm * im, PurpleBuddyIcon * icon)
+		 * 
+		 * Could not generate a wrapper for purple_conv_im_set_icon in file "conversation.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_im_set_icon(IntPtr im, IntPtr icon);
 
-		public static void ConvImSetIcon(PurpleConvIm im, PurpleBuddyIcon icon)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleBuddyIcon * purple_conv_im_get_icon(PurpleConvIm * im)
+		 * 
+		 * Could not generate a wrapper for purple_conv_im_get_icon in file "conversation.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * purple_conv_im_get_icon(PurpleConvIm * im)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conv_im_get_icon(IntPtr im);
 
-		public static PurpleBuddyIcon ConvImGetIcon(PurpleConvIm im)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_conv_im_set_typing_state(PurpleConvIm * im, PurpleTypingState state)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_im_set_typing_state(IntPtr im, UNKNOWN state);
+		private static extern void purple_conv_im_set_typing_state(IntPtr im, Conversation.PurpleTypingState state);
 
-		public static void ConvImSetTypingState(PurpleConvIm im, PurpleTypingState state)
+		public static void ConvImSetTypingState(PurpleConvIm im, Conversation.PurpleTypingState state)
 		{
+			/* Unable to process state, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -504,11 +452,12 @@ namespace PurpleWrapper
 		 * PurpleTypingState purple_conv_im_get_typing_state(PurpleConvIm * im)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_conv_im_get_typing_state(IntPtr im);
+		private static extern Conversation.PurpleTypingState purple_conv_im_get_typing_state(IntPtr im);
 
-		public static PurpleTypingState ConvImGetTypingState(PurpleConvIm im)
+		public static Conversation.PurpleTypingState ConvImGetTypingState(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_conv_im_get_typing_state, a KnownEnum. */
+			
 		}
 
 		/*
@@ -519,7 +468,7 @@ namespace PurpleWrapper
 
 		public static void ConvImStartTypingTimeout(PurpleConvIm im, int timeout)
 		{
-			throw new NotImplementedException();
+			purple_conv_im_start_typing_timeout(im.Reference, timeout);
 		}
 
 		/*
@@ -530,7 +479,7 @@ namespace PurpleWrapper
 
 		public static void ConvImStopTypingTimeout(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			purple_conv_im_stop_typing_timeout(im.Reference);
 		}
 
 		/*
@@ -541,29 +490,30 @@ namespace PurpleWrapper
 
 		public static uint ConvImGetTypingTimeout(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			return purple_conv_im_get_typing_timeout(im.Reference);
 		}
 
 		/*
-		 * void purple_conv_im_set_type_again(PurpleConvIm * im, unsigned int)
+		 * void purple_conv_im_set_type_again(PurpleConvIm * im, unsigned int val)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_im_set_type_again(IntPtr im, UNKNOWN int);
+		private static extern void purple_conv_im_set_type_again(IntPtr im, uint val);
 
-		public static void ConvImSetTypeAgain(PurpleConvIm im, unsigned int)
+		public static void ConvImSetTypeAgain(PurpleConvIm im, uint val)
 		{
-			throw new NotImplementedException();
+			purple_conv_im_set_type_again(im.Reference, val);
 		}
 
 		/*
 		 * time_t purple_conv_im_get_type_again(PurpleConvIm * im)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_conv_im_get_type_again(IntPtr im);
+		private static extern ulong purple_conv_im_get_type_again(IntPtr im);
 
-		public static time_t ConvImGetTypeAgain(PurpleConvIm im)
+		public static DateTime ConvImGetTypeAgain(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_conv_im_get_type_again, a DateTime. */
+			
 		}
 
 		/*
@@ -574,7 +524,7 @@ namespace PurpleWrapper
 
 		public static void ConvImStartSendTypedTimeout(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			purple_conv_im_start_send_typed_timeout(im.Reference);
 		}
 
 		/*
@@ -585,7 +535,7 @@ namespace PurpleWrapper
 
 		public static void ConvImStopSendTypedTimeout(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			purple_conv_im_stop_send_typed_timeout(im.Reference);
 		}
 
 		/*
@@ -596,7 +546,7 @@ namespace PurpleWrapper
 
 		public static uint ConvImGetSendTypedTimeout(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			return purple_conv_im_get_send_typed_timeout(im.Reference);
 		}
 
 		/*
@@ -607,21 +557,10 @@ namespace PurpleWrapper
 
 		public static void ConvImUpdateTyping(PurpleConvIm im)
 		{
-			throw new NotImplementedException();
+			purple_conv_im_update_typing(im.Reference);
 		}
 
 		/*
-		 * void purple_conv_im_write(PurpleConvIm * im, char * who, char * message, PurpleMessageFlags flags, time_t mtime)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_im_write(IntPtr im, string who, string message, UNKNOWN flags, UNKNOWN mtime);
-
-		public static void ConvImWrite(PurpleConvIm im, string who, string message, PurpleMessageFlags flags, time_t mtime)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_conv_present_error(char * who, PurpleAccount * account, char * what)
 		 */
 		[DllImport("libpurple.dll")]
@@ -629,7 +568,7 @@ namespace PurpleWrapper
 
 		public static bool ConvPresentError(string who, PurpleAccount account, string what)
 		{
-			throw new NotImplementedException();
+			return purple_conv_present_error(who, account.Reference, what);
 		}
 
 		/*
@@ -640,7 +579,7 @@ namespace PurpleWrapper
 
 		public static void ConvImSend(PurpleConvIm im, string message)
 		{
-			throw new NotImplementedException();
+			purple_conv_im_send(im.Reference, message);
 		}
 
 		/*
@@ -651,43 +590,22 @@ namespace PurpleWrapper
 
 		public static void ConvSendConfirm(PurpleConversation conv, string message)
 		{
-			throw new NotImplementedException();
+			purple_conv_send_confirm(conv.Reference, message);
 		}
 
 		/*
 		 * void purple_conv_im_send_with_flags(PurpleConvIm * im, char * message, PurpleMessageFlags flags)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_im_send_with_flags(IntPtr im, string message, UNKNOWN flags);
+		private static extern void purple_conv_im_send_with_flags(IntPtr im, string message, Conversation.PurpleMessageFlags flags);
 
-		public static void ConvImSendWithFlags(PurpleConvIm im, string message, PurpleMessageFlags flags)
+		public static void ConvImSendWithFlags(PurpleConvIm im, string message, Conversation.PurpleMessageFlags flags)
 		{
+			/* Unable to process flags, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * gboolean purple_conv_custom_smiley_add(PurpleConversation * conv, char * smile, char * cksum_type, char * chksum, gboolean remote)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_conv_custom_smiley_add(IntPtr conv, string smile, string cksum_type, string chksum, bool remote);
-
-		public static bool ConvCustomSmileyAdd(PurpleConversation conv, string smile, string cksum_type, string chksum, bool remote)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conv_custom_smiley_write(PurpleConversation * conv, char * smile, guchar * data, gsize size)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_custom_smiley_write(IntPtr conv, string smile, IntPtr data, UNKNOWN size);
-
-		public static void ConvCustomSmileyWrite(PurpleConversation conv, string smile, guchar data, gsize size)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_conv_custom_smiley_close(PurpleConversation * conv, char * smile)
 		 */
 		[DllImport("libpurple.dll")]
@@ -695,7 +613,7 @@ namespace PurpleWrapper
 
 		public static void ConvCustomSmileyClose(PurpleConversation conv, string smile)
 		{
-			throw new NotImplementedException();
+			purple_conv_custom_smiley_close(conv.Reference, smile);
 		}
 
 		/*
@@ -706,31 +624,23 @@ namespace PurpleWrapper
 
 		public static PurpleConversation ConvChatGetConversation(PurpleConvChat chat)
 		{
-			throw new NotImplementedException();
+			return new PurpleConversation(purple_conv_chat_get_conversation(chat.Reference));
 		}
 
 		/*
 		 * GList * purple_conv_chat_set_users(PurpleConvChat * chat, GList * users)
+		 * 
+		 * Could not generate a wrapper for purple_conv_chat_set_users in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_conv_chat_set_users(PurpleConvChat * chat, GList * users)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conv_chat_set_users(IntPtr chat, IntPtr users);
 
-		public static GList ConvChatSetUsers(PurpleConvChat chat, GList users)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_conv_chat_get_users(PurpleConvChat * chat)
+		 * 
+		 * Could not generate a wrapper for purple_conv_chat_get_users in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_conv_chat_get_users(PurpleConvChat * chat)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conv_chat_get_users(IntPtr chat);
 
-		public static GList ConvChatGetUsers(PurpleConvChat chat)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_conv_chat_ignore(PurpleConvChat * chat, char * name)
 		 */
@@ -739,7 +649,7 @@ namespace PurpleWrapper
 
 		public static void ConvChatIgnore(PurpleConvChat chat, string name)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_ignore(chat.Reference, name);
 		}
 
 		/*
@@ -750,65 +660,24 @@ namespace PurpleWrapper
 
 		public static void ConvChatUnignore(PurpleConvChat chat, string name)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_unignore(chat.Reference, name);
 		}
 
 		/*
 		 * GList * purple_conv_chat_set_ignored(PurpleConvChat * chat, GList * ignored)
+		 * 
+		 * Could not generate a wrapper for purple_conv_chat_set_ignored in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_conv_chat_set_ignored(PurpleConvChat * chat, GList * ignored)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conv_chat_set_ignored(IntPtr chat, IntPtr ignored);
 
-		public static GList ConvChatSetIgnored(PurpleConvChat chat, GList ignored)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_conv_chat_get_ignored(PurpleConvChat * chat)
+		 * 
+		 * Could not generate a wrapper for purple_conv_chat_get_ignored in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_conv_chat_get_ignored(PurpleConvChat * chat)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conv_chat_get_ignored(IntPtr chat);
 
-		public static GList ConvChatGetIgnored(PurpleConvChat chat)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char * purple_conv_chat_get_ignored_user(PurpleConvChat * chat, char * user)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_conv_chat_get_ignored_user(IntPtr chat, string user);
-
-		public static string ConvChatGetIgnoredUser(PurpleConvChat chat, string user)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_conv_chat_is_user_ignored(PurpleConvChat * chat, char * user)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_conv_chat_is_user_ignored(IntPtr chat, string user);
-
-		public static bool ConvChatIsUserIgnored(PurpleConvChat chat, string user)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conv_chat_set_topic(PurpleConvChat * chat, char * who, char * topic)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_set_topic(IntPtr chat, string who, string topic);
-
-		public static void ConvChatSetTopic(PurpleConvChat chat, string who, string topic)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_conv_chat_get_topic(PurpleConvChat * chat)
 		 */
 		[DllImport("libpurple.dll")]
@@ -816,7 +685,7 @@ namespace PurpleWrapper
 
 		public static string ConvChatGetTopic(PurpleConvChat chat)
 		{
-			throw new NotImplementedException();
+			return purple_conv_chat_get_topic(chat.Reference);
 		}
 
 		/*
@@ -827,7 +696,7 @@ namespace PurpleWrapper
 
 		public static void ConvChatSetId(PurpleConvChat chat, int id)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_set_id(chat.Reference, id);
 		}
 
 		/*
@@ -838,21 +707,10 @@ namespace PurpleWrapper
 
 		public static int ConvChatGetId(PurpleConvChat chat)
 		{
-			throw new NotImplementedException();
+			return purple_conv_chat_get_id(chat.Reference);
 		}
 
 		/*
-		 * void purple_conv_chat_write(PurpleConvChat * chat, char * who, char * message, PurpleMessageFlags flags, time_t mtime)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_write(IntPtr chat, string who, string message, UNKNOWN flags, UNKNOWN mtime);
-
-		public static void ConvChatWrite(PurpleConvChat chat, string who, string message, PurpleMessageFlags flags, time_t mtime)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_conv_chat_send(PurpleConvChat * chat, char * message)
 		 */
 		[DllImport("libpurple.dll")]
@@ -860,76 +718,22 @@ namespace PurpleWrapper
 
 		public static void ConvChatSend(PurpleConvChat chat, string message)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_send(chat.Reference, message);
 		}
 
 		/*
 		 * void purple_conv_chat_send_with_flags(PurpleConvChat * chat, char * message, PurpleMessageFlags flags)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_send_with_flags(IntPtr chat, string message, UNKNOWN flags);
+		private static extern void purple_conv_chat_send_with_flags(IntPtr chat, string message, Conversation.PurpleMessageFlags flags);
 
-		public static void ConvChatSendWithFlags(PurpleConvChat chat, string message, PurpleMessageFlags flags)
+		public static void ConvChatSendWithFlags(PurpleConvChat chat, string message, Conversation.PurpleMessageFlags flags)
 		{
+			/* Unable to process flags, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * void purple_conv_chat_add_user(PurpleConvChat * chat, char * user, char * extra_msg, PurpleConvChatBuddyFlags flags, gboolean new_arrival)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_add_user(IntPtr chat, string user, string extra_msg, UNKNOWN flags, bool new_arrival);
-
-		public static void ConvChatAddUser(PurpleConvChat chat, string user, string extra_msg, PurpleConvChatBuddyFlags flags, bool new_arrival)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conv_chat_add_users(PurpleConvChat * chat, GList * users, GList * extra_msgs, GList * flags, gboolean new_arrivals)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_add_users(IntPtr chat, IntPtr users, IntPtr extra_msgs, IntPtr flags, bool new_arrivals);
-
-		public static void ConvChatAddUsers(PurpleConvChat chat, GList users, GList extra_msgs, GList flags, bool new_arrivals)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conv_chat_rename_user(PurpleConvChat * chat, char * old_user, char * new_user)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_rename_user(IntPtr chat, string old_user, string new_user);
-
-		public static void ConvChatRenameUser(PurpleConvChat chat, string old_user, string new_user)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conv_chat_remove_user(PurpleConvChat * chat, char * user, char * reason)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_remove_user(IntPtr chat, string user, string reason);
-
-		public static void ConvChatRemoveUser(PurpleConvChat chat, string user, string reason)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_conv_chat_remove_users(PurpleConvChat * chat, GList * users, char * reason)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_remove_users(IntPtr chat, IntPtr users, string reason);
-
-		public static void ConvChatRemoveUsers(PurpleConvChat chat, GList users, string reason)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_conv_chat_find_user(PurpleConvChat * chat, char * user)
 		 */
 		[DllImport("libpurple.dll")]
@@ -937,32 +741,10 @@ namespace PurpleWrapper
 
 		public static bool ConvChatFindUser(PurpleConvChat chat, string user)
 		{
-			throw new NotImplementedException();
+			return purple_conv_chat_find_user(chat.Reference, user);
 		}
 
 		/*
-		 * void purple_conv_chat_user_set_flags(PurpleConvChat * chat, char * user, PurpleConvChatBuddyFlags flags)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_user_set_flags(IntPtr chat, string user, UNKNOWN flags);
-
-		public static void ConvChatUserSetFlags(PurpleConvChat chat, string user, PurpleConvChatBuddyFlags flags)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleConvChatBuddyFlags purple_conv_chat_user_get_flags(PurpleConvChat * chat, char * user)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_conv_chat_user_get_flags(IntPtr chat, string user);
-
-		public static PurpleConvChatBuddyFlags ConvChatUserGetFlags(PurpleConvChat chat, string user)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_conv_chat_clear_users(PurpleConvChat * chat)
 		 */
 		[DllImport("libpurple.dll")]
@@ -970,7 +752,7 @@ namespace PurpleWrapper
 
 		public static void ConvChatClearUsers(PurpleConvChat chat)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_clear_users(chat.Reference);
 		}
 
 		/*
@@ -981,7 +763,7 @@ namespace PurpleWrapper
 
 		public static void ConvChatSetNick(PurpleConvChat chat, string nick)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_set_nick(chat.Reference, nick);
 		}
 
 		/*
@@ -992,7 +774,7 @@ namespace PurpleWrapper
 
 		public static string ConvChatGetNick(PurpleConvChat chat)
 		{
-			throw new NotImplementedException();
+			return purple_conv_chat_get_nick(chat.Reference);
 		}
 
 		/*
@@ -1003,7 +785,7 @@ namespace PurpleWrapper
 
 		public static PurpleConversation FindChat(PurpleConnection gc, int id)
 		{
-			throw new NotImplementedException();
+			return new PurpleConversation(purple_find_chat(gc.Reference, id));
 		}
 
 		/*
@@ -1014,21 +796,10 @@ namespace PurpleWrapper
 
 		public static void ConvChatLeft(PurpleConvChat chat)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_left(chat.Reference);
 		}
 
 		/*
-		 * void purple_conv_chat_invite_user(PurpleConvChat * chat, char * user, char * message, gboolean confirm)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_conv_chat_invite_user(IntPtr chat, string user, string message, bool confirm);
-
-		public static void ConvChatInviteUser(PurpleConvChat chat, string user, string message, bool confirm)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_conv_chat_has_left(PurpleConvChat * chat)
 		 */
 		[DllImport("libpurple.dll")]
@@ -1036,21 +807,10 @@ namespace PurpleWrapper
 
 		public static bool ConvChatHasLeft(PurpleConvChat chat)
 		{
-			throw new NotImplementedException();
+			return purple_conv_chat_has_left(chat.Reference);
 		}
 
 		/*
-		 * PurpleConvChatBuddy * purple_conv_chat_cb_new(char * name, char * alias, PurpleConvChatBuddyFlags flags)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_conv_chat_cb_new(string name, string alias, UNKNOWN flags);
-
-		public static PurpleConvChatBuddy ConvChatCbNew(string name, string alias, PurpleConvChatBuddyFlags flags)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleConvChatBuddy * purple_conv_chat_cb_find(PurpleConvChat * chat, char * name)
 		 */
 		[DllImport("libpurple.dll")]
@@ -1058,7 +818,7 @@ namespace PurpleWrapper
 
 		public static PurpleConvChatBuddy ConvChatCbFind(PurpleConvChat chat, string name)
 		{
-			throw new NotImplementedException();
+			return new PurpleConvChatBuddy(purple_conv_chat_cb_find(chat.Reference, name));
 		}
 
 		/*
@@ -1069,7 +829,7 @@ namespace PurpleWrapper
 
 		public static string ConvChatCbGetName(PurpleConvChatBuddy cb)
 		{
-			throw new NotImplementedException();
+			return purple_conv_chat_cb_get_name(cb.Reference);
 		}
 
 		/*
@@ -1080,19 +840,22 @@ namespace PurpleWrapper
 
 		public static void ConvChatCbDestroy(PurpleConvChatBuddy cb)
 		{
-			throw new NotImplementedException();
+			purple_conv_chat_cb_destroy(cb.Reference);
 		}
 
 		/*
-		 * gboolean purple_conversation_do_command(PurpleConversation * conv, gchar * cmdline, gchar * markup, gchar ** error)
+		 * GList * purple_conversation_get_extended_menu(PurpleConversation * conv)
+		 * 
+		 * Could not generate a wrapper for purple_conversation_get_extended_menu in file "conversation.h".
+		 * Message: The type could not be resolved (GList * purple_conversation_get_extended_menu(PurpleConversation * conv)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_conversation_do_command(IntPtr conv, string cmdline, string markup, IntPtr error);
 
-		public static bool DoCommand(PurpleConversation conv, string cmdline, string markup, gchar error)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * gboolean purple_conversation_do_command(PurpleConversation * conv, gchar * cmdline, gchar * markup, gchar ** error)
+		 * 
+		 * Could not generate a wrapper for purple_conversation_do_command in file "conversation.h".
+		 * Message: The type could not be resolved (gchar ** error).
+		 */
 
 		/*
 		 * void * purple_conversations_get_handle()
@@ -1102,7 +865,7 @@ namespace PurpleWrapper
 
 		public static IntPtr ConversationsGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_conversations_get_handle();
 		}
 
 		/*
@@ -1113,7 +876,7 @@ namespace PurpleWrapper
 
 		public static void ConversationsInit()
 		{
-			throw new NotImplementedException();
+			purple_conversations_init();
 		}
 
 		/*
@@ -1124,7 +887,7 @@ namespace PurpleWrapper
 
 		public static void ConversationsUninit()
 		{
-			throw new NotImplementedException();
+			purple_conversations_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Core.cs	3a60cd1694524f875b46757389ffebe82089cb66
+++ libpurple/wrapper/Core.cs	f4e62e4c9a5dd05796b2d0cfaa9ef31194ed6c7f
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,7 +48,7 @@ namespace PurpleWrapper
 
 		public static bool Init(string ui)
 		{
-			throw new NotImplementedException();
+			return purple_core_init(ui);
 		}
 
 		/*
@@ -57,7 +59,7 @@ namespace PurpleWrapper
 
 		public static void Quit()
 		{
-			throw new NotImplementedException();
+			purple_core_quit();
 		}
 
 		/*
@@ -68,7 +70,7 @@ namespace PurpleWrapper
 
 		public static bool QuitCb(IntPtr unused)
 		{
-			throw new NotImplementedException();
+			return purple_core_quit_cb(unused);
 		}
 
 		/*
@@ -79,7 +81,7 @@ namespace PurpleWrapper
 
 		public static string GetVersion()
 		{
-			throw new NotImplementedException();
+			return purple_core_get_version();
 		}
 
 		/*
@@ -90,42 +92,30 @@ namespace PurpleWrapper
 
 		public static string GetUi()
 		{
-			throw new NotImplementedException();
+			return purple_core_get_ui();
 		}
 
 		/*
 		 * PurpleCore * purple_get_core()
+		 * 
+		 * Could not generate a wrapper for purple_get_core in file "core.h".
+		 * Message: The type could not be resolved (PurpleCore * purple_get_core()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_get_core();
 
-		public static PurpleCore GetCore()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_core_set_ui_ops(PurpleCoreUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_core_set_ui_ops in file "core.h".
+		 * Message: The type could not be resolved (PurpleCoreUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_core_set_ui_ops(IntPtr ops);
 
-		public static void SetUiOps(PurpleCoreUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleCoreUiOps * purple_core_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_core_get_ui_ops in file "core.h".
+		 * Message: The type could not be resolved (PurpleCoreUiOps * purple_core_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_core_get_ui_ops();
 
-		public static PurpleCoreUiOps GetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_core_migrate()
 		 */
@@ -134,7 +124,7 @@ namespace PurpleWrapper
 
 		public static bool Migrate()
 		{
-			throw new NotImplementedException();
+			return purple_core_migrate();
 		}
 
 		/*
@@ -145,9 +135,16 @@ namespace PurpleWrapper
 
 		public static bool EnsureSingleInstance()
 		{
-			throw new NotImplementedException();
+			return purple_core_ensure_single_instance();
 		}
 
+		/*
+		 * GHashTable* purple_core_get_ui_info()
+		 * 
+		 * Could not generate a wrapper for purple_core_get_ui_info in file "core.h".
+		 * Message: The type could not be resolved (GHashTable* purple_core_get_ui_info()).
+		 */
+
 	}
 }
 
============================================================
--- libpurple/wrapper/Debug.cs	cc587e78038680088455af17195310b70cc568e4
+++ libpurple/wrapper/Debug.cs	4cde7bf4fb6c1dba78b1d554aef51f148a727108
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,73 +40,17 @@ namespace PurpleWrapper
 {
 	public class Debug
 	{
-		/*
-		 * void purple_debug(PurpleDebugLevel level, char * category, char * format, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_debug(UNKNOWN level, string category, string format, ...);
-
-		public static void Debug(PurpleDebugLevel level, string category, string format, ...)
+		public enum PurpleDebugLevel
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_DEBUG_ALL = 0,
+			PURPLE_DEBUG_MISC,
+			PURPLE_DEBUG_INFO,
+			PURPLE_DEBUG_WARNING,
+			PURPLE_DEBUG_ERROR,
+			PURPLE_DEBUG_FATAL
+		};
 
 		/*
-		 * void purple_debug_misc(char * category, char * format, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_debug_misc(string category, string format, ...);
-
-		public static void Misc(string category, string format, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_debug_info(char * category, char * format, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_debug_info(string category, string format, ...);
-
-		public static void Info(string category, string format, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_debug_warning(char * category, char * format, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_debug_warning(string category, string format, ...);
-
-		public static void Warning(string category, string format, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_debug_error(char * category, char * format, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_debug_error(string category, string format, ...);
-
-		public static void Error(string category, string format, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_debug_fatal(char * category, char * format, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_debug_fatal(string category, string format, ...);
-
-		public static void Fatal(string category, string format, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_debug_set_enabled(gboolean enabled)
 		 */
 		[DllImport("libpurple.dll")]
@@ -112,7 +58,7 @@ namespace PurpleWrapper
 
 		public static void SetEnabled(bool enabled)
 		{
-			throw new NotImplementedException();
+			purple_debug_set_enabled(enabled);
 		}
 
 		/*
@@ -123,31 +69,23 @@ namespace PurpleWrapper
 
 		public static bool IsEnabled()
 		{
-			throw new NotImplementedException();
+			return purple_debug_is_enabled();
 		}
 
 		/*
 		 * void purple_debug_set_ui_ops(PurpleDebugUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_debug_set_ui_ops in file "debug.h".
+		 * Message: The type could not be resolved (PurpleDebugUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_debug_set_ui_ops(IntPtr ops);
 
-		public static void SetUiOps(PurpleDebugUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleDebugUiOps * purple_debug_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_debug_get_ui_ops in file "debug.h".
+		 * Message: The type could not be resolved (PurpleDebugUiOps * purple_debug_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_debug_get_ui_ops();
 
-		public static PurpleDebugUiOps GetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_debug_init()
 		 */
@@ -156,7 +94,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_debug_init();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Desktopitem.cs	89df04813015ea3ea4d0fdb85c40dc9c5ac219e2
+++ libpurple/wrapper/Desktopitem.cs	487522f0ae61ae31362f83117b2bc96e8fbba4df
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,72 +40,59 @@ namespace PurpleWrapper
 {
 	public class Desktopitem
 	{
+		public enum PurpleDesktopItemType
+		{
+			PURPLE_DESKTOP_ITEM_TYPE_NULL = 0,
+			PURPLE_DESKTOP_ITEM_TYPE_OTHER,
+			PURPLE_DESKTOP_ITEM_TYPE_APPLICATION,
+			PURPLE_DESKTOP_ITEM_TYPE_LINK,
+			PURPLE_DESKTOP_ITEM_TYPE_FSDEVICE,
+			PURPLE_DESKTOP_ITEM_TYPE_MIME_TYPE,
+			PURPLE_DESKTOP_ITEM_TYPE_DIRECTORY,
+			PURPLE_DESKTOP_ITEM_TYPE_SERVICE,
+			PURPLE_DESKTOP_ITEM_TYPE_SERVICE_TYPE
+		};
+
 		/*
 		 * GType purple_desktop_item_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_desktop_item_get_type();
+		private static extern IntPtr purple_desktop_item_get_type();
 
-		public static GType DesktopItemGetType()
+		public static /* libgobject */ IntPtr DesktopItemGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_desktop_item_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * PurpleDesktopItem * purple_desktop_item_new_from_file(char * filename)
+		 * 
+		 * Could not generate a wrapper for purple_desktop_item_new_from_file in file "desktopitem.h".
+		 * Message: The type could not be resolved (PurpleDesktopItem * purple_desktop_item_new_from_file(char * filename)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_desktop_item_new_from_file(string filename);
 
-		public static PurpleDesktopItem DesktopItemNewFromFile(string filename)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleDesktopItemType purple_desktop_item_get_entry_type(PurpleDesktopItem * item)
+		 * 
+		 * Could not generate a wrapper for purple_desktop_item_get_entry_type in file "desktopitem.h".
+		 * Message: The type could not be resolved (PurpleDesktopItem * item).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_desktop_item_get_entry_type(IntPtr item);
 
-		public static PurpleDesktopItemType DesktopItemGetEntryType(PurpleDesktopItem item)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char * purple_desktop_item_get_string(PurpleDesktopItem * item, char * attr)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_desktop_item_get_string(IntPtr item, string attr);
-
-		public static string DesktopItemGetString(PurpleDesktopItem item, string attr)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleDesktopItem * purple_desktop_item_copy(PurpleDesktopItem * item)
+		 * 
+		 * Could not generate a wrapper for purple_desktop_item_copy in file "desktopitem.h".
+		 * Message: The type could not be resolved (PurpleDesktopItem * purple_desktop_item_copy(PurpleDesktopItem * item)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_desktop_item_copy(IntPtr item);
 
-		public static PurpleDesktopItem DesktopItemCopy(PurpleDesktopItem item)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_desktop_item_unref(PurpleDesktopItem * item)
+		 * 
+		 * Could not generate a wrapper for purple_desktop_item_unref in file "desktopitem.h".
+		 * Message: The type could not be resolved (PurpleDesktopItem * item).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_desktop_item_unref(IntPtr item);
 
-		public static void DesktopItemUnref(PurpleDesktopItem item)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Dnsquery.cs	dbea6537cbef1fdc63b20299c18d165ec86985a9
+++ libpurple/wrapper/Dnsquery.cs	1c4c525d9db110a602fc437d49e80c0917286537
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -40,70 +42,46 @@ namespace PurpleWrapper
 	{
 		/*
 		 * PurpleDnsQueryData * purple_dnsquery_a(char * hostname, int port, PurpleDnsQueryConnectFunction callback, gpointer data)
+		 * 
+		 * Could not generate a wrapper for purple_dnsquery_a in file "dnsquery.h".
+		 * Message: The type could not be resolved (PurpleDnsQueryConnectFunction callback).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_dnsquery_a(string hostname, int port, UNKNOWN callback, IntPtr data);
 
-		public static PurpleDnsQueryData A(string hostname, int port, PurpleDnsQueryConnectFunction callback, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_dnsquery_destroy(PurpleDnsQueryData * query_data)
+		 * 
+		 * Could not generate a wrapper for purple_dnsquery_destroy in file "dnsquery.h".
+		 * Message: The type could not be resolved (PurpleDnsQueryData * query_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_dnsquery_destroy(IntPtr query_data);
 
-		public static void Destroy(PurpleDnsQueryData query_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_dnsquery_set_ui_ops(PurpleDnsQueryUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_dnsquery_set_ui_ops in file "dnsquery.h".
+		 * Message: The type could not be resolved (PurpleDnsQueryUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_dnsquery_set_ui_ops(IntPtr ops);
 
-		public static void SetUiOps(PurpleDnsQueryUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleDnsQueryUiOps * purple_dnsquery_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_dnsquery_get_ui_ops in file "dnsquery.h".
+		 * Message: The type could not be resolved (PurpleDnsQueryUiOps * purple_dnsquery_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_dnsquery_get_ui_ops();
 
-		public static PurpleDnsQueryUiOps GetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_dnsquery_get_host(PurpleDnsQueryData * query_data)
+		 * 
+		 * Could not generate a wrapper for purple_dnsquery_get_host in file "dnsquery.h".
+		 * Message: The type could not be resolved (PurpleDnsQueryData * query_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_dnsquery_get_host(IntPtr query_data);
 
-		public static string GetHost(PurpleDnsQueryData query_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * short purple_dnsquery_get_port(PurpleDnsQueryData * query_data)
+		 * unsigned short purple_dnsquery_get_port(PurpleDnsQueryData * query_data)
+		 * 
+		 * Could not generate a wrapper for purple_dnsquery_get_port in file "dnsquery.h".
+		 * Message: The type could not be resolved (PurpleDnsQueryData * query_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern short purple_dnsquery_get_port(IntPtr query_data);
 
-		public static short GetPort(PurpleDnsQueryData query_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_dnsquery_init()
 		 */
@@ -112,7 +90,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_dnsquery_init();
 		}
 
 		/*
@@ -123,7 +101,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_dnsquery_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Dnssrv.cs	bcfa494b2a88ae8e1b4d62fa093cf19d9b8f9498
+++ libpurple/wrapper/Dnssrv.cs	ce96ae0c6f2de69c4b574ecdf4d007b5d67c0a11
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -40,70 +42,46 @@ namespace PurpleWrapper
 	{
 		/*
 		 * PurpleSrvQueryData * purple_srv_resolve(char * protocol, char * transport, char * domain, PurpleSrvCallback cb, gpointer extradata)
+		 * 
+		 * Could not generate a wrapper for purple_srv_resolve in file "dnssrv.h".
+		 * Message: The type could not be resolved (PurpleSrvCallback cb).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_srv_resolve(string protocol, string transport, string domain, UNKNOWN cb, IntPtr extradata);
 
-		public static PurpleSrvQueryData SrvResolve(string protocol, string transport, string domain, PurpleSrvCallback cb, IntPtr extradata)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_srv_cancel(PurpleSrvQueryData * query_data)
+		 * 
+		 * Could not generate a wrapper for purple_srv_cancel in file "dnssrv.h".
+		 * Message: The type could not be resolved (PurpleSrvQueryData * query_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_srv_cancel(IntPtr query_data);
 
-		public static void SrvCancel(PurpleSrvQueryData query_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSrvQueryData * purple_txt_resolve(char * owner, char * domain, PurpleTxtCallback cb, gpointer extradata)
+		 * 
+		 * Could not generate a wrapper for purple_txt_resolve in file "dnssrv.h".
+		 * Message: The type could not be resolved (PurpleTxtCallback cb).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_txt_resolve(string owner, string domain, UNKNOWN cb, IntPtr extradata);
 
-		public static PurpleSrvQueryData TxtResolve(string owner, string domain, PurpleTxtCallback cb, IntPtr extradata)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_txt_cancel(PurpleSrvQueryData * query_data)
+		 * 
+		 * Could not generate a wrapper for purple_txt_cancel in file "dnssrv.h".
+		 * Message: The type could not be resolved (PurpleSrvQueryData * query_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_txt_cancel(IntPtr query_data);
 
-		public static void TxtCancel(PurpleSrvQueryData query_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_txt_response_get_content(PurpleTxtResponse * resp)
+		 * 
+		 * Could not generate a wrapper for purple_txt_response_get_content in file "dnssrv.h".
+		 * Message: The type could not be resolved (PurpleTxtResponse * resp).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_txt_response_get_content(IntPtr resp);
 
-		public static string TxtResponseGetContent(PurpleTxtResponse resp)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_txt_response_destroy(PurpleTxtResponse * resp)
+		 * 
+		 * Could not generate a wrapper for purple_txt_response_destroy in file "dnssrv.h".
+		 * Message: The type could not be resolved (PurpleTxtResponse * resp).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_txt_response_destroy(IntPtr resp);
 
-		public static void TxtResponseDestroy(PurpleTxtResponse resp)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Eventloop.cs	58d05562d886b39513e58cb904fc1ebf9b5324ca
+++ libpurple/wrapper/Eventloop.cs	dde9b3a062e0eebdb9cf78eaf78b81cce19ebe95
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,14 +40,21 @@ namespace PurpleWrapper
 {
 	public class Eventloop
 	{
+		public enum PurpleInputCondition
+		{
+			PURPLE_INPUT_READ = 1 << 0,
+			PURPLE_INPUT_WRITE = 1 << 1
+		};
+
 		/*
 		 * guint purple_timeout_add(guint interval, GSourceFunc function, gpointer data)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern uint purple_timeout_add(uint interval, UNKNOWN function, IntPtr data);
+		private static extern uint purple_timeout_add(uint interval, IntPtr function, IntPtr data);
 
-		public static uint TimeoutAdd(uint interval, GSourceFunc function, IntPtr data)
+		public static uint TimeoutAdd(uint interval, /* libgobject */ IntPtr function, IntPtr data)
 		{
+			/* Unable to process function, a GObjectObject. */
 			throw new NotImplementedException();
 		}
 
@@ -53,10 +62,11 @@ namespace PurpleWrapper
 		 * guint purple_timeout_add_seconds(guint interval, GSourceFunc function, gpointer data)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern uint purple_timeout_add_seconds(uint interval, UNKNOWN function, IntPtr data);
+		private static extern uint purple_timeout_add_seconds(uint interval, IntPtr function, IntPtr data);
 
-		public static uint TimeoutAddSeconds(uint interval, GSourceFunc function, IntPtr data)
+		public static uint TimeoutAddSeconds(uint interval, /* libgobject */ IntPtr function, IntPtr data)
 		{
+			/* Unable to process function, a GObjectObject. */
 			throw new NotImplementedException();
 		}
 
@@ -68,21 +78,10 @@ namespace PurpleWrapper
 
 		public static bool TimeoutRemove(uint handle)
 		{
-			throw new NotImplementedException();
+			return purple_timeout_remove(handle);
 		}
 
 		/*
-		 * guint purple_input_add(int fd, PurpleInputCondition cond, PurpleInputFunction func, gpointer user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_input_add(int fd, UNKNOWN cond, UNKNOWN func, IntPtr user_data);
-
-		public static uint InputAdd(int fd, PurpleInputCondition cond, PurpleInputFunction func, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_input_remove(guint handle)
 		 */
 		[DllImport("libpurple.dll")]
@@ -90,20 +89,16 @@ namespace PurpleWrapper
 
 		public static bool InputRemove(uint handle)
 		{
-			throw new NotImplementedException();
+			return purple_input_remove(handle);
 		}
 
 		/*
 		 * int purple_input_get_error(int fd, int * error)
+		 * 
+		 * Could not generate a wrapper for purple_input_get_error in file "eventloop.h".
+		 * Message: The type could not be resolved (int * error).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_input_get_error(int fd, IntPtr error);
 
-		public static int InputGetError(int fd, int error)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_eventloop_set_ui_ops(PurpleEventLoopUiOps * ops)
 		 */
@@ -112,7 +107,7 @@ namespace PurpleWrapper
 
 		public static void SetUiOps(PurpleEventLoopUiOps ops)
 		{
-			throw new NotImplementedException();
+			purple_eventloop_set_ui_ops(ops.Reference);
 		}
 
 		/*
@@ -123,7 +118,7 @@ namespace PurpleWrapper
 
 		public static PurpleEventLoopUiOps GetUiOps()
 		{
-			throw new NotImplementedException();
+			return new PurpleEventLoopUiOps(purple_eventloop_get_ui_ops());
 		}
 
 	}
============================================================
--- libpurple/wrapper/Ft.cs	65769ab4f81adf72fa51dd74311010fdcf0c6ec1
+++ libpurple/wrapper/Ft.cs	4650ae4af8fe1fd9ed3267ffd62d9d8e73babfc4
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,28 +40,31 @@ namespace PurpleWrapper
 {
 	public class Ft
 	{
-		/*
-		 * PurpleXfer * purple_xfer_new(PurpleAccount * account, PurpleXferType type, char * who)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_xfer_new(IntPtr account, UNKNOWN type, string who);
+		public enum PurpleXferType
+		{
+			PURPLE_XFER_UNKNOWN = 0,
+			PURPLE_XFER_SEND,
+			PURPLE_XFER_RECEIVE
+		};
 
-		public static PurpleXfer XferNew(PurpleAccount account, PurpleXferType type, string who)
+		public enum PurpleXferStatusType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_XFER_STATUS_UNKNOWN = 0,
+			PURPLE_XFER_STATUS_NOT_STARTED,
+			PURPLE_XFER_STATUS_ACCEPTED,
+			PURPLE_XFER_STATUS_STARTED,
+			PURPLE_XFER_STATUS_DONE,
+			PURPLE_XFER_STATUS_CANCEL_LOCAL,
+			PURPLE_XFER_STATUS_CANCEL_REMOTE
+		};
 
 		/*
 		 * GList * purple_xfers_get_all()
+		 * 
+		 * Could not generate a wrapper for purple_xfers_get_all in file "ft.h".
+		 * Message: The type could not be resolved (GList * purple_xfers_get_all()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_xfers_get_all();
 
-		public static GList XfersGetAll()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_xfer_ref(PurpleXfer * xfer)
 		 */
@@ -68,7 +73,7 @@ namespace PurpleWrapper
 
 		public static void XferRef(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_ref(xfer.Reference);
 		}
 
 		/*
@@ -79,7 +84,7 @@ namespace PurpleWrapper
 
 		public static void XferUnref(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_unref(xfer.Reference);
 		}
 
 		/*
@@ -90,7 +95,7 @@ namespace PurpleWrapper
 
 		public static void XferRequest(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_request(xfer.Reference);
 		}
 
 		/*
@@ -101,7 +106,7 @@ namespace PurpleWrapper
 
 		public static void XferRequestAccepted(PurpleXfer xfer, string filename)
 		{
-			throw new NotImplementedException();
+			purple_xfer_request_accepted(xfer.Reference, filename);
 		}
 
 		/*
@@ -112,18 +117,19 @@ namespace PurpleWrapper
 
 		public static void XferRequestDenied(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_request_denied(xfer.Reference);
 		}
 
 		/*
 		 * PurpleXferType purple_xfer_get_type(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_get_type(IntPtr xfer);
+		private static extern Ft.PurpleXferType purple_xfer_get_type(IntPtr xfer);
 
-		public static PurpleXferType XferGetType(PurpleXfer xfer)
+		public static Ft.PurpleXferType XferGetType(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_xfer_get_type, a KnownEnum. */
+			
 		}
 
 		/*
@@ -134,7 +140,7 @@ namespace PurpleWrapper
 
 		public static PurpleAccount XferGetAccount(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_xfer_get_account(xfer.Reference));
 		}
 
 		/*
@@ -145,18 +151,19 @@ namespace PurpleWrapper
 
 		public static string XferGetRemoteUser(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_remote_user(xfer.Reference);
 		}
 
 		/*
 		 * PurpleXferStatusType purple_xfer_get_status(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_get_status(IntPtr xfer);
+		private static extern Ft.PurpleXferStatusType purple_xfer_get_status(IntPtr xfer);
 
-		public static PurpleXferStatusType XferGetStatus(PurpleXfer xfer)
+		public static Ft.PurpleXferStatusType XferGetStatus(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_xfer_get_status, a KnownEnum. */
+			
 		}
 
 		/*
@@ -167,7 +174,7 @@ namespace PurpleWrapper
 
 		public static bool XferIsCanceled(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_is_canceled(xfer.Reference);
 		}
 
 		/*
@@ -178,7 +185,7 @@ namespace PurpleWrapper
 
 		public static bool XferIsCompleted(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_is_completed(xfer.Reference);
 		}
 
 		/*
@@ -189,7 +196,7 @@ namespace PurpleWrapper
 
 		public static string XferGetFilename(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_filename(xfer.Reference);
 		}
 
 		/*
@@ -200,40 +207,40 @@ namespace PurpleWrapper
 
 		public static string XferGetLocalFilename(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_local_filename(xfer.Reference);
 		}
 
 		/*
 		 * size_t purple_xfer_get_bytes_sent(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_get_bytes_sent(IntPtr xfer);
+		private static extern ulong purple_xfer_get_bytes_sent(IntPtr xfer);
 
-		public static size_t XferGetBytesSent(PurpleXfer xfer)
+		public static ulong XferGetBytesSent(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_bytes_sent(xfer.Reference);
 		}
 
 		/*
 		 * size_t purple_xfer_get_bytes_remaining(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_get_bytes_remaining(IntPtr xfer);
+		private static extern ulong purple_xfer_get_bytes_remaining(IntPtr xfer);
 
-		public static size_t XferGetBytesRemaining(PurpleXfer xfer)
+		public static ulong XferGetBytesRemaining(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_bytes_remaining(xfer.Reference);
 		}
 
 		/*
 		 * size_t purple_xfer_get_size(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_get_size(IntPtr xfer);
+		private static extern ulong purple_xfer_get_size(IntPtr xfer);
 
-		public static size_t XferGetSize(PurpleXfer xfer)
+		public static ulong XferGetSize(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_size(xfer.Reference);
 		}
 
 		/*
@@ -244,18 +251,18 @@ namespace PurpleWrapper
 
 		public static double XferGetProgress(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_progress(xfer.Reference);
 		}
 
 		/*
-		 * int purple_xfer_get_local_port(PurpleXfer * xfer)
+		 * unsigned int purple_xfer_get_local_port(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_xfer_get_local_port(IntPtr xfer);
+		private static extern uint purple_xfer_get_local_port(IntPtr xfer);
 
-		public static int XferGetLocalPort(PurpleXfer xfer)
+		public static uint XferGetLocalPort(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_local_port(xfer.Reference);
 		}
 
 		/*
@@ -266,40 +273,42 @@ namespace PurpleWrapper
 
 		public static string XferGetRemoteIp(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_remote_ip(xfer.Reference);
 		}
 
 		/*
-		 * int purple_xfer_get_remote_port(PurpleXfer * xfer)
+		 * unsigned int purple_xfer_get_remote_port(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_xfer_get_remote_port(IntPtr xfer);
+		private static extern uint purple_xfer_get_remote_port(IntPtr xfer);
 
-		public static int XferGetRemotePort(PurpleXfer xfer)
+		public static uint XferGetRemotePort(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			return purple_xfer_get_remote_port(xfer.Reference);
 		}
 
 		/*
 		 * time_t purple_xfer_get_start_time(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_get_start_time(IntPtr xfer);
+		private static extern ulong purple_xfer_get_start_time(IntPtr xfer);
 
-		public static time_t XferGetStartTime(PurpleXfer xfer)
+		public static DateTime XferGetStartTime(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_xfer_get_start_time, a DateTime. */
+			
 		}
 
 		/*
 		 * time_t purple_xfer_get_end_time(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_get_end_time(IntPtr xfer);
+		private static extern ulong purple_xfer_get_end_time(IntPtr xfer);
 
-		public static time_t XferGetEndTime(PurpleXfer xfer)
+		public static DateTime XferGetEndTime(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_xfer_get_end_time, a DateTime. */
+			
 		}
 
 		/*
@@ -310,7 +319,7 @@ namespace PurpleWrapper
 
 		public static void XferSetCompleted(PurpleXfer xfer, bool completed)
 		{
-			throw new NotImplementedException();
+			purple_xfer_set_completed(xfer.Reference, completed);
 		}
 
 		/*
@@ -321,7 +330,7 @@ namespace PurpleWrapper
 
 		public static void XferSetMessage(PurpleXfer xfer, string message)
 		{
-			throw new NotImplementedException();
+			purple_xfer_set_message(xfer.Reference, message);
 		}
 
 		/*
@@ -332,7 +341,7 @@ namespace PurpleWrapper
 
 		public static void XferSetFilename(PurpleXfer xfer, string filename)
 		{
-			throw new NotImplementedException();
+			purple_xfer_set_filename(xfer.Reference, filename);
 		}
 
 		/*
@@ -343,175 +352,53 @@ namespace PurpleWrapper
 
 		public static void XferSetLocalFilename(PurpleXfer xfer, string filename)
 		{
-			throw new NotImplementedException();
+			purple_xfer_set_local_filename(xfer.Reference, filename);
 		}
 
 		/*
 		 * void purple_xfer_set_size(PurpleXfer * xfer, size_t size)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_size(IntPtr xfer, UNKNOWN size);
+		private static extern void purple_xfer_set_size(IntPtr xfer, ulong size);
 
-		public static void XferSetSize(PurpleXfer xfer, size_t size)
+		public static void XferSetSize(PurpleXfer xfer, ulong size)
 		{
-			throw new NotImplementedException();
+			purple_xfer_set_size(xfer.Reference, size);
 		}
 
 		/*
 		 * void purple_xfer_set_bytes_sent(PurpleXfer * xfer, size_t bytes_sent)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_bytes_sent(IntPtr xfer, UNKNOWN bytes_sent);
+		private static extern void purple_xfer_set_bytes_sent(IntPtr xfer, ulong bytes_sent);
 
-		public static void XferSetBytesSent(PurpleXfer xfer, size_t bytes_sent)
+		public static void XferSetBytesSent(PurpleXfer xfer, ulong bytes_sent)
 		{
-			throw new NotImplementedException();
+			purple_xfer_set_bytes_sent(xfer.Reference, bytes_sent);
 		}
 
 		/*
 		 * PurpleXferUiOps * purple_xfer_get_ui_ops(PurpleXfer * xfer)
+		 * 
+		 * Could not generate a wrapper for purple_xfer_get_ui_ops in file "ft.h".
+		 * Message: The type could not be resolved (PurpleXferUiOps * purple_xfer_get_ui_ops(PurpleXfer * xfer)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_xfer_get_ui_ops(IntPtr xfer);
 
-		public static PurpleXferUiOps XferGetUiOps(PurpleXfer xfer)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_xfer_set_read_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_read_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetReadFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_write_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_write_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetWriteFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_ack_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_ack_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetAckFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_request_denied_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_request_denied_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetRequestDeniedFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_init_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_init_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetInitFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_start_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_start_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetStartFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_end_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_end_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetEndFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_cancel_send_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_cancel_send_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetCancelSendFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_xfer_set_cancel_recv_fnc(PurpleXfer * xfer,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_set_cancel_recv_fnc(IntPtr xfer, UNKNOWN );
-
-		public static void XferSetCancelRecvFnc(PurpleXfer xfer,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gssize purple_xfer_read(PurpleXfer * xfer, guchar ** buffer)
+		 * 
+		 * Could not generate a wrapper for purple_xfer_read in file "ft.h".
+		 * Message: The type could not be resolved (guchar ** buffer).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_read(IntPtr xfer, IntPtr buffer);
 
-		public static gssize XferRead(PurpleXfer xfer, guchar buffer)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gssize purple_xfer_write(PurpleXfer * xfer, guchar * buffer, gsize size)
+		 * 
+		 * Could not generate a wrapper for purple_xfer_write in file "ft.h".
+		 * Message: The type could not be resolved (guchar * buffer).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_xfer_write(IntPtr xfer, IntPtr buffer, UNKNOWN size);
 
-		public static gssize XferWrite(PurpleXfer xfer, guchar buffer, gsize size)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_xfer_start(PurpleXfer * xfer, int fd, char * ip, unsigned int)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_start(IntPtr xfer, int fd, string ip, UNKNOWN int);
-
-		public static void XferStart(PurpleXfer xfer, int fd, string ip, unsigned int)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_xfer_end(PurpleXfer * xfer)
 		 */
 		[DllImport("libpurple.dll")]
@@ -519,7 +406,7 @@ namespace PurpleWrapper
 
 		public static void XferEnd(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_end(xfer.Reference);
 		}
 
 		/*
@@ -530,7 +417,7 @@ namespace PurpleWrapper
 
 		public static void XferAdd(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_add(xfer.Reference);
 		}
 
 		/*
@@ -541,7 +428,7 @@ namespace PurpleWrapper
 
 		public static void XferCancelLocal(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_cancel_local(xfer.Reference);
 		}
 
 		/*
@@ -552,17 +439,18 @@ namespace PurpleWrapper
 
 		public static void XferCancelRemote(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_cancel_remote(xfer.Reference);
 		}
 
 		/*
 		 * void purple_xfer_error(PurpleXferType type, PurpleAccount * account, char * who, char * msg)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_xfer_error(UNKNOWN type, IntPtr account, string who, string msg);
+		private static extern void purple_xfer_error(Ft.PurpleXferType type, IntPtr account, string who, string msg);
 
-		public static void XferError(PurpleXferType type, PurpleAccount account, string who, string msg)
+		public static void XferError(Ft.PurpleXferType type, PurpleAccount account, string who, string msg)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -574,7 +462,7 @@ namespace PurpleWrapper
 
 		public static void XferUpdateProgress(PurpleXfer xfer)
 		{
-			throw new NotImplementedException();
+			purple_xfer_update_progress(xfer.Reference);
 		}
 
 		/*
@@ -585,7 +473,7 @@ namespace PurpleWrapper
 
 		public static void XferConversationWrite(PurpleXfer xfer, string message, bool is_error)
 		{
-			throw new NotImplementedException();
+			purple_xfer_conversation_write(xfer.Reference, message, is_error);
 		}
 
 		/*
@@ -596,7 +484,7 @@ namespace PurpleWrapper
 
 		public static IntPtr XfersGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_xfers_get_handle();
 		}
 
 		/*
@@ -607,7 +495,7 @@ namespace PurpleWrapper
 
 		public static void XfersInit()
 		{
-			throw new NotImplementedException();
+			purple_xfers_init();
 		}
 
 		/*
@@ -618,31 +506,23 @@ namespace PurpleWrapper
 
 		public static void XfersUninit()
 		{
-			throw new NotImplementedException();
+			purple_xfers_uninit();
 		}
 
 		/*
 		 * void purple_xfers_set_ui_ops(PurpleXferUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_xfers_set_ui_ops in file "ft.h".
+		 * Message: The type could not be resolved (PurpleXferUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_xfers_set_ui_ops(IntPtr ops);
 
-		public static void XfersSetUiOps(PurpleXferUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleXferUiOps * purple_xfers_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_xfers_get_ui_ops in file "ft.h".
+		 * Message: The type could not be resolved (PurpleXferUiOps * purple_xfers_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_xfers_get_ui_ops();
 
-		public static PurpleXferUiOps XfersGetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Idle.cs	db72710e10f3af61497e269b6628131f669a7129
+++ libpurple/wrapper/Idle.cs	542b1820ca77abe61e391568b34e40cb61227da3
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,42 +48,35 @@ namespace PurpleWrapper
 
 		public static void Touch()
 		{
-			throw new NotImplementedException();
+			purple_idle_touch();
 		}
 
 		/*
 		 * void purple_idle_set(time_t time)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_idle_set(UNKNOWN time);
+		private static extern void purple_idle_set(ulong time);
 
-		public static void Set(time_t time)
+		public static void Set(DateTime time)
 		{
-			throw new NotImplementedException();
+			ulong _PurpleWrapper_arg0 = (ulong)(time - new DateTime(1970, 1, 1)).TotalSeconds;
+			purple_idle_set(_PurpleWrapper_arg0);
 		}
 
 		/*
 		 * void purple_idle_set_ui_ops(PurpleIdleUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_idle_set_ui_ops in file "idle.h".
+		 * Message: The type could not be resolved (PurpleIdleUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_idle_set_ui_ops(IntPtr ops);
 
-		public static void SetUiOps(PurpleIdleUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleIdleUiOps * purple_idle_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_idle_get_ui_ops in file "idle.h".
+		 * Message: The type could not be resolved (PurpleIdleUiOps * purple_idle_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_idle_get_ui_ops();
 
-		public static PurpleIdleUiOps GetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_idle_init()
 		 */
@@ -90,7 +85,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_idle_init();
 		}
 
 		/*
@@ -101,7 +96,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_idle_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Imgstore.cs	d95f6da0cba34a57ab0133016aeb4dc97e5c01f9
+++ libpurple/wrapper/Imgstore.cs	70368d2bf81e528c02a79b321be31bc232e5aeee
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,70 +41,78 @@ namespace PurpleWrapper
 	public class Imgstore
 	{
 		/*
+		 * PurpleStoredImage * purple_imgstore_add(gpointer data, size_t size, char * filename)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_add in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_imgstore_add(gpointer data, size_t size, char * filename)).
+		 */
+
+		/*
+		 * PurpleStoredImage * purple_imgstore_new_from_file(char * path)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_new_from_file in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_imgstore_new_from_file(char * path)).
+		 */
+
+		/*
 		 * int purple_imgstore_add_with_id(gpointer data, size_t size, char * filename)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_imgstore_add_with_id(IntPtr data, UNKNOWN size, string filename);
+		private static extern int purple_imgstore_add_with_id(IntPtr data, ulong size, string filename);
 
-		public static int AddWithId(IntPtr data, size_t size, string filename)
+		public static int AddWithId(IntPtr data, ulong size, string filename)
 		{
-			throw new NotImplementedException();
+			return purple_imgstore_add_with_id(data, size, filename);
 		}
 
 		/*
 		 * PurpleStoredImage * purple_imgstore_find_by_id(int id)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_find_by_id in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_imgstore_find_by_id(int id)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_imgstore_find_by_id(int id);
 
-		public static PurpleStoredImage FindById(int id)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gconstpointer purple_imgstore_get_data(PurpleStoredImage * img)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_get_data in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * img).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_imgstore_get_data(IntPtr img);
 
-		public static gconstpointer GetData(PurpleStoredImage img)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * size_t purple_imgstore_get_size(PurpleStoredImage * img)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_get_size in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * img).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_imgstore_get_size(IntPtr img);
 
-		public static size_t GetSize(PurpleStoredImage img)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_imgstore_get_filename(PurpleStoredImage * img)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_get_filename in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * img).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_imgstore_get_filename(IntPtr img);
 
-		public static string GetFilename(PurpleStoredImage img)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * char * purple_imgstore_get_extension(PurpleStoredImage * img)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_get_extension in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * img).
+		 */
 
 		/*
-		 * char * purple_imgstore_get_extension(PurpleStoredImage * img)
+		 * PurpleStoredImage * purple_imgstore_ref(PurpleStoredImage * img)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_ref in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_imgstore_ref(PurpleStoredImage * img)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_imgstore_get_extension(IntPtr img);
 
-		public static string GetExtension(PurpleStoredImage img)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * PurpleStoredImage * purple_imgstore_unref(PurpleStoredImage * img)
+		 * 
+		 * Could not generate a wrapper for purple_imgstore_unref in file "imgstore.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_imgstore_unref(PurpleStoredImage * img)).
+		 */
 
 		/*
 		 * void purple_imgstore_ref_by_id(int id)
@@ -112,7 +122,7 @@ namespace PurpleWrapper
 
 		public static void RefById(int id)
 		{
-			throw new NotImplementedException();
+			purple_imgstore_ref_by_id(id);
 		}
 
 		/*
@@ -123,7 +133,7 @@ namespace PurpleWrapper
 
 		public static void UnrefById(int id)
 		{
-			throw new NotImplementedException();
+			purple_imgstore_unref_by_id(id);
 		}
 
 		/*
@@ -134,7 +144,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_imgstore_get_handle();
 		}
 
 		/*
@@ -145,7 +155,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_imgstore_init();
 		}
 
 		/*
@@ -156,7 +166,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_imgstore_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Log.cs	590ff3a5d74bb783d6af29df2d07758b8d44aec5
+++ libpurple/wrapper/Log.cs	ed257feea610f439619e9d018b4550fb6ed37bcf
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,16 +40,17 @@ namespace PurpleWrapper
 {
 	public class Log
 	{
-		/*
-		 * PurpleLog * purple_log_new(PurpleLogType type, char * name, PurpleAccount * account, PurpleConversation * conv, time_t time, struct tm)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_log_new(UNKNOWN type, string name, IntPtr account, IntPtr conv, UNKNOWN time, UNKNOWN tm);
+		public enum PurpleLogType
+		{
+			PURPLE_LOG_IM,
+			PURPLE_LOG_CHAT,
+			PURPLE_LOG_SYSTEM
+		};
 
-		public static PurpleLog New(PurpleLogType type, string name, PurpleAccount account, PurpleConversation conv, time_t time, struct tm)
+		public enum PurpleLogReadFlags
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_LOG_READ_NO_NEWLINE = 1
+		};
 
 		/*
 		 * void purple_log_free(PurpleLog * log)
@@ -57,64 +60,42 @@ namespace PurpleWrapper
 
 		public static void Free(PurpleLog log)
 		{
-			throw new NotImplementedException();
+			purple_log_free(log.Reference);
 		}
 
 		/*
-		 * void purple_log_write(PurpleLog * log, PurpleMessageFlags type, char * from, time_t time, char * message)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_log_write(IntPtr log, UNKNOWN type, string from, UNKNOWN time, string message);
-
-		public static void Write(PurpleLog log, PurpleMessageFlags type, string from, time_t time, string message)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_log_read(PurpleLog * log, PurpleLogReadFlags * flags)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_log_read(IntPtr log, IntPtr flags);
+		private static extern string purple_log_read(IntPtr log, Log.PurpleLogReadFlags flags);
 
-		public static string Read(PurpleLog log, PurpleLogReadFlags flags)
+		public static string Read(PurpleLog log, Log.PurpleLogReadFlags flags)
 		{
+			/* Unable to process flags, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
 		 * GList * purple_log_get_logs(PurpleLogType type, char * name, PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_log_get_logs in file "log.h".
+		 * Message: The type could not be resolved (GList * purple_log_get_logs(PurpleLogType type, char * name, PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_log_get_logs(UNKNOWN type, string name, IntPtr account);
 
-		public static GList GetLogs(PurpleLogType type, string name, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GHashTable * purple_log_get_log_sets()
+		 * 
+		 * Could not generate a wrapper for purple_log_get_log_sets in file "log.h".
+		 * Message: The type could not be resolved (GHashTable * purple_log_get_log_sets()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_log_get_log_sets();
 
-		public static GHashTable GetLogSets()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_log_get_system_logs(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_log_get_system_logs in file "log.h".
+		 * Message: The type could not be resolved (GList * purple_log_get_system_logs(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_log_get_system_logs(IntPtr account);
 
-		public static GList GetSystemLogs(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * int purple_log_get_size(PurpleLog * log)
 		 */
@@ -123,17 +104,18 @@ namespace PurpleWrapper
 
 		public static int GetSize(PurpleLog log)
 		{
-			throw new NotImplementedException();
+			return purple_log_get_size(log.Reference);
 		}
 
 		/*
 		 * int purple_log_get_total_size(PurpleLogType type, char * name, PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_log_get_total_size(UNKNOWN type, string name, IntPtr account);
+		private static extern int purple_log_get_total_size(Log.PurpleLogType type, string name, IntPtr account);
 
-		public static int GetTotalSize(PurpleLogType type, string name, PurpleAccount account)
+		public static int GetTotalSize(Log.PurpleLogType type, string name, PurpleAccount account)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -141,10 +123,11 @@ namespace PurpleWrapper
 		 * int purple_log_get_activity_score(PurpleLogType type, char * name, PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_log_get_activity_score(UNKNOWN type, string name, IntPtr account);
+		private static extern int purple_log_get_activity_score(Log.PurpleLogType type, string name, IntPtr account);
 
-		public static int GetActivityScore(PurpleLogType type, string name, PurpleAccount account)
+		public static int GetActivityScore(Log.PurpleLogType type, string name, PurpleAccount account)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -156,7 +139,7 @@ namespace PurpleWrapper
 
 		public static bool IsDeletable(PurpleLog log)
 		{
-			throw new NotImplementedException();
+			return purple_log_is_deletable(log.Reference);
 		}
 
 		/*
@@ -167,17 +150,18 @@ namespace PurpleWrapper
 
 		public static bool Delete(PurpleLog log)
 		{
-			throw new NotImplementedException();
+			return purple_log_delete(log.Reference);
 		}
 
 		/*
 		 * char * purple_log_get_log_dir(PurpleLogType type, char * name, PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_log_get_log_dir(UNKNOWN type, string name, IntPtr account);
+		private static extern string purple_log_get_log_dir(Log.PurpleLogType type, string name, IntPtr account);
 
-		public static string GetLogDir(PurpleLogType type, string name, PurpleAccount account)
+		public static string GetLogDir(Log.PurpleLogType type, string name, PurpleAccount account)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -185,22 +169,22 @@ namespace PurpleWrapper
 		 * gint purple_log_compare(gconstpointer y, gconstpointer z)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_log_compare(UNKNOWN y, UNKNOWN z);
+		private static extern int purple_log_compare(IntPtr y, IntPtr z);
 
-		public static int Compare(gconstpointer y, gconstpointer z)
+		public static int Compare(IntPtr y, IntPtr z)
 		{
-			throw new NotImplementedException();
+			return purple_log_compare(y, z);
 		}
 
 		/*
 		 * gint purple_log_set_compare(gconstpointer y, gconstpointer z)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_log_set_compare(UNKNOWN y, UNKNOWN z);
+		private static extern int purple_log_set_compare(IntPtr y, IntPtr z);
 
-		public static int SetCompare(gconstpointer y, gconstpointer z)
+		public static int SetCompare(IntPtr y, IntPtr z)
 		{
-			throw new NotImplementedException();
+			return purple_log_set_compare(y, z);
 		}
 
 		/*
@@ -211,7 +195,7 @@ namespace PurpleWrapper
 
 		public static void SetFree(PurpleLogSet set)
 		{
-			throw new NotImplementedException();
+			purple_log_set_free(set.Reference);
 		}
 
 		/*
@@ -222,32 +206,10 @@ namespace PurpleWrapper
 
 		public static void CommonWriter(PurpleLog log, string ext)
 		{
-			throw new NotImplementedException();
+			purple_log_common_writer(log.Reference, ext);
 		}
 
 		/*
-		 * GList * purple_log_common_lister(PurpleLogType type, char * name, PurpleAccount * account, char * ext, PurpleLogLogger * logger)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_log_common_lister(UNKNOWN type, string name, IntPtr account, string ext, IntPtr logger);
-
-		public static GList CommonLister(PurpleLogType type, string name, PurpleAccount account, string ext, PurpleLogLogger logger)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * int purple_log_common_total_sizer(PurpleLogType type, char * name, PurpleAccount * account, char * ext)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_log_common_total_sizer(UNKNOWN type, string name, IntPtr account, string ext);
-
-		public static int CommonTotalSizer(PurpleLogType type, string name, PurpleAccount account, string ext)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * int purple_log_common_sizer(PurpleLog * log)
 		 */
 		[DllImport("libpurple.dll")]
@@ -255,7 +217,7 @@ namespace PurpleWrapper
 
 		public static int CommonSizer(PurpleLog log)
 		{
-			throw new NotImplementedException();
+			return purple_log_common_sizer(log.Reference);
 		}
 
 		/*
@@ -266,7 +228,7 @@ namespace PurpleWrapper
 
 		public static bool CommonDeleter(PurpleLog log)
 		{
-			throw new NotImplementedException();
+			return purple_log_common_deleter(log.Reference);
 		}
 
 		/*
@@ -277,21 +239,10 @@ namespace PurpleWrapper
 
 		public static bool CommonIsDeletable(PurpleLog log)
 		{
-			throw new NotImplementedException();
+			return purple_log_common_is_deletable(log.Reference);
 		}
 
 		/*
-		 * PurpleLogLogger * purple_log_logger_new(char * id, char * name, int functions, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_log_logger_new(string id, string name, int functions, ...);
-
-		public static PurpleLogLogger LoggerNew(string id, string name, int functions, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_log_logger_free(PurpleLogLogger * logger)
 		 */
 		[DllImport("libpurple.dll")]
@@ -299,7 +250,7 @@ namespace PurpleWrapper
 
 		public static void LoggerFree(PurpleLogLogger logger)
 		{
-			throw new NotImplementedException();
+			purple_log_logger_free(logger.Reference);
 		}
 
 		/*
@@ -310,7 +261,7 @@ namespace PurpleWrapper
 
 		public static void LoggerAdd(PurpleLogLogger logger)
 		{
-			throw new NotImplementedException();
+			purple_log_logger_add(logger.Reference);
 		}
 
 		/*
@@ -321,7 +272,7 @@ namespace PurpleWrapper
 
 		public static void LoggerRemove(PurpleLogLogger logger)
 		{
-			throw new NotImplementedException();
+			purple_log_logger_remove(logger.Reference);
 		}
 
 		/*
@@ -332,7 +283,7 @@ namespace PurpleWrapper
 
 		public static void LoggerSet(PurpleLogLogger logger)
 		{
-			throw new NotImplementedException();
+			purple_log_logger_set(logger.Reference);
 		}
 
 		/*
@@ -343,20 +294,16 @@ namespace PurpleWrapper
 
 		public static PurpleLogLogger LoggerGet()
 		{
-			throw new NotImplementedException();
+			return new PurpleLogLogger(purple_log_logger_get());
 		}
 
 		/*
 		 * GList * purple_log_logger_get_options()
+		 * 
+		 * Could not generate a wrapper for purple_log_logger_get_options in file "log.h".
+		 * Message: The type could not be resolved (GList * purple_log_logger_get_options()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_log_logger_get_options();
 
-		public static GList LoggerGetOptions()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_log_init()
 		 */
@@ -365,7 +312,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_log_init();
 		}
 
 		/*
@@ -376,7 +323,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_log_get_handle();
 		}
 
 		/*
@@ -387,7 +334,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_log_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Media.cs	fc6e2ab2653d4f4c9fca694a4bff3ddd0c2fb421
+++ libpurple/wrapper/Media.cs	d9e8403ac69f95d45607c8807769993fd7f78602
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,666 +40,382 @@ namespace PurpleWrapper
 {
 	public class Media
 	{
+		public enum PurpleMediaCaps
+		{
+			PURPLE_MEDIA_CAPS_NONE = 0,
+			PURPLE_MEDIA_CAPS_AUDIO = 1,
+			PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION = 1 << 1,
+			PURPLE_MEDIA_CAPS_VIDEO = 1 << 2,
+			PURPLE_MEDIA_CAPS_VIDEO_SINGLE_DIRECTION = 1 << 3,
+			PURPLE_MEDIA_CAPS_AUDIO_VIDEO = 1 << 4,
+			PURPLE_MEDIA_CAPS_MODIFY_SESSION = 1 << 5,
+			PURPLE_MEDIA_CAPS_CHANGE_DIRECTION = 1 << 6
+		};
+
+		public enum PurpleMediaSessionType
+		{
+			PURPLE_MEDIA_NONE = 0,
+			PURPLE_MEDIA_RECV_AUDIO = 1 << 0,
+			PURPLE_MEDIA_SEND_AUDIO = 1 << 1,
+			PURPLE_MEDIA_RECV_VIDEO = 1 << 2,
+			PURPLE_MEDIA_SEND_VIDEO = 1 << 3,
+			PURPLE_MEDIA_AUDIO = PURPLE_MEDIA_RECV_AUDIO | PURPLE_MEDIA_SEND_AUDIO,
+			PURPLE_MEDIA_VIDEO = PURPLE_MEDIA_RECV_VIDEO | PURPLE_MEDIA_SEND_VIDEO
+		};
+
+		public enum PurpleMediaState
+		{
+			PURPLE_MEDIA_STATE_NEW = 0,
+			PURPLE_MEDIA_STATE_CONNECTED,
+			PURPLE_MEDIA_STATE_END
+		};
+
+		public enum PurpleMediaInfoType
+		{
+			PURPLE_MEDIA_INFO_HANGUP = 0,
+			PURPLE_MEDIA_INFO_ACCEPT,
+			PURPLE_MEDIA_INFO_REJECT,
+			PURPLE_MEDIA_INFO_MUTE,
+			PURPLE_MEDIA_INFO_UNMUTE,
+			PURPLE_MEDIA_INFO_HOLD,
+			PURPLE_MEDIA_INFO_UNHOLD
+		};
+
+		public enum PurpleMediaCandidateType
+		{
+			PURPLE_MEDIA_CANDIDATE_TYPE_HOST,
+			PURPLE_MEDIA_CANDIDATE_TYPE_SRFLX,
+			PURPLE_MEDIA_CANDIDATE_TYPE_PRFLX,
+			PURPLE_MEDIA_CANDIDATE_TYPE_RELAY,
+			PURPLE_MEDIA_CANDIDATE_TYPE_MULTICAST
+		};
+
+		public enum PurpleMediaComponentType
+		{
+			PURPLE_MEDIA_COMPONENT_NONE = 0,
+			PURPLE_MEDIA_COMPONENT_RTP = 1,
+			PURPLE_MEDIA_COMPONENT_RTCP = 2
+		};
+
+		public enum PurpleMediaNetworkProtocol
+		{
+			PURPLE_MEDIA_NETWORK_PROTOCOL_UDP,
+			PURPLE_MEDIA_NETWORK_PROTOCOL_TCP
+		};
+
 		/*
 		 * GType purple_media_session_type_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_session_type_get_type();
+		private static extern IntPtr purple_media_session_type_get_type();
 
-		public static GType SessionTypeGetType()
+		public static /* libgobject */ IntPtr SessionTypeGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_session_type_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * GType purple_media_candidate_type_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_candidate_type_get_type();
+		private static extern IntPtr purple_media_candidate_type_get_type();
 
-		public static GType CandidateTypeGetType()
+		public static /* libgobject */ IntPtr CandidateTypeGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_candidate_type_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * GType purple_media_network_protocol_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_network_protocol_get_type();
+		private static extern IntPtr purple_media_network_protocol_get_type();
 
-		public static GType NetworkProtocolGetType()
+		public static /* libgobject */ IntPtr NetworkProtocolGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_network_protocol_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * GType purple_media_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_get_type();
+		private static extern IntPtr purple_media_get_type();
 
-		public static GType GetType()
+		public static /* libgobject */ IntPtr GetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * GType purple_media_state_changed_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_state_changed_get_type();
+		private static extern IntPtr purple_media_state_changed_get_type();
 
-		public static GType StateChangedGetType()
+		public static /* libgobject */ IntPtr StateChangedGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_state_changed_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * GType purple_media_info_type_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_info_type_get_type();
+		private static extern IntPtr purple_media_info_type_get_type();
 
-		public static GType InfoTypeGetType()
+		public static /* libgobject */ IntPtr InfoTypeGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_info_type_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * GType purple_media_candidate_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_candidate_get_type();
+		private static extern IntPtr purple_media_candidate_get_type();
 
-		public static GType CandidateGetType()
+		public static /* libgobject */ IntPtr CandidateGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_candidate_get_type, a GObjectObject. */
+			
 		}
 
 		/*
-		 * PurpleMediaCandidate * purple_media_candidate_new(gchar * foundation, guint component_id, PurpleMediaCandidateType type, PurpleMediaNetworkProtocol proto, gchar * ip, guint port)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_candidate_new(string foundation, uint component_id, UNKNOWN type, UNKNOWN proto, string ip, uint port);
-
-		public static PurpleMediaCandidate CandidateNew(string foundation, uint component_id, PurpleMediaCandidateType type, PurpleMediaNetworkProtocol proto, string ip, uint port)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_media_candidate_list_copy(GList * candidates)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_list_copy in file "media.h".
+		 * Message: The type could not be resolved (GList * purple_media_candidate_list_copy(GList * candidates)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_candidate_list_copy(IntPtr candidates);
 
-		public static GList CandidateListCopy(GList candidates)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_media_candidate_list_free(GList * candidates)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_list_free in file "media.h".
+		 * Message: The type could not be resolved (GList * candidates).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_candidate_list_free(IntPtr candidates);
 
-		public static void CandidateListFree(GList candidates)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_media_candidate_get_foundation(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_foundation in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_media_candidate_get_foundation(IntPtr candidate);
 
-		public static string CandidateGetFoundation(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint purple_media_candidate_get_component_id(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_component_id in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_media_candidate_get_component_id(IntPtr candidate);
 
-		public static uint CandidateGetComponentId(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_media_candidate_get_ip(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_ip in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_media_candidate_get_ip(IntPtr candidate);
 
-		public static string CandidateGetIp(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint16 purple_media_candidate_get_port(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_port in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern ushort purple_media_candidate_get_port(IntPtr candidate);
 
-		public static ushort CandidateGetPort(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_media_candidate_get_base_ip(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_base_ip in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_media_candidate_get_base_ip(IntPtr candidate);
 
-		public static string CandidateGetBaseIp(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint16 purple_media_candidate_get_base_port(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_base_port in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern ushort purple_media_candidate_get_base_port(IntPtr candidate);
 
-		public static ushort CandidateGetBasePort(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleMediaNetworkProtocol purple_media_candidate_get_protocol(PurpleMediaCandidate * candidate)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_candidate_get_protocol(IntPtr candidate);
-
-		public static PurpleMediaNetworkProtocol CandidateGetProtocol(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * guint32 purple_media_candidate_get_priority(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_priority in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_media_candidate_get_priority(IntPtr candidate);
 
-		public static uint CandidateGetPriority(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleMediaCandidateType purple_media_candidate_get_candidate_type(PurpleMediaCandidate * candidate)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_candidate_get_candidate_type(IntPtr candidate);
-
-		public static PurpleMediaCandidateType CandidateGetCandidateType(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gchar * purple_media_candidate_get_username(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_username in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_media_candidate_get_username(IntPtr candidate);
 
-		public static string CandidateGetUsername(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_media_candidate_get_password(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_password in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_media_candidate_get_password(IntPtr candidate);
 
-		public static string CandidateGetPassword(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint purple_media_candidate_get_ttl(PurpleMediaCandidate * candidate)
+		 * 
+		 * Could not generate a wrapper for purple_media_candidate_get_ttl in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCandidate * candidate).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_media_candidate_get_ttl(IntPtr candidate);
 
-		public static uint CandidateGetTtl(PurpleMediaCandidate candidate)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GType purple_media_codec_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_codec_get_type();
+		private static extern IntPtr purple_media_codec_get_type();
 
-		public static GType CodecGetType()
+		public static /* libgobject */ IntPtr CodecGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_codec_get_type, a GObjectObject. */
+			
 		}
 
 		/*
-		 * PurpleMediaCodec * purple_media_codec_new(int id, char * encoding_name, PurpleMediaSessionType media_type, guint clock_rate)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_codec_new(int id, string encoding_name, UNKNOWN media_type, uint clock_rate);
-
-		public static PurpleMediaCodec CodecNew(int id, string encoding_name, PurpleMediaSessionType media_type, uint clock_rate)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * guint purple_media_codec_get_id(PurpleMediaCodec * codec)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_get_id in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCodec * codec).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_media_codec_get_id(IntPtr codec);
 
-		public static uint CodecGetId(PurpleMediaCodec codec)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_media_codec_get_encoding_name(PurpleMediaCodec * codec)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_get_encoding_name in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCodec * codec).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_media_codec_get_encoding_name(IntPtr codec);
 
-		public static string CodecGetEncodingName(PurpleMediaCodec codec)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint purple_media_codec_get_clock_rate(PurpleMediaCodec * codec)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_get_clock_rate in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCodec * codec).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_media_codec_get_clock_rate(IntPtr codec);
 
-		public static uint CodecGetClockRate(PurpleMediaCodec codec)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint purple_media_codec_get_channels(PurpleMediaCodec * codec)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_get_channels in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCodec * codec).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_media_codec_get_channels(IntPtr codec);
 
-		public static uint CodecGetChannels(PurpleMediaCodec codec)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_media_codec_get_optional_parameters(PurpleMediaCodec * codec)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_get_optional_parameters in file "media.h".
+		 * Message: The type could not be resolved (GList * purple_media_codec_get_optional_parameters(PurpleMediaCodec * codec)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_codec_get_optional_parameters(IntPtr codec);
 
-		public static GList CodecGetOptionalParameters(PurpleMediaCodec codec)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_media_codec_to_string(PurpleMediaCodec * codec)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_to_string in file "media.h".
+		 * Message: The type could not be resolved (PurpleMediaCodec * codec).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_media_codec_to_string(IntPtr codec);
 
-		public static string CodecToString(PurpleMediaCodec codec)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_media_codec_add_optional_parameter(PurpleMediaCodec * codec, gchar * name, gchar * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_codec_add_optional_parameter(IntPtr codec, string name, string value);
-
-		public static void CodecAddOptionalParameter(PurpleMediaCodec codec, string name, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_media_codec_remove_optional_parameter(PurpleMediaCodec * codec, PurpleKeyValuePair * param)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_codec_remove_optional_parameter(IntPtr codec, IntPtr param);
-
-		public static void CodecRemoveOptionalParameter(PurpleMediaCodec codec, PurpleKeyValuePair param)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleKeyValuePair * purple_media_codec_get_optional_parameter(PurpleMediaCodec * codec, gchar * name, gchar * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_codec_get_optional_parameter(IntPtr codec, string name, string value);
-
-		public static PurpleKeyValuePair CodecGetOptionalParameter(PurpleMediaCodec codec, string name, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_media_codec_list_copy(GList * codecs)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_list_copy in file "media.h".
+		 * Message: The type could not be resolved (GList * purple_media_codec_list_copy(GList * codecs)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_codec_list_copy(IntPtr codecs);
 
-		public static GList CodecListCopy(GList codecs)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_media_codec_list_free(GList * codecs)
+		 * 
+		 * Could not generate a wrapper for purple_media_codec_list_free in file "media.h".
+		 * Message: The type could not be resolved (GList * codecs).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_codec_list_free(IntPtr codecs);
 
-		public static void CodecListFree(GList codecs)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_media_get_session_ids(PurpleMedia * media)
+		 * 
+		 * Could not generate a wrapper for purple_media_get_session_ids in file "media.h".
+		 * Message: The type could not be resolved (GList * purple_media_get_session_ids(PurpleMedia * media)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_session_ids(IntPtr media);
 
-		public static GList GetSessionIds(PurpleMedia media)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleAccount * purple_media_get_account(PurpleMedia * media)
+		 * 
+		 * Could not generate a wrapper for purple_media_get_account in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_account(IntPtr media);
 
-		public static PurpleAccount GetAccount(PurpleMedia media)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gpointer purple_media_get_prpl_data(PurpleMedia * media)
+		 * 
+		 * Could not generate a wrapper for purple_media_get_prpl_data in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_prpl_data(IntPtr media);
 
-		public static IntPtr GetPrplData(PurpleMedia media)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_media_set_prpl_data(PurpleMedia * media, gpointer prpl_data)
+		 * 
+		 * Could not generate a wrapper for purple_media_set_prpl_data in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_set_prpl_data(IntPtr media, IntPtr prpl_data);
 
-		public static void SetPrplData(PurpleMedia media, IntPtr prpl_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_media_error(PurpleMedia * media, gchar * error, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_error(IntPtr media, string error, ...);
-
-		public static void Error(PurpleMedia media, string error, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_media_end(PurpleMedia * media, gchar * session_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_end(IntPtr media, string session_id, string participant);
-
-		public static void End(PurpleMedia media, string session_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_media_stream_info(PurpleMedia * media, PurpleMediaInfoType type, gchar * session_id, gchar * participant, gboolean local)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_stream_info(IntPtr media, UNKNOWN type, string session_id, string participant, bool local);
-
-		public static void StreamInfo(PurpleMedia media, PurpleMediaInfoType type, string session_id, string participant, bool local)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_media_add_stream(PurpleMedia * media, gchar * sess_id, gchar * who, PurpleMediaSessionType type, gboolean initiator, gchar * transmitter, guint num_params, GParameter * params)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_add_stream(IntPtr media, string sess_id, string who, UNKNOWN type, bool initiator, string transmitter, uint num_params, IntPtr params);
-
-		public static bool AddStream(PurpleMedia media, string sess_id, string who, PurpleMediaSessionType type, bool initiator, string transmitter, uint num_params, GParameter params)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleMediaSessionType purple_media_get_session_type(PurpleMedia * media, gchar * sess_id)
+		 * 
+		 * Could not generate a wrapper for purple_media_get_session_type in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_get_session_type(IntPtr media, string sess_id);
 
-		public static PurpleMediaSessionType GetSessionType(PurpleMedia media, string sess_id)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * _PurpleMediaManager * purple_media_get_manager(PurpleMedia * media)
+		 * 
+		 * Could not generate a wrapper for purple_media_get_manager in file "media.h".
+		 * Message: The type could not be resolved (_PurpleMediaManager * purple_media_get_manager(PurpleMedia * media)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_manager(IntPtr media);
 
-		public static _PurpleMediaManager GetManager(PurpleMedia media)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_media_get_codecs(PurpleMedia * media, gchar * sess_id)
+		 * 
+		 * Could not generate a wrapper for purple_media_get_codecs in file "media.h".
+		 * Message: The type could not be resolved (GList * purple_media_get_codecs(PurpleMedia * media, gchar * sess_id)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_codecs(IntPtr media, string sess_id);
 
-		public static GList GetCodecs(PurpleMedia media, string sess_id)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_media_add_remote_candidates(PurpleMedia * media, gchar * sess_id, gchar * participant, GList * remote_candidates)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_add_remote_candidates(IntPtr media, string sess_id, string participant, IntPtr remote_candidates);
-
-		public static void AddRemoteCandidates(PurpleMedia media, string sess_id, string participant, GList remote_candidates)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * GList * purple_media_get_local_candidates(PurpleMedia * media, gchar * sess_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_local_candidates(IntPtr media, string sess_id, string participant);
-
-		public static GList GetLocalCandidates(PurpleMedia media, string sess_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * GList * purple_media_get_active_local_candidates(PurpleMedia * media, gchar * sess_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_active_local_candidates(IntPtr media, string sess_id, string participant);
-
-		public static GList GetActiveLocalCandidates(PurpleMedia media, string sess_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * GList * purple_media_get_active_remote_candidates(PurpleMedia * media, gchar * sess_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_get_active_remote_candidates(IntPtr media, string sess_id, string participant);
-
-		public static GList GetActiveRemoteCandidates(PurpleMedia media, string sess_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_media_set_remote_codecs(PurpleMedia * media, gchar * sess_id, gchar * participant, GList * codecs)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_set_remote_codecs(IntPtr media, string sess_id, string participant, IntPtr codecs);
-
-		public static bool SetRemoteCodecs(PurpleMedia media, string sess_id, string participant, GList codecs)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_media_candidates_prepared(PurpleMedia * media, gchar * session_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_candidates_prepared(IntPtr media, string session_id, string participant);
-
-		public static bool CandidatesPrepared(PurpleMedia media, string session_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_media_set_send_codec(PurpleMedia * media, gchar * sess_id, PurpleMediaCodec * codec)
+		 * 
+		 * Could not generate a wrapper for purple_media_set_send_codec in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_set_send_codec(IntPtr media, string sess_id, IntPtr codec);
 
-		public static bool SetSendCodec(PurpleMedia media, string sess_id, PurpleMediaCodec codec)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_media_codecs_ready(PurpleMedia * media, gchar * sess_id)
+		 * 
+		 * Could not generate a wrapper for purple_media_codecs_ready in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_codecs_ready(IntPtr media, string sess_id);
 
-		public static bool CodecsReady(PurpleMedia media, string sess_id)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_media_is_initiator(PurpleMedia * media, gchar * sess_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_is_initiator(IntPtr media, string sess_id, string participant);
-
-		public static bool IsInitiator(PurpleMedia media, string sess_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_media_accepted(PurpleMedia * media, gchar * sess_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_accepted(IntPtr media, string sess_id, string participant);
-
-		public static bool Accepted(PurpleMedia media, string sess_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_media_set_input_volume(PurpleMedia * media, gchar * session_id, double level)
+		 * 
+		 * Could not generate a wrapper for purple_media_set_input_volume in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_set_input_volume(IntPtr media, string session_id, double level);
 
-		public static void SetInputVolume(PurpleMedia media, string session_id, double level)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_media_set_output_volume(PurpleMedia * media, gchar * session_id, gchar * participant, double level)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_set_output_volume(IntPtr media, string session_id, string participant, double level);
-
-		public static void SetOutputVolume(PurpleMedia media, string session_id, string participant, double level)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gulong purple_media_set_output_window(PurpleMedia * media, gchar * session_id, gchar * participant, gulong window_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_media_set_output_window(IntPtr media, string session_id, string participant, ulong window_id);
-
-		public static ulong SetOutputWindow(PurpleMedia media, string session_id, string participant, ulong window_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_media_remove_output_windows(PurpleMedia * media)
+		 * 
+		 * Could not generate a wrapper for purple_media_remove_output_windows in file "media.h".
+		 * Message: The type could not be resolved (PurpleMedia * media).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_remove_output_windows(IntPtr media);
 
-		public static void RemoveOutputWindows(PurpleMedia media)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Mediamanager.cs	041e5f99d1fec6c0d4679252fb0757f94091f10c
+++ libpurple/wrapper/Mediamanager.cs	8d8563e1659ab45477d539cd32b0da8be0370d48
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,134 +44,35 @@ namespace PurpleWrapper
 		 * GType purple_media_manager_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_manager_get_type();
+		private static extern IntPtr purple_media_manager_get_type();
 
-		public static GType MediaManagerGetType()
+		public static /* libgobject */ IntPtr MediaManagerGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_media_manager_get_type, a GObjectObject. */
+			
 		}
 
 		/*
 		 * PurpleMediaManager * purple_media_manager_get()
+		 * 
+		 * Could not generate a wrapper for purple_media_manager_get in file "mediamanager.h".
+		 * Message: The type could not be resolved (PurpleMediaManager * purple_media_manager_get()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_manager_get();
 
-		public static PurpleMediaManager MediaManagerGet()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleMedia * purple_media_manager_create_media(PurpleMediaManager * manager, PurpleAccount * account, char * conference_type, char * remote_user, gboolean initiator)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_manager_create_media(IntPtr manager, IntPtr account, string conference_type, string remote_user, bool initiator);
-
-		public static PurpleMedia MediaManagerCreateMedia(PurpleMediaManager manager, PurpleAccount account, string conference_type, string remote_user, bool initiator)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_media_manager_get_media(PurpleMediaManager * manager)
+		 * 
+		 * Could not generate a wrapper for purple_media_manager_get_media in file "mediamanager.h".
+		 * Message: The type could not be resolved (GList * purple_media_manager_get_media(PurpleMediaManager * manager)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_manager_get_media(IntPtr manager);
 
-		public static GList MediaManagerGetMedia(PurpleMediaManager manager)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * GList * purple_media_manager_get_media_by_account(PurpleMediaManager * manager, PurpleAccount * account)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_media_manager_get_media_by_account(IntPtr manager, IntPtr account);
-
-		public static GList MediaManagerGetMediaByAccount(PurpleMediaManager manager, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_media_manager_remove_media(PurpleMediaManager * manager, PurpleMedia * media)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_manager_remove_media(IntPtr manager, IntPtr media);
-
-		public static void MediaManagerRemoveMedia(PurpleMediaManager manager, PurpleMedia media)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_media_manager_create_output_window(PurpleMediaManager * manager, PurpleMedia * media, gchar * session_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_manager_create_output_window(IntPtr manager, IntPtr media, string session_id, string participant);
-
-		public static bool MediaManagerCreateOutputWindow(PurpleMediaManager manager, PurpleMedia media, string session_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gulong purple_media_manager_set_output_window(PurpleMediaManager * manager, PurpleMedia * media, gchar * session_id, gchar * participant, gulong window_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_media_manager_set_output_window(IntPtr manager, IntPtr media, string session_id, string participant, ulong window_id);
-
-		public static ulong MediaManagerSetOutputWindow(PurpleMediaManager manager, PurpleMedia media, string session_id, string participant, ulong window_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_media_manager_remove_output_window(PurpleMediaManager * manager, gulong output_window_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_media_manager_remove_output_window(IntPtr manager, ulong output_window_id);
-
-		public static bool MediaManagerRemoveOutputWindow(PurpleMediaManager manager, ulong output_window_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_media_manager_remove_output_windows(PurpleMediaManager * manager, PurpleMedia * media, gchar * session_id, gchar * participant)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_manager_remove_output_windows(IntPtr manager, IntPtr media, string session_id, string participant);
-
-		public static void MediaManagerRemoveOutputWindows(PurpleMediaManager manager, PurpleMedia media, string session_id, string participant)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_media_manager_set_ui_caps(PurpleMediaManager * manager, PurpleMediaCaps caps)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_media_manager_set_ui_caps(IntPtr manager, UNKNOWN caps);
-
-		public static void MediaManagerSetUiCaps(PurpleMediaManager manager, PurpleMediaCaps caps)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleMediaCaps purple_media_manager_get_ui_caps(PurpleMediaManager * manager)
+		 * 
+		 * Could not generate a wrapper for purple_media_manager_get_ui_caps in file "mediamanager.h".
+		 * Message: The type could not be resolved (PurpleMediaManager * manager).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_media_manager_get_ui_caps(IntPtr manager);
 
-		public static PurpleMediaCaps MediaManagerGetUiCaps(PurpleMediaManager manager)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Mime.cs	3a2a87fbb809e5fed1bd800f1a6b59c246bda462
+++ libpurple/wrapper/Mime.cs	d84a768a94c72d44c0dbfcee8daba95b81020cfc
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -40,202 +42,88 @@ namespace PurpleWrapper
 	{
 		/*
 		 * PurpleMimeDocument * purple_mime_document_new()
+		 * 
+		 * Could not generate a wrapper for purple_mime_document_new in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimeDocument * purple_mime_document_new()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mime_document_new();
 
-		public static PurpleMimeDocument DocumentNew()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_mime_document_free(PurpleMimeDocument * doc)
+		 * 
+		 * Could not generate a wrapper for purple_mime_document_free in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimeDocument * doc).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_mime_document_free(IntPtr doc);
 
-		public static void DocumentFree(PurpleMimeDocument doc)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleMimeDocument * purple_mime_document_parse(char * buf)
+		 * 
+		 * Could not generate a wrapper for purple_mime_document_parse in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimeDocument * purple_mime_document_parse(char * buf)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mime_document_parse(string buf);
 
-		public static PurpleMimeDocument DocumentParse(string buf)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleMimeDocument * purple_mime_document_parsen(char * buf, gsize len)
+		 * 
+		 * Could not generate a wrapper for purple_mime_document_parsen in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimeDocument * purple_mime_document_parsen(char * buf, gsize len)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mime_document_parsen(string buf, UNKNOWN len);
 
-		public static PurpleMimeDocument DocumentParsen(string buf, gsize len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_mime_document_write(PurpleMimeDocument * doc, GString * str)
+		 * 
+		 * Could not generate a wrapper for purple_mime_document_write in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimeDocument * doc).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_mime_document_write(IntPtr doc, IntPtr str);
 
-		public static void DocumentWrite(PurpleMimeDocument doc, GString str)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_mime_document_get_fields(PurpleMimeDocument * doc)
+		 * 
+		 * Could not generate a wrapper for purple_mime_document_get_fields in file "mime.h".
+		 * Message: The type could not be resolved (GList * purple_mime_document_get_fields(PurpleMimeDocument * doc)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mime_document_get_fields(IntPtr doc);
 
-		public static GList DocumentGetFields(PurpleMimeDocument doc)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char * purple_mime_document_get_field(PurpleMimeDocument * doc, char * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_mime_document_get_field(IntPtr doc, string field);
-
-		public static string DocumentGetField(PurpleMimeDocument doc, string field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_mime_document_set_field(PurpleMimeDocument * doc, char * field, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_mime_document_set_field(IntPtr doc, string field, string value);
-
-		public static void DocumentSetField(PurpleMimeDocument doc, string field, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_mime_document_get_parts(PurpleMimeDocument * doc)
+		 * 
+		 * Could not generate a wrapper for purple_mime_document_get_parts in file "mime.h".
+		 * Message: The type could not be resolved (GList * purple_mime_document_get_parts(PurpleMimeDocument * doc)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mime_document_get_parts(IntPtr doc);
 
-		public static GList DocumentGetParts(PurpleMimeDocument doc)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleMimePart * purple_mime_part_new(PurpleMimeDocument * doc)
+		 * 
+		 * Could not generate a wrapper for purple_mime_part_new in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimePart * purple_mime_part_new(PurpleMimeDocument * doc)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mime_part_new(IntPtr doc);
 
-		public static PurpleMimePart PartNew(PurpleMimeDocument doc)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_mime_part_get_fields(PurpleMimePart * part)
+		 * 
+		 * Could not generate a wrapper for purple_mime_part_get_fields in file "mime.h".
+		 * Message: The type could not be resolved (GList * purple_mime_part_get_fields(PurpleMimePart * part)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mime_part_get_fields(IntPtr part);
 
-		public static GList PartGetFields(PurpleMimePart part)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char * purple_mime_part_get_field(PurpleMimePart * part, char * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_mime_part_get_field(IntPtr part, string field);
-
-		public static string PartGetField(PurpleMimePart part, string field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_mime_part_get_field_decoded(PurpleMimePart * part, char * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_mime_part_get_field_decoded(IntPtr part, string field);
-
-		public static string PartGetFieldDecoded(PurpleMimePart part, string field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_mime_part_set_field(PurpleMimePart * part, char * field, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_mime_part_set_field(IntPtr part, string field, string value);
-
-		public static void PartSetField(PurpleMimePart part, string field, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_mime_part_get_data(PurpleMimePart * part)
+		 * 
+		 * Could not generate a wrapper for purple_mime_part_get_data in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimePart * part).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_mime_part_get_data(IntPtr part);
 
-		public static string PartGetData(PurpleMimePart part)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_mime_part_get_data_decoded(PurpleMimePart * part, guchar ** data, gsize * len)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_mime_part_get_data_decoded(IntPtr part, IntPtr data, IntPtr len);
-
-		public static void PartGetDataDecoded(PurpleMimePart part, guchar data, gsize len)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gsize purple_mime_part_get_length(PurpleMimePart * part)
+		 * 
+		 * Could not generate a wrapper for purple_mime_part_get_length in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimePart * part).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_mime_part_get_length(IntPtr part);
 
-		public static gsize PartGetLength(PurpleMimePart part)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_mime_part_set_data(PurpleMimePart * part, char * data)
+		 * 
+		 * Could not generate a wrapper for purple_mime_part_set_data in file "mime.h".
+		 * Message: The type could not be resolved (PurpleMimePart * part).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_mime_part_set_data(IntPtr part, string data);
 
-		public static void PartSetData(PurpleMimePart part, string data)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/NatPmp.cs	184a8d5346ef7751e9fb90723b15b6095a39d315
+++ libpurple/wrapper/NatPmp.cs	52afa781fa1baa9418804accece568863f8013c2
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,6 +40,12 @@ namespace PurpleWrapper
 {
 	public class NatPmp
 	{
+		public enum PurplePmpType
+		{
+			PURPLE_PMP_TYPE_UDP,
+			PURPLE_PMP_TYPE_TCP
+		};
+
 		/*
 		 * void purple_pmp_init()
 		 */
@@ -46,7 +54,7 @@ namespace PurpleWrapper
 
 		public static void PmpInit()
 		{
-			throw new NotImplementedException();
+			purple_pmp_init();
 		}
 
 		/*
@@ -57,28 +65,30 @@ namespace PurpleWrapper
 
 		public static string PmpGetPublicIp()
 		{
-			throw new NotImplementedException();
+			return purple_pmp_get_public_ip();
 		}
 
 		/*
-		 * gboolean purple_pmp_create_map(PurplePmpType type, unsigned short, unsigned short, int lifetime)
+		 * gboolean purple_pmp_create_map(PurplePmpType type, unsigned short privateport, unsigned short publicport, int lifetime)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_pmp_create_map(UNKNOWN type, UNKNOWN short, UNKNOWN short, int lifetime);
+		private static extern bool purple_pmp_create_map(NatPmp.PurplePmpType type, ushort privateport, ushort publicport, int lifetime);
 
-		public static bool PmpCreateMap(PurplePmpType type, unsigned short, unsigned short, int lifetime)
+		public static bool PmpCreateMap(NatPmp.PurplePmpType type, ushort privateport, ushort publicport, int lifetime)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * gboolean purple_pmp_destroy_map(PurplePmpType type, unsigned short)
+		 * gboolean purple_pmp_destroy_map(PurplePmpType type, unsigned short privateport)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_pmp_destroy_map(UNKNOWN type, UNKNOWN short);
+		private static extern bool purple_pmp_destroy_map(NatPmp.PurplePmpType type, ushort privateport);
 
-		public static bool PmpDestroyMap(PurplePmpType type, unsigned short)
+		public static bool PmpDestroyMap(NatPmp.PurplePmpType type, ushort privateport)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
============================================================
--- libpurple/wrapper/Network.cs	75195b5f5664821413f14bf8393a68f6e699d07c
+++ libpurple/wrapper/Network.cs	b4201f486d6bca8abad5afa55d9d85c61f3fd862
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,16 +41,12 @@ namespace PurpleWrapper
 	public class Network
 	{
 		/*
-		 * char * purple_network_ip_atoi(char * ip)
+		 * unsigned char * purple_network_ip_atoi(char * ip)
+		 * 
+		 * Could not generate a wrapper for purple_network_ip_atoi in file "network.h".
+		 * Message: The type could not be resolved (unsigned char * purple_network_ip_atoi(char * ip)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_network_ip_atoi(string ip);
 
-		public static string IpAtoi(string ip)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_network_set_public_ip(char * ip)
 		 */
@@ -57,7 +55,7 @@ namespace PurpleWrapper
 
 		public static void SetPublicIp(string ip)
 		{
-			throw new NotImplementedException();
+			purple_network_set_public_ip(ip);
 		}
 
 		/*
@@ -68,7 +66,7 @@ namespace PurpleWrapper
 
 		public static string GetPublicIp()
 		{
-			throw new NotImplementedException();
+			return purple_network_get_public_ip();
 		}
 
 		/*
@@ -79,7 +77,7 @@ namespace PurpleWrapper
 
 		public static string GetLocalSystemIp(int fd)
 		{
-			throw new NotImplementedException();
+			return purple_network_get_local_system_ip(fd);
 		}
 
 		/*
@@ -90,7 +88,7 @@ namespace PurpleWrapper
 
 		public static string GetMyIp(int fd)
 		{
-			throw new NotImplementedException();
+			return purple_network_get_my_ip(fd);
 		}
 
 		/*
@@ -101,51 +99,25 @@ namespace PurpleWrapper
 
 		public static void ListenMapExternal(bool map_external)
 		{
-			throw new NotImplementedException();
+			purple_network_listen_map_external(map_external);
 		}
 
 		/*
-		 * PurpleNetworkListenData * purple_network_listen(unsigned short, int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_network_listen(UNKNOWN short, int socket_type, UNKNOWN cb, IntPtr cb_data);
-
-		public static PurpleNetworkListenData Listen(unsigned short, int socket_type, PurpleNetworkListenCallback cb, IntPtr cb_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleNetworkListenData * purple_network_listen_range(unsigned short, unsigned short, int socket_type, PurpleNetworkListenCallback cb, gpointer cb_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_network_listen_range(UNKNOWN short, UNKNOWN short, int socket_type, UNKNOWN cb, IntPtr cb_data);
-
-		public static PurpleNetworkListenData ListenRange(unsigned short, unsigned short, int socket_type, PurpleNetworkListenCallback cb, IntPtr cb_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_network_listen_cancel(PurpleNetworkListenData * listen_data)
+		 * 
+		 * Could not generate a wrapper for purple_network_listen_cancel in file "network.h".
+		 * Message: The type could not be resolved (PurpleNetworkListenData * listen_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_network_listen_cancel(IntPtr listen_data);
 
-		public static void ListenCancel(PurpleNetworkListenData listen_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * short purple_network_get_port_from_fd(int fd)
+		 * unsigned short purple_network_get_port_from_fd(int fd)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern short purple_network_get_port_from_fd(int fd);
+		private static extern ushort purple_network_get_port_from_fd(int fd);
 
-		public static short GetPortFromFd(int fd)
+		public static ushort GetPortFromFd(int fd)
 		{
-			throw new NotImplementedException();
+			return purple_network_get_port_from_fd(fd);
 		}
 
 		/*
@@ -156,7 +128,7 @@ namespace PurpleWrapper
 
 		public static bool IsAvailable()
 		{
-			throw new NotImplementedException();
+			return purple_network_is_available();
 		}
 
 		/*
@@ -167,7 +139,7 @@ namespace PurpleWrapper
 
 		public static void ForceOnline()
 		{
-			throw new NotImplementedException();
+			purple_network_force_online();
 		}
 
 		/*
@@ -178,7 +150,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_network_get_handle();
 		}
 
 		/*
@@ -189,7 +161,7 @@ namespace PurpleWrapper
 
 		public static void SetStunServer(string stun_server)
 		{
-			throw new NotImplementedException();
+			purple_network_set_stun_server(stun_server);
 		}
 
 		/*
@@ -200,7 +172,7 @@ namespace PurpleWrapper
 
 		public static string GetStunIp()
 		{
-			throw new NotImplementedException();
+			return purple_network_get_stun_ip();
 		}
 
 		/*
@@ -211,7 +183,7 @@ namespace PurpleWrapper
 
 		public static void SetTurnServer(string stun_server)
 		{
-			throw new NotImplementedException();
+			purple_network_set_turn_server(stun_server);
 		}
 
 		/*
@@ -222,7 +194,7 @@ namespace PurpleWrapper
 
 		public static string GetTurnIp()
 		{
-			throw new NotImplementedException();
+			return purple_network_get_turn_ip();
 		}
 
 		/*
@@ -233,7 +205,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_network_init();
 		}
 
 		/*
@@ -244,7 +216,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_network_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Notify.cs	1f1539bc627036b4f3859fb40bdd044a9df5ddcb
+++ libpurple/wrapper/Notify.cs	6973472a8319c42a88a4f27fb64316ca37d7e7cc
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,414 +40,204 @@ namespace PurpleWrapper
 {
 	public class Notify
 	{
-		/*
-		 * void * purple_notify_searchresults(PurpleConnection * gc, char * title, char * primary, char * secondary, PurpleNotifySearchResults * results, PurpleNotifyCloseCallback cb, gpointer user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_searchresults(IntPtr gc, string title, string primary, string secondary, IntPtr results, UNKNOWN cb, IntPtr user_data);
-
-		public static IntPtr Searchresults(PurpleConnection gc, string title, string primary, string secondary, PurpleNotifySearchResults results, PurpleNotifyCloseCallback cb, IntPtr user_data)
+		public enum PurpleNotifyType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_NOTIFY_MESSAGE = 0,
+			PURPLE_NOTIFY_EMAIL,
+			PURPLE_NOTIFY_EMAILS,
+			PURPLE_NOTIFY_FORMATTED,
+			PURPLE_NOTIFY_SEARCHRESULTS,
+			PURPLE_NOTIFY_USERINFO,
+			PURPLE_NOTIFY_URI
+		};
 
-		/*
-		 * void purple_notify_searchresults_free(PurpleNotifySearchResults * results)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_searchresults_free(IntPtr results);
-
-		public static void SearchresultsFree(PurpleNotifySearchResults results)
+		public enum PurpleNotifyMsgType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_NOTIFY_MSG_ERROR = 0,
+			PURPLE_NOTIFY_MSG_WARNING,
+			PURPLE_NOTIFY_MSG_INFO
+		};
 
-		/*
-		 * void purple_notify_searchresults_new_rows(PurpleConnection * gc, PurpleNotifySearchResults * results, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_searchresults_new_rows(IntPtr gc, IntPtr results, IntPtr data);
-
-		public static void SearchresultsNewRows(PurpleConnection gc, PurpleNotifySearchResults results, IntPtr data)
+		public enum PurpleNotifySearchButtonType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_NOTIFY_BUTTON_LABELED = 0,
+			PURPLE_NOTIFY_BUTTON_CONTINUE = 1,
+			PURPLE_NOTIFY_BUTTON_ADD,
+			PURPLE_NOTIFY_BUTTON_INFO,
+			PURPLE_NOTIFY_BUTTON_IM,
+			PURPLE_NOTIFY_BUTTON_JOIN,
+			PURPLE_NOTIFY_BUTTON_INVITE
+		};
 
-		/*
-		 * void purple_notify_searchresults_button_add(PurpleNotifySearchResults * results, PurpleNotifySearchButtonType type, PurpleNotifySearchResultsCallback cb)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_searchresults_button_add(IntPtr results, UNKNOWN type, UNKNOWN cb);
-
-		public static void SearchresultsButtonAdd(PurpleNotifySearchResults results, PurpleNotifySearchButtonType type, PurpleNotifySearchResultsCallback cb)
+		public enum PurpleNotifyUserInfoEntryType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_NOTIFY_USER_INFO_ENTRY_PAIR = 0,
+			PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK,
+			PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER
+		};
 
 		/*
-		 * void purple_notify_searchresults_button_add_labeled(PurpleNotifySearchResults * results, char * label, PurpleNotifySearchResultsCallback cb)
+		 * void purple_notify_searchresults_free(PurpleNotifySearchResults * results)
+		 * 
+		 * Could not generate a wrapper for purple_notify_searchresults_free in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifySearchResults * results).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_searchresults_button_add_labeled(IntPtr results, string label, UNKNOWN cb);
 
-		public static void SearchresultsButtonAddLabeled(PurpleNotifySearchResults results, string label, PurpleNotifySearchResultsCallback cb)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleNotifySearchResults * purple_notify_searchresults_new()
+		 * 
+		 * Could not generate a wrapper for purple_notify_searchresults_new in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifySearchResults * purple_notify_searchresults_new()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_searchresults_new();
 
-		public static PurpleNotifySearchResults SearchresultsNew()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleNotifySearchColumn * purple_notify_searchresults_column_new(char * title)
+		 * 
+		 * Could not generate a wrapper for purple_notify_searchresults_column_new in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifySearchColumn * purple_notify_searchresults_column_new(char * title)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_searchresults_column_new(string title);
 
-		public static PurpleNotifySearchColumn SearchresultsColumnNew(string title)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_notify_searchresults_column_add(PurpleNotifySearchResults * results, PurpleNotifySearchColumn * column)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_searchresults_column_add(IntPtr results, IntPtr column);
-
-		public static void SearchresultsColumnAdd(PurpleNotifySearchResults results, PurpleNotifySearchColumn column)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_notify_searchresults_row_add(PurpleNotifySearchResults * results, GList * row)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_searchresults_row_add(IntPtr results, IntPtr row);
-
-		public static void SearchresultsRowAdd(PurpleNotifySearchResults results, GList row)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * guint purple_notify_searchresults_get_rows_count(PurpleNotifySearchResults * results)
+		 * 
+		 * Could not generate a wrapper for purple_notify_searchresults_get_rows_count in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifySearchResults * results).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_notify_searchresults_get_rows_count(IntPtr results);
 
-		public static uint SearchresultsGetRowsCount(PurpleNotifySearchResults results)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint purple_notify_searchresults_get_columns_count(PurpleNotifySearchResults * results)
+		 * 
+		 * Could not generate a wrapper for purple_notify_searchresults_get_columns_count in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifySearchResults * results).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_notify_searchresults_get_columns_count(IntPtr results);
 
-		public static uint SearchresultsGetColumnsCount(PurpleNotifySearchResults results)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * GList * purple_notify_searchresults_row_get(PurpleNotifySearchResults * results, unsigned int)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_searchresults_row_get(IntPtr results, UNKNOWN int);
-
-		public static GList SearchresultsRowGet(PurpleNotifySearchResults results, unsigned int)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_notify_searchresults_column_get_title(PurpleNotifySearchResults * results, unsigned int)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_notify_searchresults_column_get_title(IntPtr results, UNKNOWN int);
-
-		public static string SearchresultsColumnGetTitle(PurpleNotifySearchResults results, unsigned int)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_notify_message(void * handle, PurpleNotifyMsgType type, char * title, char * primary, char * secondary, PurpleNotifyCloseCallback cb, gpointer user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_message(IntPtr handle, UNKNOWN type, string title, string primary, string secondary, UNKNOWN cb, IntPtr user_data);
-
-		public static IntPtr Message(IntPtr handle, PurpleNotifyMsgType type, string title, string primary, string secondary, PurpleNotifyCloseCallback cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_notify_email(void * handle, char * subject, char * from, char * to, char * url, PurpleNotifyCloseCallback cb, gpointer user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_email(IntPtr handle, string subject, string from, string to, string url, UNKNOWN cb, IntPtr user_data);
-
-		public static IntPtr Email(IntPtr handle, string subject, string from, string to, string url, PurpleNotifyCloseCallback cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_notify_emails(void * handle, size_t count, gboolean detailed, char ** subjects, char ** froms, char ** tos, char ** urls, PurpleNotifyCloseCallback cb, gpointer user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_emails(IntPtr handle, UNKNOWN count, bool detailed, IntPtr subjects, IntPtr froms, IntPtr tos, IntPtr urls, UNKNOWN cb, IntPtr user_data);
-
-		public static IntPtr Emails(IntPtr handle, size_t count, bool detailed, char subjects, char froms, char tos, char urls, PurpleNotifyCloseCallback cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_notify_formatted(void * handle, char * title, char * primary, char * secondary, char * text, PurpleNotifyCloseCallback cb, gpointer user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_formatted(IntPtr handle, string title, string primary, string secondary, string text, UNKNOWN cb, IntPtr user_data);
-
-		public static IntPtr Formatted(IntPtr handle, string title, string primary, string secondary, string text, PurpleNotifyCloseCallback cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_notify_userinfo(PurpleConnection * gc, char * who, PurpleNotifyUserInfo * user_info, PurpleNotifyCloseCallback cb, gpointer user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_userinfo(IntPtr gc, string who, IntPtr user_info, UNKNOWN cb, IntPtr user_data);
-
-		public static IntPtr Userinfo(PurpleConnection gc, string who, PurpleNotifyUserInfo user_info, PurpleNotifyCloseCallback cb, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleNotifyUserInfo * purple_notify_user_info_new()
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_new in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * purple_notify_user_info_new()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_user_info_new();
 
-		public static PurpleNotifyUserInfo UserInfoNew()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_destroy(PurpleNotifyUserInfo * user_info)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_destroy in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_destroy(IntPtr user_info);
 
-		public static void UserInfoDestroy(PurpleNotifyUserInfo user_info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_notify_user_info_get_entries(PurpleNotifyUserInfo * user_info)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_get_entries in file "notify.h".
+		 * Message: The type could not be resolved (GList * purple_notify_user_info_get_entries(PurpleNotifyUserInfo * user_info)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_user_info_get_entries(IntPtr user_info);
 
-		public static GList UserInfoGetEntries(PurpleNotifyUserInfo user_info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_notify_user_info_get_text_with_newline(PurpleNotifyUserInfo * user_info, char * newline)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_get_text_with_newline in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_notify_user_info_get_text_with_newline(IntPtr user_info, string newline);
 
-		public static string UserInfoGetTextWithNewline(PurpleNotifyUserInfo user_info, string newline)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_add_pair(PurpleNotifyUserInfo * user_info, char * label, char * value)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_add_pair in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_add_pair(IntPtr user_info, string label, string value);
 
-		public static void UserInfoAddPair(PurpleNotifyUserInfo user_info, string label, string value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_prepend_pair(PurpleNotifyUserInfo * user_info, char * label, char * value)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_prepend_pair in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_prepend_pair(IntPtr user_info, string label, string value);
 
-		public static void UserInfoPrependPair(PurpleNotifyUserInfo user_info, string label, string value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_remove_entry(PurpleNotifyUserInfo * user_info, PurpleNotifyUserInfoEntry * user_info_entry)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_remove_entry in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_remove_entry(IntPtr user_info, IntPtr user_info_entry);
 
-		public static void UserInfoRemoveEntry(PurpleNotifyUserInfo user_info, PurpleNotifyUserInfoEntry user_info_entry)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleNotifyUserInfoEntry * purple_notify_user_info_entry_new(char * label, char * value)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_entry_new in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfoEntry * purple_notify_user_info_entry_new(char * label, char * value)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_user_info_entry_new(string label, string value);
 
-		public static PurpleNotifyUserInfoEntry UserInfoEntryNew(string label, string value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_add_section_break(PurpleNotifyUserInfo * user_info)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_add_section_break in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_add_section_break(IntPtr user_info);
 
-		public static void UserInfoAddSectionBreak(PurpleNotifyUserInfo user_info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_prepend_section_break(PurpleNotifyUserInfo * user_info)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_prepend_section_break in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_prepend_section_break(IntPtr user_info);
 
-		public static void UserInfoPrependSectionBreak(PurpleNotifyUserInfo user_info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_add_section_header(PurpleNotifyUserInfo * user_info, char * label)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_add_section_header in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_add_section_header(IntPtr user_info, string label);
 
-		public static void UserInfoAddSectionHeader(PurpleNotifyUserInfo user_info, string label)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_prepend_section_header(PurpleNotifyUserInfo * user_info, char * label)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_prepend_section_header in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_prepend_section_header(IntPtr user_info, string label);
 
-		public static void UserInfoPrependSectionHeader(PurpleNotifyUserInfo user_info, string label)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_remove_last_item(PurpleNotifyUserInfo * user_info)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_remove_last_item in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfo * user_info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_remove_last_item(IntPtr user_info);
 
-		public static void UserInfoRemoveLastItem(PurpleNotifyUserInfo user_info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_notify_user_info_entry_get_label(PurpleNotifyUserInfoEntry * user_info_entry)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_entry_get_label in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfoEntry * user_info_entry).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_notify_user_info_entry_get_label(IntPtr user_info_entry);
 
-		public static string UserInfoEntryGetLabel(PurpleNotifyUserInfoEntry user_info_entry)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_entry_set_label(PurpleNotifyUserInfoEntry * user_info_entry, char * label)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_entry_set_label in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfoEntry * user_info_entry).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_entry_set_label(IntPtr user_info_entry, string label);
 
-		public static void UserInfoEntrySetLabel(PurpleNotifyUserInfoEntry user_info_entry, string label)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_notify_user_info_entry_get_value(PurpleNotifyUserInfoEntry * user_info_entry)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_entry_get_value in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfoEntry * user_info_entry).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_notify_user_info_entry_get_value(IntPtr user_info_entry);
 
-		public static string UserInfoEntryGetValue(PurpleNotifyUserInfoEntry user_info_entry)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_notify_user_info_entry_set_value(PurpleNotifyUserInfoEntry * user_info_entry, char * value)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_entry_set_value in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfoEntry * user_info_entry).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_entry_set_value(IntPtr user_info_entry, string value);
 
-		public static void UserInfoEntrySetValue(PurpleNotifyUserInfoEntry user_info_entry, string value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleNotifyUserInfoEntryType purple_notify_user_info_entry_get_type(PurpleNotifyUserInfoEntry * user_info_entry)
+		 * 
+		 * Could not generate a wrapper for purple_notify_user_info_entry_get_type in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUserInfoEntry * user_info_entry).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_notify_user_info_entry_get_type(IntPtr user_info_entry);
 
-		public static PurpleNotifyUserInfoEntryType UserInfoEntryGetType(PurpleNotifyUserInfoEntry user_info_entry)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_notify_user_info_entry_set_type(PurpleNotifyUserInfoEntry * user_info_entry, PurpleNotifyUserInfoEntryType type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_user_info_entry_set_type(IntPtr user_info_entry, UNKNOWN type);
-
-		public static void UserInfoEntrySetType(PurpleNotifyUserInfoEntry user_info_entry, PurpleNotifyUserInfoEntryType type)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void * purple_notify_uri(void * handle, char * uri)
 		 */
 		[DllImport("libpurple.dll")]
@@ -453,17 +245,18 @@ namespace PurpleWrapper
 
 		public static IntPtr Uri(IntPtr handle, string uri)
 		{
-			throw new NotImplementedException();
+			return purple_notify_uri(handle, uri);
 		}
 
 		/*
 		 * void purple_notify_close(PurpleNotifyType type, void * ui_handle)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_close(UNKNOWN type, IntPtr ui_handle);
+		private static extern void purple_notify_close(Notify.PurpleNotifyType type, IntPtr ui_handle);
 
-		public static void Close(PurpleNotifyType type, IntPtr ui_handle)
+		public static void Close(Notify.PurpleNotifyType type, IntPtr ui_handle)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -475,31 +268,23 @@ namespace PurpleWrapper
 
 		public static void CloseWithHandle(IntPtr handle)
 		{
-			throw new NotImplementedException();
+			purple_notify_close_with_handle(handle);
 		}
 
 		/*
 		 * void purple_notify_set_ui_ops(PurpleNotifyUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_notify_set_ui_ops in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_notify_set_ui_ops(IntPtr ops);
 
-		public static void SetUiOps(PurpleNotifyUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleNotifyUiOps * purple_notify_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_notify_get_ui_ops in file "notify.h".
+		 * Message: The type could not be resolved (PurpleNotifyUiOps * purple_notify_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_notify_get_ui_ops();
 
-		public static PurpleNotifyUiOps GetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_notify_get_handle()
 		 */
@@ -508,7 +293,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_notify_get_handle();
 		}
 
 		/*
@@ -519,7 +304,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_notify_init();
 		}
 
 		/*
@@ -530,7 +315,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_notify_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Ntlm.cs	92a5717a2815ff4058b0fff2e1da9dd8d4c0ba10
+++ libpurple/wrapper/Ntlm.cs	c6a1fca1a527a7df0c95ba0a440e9be9839ed79c
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,31 +48,23 @@ namespace PurpleWrapper
 
 		public static string GenType1(string hostname, string domain)
 		{
-			throw new NotImplementedException();
+			return purple_ntlm_gen_type1(hostname, domain);
 		}
 
 		/*
 		 * guint8 * purple_ntlm_parse_type2(gchar * type2, guint32 * flags)
+		 * 
+		 * Could not generate a wrapper for purple_ntlm_parse_type2 in file "ntlm.h".
+		 * Message: The type could not be resolved (guint8 * purple_ntlm_parse_type2(gchar * type2, guint32 * flags)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ntlm_parse_type2(string type2, IntPtr flags);
 
-		public static guint8 ParseType2(string type2, guint32 flags)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_ntlm_gen_type3(gchar * username, gchar * passw, gchar * hostname, gchar * domain, guint8 * nonce, guint32 * flags)
+		 * 
+		 * Could not generate a wrapper for purple_ntlm_gen_type3 in file "ntlm.h".
+		 * Message: The type could not be resolved (guint8 * nonce).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_ntlm_gen_type3(string username, string passw, string hostname, string domain, IntPtr nonce, IntPtr flags);
 
-		public static string GenType3(string username, string passw, string hostname, string domain, guint8 nonce, guint32 flags)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Plugin.cs	b812ff8d30fec18ed5474623d412787ba7b0c44b
+++ libpurple/wrapper/Plugin.cs	7634af0836dad44f16f8ee1fc60e0e40c4e4a330
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,73 +40,15 @@ namespace PurpleWrapper
 {
 	public class Plugin
 	{
-		/*
-		 * gboolean _FUNC_NAME( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool _FUNC_NAME(UNKNOWN );
-
-		public static bool _funcName( )
+		public enum PurplePluginType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_PLUGIN_UNKNOWN = -1,
+			PURPLE_PLUGIN_STANDARD = 0,
+			PURPLE_PLUGIN_LOADER,
+			PURPLE_PLUGIN_PROTOCOL
+		};
 
 		/*
-		 * gboolean _FUNC_NAME( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool _FUNC_NAME(UNKNOWN );
-
-		public static bool _funcName( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * return purple_plugin_register( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_plugin_register(UNKNOWN );
-
-		public static return Register( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_init_plugin(PurplePlugin * plugin)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_init_plugin(IntPtr plugin);
-
-		public static bool InitPlugin(PurplePlugin plugin)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_init_plugin(PurplePlugin * plugin)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_init_plugin(IntPtr plugin);
-
-		public static bool InitPlugin(PurplePlugin plugin)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * return purple_plugin_register( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_plugin_register(UNKNOWN );
-
-		public static return Register( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurplePlugin * purple_plugin_new(gboolean native, char * path)
 		 */
 		[DllImport("libpurple.dll")]
@@ -112,7 +56,7 @@ namespace PurpleWrapper
 
 		public static PurplePlugin New(bool native, string path)
 		{
-			throw new NotImplementedException();
+			return new PurplePlugin(purple_plugin_new(native, path));
 		}
 
 		/*
@@ -123,7 +67,7 @@ namespace PurpleWrapper
 
 		public static PurplePlugin Probe(string filename)
 		{
-			throw new NotImplementedException();
+			return new PurplePlugin(purple_plugin_probe(filename));
 		}
 
 		/*
@@ -134,7 +78,7 @@ namespace PurpleWrapper
 
 		public static bool Register(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_register(plugin.Reference);
 		}
 
 		/*
@@ -145,7 +89,7 @@ namespace PurpleWrapper
 
 		public static bool Load(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_load(plugin.Reference);
 		}
 
 		/*
@@ -156,7 +100,7 @@ namespace PurpleWrapper
 
 		public static bool Unload(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_unload(plugin.Reference);
 		}
 
 		/*
@@ -167,7 +111,7 @@ namespace PurpleWrapper
 
 		public static void Disable(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			purple_plugin_disable(plugin.Reference);
 		}
 
 		/*
@@ -178,7 +122,7 @@ namespace PurpleWrapper
 
 		public static bool Reload(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_reload(plugin.Reference);
 		}
 
 		/*
@@ -189,7 +133,7 @@ namespace PurpleWrapper
 
 		public static void Destroy(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			purple_plugin_destroy(plugin.Reference);
 		}
 
 		/*
@@ -200,7 +144,7 @@ namespace PurpleWrapper
 
 		public static bool IsLoaded(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_is_loaded(plugin.Reference);
 		}
 
 		/*
@@ -211,7 +155,7 @@ namespace PurpleWrapper
 
 		public static bool IsUnloadable(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_is_unloadable(plugin.Reference);
 		}
 
 		/*
@@ -222,7 +166,7 @@ namespace PurpleWrapper
 
 		public static string GetId(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_get_id(plugin.Reference);
 		}
 
 		/*
@@ -233,7 +177,7 @@ namespace PurpleWrapper
 
 		public static string GetName(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_get_name(plugin.Reference);
 		}
 
 		/*
@@ -244,7 +188,7 @@ namespace PurpleWrapper
 
 		public static string GetVersion(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_get_version(plugin.Reference);
 		}
 
 		/*
@@ -255,7 +199,7 @@ namespace PurpleWrapper
 
 		public static string GetSummary(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_get_summary(plugin.Reference);
 		}
 
 		/*
@@ -266,7 +210,7 @@ namespace PurpleWrapper
 
 		public static string GetDescription(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_get_description(plugin.Reference);
 		}
 
 		/*
@@ -277,7 +221,7 @@ namespace PurpleWrapper
 
 		public static string GetAuthor(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_get_author(plugin.Reference);
 		}
 
 		/*
@@ -288,21 +232,10 @@ namespace PurpleWrapper
 
 		public static string GetHomepage(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			return purple_plugin_get_homepage(plugin.Reference);
 		}
 
 		/*
-		 * gboolean purple_plugin_ipc_register(PurplePlugin * plugin, char * command, PurpleCallback func, PurpleSignalMarshalFunc marshal, PurpleValue * ret_value, int num_params, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_plugin_ipc_register(IntPtr plugin, string command, UNKNOWN func, UNKNOWN marshal, IntPtr ret_value, int num_params, ...);
-
-		public static bool IpcRegister(PurplePlugin plugin, string command, PurpleCallback func, PurpleSignalMarshalFunc marshal, PurpleValue ret_value, int num_params, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_plugin_ipc_unregister(PurplePlugin * plugin, char * command)
 		 */
 		[DllImport("libpurple.dll")]
@@ -310,7 +243,7 @@ namespace PurpleWrapper
 
 		public static void IpcUnregister(PurplePlugin plugin, string command)
 		{
-			throw new NotImplementedException();
+			purple_plugin_ipc_unregister(plugin.Reference, command);
 		}
 
 		/*
@@ -321,32 +254,10 @@ namespace PurpleWrapper
 
 		public static void IpcUnregisterAll(PurplePlugin plugin)
 		{
-			throw new NotImplementedException();
+			purple_plugin_ipc_unregister_all(plugin.Reference);
 		}
 
 		/*
-		 * gboolean purple_plugin_ipc_get_params(PurplePlugin * plugin, char * command, PurpleValue ** ret_value, int * num_params, PurpleValue *** params)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_plugin_ipc_get_params(IntPtr plugin, string command, IntPtr ret_value, IntPtr num_params, IntPtr params);
-
-		public static bool IpcGetParams(PurplePlugin plugin, string command, PurpleValue ret_value, int num_params, PurpleValue params)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_plugin_ipc_call(PurplePlugin * plugin, char * command, gboolean * ok, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_ipc_call(IntPtr plugin, string command, IntPtr ok, ...);
-
-		public static IntPtr IpcCall(PurplePlugin plugin, string command, gboolean ok, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_plugins_add_search_path(char * path)
 		 */
 		[DllImport("libpurple.dll")]
@@ -354,7 +265,7 @@ namespace PurpleWrapper
 
 		public static void PluginsAddSearchPath(string path)
 		{
-			throw new NotImplementedException();
+			purple_plugins_add_search_path(path);
 		}
 
 		/*
@@ -365,17 +276,18 @@ namespace PurpleWrapper
 
 		public static void PluginsUnloadAll()
 		{
-			throw new NotImplementedException();
+			purple_plugins_unload_all();
 		}
 
 		/*
 		 * void purple_plugins_unload(PurplePluginType type)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_plugins_unload(UNKNOWN type);
+		private static extern void purple_plugins_unload(Plugin.PurplePluginType type);
 
-		public static void PluginsUnload(PurplePluginType type)
+		public static void PluginsUnload(Plugin.PurplePluginType type)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -387,7 +299,7 @@ namespace PurpleWrapper
 
 		public static void PluginsDestroyAll()
 		{
-			throw new NotImplementedException();
+			purple_plugins_destroy_all();
 		}
 
 		/*
@@ -398,7 +310,7 @@ namespace PurpleWrapper
 
 		public static void PluginsSaveLoaded(string key)
 		{
-			throw new NotImplementedException();
+			purple_plugins_save_loaded(key);
 		}
 
 		/*
@@ -409,7 +321,7 @@ namespace PurpleWrapper
 
 		public static void PluginsLoadSaved(string key)
 		{
-			throw new NotImplementedException();
+			purple_plugins_load_saved(key);
 		}
 
 		/*
@@ -420,7 +332,7 @@ namespace PurpleWrapper
 
 		public static void PluginsProbe(string ext)
 		{
-			throw new NotImplementedException();
+			purple_plugins_probe(ext);
 		}
 
 		/*
@@ -431,76 +343,10 @@ namespace PurpleWrapper
 
 		public static bool PluginsEnabled()
 		{
-			throw new NotImplementedException();
+			return purple_plugins_enabled();
 		}
 
 		/*
-		 * void purple_plugins_register_probe_notify_cb( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugins_register_probe_notify_cb(UNKNOWN );
-
-		public static void PluginsRegisterProbeNotifyCb( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_plugins_unregister_probe_notify_cb( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugins_unregister_probe_notify_cb(UNKNOWN );
-
-		public static void PluginsUnregisterProbeNotifyCb( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_plugins_register_load_notify_cb( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugins_register_load_notify_cb(UNKNOWN );
-
-		public static void PluginsRegisterLoadNotifyCb( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_plugins_unregister_load_notify_cb( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugins_unregister_load_notify_cb(UNKNOWN );
-
-		public static void PluginsUnregisterLoadNotifyCb( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_plugins_register_unload_notify_cb( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugins_register_unload_notify_cb(UNKNOWN );
-
-		public static void PluginsRegisterUnloadNotifyCb( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_plugins_unregister_unload_notify_cb( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugins_unregister_unload_notify_cb(UNKNOWN );
-
-		public static void PluginsUnregisterUnloadNotifyCb( )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurplePlugin * purple_plugins_find_with_name(char * name)
 		 */
 		[DllImport("libpurple.dll")]
@@ -508,7 +354,7 @@ namespace PurpleWrapper
 
 		public static PurplePlugin PluginsFindWithName(string name)
 		{
-			throw new NotImplementedException();
+			return new PurplePlugin(purple_plugins_find_with_name(name));
 		}
 
 		/*
@@ -519,7 +365,7 @@ namespace PurpleWrapper
 
 		public static PurplePlugin PluginsFindWithFilename(string filename)
 		{
-			throw new NotImplementedException();
+			return new PurplePlugin(purple_plugins_find_with_filename(filename));
 		}
 
 		/*
@@ -530,7 +376,7 @@ namespace PurpleWrapper
 
 		public static PurplePlugin PluginsFindWithBasename(string basename)
 		{
-			throw new NotImplementedException();
+			return new PurplePlugin(purple_plugins_find_with_basename(basename));
 		}
 
 		/*
@@ -541,42 +387,30 @@ namespace PurpleWrapper
 
 		public static PurplePlugin PluginsFindWithId(string id)
 		{
-			throw new NotImplementedException();
+			return new PurplePlugin(purple_plugins_find_with_id(id));
 		}
 
 		/*
 		 * GList * purple_plugins_get_loaded()
+		 * 
+		 * Could not generate a wrapper for purple_plugins_get_loaded in file "plugin.h".
+		 * Message: The type could not be resolved (GList * purple_plugins_get_loaded()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugins_get_loaded();
 
-		public static GList PluginsGetLoaded()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_plugins_get_protocols()
+		 * 
+		 * Could not generate a wrapper for purple_plugins_get_protocols in file "plugin.h".
+		 * Message: The type could not be resolved (GList * purple_plugins_get_protocols()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugins_get_protocols();
 
-		public static GList PluginsGetProtocols()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_plugins_get_all()
+		 * 
+		 * Could not generate a wrapper for purple_plugins_get_all in file "plugin.h".
+		 * Message: The type could not be resolved (GList * purple_plugins_get_all()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugins_get_all();
 
-		public static GList PluginsGetAll()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_plugins_get_handle()
 		 */
@@ -585,7 +419,7 @@ namespace PurpleWrapper
 
 		public static IntPtr PluginsGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_plugins_get_handle();
 		}
 
 		/*
@@ -596,7 +430,7 @@ namespace PurpleWrapper
 
 		public static void PluginsInit()
 		{
-			throw new NotImplementedException();
+			purple_plugins_init();
 		}
 
 		/*
@@ -607,21 +441,10 @@ namespace PurpleWrapper
 
 		public static void PluginsUninit()
 		{
-			throw new NotImplementedException();
+			purple_plugins_uninit();
 		}
 
 		/*
-		 * PurplePluginAction * purple_plugin_action_new( ,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_action_new(UNKNOWN , UNKNOWN );
-
-		public static PurplePluginAction ActionNew( ,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_plugin_action_free(PurplePluginAction * action)
 		 */
 		[DllImport("libpurple.dll")]
@@ -629,7 +452,7 @@ namespace PurpleWrapper
 
 		public static void ActionFree(PurplePluginAction action)
 		{
-			throw new NotImplementedException();
+			purple_plugin_action_free(action.Reference);
 		}
 
 	}
============================================================
--- libpurple/wrapper/Pluginpref.cs	5bc34570e9845a5ba6eca9e2eb9a051057a25508
+++ libpurple/wrapper/Pluginpref.cs	930cb445a476260941f19f869906242526f3741f
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,281 +40,196 @@ namespace PurpleWrapper
 {
 	public class Pluginpref
 	{
+		public enum PurpleStringFormatType
+		{
+			PURPLE_STRING_FORMAT_TYPE_NONE = 0,
+			PURPLE_STRING_FORMAT_TYPE_MULTILINE = 1 << 0,
+			PURPLE_STRING_FORMAT_TYPE_HTML = 1 << 1
+		};
+
+		public enum PurplePluginPrefType
+		{
+			PURPLE_PLUGIN_PREF_NONE,
+			PURPLE_PLUGIN_PREF_CHOICE,
+			PURPLE_PLUGIN_PREF_INFO,
+			PURPLE_PLUGIN_PREF_STRING_FORMAT
+		};
+
 		/*
 		 * PurplePluginPrefFrame * purple_plugin_pref_frame_new()
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_frame_new in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPrefFrame * purple_plugin_pref_frame_new()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_pref_frame_new();
 
-		public static PurplePluginPrefFrame PluginPrefFrameNew()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_frame_destroy(PurplePluginPrefFrame * frame)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_frame_destroy in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPrefFrame * frame).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_frame_destroy(IntPtr frame);
 
-		public static void PluginPrefFrameDestroy(PurplePluginPrefFrame frame)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_frame_add(PurplePluginPrefFrame * frame, PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_frame_add in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPrefFrame * frame).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_frame_add(IntPtr frame, IntPtr pref);
 
-		public static void PluginPrefFrameAdd(PurplePluginPrefFrame frame, PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_plugin_pref_frame_get_prefs(PurplePluginPrefFrame * frame)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_frame_get_prefs in file "pluginpref.h".
+		 * Message: The type could not be resolved (GList * purple_plugin_pref_frame_get_prefs(PurplePluginPrefFrame * frame)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_pref_frame_get_prefs(IntPtr frame);
 
-		public static GList PluginPrefFrameGetPrefs(PurplePluginPrefFrame frame)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePluginPref * purple_plugin_pref_new()
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_new in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * purple_plugin_pref_new()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_pref_new();
 
-		public static PurplePluginPref PluginPrefNew()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePluginPref * purple_plugin_pref_new_with_name(char * name)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_new_with_name in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * purple_plugin_pref_new_with_name(char * name)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_pref_new_with_name(string name);
 
-		public static PurplePluginPref PluginPrefNewWithName(string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePluginPref * purple_plugin_pref_new_with_label(char * label)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_new_with_label in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * purple_plugin_pref_new_with_label(char * label)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_pref_new_with_label(string label);
 
-		public static PurplePluginPref PluginPrefNewWithLabel(string label)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePluginPref * purple_plugin_pref_new_with_name_and_label(char * name, char * label)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_new_with_name_and_label in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * purple_plugin_pref_new_with_name_and_label(char * name, char * label)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_pref_new_with_name_and_label(string name, string label);
 
-		public static PurplePluginPref PluginPrefNewWithNameAndLabel(string name, string label)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_destroy(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_destroy in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_destroy(IntPtr pref);
 
-		public static void PluginPrefDestroy(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_set_name(PurplePluginPref * pref, char * name)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_set_name in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_set_name(IntPtr pref, string name);
 
-		public static void PluginPrefSetName(PurplePluginPref pref, string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_plugin_pref_get_name(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_name in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_plugin_pref_get_name(IntPtr pref);
 
-		public static string PluginPrefGetName(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_set_label(PurplePluginPref * pref, char * label)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_set_label in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_set_label(IntPtr pref, string label);
 
-		public static void PluginPrefSetLabel(PurplePluginPref pref, string label)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_plugin_pref_get_label(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_label in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_plugin_pref_get_label(IntPtr pref);
 
-		public static string PluginPrefGetLabel(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_set_bounds(PurplePluginPref * pref, int min, int max)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_set_bounds in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_set_bounds(IntPtr pref, int min, int max);
 
-		public static void PluginPrefSetBounds(PurplePluginPref pref, int min, int max)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_get_bounds(PurplePluginPref * pref, int * min, int * max)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_bounds in file "pluginpref.h".
+		 * Message: The type could not be resolved (int * min).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_get_bounds(IntPtr pref, IntPtr min, IntPtr max);
 
-		public static void PluginPrefGetBounds(PurplePluginPref pref, int min, int max)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_set_type(PurplePluginPref * pref, PurplePluginPrefType type)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_set_type in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_set_type(IntPtr pref, UNKNOWN type);
 
-		public static void PluginPrefSetType(PurplePluginPref pref, PurplePluginPrefType type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePluginPrefType purple_plugin_pref_get_type(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_type in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_plugin_pref_get_type(IntPtr pref);
 
-		public static PurplePluginPrefType PluginPrefGetType(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_add_choice(PurplePluginPref * pref, char * label, gpointer choice)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_add_choice in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_add_choice(IntPtr pref, string label, IntPtr choice);
 
-		public static void PluginPrefAddChoice(PurplePluginPref pref, string label, IntPtr choice)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_plugin_pref_get_choices(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_choices in file "pluginpref.h".
+		 * Message: The type could not be resolved (GList * purple_plugin_pref_get_choices(PurplePluginPref * pref)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_plugin_pref_get_choices(IntPtr pref);
 
-		public static GList PluginPrefGetChoices(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_plugin_pref_set_max_length(PurplePluginPref * pref, unsigned int)
+		 * void purple_plugin_pref_set_max_length(PurplePluginPref * pref, unsigned int max_length)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_set_max_length in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_set_max_length(IntPtr pref, UNKNOWN int);
 
-		public static void PluginPrefSetMaxLength(PurplePluginPref pref, unsigned int)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * int purple_plugin_pref_get_max_length(PurplePluginPref * pref)
+		 * unsigned int purple_plugin_pref_get_max_length(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_max_length in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_plugin_pref_get_max_length(IntPtr pref);
 
-		public static int PluginPrefGetMaxLength(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_set_masked(PurplePluginPref * pref, gboolean mask)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_set_masked in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_set_masked(IntPtr pref, bool mask);
 
-		public static void PluginPrefSetMasked(PurplePluginPref pref, bool mask)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_plugin_pref_get_masked(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_masked in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_plugin_pref_get_masked(IntPtr pref);
 
-		public static bool PluginPrefGetMasked(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_plugin_pref_set_format_type(PurplePluginPref * pref, PurpleStringFormatType format)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_set_format_type in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_plugin_pref_set_format_type(IntPtr pref, UNKNOWN format);
 
-		public static void PluginPrefSetFormatType(PurplePluginPref pref, PurpleStringFormatType format)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleStringFormatType purple_plugin_pref_get_format_type(PurplePluginPref * pref)
+		 * 
+		 * Could not generate a wrapper for purple_plugin_pref_get_format_type in file "pluginpref.h".
+		 * Message: The type could not be resolved (PurplePluginPref * pref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_plugin_pref_get_format_type(IntPtr pref);
 
-		public static PurpleStringFormatType PluginPrefGetFormatType(PurplePluginPref pref)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Pounce.cs	d73876a171f1f42bb9cde032f393a4d9bc30095a
+++ libpurple/wrapper/Pounce.cs	5ae50b0aa66da74eb091182dfa1ed663e06c4c24
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,16 +40,26 @@ namespace PurpleWrapper
 {
 	public class Pounce
 	{
-		/*
-		 * PurplePounce * purple_pounce_new(char * ui_type, PurpleAccount * pouncer, char * pouncee, PurplePounceEvent event, PurplePounceOption option)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_pounce_new(string ui_type, IntPtr pouncer, string pouncee, UNKNOWN event, UNKNOWN option);
+		public enum PurplePounceEvent
+		{
+			PURPLE_POUNCE_NONE = 0x000,
+			PURPLE_POUNCE_SIGNON = 0x001,
+			PURPLE_POUNCE_SIGNOFF = 0x002,
+			PURPLE_POUNCE_AWAY = 0x004,
+			PURPLE_POUNCE_AWAY_RETURN = 0x008,
+			PURPLE_POUNCE_IDLE = 0x010,
+			PURPLE_POUNCE_IDLE_RETURN = 0x020,
+			PURPLE_POUNCE_TYPING = 0x040,
+			PURPLE_POUNCE_TYPED = 0x080,
+			PURPLE_POUNCE_TYPING_STOPPED = 0x100,
+			PURPLE_POUNCE_MESSAGE_RECEIVED = 0x200
+		};
 
-		public static PurplePounce New(string ui_type, PurpleAccount pouncer, string pouncee, PurplePounceEvent event, PurplePounceOption option)
+		public enum PurplePounceOption
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_POUNCE_OPTION_NONE = 0x00,
+			PURPLE_POUNCE_OPTION_AWAY = 0x01
+		};
 
 		/*
 		 * void purple_pounce_destroy(PurplePounce * pounce)
@@ -57,7 +69,7 @@ namespace PurpleWrapper
 
 		public static void Destroy(PurplePounce pounce)
 		{
-			throw new NotImplementedException();
+			purple_pounce_destroy(pounce.Reference);
 		}
 
 		/*
@@ -68,17 +80,18 @@ namespace PurpleWrapper
 
 		public static void DestroyAllByAccount(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_pounce_destroy_all_by_account(account.Reference);
 		}
 
 		/*
 		 * void purple_pounce_set_events(PurplePounce * pounce, PurplePounceEvent events)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_pounce_set_events(IntPtr pounce, UNKNOWN events);
+		private static extern void purple_pounce_set_events(IntPtr pounce, Pounce.PurplePounceEvent events);
 
-		public static void SetEvents(PurplePounce pounce, PurplePounceEvent events)
+		public static void SetEvents(PurplePounce pounce, Pounce.PurplePounceEvent events)
 		{
+			/* Unable to process events, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -86,10 +99,11 @@ namespace PurpleWrapper
 		 * void purple_pounce_set_options(PurplePounce * pounce, PurplePounceOption options)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_pounce_set_options(IntPtr pounce, UNKNOWN options);
+		private static extern void purple_pounce_set_options(IntPtr pounce, Pounce.PurplePounceOption options);
 
-		public static void SetOptions(PurplePounce pounce, PurplePounceOption options)
+		public static void SetOptions(PurplePounce pounce, Pounce.PurplePounceOption options)
 		{
+			/* Unable to process options, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -101,7 +115,7 @@ namespace PurpleWrapper
 
 		public static void SetPouncer(PurplePounce pounce, PurpleAccount pouncer)
 		{
-			throw new NotImplementedException();
+			purple_pounce_set_pouncer(pounce.Reference, pouncer.Reference);
 		}
 
 		/*
@@ -112,7 +126,7 @@ namespace PurpleWrapper
 
 		public static void SetPouncee(PurplePounce pounce, string pouncee)
 		{
-			throw new NotImplementedException();
+			purple_pounce_set_pouncee(pounce.Reference, pouncee);
 		}
 
 		/*
@@ -123,7 +137,7 @@ namespace PurpleWrapper
 
 		public static void SetSave(PurplePounce pounce, bool save)
 		{
-			throw new NotImplementedException();
+			purple_pounce_set_save(pounce.Reference, save);
 		}
 
 		/*
@@ -134,32 +148,10 @@ namespace PurpleWrapper
 
 		public static void ActionRegister(PurplePounce pounce, string name)
 		{
-			throw new NotImplementedException();
+			purple_pounce_action_register(pounce.Reference, name);
 		}
 
 		/*
-		 * void purple_pounce_action_set_enabled(PurplePounce * pounce, char * action, gboolean enabled)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_pounce_action_set_enabled(IntPtr pounce, string action, bool enabled);
-
-		public static void ActionSetEnabled(PurplePounce pounce, string action, bool enabled)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_pounce_action_set_attribute(PurplePounce * pounce, char * action, char * attr, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_pounce_action_set_attribute(IntPtr pounce, string action, string attr, string value);
-
-		public static void ActionSetAttribute(PurplePounce pounce, string action, string attr, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_pounce_set_data(PurplePounce * pounce, void * data)
 		 */
 		[DllImport("libpurple.dll")]
@@ -167,29 +159,31 @@ namespace PurpleWrapper
 
 		public static void SetData(PurplePounce pounce, IntPtr data)
 		{
-			throw new NotImplementedException();
+			purple_pounce_set_data(pounce.Reference, data);
 		}
 
 		/*
 		 * PurplePounceEvent purple_pounce_get_events(PurplePounce * pounce)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_pounce_get_events(IntPtr pounce);
+		private static extern Pounce.PurplePounceEvent purple_pounce_get_events(IntPtr pounce);
 
-		public static PurplePounceEvent GetEvents(PurplePounce pounce)
+		public static Pounce.PurplePounceEvent GetEvents(PurplePounce pounce)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_pounce_get_events, a KnownEnum. */
+			
 		}
 
 		/*
 		 * PurplePounceOption purple_pounce_get_options(PurplePounce * pounce)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_pounce_get_options(IntPtr pounce);
+		private static extern Pounce.PurplePounceOption purple_pounce_get_options(IntPtr pounce);
 
-		public static PurplePounceOption GetOptions(PurplePounce pounce)
+		public static Pounce.PurplePounceOption GetOptions(PurplePounce pounce)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_pounce_get_options, a KnownEnum. */
+			
 		}
 
 		/*
@@ -200,7 +194,7 @@ namespace PurpleWrapper
 
 		public static PurpleAccount GetPouncer(PurplePounce pounce)
 		{
-			throw new NotImplementedException();
+			return new PurpleAccount(purple_pounce_get_pouncer(pounce.Reference));
 		}
 
 		/*
@@ -211,7 +205,7 @@ namespace PurpleWrapper
 
 		public static string GetPouncee(PurplePounce pounce)
 		{
-			throw new NotImplementedException();
+			return purple_pounce_get_pouncee(pounce.Reference);
 		}
 
 		/*
@@ -222,32 +216,10 @@ namespace PurpleWrapper
 
 		public static bool GetSave(PurplePounce pounce)
 		{
-			throw new NotImplementedException();
+			return purple_pounce_get_save(pounce.Reference);
 		}
 
 		/*
-		 * gboolean purple_pounce_action_is_enabled(PurplePounce * pounce, char * action)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_pounce_action_is_enabled(IntPtr pounce, string action);
-
-		public static bool ActionIsEnabled(PurplePounce pounce, string action)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_pounce_action_get_attribute(PurplePounce * pounce, char * action, char * attr)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_pounce_action_get_attribute(IntPtr pounce, string action, string attr);
-
-		public static string ActionGetAttribute(PurplePounce pounce, string action, string attr)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void * purple_pounce_get_data(PurplePounce * pounce)
 		 */
 		[DllImport("libpurple.dll")]
@@ -255,32 +227,10 @@ namespace PurpleWrapper
 
 		public static IntPtr GetData(PurplePounce pounce)
 		{
-			throw new NotImplementedException();
+			return purple_pounce_get_data(pounce.Reference);
 		}
 
 		/*
-		 * void purple_pounce_execute(PurpleAccount * pouncer, char * pouncee, PurplePounceEvent events)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_pounce_execute(IntPtr pouncer, string pouncee, UNKNOWN events);
-
-		public static void Execute(PurpleAccount pouncer, string pouncee, PurplePounceEvent events)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurplePounce * purple_find_pounce(PurpleAccount * pouncer, char * pouncee, PurplePounceEvent events)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_find_pounce(IntPtr pouncer, string pouncee, UNKNOWN events);
-
-		public static PurplePounce FindPounce(PurpleAccount pouncer, string pouncee, PurplePounceEvent events)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_pounces_load()
 		 */
 		[DllImport("libpurple.dll")]
@@ -288,21 +238,10 @@ namespace PurpleWrapper
 
 		public static bool PouncesLoad()
 		{
-			throw new NotImplementedException();
+			return purple_pounces_load();
 		}
 
 		/*
-		 * void purple_pounces_register_handler(char * ui, PurplePounceCb cb,  )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_pounces_register_handler(string ui, UNKNOWN cb, UNKNOWN );
-
-		public static void PouncesRegisterHandler(string ui, PurplePounceCb cb,  )
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_pounces_unregister_handler(char * ui)
 		 */
 		[DllImport("libpurple.dll")]
@@ -310,31 +249,23 @@ namespace PurpleWrapper
 
 		public static void PouncesUnregisterHandler(string ui)
 		{
-			throw new NotImplementedException();
+			purple_pounces_unregister_handler(ui);
 		}
 
 		/*
 		 * GList * purple_pounces_get_all()
+		 * 
+		 * Could not generate a wrapper for purple_pounces_get_all in file "pounce.h".
+		 * Message: The type could not be resolved (GList * purple_pounces_get_all()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_pounces_get_all();
 
-		public static GList PouncesGetAll()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_pounces_get_all_for_ui(char * ui)
+		 * 
+		 * Could not generate a wrapper for purple_pounces_get_all_for_ui in file "pounce.h".
+		 * Message: The type could not be resolved (GList * purple_pounces_get_all_for_ui(char * ui)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_pounces_get_all_for_ui(string ui);
 
-		public static GList PouncesGetAllForUi(string ui)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_pounces_get_handle()
 		 */
@@ -343,7 +274,7 @@ namespace PurpleWrapper
 
 		public static IntPtr PouncesGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_pounces_get_handle();
 		}
 
 		/*
@@ -354,7 +285,7 @@ namespace PurpleWrapper
 
 		public static void PouncesInit()
 		{
-			throw new NotImplementedException();
+			purple_pounces_init();
 		}
 
 		/*
@@ -365,7 +296,7 @@ namespace PurpleWrapper
 
 		public static void PouncesUninit()
 		{
-			throw new NotImplementedException();
+			purple_pounces_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Prefs.cs	efd47832daa59dfcf43fa14679d89011ea69409c
+++ libpurple/wrapper/Prefs.cs	fcd050772520a62821abed53fb3a9cd575a1e762
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,6 +40,17 @@ namespace PurpleWrapper
 {
 	public class Prefs
 	{
+		public enum PurplePrefType
+		{
+			PURPLE_PREF_NONE,
+			PURPLE_PREF_BOOLEAN,
+			PURPLE_PREF_INT,
+			PURPLE_PREF_STRING,
+			PURPLE_PREF_STRING_LIST,
+			PURPLE_PREF_PATH,
+			PURPLE_PREF_PATH_LIST
+		};
+
 		/*
 		 * void * purple_prefs_get_handle()
 		 */
@@ -46,7 +59,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_prefs_get_handle();
 		}
 
 		/*
@@ -57,7 +70,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_prefs_init();
 		}
 
 		/*
@@ -68,7 +81,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_prefs_uninit();
 		}
 
 		/*
@@ -79,7 +92,7 @@ namespace PurpleWrapper
 
 		public static void AddNone(string name)
 		{
-			throw new NotImplementedException();
+			purple_prefs_add_none(name);
 		}
 
 		/*
@@ -90,7 +103,7 @@ namespace PurpleWrapper
 
 		public static void AddBool(string name, bool value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_add_bool(name, value);
 		}
 
 		/*
@@ -101,7 +114,7 @@ namespace PurpleWrapper
 
 		public static void AddInt(string name, int value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_add_int(name, value);
 		}
 
 		/*
@@ -112,20 +125,16 @@ namespace PurpleWrapper
 
 		public static void AddString(string name, string value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_add_string(name, value);
 		}
 
 		/*
 		 * void purple_prefs_add_string_list(char * name, GList * value)
+		 * 
+		 * Could not generate a wrapper for purple_prefs_add_string_list in file "prefs.h".
+		 * Message: The type could not be resolved (GList * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prefs_add_string_list(string name, IntPtr value);
 
-		public static void AddStringList(string name, GList value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_prefs_add_path(char * name, char * value)
 		 */
@@ -134,20 +143,16 @@ namespace PurpleWrapper
 
 		public static void AddPath(string name, string value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_add_path(name, value);
 		}
 
 		/*
 		 * void purple_prefs_add_path_list(char * name, GList * value)
+		 * 
+		 * Could not generate a wrapper for purple_prefs_add_path_list in file "prefs.h".
+		 * Message: The type could not be resolved (GList * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prefs_add_path_list(string name, IntPtr value);
 
-		public static void AddPathList(string name, GList value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_prefs_remove(char * name)
 		 */
@@ -156,7 +161,7 @@ namespace PurpleWrapper
 
 		public static void Remove(string name)
 		{
-			throw new NotImplementedException();
+			purple_prefs_remove(name);
 		}
 
 		/*
@@ -167,7 +172,7 @@ namespace PurpleWrapper
 
 		public static void Rename(string oldname, string newname)
 		{
-			throw new NotImplementedException();
+			purple_prefs_rename(oldname, newname);
 		}
 
 		/*
@@ -178,7 +183,7 @@ namespace PurpleWrapper
 
 		public static void RenameBooleanToggle(string oldname, string newname)
 		{
-			throw new NotImplementedException();
+			purple_prefs_rename_boolean_toggle(oldname, newname);
 		}
 
 		/*
@@ -189,7 +194,7 @@ namespace PurpleWrapper
 
 		public static void Destroy()
 		{
-			throw new NotImplementedException();
+			purple_prefs_destroy();
 		}
 
 		/*
@@ -200,7 +205,7 @@ namespace PurpleWrapper
 
 		public static void SetGeneric(string name, IntPtr value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_set_generic(name, value);
 		}
 
 		/*
@@ -211,7 +216,7 @@ namespace PurpleWrapper
 
 		public static void SetBool(string name, bool value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_set_bool(name, value);
 		}
 
 		/*
@@ -222,7 +227,7 @@ namespace PurpleWrapper
 
 		public static void SetInt(string name, int value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_set_int(name, value);
 		}
 
 		/*
@@ -233,20 +238,16 @@ namespace PurpleWrapper
 
 		public static void SetString(string name, string value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_set_string(name, value);
 		}
 
 		/*
 		 * void purple_prefs_set_string_list(char * name, GList * value)
+		 * 
+		 * Could not generate a wrapper for purple_prefs_set_string_list in file "prefs.h".
+		 * Message: The type could not be resolved (GList * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prefs_set_string_list(string name, IntPtr value);
 
-		public static void SetStringList(string name, GList value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_prefs_set_path(char * name, char * value)
 		 */
@@ -255,20 +256,16 @@ namespace PurpleWrapper
 
 		public static void SetPath(string name, string value)
 		{
-			throw new NotImplementedException();
+			purple_prefs_set_path(name, value);
 		}
 
 		/*
 		 * void purple_prefs_set_path_list(char * name, GList * value)
+		 * 
+		 * Could not generate a wrapper for purple_prefs_set_path_list in file "prefs.h".
+		 * Message: The type could not be resolved (GList * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prefs_set_path_list(string name, IntPtr value);
 
-		public static void SetPathList(string name, GList value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_prefs_exists(char * name)
 		 */
@@ -277,18 +274,19 @@ namespace PurpleWrapper
 
 		public static bool Exists(string name)
 		{
-			throw new NotImplementedException();
+			return purple_prefs_exists(name);
 		}
 
 		/*
 		 * PurplePrefType purple_prefs_get_type(char * name)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_prefs_get_type(string name);
+		private static extern Prefs.PurplePrefType purple_prefs_get_type(string name);
 
-		public static PurplePrefType GetType(string name)
+		public static Prefs.PurplePrefType GetType(string name)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_prefs_get_type, a KnownEnum. */
+			
 		}
 
 		/*
@@ -299,7 +297,7 @@ namespace PurpleWrapper
 
 		public static bool GetBool(string name)
 		{
-			throw new NotImplementedException();
+			return purple_prefs_get_bool(name);
 		}
 
 		/*
@@ -310,7 +308,7 @@ namespace PurpleWrapper
 
 		public static int GetInt(string name)
 		{
-			throw new NotImplementedException();
+			return purple_prefs_get_int(name);
 		}
 
 		/*
@@ -321,20 +319,16 @@ namespace PurpleWrapper
 
 		public static string GetString(string name)
 		{
-			throw new NotImplementedException();
+			return purple_prefs_get_string(name);
 		}
 
 		/*
 		 * GList * purple_prefs_get_string_list(char * name)
+		 * 
+		 * Could not generate a wrapper for purple_prefs_get_string_list in file "prefs.h".
+		 * Message: The type could not be resolved (GList * purple_prefs_get_string_list(char * name)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_prefs_get_string_list(string name);
 
-		public static GList GetStringList(string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_prefs_get_path(char * name)
 		 */
@@ -343,43 +337,24 @@ namespace PurpleWrapper
 
 		public static string GetPath(string name)
 		{
-			throw new NotImplementedException();
+			return purple_prefs_get_path(name);
 		}
 
 		/*
 		 * GList * purple_prefs_get_path_list(char * name)
+		 * 
+		 * Could not generate a wrapper for purple_prefs_get_path_list in file "prefs.h".
+		 * Message: The type could not be resolved (GList * purple_prefs_get_path_list(char * name)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_prefs_get_path_list(string name);
 
-		public static GList GetPathList(string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_prefs_get_children_names(char * name)
+		 * 
+		 * Could not generate a wrapper for purple_prefs_get_children_names in file "prefs.h".
+		 * Message: The type could not be resolved (GList * purple_prefs_get_children_names(char * name)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_prefs_get_children_names(string name);
 
-		public static GList GetChildrenNames(string name)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * guint purple_prefs_connect_callback(void * handle, char * name, PurplePrefCallback cb, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern uint purple_prefs_connect_callback(IntPtr handle, string name, UNKNOWN cb, IntPtr data);
-
-		public static uint ConnectCallback(IntPtr handle, string name, PurplePrefCallback cb, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_prefs_disconnect_callback(guint callback_id)
 		 */
 		[DllImport("libpurple.dll")]
@@ -387,7 +362,7 @@ namespace PurpleWrapper
 
 		public static void DisconnectCallback(uint callback_id)
 		{
-			throw new NotImplementedException();
+			purple_prefs_disconnect_callback(callback_id);
 		}
 
 		/*
@@ -398,7 +373,7 @@ namespace PurpleWrapper
 
 		public static void DisconnectByHandle(IntPtr handle)
 		{
-			throw new NotImplementedException();
+			purple_prefs_disconnect_by_handle(handle);
 		}
 
 		/*
@@ -409,7 +384,7 @@ namespace PurpleWrapper
 
 		public static void TriggerCallback(string name)
 		{
-			throw new NotImplementedException();
+			purple_prefs_trigger_callback(name);
 		}
 
 		/*
@@ -420,7 +395,7 @@ namespace PurpleWrapper
 
 		public static bool Load()
 		{
-			throw new NotImplementedException();
+			return purple_prefs_load();
 		}
 
 		/*
@@ -431,7 +406,7 @@ namespace PurpleWrapper
 
 		public static void UpdateOld()
 		{
-			throw new NotImplementedException();
+			purple_prefs_update_old();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Privacy.cs	dea43fea4b6136d9a31f6dc1a421e969ee2c4848
+++ libpurple/wrapper/Privacy.cs	70658146080aa90c4246b8b12ef321b453e77310
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,73 +40,16 @@ namespace PurpleWrapper
 {
 	public class Privacy
 	{
-		/*
-		 * gboolean purple_privacy_permit_add(PurpleAccount * account, char * name, gboolean local_only)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_privacy_permit_add(IntPtr account, string name, bool local_only);
-
-		public static bool PermitAdd(PurpleAccount account, string name, bool local_only)
+		public enum PurplePrivacyType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_PRIVACY_ALLOW_ALL = 1,
+			PURPLE_PRIVACY_DENY_ALL,
+			PURPLE_PRIVACY_ALLOW_USERS,
+			PURPLE_PRIVACY_DENY_USERS,
+			PURPLE_PRIVACY_ALLOW_BUDDYLIST
+		};
 
 		/*
-		 * gboolean purple_privacy_permit_remove(PurpleAccount * account, char * name, gboolean local_only)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_privacy_permit_remove(IntPtr account, string name, bool local_only);
-
-		public static bool PermitRemove(PurpleAccount account, string name, bool local_only)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_privacy_deny_add(PurpleAccount * account, char * name, gboolean local_only)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_privacy_deny_add(IntPtr account, string name, bool local_only);
-
-		public static bool DenyAdd(PurpleAccount account, string name, bool local_only)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_privacy_deny_remove(PurpleAccount * account, char * name, gboolean local_only)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_privacy_deny_remove(IntPtr account, string name, bool local_only);
-
-		public static bool DenyRemove(PurpleAccount account, string name, bool local_only)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_privacy_allow(PurpleAccount * account, char * who, gboolean local, gboolean restore)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_privacy_allow(IntPtr account, string who, bool local, bool restore);
-
-		public static void Allow(PurpleAccount account, string who, bool local, bool restore)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_privacy_deny(PurpleAccount * account, char * who, gboolean local, gboolean restore)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_privacy_deny(IntPtr account, string who, bool local, bool restore);
-
-		public static void Deny(PurpleAccount account, string who, bool local, bool restore)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_privacy_check(PurpleAccount * account, char * who)
 		 */
 		[DllImport("libpurple.dll")]
@@ -112,31 +57,23 @@ namespace PurpleWrapper
 
 		public static bool Check(PurpleAccount account, string who)
 		{
-			throw new NotImplementedException();
+			return purple_privacy_check(account.Reference, who);
 		}
 
 		/*
 		 * void purple_privacy_set_ui_ops(PurplePrivacyUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_privacy_set_ui_ops in file "privacy.h".
+		 * Message: The type could not be resolved (PurplePrivacyUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_privacy_set_ui_ops(IntPtr ops);
 
-		public static void SetUiOps(PurplePrivacyUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePrivacyUiOps * purple_privacy_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_privacy_get_ui_ops in file "privacy.h".
+		 * Message: The type could not be resolved (PurplePrivacyUiOps * purple_privacy_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_privacy_get_ui_ops();
 
-		public static PurplePrivacyUiOps GetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_privacy_init()
 		 */
@@ -145,7 +82,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_privacy_init();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Proxy.cs	77fb0b88d96aacf393f246c64704cabde6ac10f1
+++ libpurple/wrapper/Proxy.cs	1deacb96f025f790b85142e8014e8bd7669a0101
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,160 +40,114 @@ namespace PurpleWrapper
 {
 	public class Proxy
 	{
+		public enum PurpleProxyType
+		{
+			PURPLE_PROXY_USE_GLOBAL = -1,
+			PURPLE_PROXY_NONE = 0,
+			PURPLE_PROXY_HTTP,
+			PURPLE_PROXY_SOCKS4,
+			PURPLE_PROXY_SOCKS5,
+			PURPLE_PROXY_USE_ENVVAR
+		};
+
 		/*
 		 * PurpleProxyInfo * purple_proxy_info_new()
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_new in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * purple_proxy_info_new()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_proxy_info_new();
 
-		public static PurpleProxyInfo InfoNew()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_proxy_info_destroy(PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_destroy in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_proxy_info_destroy(IntPtr info);
 
-		public static void InfoDestroy(PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_proxy_info_set_type(PurpleProxyInfo * info, PurpleProxyType type)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_set_type in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_proxy_info_set_type(IntPtr info, UNKNOWN type);
 
-		public static void InfoSetType(PurpleProxyInfo info, PurpleProxyType type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_proxy_info_set_host(PurpleProxyInfo * info, char * host)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_set_host in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_proxy_info_set_host(IntPtr info, string host);
 
-		public static void InfoSetHost(PurpleProxyInfo info, string host)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_proxy_info_set_port(PurpleProxyInfo * info, int port)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_set_port in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_proxy_info_set_port(IntPtr info, int port);
 
-		public static void InfoSetPort(PurpleProxyInfo info, int port)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_proxy_info_set_username(PurpleProxyInfo * info, char * username)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_set_username in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_proxy_info_set_username(IntPtr info, string username);
 
-		public static void InfoSetUsername(PurpleProxyInfo info, string username)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_proxy_info_set_password(PurpleProxyInfo * info, char * password)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_set_password in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_proxy_info_set_password(IntPtr info, string password);
 
-		public static void InfoSetPassword(PurpleProxyInfo info, string password)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleProxyType purple_proxy_info_get_type(PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_get_type in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_proxy_info_get_type(IntPtr info);
 
-		public static PurpleProxyType InfoGetType(PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_proxy_info_get_host(PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_get_host in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_proxy_info_get_host(IntPtr info);
 
-		public static string InfoGetHost(PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * int purple_proxy_info_get_port(PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_get_port in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_proxy_info_get_port(IntPtr info);
 
-		public static int InfoGetPort(PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_proxy_info_get_username(PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_get_username in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_proxy_info_get_username(IntPtr info);
 
-		public static string InfoGetUsername(PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_proxy_info_get_password(PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_info_get_password in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_proxy_info_get_password(IntPtr info);
 
-		public static string InfoGetPassword(PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleProxyInfo * purple_global_proxy_get_info()
+		 * 
+		 * Could not generate a wrapper for purple_global_proxy_get_info in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * purple_global_proxy_get_info()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_global_proxy_get_info();
 
-		public static PurpleProxyInfo GlobalProxyGetInfo()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_global_proxy_set_info(PurpleProxyInfo * info)
+		 * 
+		 * Could not generate a wrapper for purple_global_proxy_set_info in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * info).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_global_proxy_set_info(IntPtr info);
 
-		public static void GlobalProxySetInfo(PurpleProxyInfo info)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_proxy_get_handle()
 		 */
@@ -200,7 +156,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_proxy_get_handle();
 		}
 
 		/*
@@ -211,7 +167,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_proxy_init();
 		}
 
 		/*
@@ -222,64 +178,23 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_proxy_uninit();
 		}
 
 		/*
 		 * PurpleProxyInfo * purple_proxy_get_setup(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_get_setup in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyInfo * purple_proxy_get_setup(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_proxy_get_setup(IntPtr account);
 
-		public static PurpleProxyInfo GetSetup(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleProxyConnectData * purple_proxy_connect(void * handle, PurpleAccount * account, char * host, int port, PurpleProxyConnectFunction connect_cb, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_proxy_connect(IntPtr handle, IntPtr account, string host, int port, UNKNOWN connect_cb, IntPtr data);
-
-		public static PurpleProxyConnectData Connect(IntPtr handle, PurpleAccount account, string host, int port, PurpleProxyConnectFunction connect_cb, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleProxyConnectData * purple_proxy_connect_udp(void * handle, PurpleAccount * account, char * host, int port, PurpleProxyConnectFunction connect_cb, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_proxy_connect_udp(IntPtr handle, IntPtr account, string host, int port, UNKNOWN connect_cb, IntPtr data);
-
-		public static PurpleProxyConnectData ConnectUdp(IntPtr handle, PurpleAccount account, string host, int port, PurpleProxyConnectFunction connect_cb, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleProxyConnectData * purple_proxy_connect_socks5(void * handle, PurpleProxyInfo * gpi, char * host, int port, PurpleProxyConnectFunction connect_cb, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_proxy_connect_socks5(IntPtr handle, IntPtr gpi, string host, int port, UNKNOWN connect_cb, IntPtr data);
-
-		public static PurpleProxyConnectData ConnectSocks5(IntPtr handle, PurpleProxyInfo gpi, string host, int port, PurpleProxyConnectFunction connect_cb, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_proxy_connect_cancel(PurpleProxyConnectData * connect_data)
+		 * 
+		 * Could not generate a wrapper for purple_proxy_connect_cancel in file "proxy.h".
+		 * Message: The type could not be resolved (PurpleProxyConnectData * connect_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_proxy_connect_cancel(IntPtr connect_data);
 
-		public static void ConnectCancel(PurpleProxyConnectData connect_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_proxy_connect_cancel_with_handle(void * handle)
 		 */
@@ -288,7 +203,7 @@ namespace PurpleWrapper
 
 		public static void ConnectCancelWithHandle(IntPtr handle)
 		{
-			throw new NotImplementedException();
+			purple_proxy_connect_cancel_with_handle(handle);
 		}
 
 	}
============================================================
--- libpurple/wrapper/Prpl.cs	881501dece6309dc38f5c610ff8b41b18276d74c
+++ libpurple/wrapper/Prpl.cs	2c4af579392a0151f8f46e88aae823657673545b
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,28 +40,32 @@ namespace PurpleWrapper
 {
 	public class Prpl
 	{
-		/*
-		 * unsigned int( )
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN int(UNKNOWN );
+		public enum PurpleIconScaleRules
+		{
+			PURPLE_ICON_SCALE_DISPLAY = 0x01,
+			PURPLE_ICON_SCALE_SEND = 0x02
+		};
 
-		public static unsigned Int( )
+		public enum PurpleProtocolOptions
 		{
-			throw new NotImplementedException();
-		}
+			OPT_PROTO_UNIQUE_CHATNAME = 0x00000004,
+			OPT_PROTO_CHAT_TOPIC = 0x00000008,
+			OPT_PROTO_NO_PASSWORD = 0x00000010,
+			OPT_PROTO_MAIL_CHECK = 0x00000020,
+			OPT_PROTO_IM_IMAGE = 0x00000040,
+			OPT_PROTO_PASSWORD_OPTIONAL = 0x00000080,
+			OPT_PROTO_USE_POINTSIZE = 0x00000100,
+			OPT_PROTO_REGISTER_NOSCREENNAME = 0x00000200,
+			OPT_PROTO_SLASH_COMMANDS_NATIVE = 0x00000400
+		};
 
 		/*
-		 * PurpleAttentionType * purple_attention_type_new(char * ulname, char * name, char * inc_desc, char * out_desc)
+		 * unsigned int( )
+		 * 
+		 * Could not generate a wrapper for int in file "prpl.h".
+		 * Message: The type could not be resolved (unsigned int( )).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_attention_type_new(string ulname, string name, string inc_desc, string out_desc);
 
-		public static PurpleAttentionType AttentionTypeNew(string ulname, string name, string inc_desc, string out_desc)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_attention_type_set_name(PurpleAttentionType * type, char * name)
 		 */
@@ -68,7 +74,7 @@ namespace PurpleWrapper
 
 		public static void AttentionTypeSetName(PurpleAttentionType type, string name)
 		{
-			throw new NotImplementedException();
+			purple_attention_type_set_name(type.Reference, name);
 		}
 
 		/*
@@ -79,7 +85,7 @@ namespace PurpleWrapper
 
 		public static void AttentionTypeSetIncomingDesc(PurpleAttentionType type, string desc)
 		{
-			throw new NotImplementedException();
+			purple_attention_type_set_incoming_desc(type.Reference, desc);
 		}
 
 		/*
@@ -90,7 +96,7 @@ namespace PurpleWrapper
 
 		public static void AttentionTypeSetOutgoingDesc(PurpleAttentionType type, string desc)
 		{
-			throw new NotImplementedException();
+			purple_attention_type_set_outgoing_desc(type.Reference, desc);
 		}
 
 		/*
@@ -101,7 +107,7 @@ namespace PurpleWrapper
 
 		public static void AttentionTypeSetIconName(PurpleAttentionType type, string name)
 		{
-			throw new NotImplementedException();
+			purple_attention_type_set_icon_name(type.Reference, name);
 		}
 
 		/*
@@ -112,7 +118,7 @@ namespace PurpleWrapper
 
 		public static void AttentionTypeSetUnlocalizedName(PurpleAttentionType type, string ulname)
 		{
-			throw new NotImplementedException();
+			purple_attention_type_set_unlocalized_name(type.Reference, ulname);
 		}
 
 		/*
@@ -123,7 +129,7 @@ namespace PurpleWrapper
 
 		public static string AttentionTypeGetName(PurpleAttentionType type)
 		{
-			throw new NotImplementedException();
+			return purple_attention_type_get_name(type.Reference);
 		}
 
 		/*
@@ -134,7 +140,7 @@ namespace PurpleWrapper
 
 		public static string AttentionTypeGetIncomingDesc(PurpleAttentionType type)
 		{
-			throw new NotImplementedException();
+			return purple_attention_type_get_incoming_desc(type.Reference);
 		}
 
 		/*
@@ -145,7 +151,7 @@ namespace PurpleWrapper
 
 		public static string AttentionTypeGetOutgoingDesc(PurpleAttentionType type)
 		{
-			throw new NotImplementedException();
+			return purple_attention_type_get_outgoing_desc(type.Reference);
 		}
 
 		/*
@@ -156,7 +162,7 @@ namespace PurpleWrapper
 
 		public static string AttentionTypeGetIconName(PurpleAttentionType type)
 		{
-			throw new NotImplementedException();
+			return purple_attention_type_get_icon_name(type.Reference);
 		}
 
 		/*
@@ -167,43 +173,22 @@ namespace PurpleWrapper
 
 		public static string AttentionTypeGetUnlocalizedName(PurpleAttentionType type)
 		{
-			throw new NotImplementedException();
+			return purple_attention_type_get_unlocalized_name(type.Reference);
 		}
 
 		/*
-		 * void purple_prpl_got_account_idle(PurpleAccount * account, gboolean idle, time_t idle_time)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_got_account_idle(IntPtr account, bool idle, UNKNOWN idle_time);
-
-		public static void GotAccountIdle(PurpleAccount account, bool idle, time_t idle_time)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_prpl_got_account_login_time(PurpleAccount * account, time_t login_time)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_got_account_login_time(IntPtr account, UNKNOWN login_time);
+		private static extern void purple_prpl_got_account_login_time(IntPtr account, ulong login_time);
 
-		public static void GotAccountLoginTime(PurpleAccount account, time_t login_time)
+		public static void GotAccountLoginTime(PurpleAccount account, DateTime login_time)
 		{
-			throw new NotImplementedException();
+			ulong _PurpleWrapper_arg1 = (ulong)(login_time - new DateTime(1970, 1, 1)).TotalSeconds;
+			purple_prpl_got_account_login_time(account.Reference, _PurpleWrapper_arg1);
 		}
 
 		/*
-		 * void purple_prpl_got_account_status(PurpleAccount * account, char * status_id, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_got_account_status(IntPtr account, string status_id, ...);
-
-		public static void GotAccountStatus(PurpleAccount account, string status_id, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_prpl_got_account_actions(PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
@@ -211,75 +196,16 @@ namespace PurpleWrapper
 
 		public static void GotAccountActions(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_prpl_got_account_actions(account.Reference);
 		}
 
 		/*
-		 * void purple_prpl_got_user_idle(PurpleAccount * account, char * name, gboolean idle, time_t idle_time)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_got_user_idle(IntPtr account, string name, bool idle, UNKNOWN idle_time);
-
-		public static void GotUserIdle(PurpleAccount account, string name, bool idle, time_t idle_time)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_prpl_got_user_login_time(PurpleAccount * account, char * name, time_t login_time)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_got_user_login_time(IntPtr account, string name, UNKNOWN login_time);
-
-		public static void GotUserLoginTime(PurpleAccount account, string name, time_t login_time)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_prpl_got_user_status(PurpleAccount * account, char * name, char * status_id, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_got_user_status(IntPtr account, string name, string status_id, ...);
-
-		public static void GotUserStatus(PurpleAccount account, string name, string status_id, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_prpl_got_user_status_deactive(PurpleAccount * account, char * name, char * status_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_got_user_status_deactive(IntPtr account, string name, string status_id);
-
-		public static void GotUserStatusDeactive(PurpleAccount account, string name, string status_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_prpl_change_account_status(PurpleAccount * account, PurpleStatus * old_status, PurpleStatus * new_status)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_prpl_change_account_status(IntPtr account, IntPtr old_status, IntPtr new_status);
-
-		public static void ChangeAccountStatus(PurpleAccount account, PurpleStatus old_status, PurpleStatus new_status)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_prpl_get_statuses(PurpleAccount * account, PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_prpl_get_statuses in file "prpl.h".
+		 * Message: The type could not be resolved (GList * purple_prpl_get_statuses(PurpleAccount * account, PurplePresence * presence)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_prpl_get_statuses(IntPtr account, IntPtr presence);
 
-		public static GList GetStatuses(PurpleAccount account, PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_prpl_send_attention(PurpleConnection * gc, char * who, guint type_code)
 		 */
@@ -288,7 +214,7 @@ namespace PurpleWrapper
 
 		public static void SendAttention(PurpleConnection gc, string who, uint type_code)
 		{
-			throw new NotImplementedException();
+			purple_prpl_send_attention(gc.Reference, who, type_code);
 		}
 
 		/*
@@ -299,7 +225,7 @@ namespace PurpleWrapper
 
 		public static void GotAttention(PurpleConnection gc, string who, uint type_code)
 		{
-			throw new NotImplementedException();
+			purple_prpl_got_attention(gc.Reference, who, type_code);
 		}
 
 		/*
@@ -310,32 +236,10 @@ namespace PurpleWrapper
 
 		public static void GotAttentionInChat(PurpleConnection gc, int id, string who, uint type_code)
 		{
-			throw new NotImplementedException();
+			purple_prpl_got_attention_in_chat(gc.Reference, id, who, type_code);
 		}
 
 		/*
-		 * PurpleMediaCaps purple_prpl_get_media_caps(PurpleAccount * account, char * who)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_prpl_get_media_caps(IntPtr account, string who);
-
-		public static PurpleMediaCaps GetMediaCaps(PurpleAccount account, string who)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_prpl_initiate_media(PurpleAccount * account, char * who, PurpleMediaSessionType type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_prpl_initiate_media(IntPtr account, string who, UNKNOWN type);
-
-		public static bool InitiateMedia(PurpleAccount account, string who, PurpleMediaSessionType type)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurplePlugin * purple_find_prpl(char * id)
 		 */
 		[DllImport("libpurple.dll")]
@@ -343,7 +247,7 @@ namespace PurpleWrapper
 
 		public static PurplePlugin FindPrpl(string id)
 		{
-			throw new NotImplementedException();
+			return new PurplePlugin(purple_find_prpl(id));
 		}
 
 	}
============================================================
--- libpurple/wrapper/PurpleAccount.cs	f30d444cbe85a062d2e4dde8bb47b38498c2b26e
+++ libpurple/wrapper/PurpleAccount.cs	a5e413399bb31044d1477819d2d0eb5582fcb7c5
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,462 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleAccount : UnmanagedWrapper<_PurpleAccount>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleAccount in file "account.h".
+		 * Message: The type could not be resolved (GHashTable * settings).
+		 */
+
 		public PurpleAccount()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleAccount(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleAccount)Marshal.PtrToStructure(this.Reference, typeof(_PurpleAccount));
+			throw new NotImplementedException();
 		}
 
-		public string username
-		{
-			get
-			{
-				return this.Data.username;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.username = value;
-			}
-		}
-
-		public string alias
-		{
-			get
-			{
-				return this.Data.alias;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.alias = value;
-			}
-		}
-
-		public string password
-		{
-			get
-			{
-				return this.Data.password;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.password = value;
-			}
-		}
-
-		public string user_info
-		{
-			get
-			{
-				return this.Data.user_info;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.user_info = value;
-			}
-		}
-
-		public string buddy_icon_path
-		{
-			get
-			{
-				return this.Data.buddy_icon_path;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.buddy_icon_path = value;
-			}
-		}
-
-		public bool remember_pass
-		{
-			get
-			{
-				return this.Data.remember_pass;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.remember_pass = value;
-			}
-		}
-
-		public string protocol_id
-		{
-			get
-			{
-				return this.Data.protocol_id;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.protocol_id = value;
-			}
-		}
-
-		public PurpleConnection gc
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool disconnecting
-		{
-			get
-			{
-				return this.Data.disconnecting;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.disconnecting = value;
-			}
-		}
-
-		public GHashTable settings
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable ui_settings
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleProxyInfo proxy_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GSList permit
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GSList deny
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurplePrivacyType perm_deny
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList status_types
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurplePresence presence
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleLog system_log
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccountRegistrationCb registration_cb
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr registration_cb_user_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr priv
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleAccount
-	{
-		/*
-		 * char * username
-		 */
-		string username;
-
-		/*
-		 * char * alias
-		 */
-		string alias;
-
-		/*
-		 * char * password
-		 */
-		string password;
-
-		/*
-		 * char * user_info
-		 */
-		string user_info;
-
-		/*
-		 * char * buddy_icon_path
-		 */
-		string buddy_icon_path;
-
-		/*
-		 * gboolean remember_pass
-		 */
-		bool remember_pass;
-
-		/*
-		 * char * protocol_id
-		 */
-		string protocol_id;
-
-		/*
-		 * PurpleConnection * gc
-		 */
-		IntPtr gc;
-
-		/*
-		 * gboolean disconnecting
-		 */
-		bool disconnecting;
-
-		/*
-		 * GHashTable * settings
-		 */
-		IntPtr settings;
-
-		/*
-		 * GHashTable * ui_settings
-		 */
-		IntPtr ui_settings;
-
-		/*
-		 * PurpleProxyInfo * proxy_info
-		 */
-		IntPtr proxy_info;
-
-		/*
-		 * GSList * permit
-		 */
-		IntPtr permit;
-
-		/*
-		 * GSList * deny
-		 */
-		IntPtr deny;
-
-		/*
-		 * PurplePrivacyType perm_deny
-		 */
-		UNKNOWN perm_deny;
-
-		/*
-		 * GList * status_types
-		 */
-		IntPtr status_types;
-
-		/*
-		 * PurplePresence * presence
-		 */
-		IntPtr presence;
-
-		/*
-		 * PurpleLog * system_log
-		 */
-		IntPtr system_log;
-
-		/*
-		 * void * ui_data
-		 */
-		IntPtr ui_data;
-
-		/*
-		 * PurpleAccountRegistrationCb registration_cb
-		 */
-		UNKNOWN registration_cb;
-
-		/*
-		 * void * registration_cb_user_data
-		 */
-		IntPtr registration_cb_user_data;
-
-		/*
-		 * gpointer priv
-		 */
-		IntPtr priv;
-
-	}
+	class _PurpleAccount { }
 }
 
============================================================
--- libpurple/wrapper/PurpleAccountUiOps.cs	116f58485640b0decd2946febbdd8dc8555e81aa
+++ libpurple/wrapper/PurpleAccountUiOps.cs	cbe5cca35e4540f8e11bd3bf6bb05140874d571f
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -123,7 +125,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved1
+		public void purple_reserved1
 		{
 			get
 			{
@@ -138,7 +140,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved2
+		public void purple_reserved2
 		{
 			get
 			{
@@ -153,7 +155,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved3
+		public void purple_reserved3
 		{
 			get
 			{
@@ -168,7 +170,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved4
+		public void purple_reserved4
 		{
 			get
 			{
@@ -215,25 +217,26 @@ namespace PurpleWrapper
 		void close_account_request;
 
 		/*
-		 * void (*_purple_reserved1)()
+		 * void (*purple_reserved1)()
 		 */
-		void _purple_reserved1;
+		void purple_reserved1;
 
 		/*
-		 * void (*_purple_reserved2)()
+		 * void (*purple_reserved2)()
 		 */
-		void _purple_reserved2;
+		void purple_reserved2;
 
 		/*
-		 * void (*_purple_reserved3)()
+		 * void (*purple_reserved3)()
 		 */
-		void _purple_reserved3;
+		void purple_reserved3;
 
 		/*
-		 * void (*_purple_reserved4)()
+		 * void (*purple_reserved4)()
 		 */
-		void _purple_reserved4;
+		void purple_reserved4;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleAttentionType.cs	21a5c2915860fc22f69c917d1c5d391b0892418a
+++ libpurple/wrapper/PurpleAttentionType.cs	464f2eb5404d9d803d904a2ce5cc299d984af90e
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,182 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleAttentionType : UnmanagedWrapper<_PurpleAttentionType>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleAttentionType in file "prpl.h".
+		 * Message: The type could not be resolved (const char * name).
+		 */
+
 		public PurpleAttentionType()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleAttentionType(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleAttentionType)Marshal.PtrToStructure(this.Reference, typeof(_PurpleAttentionType));
+			throw new NotImplementedException();
 		}
 
-		public const char *name
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *incoming_description
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *outgoing_description
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *icon_name
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *unlocalized_name
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr _reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr _reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr _reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleAttentionType
-	{
-		/*
-		 * const char *name
-		 */
-		UNKNOWN char *name;
-
-		/*
-		 * const char *incoming_description
-		 */
-		UNKNOWN char *incoming_description;
-
-		/*
-		 * const char *outgoing_description
-		 */
-		UNKNOWN char *outgoing_description;
-
-		/*
-		 * const char *icon_name
-		 */
-		UNKNOWN char *icon_name;
-
-		/*
-		 * const char *unlocalized_name
-		 */
-		UNKNOWN char *unlocalized_name;
-
-		/*
-		 * gpointer _reserved2
-		 */
-		IntPtr _reserved2;
-
-		/*
-		 * gpointer _reserved3
-		 */
-		IntPtr _reserved3;
-
-		/*
-		 * gpointer _reserved4
-		 */
-		IntPtr _reserved4;
-
-	}
+	class _PurpleAttentionType { }
 }
 
============================================================
--- libpurple/wrapper/PurpleBlistNode.cs	2f5cf13875c2ad80380e3b60f14d38f5d7a3d30d
+++ libpurple/wrapper/PurpleBlistNode.cs	197992599e3d9c68467e30dd392f73058664c037
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,182 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleBlistNode : UnmanagedWrapper<_PurpleBlistNode>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleBlistNode in file "blist.h".
+		 * Message: The type could not be resolved (GHashTable * settings).
+		 */
+
 		public PurpleBlistNode()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleBlistNode(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleBlistNode)Marshal.PtrToStructure(this.Reference, typeof(_PurpleBlistNode));
+			throw new NotImplementedException();
 		}
 
-		public PurpleBlistNodeType type
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleBlistNode prev
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleBlistNode next
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleBlistNode parent
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleBlistNode child
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable settings
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleBlistNodeFlags flags
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleBlistNode
-	{
-		/*
-		 * PurpleBlistNodeType type
-		 */
-		UNKNOWN type;
-
-		/*
-		 * PurpleBlistNode * prev
-		 */
-		IntPtr prev;
-
-		/*
-		 * PurpleBlistNode * next
-		 */
-		IntPtr next;
-
-		/*
-		 * PurpleBlistNode * parent
-		 */
-		IntPtr parent;
-
-		/*
-		 * PurpleBlistNode * child
-		 */
-		IntPtr child;
-
-		/*
-		 * GHashTable * settings
-		 */
-		IntPtr settings;
-
-		/*
-		 * void          * ui_data
-		 */
-		IntPtr ui_data;
-
-		/*
-		 * PurpleBlistNodeFlags flags
-		 */
-		UNKNOWN flags;
-
-	}
+	class _PurpleBlistNode { }
 }
 
============================================================
--- libpurple/wrapper/PurpleBlistUiOps.cs	0cac1ede6b13ef2b4ac9591e99b02cbd7f9aa465
+++ libpurple/wrapper/PurpleBlistUiOps.cs	3acf16daf1d1c066817eddab86a1ec6c38e79077
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -198,7 +200,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved1
+		public void purple_reserved1
 		{
 			get
 			{
@@ -213,7 +215,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved2
+		public void purple_reserved2
 		{
 			get
 			{
@@ -228,7 +230,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved3
+		public void purple_reserved3
 		{
 			get
 			{
@@ -243,7 +245,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved4
+		public void purple_reserved4
 		{
 			get
 			{
@@ -315,25 +317,26 @@ namespace PurpleWrapper
 		void request_add_group;
 
 		/*
-		 * void (*_purple_reserved1)()
+		 * void (*purple_reserved1)()
 		 */
-		void _purple_reserved1;
+		void purple_reserved1;
 
 		/*
-		 * void (*_purple_reserved2)()
+		 * void (*purple_reserved2)()
 		 */
-		void _purple_reserved2;
+		void purple_reserved2;
 
 		/*
-		 * void (*_purple_reserved3)()
+		 * void (*purple_reserved3)()
 		 */
-		void _purple_reserved3;
+		void purple_reserved3;
 
 		/*
-		 * void (*_purple_reserved4)()
+		 * void (*purple_reserved4)()
 		 */
-		void _purple_reserved4;
+		void purple_reserved4;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleBuddy.cs	9d8ce36c1a71a471396b8cdb2493b02756db4157
+++ libpurple/wrapper/PurpleBuddy.cs	0d62ffdf3d71442293ce0d837b35cb5e7f446539
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,182 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleBuddy : UnmanagedWrapper<_PurpleBuddy>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleBuddy in file "blist.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleBlistNode node).
+		 */
+
 		public PurpleBuddy()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleBuddy(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleBuddy)Marshal.PtrToStructure(this.Reference, typeof(_PurpleBuddy));
+			throw new NotImplementedException();
 		}
 
-		public PurpleBlistNode node
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public string alias
-		{
-			get
-			{
-				return this.Data.alias;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.alias = value;
-			}
-		}
-
-		public string server_alias
-		{
-			get
-			{
-				return this.Data.server_alias;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.server_alias = value;
-			}
-		}
-
-		public IntPtr proto_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleBuddyIcon icon
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurplePresence presence
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleBuddy
-	{
-		/*
-		 * PurpleBlistNode node
-		 */
-		UNKNOWN node;
-
-		/*
-		 * char * name
-		 */
-		string name;
-
-		/*
-		 * char * alias
-		 */
-		string alias;
-
-		/*
-		 * char * server_alias
-		 */
-		string server_alias;
-
-		/*
-		 * void * proto_data
-		 */
-		IntPtr proto_data;
-
-		/*
-		 * PurpleBuddyIcon * icon
-		 */
-		IntPtr icon;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * PurplePresence * presence
-		 */
-		IntPtr presence;
-
-	}
+	class _PurpleBuddy { }
 }
 
============================================================
--- libpurple/wrapper/PurpleBuddyIconSpec.cs	255c5da9f53d8be99ad1c55a1efac6f8672cb788
+++ libpurple/wrapper/PurpleBuddyIconSpec.cs	baa9ee5218d0a86ca69f5e1d0ce617c1dbb5997a
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -123,22 +125,22 @@ namespace PurpleWrapper
 			}
 		}
 
-		public size_t max_filesize
+		public ulong max_filesize
 		{
 			get
 			{
-				throw new NotImplementedException(); /* Non-native type. */
+				return this.Data.max_filesize;
 			}
 			set
 			{
 				if (this.Reference != IntPtr.Zero)
 					this.Reference = IntPtr.Zero;
 
-				throw new NotImplementedException(); /* Non-native type. */
+				this.Data.max_filesize = value;
 			}
 		}
 
-		public PurpleIconScaleRules scale_rules
+		public Prpl.PurpleIconScaleRules scale_rules
 		{
 			get
 			{
@@ -187,13 +189,14 @@ namespace PurpleWrapper
 		/*
 		 * size_t max_filesize
 		 */
-		UNKNOWN max_filesize;
+		ulong max_filesize;
 
 		/*
 		 * PurpleIconScaleRules scale_rules
 		 */
-		UNKNOWN scale_rules;
+		Prpl.PurpleIconScaleRules scale_rules;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleBuddyList.cs	d7d4f8b585d66d545f80a4e1f6e5b99c8dd0b4a6
+++ libpurple/wrapper/PurpleBuddyList.cs	ce909e0496424e92ae9242e8b9bcd4186bd0ed29
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,82 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleBuddyList : UnmanagedWrapper<_PurpleBuddyList>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleBuddyList in file "blist.h".
+		 * Message: The type could not be resolved (GHashTable * buddies).
+		 */
+
 		public PurpleBuddyList()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleBuddyList(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleBuddyList)Marshal.PtrToStructure(this.Reference, typeof(_PurpleBuddyList));
+			throw new NotImplementedException();
 		}
 
-		public PurpleBlistNode root
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable buddies
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleBuddyList
-	{
-		/*
-		 * PurpleBlistNode * root
-		 */
-		IntPtr root;
-
-		/*
-		 * GHashTable * buddies
-		 */
-		IntPtr buddies;
-
-		/*
-		 * void * ui_data
-		 */
-		IntPtr ui_data;
-
-	}
+	class _PurpleBuddyList { }
 }
 
============================================================
--- libpurple/wrapper/PurpleCertificate.cs	e717b82338cbabe712e7694d9af148befc65404b
+++ libpurple/wrapper/PurpleCertificate.cs	2d465e3801516b2a9233596875ccb92375cc0bc8
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -95,5 +97,6 @@ namespace PurpleWrapper
 		IntPtr data;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleCertificatePool.cs	7c12fde31e228be96a7e50b39f2a928b5c97f397
+++ libpurple/wrapper/PurpleCertificatePool.cs	7cddce55b06277db481dc6490a998d8a49918082
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,322 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleCertificatePool : UnmanagedWrapper<_PurpleCertificatePool>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleCertificatePool in file "certificate.h".
+		 * Message: The type could not be resolved (GList *  (* get_idlist)(void)).
+		 */
+
 		public PurpleCertificatePool()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleCertificatePool(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleCertificatePool)Marshal.PtrToStructure(this.Reference, typeof(_PurpleCertificatePool));
+			throw new NotImplementedException();
 		}
 
-		public string scheme_name
-		{
-			get
-			{
-				return this.Data.scheme_name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.scheme_name = value;
-			}
-		}
-
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public string fullname
-		{
-			get
-			{
-				return this.Data.fullname;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.fullname = value;
-			}
-		}
-
-		public IntPtr data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool (* init)(void)
-		{
-			get
-			{
-				return this.Data.(* init)(void);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.(* init)(void) = value;
-			}
-		}
-
-		public void (* uninit)(void)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool (* cert_in_pool)(const gchar *id)
-		{
-			get
-			{
-				return this.Data.(* cert_in_pool)(const gchar *id);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.(* cert_in_pool)(const gchar *id) = value;
-			}
-		}
-
-		public PurpleCertificate  (* get_cert)(const gchar *id)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool (* put_cert)(const gchar *id, PurpleCertificate *crt)
-		{
-			get
-			{
-				return this.Data.(* put_cert)(const gchar *id, PurpleCertificate *crt);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.(* put_cert)(const gchar *id, PurpleCertificate *crt) = value;
-			}
-		}
-
-		public bool (* delete_cert)(const gchar *id)
-		{
-			get
-			{
-				return this.Data.(* delete_cert)(const gchar *id);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.(* delete_cert)(const gchar *id) = value;
-			}
-		}
-
-		public GList  (* get_idlist)(void)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleCertificatePool
-	{
-		/*
-		 * gchar * scheme_name
-		 */
-		string scheme_name;
-
-		/*
-		 * gchar * name
-		 */
-		string name;
-
-		/*
-		 * gchar * fullname
-		 */
-		string fullname;
-
-		/*
-		 * gpointer data
-		 */
-		IntPtr data;
-
-		/*
-		 * gboolean (* init)(void)
-		 */
-		bool (* init)(void);
-
-		/*
-		 * void (* uninit)(void)
-		 */
-		void (* uninit)(void);
-
-		/*
-		 * gboolean (* cert_in_pool)(const gchar *id)
-		 */
-		bool (* cert_in_pool)(const gchar *id);
-
-		/*
-		 * PurpleCertificate *  (* get_cert)(const gchar *id)
-		 */
-		IntPtr  (* get_cert)(const gchar *id);
-
-		/*
-		 * gboolean (* put_cert)(const gchar *id, PurpleCertificate *crt)
-		 */
-		bool (* put_cert)(const gchar *id, PurpleCertificate *crt);
-
-		/*
-		 * gboolean (* delete_cert)(const gchar *id)
-		 */
-		bool (* delete_cert)(const gchar *id);
-
-		/*
-		 * GList *  (* get_idlist)(void)
-		 */
-		IntPtr  (* get_idlist)(void);
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurpleCertificatePool { }
 }
 
============================================================
--- libpurple/wrapper/PurpleCertificateScheme.cs	2faa1720fc4896dcde80c074b50b3c77de589b4a
+++ libpurple/wrapper/PurpleCertificateScheme.cs	16986f3aff51ebc568ae82b59c15c11dc77599db
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,362 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleCertificateScheme : UnmanagedWrapper<_PurpleCertificateScheme>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleCertificateScheme in file "certificate.h".
+		 * Message: The type could not be resolved (GByteArray *  (* get_fingerprint_sha1)(PurpleCertificate *crt)).
+		 */
+
 		public PurpleCertificateScheme()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleCertificateScheme(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleCertificateScheme)Marshal.PtrToStructure(this.Reference, typeof(_PurpleCertificateScheme));
+			throw new NotImplementedException();
 		}
 
-		public string  name
-		{
-			get
-			{
-				return this.Data. name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data. name = value;
-			}
-		}
-
-		public string  fullname
-		{
-			get
-			{
-				return this.Data. fullname;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data. fullname = value;
-			}
-		}
-
-		public PurpleCertificate  (* import_certificate)(const gchar * filename)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool (* export_certificate)(const gchar *filename, PurpleCertificate *crt)
-		{
-			get
-			{
-				return this.Data.(* export_certificate)(const gchar *filename, PurpleCertificate *crt);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.(* export_certificate)(const gchar *filename, PurpleCertificate *crt) = value;
-			}
-		}
-
-		public PurpleCertificate  (* copy_certificate)(PurpleCertificate *crt)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void (* destroy_certificate)(PurpleCertificate * crt)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool signed_by
-		{
-			get
-			{
-				return this.Data.signed_by;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.signed_by = value;
-			}
-		}
-
-		public GByteArray  (* get_fingerprint_sha1)(PurpleCertificate *crt)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string  (* get_unique_id)(PurpleCertificate *crt)
-		{
-			get
-			{
-				return this.Data. (* get_unique_id)(PurpleCertificate *crt);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data. (* get_unique_id)(PurpleCertificate *crt) = value;
-			}
-		}
-
-		public string  (* get_issuer_unique_id)(PurpleCertificate *crt)
-		{
-			get
-			{
-				return this.Data. (* get_issuer_unique_id)(PurpleCertificate *crt);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data. (* get_issuer_unique_id)(PurpleCertificate *crt) = value;
-			}
-		}
-
-		public string  (* get_subject_name)(PurpleCertificate *crt)
-		{
-			get
-			{
-				return this.Data. (* get_subject_name)(PurpleCertificate *crt);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data. (* get_subject_name)(PurpleCertificate *crt) = value;
-			}
-		}
-
-		public bool (* check_subject_name)(PurpleCertificate *crt, const gchar *name)
-		{
-			get
-			{
-				return this.Data.(* check_subject_name)(PurpleCertificate *crt, const gchar *name);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.(* check_subject_name)(PurpleCertificate *crt, const gchar *name) = value;
-			}
-		}
-
-		public bool (* get_times)(PurpleCertificate *crt, time_t *activation, time_t *expiration)
-		{
-			get
-			{
-				return this.Data.(* get_times)(PurpleCertificate *crt, time_t *activation, time_t *expiration);
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.(* get_times)(PurpleCertificate *crt, time_t *activation, time_t *expiration) = value;
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleCertificateScheme
-	{
-		/*
-		 * gchar *  name
-		 */
-		string  name;
-
-		/*
-		 * gchar *  fullname
-		 */
-		string  fullname;
-
-		/*
-		 * PurpleCertificate *  (* import_certificate)(const gchar * filename)
-		 */
-		IntPtr  (* import_certificate)(const gchar * filename);
-
-		/*
-		 * gboolean (* export_certificate)(const gchar *filename, PurpleCertificate *crt)
-		 */
-		bool (* export_certificate)(const gchar *filename, PurpleCertificate *crt);
-
-		/*
-		 * PurpleCertificate *  (* copy_certificate)(PurpleCertificate *crt)
-		 */
-		IntPtr  (* copy_certificate)(PurpleCertificate *crt);
-
-		/*
-		 * void (* destroy_certificate)(PurpleCertificate * crt)
-		 */
-		void (* destroy_certificate)(PurpleCertificate * crt);
-
-		/*
-		 * gboolean (*signed_by)(PurpleCertificate * crt, PurpleCertificate * issuer)
-		 */
-		bool signed_by;
-
-		/*
-		 * GByteArray *  (* get_fingerprint_sha1)(PurpleCertificate *crt)
-		 */
-		IntPtr  (* get_fingerprint_sha1)(PurpleCertificate *crt);
-
-		/*
-		 * gchar *  (* get_unique_id)(PurpleCertificate *crt)
-		 */
-		string  (* get_unique_id)(PurpleCertificate *crt);
-
-		/*
-		 * gchar *  (* get_issuer_unique_id)(PurpleCertificate *crt)
-		 */
-		string  (* get_issuer_unique_id)(PurpleCertificate *crt);
-
-		/*
-		 * gchar *  (* get_subject_name)(PurpleCertificate *crt)
-		 */
-		string  (* get_subject_name)(PurpleCertificate *crt);
-
-		/*
-		 * gboolean (* check_subject_name)(PurpleCertificate *crt, const gchar *name)
-		 */
-		bool (* check_subject_name)(PurpleCertificate *crt, const gchar *name);
-
-		/*
-		 * gboolean (* get_times)(PurpleCertificate *crt, time_t *activation, time_t *expiration)
-		 */
-		bool (* get_times)(PurpleCertificate *crt, time_t *activation, time_t *expiration);
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurpleCertificateScheme { }
 }
 
============================================================
--- libpurple/wrapper/PurpleCertificateVerificationRequest.cs	d85b01e3ad4c45d889fee9e718a0e7ab64b8bedc
+++ libpurple/wrapper/PurpleCertificateVerificationRequest.cs	5310d9a28a66af6cb620a98c250eb2724998a7cb
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,162 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleCertificateVerificationRequest : UnmanagedWrapper<_PurpleCertificateVerificationRequest>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleCertificateVerificationRequest in file "certificate.h".
+		 * Message: The type could not be resolved (GList * cert_chain).
+		 */
+
 		public PurpleCertificateVerificationRequest()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleCertificateVerificationRequest(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleCertificateVerificationRequest)Marshal.PtrToStructure(this.Reference, typeof(_PurpleCertificateVerificationRequest));
+			throw new NotImplementedException();
 		}
 
-		public PurpleCertificateVerifier verifier
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleCertificateScheme scheme
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string subject_name
-		{
-			get
-			{
-				return this.Data.subject_name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.subject_name = value;
-			}
-		}
-
-		public GList cert_chain
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleCertificateVerifiedCallback cb
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr cb_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleCertificateVerificationRequest
-	{
-		/*
-		 * PurpleCertificateVerifier * verifier
-		 */
-		IntPtr verifier;
-
-		/*
-		 * PurpleCertificateScheme * scheme
-		 */
-		IntPtr scheme;
-
-		/*
-		 * gchar * subject_name
-		 */
-		string subject_name;
-
-		/*
-		 * GList * cert_chain
-		 */
-		IntPtr cert_chain;
-
-		/*
-		 * gpointer data
-		 */
-		IntPtr data;
-
-		/*
-		 * PurpleCertificateVerifiedCallback cb
-		 */
-		UNKNOWN cb;
-
-		/*
-		 * gpointer cb_data
-		 */
-		IntPtr cb_data;
-
-	}
+	class _PurpleCertificateVerificationRequest { }
 }
 
============================================================
--- libpurple/wrapper/PurpleCertificateVerifier.cs	73640d112fa595880217d516429d2dd5dbca8c93
+++ libpurple/wrapper/PurpleCertificateVerifier.cs	61eb04ed6e562582a5d3d18d21a840ec942a6ae3
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -108,7 +110,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved1
+		public void purple_reserved1
 		{
 			get
 			{
@@ -123,7 +125,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved2
+		public void purple_reserved2
 		{
 			get
 			{
@@ -138,7 +140,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved3
+		public void purple_reserved3
 		{
 			get
 			{
@@ -153,7 +155,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved4
+		public void purple_reserved4
 		{
 			get
 			{
@@ -195,25 +197,26 @@ namespace PurpleWrapper
 		void (* destroy_request)(PurpleCertificateVerificationRequest *vrq);
 
 		/*
-		 * void (*_purple_reserved1)()
+		 * void (*purple_reserved1)()
 		 */
-		void _purple_reserved1;
+		void purple_reserved1;
 
 		/*
-		 * void (*_purple_reserved2)()
+		 * void (*purple_reserved2)()
 		 */
-		void _purple_reserved2;
+		void purple_reserved2;
 
 		/*
-		 * void (*_purple_reserved3)()
+		 * void (*purple_reserved3)()
 		 */
-		void _purple_reserved3;
+		void purple_reserved3;
 
 		/*
-		 * void (*_purple_reserved4)()
+		 * void (*purple_reserved4)()
 		 */
-		void _purple_reserved4;
+		void purple_reserved4;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleChat.cs	3fdefe40e788b383dec23cb7c1b6dba0cdaece1e
+++ libpurple/wrapper/PurpleChat.cs	7bf01fae0628fdf1eded5f793d243a48b189b719
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,102 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleChat : UnmanagedWrapper<_PurpleChat>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleChat in file "blist.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleBlistNode node).
+		 */
+
 		public PurpleChat()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleChat(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleChat)Marshal.PtrToStructure(this.Reference, typeof(_PurpleChat));
+			throw new NotImplementedException();
 		}
 
-		public PurpleBlistNode node
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string alias
-		{
-			get
-			{
-				return this.Data.alias;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.alias = value;
-			}
-		}
-
-		public GHashTable components
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleChat
-	{
-		/*
-		 * PurpleBlistNode node
-		 */
-		UNKNOWN node;
-
-		/*
-		 * char * alias
-		 */
-		string alias;
-
-		/*
-		 * GHashTable * components
-		 */
-		IntPtr components;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-	}
+	class _PurpleChat { }
 }
 
============================================================
--- libpurple/wrapper/PurpleCipherOps.cs	dfbdf8790dd1757d66e8c32faaacf19ebfaf1a63
+++ libpurple/wrapper/PurpleCipherOps.cs	85575b543e9e3230ad98b83b66b60a0606a76aec
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -213,18 +215,18 @@ namespace PurpleWrapper
 			}
 		}
 
-		public size_t get_salt_size
+		public ulong get_salt_size
 		{
 			get
 			{
-				throw new NotImplementedException(); /* Non-native type. */
+				return this.Data.get_salt_size;
 			}
 			set
 			{
 				if (this.Reference != IntPtr.Zero)
 					this.Reference = IntPtr.Zero;
 
-				throw new NotImplementedException(); /* Non-native type. */
+				this.Data.get_salt_size = value;
 			}
 		}
 
@@ -243,18 +245,18 @@ namespace PurpleWrapper
 			}
 		}
 
-		public size_t get_key_size
+		public ulong get_key_size
 		{
 			get
 			{
-				throw new NotImplementedException(); /* Non-native type. */
+				return this.Data.get_key_size;
 			}
 			set
 			{
 				if (this.Reference != IntPtr.Zero)
 					this.Reference = IntPtr.Zero;
 
-				throw new NotImplementedException(); /* Non-native type. */
+				this.Data.get_key_size = value;
 			}
 		}
 
@@ -273,7 +275,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public PurpleCipherBatchMode get_batch_mode
+		public Cipher.PurpleCipherBatchMode get_batch_mode
 		{
 			get
 			{
@@ -288,18 +290,18 @@ namespace PurpleWrapper
 			}
 		}
 
-		public size_t get_block_size
+		public ulong get_block_size
 		{
 			get
 			{
-				throw new NotImplementedException(); /* Non-native type. */
+				return this.Data.get_block_size;
 			}
 			set
 			{
 				if (this.Reference != IntPtr.Zero)
 					this.Reference = IntPtr.Zero;
 
-				throw new NotImplementedException(); /* Non-native type. */
+				this.Data.get_block_size = value;
 			}
 		}
 
@@ -360,17 +362,17 @@ namespace PurpleWrapper
 		void append;
 
 		/*
-		 * gboolean (*digest)(PurpleCipherContext * context, size_t in_len, guchar digest, size_t * out_len)
+		 * gboolean (*digest)(PurpleCipherContext * context, size_t in_len, guchar [], size_t * out_len)
 		 */
 		bool digest;
 
 		/*
-		 * int (*encrypt)(PurpleCipherContext * context, guchar data, size_t len, guchar output, size_t * outlen)
+		 * int (*encrypt)(PurpleCipherContext * context, guchar [], size_t len, guchar [], size_t * outlen)
 		 */
 		int encrypt;
 
 		/*
-		 * int (*decrypt)(PurpleCipherContext * context, guchar data, size_t len, guchar output, size_t * outlen)
+		 * int (*decrypt)(PurpleCipherContext * context, guchar [], size_t len, guchar [], size_t * outlen)
 		 */
 		int decrypt;
 
@@ -382,7 +384,7 @@ namespace PurpleWrapper
 		/*
 		 * size_t (*get_salt_size)(PurpleCipherContext * context)
 		 */
-		UNKNOWN get_salt_size;
+		ulong get_salt_size;
 
 		/*
 		 * void (*set_key)(PurpleCipherContext * context, guchar * key)
@@ -392,7 +394,7 @@ namespace PurpleWrapper
 		/*
 		 * size_t (*get_key_size)(PurpleCipherContext * context)
 		 */
-		UNKNOWN get_key_size;
+		ulong get_key_size;
 
 		/*
 		 * void (*set_batch_mode)(PurpleCipherContext * context, PurpleCipherBatchMode mode)
@@ -402,12 +404,12 @@ namespace PurpleWrapper
 		/*
 		 * PurpleCipherBatchMode (*get_batch_mode)(PurpleCipherContext * context)
 		 */
-		UNKNOWN get_batch_mode;
+		Cipher.PurpleCipherBatchMode get_batch_mode;
 
 		/*
 		 * size_t (*get_block_size)(PurpleCipherContext * context)
 		 */
-		UNKNOWN get_block_size;
+		ulong get_block_size;
 
 		/*
 		 * void (*set_key_with_len)(PurpleCipherContext * context, guchar * key, size_t len)
@@ -415,5 +417,6 @@ namespace PurpleWrapper
 		void set_key_with_len;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleClient.cs	c1cdf84dae5d7e9377fff26a9d43f6f1fd942cfe
+++ libpurple/wrapper/PurpleClient.cs	1edab768a243aff5252e94181da3d3c1cd7c4d7e
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,7 +48,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_init();
 		}
 
 	}
============================================================
--- libpurple/wrapper/PurpleConnection.cs	e922961b95a6fa9c7f1649cbcd4afbbd14ec6c18
+++ libpurple/wrapper/PurpleConnection.cs	dd769e17730fe5b01efeaa8c324ae2edbfc33e30
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,282 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleConnection : UnmanagedWrapper<_PurpleConnection>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleConnection in file "connection.h".
+		 * Message: The type could not be resolved (GSList * buddy_chats).
+		 */
+
 		public PurpleConnection()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleConnection(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleConnection)Marshal.PtrToStructure(this.Reference, typeof(_PurpleConnection));
+			throw new NotImplementedException();
 		}
 
-		public PurplePlugin prpl
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleConnectionFlags flags
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleConnectionState state
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string password
-		{
-			get
-			{
-				return this.Data.password;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.password = value;
-			}
-		}
-
-		public int inpa
-		{
-			get
-			{
-				return this.Data.inpa;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.inpa = value;
-			}
-		}
-
-		public GSList buddy_chats
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr proto_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string display_name
-		{
-			get
-			{
-				return this.Data.display_name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.display_name = value;
-			}
-		}
-
-		public uint keepalive
-		{
-			get
-			{
-				return this.Data.keepalive;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.keepalive = value;
-			}
-		}
-
-		public bool wants_to_die
-		{
-			get
-			{
-				return this.Data.wants_to_die;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.wants_to_die = value;
-			}
-		}
-
-		public uint disconnect_timeout
-		{
-			get
-			{
-				return this.Data.disconnect_timeout;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.disconnect_timeout = value;
-			}
-		}
-
-		public time_t last_received
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleConnection
-	{
-		/*
-		 * PurplePlugin * prpl
-		 */
-		IntPtr prpl;
-
-		/*
-		 * PurpleConnectionFlags flags
-		 */
-		UNKNOWN flags;
-
-		/*
-		 * PurpleConnectionState state
-		 */
-		UNKNOWN state;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * char * password
-		 */
-		string password;
-
-		/*
-		 * int inpa
-		 */
-		int inpa;
-
-		/*
-		 * GSList * buddy_chats
-		 */
-		IntPtr buddy_chats;
-
-		/*
-		 * void * proto_data
-		 */
-		IntPtr proto_data;
-
-		/*
-		 * char * display_name
-		 */
-		string display_name;
-
-		/*
-		 * guint keepalive
-		 */
-		uint keepalive;
-
-		/*
-		 * gboolean wants_to_die
-		 */
-		bool wants_to_die;
-
-		/*
-		 * guint disconnect_timeout
-		 */
-		uint disconnect_timeout;
-
-		/*
-		 * time_t last_received
-		 */
-		UNKNOWN last_received;
-
-	}
+	class _PurpleConnection { }
 }
 
============================================================
--- libpurple/wrapper/PurpleContact.cs	66ba1bb0b1d8006a3dc9cf06aede310f943758eb
+++ libpurple/wrapper/PurpleContact.cs	df0ba4e6246914ebd29d46442f45bae498ab9ab5
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,162 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleContact : UnmanagedWrapper<_PurpleContact>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleContact in file "blist.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleBlistNode node).
+		 */
+
 		public PurpleContact()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleContact(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleContact)Marshal.PtrToStructure(this.Reference, typeof(_PurpleContact));
+			throw new NotImplementedException();
 		}
 
-		public PurpleBlistNode node
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string alias
-		{
-			get
-			{
-				return this.Data.alias;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.alias = value;
-			}
-		}
-
-		public int totalsize
-		{
-			get
-			{
-				return this.Data.totalsize;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.totalsize = value;
-			}
-		}
-
-		public int currentsize
-		{
-			get
-			{
-				return this.Data.currentsize;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.currentsize = value;
-			}
-		}
-
-		public int online
-		{
-			get
-			{
-				return this.Data.online;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.online = value;
-			}
-		}
-
-		public PurpleBuddy priority
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool priority_valid
-		{
-			get
-			{
-				return this.Data.priority_valid;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.priority_valid = value;
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleContact
-	{
-		/*
-		 * PurpleBlistNode node
-		 */
-		UNKNOWN node;
-
-		/*
-		 * char * alias
-		 */
-		string alias;
-
-		/*
-		 * int totalsize
-		 */
-		int totalsize;
-
-		/*
-		 * int currentsize
-		 */
-		int currentsize;
-
-		/*
-		 * int online
-		 */
-		int online;
-
-		/*
-		 * PurpleBuddy * priority
-		 */
-		IntPtr priority;
-
-		/*
-		 * gboolean priority_valid
-		 */
-		bool priority_valid;
-
-	}
+	class _PurpleContact { }
 }
 
============================================================
--- libpurple/wrapper/PurpleConvChat.cs	d2f7eb228a16735d1c446f4a3bd338b2dda27e35
+++ libpurple/wrapper/PurpleConvChat.cs	3ac29dde0ff85a7831494c4570d60f5a7b3df240
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,182 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleConvChat : UnmanagedWrapper<_PurpleConvChat>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleConvChat in file "conversation.h".
+		 * Message: The type could not be resolved (GList * in_room).
+		 */
+
 		public PurpleConvChat()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleConvChat(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleConvChat)Marshal.PtrToStructure(this.Reference, typeof(_PurpleConvChat));
+			throw new NotImplementedException();
 		}
 
-		public PurpleConversation conv
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList in_room
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList ignored
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public char who
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public char topic
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int id
-		{
-			get
-			{
-				return this.Data.id;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.id = value;
-			}
-		}
-
-		public string nick
-		{
-			get
-			{
-				return this.Data.nick;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.nick = value;
-			}
-		}
-
-		public bool left
-		{
-			get
-			{
-				return this.Data.left;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.left = value;
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleConvChat
-	{
-		/*
-		 * PurpleConversation * conv
-		 */
-		IntPtr conv;
-
-		/*
-		 * GList * in_room
-		 */
-		IntPtr in_room;
-
-		/*
-		 * GList * ignored
-		 */
-		IntPtr ignored;
-
-		/*
-		 * char  * who
-		 */
-		IntPtr who;
-
-		/*
-		 * char  * topic
-		 */
-		IntPtr topic;
-
-		/*
-		 * int id
-		 */
-		int id;
-
-		/*
-		 * char * nick
-		 */
-		string nick;
-
-		/*
-		 * gboolean left
-		 */
-		bool left;
-
-	}
+	class _PurpleConvChat { }
 }
 
============================================================
--- libpurple/wrapper/PurpleConvChatBuddy.cs	b39d3f662b398221d4b0a0c43144162f4d5b326a
+++ libpurple/wrapper/PurpleConvChatBuddy.cs	be038aa17788a59446200c8020887fec84f1d1d5
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -108,7 +110,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public PurpleConvChatBuddyFlags flags
+		public Conversation.PurpleConvChatBuddyFlags flags
 		{
 			get
 			{
@@ -152,8 +154,9 @@ namespace PurpleWrapper
 		/*
 		 * PurpleConvChatBuddyFlags flags
 		 */
-		UNKNOWN flags;
+		Conversation.PurpleConvChatBuddyFlags flags;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleConvIm.cs	1867ff35ee88c963fab8287bb239e9bbb888809f
+++ libpurple/wrapper/PurpleConvIm.cs	ea2ada5874b1bb4bc5ce1a8b381020ea4e20d361
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,142 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleConvIm : UnmanagedWrapper<_PurpleConvIm>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleConvIm in file "conversation.h".
+		 * Message: The type could not be resolved (PurpleBuddyIcon * icon).
+		 */
+
 		public PurpleConvIm()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleConvIm(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleConvIm)Marshal.PtrToStructure(this.Reference, typeof(_PurpleConvIm));
+			throw new NotImplementedException();
 		}
 
-		public PurpleConversation conv
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleTypingState typing_state
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public uint typing_timeout
-		{
-			get
-			{
-				return this.Data.typing_timeout;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.typing_timeout = value;
-			}
-		}
-
-		public time_t type_again
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public uint send_typed_timeout
-		{
-			get
-			{
-				return this.Data.send_typed_timeout;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.send_typed_timeout = value;
-			}
-		}
-
-		public PurpleBuddyIcon icon
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleConvIm
-	{
-		/*
-		 * PurpleConversation * conv
-		 */
-		IntPtr conv;
-
-		/*
-		 * PurpleTypingState typing_state
-		 */
-		UNKNOWN typing_state;
-
-		/*
-		 * guint typing_timeout
-		 */
-		uint typing_timeout;
-
-		/*
-		 * time_t type_again
-		 */
-		UNKNOWN type_again;
-
-		/*
-		 * guint send_typed_timeout
-		 */
-		uint send_typed_timeout;
-
-		/*
-		 * PurpleBuddyIcon * icon
-		 */
-		IntPtr icon;
-
-	}
+	class _PurpleConvIm { }
 }
 
============================================================
--- libpurple/wrapper/PurpleConvMessage.cs	13c7a00605eea942022941986eb3cf57e603b6f3
+++ libpurple/wrapper/PurpleConvMessage.cs	cb993757b4b6b593f3d6d6b4fb68a6262c0ae6ff
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -78,7 +80,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public PurpleMessageFlags flags
+		public Conversation.PurpleMessageFlags flags
 		{
 			get
 			{
@@ -93,7 +95,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public time_t when
+		public DateTime when
 		{
 			get
 			{
@@ -157,12 +159,12 @@ namespace PurpleWrapper
 		/*
 		 * PurpleMessageFlags flags
 		 */
-		UNKNOWN flags;
+		Conversation.PurpleMessageFlags flags;
 
 		/*
 		 * time_t when
 		 */
-		UNKNOWN when;
+		ulong when;
 
 		/*
 		 * PurpleConversation * conv
@@ -175,5 +177,6 @@ namespace PurpleWrapper
 		string alias;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleConversation.cs	cf27ac6b37d0ee0ed575ef2005a899dc445b6859
+++ libpurple/wrapper/PurpleConversation.cs	b96c055f0790332967fe41ba50ee5cbf280be3ef
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,305 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleConversation : UnmanagedWrapper<_PurpleConversation>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleConversation in file "conversation.h".
+		 * Message: The type could not be resolved (GList * logs).
+		 */
+
 		public PurpleConversation()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleConversation(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleConversation)Marshal.PtrToStructure(this.Reference, typeof(_PurpleConversation));
+			throw new NotImplementedException();
 		}
 
-		public PurpleConversationType type
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public string title
-		{
-			get
-			{
-				return this.Data.title;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.title = value;
-			}
-		}
-
-		public bool logging
-		{
-			get
-			{
-				return this.Data.logging;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.logging = value;
-			}
-		}
-
-		public GList logs
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public union {
-		PurpleConvIm   *im
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleConvChat chat
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr misc
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleConversationUiOps ui_ops
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleConnectionFlags features
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList message_history
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleConversation
-	{
-		/*
-		 * PurpleConversationType type
-		 */
-		UNKNOWN type;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * char * name
-		 */
-		string name;
-
-		/*
-		 * char * title
-		 */
-		string title;
-
-		/*
-		 * gboolean logging
-		 */
-		bool logging;
-
-		/*
-		 * GList * logs
-		 */
-		IntPtr logs;
-
-		/*
-		 * union {
-		PurpleConvIm   *im
-		 */
-		UNKNOWN {
-		PurpleConvIm   *im;
-
-		/*
-		 * PurpleConvChat * chat
-		 */
-		IntPtr chat;
-
-		/*
-		 * void * misc
-		 */
-		IntPtr misc;
-
-		/*
-		 * PurpleConversationUiOps * ui_ops
-		 */
-		IntPtr ui_ops;
-
-		/*
-		 * void * ui_data
-		 */
-		IntPtr ui_data;
-
-		/*
-		 * GHashTable * data
-		 */
-		IntPtr data;
-
-		/*
-		 * PurpleConnectionFlags features
-		 */
-		UNKNOWN features;
-
-		/*
-		 * GList * message_history
-		 */
-		IntPtr message_history;
-
-	}
+	class _PurpleConversation { }
 }
 
============================================================
--- libpurple/wrapper/PurpleConversationUiOps.cs	69112eb4a0ceb5bd549fa42828c211e484e25fb9
+++ libpurple/wrapper/PurpleConversationUiOps.cs	cbf4f9df6e19e8977354b84c83ba93a0cf52c935
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -273,7 +275,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved1
+		public void purple_reserved1
 		{
 			get
 			{
@@ -288,7 +290,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved2
+		public void purple_reserved2
 		{
 			get
 			{
@@ -303,7 +305,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved3
+		public void purple_reserved3
 		{
 			get
 			{
@@ -318,7 +320,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved4
+		public void purple_reserved4
 		{
 			get
 			{
@@ -415,25 +417,26 @@ namespace PurpleWrapper
 		void send_confirm;
 
 		/*
-		 * void (*_purple_reserved1)()
+		 * void (*purple_reserved1)()
 		 */
-		void _purple_reserved1;
+		void purple_reserved1;
 
 		/*
-		 * void (*_purple_reserved2)()
+		 * void (*purple_reserved2)()
 		 */
-		void _purple_reserved2;
+		void purple_reserved2;
 
 		/*
-		 * void (*_purple_reserved3)()
+		 * void (*purple_reserved3)()
 		 */
-		void _purple_reserved3;
+		void purple_reserved3;
 
 		/*
-		 * void (*_purple_reserved4)()
+		 * void (*purple_reserved4)()
 		 */
-		void _purple_reserved4;
+		void purple_reserved4;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleEventLoopUiOps.cs	47c20a415a683ca8d8e93508faf7c4229cb0e5b5
+++ libpurple/wrapper/PurpleEventLoopUiOps.cs	60bab670242475ab2c2acddff37c3efdc3338b1f
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -138,7 +140,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved2
+		public void purple_reserved2
 		{
 			get
 			{
@@ -153,7 +155,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved3
+		public void purple_reserved3
 		{
 			get
 			{
@@ -168,7 +170,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved4
+		public void purple_reserved4
 		{
 			get
 			{
@@ -220,20 +222,21 @@ namespace PurpleWrapper
 		uint timeout_add_seconds;
 
 		/*
-		 * void (*_purple_reserved2)()
+		 * void (*purple_reserved2)()
 		 */
-		void _purple_reserved2;
+		void purple_reserved2;
 
 		/*
-		 * void (*_purple_reserved3)()
+		 * void (*purple_reserved3)()
 		 */
-		void _purple_reserved3;
+		void purple_reserved3;
 
 		/*
-		 * void (*_purple_reserved4)()
+		 * void (*purple_reserved4)()
 		 */
-		void _purple_reserved4;
+		void purple_reserved4;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleGroup.cs	22098e5d15e0d66d82812d9f4929516891ddbbf0
+++ libpurple/wrapper/PurpleGroup.cs	37d75f081a62a417f01bcf0af42b2b6e8535f330
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,122 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleGroup : UnmanagedWrapper<_PurpleGroup>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleGroup in file "blist.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleBlistNode node).
+		 */
+
 		public PurpleGroup()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleGroup(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleGroup)Marshal.PtrToStructure(this.Reference, typeof(_PurpleGroup));
+			throw new NotImplementedException();
 		}
 
-		public PurpleBlistNode node
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public int totalsize
-		{
-			get
-			{
-				return this.Data.totalsize;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.totalsize = value;
-			}
-		}
-
-		public int currentsize
-		{
-			get
-			{
-				return this.Data.currentsize;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.currentsize = value;
-			}
-		}
-
-		public int online
-		{
-			get
-			{
-				return this.Data.online;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.online = value;
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleGroup
-	{
-		/*
-		 * PurpleBlistNode node
-		 */
-		UNKNOWN node;
-
-		/*
-		 * char * name
-		 */
-		string name;
-
-		/*
-		 * int totalsize
-		 */
-		int totalsize;
-
-		/*
-		 * int currentsize
-		 */
-		int currentsize;
-
-		/*
-		 * int online
-		 */
-		int online;
-
-	}
+	class _PurpleGroup { }
 }
 
============================================================
--- libpurple/wrapper/PurpleKeyValuePair.cs	f4586393f96da8b38dc1c3fdd97befeff36a4502
+++ libpurple/wrapper/PurpleKeyValuePair.cs	02498c73f48913f2383b26fea09b192163a28579
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -95,5 +97,6 @@ namespace PurpleWrapper
 		IntPtr value;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleLog.cs	fb63edc33f8b39be269652c1fa0716fa08d4f3e8
+++ libpurple/wrapper/PurpleLog.cs	1ae55416f45022f39ac863369fd6ba96fe22e0f2
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,182 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleLog : UnmanagedWrapper<_PurpleLog>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleLog in file "log.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
+		 */
+
 		public PurpleLog()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleLog(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleLog)Marshal.PtrToStructure(this.Reference, typeof(_PurpleLog));
+			throw new NotImplementedException();
 		}
 
-		public PurpleLogType type
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleConversation conv
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public time_t time
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleLogLogger logger
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr logger_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public struct tm *tm
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleLog
-	{
-		/*
-		 * PurpleLogType type
-		 */
-		UNKNOWN type;
-
-		/*
-		 * char * name
-		 */
-		string name;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * PurpleConversation * conv
-		 */
-		IntPtr conv;
-
-		/*
-		 * time_t time
-		 */
-		UNKNOWN time;
-
-		/*
-		 * PurpleLogLogger * logger
-		 */
-		IntPtr logger;
-
-		/*
-		 * void * logger_data
-		 */
-		IntPtr logger_data;
-
-		/*
-		 * struct tm *tm
-		 */
-		UNKNOWN tm *tm;
-
-	}
+	class _PurpleLog { }
 }
 
============================================================
--- libpurple/wrapper/PurpleLogCommonLoggerData.cs	542283ebad3d78f2825aef0e7876298f16229a54
+++ libpurple/wrapper/PurpleLogCommonLoggerData.cs	bbeb0e0c25f8196010a8af062aa14503d0d62d0f
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,82 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleLogCommonLoggerData : UnmanagedWrapper<_PurpleLogCommonLoggerData>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleLogCommonLoggerData in file "log.h".
+		 * Message: The type could not be resolved (FILE * file).
+		 */
+
 		public PurpleLogCommonLoggerData()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleLogCommonLoggerData(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleLogCommonLoggerData)Marshal.PtrToStructure(this.Reference, typeof(_PurpleLogCommonLoggerData));
+			throw new NotImplementedException();
 		}
 
-		public string path
-		{
-			get
-			{
-				return this.Data.path;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.path = value;
-			}
-		}
-
-		public FILE file
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr extra_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleLogCommonLoggerData
-	{
-		/*
-		 * char * path
-		 */
-		string path;
-
-		/*
-		 * FILE * file
-		 */
-		IntPtr file;
-
-		/*
-		 * void * extra_data
-		 */
-		IntPtr extra_data;
-
-	}
+	class _PurpleLogCommonLoggerData { }
 }
 
============================================================
--- libpurple/wrapper/PurpleLogLogger.cs	24333eed2e73b7a816969625c605a841d20aea72
+++ libpurple/wrapper/PurpleLogLogger.cs	c6abab60a68b9e4e05f7157ecf340664e013ff6a
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,362 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleLogLogger : UnmanagedWrapper<_PurpleLogLogger>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleLogLogger in file "log.h".
+		 * Message: The type could not be resolved (GList * (*list)(PurpleLogType type, char * name, PurpleAccount * account)).
+		 */
+
 		public PurpleLogLogger()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleLogLogger(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleLogLogger)Marshal.PtrToStructure(this.Reference, typeof(_PurpleLogLogger));
+			throw new NotImplementedException();
 		}
 
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public string id
-		{
-			get
-			{
-				return this.Data.id;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.id = value;
-			}
-		}
-
-		public void create
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public gsize write
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void finalize
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList list
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string read
-		{
-			get
-			{
-				return this.Data.read;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.read = value;
-			}
-		}
-
-		public int size
-		{
-			get
-			{
-				return this.Data.size;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.size = value;
-			}
-		}
-
-		public int total_size
-		{
-			get
-			{
-				return this.Data.total_size;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.total_size = value;
-			}
-		}
-
-		public GList list_syslog
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void get_log_sets
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool remove
-		{
-			get
-			{
-				return this.Data.remove;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.remove = value;
-			}
-		}
-
-		public bool is_deletable
-		{
-			get
-			{
-				return this.Data.is_deletable;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.is_deletable = value;
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleLogLogger
-	{
-		/*
-		 * char * name
-		 */
-		string name;
-
-		/*
-		 * char * id
-		 */
-		string id;
-
-		/*
-		 * void (*create)(PurpleLog * log)
-		 */
-		void create;
-
-		/*
-		 * gsize (*write)(PurpleLog * log, PurpleMessageFlags type, char * from, time_t time, char * message)
-		 */
-		UNKNOWN write;
-
-		/*
-		 * void (*finalize)(PurpleLog * log)
-		 */
-		void finalize;
-
-		/*
-		 * GList * (*list)(PurpleLogType type, char * name, PurpleAccount * account)
-		 */
-		IntPtr list;
-
-		/*
-		 * char * (*read)(PurpleLog * log, PurpleLogReadFlags * flags)
-		 */
-		string read;
-
-		/*
-		 * int (*size)(PurpleLog * log)
-		 */
-		int size;
-
-		/*
-		 * int (*total_size)(PurpleLogType type, char * name, PurpleAccount * account)
-		 */
-		int total_size;
-
-		/*
-		 * GList * (*list_syslog)(PurpleAccount * account)
-		 */
-		IntPtr list_syslog;
-
-		/*
-		 * void (*get_log_sets)(PurpleLogSetCallback cb, GHashTable * sets)
-		 */
-		void get_log_sets;
-
-		/*
-		 * gboolean (*remove)(PurpleLog * log)
-		 */
-		bool remove;
-
-		/*
-		 * gboolean (*is_deletable)(PurpleLog * log)
-		 */
-		bool is_deletable;
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurpleLogLogger { }
 }
 
============================================================
--- libpurple/wrapper/PurpleLogSet.cs	ee511a3d084d44930d23af9c9a97176300c94c05
+++ libpurple/wrapper/PurpleLogSet.cs	78e59157ba92e702f267262d3b2aed7a2ca81c49
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleLogSet)Marshal.PtrToStructure(this.Reference, typeof(_PurpleLogSet));
 		}
 
-		public PurpleLogType type
+		public Log.PurpleLogType type
 		{
 			get
 			{
@@ -132,7 +134,7 @@ namespace PurpleWrapper
 		/*
 		 * PurpleLogType type
 		 */
-		UNKNOWN type;
+		Log.PurpleLogType type;
 
 		/*
 		 * char * name
@@ -155,5 +157,6 @@ namespace PurpleWrapper
 		string normalized_name;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleMenuAction.cs	5c99cee5c84338b0823b7e63c8bea9c95474ca12
+++ libpurple/wrapper/PurpleMenuAction.cs	48877ec4f3db415df65f663f4b0d7befd8b9ea72
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,102 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleMenuAction : UnmanagedWrapper<_PurpleMenuAction>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleMenuAction in file "util.h".
+		 * Message: The struct contains an object that resolves to a function pointer (PurpleCallback callback).
+		 */
+
 		public PurpleMenuAction()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleMenuAction(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleMenuAction)Marshal.PtrToStructure(this.Reference, typeof(_PurpleMenuAction));
+			throw new NotImplementedException();
 		}
 
-		public string label
-		{
-			get
-			{
-				return this.Data.label;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.label = value;
-			}
-		}
-
-		public PurpleCallback callback
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList children
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleMenuAction
-	{
-		/*
-		 * char * label
-		 */
-		string label;
-
-		/*
-		 * PurpleCallback callback
-		 */
-		UNKNOWN callback;
-
-		/*
-		 * gpointer data
-		 */
-		IntPtr data;
-
-		/*
-		 * GList * children
-		 */
-		IntPtr children;
-
-	}
+	class _PurpleMenuAction { }
 }
 
============================================================
--- libpurple/wrapper/PurplePlugin.cs	f12e0cf51121b6abbc825d3834d37ee78b2cc02c
+++ libpurple/wrapper/PurplePlugin.cs	cd42a2a5630e591d879d20bcafe30501d939b747
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,302 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurplePlugin : UnmanagedWrapper<_PurplePlugin>
 	{
+		/* 
+		 * Could not generate a wrapper for PurplePlugin in file "plugin.h".
+		 * Message: The type could not be resolved (GList * dependent_plugins).
+		 */
+
 		public PurplePlugin()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurplePlugin(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurplePlugin)Marshal.PtrToStructure(this.Reference, typeof(_PurplePlugin));
+			throw new NotImplementedException();
 		}
 
-		public bool native_plugin
-		{
-			get
-			{
-				return this.Data.native_plugin;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.native_plugin = value;
-			}
-		}
-
-		public bool loaded
-		{
-			get
-			{
-				return this.Data.loaded;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.loaded = value;
-			}
-		}
-
-		public IntPtr handle
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string path
-		{
-			get
-			{
-				return this.Data.path;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.path = value;
-			}
-		}
-
-		public PurplePluginInfo info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string error
-		{
-			get
-			{
-				return this.Data.error;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.error = value;
-			}
-		}
-
-		public IntPtr ipc_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr extra
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool unloadable
-		{
-			get
-			{
-				return this.Data.unloadable;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.unloadable = value;
-			}
-		}
-
-		public GList dependent_plugins
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurplePlugin
-	{
-		/*
-		 * gboolean native_plugin
-		 */
-		bool native_plugin;
-
-		/*
-		 * gboolean loaded
-		 */
-		bool loaded;
-
-		/*
-		 * void * handle
-		 */
-		IntPtr handle;
-
-		/*
-		 * char * path
-		 */
-		string path;
-
-		/*
-		 * PurplePluginInfo * info
-		 */
-		IntPtr info;
-
-		/*
-		 * char * error
-		 */
-		string error;
-
-		/*
-		 * void * ipc_data
-		 */
-		IntPtr ipc_data;
-
-		/*
-		 * void * extra
-		 */
-		IntPtr extra;
-
-		/*
-		 * gboolean unloadable
-		 */
-		bool unloadable;
-
-		/*
-		 * GList * dependent_plugins
-		 */
-		IntPtr dependent_plugins;
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurplePlugin { }
 }
 
============================================================
--- libpurple/wrapper/PurplePluginAction.cs	4cd3291351280d040a84a7dcfcd7280f35384f3e
+++ libpurple/wrapper/PurplePluginAction.cs	e5e262e392739b2b7b1cb56c2c12f48e11d585be
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -135,7 +137,7 @@ namespace PurpleWrapper
 		string label;
 
 		/*
-		 * void (*callback)( )
+		 * void (*callback)(PurplePluginAction * )
 		 */
 		void callback;
 
@@ -155,5 +157,6 @@ namespace PurpleWrapper
 		IntPtr user_data;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurplePluginInfo.cs	77bd6db85498b2a0aeb1601e7d2bfebf2ea49744
+++ libpurple/wrapper/PurplePluginInfo.cs	12caa8d44a09e12b902a6ca856c923a4e596c213
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,542 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurplePluginInfo : UnmanagedWrapper<_PurplePluginInfo>
 	{
+		/* 
+		 * Could not generate a wrapper for PurplePluginInfo in file "plugin.h".
+		 * Message: The type could not be resolved (GList * dependencies).
+		 */
+
 		public PurplePluginInfo()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurplePluginInfo(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurplePluginInfo)Marshal.PtrToStructure(this.Reference, typeof(_PurplePluginInfo));
+			throw new NotImplementedException();
 		}
 
-		public unsigned int magic
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public unsigned int major_version
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public unsigned int minor_version
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurplePluginType type
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string ui_requirement
-		{
-			get
-			{
-				return this.Data.ui_requirement;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.ui_requirement = value;
-			}
-		}
-
-		public unsigned long flags
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList dependencies
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurplePluginPriority priority
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string id
-		{
-			get
-			{
-				return this.Data.id;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.id = value;
-			}
-		}
-
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public string version
-		{
-			get
-			{
-				return this.Data.version;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.version = value;
-			}
-		}
-
-		public string summary
-		{
-			get
-			{
-				return this.Data.summary;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.summary = value;
-			}
-		}
-
-		public string description
-		{
-			get
-			{
-				return this.Data.description;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.description = value;
-			}
-		}
-
-		public string author
-		{
-			get
-			{
-				return this.Data.author;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.author = value;
-			}
-		}
-
-		public string homepage
-		{
-			get
-			{
-				return this.Data.homepage;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.homepage = value;
-			}
-		}
-
-		public bool load
-		{
-			get
-			{
-				return this.Data.load;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.load = value;
-			}
-		}
-
-		public bool unload
-		{
-			get
-			{
-				return this.Data.unload;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.unload = value;
-			}
-		}
-
-		public void destroy
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr ui_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr extra_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurplePluginUiInfo prefs_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList actions
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurplePluginInfo
-	{
-		/*
-		 * unsigned int magic
-		 */
-		UNKNOWN int magic;
-
-		/*
-		 * unsigned int major_version
-		 */
-		UNKNOWN int major_version;
-
-		/*
-		 * unsigned int minor_version
-		 */
-		UNKNOWN int minor_version;
-
-		/*
-		 * PurplePluginType type
-		 */
-		UNKNOWN type;
-
-		/*
-		 * char * ui_requirement
-		 */
-		string ui_requirement;
-
-		/*
-		 * unsigned long flags
-		 */
-		UNKNOWN long flags;
-
-		/*
-		 * GList * dependencies
-		 */
-		IntPtr dependencies;
-
-		/*
-		 * PurplePluginPriority priority
-		 */
-		UNKNOWN priority;
-
-		/*
-		 * char * id
-		 */
-		string id;
-
-		/*
-		 * char * name
-		 */
-		string name;
-
-		/*
-		 * char * version
-		 */
-		string version;
-
-		/*
-		 * char * summary
-		 */
-		string summary;
-
-		/*
-		 * char * description
-		 */
-		string description;
-
-		/*
-		 * char * author
-		 */
-		string author;
-
-		/*
-		 * char * homepage
-		 */
-		string homepage;
-
-		/*
-		 * gboolean (*load)(PurplePlugin * plugin)
-		 */
-		bool load;
-
-		/*
-		 * gboolean (*unload)(PurplePlugin * plugin)
-		 */
-		bool unload;
-
-		/*
-		 * void (*destroy)(PurplePlugin * plugin)
-		 */
-		void destroy;
-
-		/*
-		 * void * ui_info
-		 */
-		IntPtr ui_info;
-
-		/*
-		 * void * extra_info
-		 */
-		IntPtr extra_info;
-
-		/*
-		 * PurplePluginUiInfo * prefs_info
-		 */
-		IntPtr prefs_info;
-
-		/*
-		 * GList * (*actions)(PurplePlugin * plugin, gpointer context)
-		 */
-		IntPtr actions;
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurplePluginInfo { }
 }
 
============================================================
--- libpurple/wrapper/PurplePluginLoaderInfo.cs	6b51b690a94a2e2c70eeefb7128554e440af19ab
+++ libpurple/wrapper/PurplePluginLoaderInfo.cs	52f7e79f6c6b5c32457744859870ea3635ab5bbc
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,202 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurplePluginLoaderInfo : UnmanagedWrapper<_PurplePluginLoaderInfo>
 	{
+		/* 
+		 * Could not generate a wrapper for PurplePluginLoaderInfo in file "plugin.h".
+		 * Message: The type could not be resolved (GList * exts).
+		 */
+
 		public PurplePluginLoaderInfo()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurplePluginLoaderInfo(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurplePluginLoaderInfo)Marshal.PtrToStructure(this.Reference, typeof(_PurplePluginLoaderInfo));
+			throw new NotImplementedException();
 		}
 
-		public GList exts
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool probe
-		{
-			get
-			{
-				return this.Data.probe;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.probe = value;
-			}
-		}
-
-		public bool load
-		{
-			get
-			{
-				return this.Data.load;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.load = value;
-			}
-		}
-
-		public bool unload
-		{
-			get
-			{
-				return this.Data.unload;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.unload = value;
-			}
-		}
-
-		public void destroy
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurplePluginLoaderInfo
-	{
-		/*
-		 * GList * exts
-		 */
-		IntPtr exts;
-
-		/*
-		 * gboolean (*probe)(PurplePlugin * plugin)
-		 */
-		bool probe;
-
-		/*
-		 * gboolean (*load)(PurplePlugin * plugin)
-		 */
-		bool load;
-
-		/*
-		 * gboolean (*unload)(PurplePlugin * plugin)
-		 */
-		bool unload;
-
-		/*
-		 * void (*destroy)(PurplePlugin * plugin)
-		 */
-		void destroy;
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurplePluginLoaderInfo { }
 }
 
============================================================
--- libpurple/wrapper/PurplePluginProtocolInfo.cs	673ba3030b371b8a3ba3a1bea66589a719905cfb
+++ libpurple/wrapper/PurplePluginProtocolInfo.cs	1944c717d405e425da5af72ac9114e9e67e27920
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,1402 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurplePluginProtocolInfo : UnmanagedWrapper<_PurplePluginProtocolInfo>
 	{
+		/* 
+		 * Could not generate a wrapper for PurplePluginProtocolInfo in file "prpl.h".
+		 * Message: The type could not be resolved (GList * user_splits).
+		 */
+
 		public PurplePluginProtocolInfo()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurplePluginProtocolInfo(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurplePluginProtocolInfo)Marshal.PtrToStructure(this.Reference, typeof(_PurplePluginProtocolInfo));
+			throw new NotImplementedException();
 		}
 
-		public PurpleProtocolOptions options
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList user_splits
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList protocol_options
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleBuddyIconSpec icon_spec
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *(*list_icon)(PurpleAccount *account, PurpleBuddy *buddy)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *(*list_emblem)(PurpleBuddy *buddy)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string status_text
-		{
-			get
-			{
-				return this.Data.status_text;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.status_text = value;
-			}
-		}
-
-		public void tooltip_text
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList status_types
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList blist_node_menu
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList chat_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable chat_info_defaults
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void login
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void close
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int send_im
-		{
-			get
-			{
-				return this.Data.send_im;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.send_im = value;
-			}
-		}
-
-		public void set_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public unsigned int (*send_typing)(PurpleConnection *, const char *name, PurpleTypingState state)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void get_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_status
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_idle
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void change_passwd
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void add_buddy
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void add_buddies
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void remove_buddy
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void remove_buddies
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void add_permit
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void add_deny
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void rem_permit
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void rem_deny
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_permit_deny
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void join_chat
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void reject_chat
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string get_chat_name
-		{
-			get
-			{
-				return this.Data.get_chat_name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.get_chat_name = value;
-			}
-		}
-
-		public void chat_invite
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void chat_leave
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void chat_whisper
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int chat_send
-		{
-			get
-			{
-				return this.Data.chat_send;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.chat_send = value;
-			}
-		}
-
-		public void keepalive
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void register_user
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void get_cb_info
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void get_cb_away
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void alias_buddy
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void group_buddy
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void rename_group
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void buddy_free
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void convo_closed
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *(*normalize)(const PurpleAccount *, const char *who)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_buddy_icon
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void remove_group
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string get_cb_real_name
-		{
-			get
-			{
-				return this.Data.get_cb_real_name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.get_cb_real_name = value;
-			}
-		}
-
-		public void set_chat_topic
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleChat find_blist_chat
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleRoomlist roomlist_get_list
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void roomlist_cancel
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void roomlist_expand_category
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool can_receive_file
-		{
-			get
-			{
-				return this.Data.can_receive_file;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.can_receive_file = value;
-			}
-		}
-
-		public void send_file
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleXfer new_xfer
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool offline_message
-		{
-			get
-			{
-				return this.Data.offline_message;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.offline_message = value;
-			}
-		}
-
-		public PurpleWhiteboardPrplOps whiteboard_prpl_ops
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int send_raw
-		{
-			get
-			{
-				return this.Data.send_raw;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.send_raw = value;
-			}
-		}
-
-		public string roomlist_room_serialize
-		{
-			get
-			{
-				return this.Data.roomlist_room_serialize;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.roomlist_room_serialize = value;
-			}
-		}
-
-		public void unregister_user
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool send_attention
-		{
-			get
-			{
-				return this.Data.send_attention;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.send_attention = value;
-			}
-		}
-
-		public GList get_attention_types
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public unsigned long struct_size
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable get_account_text_table
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool initiate_media
-		{
-			get
-			{
-				return this.Data.initiate_media;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.initiate_media = value;
-			}
-		}
-
-		public PurpleMediaCaps get_media_caps
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurplePluginProtocolInfo
-	{
-		/*
-		 * PurpleProtocolOptions options
-		 */
-		UNKNOWN options;
-
-		/*
-		 * GList * user_splits
-		 */
-		IntPtr user_splits;
-
-		/*
-		 * GList * protocol_options
-		 */
-		IntPtr protocol_options;
-
-		/*
-		 * PurpleBuddyIconSpec icon_spec
-		 */
-		UNKNOWN icon_spec;
-
-		/*
-		 * const char *(*list_icon)(PurpleAccount *account, PurpleBuddy *buddy)
-		 */
-		UNKNOWN char *(*list_icon)(PurpleAccount *account, PurpleBuddy *buddy);
-
-		/*
-		 * const char *(*list_emblem)(PurpleBuddy *buddy)
-		 */
-		UNKNOWN char *(*list_emblem)(PurpleBuddy *buddy);
-
-		/*
-		 * char * (*status_text)(PurpleBuddy * buddy)
-		 */
-		string status_text;
-
-		/*
-		 * void (*tooltip_text)(PurpleBuddy * buddy, PurpleNotifyUserInfo * user_info, gboolean full)
-		 */
-		void tooltip_text;
-
-		/*
-		 * GList * (*status_types)(PurpleAccount * account)
-		 */
-		IntPtr status_types;
-
-		/*
-		 * GList * (*blist_node_menu)(PurpleBlistNode * node)
-		 */
-		IntPtr blist_node_menu;
-
-		/*
-		 * GList * (*chat_info)( )
-		 */
-		IntPtr chat_info;
-
-		/*
-		 * GHashTable * (*chat_info_defaults)( , char * chat_name)
-		 */
-		IntPtr chat_info_defaults;
-
-		/*
-		 * void (*login)( )
-		 */
-		void login;
-
-		/*
-		 * void (*close)( )
-		 */
-		void close;
-
-		/*
-		 * int (*send_im)( , char * who, char * message, PurpleMessageFlags flags)
-		 */
-		int send_im;
-
-		/*
-		 * void (*set_info)( , char * info)
-		 */
-		void set_info;
-
-		/*
-		 * unsigned int (*send_typing)(PurpleConnection *, const char *name, PurpleTypingState state)
-		 */
-		UNKNOWN int (*send_typing)(PurpleConnection *, const char *name, PurpleTypingState state);
-
-		/*
-		 * void (*get_info)( , char * who)
-		 */
-		void get_info;
-
-		/*
-		 * void (*set_status)(PurpleAccount * account, PurpleStatus * status)
-		 */
-		void set_status;
-
-		/*
-		 * void (*set_idle)( , int idletime)
-		 */
-		void set_idle;
-
-		/*
-		 * void (*change_passwd)( , char * old_pass, char * new_pass)
-		 */
-		void change_passwd;
-
-		/*
-		 * void (*add_buddy)( , PurpleBuddy * buddy, PurpleGroup * group)
-		 */
-		void add_buddy;
-
-		/*
-		 * void (*add_buddies)( , GList * buddies, GList * groups)
-		 */
-		void add_buddies;
-
-		/*
-		 * void (*remove_buddy)( , PurpleBuddy * buddy, PurpleGroup * group)
-		 */
-		void remove_buddy;
-
-		/*
-		 * void (*remove_buddies)( , GList * buddies, GList * groups)
-		 */
-		void remove_buddies;
-
-		/*
-		 * void (*add_permit)( , char * name)
-		 */
-		void add_permit;
-
-		/*
-		 * void (*add_deny)( , char * name)
-		 */
-		void add_deny;
-
-		/*
-		 * void (*rem_permit)( , char * name)
-		 */
-		void rem_permit;
-
-		/*
-		 * void (*rem_deny)( , char * name)
-		 */
-		void rem_deny;
-
-		/*
-		 * void (*set_permit_deny)( )
-		 */
-		void set_permit_deny;
-
-		/*
-		 * void (*join_chat)( , GHashTable * components)
-		 */
-		void join_chat;
-
-		/*
-		 * void (*reject_chat)( , GHashTable * components)
-		 */
-		void reject_chat;
-
-		/*
-		 * char * (*get_chat_name)(GHashTable * components)
-		 */
-		string get_chat_name;
-
-		/*
-		 * void (*chat_invite)( , int id, char * message, char * who)
-		 */
-		void chat_invite;
-
-		/*
-		 * void (*chat_leave)( , int id)
-		 */
-		void chat_leave;
-
-		/*
-		 * void (*chat_whisper)( , int id, char * who, char * message)
-		 */
-		void chat_whisper;
-
-		/*
-		 * int (*chat_send)( , int id, char * message, PurpleMessageFlags flags)
-		 */
-		int chat_send;
-
-		/*
-		 * void (*keepalive)( )
-		 */
-		void keepalive;
-
-		/*
-		 * void (*register_user)( )
-		 */
-		void register_user;
-
-		/*
-		 * void (*get_cb_info)( ,  , char * who)
-		 */
-		void get_cb_info;
-
-		/*
-		 * void (*get_cb_away)( ,  , char * who)
-		 */
-		void get_cb_away;
-
-		/*
-		 * void (*alias_buddy)( , char * who, char * alias)
-		 */
-		void alias_buddy;
-
-		/*
-		 * void (*group_buddy)( , char * who, char * old_group, char * new_group)
-		 */
-		void group_buddy;
-
-		/*
-		 * void (*rename_group)( , char * old_name, PurpleGroup * group, GList * moved_buddies)
-		 */
-		void rename_group;
-
-		/*
-		 * void (*buddy_free)( )
-		 */
-		void buddy_free;
-
-		/*
-		 * void (*convo_closed)( , char * who)
-		 */
-		void convo_closed;
-
-		/*
-		 * const char *(*normalize)(const PurpleAccount *, const char *who)
-		 */
-		UNKNOWN char *(*normalize)(const PurpleAccount *, const char *who);
-
-		/*
-		 * void (*set_buddy_icon)( , PurpleStoredImage * img)
-		 */
-		void set_buddy_icon;
-
-		/*
-		 * void (*remove_group)(PurpleConnection * gc, PurpleGroup * group)
-		 */
-		void remove_group;
-
-		/*
-		 * char * (*get_cb_real_name)(PurpleConnection * gc, int id, char * who)
-		 */
-		string get_cb_real_name;
-
-		/*
-		 * void (*set_chat_topic)(PurpleConnection * gc, int id, char * topic)
-		 */
-		void set_chat_topic;
-
-		/*
-		 * PurpleChat * (*find_blist_chat)(PurpleAccount * account, char * name)
-		 */
-		IntPtr find_blist_chat;
-
-		/*
-		 * PurpleRoomlist * (*roomlist_get_list)(PurpleConnection * gc)
-		 */
-		IntPtr roomlist_get_list;
-
-		/*
-		 * void (*roomlist_cancel)(PurpleRoomlist * list)
-		 */
-		void roomlist_cancel;
-
-		/*
-		 * void (*roomlist_expand_category)(PurpleRoomlist * list, PurpleRoomlistRoom * category)
-		 */
-		void roomlist_expand_category;
-
-		/*
-		 * gboolean (*can_receive_file)( , char * who)
-		 */
-		bool can_receive_file;
-
-		/*
-		 * void (*send_file)( , char * who, char * filename)
-		 */
-		void send_file;
-
-		/*
-		 * PurpleXfer * (*new_xfer)( , char * who)
-		 */
-		IntPtr new_xfer;
-
-		/*
-		 * gboolean (*offline_message)(PurpleBuddy * buddy)
-		 */
-		bool offline_message;
-
-		/*
-		 * PurpleWhiteboardPrplOps * whiteboard_prpl_ops
-		 */
-		IntPtr whiteboard_prpl_ops;
-
-		/*
-		 * int (*send_raw)(PurpleConnection * gc, char * buf, int len)
-		 */
-		int send_raw;
-
-		/*
-		 * char * (*roomlist_room_serialize)(PurpleRoomlistRoom * room)
-		 */
-		string roomlist_room_serialize;
-
-		/*
-		 * void (*unregister_user)( , PurpleAccountUnregistrationCb cb, void * user_data)
-		 */
-		void unregister_user;
-
-		/*
-		 * gboolean (*send_attention)(PurpleConnection * gc, char * username, guint type)
-		 */
-		bool send_attention;
-
-		/*
-		 * GList * (*get_attention_types)(PurpleAccount * acct)
-		 */
-		IntPtr get_attention_types;
-
-		/*
-		 * unsigned long struct_size
-		 */
-		UNKNOWN long struct_size;
-
-		/*
-		 * GHashTable * (*get_account_text_table)(PurpleAccount * account)
-		 */
-		IntPtr get_account_text_table;
-
-		/*
-		 * gboolean (*initiate_media)(PurpleAccount * account, char * who, PurpleMediaSessionType type)
-		 */
-		bool initiate_media;
-
-		/*
-		 * PurpleMediaCaps (*get_media_caps)(PurpleAccount * account, char * who)
-		 */
-		UNKNOWN get_media_caps;
-
-	}
+	class _PurplePluginProtocolInfo { }
 }
 
============================================================
--- libpurple/wrapper/PurplePluginUiInfo.cs	d44b1f15f1472669ab1ffdbd57ac38d3a411e627
+++ libpurple/wrapper/PurplePluginUiInfo.cs	c81b5347ad038129b014796d65c543ca5c08b96e
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,162 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurplePluginUiInfo : UnmanagedWrapper<_PurplePluginUiInfo>
 	{
+		/* 
+		 * Could not generate a wrapper for PurplePluginUiInfo in file "plugin.h".
+		 * Message: The type could not be resolved (PurplePluginPrefFrame * (*get_plugin_pref_frame)(PurplePlugin * plugin)).
+		 */
+
 		public PurplePluginUiInfo()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurplePluginUiInfo(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurplePluginUiInfo)Marshal.PtrToStructure(this.Reference, typeof(_PurplePluginUiInfo));
+			throw new NotImplementedException();
 		}
 
-		public PurplePluginPrefFrame get_plugin_pref_frame
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int page_num
-		{
-			get
-			{
-				return this.Data.page_num;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.page_num = value;
-			}
-		}
-
-		public PurplePluginPrefFrame frame
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurplePluginUiInfo
-	{
-		/*
-		 * PurplePluginPrefFrame * (*get_plugin_pref_frame)(PurplePlugin * plugin)
-		 */
-		IntPtr get_plugin_pref_frame;
-
-		/*
-		 * int page_num
-		 */
-		int page_num;
-
-		/*
-		 * PurplePluginPrefFrame * frame
-		 */
-		IntPtr frame;
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurplePluginUiInfo { }
 }
 
============================================================
--- libpurple/wrapper/PurplePounce.cs	c806f60a8c94c13e33a0ca53e67fd5025a76fb06
+++ libpurple/wrapper/PurplePounce.cs	aa3c273f48dba7ac7d871826eb758b8cd2eabdd2
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,182 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurplePounce : UnmanagedWrapper<_PurplePounce>
 	{
+		/* 
+		 * Could not generate a wrapper for PurplePounce in file "pounce.h".
+		 * Message: The type could not be resolved (GHashTable * actions).
+		 */
+
 		public PurplePounce()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurplePounce(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurplePounce)Marshal.PtrToStructure(this.Reference, typeof(_PurplePounce));
+			throw new NotImplementedException();
 		}
 
-		public string ui_type
-		{
-			get
-			{
-				return this.Data.ui_type;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.ui_type = value;
-			}
-		}
-
-		public PurplePounceEvent events
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurplePounceOption options
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccount pouncer
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string pouncee
-		{
-			get
-			{
-				return this.Data.pouncee;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.pouncee = value;
-			}
-		}
-
-		public GHashTable actions
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool save
-		{
-			get
-			{
-				return this.Data.save;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.save = value;
-			}
-		}
-
-		public IntPtr data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurplePounce
-	{
-		/*
-		 * char * ui_type
-		 */
-		string ui_type;
-
-		/*
-		 * PurplePounceEvent events
-		 */
-		UNKNOWN events;
-
-		/*
-		 * PurplePounceOption options
-		 */
-		UNKNOWN options;
-
-		/*
-		 * PurpleAccount * pouncer
-		 */
-		IntPtr pouncer;
-
-		/*
-		 * char * pouncee
-		 */
-		string pouncee;
-
-		/*
-		 * GHashTable * actions
-		 */
-		IntPtr actions;
-
-		/*
-		 * gboolean save
-		 */
-		bool save;
-
-		/*
-		 * void * data
-		 */
-		IntPtr data;
-
-	}
+	class _PurplePounce { }
 }
 
============================================================
--- libpurple/wrapper/PurpleRequestField.cs	82ed38c768253b58f4db7c62d30de741fc25aebd
+++ libpurple/wrapper/PurpleRequestField.cs	23572808938c1b55a33d77870ed7caa7d6e8ffd6
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,709 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleRequestField : UnmanagedWrapper<_PurpleRequestField>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleRequestField in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestFieldGroup * group).
+		 */
+
 		public PurpleRequestField()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleRequestField(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleRequestField)Marshal.PtrToStructure(this.Reference, typeof(_PurpleRequestField));
+			throw new NotImplementedException();
 		}
 
-		public PurpleRequestFieldType type
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleRequestFieldGroup group
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string id
-		{
-			get
-			{
-				return this.Data.id;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.id = value;
-			}
-		}
-
-		public string label
-		{
-			get
-			{
-				return this.Data.label;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.label = value;
-			}
-		}
-
-		public string type_hint
-		{
-			get
-			{
-				return this.Data.type_hint;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.type_hint = value;
-			}
-		}
-
-		public bool visible
-		{
-			get
-			{
-				return this.Data.visible;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.visible = value;
-			}
-		}
-
-		public bool required
-		{
-			get
-			{
-				return this.Data.required;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.required = value;
-			}
-		}
-
-		public union {
-		struct
-		{
-			gboolean multiline
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool masked
-		{
-			get
-			{
-				return this.Data.masked;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.masked = value;
-			}
-		}
-
-		public bool editable
-		{
-			get
-			{
-				return this.Data.editable;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.editable = value;
-			}
-		}
-
-		public string default_value
-		{
-			get
-			{
-				return this.Data.default_value;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.default_value = value;
-			}
-		}
-
-		public string value
-		{
-			get
-			{
-				return this.Data.value;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.value = value;
-			}
-		}
-
-		public struct {
-			int default_value
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int value
-		{
-			get
-			{
-				return this.Data.value;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.value = value;
-			}
-		}
-
-		public struct {
-			gboolean default_value
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool value
-		{
-			get
-			{
-				return this.Data.value;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.value = value;
-			}
-		}
-
-		public struct {
-			int default_value
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int value
-		{
-			get
-			{
-				return this.Data.value;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.value = value;
-			}
-		}
-
-		public GList labels
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public struct {
-			GList *items
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable item_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList selected
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GHashTable selected_table
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool multiple_selection
-		{
-			get
-			{
-				return this.Data.multiple_selection;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.multiple_selection = value;
-			}
-		}
-
-		public struct {
-			PurpleAccount *default_account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool show_all
-		{
-			get
-			{
-				return this.Data.show_all;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.show_all = value;
-			}
-		}
-
-		public PurpleFilterAccountFunc filter_func
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public struct {
-			unsigned int scale_x
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public unsigned int scale_y
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *buffer
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public gsize size
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleRequestField
-	{
-		/*
-		 * PurpleRequestFieldType type
-		 */
-		UNKNOWN type;
-
-		/*
-		 * PurpleRequestFieldGroup * group
-		 */
-		IntPtr group;
-
-		/*
-		 * char * id
-		 */
-		string id;
-
-		/*
-		 * char * label
-		 */
-		string label;
-
-		/*
-		 * char * type_hint
-		 */
-		string type_hint;
-
-		/*
-		 * gboolean visible
-		 */
-		bool visible;
-
-		/*
-		 * gboolean required
-		 */
-		bool required;
-
-		/*
-		 * union {
-		struct
-		{
-			gboolean multiline
-		 */
-		UNKNOWN {
-		struct
-		{
-			gboolean multiline;
-
-		/*
-		 * gboolean masked
-		 */
-		bool masked;
-
-		/*
-		 * gboolean editable
-		 */
-		bool editable;
-
-		/*
-		 * char * default_value
-		 */
-		string default_value;
-
-		/*
-		 * char * value
-		 */
-		string value;
-
-		/*
-		 * struct {
-			int default_value
-		 */
-		UNKNOWN {
-			int default_value;
-
-		/*
-		 * int value
-		 */
-		int value;
-
-		/*
-		 * struct {
-			gboolean default_value
-		 */
-		UNKNOWN {
-			gboolean default_value;
-
-		/*
-		 * gboolean value
-		 */
-		bool value;
-
-		/*
-		 * struct {
-			int default_value
-		 */
-		UNKNOWN {
-			int default_value;
-
-		/*
-		 * int value
-		 */
-		int value;
-
-		/*
-		 * GList * labels
-		 */
-		IntPtr labels;
-
-		/*
-		 * struct {
-			GList *items
-		 */
-		UNKNOWN {
-			GList *items;
-
-		/*
-		 * GHashTable * item_data
-		 */
-		IntPtr item_data;
-
-		/*
-		 * GList * selected
-		 */
-		IntPtr selected;
-
-		/*
-		 * GHashTable * selected_table
-		 */
-		IntPtr selected_table;
-
-		/*
-		 * gboolean multiple_selection
-		 */
-		bool multiple_selection;
-
-		/*
-		 * struct {
-			PurpleAccount *default_account
-		 */
-		UNKNOWN {
-			PurpleAccount *default_account;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * gboolean show_all
-		 */
-		bool show_all;
-
-		/*
-		 * PurpleFilterAccountFunc filter_func
-		 */
-		UNKNOWN filter_func;
-
-		/*
-		 * struct {
-			unsigned int scale_x
-		 */
-		UNKNOWN {
-			unsigned int scale_x;
-
-		/*
-		 * unsigned int scale_y
-		 */
-		UNKNOWN int scale_y;
-
-		/*
-		 * const char *buffer
-		 */
-		UNKNOWN char *buffer;
-
-		/*
-		 * gsize size
-		 */
-		UNKNOWN size;
-
-		/*
-		 * void * ui_data
-		 */
-		IntPtr ui_data;
-
-	}
+	class _PurpleRequestField { }
 }
 
============================================================
--- libpurple/wrapper/PurpleRoomlist.cs	08642c5fed77f18bdeea8bf7ff313ac3b712f300
+++ libpurple/wrapper/PurpleRoomlist.cs	a69f10dde661444849aecc63c2799b27db5f584f
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,162 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleRoomlist : UnmanagedWrapper<_PurpleRoomlist>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleRoomlist in file "roomlist.h".
+		 * Message: The type could not be resolved (GList * fields).
+		 */
+
 		public PurpleRoomlist()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleRoomlist(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleRoomlist)Marshal.PtrToStructure(this.Reference, typeof(_PurpleRoomlist));
+			throw new NotImplementedException();
 		}
 
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList fields
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList rooms
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool in_progress
-		{
-			get
-			{
-				return this.Data.in_progress;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.in_progress = value;
-			}
-		}
-
-		public IntPtr ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr proto_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public uint ref
-		{
-			get
-			{
-				return this.Data.ref;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.ref = value;
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleRoomlist
-	{
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * GList * fields
-		 */
-		IntPtr fields;
-
-		/*
-		 * GList * rooms
-		 */
-		IntPtr rooms;
-
-		/*
-		 * gboolean in_progress
-		 */
-		bool in_progress;
-
-		/*
-		 * gpointer ui_data
-		 */
-		IntPtr ui_data;
-
-		/*
-		 * gpointer proto_data
-		 */
-		IntPtr proto_data;
-
-		/*
-		 * guint ref
-		 */
-		uint ref;
-
-	}
+	class _PurpleRoomlist { }
 }
 
============================================================
--- libpurple/wrapper/PurpleRoomlistField.cs	54abfd05f6a266d97f37d3269d095dc164409ab0
+++ libpurple/wrapper/PurpleRoomlistField.cs	1f0ee7edf5e19521d54a4387c123ef8b701c7760
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleRoomlistField)Marshal.PtrToStructure(this.Reference, typeof(_PurpleRoomlistField));
 		}
 
-		public PurpleRoomlistFieldType type
+		public Roomlist.PurpleRoomlistFieldType type
 		{
 			get
 			{
@@ -117,7 +119,7 @@ namespace PurpleWrapper
 		/*
 		 * PurpleRoomlistFieldType type
 		 */
-		UNKNOWN type;
+		Roomlist.PurpleRoomlistFieldType type;
 
 		/*
 		 * gchar * label
@@ -135,5 +137,6 @@ namespace PurpleWrapper
 		bool hidden;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleRoomlistRoom.cs	f6f805c34e479e361dceb39d429b642abb7ec604
+++ libpurple/wrapper/PurpleRoomlistRoom.cs	e2c7312a4d1405f988e5f660c2f9156939678f01
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,122 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleRoomlistRoom : UnmanagedWrapper<_PurpleRoomlistRoom>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleRoomlistRoom in file "roomlist.h".
+		 * Message: The type could not be resolved (GList * fields).
+		 */
+
 		public PurpleRoomlistRoom()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleRoomlistRoom(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleRoomlistRoom)Marshal.PtrToStructure(this.Reference, typeof(_PurpleRoomlistRoom));
+			throw new NotImplementedException();
 		}
 
-		public PurpleRoomlistRoomType type
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string name
-		{
-			get
-			{
-				return this.Data.name;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.name = value;
-			}
-		}
-
-		public GList fields
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleRoomlistRoom parent
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool expanded_once
-		{
-			get
-			{
-				return this.Data.expanded_once;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.expanded_once = value;
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleRoomlistRoom
-	{
-		/*
-		 * PurpleRoomlistRoomType type
-		 */
-		UNKNOWN type;
-
-		/*
-		 * gchar * name
-		 */
-		string name;
-
-		/*
-		 * GList * fields
-		 */
-		IntPtr fields;
-
-		/*
-		 * PurpleRoomlistRoom * parent
-		 */
-		IntPtr parent;
-
-		/*
-		 * gboolean expanded_once
-		 */
-		bool expanded_once;
-
-	}
+	class _PurpleRoomlistRoom { }
 }
 
============================================================
--- libpurple/wrapper/PurpleRoomlistUiOps.cs	17f0fe2a6a13145b9f8d7cc8384b2220df208ddc
+++ libpurple/wrapper/PurpleRoomlistUiOps.cs	5d66a1512c93e587e6d66d4df72be59582272e44
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -138,7 +140,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved1
+		public void purple_reserved1
 		{
 			get
 			{
@@ -153,7 +155,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved2
+		public void purple_reserved2
 		{
 			get
 			{
@@ -168,7 +170,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved3
+		public void purple_reserved3
 		{
 			get
 			{
@@ -183,7 +185,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public void _purple_reserved4
+		public void purple_reserved4
 		{
 			get
 			{
@@ -235,25 +237,26 @@ namespace PurpleWrapper
 		void destroy;
 
 		/*
-		 * void (*_purple_reserved1)()
+		 * void (*purple_reserved1)()
 		 */
-		void _purple_reserved1;
+		void purple_reserved1;
 
 		/*
-		 * void (*_purple_reserved2)()
+		 * void (*purple_reserved2)()
 		 */
-		void _purple_reserved2;
+		void purple_reserved2;
 
 		/*
-		 * void (*_purple_reserved3)()
+		 * void (*purple_reserved3)()
 		 */
-		void _purple_reserved3;
+		void purple_reserved3;
 
 		/*
-		 * void (*_purple_reserved4)()
+		 * void (*purple_reserved4)()
 		 */
-		void _purple_reserved4;
+		void purple_reserved4;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleSoundTheme.cs	646b0d842501cc124b0d882d53e7f9c458cf0c63
+++ libpurple/wrapper/PurpleSoundTheme.cs	29786753dc631b46e5a921515b87baccb7592f86
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,62 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleSoundTheme : UnmanagedWrapper<_PurpleSoundTheme>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleSoundTheme in file "sound-theme.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleTheme parent).
+		 */
+
 		public PurpleSoundTheme()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleSoundTheme(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleSoundTheme)Marshal.PtrToStructure(this.Reference, typeof(_PurpleSoundTheme));
+			throw new NotImplementedException();
 		}
 
-		public PurpleTheme parent
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr priv
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleSoundTheme
-	{
-		/*
-		 * PurpleTheme parent
-		 */
-		UNKNOWN parent;
-
-		/*
-		 * gpointer priv
-		 */
-		IntPtr priv;
-
-	}
+	class _PurpleSoundTheme { }
 }
 
============================================================
--- libpurple/wrapper/PurpleSoundThemeClass.cs	4ba0beb14540e0f3ab3804f9c031264b2b41509d
+++ libpurple/wrapper/PurpleSoundThemeClass.cs	cec1b106cac87c218a66ac715ab06ca5690509c4
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,42 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleSoundThemeClass : UnmanagedWrapper<_PurpleSoundThemeClass>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleSoundThemeClass in file "sound-theme.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleThemeClass parent_class).
+		 */
+
 		public PurpleSoundThemeClass()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleSoundThemeClass(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleSoundThemeClass)Marshal.PtrToStructure(this.Reference, typeof(_PurpleSoundThemeClass));
+			throw new NotImplementedException();
 		}
 
-		public PurpleThemeClass parent_class
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleSoundThemeClass
-	{
-		/*
-		 * PurpleThemeClass parent_class
-		 */
-		UNKNOWN parent_class;
-
-	}
+	class _PurpleSoundThemeClass { }
 }
 
============================================================
--- libpurple/wrapper/PurpleSoundThemeLoader.cs	4874060a52b4fd847d08bef980ea09edc82de4d6
+++ libpurple/wrapper/PurpleSoundThemeLoader.cs	e64db4d0b9b27f8b25b81ce815f0fe1dc22eabcf
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,42 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleSoundThemeLoader : UnmanagedWrapper<_PurpleSoundThemeLoader>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleSoundThemeLoader in file "sound-theme-loader.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleThemeLoader parent).
+		 */
+
 		public PurpleSoundThemeLoader()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleSoundThemeLoader(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleSoundThemeLoader)Marshal.PtrToStructure(this.Reference, typeof(_PurpleSoundThemeLoader));
+			throw new NotImplementedException();
 		}
 
-		public PurpleThemeLoader parent
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleSoundThemeLoader
-	{
-		/*
-		 * PurpleThemeLoader parent
-		 */
-		UNKNOWN parent;
-
-	}
+	class _PurpleSoundThemeLoader { }
 }
 
============================================================
--- libpurple/wrapper/PurpleSoundThemeLoaderClass.cs	51ca03c6c82c4f1f2be42b4ce56b7847203c3764
+++ libpurple/wrapper/PurpleSoundThemeLoaderClass.cs	c1f9aac9f01113e0f1b32764234bca3c5b35dde1
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,42 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleSoundThemeLoaderClass : UnmanagedWrapper<_PurpleSoundThemeLoaderClass>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleSoundThemeLoaderClass in file "sound-theme-loader.h".
+		 * Message: The type resolved to a known struct but not a pointer to that struct (PurpleThemeLoaderClass parent_class).
+		 */
+
 		public PurpleSoundThemeLoaderClass()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleSoundThemeLoaderClass(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleSoundThemeLoaderClass)Marshal.PtrToStructure(this.Reference, typeof(_PurpleSoundThemeLoaderClass));
+			throw new NotImplementedException();
 		}
 
-		public PurpleThemeLoaderClass parent_class
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleSoundThemeLoaderClass
-	{
-		/*
-		 * PurpleThemeLoaderClass parent_class
-		 */
-		UNKNOWN parent_class;
-
-	}
+	class _PurpleSoundThemeLoaderClass { }
 }
 
============================================================
--- libpurple/wrapper/PurpleSrvResponse.cs	71a8af48e75675384fa20f8c75bf61827ecf691e
+++ libpurple/wrapper/PurpleSrvResponse.cs	58bdb110febc7499c250e37c1d5817602aa53185
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -135,5 +137,6 @@ namespace PurpleWrapper
 		int pref;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleSslConnection.cs	59cfad734514f9e61db3176c344193bfe98e2e30
+++ libpurple/wrapper/PurpleSslConnection.cs	a6abbd460edef2ac64961aa426f28b1825162f45
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,262 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleSslConnection : UnmanagedWrapper<_PurpleSslConnection>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleSslConnection in file "sslconn.h".
+		 * Message: The struct contains an object that resolves to a function pointer (PurpleSslInputFunction connect_cb).
+		 */
+
 		public PurpleSslConnection()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleSslConnection(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleSslConnection)Marshal.PtrToStructure(this.Reference, typeof(_PurpleSslConnection));
+			throw new NotImplementedException();
 		}
 
-		public string host
-		{
-			get
-			{
-				return this.Data.host;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.host = value;
-			}
-		}
-
-		public int port
-		{
-			get
-			{
-				return this.Data.port;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.port = value;
-			}
-		}
-
-		public IntPtr connect_cb_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleSslInputFunction connect_cb
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleSslErrorFunction error_cb
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr recv_cb_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleSslInputFunction recv_cb
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public int fd
-		{
-			get
-			{
-				return this.Data.fd;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.fd = value;
-			}
-		}
-
-		public uint inpa
-		{
-			get
-			{
-				return this.Data.inpa;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.inpa = value;
-			}
-		}
-
-		public PurpleProxyConnectData connect_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr private_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleCertificateVerifier verifier
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleSslConnection
-	{
-		/*
-		 * char * host
-		 */
-		string host;
-
-		/*
-		 * int port
-		 */
-		int port;
-
-		/*
-		 * void * connect_cb_data
-		 */
-		IntPtr connect_cb_data;
-
-		/*
-		 * PurpleSslInputFunction connect_cb
-		 */
-		UNKNOWN connect_cb;
-
-		/*
-		 * PurpleSslErrorFunction error_cb
-		 */
-		UNKNOWN error_cb;
-
-		/*
-		 * void * recv_cb_data
-		 */
-		IntPtr recv_cb_data;
-
-		/*
-		 * PurpleSslInputFunction recv_cb
-		 */
-		UNKNOWN recv_cb;
-
-		/*
-		 * int fd
-		 */
-		int fd;
-
-		/*
-		 * guint inpa
-		 */
-		uint inpa;
-
-		/*
-		 * PurpleProxyConnectData * connect_data
-		 */
-		IntPtr connect_data;
-
-		/*
-		 * void * private_data
-		 */
-		IntPtr private_data;
-
-		/*
-		 * PurpleCertificateVerifier * verifier
-		 */
-		IntPtr verifier;
-
-	}
+	class _PurpleSslConnection { }
 }
 
============================================================
--- libpurple/wrapper/PurpleStunNatDiscovery.cs	1e6c28d62d9b005d7a9952b652320b84fc3005b3
+++ libpurple/wrapper/PurpleStunNatDiscovery.cs	52463e3ebaf3d5e974d55595cac98aaacc031e2b
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleStunNatDiscovery)Marshal.PtrToStructure(this.Reference, typeof(_PurpleStunNatDiscovery));
 		}
 
-		public PurpleStunStatus status
+		public Stun.PurpleStunStatus status
 		{
 			get
 			{
@@ -63,7 +65,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public PurpleStunNatType type
+		public Stun.PurpleStunNatType type
 		{
 			get
 			{
@@ -108,7 +110,7 @@ namespace PurpleWrapper
 			}
 		}
 
-		public time_t lookup_time
+		public DateTime lookup_time
 		{
 			get
 			{
@@ -132,12 +134,12 @@ namespace PurpleWrapper
 		/*
 		 * PurpleStunStatus status
 		 */
-		UNKNOWN status;
+		Stun.PurpleStunStatus status;
 
 		/*
 		 * PurpleStunNatType type
 		 */
-		UNKNOWN type;
+		Stun.PurpleStunNatType type;
 
 		/*
 		 * char publicip[16]
@@ -152,8 +154,9 @@ namespace PurpleWrapper
 		/*
 		 * time_t lookup_time
 		 */
-		UNKNOWN lookup_time;
+		ulong lookup_time;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleTheme.cs	850e7391336f48f1b6978f691c3c96339f44b240
+++ libpurple/wrapper/PurpleTheme.cs	939df3028a452bed02c28f81ae5b9279b3b66c71
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleTheme)Marshal.PtrToStructure(this.Reference, typeof(_PurpleTheme));
 		}
 
-		public GObject parent
+		public /* libgobject */ IntPtr parent
 		{
 			get
 			{
@@ -87,7 +89,7 @@ namespace PurpleWrapper
 		/*
 		 * GObject parent
 		 */
-		UNKNOWN parent;
+		IntPtr parent;
 
 		/*
 		 * gpointer priv
@@ -95,5 +97,6 @@ namespace PurpleWrapper
 		IntPtr priv;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleThemeClass.cs	63bbdf64916118dff29160be0e785b73eb9527db
+++ libpurple/wrapper/PurpleThemeClass.cs	8ef2fdec00651938efe393d5476c7def81b4ac82
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleThemeClass)Marshal.PtrToStructure(this.Reference, typeof(_PurpleThemeClass));
 		}
 
-		public GObjectClass parent_class
+		public /* libgobject */ IntPtr parent_class
 		{
 			get
 			{
@@ -72,8 +74,9 @@ namespace PurpleWrapper
 		/*
 		 * GObjectClass parent_class
 		 */
-		UNKNOWN parent_class;
+		IntPtr parent_class;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleThemeLoader.cs	8c2e4a3d0d1061e6b03a452d89e39a5aa7fd3d66
+++ libpurple/wrapper/PurpleThemeLoader.cs	fdebb6118fb87d35214d10697b2337dc02ec2ae0
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleThemeLoader)Marshal.PtrToStructure(this.Reference, typeof(_PurpleThemeLoader));
 		}
 
-		public GObject parent
+		public /* libgobject */ IntPtr parent
 		{
 			get
 			{
@@ -87,7 +89,7 @@ namespace PurpleWrapper
 		/*
 		 * GObject parent
 		 */
-		UNKNOWN parent;
+		IntPtr parent;
 
 		/*
 		 * gpointer priv
@@ -95,5 +97,6 @@ namespace PurpleWrapper
 		IntPtr priv;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleThemeLoaderClass.cs	e1b1ccc78ad0b7f7993f6ce81deb27695b971f77
+++ libpurple/wrapper/PurpleThemeLoaderClass.cs	db187cd529e825bc07d331cf9c9c73f2d3afbebf
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleThemeLoaderClass)Marshal.PtrToStructure(this.Reference, typeof(_PurpleThemeLoaderClass));
 		}
 
-		public GObjectClass parent_class
+		public /* libgobject */ IntPtr parent_class
 		{
 			get
 			{
@@ -87,7 +89,7 @@ namespace PurpleWrapper
 		/*
 		 * GObjectClass parent_class
 		 */
-		UNKNOWN parent_class;
+		IntPtr parent_class;
 
 		/*
 		 * PurpleTheme * ((*purple_theme_loader_build)(const gchar*))
@@ -95,5 +97,6 @@ namespace PurpleWrapper
 		IntPtr ((*purple_theme_loader_build)(const gchar*));
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleThemeManager.cs	28677fb8db28b583ea3c80b57d9b33137444c9a5
+++ libpurple/wrapper/PurpleThemeManager.cs	af0701640d2dd00c001f498cab2a39826f3c3b27
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleThemeManager)Marshal.PtrToStructure(this.Reference, typeof(_PurpleThemeManager));
 		}
 
-		public GObject parent
+		public /* libgobject */ IntPtr parent
 		{
 			get
 			{
@@ -72,8 +74,9 @@ namespace PurpleWrapper
 		/*
 		 * GObject parent
 		 */
-		UNKNOWN parent;
+		IntPtr parent;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleThemeManagerClass.cs	66901bd9b2fd40cdb3b94d8861e71f19e1ede31f
+++ libpurple/wrapper/PurpleThemeManagerClass.cs	f2956a2743a0088a98b6e8d8997225f9414fa430
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -48,7 +50,7 @@ namespace PurpleWrapper
 			this.Data = (_PurpleThemeManagerClass)Marshal.PtrToStructure(this.Reference, typeof(_PurpleThemeManagerClass));
 		}
 
-		public GObjectClass parent_class
+		public /* libgobject */ IntPtr parent_class
 		{
 			get
 			{
@@ -72,8 +74,9 @@ namespace PurpleWrapper
 		/*
 		 * GObjectClass parent_class
 		 */
-		UNKNOWN parent_class;
+		IntPtr parent_class;
 
 	}
+
 }
 
============================================================
--- libpurple/wrapper/PurpleWhiteboard.cs	4047f484a13bd44b7207c627694aa1243d7cdb60
+++ libpurple/wrapper/PurpleWhiteboard.cs	272f8f273e548a37a16274573d15b5dba592dc43
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,634 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleWhiteboard : UnmanagedWrapper<_PurpleWhiteboard>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleWhiteboard in file "whiteboard.h".
+		 * Message: The type could not be resolved (GList * draw_list).
+		 */
+
 		public PurpleWhiteboard()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleWhiteboard(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleWhiteboard)Marshal.PtrToStructure(this.Reference, typeof(_PurpleWhiteboard));
+			throw new NotImplementedException();
 		}
 
-		public int state
-		{
-			get
-			{
-				return this.Data.state;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.state = value;
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string who
-		{
-			get
-			{
-				return this.Data.who;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.who = value;
-			}
-		}
-
-		public IntPtr ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr proto_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleWhiteboardPrplOps prpl_ops
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public GList draw_list
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public typedef struct _PurpleWhiteboardUiOps
-{
-	void (*create)(PurpleWhiteboard *wb)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void destroy
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_dimensions
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_brush
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void draw_point
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void draw_line
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void clear
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public struct _PurpleWhiteboardPrplOps
-{
-	void (*start)(PurpleWhiteboard *wb)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void end
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void get_dimensions
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_dimensions
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void get_brush
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void set_brush
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void send_draw_list
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void clear
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved1
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved2
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved3
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void _purple_reserved4
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleWhiteboard
-	{
-		/*
-		 * int state
-		 */
-		int state;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * char * who
-		 */
-		string who;
-
-		/*
-		 * void * ui_data
-		 */
-		IntPtr ui_data;
-
-		/*
-		 * void * proto_data
-		 */
-		IntPtr proto_data;
-
-		/*
-		 * PurpleWhiteboardPrplOps * prpl_ops
-		 */
-		IntPtr prpl_ops;
-
-		/*
-		 * GList * draw_list
-		 */
-		IntPtr draw_list;
-
-		/*
-		 * typedef struct _PurpleWhiteboardUiOps
-{
-	void (*create)(PurpleWhiteboard *wb)
-		 */
-		UNKNOWN struct _PurpleWhiteboardUiOps
-{
-	void (*create)(PurpleWhiteboard *wb);
-
-		/*
-		 * void (*destroy)(PurpleWhiteboard * wb)
-		 */
-		void destroy;
-
-		/*
-		 * void (*set_dimensions)(PurpleWhiteboard * wb, int width, int height)
-		 */
-		void set_dimensions;
-
-		/*
-		 * void (*set_brush)(PurpleWhiteboard * wb, int size, int color)
-		 */
-		void set_brush;
-
-		/*
-		 * void (*draw_point)(PurpleWhiteboard * wb, int x, int y, int color, int size)
-		 */
-		void draw_point;
-
-		/*
-		 * void (*draw_line)(PurpleWhiteboard * wb, int x1, int y1, int x2, int y2, int color, int size)
-		 */
-		void draw_line;
-
-		/*
-		 * void (*clear)(PurpleWhiteboard * wb)
-		 */
-		void clear;
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-		/*
-		 * struct _PurpleWhiteboardPrplOps
-{
-	void (*start)(PurpleWhiteboard *wb)
-		 */
-		UNKNOWN _PurpleWhiteboardPrplOps
-{
-	void (*start)(PurpleWhiteboard *wb);
-
-		/*
-		 * void (*end)(PurpleWhiteboard * wb)
-		 */
-		void end;
-
-		/*
-		 * void (*get_dimensions)(PurpleWhiteboard * wb, int * width, int * height)
-		 */
-		void get_dimensions;
-
-		/*
-		 * void (*set_dimensions)(PurpleWhiteboard * wb, int width, int height)
-		 */
-		void set_dimensions;
-
-		/*
-		 * void (*get_brush)(PurpleWhiteboard * wb, int * size, int * color)
-		 */
-		void get_brush;
-
-		/*
-		 * void (*set_brush)(PurpleWhiteboard * wb, int size, int color)
-		 */
-		void set_brush;
-
-		/*
-		 * void (*send_draw_list)(PurpleWhiteboard * wb, GList * draw_list)
-		 */
-		void send_draw_list;
-
-		/*
-		 * void (*clear)(PurpleWhiteboard * wb)
-		 */
-		void clear;
-
-		/*
-		 * void (*_purple_reserved1)()
-		 */
-		void _purple_reserved1;
-
-		/*
-		 * void (*_purple_reserved2)()
-		 */
-		void _purple_reserved2;
-
-		/*
-		 * void (*_purple_reserved3)()
-		 */
-		void _purple_reserved3;
-
-		/*
-		 * void (*_purple_reserved4)()
-		 */
-		void _purple_reserved4;
-
-	}
+	class _PurpleWhiteboard { }
 }
 
============================================================
--- libpurple/wrapper/PurpleXfer.cs	fd7446d6268545b9a660de3548500211effa1065
+++ libpurple/wrapper/PurpleXfer.cs	1247e9415c779c0db51e340e700fa0bb689a16bc
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,665 +40,24 @@ namespace PurpleWrapper
 {
 	public class PurpleXfer : UnmanagedWrapper<_PurpleXfer>
 	{
+		/* 
+		 * Could not generate a wrapper for PurpleXfer in file "ft.h".
+		 * Message: The type could not be resolved (FILE * dest_fp).
+		 */
+
 		public PurpleXfer()
 		{
+			throw new NotImplementedException();
 		}
 
 		public PurpleXfer(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_PurpleXfer)Marshal.PtrToStructure(this.Reference, typeof(_PurpleXfer));
+			throw new NotImplementedException();
 		}
 
-		public uint ref
-		{
-			get
-			{
-				return this.Data.ref;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.ref = value;
-			}
-		}
-
-		public PurpleXferType type
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleAccount account
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string who
-		{
-			get
-			{
-				return this.Data.who;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.who = value;
-			}
-		}
-
-		public string message
-		{
-			get
-			{
-				return this.Data.message;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.message = value;
-			}
-		}
-
-		public string filename
-		{
-			get
-			{
-				return this.Data.filename;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.filename = value;
-			}
-		}
-
-		public string local_filename
-		{
-			get
-			{
-				return this.Data.local_filename;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.local_filename = value;
-			}
-		}
-
-		public size_t size
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public FILE dest_fp
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public string remote_ip
-		{
-			get
-			{
-				return this.Data.remote_ip;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.remote_ip = value;
-			}
-		}
-
-		public int local_port
-		{
-			get
-			{
-				return this.Data.local_port;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.local_port = value;
-			}
-		}
-
-		public int remote_port
-		{
-			get
-			{
-				return this.Data.remote_port;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.remote_port = value;
-			}
-		}
-
-		public int fd
-		{
-			get
-			{
-				return this.Data.fd;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.fd = value;
-			}
-		}
-
-		public int watcher
-		{
-			get
-			{
-				return this.Data.watcher;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.watcher = value;
-			}
-		}
-
-		public size_t bytes_sent
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public size_t bytes_remaining
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public time_t start_time
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public time_t end_time
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public size_t current_buffer_size
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleXferStatusType status
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public struct {
-		void (*init)(PurpleXfer *xfer)
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void request_denied
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void start
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void end
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void cancel_send
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void cancel_recv
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public gssize read
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public gssize write
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public void ack
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public PurpleXferUiOps ui_ops
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr ui_data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public IntPtr data
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _PurpleXfer
-	{
-		/*
-		 * guint ref
-		 */
-		uint ref;
-
-		/*
-		 * PurpleXferType type
-		 */
-		UNKNOWN type;
-
-		/*
-		 * PurpleAccount * account
-		 */
-		IntPtr account;
-
-		/*
-		 * char * who
-		 */
-		string who;
-
-		/*
-		 * char * message
-		 */
-		string message;
-
-		/*
-		 * char * filename
-		 */
-		string filename;
-
-		/*
-		 * char * local_filename
-		 */
-		string local_filename;
-
-		/*
-		 * size_t size
-		 */
-		UNKNOWN size;
-
-		/*
-		 * FILE * dest_fp
-		 */
-		IntPtr dest_fp;
-
-		/*
-		 * char * remote_ip
-		 */
-		string remote_ip;
-
-		/*
-		 * int local_port
-		 */
-		int local_port;
-
-		/*
-		 * int remote_port
-		 */
-		int remote_port;
-
-		/*
-		 * int fd
-		 */
-		int fd;
-
-		/*
-		 * int watcher
-		 */
-		int watcher;
-
-		/*
-		 * size_t bytes_sent
-		 */
-		UNKNOWN bytes_sent;
-
-		/*
-		 * size_t bytes_remaining
-		 */
-		UNKNOWN bytes_remaining;
-
-		/*
-		 * time_t start_time
-		 */
-		UNKNOWN start_time;
-
-		/*
-		 * time_t end_time
-		 */
-		UNKNOWN end_time;
-
-		/*
-		 * size_t current_buffer_size
-		 */
-		UNKNOWN current_buffer_size;
-
-		/*
-		 * PurpleXferStatusType status
-		 */
-		UNKNOWN status;
-
-		/*
-		 * struct {
-		void (*init)(PurpleXfer *xfer)
-		 */
-		UNKNOWN {
-		void (*init)(PurpleXfer *xfer);
-
-		/*
-		 * void (*request_denied)(PurpleXfer * xfer)
-		 */
-		void request_denied;
-
-		/*
-		 * void (*start)(PurpleXfer * xfer)
-		 */
-		void start;
-
-		/*
-		 * void (*end)(PurpleXfer * xfer)
-		 */
-		void end;
-
-		/*
-		 * void (*cancel_send)(PurpleXfer * xfer)
-		 */
-		void cancel_send;
-
-		/*
-		 * void (*cancel_recv)(PurpleXfer * xfer)
-		 */
-		void cancel_recv;
-
-		/*
-		 * gssize (*read)(guchar ** buffer, PurpleXfer * xfer)
-		 */
-		UNKNOWN read;
-
-		/*
-		 * gssize (*write)(guchar * buffer, size_t size, PurpleXfer * xfer)
-		 */
-		UNKNOWN write;
-
-		/*
-		 * void (*ack)(PurpleXfer * xfer, guchar * buffer, size_t size)
-		 */
-		void ack;
-
-		/*
-		 * PurpleXferUiOps * ui_ops
-		 */
-		IntPtr ui_ops;
-
-		/*
-		 * void * ui_data
-		 */
-		IntPtr ui_data;
-
-		/*
-		 * void * data
-		 */
-		IntPtr data;
-
-	}
+	class _PurpleXfer { }
 }
 
============================================================
--- libpurple/wrapper/Request.cs	58f6df146e5eca66831ddfdb2271c0838a2d91f7
+++ libpurple/wrapper/Request.cs	1078bc671ac24a0e702a20209eae86a7373c1682
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,227 +40,72 @@ namespace PurpleWrapper
 {
 	public class Request
 	{
-		/*
-		 * PurpleRequestFields * purple_request_fields_new()
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_fields_new();
-
-		public static PurpleRequestFields FieldsNew()
+		public enum PurpleRequestType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_REQUEST_INPUT = 0,
+			PURPLE_REQUEST_CHOICE,
+			PURPLE_REQUEST_ACTION,
+			PURPLE_REQUEST_FIELDS,
+			PURPLE_REQUEST_FILE,
+			PURPLE_REQUEST_FOLDER
+		};
 
-		/*
-		 * void purple_request_fields_destroy(PurpleRequestFields * fields)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_fields_destroy(IntPtr fields);
-
-		public static void FieldsDestroy(PurpleRequestFields fields)
+		public enum PurpleRequestFieldType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_REQUEST_FIELD_NONE,
+			PURPLE_REQUEST_FIELD_STRING,
+			PURPLE_REQUEST_FIELD_INTEGER,
+			PURPLE_REQUEST_FIELD_BOOLEAN,
+			PURPLE_REQUEST_FIELD_CHOICE,
+			PURPLE_REQUEST_FIELD_LIST,
+			PURPLE_REQUEST_FIELD_LABEL,
+			PURPLE_REQUEST_FIELD_IMAGE,
+			PURPLE_REQUEST_FIELD_ACCOUNT
+		};
 
 		/*
-		 * void purple_request_fields_add_group(PurpleRequestFields * fields, PurpleRequestFieldGroup * group)
+		 * PurpleRequestFields * purple_request_fields_new()
+		 * 
+		 * Could not generate a wrapper for purple_request_fields_new in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestFields * purple_request_fields_new()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_fields_add_group(IntPtr fields, IntPtr group);
 
-		public static void FieldsAddGroup(PurpleRequestFields fields, PurpleRequestFieldGroup group)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * GList * purple_request_fields_get_groups(PurpleRequestFields * fields)
+		 * void purple_request_fields_destroy(PurpleRequestFields * fields)
+		 * 
+		 * Could not generate a wrapper for purple_request_fields_destroy in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestFields * fields).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_fields_get_groups(IntPtr fields);
 
-		public static GList FieldsGetGroups(PurpleRequestFields fields)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_request_fields_exists(PurpleRequestFields * fields, char * id)
+		 * GList * purple_request_fields_get_groups(PurpleRequestFields * fields)
+		 * 
+		 * Could not generate a wrapper for purple_request_fields_get_groups in file "request.h".
+		 * Message: The type could not be resolved (GList * purple_request_fields_get_groups(PurpleRequestFields * fields)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_fields_exists(IntPtr fields, string id);
 
-		public static bool FieldsExists(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_request_fields_get_required(PurpleRequestFields * fields)
+		 * 
+		 * Could not generate a wrapper for purple_request_fields_get_required in file "request.h".
+		 * Message: The type could not be resolved (GList * purple_request_fields_get_required(PurpleRequestFields * fields)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_fields_get_required(IntPtr fields);
 
-		public static GList FieldsGetRequired(PurpleRequestFields fields)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_request_fields_is_field_required(PurpleRequestFields * fields, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_fields_is_field_required(IntPtr fields, string id);
-
-		public static bool FieldsIsFieldRequired(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_request_fields_all_required_filled(PurpleRequestFields * fields)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_fields_all_required_filled(IntPtr fields);
-
-		public static bool FieldsAllRequiredFilled(PurpleRequestFields fields)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleRequestField * purple_request_fields_get_field(PurpleRequestFields * fields, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_fields_get_field(IntPtr fields, string id);
-
-		public static PurpleRequestField FieldsGetField(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_request_fields_get_string(PurpleRequestFields * fields, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_request_fields_get_string(IntPtr fields, string id);
-
-		public static string FieldsGetString(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * int purple_request_fields_get_integer(PurpleRequestFields * fields, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_request_fields_get_integer(IntPtr fields, string id);
-
-		public static int FieldsGetInteger(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_request_fields_get_bool(PurpleRequestFields * fields, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_fields_get_bool(IntPtr fields, string id);
-
-		public static bool FieldsGetBool(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * int purple_request_fields_get_choice(PurpleRequestFields * fields, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_request_fields_get_choice(IntPtr fields, string id);
-
-		public static int FieldsGetChoice(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleAccount * purple_request_fields_get_account(PurpleRequestFields * fields, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_fields_get_account(IntPtr fields, string id);
-
-		public static PurpleAccount FieldsGetAccount(PurpleRequestFields fields, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleRequestFieldGroup * purple_request_field_group_new(char * title)
+		 * 
+		 * Could not generate a wrapper for purple_request_field_group_new in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestFieldGroup * purple_request_field_group_new(char * title)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_group_new(string title);
 
-		public static PurpleRequestFieldGroup FieldGroupNew(string title)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_request_field_group_destroy(PurpleRequestFieldGroup * group)
+		 * 
+		 * Could not generate a wrapper for purple_request_field_group_destroy in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestFieldGroup * group).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_group_destroy(IntPtr group);
 
-		public static void FieldGroupDestroy(PurpleRequestFieldGroup group)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_request_field_group_add_field(PurpleRequestFieldGroup * group, PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_group_add_field(IntPtr group, IntPtr field);
-
-		public static void FieldGroupAddField(PurpleRequestFieldGroup group, PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_request_field_group_get_title(PurpleRequestFieldGroup * group)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_request_field_group_get_title(IntPtr group);
-
-		public static string FieldGroupGetTitle(PurpleRequestFieldGroup group)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * GList * purple_request_field_group_get_fields(PurpleRequestFieldGroup * group)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_group_get_fields(IntPtr group);
-
-		public static GList FieldGroupGetFields(PurpleRequestFieldGroup group)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleRequestField * purple_request_field_new(char * id, char * text, PurpleRequestFieldType type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_new(string id, string text, UNKNOWN type);
-
-		public static PurpleRequestField FieldNew(string id, string text, PurpleRequestFieldType type)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_request_field_destroy(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
@@ -266,7 +113,7 @@ namespace PurpleWrapper
 
 		public static void FieldDestroy(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			purple_request_field_destroy(field.Reference);
 		}
 
 		/*
@@ -277,7 +124,7 @@ namespace PurpleWrapper
 
 		public static void FieldSetLabel(PurpleRequestField field, string label)
 		{
-			throw new NotImplementedException();
+			purple_request_field_set_label(field.Reference, label);
 		}
 
 		/*
@@ -288,53 +135,28 @@ namespace PurpleWrapper
 
 		public static void FieldSetVisible(PurpleRequestField field, bool visible)
 		{
-			throw new NotImplementedException();
+			purple_request_field_set_visible(field.Reference, visible);
 		}
 
 		/*
-		 * void purple_request_field_set_type_hint(PurpleRequestField * field, char * type_hint)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_set_type_hint(IntPtr field, string type_hint);
-
-		public static void FieldSetTypeHint(PurpleRequestField field, string type_hint)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_set_required(PurpleRequestField * field, gboolean required)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_set_required(IntPtr field, bool required);
-
-		public static void FieldSetRequired(PurpleRequestField field, bool required)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleRequestFieldType purple_request_field_get_type(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_request_field_get_type(IntPtr field);
+		private static extern Request.PurpleRequestFieldType purple_request_field_get_type(IntPtr field);
 
-		public static PurpleRequestFieldType FieldGetType(PurpleRequestField field)
+		public static Request.PurpleRequestFieldType FieldGetType(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_request_field_get_type, a KnownEnum. */
+			
 		}
 
 		/*
 		 * PurpleRequestFieldGroup * purple_request_field_get_group(PurpleRequestField * field)
+		 * 
+		 * Could not generate a wrapper for purple_request_field_get_group in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestFieldGroup * purple_request_field_get_group(PurpleRequestField * field)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_get_group(IntPtr field);
 
-		public static PurpleRequestFieldGroup FieldGetGroup(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_request_field_get_id(PurpleRequestField * field)
 		 */
@@ -343,7 +165,7 @@ namespace PurpleWrapper
 
 		public static string FieldGetId(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_get_id(field.Reference);
 		}
 
 		/*
@@ -354,7 +176,7 @@ namespace PurpleWrapper
 
 		public static string FieldGetLabel(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_get_label(field.Reference);
 		}
 
 		/*
@@ -365,7 +187,7 @@ namespace PurpleWrapper
 
 		public static bool FieldIsVisible(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_is_visible(field.Reference);
 		}
 
 		/*
@@ -376,7 +198,7 @@ namespace PurpleWrapper
 
 		public static string FieldGetTypeHint(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_get_type_hint(field.Reference);
 		}
 
 		/*
@@ -387,7 +209,7 @@ namespace PurpleWrapper
 
 		public static bool FieldIsRequired(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_is_required(field.Reference);
 		}
 
 		/*
@@ -398,87 +220,10 @@ namespace PurpleWrapper
 
 		public static IntPtr FieldGetUiData(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_get_ui_data(field.Reference);
 		}
 
 		/*
-		 * void purple_request_field_set_ui_data(PurpleRequestField * field, gpointer ui_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_set_ui_data(IntPtr field, IntPtr ui_data);
-
-		public static void FieldSetUiData(PurpleRequestField field, IntPtr ui_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleRequestField * purple_request_field_string_new(char * id, char * text, char * default_value, gboolean multiline)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_string_new(string id, string text, string default_value, bool multiline);
-
-		public static PurpleRequestField FieldStringNew(string id, string text, string default_value, bool multiline)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_string_set_default_value(PurpleRequestField * field, char * default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_string_set_default_value(IntPtr field, string default_value);
-
-		public static void FieldStringSetDefaultValue(PurpleRequestField field, string default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_string_set_value(PurpleRequestField * field, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_string_set_value(IntPtr field, string value);
-
-		public static void FieldStringSetValue(PurpleRequestField field, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_string_set_masked(PurpleRequestField * field, gboolean masked)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_string_set_masked(IntPtr field, bool masked);
-
-		public static void FieldStringSetMasked(PurpleRequestField field, bool masked)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_string_set_editable(PurpleRequestField * field, gboolean editable)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_string_set_editable(IntPtr field, bool editable);
-
-		public static void FieldStringSetEditable(PurpleRequestField field, bool editable)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * purple_request_field_string_get_default_value(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_request_field_string_get_default_value(IntPtr field);
-
-		public static string FieldStringGetDefaultValue(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_request_field_string_get_value(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
@@ -486,7 +231,7 @@ namespace PurpleWrapper
 
 		public static string FieldStringGetValue(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_string_get_value(field.Reference);
 		}
 
 		/*
@@ -497,7 +242,7 @@ namespace PurpleWrapper
 
 		public static bool FieldStringIsMultiline(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_string_is_multiline(field.Reference);
 		}
 
 		/*
@@ -508,7 +253,7 @@ namespace PurpleWrapper
 
 		public static bool FieldStringIsMasked(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_string_is_masked(field.Reference);
 		}
 
 		/*
@@ -519,32 +264,10 @@ namespace PurpleWrapper
 
 		public static bool FieldStringIsEditable(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_string_is_editable(field.Reference);
 		}
 
 		/*
-		 * PurpleRequestField * purple_request_field_int_new(char * id, char * text, int default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_int_new(string id, string text, int default_value);
-
-		public static PurpleRequestField FieldIntNew(string id, string text, int default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_int_set_default_value(PurpleRequestField * field, int default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_int_set_default_value(IntPtr field, int default_value);
-
-		public static void FieldIntSetDefaultValue(PurpleRequestField field, int default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_request_field_int_set_value(PurpleRequestField * field, int value)
 		 */
 		[DllImport("libpurple.dll")]
@@ -552,7 +275,7 @@ namespace PurpleWrapper
 
 		public static void FieldIntSetValue(PurpleRequestField field, int value)
 		{
-			throw new NotImplementedException();
+			purple_request_field_int_set_value(field.Reference, value);
 		}
 
 		/*
@@ -563,7 +286,7 @@ namespace PurpleWrapper
 
 		public static int FieldIntGetDefaultValue(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_int_get_default_value(field.Reference);
 		}
 
 		/*
@@ -574,54 +297,10 @@ namespace PurpleWrapper
 
 		public static int FieldIntGetValue(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_int_get_value(field.Reference);
 		}
 
 		/*
-		 * PurpleRequestField * purple_request_field_bool_new(char * id, char * text, gboolean default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_bool_new(string id, string text, bool default_value);
-
-		public static PurpleRequestField FieldBoolNew(string id, string text, bool default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_bool_set_default_value(PurpleRequestField * field, gboolean default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_bool_set_default_value(IntPtr field, bool default_value);
-
-		public static void FieldBoolSetDefaultValue(PurpleRequestField field, bool default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_bool_set_value(PurpleRequestField * field, gboolean value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_bool_set_value(IntPtr field, bool value);
-
-		public static void FieldBoolSetValue(PurpleRequestField field, bool value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_request_field_bool_get_default_value(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_field_bool_get_default_value(IntPtr field);
-
-		public static bool FieldBoolGetDefaultValue(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_request_field_bool_get_value(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
@@ -629,43 +308,10 @@ namespace PurpleWrapper
 
 		public static bool FieldBoolGetValue(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_bool_get_value(field.Reference);
 		}
 
 		/*
-		 * PurpleRequestField * purple_request_field_choice_new(char * id, char * text, int default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_choice_new(string id, string text, int default_value);
-
-		public static PurpleRequestField FieldChoiceNew(string id, string text, int default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_choice_add(PurpleRequestField * field, char * label)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_choice_add(IntPtr field, string label);
-
-		public static void FieldChoiceAdd(PurpleRequestField field, string label)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_choice_set_default_value(PurpleRequestField * field, int default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_choice_set_default_value(IntPtr field, int default_value);
-
-		public static void FieldChoiceSetDefaultValue(PurpleRequestField field, int default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_request_field_choice_set_value(PurpleRequestField * field, int value)
 		 */
 		[DllImport("libpurple.dll")]
@@ -673,7 +319,7 @@ namespace PurpleWrapper
 
 		public static void FieldChoiceSetValue(PurpleRequestField field, int value)
 		{
-			throw new NotImplementedException();
+			purple_request_field_choice_set_value(field.Reference, value);
 		}
 
 		/*
@@ -684,7 +330,7 @@ namespace PurpleWrapper
 
 		public static int FieldChoiceGetDefaultValue(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_choice_get_default_value(field.Reference);
 		}
 
 		/*
@@ -695,20 +341,16 @@ namespace PurpleWrapper
 
 		public static int FieldChoiceGetValue(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_choice_get_value(field.Reference);
 		}
 
 		/*
 		 * GList * purple_request_field_choice_get_labels(PurpleRequestField * field)
+		 * 
+		 * Could not generate a wrapper for purple_request_field_choice_get_labels in file "request.h".
+		 * Message: The type could not be resolved (GList * purple_request_field_choice_get_labels(PurpleRequestField * field)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_choice_get_labels(IntPtr field);
 
-		public static GList FieldChoiceGetLabels(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleRequestField * purple_request_field_list_new(char * id, char * text)
 		 */
@@ -717,65 +359,10 @@ namespace PurpleWrapper
 
 		public static PurpleRequestField FieldListNew(string id, string text)
 		{
-			throw new NotImplementedException();
+			return new PurpleRequestField(purple_request_field_list_new(id, text));
 		}
 
 		/*
-		 * void purple_request_field_list_set_multi_select(PurpleRequestField * field, gboolean multi_select)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_list_set_multi_select(IntPtr field, bool multi_select);
-
-		public static void FieldListSetMultiSelect(PurpleRequestField field, bool multi_select)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_request_field_list_get_multi_select(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_field_list_get_multi_select(IntPtr field);
-
-		public static bool FieldListGetMultiSelect(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_field_list_get_data(PurpleRequestField * field, char * text)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_list_get_data(IntPtr field, string text);
-
-		public static IntPtr FieldListGetData(PurpleRequestField field, string text)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_list_add(PurpleRequestField * field, char * item, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_list_add(IntPtr field, string item, IntPtr data);
-
-		public static void FieldListAdd(PurpleRequestField field, string item, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_list_add_selected(PurpleRequestField * field, char * item)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_list_add_selected(IntPtr field, string item);
-
-		public static void FieldListAddSelected(PurpleRequestField field, string item)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_request_field_list_clear_selected(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
@@ -783,87 +370,28 @@ namespace PurpleWrapper
 
 		public static void FieldListClearSelected(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			purple_request_field_list_clear_selected(field.Reference);
 		}
 
 		/*
-		 * void purple_request_field_list_set_selected(PurpleRequestField * field, GList * items)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_list_set_selected(IntPtr field, IntPtr items);
-
-		public static void FieldListSetSelected(PurpleRequestField field, GList items)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_request_field_list_is_selected(PurpleRequestField * field, char * item)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_field_list_is_selected(IntPtr field, string item);
-
-		public static bool FieldListIsSelected(PurpleRequestField field, string item)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * GList * purple_request_field_list_get_selected(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_list_get_selected(IntPtr field);
-
-		public static GList FieldListGetSelected(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_request_field_list_get_items(PurpleRequestField * field)
+		 * 
+		 * Could not generate a wrapper for purple_request_field_list_get_items in file "request.h".
+		 * Message: The type could not be resolved (GList * purple_request_field_list_get_items(PurpleRequestField * field)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_list_get_items(IntPtr field);
 
-		public static GList FieldListGetItems(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleRequestField * purple_request_field_label_new(char * id, char * text)
+		 * void purple_request_field_image_set_scale(PurpleRequestField * field, unsigned int x, unsigned int y)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_label_new(string id, string text);
+		private static extern void purple_request_field_image_set_scale(IntPtr field, uint x, uint y);
 
-		public static PurpleRequestField FieldLabelNew(string id, string text)
+		public static void FieldImageSetScale(PurpleRequestField field, uint x, uint y)
 		{
-			throw new NotImplementedException();
+			purple_request_field_image_set_scale(field.Reference, x, y);
 		}
 
 		/*
-		 * PurpleRequestField * purple_request_field_image_new(char * id, char * text, char * buf, gsize size)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_image_new(string id, string text, string buf, UNKNOWN size);
-
-		public static PurpleRequestField FieldImageNew(string id, string text, string buf, gsize size)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_image_set_scale(PurpleRequestField * field, unsigned int, unsigned int)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_image_set_scale(IntPtr field, UNKNOWN int, UNKNOWN int);
-
-		public static void FieldImageSetScale(PurpleRequestField field, unsigned int, unsigned int)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_request_field_image_get_buffer(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
@@ -871,215 +399,51 @@ namespace PurpleWrapper
 
 		public static string FieldImageGetBuffer(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_image_get_buffer(field.Reference);
 		}
 
 		/*
 		 * gsize purple_request_field_image_get_size(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_request_field_image_get_size(IntPtr field);
+		private static extern ulong purple_request_field_image_get_size(IntPtr field);
 
-		public static gsize FieldImageGetSize(PurpleRequestField field)
+		public static ulong FieldImageGetSize(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_image_get_size(field.Reference);
 		}
 
 		/*
-		 * int purple_request_field_image_get_scale_x(PurpleRequestField * field)
+		 * unsigned int purple_request_field_image_get_scale_x(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_request_field_image_get_scale_x(IntPtr field);
+		private static extern uint purple_request_field_image_get_scale_x(IntPtr field);
 
-		public static int FieldImageGetScaleX(PurpleRequestField field)
+		public static uint FieldImageGetScaleX(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_image_get_scale_x(field.Reference);
 		}
 
 		/*
-		 * int purple_request_field_image_get_scale_y(PurpleRequestField * field)
+		 * unsigned int purple_request_field_image_get_scale_y(PurpleRequestField * field)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int purple_request_field_image_get_scale_y(IntPtr field);
+		private static extern uint purple_request_field_image_get_scale_y(IntPtr field);
 
-		public static int FieldImageGetScaleY(PurpleRequestField field)
+		public static uint FieldImageGetScaleY(PurpleRequestField field)
 		{
-			throw new NotImplementedException();
+			return purple_request_field_image_get_scale_y(field.Reference);
 		}
 
 		/*
-		 * PurpleRequestField * purple_request_field_account_new(char * id, char * text, PurpleAccount * account)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_account_new(string id, string text, IntPtr account);
-
-		public static PurpleRequestField FieldAccountNew(string id, string text, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_account_set_default_value(PurpleRequestField * field, PurpleAccount * default_value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_account_set_default_value(IntPtr field, IntPtr default_value);
-
-		public static void FieldAccountSetDefaultValue(PurpleRequestField field, PurpleAccount default_value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_account_set_value(PurpleRequestField * field, PurpleAccount * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_account_set_value(IntPtr field, IntPtr value);
-
-		public static void FieldAccountSetValue(PurpleRequestField field, PurpleAccount value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_account_set_show_all(PurpleRequestField * field, gboolean show_all)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_account_set_show_all(IntPtr field, bool show_all);
-
-		public static void FieldAccountSetShowAll(PurpleRequestField field, bool show_all)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_request_field_account_set_filter(PurpleRequestField * field, PurpleFilterAccountFunc filter_func)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_field_account_set_filter(IntPtr field, UNKNOWN filter_func);
-
-		public static void FieldAccountSetFilter(PurpleRequestField field, PurpleFilterAccountFunc filter_func)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleAccount * purple_request_field_account_get_default_value(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_account_get_default_value(IntPtr field);
-
-		public static PurpleAccount FieldAccountGetDefaultValue(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleAccount * purple_request_field_account_get_value(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_field_account_get_value(IntPtr field);
-
-		public static PurpleAccount FieldAccountGetValue(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_request_field_account_get_show_all(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_request_field_account_get_show_all(IntPtr field);
-
-		public static bool FieldAccountGetShowAll(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleFilterAccountFunc purple_request_field_account_get_filter(PurpleRequestField * field)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_request_field_account_get_filter(IntPtr field);
-
-		public static PurpleFilterAccountFunc FieldAccountGetFilter(PurpleRequestField field)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_input(void * handle, char * title, char * primary, char * secondary, char * default_value, gboolean multiline, gboolean masked, gchar * hint, char * ok_text, GCallback ok_cb, char * cancel_text, GCallback cancel_cb, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_input(IntPtr handle, string title, string primary, string secondary, string default_value, bool multiline, bool masked, string hint, string ok_text, UNKNOWN ok_cb, string cancel_text, UNKNOWN cancel_cb, IntPtr account, string who, IntPtr conv, IntPtr user_data);
-
-		public static IntPtr Input(IntPtr handle, string title, string primary, string secondary, string default_value, bool multiline, bool masked, string hint, string ok_text, GCallback ok_cb, string cancel_text, GCallback cancel_cb, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_choice(void * handle, char * title, char * primary, char * secondary, int default_value, char * ok_text, GCallback ok_cb, char * cancel_text, GCallback cancel_cb, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_choice(IntPtr handle, string title, string primary, string secondary, int default_value, string ok_text, UNKNOWN ok_cb, string cancel_text, UNKNOWN cancel_cb, IntPtr account, string who, IntPtr conv, IntPtr user_data, ...);
-
-		public static IntPtr Choice(IntPtr handle, string title, string primary, string secondary, int default_value, string ok_text, GCallback ok_cb, string cancel_text, GCallback cancel_cb, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_choice_varg(void * handle, char * title, char * primary, char * secondary, int default_value, char * ok_text, GCallback ok_cb, char * cancel_text, GCallback cancel_cb, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data, va_list choices)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_choice_varg(IntPtr handle, string title, string primary, string secondary, int default_value, string ok_text, UNKNOWN ok_cb, string cancel_text, UNKNOWN cancel_cb, IntPtr account, string who, IntPtr conv, IntPtr user_data, UNKNOWN choices);
-
-		public static IntPtr ChoiceVarg(IntPtr handle, string title, string primary, string secondary, int default_value, string ok_text, GCallback ok_cb, string cancel_text, GCallback cancel_cb, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data, va_list choices)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_action(void * handle, char * title, char * primary, char * secondary, int default_action, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data, size_t action_count, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_action(IntPtr handle, string title, string primary, string secondary, int default_action, IntPtr account, string who, IntPtr conv, IntPtr user_data, UNKNOWN action_count, ...);
-
-		public static IntPtr Action(IntPtr handle, string title, string primary, string secondary, int default_action, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data, size_t action_count, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_action_varg(void * handle, char * title, char * primary, char * secondary, int default_action, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data, size_t action_count, va_list actions)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_action_varg(IntPtr handle, string title, string primary, string secondary, int default_action, IntPtr account, string who, IntPtr conv, IntPtr user_data, UNKNOWN action_count, UNKNOWN actions);
-
-		public static IntPtr ActionVarg(IntPtr handle, string title, string primary, string secondary, int default_action, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data, size_t action_count, va_list actions)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_fields(void * handle, char * title, char * primary, char * secondary, PurpleRequestFields * fields, char * ok_text, GCallback ok_cb, char * cancel_text, GCallback cancel_cb, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_fields(IntPtr handle, string title, string primary, string secondary, IntPtr fields, string ok_text, UNKNOWN ok_cb, string cancel_text, UNKNOWN cancel_cb, IntPtr account, string who, IntPtr conv, IntPtr user_data);
-
-		public static IntPtr Fields(IntPtr handle, string title, string primary, string secondary, PurpleRequestFields fields, string ok_text, GCallback ok_cb, string cancel_text, GCallback cancel_cb, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_request_close(PurpleRequestType type, void * uihandle)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_request_close(UNKNOWN type, IntPtr uihandle);
+		private static extern void purple_request_close(Request.PurpleRequestType type, IntPtr uihandle);
 
-		public static void Close(PurpleRequestType type, IntPtr uihandle)
+		public static void Close(Request.PurpleRequestType type, IntPtr uihandle)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -1091,53 +455,23 @@ namespace PurpleWrapper
 
 		public static void CloseWithHandle(IntPtr handle)
 		{
-			throw new NotImplementedException();
+			purple_request_close_with_handle(handle);
 		}
 
 		/*
-		 * void * purple_request_file(void * handle, char * title, char * filename, gboolean savedialog, GCallback ok_cb, GCallback cancel_cb, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_file(IntPtr handle, string title, string filename, bool savedialog, UNKNOWN ok_cb, UNKNOWN cancel_cb, IntPtr account, string who, IntPtr conv, IntPtr user_data);
-
-		public static IntPtr File(IntPtr handle, string title, string filename, bool savedialog, GCallback ok_cb, GCallback cancel_cb, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_request_folder(void * handle, char * title, char * dirname, GCallback ok_cb, GCallback cancel_cb, PurpleAccount * account, char * who, PurpleConversation * conv, void * user_data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_folder(IntPtr handle, string title, string dirname, UNKNOWN ok_cb, UNKNOWN cancel_cb, IntPtr account, string who, IntPtr conv, IntPtr user_data);
-
-		public static IntPtr Folder(IntPtr handle, string title, string dirname, GCallback ok_cb, GCallback cancel_cb, PurpleAccount account, string who, PurpleConversation conv, IntPtr user_data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_request_set_ui_ops(PurpleRequestUiOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_request_set_ui_ops in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestUiOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_request_set_ui_ops(IntPtr ops);
 
-		public static void SetUiOps(PurpleRequestUiOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleRequestUiOps * purple_request_get_ui_ops()
+		 * 
+		 * Could not generate a wrapper for purple_request_get_ui_ops in file "request.h".
+		 * Message: The type could not be resolved (PurpleRequestUiOps * purple_request_get_ui_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_request_get_ui_ops();
 
-		public static PurpleRequestUiOps GetUiOps()
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Roomlist.cs	06d1c2d0585bc501f6b22dfd52e561ec54c77d8a
+++ libpurple/wrapper/Roomlist.cs	1bd7a0fa7e168818b0412abc55996a9162fc5ec1
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,6 +40,19 @@ namespace PurpleWrapper
 {
 	public class Roomlist
 	{
+		public enum PurpleRoomlistRoomType
+		{
+			PURPLE_ROOMLIST_ROOMTYPE_CATEGORY = 0x01,
+			PURPLE_ROOMLIST_ROOMTYPE_ROOM = 0x02
+		};
+
+		public enum PurpleRoomlistFieldType
+		{
+			PURPLE_ROOMLIST_FIELD_BOOL,
+			PURPLE_ROOMLIST_FIELD_INT,
+			PURPLE_ROOMLIST_FIELD_STRING
+		};
+
 		/*
 		 * void purple_roomlist_show_with_account(PurpleAccount * account)
 		 */
@@ -46,7 +61,7 @@ namespace PurpleWrapper
 
 		public static void ShowWithAccount(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_show_with_account(account.Reference);
 		}
 
 		/*
@@ -57,7 +72,7 @@ namespace PurpleWrapper
 
 		public static PurpleRoomlist New(PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			return new PurpleRoomlist(purple_roomlist_new(account.Reference));
 		}
 
 		/*
@@ -68,7 +83,7 @@ namespace PurpleWrapper
 
 		public static void Ref(PurpleRoomlist list)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_ref(list.Reference);
 		}
 
 		/*
@@ -79,20 +94,16 @@ namespace PurpleWrapper
 
 		public static void Unref(PurpleRoomlist list)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_unref(list.Reference);
 		}
 
 		/*
 		 * void purple_roomlist_set_fields(PurpleRoomlist * list, GList * fields)
+		 * 
+		 * Could not generate a wrapper for purple_roomlist_set_fields in file "roomlist.h".
+		 * Message: The type could not be resolved (GList * fields).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_roomlist_set_fields(IntPtr list, IntPtr fields);
 
-		public static void SetFields(PurpleRoomlist list, GList fields)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_roomlist_set_in_progress(PurpleRoomlist * list, gboolean in_progress)
 		 */
@@ -101,7 +112,7 @@ namespace PurpleWrapper
 
 		public static void SetInProgress(PurpleRoomlist list, bool in_progress)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_set_in_progress(list.Reference, in_progress);
 		}
 
 		/*
@@ -112,7 +123,7 @@ namespace PurpleWrapper
 
 		public static bool GetInProgress(PurpleRoomlist list)
 		{
-			throw new NotImplementedException();
+			return purple_roomlist_get_in_progress(list.Reference);
 		}
 
 		/*
@@ -123,7 +134,7 @@ namespace PurpleWrapper
 
 		public static void RoomAdd(PurpleRoomlist list, PurpleRoomlistRoom room)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_room_add(list.Reference, room.Reference);
 		}
 
 		/*
@@ -134,7 +145,7 @@ namespace PurpleWrapper
 
 		public static PurpleRoomlist GetList(PurpleConnection gc)
 		{
-			throw new NotImplementedException();
+			return new PurpleRoomlist(purple_roomlist_get_list(gc.Reference));
 		}
 
 		/*
@@ -145,7 +156,7 @@ namespace PurpleWrapper
 
 		public static void CancelGetList(PurpleRoomlist list)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_cancel_get_list(list.Reference);
 		}
 
 		/*
@@ -156,29 +167,25 @@ namespace PurpleWrapper
 
 		public static void ExpandCategory(PurpleRoomlist list, PurpleRoomlistRoom category)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_expand_category(list.Reference, category.Reference);
 		}
 
 		/*
-		 * PurpleRoomlistRoom * purple_roomlist_room_new(PurpleRoomlistRoomType type, gchar * name, PurpleRoomlistRoom * parent)
+		 * GList * purple_roomlist_get_fields(PurpleRoomlist * roomlist)
+		 * 
+		 * Could not generate a wrapper for purple_roomlist_get_fields in file "roomlist.h".
+		 * Message: The type could not be resolved (GList * purple_roomlist_get_fields(PurpleRoomlist * roomlist)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_roomlist_room_new(UNKNOWN type, string name, IntPtr parent);
 
-		public static PurpleRoomlistRoom RoomNew(PurpleRoomlistRoomType type, string name, PurpleRoomlistRoom parent)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_roomlist_room_add_field(PurpleRoomlist * list, PurpleRoomlistRoom * room, gconstpointer field)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_roomlist_room_add_field(IntPtr list, IntPtr room, UNKNOWN field);
+		private static extern void purple_roomlist_room_add_field(IntPtr list, IntPtr room, IntPtr field);
 
-		public static void RoomAddField(PurpleRoomlist list, PurpleRoomlistRoom room, gconstpointer field)
+		public static void RoomAddField(PurpleRoomlist list, PurpleRoomlistRoom room, IntPtr field)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_room_add_field(list.Reference, room.Reference, field);
 		}
 
 		/*
@@ -189,43 +196,74 @@ namespace PurpleWrapper
 
 		public static void RoomJoin(PurpleRoomlist list, PurpleRoomlistRoom room)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_room_join(list.Reference, room.Reference);
 		}
 
 		/*
 		 * PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom * room)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_roomlist_room_get_type(IntPtr room);
+		private static extern Roomlist.PurpleRoomlistRoomType purple_roomlist_room_get_type(IntPtr room);
 
-		public static PurpleRoomlistRoomType RoomGetType(PurpleRoomlistRoom room)
+		public static Roomlist.PurpleRoomlistRoomType RoomGetType(PurpleRoomlistRoom room)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_roomlist_room_get_type, a KnownEnum. */
+			
 		}
 
 		/*
-		 * PurpleRoomlistField * purple_roomlist_field_new(PurpleRoomlistFieldType type, gchar * label, gchar * name, gboolean hidden)
+		 * char * purple_roomlist_room_get_name(PurpleRoomlistRoom * room)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_roomlist_field_new(UNKNOWN type, string label, string name, bool hidden);
+		private static extern string purple_roomlist_room_get_name(IntPtr room);
 
-		public static PurpleRoomlistField FieldNew(PurpleRoomlistFieldType type, string label, string name, bool hidden)
+		public static string RoomGetName(PurpleRoomlistRoom room)
 		{
-			throw new NotImplementedException();
+			return purple_roomlist_room_get_name(room.Reference);
 		}
 
 		/*
+		 * PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom * room)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern IntPtr purple_roomlist_room_get_parent(IntPtr room);
+
+		public static PurpleRoomlistRoom RoomGetParent(PurpleRoomlistRoom room)
+		{
+			return new PurpleRoomlistRoom(purple_roomlist_room_get_parent(room.Reference));
+		}
+
+		/*
+		 * GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom * room)
+		 * 
+		 * Could not generate a wrapper for purple_roomlist_room_get_fields in file "roomlist.h".
+		 * Message: The type could not be resolved (GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom * room)).
+		 */
+
+		/*
 		 * PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField * field)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_roomlist_field_get_type(IntPtr field);
+		private static extern Roomlist.PurpleRoomlistFieldType purple_roomlist_field_get_type(IntPtr field);
 
-		public static PurpleRoomlistFieldType FieldGetType(PurpleRoomlistField field)
+		public static Roomlist.PurpleRoomlistFieldType FieldGetType(PurpleRoomlistField field)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_roomlist_field_get_type, a KnownEnum. */
+			
 		}
 
 		/*
+		 * char * purple_roomlist_field_get_label(PurpleRoomlistField * field)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string purple_roomlist_field_get_label(IntPtr field);
+
+		public static string FieldGetLabel(PurpleRoomlistField field)
+		{
+			return purple_roomlist_field_get_label(field.Reference);
+		}
+
+		/*
 		 * gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField * field)
 		 */
 		[DllImport("libpurple.dll")]
@@ -233,7 +271,7 @@ namespace PurpleWrapper
 
 		public static bool FieldGetHidden(PurpleRoomlistField field)
 		{
-			throw new NotImplementedException();
+			return purple_roomlist_field_get_hidden(field.Reference);
 		}
 
 		/*
@@ -244,7 +282,7 @@ namespace PurpleWrapper
 
 		public static void SetUiOps(PurpleRoomlistUiOps ops)
 		{
-			throw new NotImplementedException();
+			purple_roomlist_set_ui_ops(ops.Reference);
 		}
 
 		/*
@@ -255,7 +293,7 @@ namespace PurpleWrapper
 
 		public static PurpleRoomlistUiOps GetUiOps()
 		{
-			throw new NotImplementedException();
+			return new PurpleRoomlistUiOps(purple_roomlist_get_ui_ops());
 		}
 
 	}
============================================================
--- libpurple/wrapper/Savedstatuses.cs	3fb330b94d622dfbe907a38f56a4e57d48bedb5d
+++ libpurple/wrapper/Savedstatuses.cs	4dc34d62dd5fc8834b948c67aee71435d39c641e
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,72 +41,6 @@ namespace PurpleWrapper
 	public class Savedstatuses
 	{
 		/*
-		 * PurpleSavedStatus * purple_savedstatus_new(char * title, PurpleStatusPrimitive type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_new(string title, UNKNOWN type);
-
-		public static PurpleSavedStatus SavedstatusNew(string title, PurpleStatusPrimitive type)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_savedstatus_set_title(PurpleSavedStatus * status, char * title)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_set_title(IntPtr status, string title);
-
-		public static void SavedstatusSetTitle(PurpleSavedStatus status, string title)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_savedstatus_set_type(PurpleSavedStatus * status, PurpleStatusPrimitive type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_set_type(IntPtr status, UNKNOWN type);
-
-		public static void SavedstatusSetType(PurpleSavedStatus status, PurpleStatusPrimitive type)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_savedstatus_set_message(PurpleSavedStatus * status, char * message)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_set_message(IntPtr status, string message);
-
-		public static void SavedstatusSetMessage(PurpleSavedStatus status, string message)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_savedstatus_set_substatus(PurpleSavedStatus * status, PurpleAccount * account, PurpleStatusType * type, char * message)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_set_substatus(IntPtr status, IntPtr account, IntPtr type, string message);
-
-		public static void SavedstatusSetSubstatus(PurpleSavedStatus status, PurpleAccount account, PurpleStatusType type, string message)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_savedstatus_unset_substatus(PurpleSavedStatus * saved_status, PurpleAccount * account)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_unset_substatus(IntPtr saved_status, IntPtr account);
-
-		public static void SavedstatusUnsetSubstatus(PurpleSavedStatus saved_status, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_savedstatus_delete(char * title)
 		 */
 		[DllImport("libpurple.dll")]
@@ -112,75 +48,51 @@ namespace PurpleWrapper
 
 		public static bool SavedstatusDelete(string title)
 		{
-			throw new NotImplementedException();
+			return purple_savedstatus_delete(title);
 		}
 
 		/*
 		 * void purple_savedstatus_delete_by_status(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_delete_by_status in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_delete_by_status(IntPtr saved_status);
 
-		public static void SavedstatusDeleteByStatus(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_savedstatuses_get_all()
+		 * 
+		 * Could not generate a wrapper for purple_savedstatuses_get_all in file "savedstatuses.h".
+		 * Message: The type could not be resolved (GList * purple_savedstatuses_get_all()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatuses_get_all();
 
-		public static GList GetAll()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * GList * purple_savedstatuses_get_popular(unsigned int)
+		 * GList * purple_savedstatuses_get_popular(unsigned int how_many)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatuses_get_popular in file "savedstatuses.h".
+		 * Message: The type could not be resolved (GList * purple_savedstatuses_get_popular(unsigned int how_many)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatuses_get_popular(UNKNOWN int);
 
-		public static GList GetPopular(unsigned int)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSavedStatus * purple_savedstatus_get_current()
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_current in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * purple_savedstatus_get_current()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_get_current();
 
-		public static PurpleSavedStatus SavedstatusGetCurrent()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSavedStatus * purple_savedstatus_get_default()
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_default in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * purple_savedstatus_get_default()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_get_default();
 
-		public static PurpleSavedStatus SavedstatusGetDefault()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSavedStatus * purple_savedstatus_get_idleaway()
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_idleaway in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * purple_savedstatus_get_idleaway()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_get_idleaway();
 
-		public static PurpleSavedStatus SavedstatusGetIdleaway()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_savedstatus_is_idleaway()
 		 */
@@ -189,7 +101,7 @@ namespace PurpleWrapper
 
 		public static bool SavedstatusIsIdleaway()
 		{
-			throw new NotImplementedException();
+			return purple_savedstatus_is_idleaway();
 		}
 
 		/*
@@ -200,174 +112,107 @@ namespace PurpleWrapper
 
 		public static void SavedstatusSetIdleaway(bool idleaway)
 		{
-			throw new NotImplementedException();
+			purple_savedstatus_set_idleaway(idleaway);
 		}
 
 		/*
 		 * PurpleSavedStatus * purple_savedstatus_get_startup()
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_startup in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * purple_savedstatus_get_startup()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_get_startup();
 
-		public static PurpleSavedStatus SavedstatusGetStartup()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSavedStatus * purple_savedstatus_find(char * title)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_find in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * purple_savedstatus_find(char * title)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_find(string title);
 
-		public static PurpleSavedStatus SavedstatusFind(string title)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSavedStatus * purple_savedstatus_find_by_creation_time(time_t creation_time)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_find_by_creation_time in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * purple_savedstatus_find_by_creation_time(time_t creation_time)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_find_by_creation_time(UNKNOWN creation_time);
 
-		public static PurpleSavedStatus SavedstatusFindByCreationTime(time_t creation_time)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSavedStatus * purple_savedstatus_find_transient_by_type_and_message(PurpleStatusPrimitive type, char * message)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_find_transient_by_type_and_message in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * purple_savedstatus_find_transient_by_type_and_message(PurpleStatusPrimitive type, char * message)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_find_transient_by_type_and_message(UNKNOWN type, string message);
 
-		public static PurpleSavedStatus SavedstatusFindTransientByTypeAndMessage(PurpleStatusPrimitive type, string message)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_savedstatus_is_transient(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_is_transient in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_savedstatus_is_transient(IntPtr saved_status);
 
-		public static bool SavedstatusIsTransient(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_savedstatus_get_title(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_title in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_savedstatus_get_title(IntPtr saved_status);
 
-		public static string SavedstatusGetTitle(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleStatusPrimitive purple_savedstatus_get_type(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_type in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_savedstatus_get_type(IntPtr saved_status);
 
-		public static PurpleStatusPrimitive SavedstatusGetType(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_savedstatus_get_message(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_message in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_savedstatus_get_message(IntPtr saved_status);
 
-		public static string SavedstatusGetMessage(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * time_t purple_savedstatus_get_creation_time(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_get_creation_time in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_savedstatus_get_creation_time(IntPtr saved_status);
 
-		public static time_t SavedstatusGetCreationTime(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_savedstatus_has_substatuses(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_has_substatuses in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_savedstatus_has_substatuses(IntPtr saved_status);
 
-		public static bool SavedstatusHasSubstatuses(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleSavedStatusSub * purple_savedstatus_get_substatus(PurpleSavedStatus * saved_status, PurpleAccount * account)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_get_substatus(IntPtr saved_status, IntPtr account);
-
-		public static PurpleSavedStatusSub SavedstatusGetSubstatus(PurpleSavedStatus saved_status, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleStatusType * purple_savedstatus_substatus_get_type(PurpleSavedStatusSub * substatus)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_substatus_get_type in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleStatusType * purple_savedstatus_substatus_get_type(PurpleSavedStatusSub * substatus)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_savedstatus_substatus_get_type(IntPtr substatus);
 
-		public static PurpleStatusType SavedstatusSubstatusGetType(PurpleSavedStatusSub substatus)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_savedstatus_substatus_get_message(PurpleSavedStatusSub * substatus)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_substatus_get_message in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatusSub * substatus).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_savedstatus_substatus_get_message(IntPtr substatus);
 
-		public static string SavedstatusSubstatusGetMessage(PurpleSavedStatusSub substatus)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_savedstatus_activate(PurpleSavedStatus * saved_status)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_activate in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_activate(IntPtr saved_status);
 
-		public static void SavedstatusActivate(PurpleSavedStatus saved_status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_savedstatus_activate_for_account(PurpleSavedStatus * saved_status, PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_savedstatus_activate_for_account in file "savedstatuses.h".
+		 * Message: The type could not be resolved (PurpleSavedStatus * saved_status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_savedstatus_activate_for_account(IntPtr saved_status, IntPtr account);
 
-		public static void SavedstatusActivateForAccount(PurpleSavedStatus saved_status, PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_savedstatuses_get_handle()
 		 */
@@ -376,7 +221,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_savedstatuses_get_handle();
 		}
 
 		/*
@@ -387,7 +232,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_savedstatuses_init();
 		}
 
 		/*
@@ -398,7 +243,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_savedstatuses_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Server.cs	c8d4cc5379d85fdbf15cc5bc8d9722bb1877eedd
+++ libpurple/wrapper/Server.cs	7e6ab0d6acdc6b078c717a8839e606078d2505d9
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,35 +41,37 @@ namespace PurpleWrapper
 	public class Server
 	{
 		/*
-		 * int serv_send_typing(PurpleConnection * gc, char * name, PurpleTypingState state)
+		 * unsigned int serv_send_typing(PurpleConnection * gc, char * name, PurpleTypingState state)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int serv_send_typing(IntPtr gc, string name, UNKNOWN state);
+		private static extern uint serv_send_typing(IntPtr gc, string name, Conversation.PurpleTypingState state);
 
-		public static int ServSendTyping(PurpleConnection gc, string name, PurpleTypingState state)
+		public static uint ServSendTyping(PurpleConnection gc, string name, Conversation.PurpleTypingState state)
 		{
+			/* Unable to process state, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * void serv_move_buddy( ,  ,  )
+		 * void serv_move_buddy(PurpleBuddy * , PurpleGroup * , PurpleGroup * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_move_buddy(UNKNOWN , UNKNOWN , UNKNOWN );
+		private static extern void serv_move_buddy(IntPtr , IntPtr , IntPtr );
 
-		public static void ServMoveBuddy( ,  ,  )
+		public static void ServMoveBuddy(PurpleBuddy , PurpleGroup , PurpleGroup )
 		{
-			throw new NotImplementedException();
+			serv_move_buddy(.Reference, .Reference, .Reference);
 		}
 
 		/*
-		 * int serv_send_im( ,  ,  , PurpleMessageFlags flags)
+		 * int serv_send_im(PurpleConnection * , char * , char * , PurpleMessageFlags flags)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern int serv_send_im(UNKNOWN , UNKNOWN , UNKNOWN , UNKNOWN flags);
+		private static extern int serv_send_im(IntPtr , string , string , Conversation.PurpleMessageFlags flags);
 
-		public static int ServSendIm( ,  ,  , PurpleMessageFlags flags)
+		public static int ServSendIm(PurpleConnection , string , string , Conversation.PurpleMessageFlags flags)
 		{
+			/* Unable to process flags, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -79,7 +83,7 @@ namespace PurpleWrapper
 
 		public static PurpleAttentionType GetAttentionTypeFromCode(PurpleAccount account, uint type_code)
 		{
-			throw new NotImplementedException();
+			return new PurpleAttentionType(purple_get_attention_type_from_code(account.Reference, type_code));
 		}
 
 		/*
@@ -90,7 +94,7 @@ namespace PurpleWrapper
 
 		public static void ServSendAttention(PurpleConnection gc, string who, uint type_code)
 		{
-			throw new NotImplementedException();
+			serv_send_attention(gc.Reference, who, type_code);
 		}
 
 		/*
@@ -101,139 +105,123 @@ namespace PurpleWrapper
 
 		public static void ServGotAttention(PurpleConnection gc, string who, uint type_code)
 		{
-			throw new NotImplementedException();
+			serv_got_attention(gc.Reference, who, type_code);
 		}
 
 		/*
-		 * void serv_get_info( ,  )
+		 * void serv_get_info(PurpleConnection * , char * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_get_info(UNKNOWN , UNKNOWN );
+		private static extern void serv_get_info(IntPtr , string );
 
-		public static void ServGetInfo( ,  )
+		public static void ServGetInfo(PurpleConnection , string )
 		{
-			throw new NotImplementedException();
+			serv_get_info(.Reference, );
 		}
 
 		/*
-		 * void serv_set_info( ,  )
+		 * void serv_set_info(PurpleConnection * , char * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_set_info(UNKNOWN , UNKNOWN );
+		private static extern void serv_set_info(IntPtr , string );
 
-		public static void ServSetInfo( ,  )
+		public static void ServSetInfo(PurpleConnection , string )
 		{
-			throw new NotImplementedException();
+			serv_set_info(.Reference, );
 		}
 
 		/*
-		 * void serv_add_permit( ,  )
+		 * void serv_add_permit(PurpleConnection * , char * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_add_permit(UNKNOWN , UNKNOWN );
+		private static extern void serv_add_permit(IntPtr , string );
 
-		public static void ServAddPermit( ,  )
+		public static void ServAddPermit(PurpleConnection , string )
 		{
-			throw new NotImplementedException();
+			serv_add_permit(.Reference, );
 		}
 
 		/*
-		 * void serv_add_deny( ,  )
+		 * void serv_add_deny(PurpleConnection * , char * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_add_deny(UNKNOWN , UNKNOWN );
+		private static extern void serv_add_deny(IntPtr , string );
 
-		public static void ServAddDeny( ,  )
+		public static void ServAddDeny(PurpleConnection , string )
 		{
-			throw new NotImplementedException();
+			serv_add_deny(.Reference, );
 		}
 
 		/*
-		 * void serv_rem_permit( ,  )
+		 * void serv_rem_permit(PurpleConnection * , char * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_rem_permit(UNKNOWN , UNKNOWN );
+		private static extern void serv_rem_permit(IntPtr , string );
 
-		public static void ServRemPermit( ,  )
+		public static void ServRemPermit(PurpleConnection , string )
 		{
-			throw new NotImplementedException();
+			serv_rem_permit(.Reference, );
 		}
 
 		/*
-		 * void serv_rem_deny( ,  )
+		 * void serv_rem_deny(PurpleConnection * , char * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_rem_deny(UNKNOWN , UNKNOWN );
+		private static extern void serv_rem_deny(IntPtr , string );
 
-		public static void ServRemDeny( ,  )
+		public static void ServRemDeny(PurpleConnection , string )
 		{
-			throw new NotImplementedException();
+			serv_rem_deny(.Reference, );
 		}
 
 		/*
-		 * void serv_set_permit_deny( )
+		 * void serv_set_permit_deny(PurpleConnection * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_set_permit_deny(UNKNOWN );
+		private static extern void serv_set_permit_deny(IntPtr );
 
-		public static void ServSetPermitDeny( )
+		public static void ServSetPermitDeny(PurpleConnection )
 		{
-			throw new NotImplementedException();
+			serv_set_permit_deny(.Reference);
 		}
 
 		/*
-		 * void serv_chat_invite( ,  ,  ,  )
+		 * void serv_chat_invite(PurpleConnection * ,  , char * , char * )
+		 * 
+		 * Could not generate a wrapper for serv_chat_invite in file "server.h".
+		 * Message: The type could not be resolved ( ).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_chat_invite(UNKNOWN , UNKNOWN , UNKNOWN , UNKNOWN );
 
-		public static void ServChatInvite( ,  ,  ,  )
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void serv_chat_leave( ,  )
+		 * void serv_chat_leave(PurpleConnection * ,  )
+		 * 
+		 * Could not generate a wrapper for serv_chat_leave in file "server.h".
+		 * Message: The type could not be resolved ( ).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_chat_leave(UNKNOWN , UNKNOWN );
 
-		public static void ServChatLeave( ,  )
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void serv_chat_whisper( ,  ,  ,  )
+		 * void serv_chat_whisper(PurpleConnection * ,  , char * , char * )
+		 * 
+		 * Could not generate a wrapper for serv_chat_whisper in file "server.h".
+		 * Message: The type could not be resolved ( ).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_chat_whisper(UNKNOWN , UNKNOWN , UNKNOWN , UNKNOWN );
 
-		public static void ServChatWhisper( ,  ,  ,  )
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * int serv_chat_send( ,  ,  , PurpleMessageFlags flags)
+		 * int serv_chat_send(PurpleConnection * ,  , char * , PurpleMessageFlags flags)
+		 * 
+		 * Could not generate a wrapper for serv_chat_send in file "server.h".
+		 * Message: The type could not be resolved ( ).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int serv_chat_send(UNKNOWN , UNKNOWN , UNKNOWN , UNKNOWN flags);
 
-		public static int ServChatSend( ,  ,  , PurpleMessageFlags flags)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void serv_alias_buddy( )
+		 * void serv_alias_buddy(PurpleBuddy * )
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void serv_alias_buddy(UNKNOWN );
+		private static extern void serv_alias_buddy(IntPtr );
 
-		public static void ServAliasBuddy( )
+		public static void ServAliasBuddy(PurpleBuddy )
 		{
-			throw new NotImplementedException();
+			serv_alias_buddy(.Reference);
 		}
 
 		/*
@@ -244,7 +232,7 @@ namespace PurpleWrapper
 
 		public static void ServGotAlias(PurpleConnection gc, string who, string alias)
 		{
-			throw new NotImplementedException();
+			serv_got_alias(gc.Reference, who, alias);
 		}
 
 		/*
@@ -255,21 +243,10 @@ namespace PurpleWrapper
 
 		public static void ServGotPrivateAlias(PurpleConnection gc, string who, string alias)
 		{
-			throw new NotImplementedException();
+			purple_serv_got_private_alias(gc.Reference, who, alias);
 		}
 
 		/*
-		 * void serv_got_typing(PurpleConnection * gc, char * name, int timeout, PurpleTypingState state)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_got_typing(IntPtr gc, string name, int timeout, UNKNOWN state);
-
-		public static void ServGotTyping(PurpleConnection gc, string name, int timeout, PurpleTypingState state)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void serv_got_typing_stopped(PurpleConnection * gc, char * name)
 		 */
 		[DllImport("libpurple.dll")]
@@ -277,75 +254,30 @@ namespace PurpleWrapper
 
 		public static void ServGotTypingStopped(PurpleConnection gc, string name)
 		{
-			throw new NotImplementedException();
+			serv_got_typing_stopped(gc.Reference, name);
 		}
 
 		/*
-		 * void serv_got_im(PurpleConnection * gc, char * who, char * msg, PurpleMessageFlags flags, time_t mtime)
+		 * void serv_join_chat(PurpleConnection * , GHashTable * data)
+		 * 
+		 * Could not generate a wrapper for serv_join_chat in file "server.h".
+		 * Message: The type could not be resolved (GHashTable * data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_got_im(IntPtr gc, string who, string msg, UNKNOWN flags, UNKNOWN mtime);
 
-		public static void ServGotIm(PurpleConnection gc, string who, string msg, PurpleMessageFlags flags, time_t mtime)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void serv_join_chat( , GHashTable * data)
+		 * void serv_reject_chat(PurpleConnection * , GHashTable * data)
+		 * 
+		 * Could not generate a wrapper for serv_reject_chat in file "server.h".
+		 * Message: The type could not be resolved (GHashTable * data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_join_chat(UNKNOWN , IntPtr data);
 
-		public static void ServJoinChat( , GHashTable data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void serv_reject_chat( , GHashTable * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_reject_chat(UNKNOWN , IntPtr data);
-
-		public static void ServRejectChat( , GHashTable data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void serv_got_chat_invite(PurpleConnection * gc, char * name, char * who, char * message, GHashTable * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_got_chat_invite(IntPtr gc, string name, string who, string message, IntPtr data);
-
-		public static void ServGotChatInvite(PurpleConnection gc, string name, string who, string message, GHashTable data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleConversation * serv_got_joined_chat(PurpleConnection * gc, int id, char * name)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr serv_got_joined_chat(IntPtr gc, int id, string name);
-
-		public static PurpleConversation ServGotJoinedChat(PurpleConnection gc, int id, string name)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_serv_got_join_chat_failed(PurpleConnection * gc, GHashTable * data)
+		 * 
+		 * Could not generate a wrapper for purple_serv_got_join_chat_failed in file "server.h".
+		 * Message: The type could not be resolved (GHashTable * data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_serv_got_join_chat_failed(IntPtr gc, IntPtr data);
 
-		public static void ServGotJoinChatFailed(PurpleConnection gc, GHashTable data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void serv_got_chat_left(PurpleConnection * g, int id)
 		 */
@@ -354,21 +286,10 @@ namespace PurpleWrapper
 
 		public static void ServGotChatLeft(PurpleConnection g, int id)
 		{
-			throw new NotImplementedException();
+			serv_got_chat_left(g.Reference, id);
 		}
 
 		/*
-		 * void serv_got_chat_in(PurpleConnection * g, int id, char * who, PurpleMessageFlags flags, char * message, time_t mtime)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void serv_got_chat_in(IntPtr g, int id, string who, UNKNOWN flags, string message, UNKNOWN mtime);
-
-		public static void ServGotChatIn(PurpleConnection g, int id, string who, PurpleMessageFlags flags, string message, time_t mtime)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void serv_send_file(PurpleConnection * gc, char * who, char * file)
 		 */
 		[DllImport("libpurple.dll")]
@@ -376,7 +297,7 @@ namespace PurpleWrapper
 
 		public static void ServSendFile(PurpleConnection gc, string who, string file)
 		{
-			throw new NotImplementedException();
+			serv_send_file(gc.Reference, who, file);
 		}
 
 	}
============================================================
--- libpurple/wrapper/Signals.cs	0fd710084b6210ac2048951e6185e31946a31d48
+++ libpurple/wrapper/Signals.cs	d93f51f11420ecdafbfce594b0e8a9c275954f1f
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,17 +41,6 @@ namespace PurpleWrapper
 	public class Signals
 	{
 		/*
-		 * gulong purple_signal_register(void * instance, char * signal, PurpleSignalMarshalFunc marshal, PurpleValue * ret_value, int num_values, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_signal_register(IntPtr instance, string signal, UNKNOWN marshal, IntPtr ret_value, int num_values, ...);
-
-		public static ulong SignalRegister(IntPtr instance, string signal, PurpleSignalMarshalFunc marshal, PurpleValue ret_value, int num_values, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_signal_unregister(void * instance, char * signal)
 		 */
 		[DllImport("libpurple.dll")]
@@ -57,7 +48,7 @@ namespace PurpleWrapper
 
 		public static void SignalUnregister(IntPtr instance, string signal)
 		{
-			throw new NotImplementedException();
+			purple_signal_unregister(instance, signal);
 		}
 
 		/*
@@ -68,76 +59,10 @@ namespace PurpleWrapper
 
 		public static void UnregisterByInstance(IntPtr instance)
 		{
-			throw new NotImplementedException();
+			purple_signals_unregister_by_instance(instance);
 		}
 
 		/*
-		 * void purple_signal_get_values(void * instance, char * signal, PurpleValue ** ret_value, int * num_values, PurpleValue *** values)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_signal_get_values(IntPtr instance, string signal, IntPtr ret_value, IntPtr num_values, IntPtr values);
-
-		public static void SignalGetValues(IntPtr instance, string signal, PurpleValue ret_value, int num_values, PurpleValue values)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gulong purple_signal_connect_priority(void * instance, char * signal, void * handle, PurpleCallback func, void * data, int priority)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_signal_connect_priority(IntPtr instance, string signal, IntPtr handle, UNKNOWN func, IntPtr data, int priority);
-
-		public static ulong SignalConnectPriority(IntPtr instance, string signal, IntPtr handle, PurpleCallback func, IntPtr data, int priority)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gulong purple_signal_connect(void * instance, char * signal, void * handle, PurpleCallback func, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_signal_connect(IntPtr instance, string signal, IntPtr handle, UNKNOWN func, IntPtr data);
-
-		public static ulong SignalConnect(IntPtr instance, string signal, IntPtr handle, PurpleCallback func, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gulong purple_signal_connect_priority_vargs(void * instance, char * signal, void * handle, PurpleCallback func, void * data, int priority)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_signal_connect_priority_vargs(IntPtr instance, string signal, IntPtr handle, UNKNOWN func, IntPtr data, int priority);
-
-		public static ulong SignalConnectPriorityVargs(IntPtr instance, string signal, IntPtr handle, PurpleCallback func, IntPtr data, int priority)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gulong purple_signal_connect_vargs(void * instance, char * signal, void * handle, PurpleCallback func, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_signal_connect_vargs(IntPtr instance, string signal, IntPtr handle, UNKNOWN func, IntPtr data);
-
-		public static ulong SignalConnectVargs(IntPtr instance, string signal, IntPtr handle, PurpleCallback func, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_signal_disconnect(void * instance, char * signal, void * handle, PurpleCallback func)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_signal_disconnect(IntPtr instance, string signal, IntPtr handle, UNKNOWN func);
-
-		public static void SignalDisconnect(IntPtr instance, string signal, IntPtr handle, PurpleCallback func)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_signals_disconnect_by_handle(void * handle)
 		 */
 		[DllImport("libpurple.dll")]
@@ -145,54 +70,17 @@ namespace PurpleWrapper
 
 		public static void DisconnectByHandle(IntPtr handle)
 		{
-			throw new NotImplementedException();
+			purple_signals_disconnect_by_handle(handle);
 		}
 
 		/*
-		 * void purple_signal_emit(void * instance, char * signal, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_signal_emit(IntPtr instance, string signal, ...);
-
-		public static void SignalEmit(IntPtr instance, string signal, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_signal_emit_vargs(void * instance, char * signal, va_list args)
+		 * 
+		 * Could not generate a wrapper for purple_signal_emit_vargs in file "signals.h".
+		 * Message: The type could not be resolved (va_list args).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_signal_emit_vargs(IntPtr instance, string signal, UNKNOWN args);
 
-		public static void SignalEmitVargs(IntPtr instance, string signal, va_list args)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void * purple_signal_emit_return_1(void * instance, char * signal, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_signal_emit_return_1(IntPtr instance, string signal, ...);
-
-		public static IntPtr SignalEmitReturn1(IntPtr instance, string signal, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void * purple_signal_emit_vargs_return_1(void * instance, char * signal, va_list args)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_signal_emit_vargs_return_1(IntPtr instance, string signal, UNKNOWN args);
-
-		public static IntPtr SignalEmitVargsReturn1(IntPtr instance, string signal, va_list args)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_signals_init()
 		 */
 		[DllImport("libpurple.dll")]
@@ -200,7 +88,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_signals_init();
 		}
 
 		/*
@@ -211,394 +99,9 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_signals_uninit();
 		}
 
-		/*
-		 * void purple_marshal_VOID(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__INT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__INT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_int(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__INT_INT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__INT_INT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_intInt(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_INT_INT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_INT_INT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerIntInt(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_INT_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_INT_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerIntPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_UINT_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_UINT_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerUintUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerPointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerPointerUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerPointerPointerUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalVoid_pointerPointerPointerUintUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_INT__INT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_INT__INT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalInt_int(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_INT__INT_INT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_INT__INT_INT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalInt_intInt(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_INT__POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_INT__POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalInt_pointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalInt_pointerPointerPointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointerUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointerPointerUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointerPointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_UINT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_UINT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointerPointerPointerUint(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_pointerPointerPointerPointerPointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_BOOLEAN__INT_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_BOOLEAN__INT_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalBoolean_intPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_POINTER__POINTER_INT(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_POINTER__POINTER_INT(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalPointer_pointerInt(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_POINTER__POINTER_INT64(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_POINTER__POINTER_INT64(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalPointer_pointerInt64(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_POINTER__POINTER_INT_BOOLEAN(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_POINTER__POINTER_INT_BOOLEAN(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalPointer_pointerIntBoolean(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_POINTER__POINTER_INT64_BOOLEAN(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_POINTER__POINTER_INT64_BOOLEAN(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalPointer_pointerInt64Boolean(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_marshal_POINTER__POINTER_POINTER(PurpleCallback cb, va_list args, void * data, void ** return_val)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_marshal_POINTER__POINTER_POINTER(UNKNOWN cb, UNKNOWN args, IntPtr data, IntPtr return_val);
-
-		public static void MarshalPointer_pointerPointer(PurpleCallback cb, va_list args, IntPtr data, void return_val)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Smiley.cs	925c41152f40e63c74859bd6e35e8926965fbc11
+++ libpurple/wrapper/Smiley.cs	1082add9ff24240a7e9b2eacf6a09ab9340b61f4
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,111 +44,104 @@ namespace PurpleWrapper
 		 * GType purple_smiley_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_smiley_get_type();
+		private static extern IntPtr purple_smiley_get_type();
 
-		public static GType GetType()
+		public static /* libgobject */ IntPtr GetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_smiley_get_type, a GObjectObject. */
+			
 		}
 
 		/*
-		 * void purple_smiley_delete(PurpleSmiley * smiley)
+		 * PurpleSmiley * purple_smiley_new(PurpleStoredImage * img, char * shortcut)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_new in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * purple_smiley_new(PurpleStoredImage * img, char * shortcut)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_smiley_delete(IntPtr smiley);
 
-		public static void Delete(PurpleSmiley smiley)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_smiley_set_shortcut(PurpleSmiley * smiley, char * shortcut)
+		 * PurpleSmiley * purple_smiley_new_from_file(char * shortcut, char * filepath)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_new_from_file in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * purple_smiley_new_from_file(char * shortcut, char * filepath)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_smiley_set_shortcut(IntPtr smiley, string shortcut);
 
-		public static bool SetShortcut(PurpleSmiley smiley, string shortcut)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_smiley_set_data(PurpleSmiley * smiley, guchar * smiley_data, size_t smiley_data_len)
+		 * void purple_smiley_delete(PurpleSmiley * smiley)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_delete in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * smiley).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_smiley_set_data(IntPtr smiley, IntPtr smiley_data, UNKNOWN smiley_data_len);
 
-		public static void SetData(PurpleSmiley smiley, guchar smiley_data, size_t smiley_data_len)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * gboolean purple_smiley_set_shortcut(PurpleSmiley * smiley, char * shortcut)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_set_shortcut in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * smiley).
+		 */
 
 		/*
 		 * char * purple_smiley_get_shortcut(PurpleSmiley * smiley)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_get_shortcut in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * smiley).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_smiley_get_shortcut(IntPtr smiley);
 
-		public static string GetShortcut(PurpleSmiley smiley)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_smiley_get_checksum(PurpleSmiley * smiley)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_get_checksum in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * smiley).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_smiley_get_checksum(IntPtr smiley);
 
-		public static string GetChecksum(PurpleSmiley smiley)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleStoredImage * purple_smiley_get_stored_image(PurpleSmiley * smiley)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_get_stored_image in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleStoredImage * purple_smiley_get_stored_image(PurpleSmiley * smiley)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_smiley_get_stored_image(IntPtr smiley);
 
-		public static PurpleStoredImage GetStoredImage(PurpleSmiley smiley)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gconstpointer purple_smiley_get_data(PurpleSmiley * smiley, size_t * len)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_get_data in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * smiley).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_smiley_get_data(IntPtr smiley, IntPtr len);
 
-		public static gconstpointer GetData(PurpleSmiley smiley, size_t len)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * char * purple_smiley_get_extension(PurpleSmiley * smiley)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_get_extension in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * smiley).
+		 */
 
 		/*
-		 * char * purple_smiley_get_extension(PurpleSmiley * smiley)
+		 * char * purple_smiley_get_full_path(PurpleSmiley * smiley)
+		 * 
+		 * Could not generate a wrapper for purple_smiley_get_full_path in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * smiley).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_smiley_get_extension(IntPtr smiley);
 
-		public static string GetExtension(PurpleSmiley smiley)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * GList * purple_smileys_get_all()
+		 * 
+		 * Could not generate a wrapper for purple_smileys_get_all in file "smiley.h".
+		 * Message: The type could not be resolved (GList * purple_smileys_get_all()).
+		 */
 
 		/*
-		 * char * purple_smiley_get_full_path(PurpleSmiley * smiley)
+		 * PurpleSmiley * purple_smileys_find_by_shortcut(char * shortcut)
+		 * 
+		 * Could not generate a wrapper for purple_smileys_find_by_shortcut in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * purple_smileys_find_by_shortcut(char * shortcut)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_smiley_get_full_path(IntPtr smiley);
 
-		public static string GetFullPath(PurpleSmiley smiley)
-		{
-			throw new NotImplementedException();
-		}
+		/*
+		 * PurpleSmiley * purple_smileys_find_by_checksum(char * checksum)
+		 * 
+		 * Could not generate a wrapper for purple_smileys_find_by_checksum in file "smiley.h".
+		 * Message: The type could not be resolved (PurpleSmiley * purple_smileys_find_by_checksum(char * checksum)).
+		 */
 
 		/*
 		 * char * purple_smileys_get_storing_dir()
@@ -156,7 +151,7 @@ namespace PurpleWrapper
 
 		public static string SmileysGetStoringDir()
 		{
-			throw new NotImplementedException();
+			return purple_smileys_get_storing_dir();
 		}
 
 		/*
@@ -167,7 +162,7 @@ namespace PurpleWrapper
 
 		public static void SmileysInit()
 		{
-			throw new NotImplementedException();
+			purple_smileys_init();
 		}
 
 		/*
@@ -178,7 +173,7 @@ namespace PurpleWrapper
 
 		public static void SmileysUninit()
 		{
-			throw new NotImplementedException();
+			purple_smileys_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Sound.cs	d6a62cb1846c649def2c5d80628c1c7344d9d49e
+++ libpurple/wrapper/Sound.cs	fa43998974f9d9ee26240f02274f60d4589bfc6e
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,6 +40,22 @@ namespace PurpleWrapper
 {
 	public class Sound
 	{
+		public enum PurpleSoundEventID
+		{
+			PURPLE_SOUND_BUDDY_ARRIVE = 0,
+			PURPLE_SOUND_BUDDY_LEAVE,
+			PURPLE_SOUND_RECEIVE,
+			PURPLE_SOUND_FIRST_RECEIVE,
+			PURPLE_SOUND_SEND,
+			PURPLE_SOUND_CHAT_JOIN,
+			PURPLE_SOUND_CHAT_LEAVE,
+			PURPLE_SOUND_CHAT_YOU_SAY,
+			PURPLE_SOUND_CHAT_SAY,
+			PURPLE_SOUND_POUNCE_DEFAULT,
+			PURPLE_SOUND_CHAT_NICK,
+			PURPLE_NUM_SOUNDS
+		};
+
 		/*
 		 * void purple_sound_play_file(char * filename, PurpleAccount * account)
 		 */
@@ -46,17 +64,18 @@ namespace PurpleWrapper
 
 		public static void PlayFile(string filename, PurpleAccount account)
 		{
-			throw new NotImplementedException();
+			purple_sound_play_file(filename, account.Reference);
 		}
 
 		/*
 		 * void purple_sound_play_event(PurpleSoundEventID event, PurpleAccount * account)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern void purple_sound_play_event(UNKNOWN event, IntPtr account);
+		private static extern void purple_sound_play_event(Sound.PurpleSoundEventID event_, IntPtr account);
 
-		public static void PlayEvent(PurpleSoundEventID event, PurpleAccount account)
+		public static void PlayEvent(Sound.PurpleSoundEventID event_, PurpleAccount account)
 		{
+			/* Unable to process event_, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
@@ -68,7 +87,7 @@ namespace PurpleWrapper
 
 		public static void SetUiOps(PurpleSoundUiOps ops)
 		{
-			throw new NotImplementedException();
+			purple_sound_set_ui_ops(ops.Reference);
 		}
 
 		/*
@@ -79,7 +98,7 @@ namespace PurpleWrapper
 
 		public static PurpleSoundUiOps GetUiOps()
 		{
-			throw new NotImplementedException();
+			return new PurpleSoundUiOps(purple_sound_get_ui_ops());
 		}
 
 		/*
@@ -90,7 +109,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_sound_init();
 		}
 
 		/*
@@ -101,7 +120,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_sound_uninit();
 		}
 
 		/*
@@ -112,7 +131,7 @@ namespace PurpleWrapper
 
 		public static IntPtr SoundsGetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_sounds_get_handle();
 		}
 
 	}
============================================================
--- libpurple/wrapper/SoundTheme.cs	97b59c04a2c2850d4b9ddce97d4009e4e6a9f618
+++ libpurple/wrapper/SoundTheme.cs	3957f860320482f3e6eb70d82104557537b69dab
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,46 +44,14 @@ namespace PurpleWrapper
 		 * GType purple_sound_theme_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_sound_theme_get_type();
+		private static extern IntPtr purple_sound_theme_get_type();
 
-		public static GType SoundThemeGetType()
+		public static /* libgobject */ IntPtr SoundThemeGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_sound_theme_get_type, a GObjectObject. */
+			
 		}
 
-		/*
-		 * gchar * purple_sound_theme_get_file(PurpleSoundTheme * theme, gchar * event)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_sound_theme_get_file(IntPtr theme, string event);
-
-		public static string SoundThemeGetFile(PurpleSoundTheme theme, string event)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gchar * purple_sound_theme_get_file_full(PurpleSoundTheme * theme, gchar * event)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_sound_theme_get_file_full(IntPtr theme, string event);
-
-		public static string SoundThemeGetFileFull(PurpleSoundTheme theme, string event)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_sound_theme_set_file(PurpleSoundTheme * theme, gchar * event, gchar * filename)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_sound_theme_set_file(IntPtr theme, string event, string filename);
-
-		public static void SoundThemeSetFile(PurpleSoundTheme theme, string event, string filename)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/SoundThemeLoader.cs	07073de018578231cf88e9577d33314cfd5518d0
+++ libpurple/wrapper/SoundThemeLoader.cs	8a97c3e0e6c3eb688f3d07fee2277f8918ede7f6
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,11 +44,12 @@ namespace PurpleWrapper
 		 * GType purple_sound_theme_loader_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_sound_theme_loader_get_type();
+		private static extern IntPtr purple_sound_theme_loader_get_type();
 
-		public static GType SoundThemeLoaderGetType()
+		public static /* libgobject */ IntPtr SoundThemeLoaderGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_sound_theme_loader_get_type, a GObjectObject. */
+			
 		}
 
 	}
============================================================
--- libpurple/wrapper/Sslconn.cs	c8f81f649e5b441d78df1c73354269b451ed2c61
+++ libpurple/wrapper/Sslconn.cs	c4b5dccf4a35227b4baa92c7f45452da502d2185
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,6 +40,13 @@ namespace PurpleWrapper
 {
 	public class Sslconn
 	{
+		public enum PurpleSslErrorType
+		{
+			PURPLE_SSL_HANDSHAKE_FAILED = 1,
+			PURPLE_SSL_CONNECT_FAILED = 2,
+			PURPLE_SSL_CERTIFICATE_INVALID = 3
+		};
+
 		/*
 		 * gboolean purple_ssl_is_supported()
 		 */
@@ -46,54 +55,22 @@ namespace PurpleWrapper
 
 		public static bool SslIsSupported()
 		{
-			throw new NotImplementedException();
+			return purple_ssl_is_supported();
 		}
 
 		/*
-		 * PurpleSslConnection * purple_ssl_connect(PurpleAccount * account, char * host, int port, PurpleSslInputFunction func, PurpleSslErrorFunction error_func, void * data)
+		 * gchar * purple_ssl_strerror(PurpleSslErrorType error)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ssl_connect(IntPtr account, string host, int port, UNKNOWN func, UNKNOWN error_func, IntPtr data);
+		private static extern string purple_ssl_strerror(Sslconn.PurpleSslErrorType error);
 
-		public static PurpleSslConnection SslConnect(PurpleAccount account, string host, int port, PurpleSslInputFunction func, PurpleSslErrorFunction error_func, IntPtr data)
+		public static string SslStrerror(Sslconn.PurpleSslErrorType error)
 		{
+			/* Unable to process error, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * PurpleSslConnection * purple_ssl_connect_fd(PurpleAccount * account, int fd, PurpleSslInputFunction func, PurpleSslErrorFunction error_func, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ssl_connect_fd(IntPtr account, int fd, UNKNOWN func, UNKNOWN error_func, IntPtr data);
-
-		public static PurpleSslConnection SslConnectFd(PurpleAccount account, int fd, PurpleSslInputFunction func, PurpleSslErrorFunction error_func, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleSslConnection * purple_ssl_connect_with_host_fd(PurpleAccount * account, int fd, PurpleSslInputFunction func, PurpleSslErrorFunction error_func, char * host, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ssl_connect_with_host_fd(IntPtr account, int fd, UNKNOWN func, UNKNOWN error_func, string host, IntPtr data);
-
-		public static PurpleSslConnection SslConnectWithHostFd(PurpleAccount account, int fd, PurpleSslInputFunction func, PurpleSslErrorFunction error_func, string host, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_ssl_input_add(PurpleSslConnection * gsc, PurpleSslInputFunction func, void * data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_ssl_input_add(IntPtr gsc, UNKNOWN func, IntPtr data);
-
-		public static void SslInputAdd(PurpleSslConnection gsc, PurpleSslInputFunction func, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_ssl_close(PurpleSslConnection * gsc)
 		 */
 		[DllImport("libpurple.dll")]
@@ -101,53 +78,52 @@ namespace PurpleWrapper
 
 		public static void SslClose(PurpleSslConnection gsc)
 		{
-			throw new NotImplementedException();
+			purple_ssl_close(gsc.Reference);
 		}
 
 		/*
 		 * size_t purple_ssl_read(PurpleSslConnection * gsc, void * buffer, size_t len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_ssl_read(IntPtr gsc, IntPtr buffer, UNKNOWN len);
+		private static extern ulong purple_ssl_read(IntPtr gsc, IntPtr buffer, ulong len);
 
-		public static size_t SslRead(PurpleSslConnection gsc, IntPtr buffer, size_t len)
+		public static ulong SslRead(PurpleSslConnection gsc, IntPtr buffer, ulong len)
 		{
-			throw new NotImplementedException();
+			return purple_ssl_read(gsc.Reference, buffer, len);
 		}
 
 		/*
 		 * size_t purple_ssl_write(PurpleSslConnection * gsc, void * buffer, size_t len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_ssl_write(IntPtr gsc, IntPtr buffer, UNKNOWN len);
+		private static extern ulong purple_ssl_write(IntPtr gsc, IntPtr buffer, ulong len);
 
-		public static size_t SslWrite(PurpleSslConnection gsc, IntPtr buffer, size_t len)
+		public static ulong SslWrite(PurpleSslConnection gsc, IntPtr buffer, ulong len)
 		{
-			throw new NotImplementedException();
+			return purple_ssl_write(gsc.Reference, buffer, len);
 		}
 
 		/*
+		 * GList * purple_ssl_get_peer_certificates(PurpleSslConnection * gsc)
+		 * 
+		 * Could not generate a wrapper for purple_ssl_get_peer_certificates in file "sslconn.h".
+		 * Message: The type could not be resolved (GList * purple_ssl_get_peer_certificates(PurpleSslConnection * gsc)).
+		 */
+
+		/*
 		 * void purple_ssl_set_ops(PurpleSslOps * ops)
+		 * 
+		 * Could not generate a wrapper for purple_ssl_set_ops in file "sslconn.h".
+		 * Message: The type could not be resolved (PurpleSslOps * ops).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_ssl_set_ops(IntPtr ops);
 
-		public static void SslSetOps(PurpleSslOps ops)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleSslOps * purple_ssl_get_ops()
+		 * 
+		 * Could not generate a wrapper for purple_ssl_get_ops in file "sslconn.h".
+		 * Message: The type could not be resolved (PurpleSslOps * purple_ssl_get_ops()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_ssl_get_ops();
 
-		public static PurpleSslOps SslGetOps()
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_ssl_init()
 		 */
@@ -156,7 +132,7 @@ namespace PurpleWrapper
 
 		public static void SslInit()
 		{
-			throw new NotImplementedException();
+			purple_ssl_init();
 		}
 
 		/*
@@ -167,7 +143,7 @@ namespace PurpleWrapper
 
 		public static void SslUninit()
 		{
-			throw new NotImplementedException();
+			purple_ssl_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Status.cs	a78b9598f49b5f628422ce46f731c49b49c09506
+++ libpurple/wrapper/Status.cs	7d1db66c7a91adbc6778764b608324909d728a02
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,854 +40,394 @@ namespace PurpleWrapper
 {
 	public class Status
 	{
-		/*
-		 * char * purple_primitive_get_id_from_type(PurpleStatusPrimitive type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_primitive_get_id_from_type(UNKNOWN type);
-
-		public static string PrimitiveGetIdFromType(PurpleStatusPrimitive type)
+		public enum PurplePresenceContext
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_PRESENCE_CONTEXT_UNSET = 0,
+			PURPLE_PRESENCE_CONTEXT_ACCOUNT,
+			PURPLE_PRESENCE_CONTEXT_CONV,
+			PURPLE_PRESENCE_CONTEXT_BUDDY
+		};
 
-		/*
-		 * char * purple_primitive_get_name_from_type(PurpleStatusPrimitive type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_primitive_get_name_from_type(UNKNOWN type);
-
-		public static string PrimitiveGetNameFromType(PurpleStatusPrimitive type)
+		public enum PurpleStatusPrimitive
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_STATUS_UNSET = 0,
+			PURPLE_STATUS_OFFLINE,
+			PURPLE_STATUS_AVAILABLE,
+			PURPLE_STATUS_UNAVAILABLE,
+			PURPLE_STATUS_INVISIBLE,
+			PURPLE_STATUS_AWAY,
+			PURPLE_STATUS_EXTENDED_AWAY,
+			PURPLE_STATUS_MOBILE,
+			PURPLE_STATUS_TUNE,
+			PURPLE_STATUS_NUM_PRIMITIVES
+		};
 
 		/*
-		 * PurpleStatusPrimitive purple_primitive_get_type_from_id(char * id)
+		 * char * purple_primitive_get_id_from_type(PurpleStatusPrimitive type)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_primitive_get_type_from_id(string id);
+		private static extern string purple_primitive_get_id_from_type(Status.PurpleStatusPrimitive type);
 
-		public static PurpleStatusPrimitive PrimitiveGetTypeFromId(string id)
+		public static string PrimitiveGetIdFromType(Status.PurpleStatusPrimitive type)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * PurpleStatusType * purple_status_type_new_full(PurpleStatusPrimitive primitive, char * id, char * name, gboolean saveable, gboolean user_settable, gboolean independent)
+		 * char * purple_primitive_get_name_from_type(PurpleStatusPrimitive type)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_type_new_full(UNKNOWN primitive, string id, string name, bool saveable, bool user_settable, bool independent);
+		private static extern string purple_primitive_get_name_from_type(Status.PurpleStatusPrimitive type);
 
-		public static PurpleStatusType TypeNewFull(PurpleStatusPrimitive primitive, string id, string name, bool saveable, bool user_settable, bool independent)
+		public static string PrimitiveGetNameFromType(Status.PurpleStatusPrimitive type)
 		{
+			/* Unable to process type, a KnownEnum. */
 			throw new NotImplementedException();
 		}
 
 		/*
-		 * PurpleStatusType * purple_status_type_new(PurpleStatusPrimitive primitive, char * id, char * name, gboolean user_settable)
+		 * PurpleStatusPrimitive purple_primitive_get_type_from_id(char * id)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_type_new(UNKNOWN primitive, string id, string name, bool user_settable);
+		private static extern Status.PurpleStatusPrimitive purple_primitive_get_type_from_id(string id);
 
-		public static PurpleStatusType TypeNew(PurpleStatusPrimitive primitive, string id, string name, bool user_settable)
+		public static Status.PurpleStatusPrimitive PrimitiveGetTypeFromId(string id)
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_primitive_get_type_from_id, a KnownEnum. */
+			
 		}
 
 		/*
-		 * PurpleStatusType * purple_status_type_new_with_attrs(PurpleStatusPrimitive primitive, char * id, char * name, gboolean saveable, gboolean user_settable, gboolean independent, char * attr_id, char * attr_name, PurpleValue * attr_value, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_type_new_with_attrs(UNKNOWN primitive, string id, string name, bool saveable, bool user_settable, bool independent, string attr_id, string attr_name, IntPtr attr_value, ...);
-
-		public static PurpleStatusType TypeNewWithAttrs(PurpleStatusPrimitive primitive, string id, string name, bool saveable, bool user_settable, bool independent, string attr_id, string attr_name, PurpleValue attr_value, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_status_type_destroy(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_destroy in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_type_destroy(IntPtr status_type);
 
-		public static void TypeDestroy(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_status_type_set_primary_attr(PurpleStatusType * status_type, char * attr_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_type_set_primary_attr(IntPtr status_type, string attr_id);
-
-		public static void TypeSetPrimaryAttr(PurpleStatusType status_type, string attr_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_status_type_add_attr(PurpleStatusType * status_type, char * id, char * name, PurpleValue * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_type_add_attr(IntPtr status_type, string id, string name, IntPtr value);
-
-		public static void TypeAddAttr(PurpleStatusType status_type, string id, string name, PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_status_type_add_attrs(PurpleStatusType * status_type, char * id, char * name, PurpleValue * value, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_type_add_attrs(IntPtr status_type, string id, string name, IntPtr value, ...);
-
-		public static void TypeAddAttrs(PurpleStatusType status_type, string id, string name, PurpleValue value, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_status_type_add_attrs_vargs(PurpleStatusType * status_type, va_list args)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_type_add_attrs_vargs(IntPtr status_type, UNKNOWN args);
-
-		public static void TypeAddAttrsVargs(PurpleStatusType status_type, va_list args)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleStatusPrimitive purple_status_type_get_primitive(PurpleStatusType * status_type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_status_type_get_primitive(IntPtr status_type);
-
-		public static PurpleStatusPrimitive TypeGetPrimitive(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_status_type_get_id(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_get_id in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_type_get_id(IntPtr status_type);
 
-		public static string TypeGetId(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_status_type_get_name(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_get_name in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_type_get_name(IntPtr status_type);
 
-		public static string TypeGetName(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_type_is_saveable(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_is_saveable in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_type_is_saveable(IntPtr status_type);
 
-		public static bool TypeIsSaveable(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_type_is_user_settable(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_is_user_settable in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_type_is_user_settable(IntPtr status_type);
 
-		public static bool TypeIsUserSettable(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_type_is_independent(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_is_independent in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_type_is_independent(IntPtr status_type);
 
-		public static bool TypeIsIndependent(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_type_is_exclusive(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_is_exclusive in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_type_is_exclusive(IntPtr status_type);
 
-		public static bool TypeIsExclusive(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_type_is_available(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_is_available in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * status_type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_type_is_available(IntPtr status_type);
 
-		public static bool TypeIsAvailable(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_status_type_get_primary_attr(PurpleStatusType * type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_get_primary_attr in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * type).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_type_get_primary_attr(IntPtr type);
 
-		public static string TypeGetPrimaryAttr(PurpleStatusType type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleStatusAttr * purple_status_type_get_attr(PurpleStatusType * status_type, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_type_get_attr(IntPtr status_type, string id);
-
-		public static PurpleStatusAttr TypeGetAttr(PurpleStatusType status_type, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * GList * purple_status_type_get_attrs(PurpleStatusType * status_type)
+		 * 
+		 * Could not generate a wrapper for purple_status_type_get_attrs in file "status.h".
+		 * Message: The type could not be resolved (GList * purple_status_type_get_attrs(PurpleStatusType * status_type)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_type_get_attrs(IntPtr status_type);
 
-		public static GList TypeGetAttrs(PurpleStatusType status_type)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleStatusType * purple_status_type_find_with_id(GList * status_types, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_type_find_with_id(IntPtr status_types, string id);
-
-		public static PurpleStatusType TypeFindWithId(GList status_types, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleStatusAttr * purple_status_attr_new(char * id, char * name, PurpleValue * value_type)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_attr_new(string id, string name, IntPtr value_type);
-
-		public static PurpleStatusAttr AttrNew(string id, string name, PurpleValue value_type)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_status_attr_destroy(PurpleStatusAttr * attr)
+		 * 
+		 * Could not generate a wrapper for purple_status_attr_destroy in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusAttr * attr).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_attr_destroy(IntPtr attr);
 
-		public static void AttrDestroy(PurpleStatusAttr attr)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_status_attr_get_id(PurpleStatusAttr * attr)
+		 * 
+		 * Could not generate a wrapper for purple_status_attr_get_id in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusAttr * attr).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_attr_get_id(IntPtr attr);
 
-		public static string AttrGetId(PurpleStatusAttr attr)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_status_attr_get_name(PurpleStatusAttr * attr)
+		 * 
+		 * Could not generate a wrapper for purple_status_attr_get_name in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusAttr * attr).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_attr_get_name(IntPtr attr);
 
-		public static string AttrGetName(PurpleStatusAttr attr)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleValue * purple_status_attr_get_value(PurpleStatusAttr * attr)
+		 * 
+		 * Could not generate a wrapper for purple_status_attr_get_value in file "status.h".
+		 * Message: The type could not be resolved (PurpleValue * purple_status_attr_get_value(PurpleStatusAttr * attr)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_attr_get_value(IntPtr attr);
 
-		public static PurpleValue AttrGetValue(PurpleStatusAttr attr)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleStatus * purple_status_new(PurpleStatusType * status_type, PurplePresence * presence)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_new(IntPtr status_type, IntPtr presence);
-
-		public static PurpleStatus New(PurpleStatusType status_type, PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_status_destroy(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_destroy in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_destroy(IntPtr status);
 
-		public static void Destroy(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_status_set_active(PurpleStatus * status, gboolean active)
+		 * 
+		 * Could not generate a wrapper for purple_status_set_active in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_set_active(IntPtr status, bool active);
 
-		public static void SetActive(PurpleStatus status, bool active)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_status_set_active_with_attrs(PurpleStatus * status, gboolean active, va_list args)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_set_active_with_attrs(IntPtr status, bool active, UNKNOWN args);
-
-		public static void SetActiveWithAttrs(PurpleStatus status, bool active, va_list args)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_status_set_active_with_attrs_list(PurpleStatus * status, gboolean active, GList * attrs)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_set_active_with_attrs_list(IntPtr status, bool active, IntPtr attrs);
-
-		public static void SetActiveWithAttrsList(PurpleStatus status, bool active, GList attrs)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_status_set_attr_boolean(PurpleStatus * status, char * id, gboolean value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_set_attr_boolean(IntPtr status, string id, bool value);
-
-		public static void SetAttrBoolean(PurpleStatus status, string id, bool value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_status_set_attr_int(PurpleStatus * status, char * id, int value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_set_attr_int(IntPtr status, string id, int value);
-
-		public static void SetAttrInt(PurpleStatus status, string id, int value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_status_set_attr_string(PurpleStatus * status, char * id, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_status_set_attr_string(IntPtr status, string id, string value);
-
-		public static void SetAttrString(PurpleStatus status, string id, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleStatusType * purple_status_get_type(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_get_type in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatusType * purple_status_get_type(PurpleStatus * status)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_get_type(IntPtr status);
 
-		public static PurpleStatusType GetType(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePresence * purple_status_get_presence(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_get_presence in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * purple_status_get_presence(PurpleStatus * status)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_get_presence(IntPtr status);
 
-		public static PurplePresence GetPresence(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_status_get_id(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_get_id in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_get_id(IntPtr status);
 
-		public static string GetId(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_status_get_name(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_get_name in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_get_name(IntPtr status);
 
-		public static string GetName(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_is_independent(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_is_independent in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_is_independent(IntPtr status);
 
-		public static bool IsIndependent(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_is_exclusive(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_is_exclusive in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_is_exclusive(IntPtr status);
 
-		public static bool IsExclusive(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_is_available(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_is_available in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_is_available(IntPtr status);
 
-		public static bool IsAvailable(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_is_active(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_is_active in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_is_active(IntPtr status);
 
-		public static bool IsActive(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_status_is_online(PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_status_is_online in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_is_online(IntPtr status);
 
-		public static bool IsOnline(PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleValue * purple_status_get_attr_value(PurpleStatus * status, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_status_get_attr_value(IntPtr status, string id);
-
-		public static PurpleValue GetAttrValue(PurpleStatus status, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_status_get_attr_boolean(PurpleStatus * status, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_status_get_attr_boolean(IntPtr status, string id);
-
-		public static bool GetAttrBoolean(PurpleStatus status, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * int purple_status_get_attr_int(PurpleStatus * status, char * id)
+		 * 
+		 * Could not generate a wrapper for purple_status_get_attr_int in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_status_get_attr_int(IntPtr status, string id);
 
-		public static int GetAttrInt(PurpleStatus status, string id)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char * purple_status_get_attr_string(PurpleStatus * status, char * id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_status_get_attr_string(IntPtr status, string id);
-
-		public static string GetAttrString(PurpleStatus status, string id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gint purple_status_compare(PurpleStatus * status1, PurpleStatus * status2)
+		 * 
+		 * Could not generate a wrapper for purple_status_compare in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * status1).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_status_compare(IntPtr status1, IntPtr status2);
 
-		public static int Compare(PurpleStatus status1, PurpleStatus status2)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePresence * purple_presence_new(PurplePresenceContext context)
+		 * 
+		 * Could not generate a wrapper for purple_presence_new in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * purple_presence_new(PurplePresenceContext context)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_new(UNKNOWN context);
 
-		public static PurplePresence PresenceNew(PurplePresenceContext context)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePresence * purple_presence_new_for_account(PurpleAccount * account)
+		 * 
+		 * Could not generate a wrapper for purple_presence_new_for_account in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * purple_presence_new_for_account(PurpleAccount * account)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_new_for_account(IntPtr account);
 
-		public static PurplePresence PresenceNewForAccount(PurpleAccount account)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePresence * purple_presence_new_for_conv(PurpleConversation * conv)
+		 * 
+		 * Could not generate a wrapper for purple_presence_new_for_conv in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * purple_presence_new_for_conv(PurpleConversation * conv)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_new_for_conv(IntPtr conv);
 
-		public static PurplePresence PresenceNewForConv(PurpleConversation conv)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePresence * purple_presence_new_for_buddy(PurpleBuddy * buddy)
+		 * 
+		 * Could not generate a wrapper for purple_presence_new_for_buddy in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * purple_presence_new_for_buddy(PurpleBuddy * buddy)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_new_for_buddy(IntPtr buddy);
 
-		public static PurplePresence PresenceNewForBuddy(PurpleBuddy buddy)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_presence_destroy(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_destroy in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_presence_destroy(IntPtr presence);
 
-		public static void PresenceDestroy(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_presence_add_status(PurplePresence * presence, PurpleStatus * status)
+		 * 
+		 * Could not generate a wrapper for purple_presence_add_status in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_presence_add_status(IntPtr presence, IntPtr status);
 
-		public static void PresenceAddStatus(PurplePresence presence, PurpleStatus status)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_presence_add_list(PurplePresence * presence, GList * source_list)
+		 * 
+		 * Could not generate a wrapper for purple_presence_add_list in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_presence_add_list(IntPtr presence, IntPtr source_list);
 
-		public static void PresenceAddList(PurplePresence presence, GList source_list)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_presence_set_status_active(PurplePresence * presence, char * status_id, gboolean active)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_presence_set_status_active(IntPtr presence, string status_id, bool active);
-
-		public static void PresenceSetStatusActive(PurplePresence presence, string status_id, bool active)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_presence_switch_status(PurplePresence * presence, char * status_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_presence_switch_status(IntPtr presence, string status_id);
-
-		public static void PresenceSwitchStatus(PurplePresence presence, string status_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_presence_set_idle(PurplePresence * presence, gboolean idle, time_t idle_time)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_presence_set_idle(IntPtr presence, bool idle, UNKNOWN idle_time);
-
-		public static void PresenceSetIdle(PurplePresence presence, bool idle, time_t idle_time)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_presence_set_login_time(PurplePresence * presence, time_t login_time)
+		 * 
+		 * Could not generate a wrapper for purple_presence_set_login_time in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_presence_set_login_time(IntPtr presence, UNKNOWN login_time);
 
-		public static void PresenceSetLoginTime(PurplePresence presence, time_t login_time)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurplePresenceContext purple_presence_get_context(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_context in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_presence_get_context(IntPtr presence);
 
-		public static PurplePresenceContext PresenceGetContext(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleAccount * purple_presence_get_account(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_account in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_get_account(IntPtr presence);
 
-		public static PurpleAccount PresenceGetAccount(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleConversation * purple_presence_get_conversation(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_conversation in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_get_conversation(IntPtr presence);
 
-		public static PurpleConversation PresenceGetConversation(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_presence_get_chat_user(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_chat_user in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_presence_get_chat_user(IntPtr presence);
 
-		public static string PresenceGetChatUser(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleBuddy * purple_presence_get_buddy(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_buddy in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_get_buddy(IntPtr presence);
 
-		public static PurpleBuddy PresenceGetBuddy(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_presence_get_statuses(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_statuses in file "status.h".
+		 * Message: The type could not be resolved (GList * purple_presence_get_statuses(PurplePresence * presence)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_get_statuses(IntPtr presence);
 
-		public static GList PresenceGetStatuses(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleStatus * purple_presence_get_status(PurplePresence * presence, char * status_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_get_status(IntPtr presence, string status_id);
-
-		public static PurpleStatus PresenceGetStatus(PurplePresence presence, string status_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleStatus * purple_presence_get_active_status(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_active_status in file "status.h".
+		 * Message: The type could not be resolved (PurpleStatus * purple_presence_get_active_status(PurplePresence * presence)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_presence_get_active_status(IntPtr presence);
 
-		public static PurpleStatus PresenceGetActiveStatus(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_presence_is_available(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_is_available in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_presence_is_available(IntPtr presence);
 
-		public static bool PresenceIsAvailable(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_presence_is_online(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_is_online in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_presence_is_online(IntPtr presence);
 
-		public static bool PresenceIsOnline(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gboolean purple_presence_is_status_active(PurplePresence * presence, char * status_id)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_presence_is_status_active(IntPtr presence, string status_id);
-
-		public static bool PresenceIsStatusActive(PurplePresence presence, string status_id)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_presence_is_status_primitive_active(PurplePresence * presence, PurpleStatusPrimitive primitive)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_presence_is_status_primitive_active(IntPtr presence, UNKNOWN primitive);
-
-		public static bool PresenceIsStatusPrimitiveActive(PurplePresence presence, PurpleStatusPrimitive primitive)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_presence_is_idle(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_is_idle in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_presence_is_idle(IntPtr presence);
 
-		public static bool PresenceIsIdle(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * time_t purple_presence_get_idle_time(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_idle_time in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_presence_get_idle_time(IntPtr presence);
 
-		public static time_t PresenceGetIdleTime(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * time_t purple_presence_get_login_time(PurplePresence * presence)
+		 * 
+		 * Could not generate a wrapper for purple_presence_get_login_time in file "status.h".
+		 * Message: The type could not be resolved (PurplePresence * presence).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_presence_get_login_time(IntPtr presence);
 
-		public static time_t PresenceGetLoginTime(PurplePresence presence)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * gint purple_presence_compare(PurplePresence * presence1, PurplePresence * presence2)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_presence_compare(IntPtr presence1, IntPtr presence2);
-
-		public static int PresenceCompare(PurplePresence presence1, PurplePresence presence2)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void * purple_status_get_handle()
 		 */
 		[DllImport("libpurple.dll")]
@@ -893,7 +435,7 @@ namespace PurpleWrapper
 
 		public static IntPtr GetHandle()
 		{
-			throw new NotImplementedException();
+			return purple_status_get_handle();
 		}
 
 		/*
@@ -904,7 +446,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_status_init();
 		}
 
 		/*
@@ -915,7 +457,7 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_status_uninit();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Stringref.cs	cb8fae5638d0f19730bdf5f89c13b5f0ffa858eb
+++ libpurple/wrapper/Stringref.cs	aa32798ef4bfffa034260b6fcf0805a2b154ed7a
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -40,92 +42,53 @@ namespace PurpleWrapper
 	{
 		/*
 		 * PurpleStringref * purple_stringref_new(char * value)
+		 * 
+		 * Could not generate a wrapper for purple_stringref_new in file "stringref.h".
+		 * Message: The type could not be resolved (PurpleStringref * purple_stringref_new(char * value)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_stringref_new(string value);
 
-		public static PurpleStringref New(string value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleStringref * purple_stringref_new_noref(char * value)
+		 * 
+		 * Could not generate a wrapper for purple_stringref_new_noref in file "stringref.h".
+		 * Message: The type could not be resolved (PurpleStringref * purple_stringref_new_noref(char * value)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_stringref_new_noref(string value);
 
-		public static PurpleStringref NewNoref(string value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * PurpleStringref * purple_stringref_printf(char * format, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_stringref_printf(string format, ...);
-
-		public static PurpleStringref Printf(string format, ...)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * PurpleStringref * purple_stringref_ref(PurpleStringref * stringref)
+		 * 
+		 * Could not generate a wrapper for purple_stringref_ref in file "stringref.h".
+		 * Message: The type could not be resolved (PurpleStringref * purple_stringref_ref(PurpleStringref * stringref)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_stringref_ref(IntPtr stringref);
 
-		public static PurpleStringref Ref(PurpleStringref stringref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_stringref_unref(PurpleStringref * stringref)
+		 * 
+		 * Could not generate a wrapper for purple_stringref_unref in file "stringref.h".
+		 * Message: The type could not be resolved (PurpleStringref * stringref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_stringref_unref(IntPtr stringref);
 
-		public static void Unref(PurpleStringref stringref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_stringref_value(PurpleStringref * stringref)
+		 * 
+		 * Could not generate a wrapper for purple_stringref_value in file "stringref.h".
+		 * Message: The type could not be resolved (PurpleStringref * stringref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_stringref_value(IntPtr stringref);
 
-		public static string Value(PurpleStringref stringref)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * int purple_stringref_cmp(PurpleStringref * s1, PurpleStringref * s2)
+		 * 
+		 * Could not generate a wrapper for purple_stringref_cmp in file "stringref.h".
+		 * Message: The type could not be resolved (PurpleStringref * s1).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_stringref_cmp(IntPtr s1, IntPtr s2);
 
-		public static int Cmp(PurpleStringref s1, PurpleStringref s2)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * size_t purple_stringref_len(PurpleStringref * stringref)
+		 * 
+		 * Could not generate a wrapper for purple_stringref_len in file "stringref.h".
+		 * Message: The type could not be resolved (PurpleStringref * stringref).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_stringref_len(IntPtr stringref);
 
-		public static size_t Len(PurpleStringref stringref)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Stun.cs	823ec1061beb72e0731adc751d4a97c29a41024a
+++ libpurple/wrapper/Stun.cs	1f963b6276173a13231f55af09f7d34aa1067604
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,17 +40,31 @@ namespace PurpleWrapper
 {
 	public class Stun
 	{
+		public enum PurpleStunStatus
+		{
+			PURPLE_STUN_STATUS_UNDISCOVERED = -1,
+			PURPLE_STUN_STATUS_UNKNOWN,
+			PURPLE_STUN_STATUS_DISCOVERING,
+			PURPLE_STUN_STATUS_DISCOVERED
+		};
+
+		public enum PurpleStunNatType
+		{
+			PURPLE_STUN_NAT_TYPE_PUBLIC_IP,
+			PURPLE_STUN_NAT_TYPE_UNKNOWN_NAT,
+			PURPLE_STUN_NAT_TYPE_FULL_CONE,
+			PURPLE_STUN_NAT_TYPE_RESTRICTED_CONE,
+			PURPLE_STUN_NAT_TYPE_PORT_RESTRICTED_CONE,
+			PURPLE_STUN_NAT_TYPE_SYMMETRIC
+		};
+
 		/*
 		 * PurpleStunNatDiscovery * purple_stun_discover(StunCallback cb)
+		 * 
+		 * Could not generate a wrapper for purple_stun_discover in file "stun.h".
+		 * Message: The type could not be resolved (StunCallback cb).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_stun_discover(UNKNOWN cb);
 
-		public static PurpleStunNatDiscovery Discover(StunCallback cb)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_stun_init()
 		 */
@@ -57,7 +73,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_stun_init();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Theme.cs	a873f44078f3d2b5cf679a8a65eff307abb6fb29
+++ libpurple/wrapper/Theme.cs	73613b2b606ca83b313bcaad773dd278241b9fb5
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,11 +44,12 @@ namespace PurpleWrapper
 		 * GType purple_theme_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_theme_get_type();
+		private static extern IntPtr purple_theme_get_type();
 
-		public static GType GetType()
+		public static /* libgobject */ IntPtr GetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_theme_get_type, a GObjectObject. */
+			
 		}
 
 		/*
@@ -57,7 +60,7 @@ namespace PurpleWrapper
 
 		public static string GetName(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			return purple_theme_get_name(theme.Reference);
 		}
 
 		/*
@@ -68,7 +71,7 @@ namespace PurpleWrapper
 
 		public static void SetName(PurpleTheme theme, string name)
 		{
-			throw new NotImplementedException();
+			purple_theme_set_name(theme.Reference, name);
 		}
 
 		/*
@@ -79,7 +82,7 @@ namespace PurpleWrapper
 
 		public static string GetDescription(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			return purple_theme_get_description(theme.Reference);
 		}
 
 		/*
@@ -90,7 +93,7 @@ namespace PurpleWrapper
 
 		public static void SetDescription(PurpleTheme theme, string description)
 		{
-			throw new NotImplementedException();
+			purple_theme_set_description(theme.Reference, description);
 		}
 
 		/*
@@ -101,7 +104,7 @@ namespace PurpleWrapper
 
 		public static string GetAuthor(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			return purple_theme_get_author(theme.Reference);
 		}
 
 		/*
@@ -112,7 +115,7 @@ namespace PurpleWrapper
 
 		public static void SetAuthor(PurpleTheme theme, string author)
 		{
-			throw new NotImplementedException();
+			purple_theme_set_author(theme.Reference, author);
 		}
 
 		/*
@@ -123,7 +126,7 @@ namespace PurpleWrapper
 
 		public static string GetTypeString(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			return purple_theme_get_type_string(theme.Reference);
 		}
 
 		/*
@@ -134,7 +137,7 @@ namespace PurpleWrapper
 
 		public static string GetDir(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			return purple_theme_get_dir(theme.Reference);
 		}
 
 		/*
@@ -145,7 +148,7 @@ namespace PurpleWrapper
 
 		public static void SetDir(PurpleTheme theme, string dir)
 		{
-			throw new NotImplementedException();
+			purple_theme_set_dir(theme.Reference, dir);
 		}
 
 		/*
@@ -156,7 +159,7 @@ namespace PurpleWrapper
 
 		public static string GetImage(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			return purple_theme_get_image(theme.Reference);
 		}
 
 		/*
@@ -167,7 +170,7 @@ namespace PurpleWrapper
 
 		public static string GetImageFull(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			return purple_theme_get_image_full(theme.Reference);
 		}
 
 		/*
@@ -178,7 +181,7 @@ namespace PurpleWrapper
 
 		public static void SetImage(PurpleTheme theme, string img)
 		{
-			throw new NotImplementedException();
+			purple_theme_set_image(theme.Reference, img);
 		}
 
 	}
============================================================
--- libpurple/wrapper/ThemeLoader.cs	c14ce89a6a75a3a91bb1febb0f757979b55b1935
+++ libpurple/wrapper/ThemeLoader.cs	ae5e838d7d5305350afdeb2330bccbf3cdf2e1c6
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,11 +44,12 @@ namespace PurpleWrapper
 		 * GType purple_theme_loader_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_theme_loader_get_type();
+		private static extern IntPtr purple_theme_loader_get_type();
 
-		public static GType ThemeLoaderGetType()
+		public static /* libgobject */ IntPtr ThemeLoaderGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_theme_loader_get_type, a GObjectObject. */
+			
 		}
 
 		/*
@@ -57,7 +60,7 @@ namespace PurpleWrapper
 
 		public static string ThemeLoaderGetTypeString(PurpleThemeLoader self)
 		{
-			throw new NotImplementedException();
+			return purple_theme_loader_get_type_string(self.Reference);
 		}
 
 		/*
@@ -68,7 +71,7 @@ namespace PurpleWrapper
 
 		public static PurpleTheme ThemeLoaderBuild(PurpleThemeLoader loader, string dir)
 		{
-			throw new NotImplementedException();
+			return new PurpleTheme(purple_theme_loader_build(loader.Reference, dir));
 		}
 
 	}
============================================================
--- libpurple/wrapper/ThemeManager.cs	d66bc75c091f8a5b9a2746eddcf760a87648c593
+++ libpurple/wrapper/ThemeManager.cs	29beb83c3862cc1c0b4b904ec9ddc2dda0779300
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -42,11 +44,12 @@ namespace PurpleWrapper
 		 * GType purple_theme_manager_get_type()
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_theme_manager_get_type();
+		private static extern IntPtr purple_theme_manager_get_type();
 
-		public static GType ThemeManagerGetType()
+		public static /* libgobject */ IntPtr ThemeManagerGetType()
 		{
-			throw new NotImplementedException();
+			/* Unable to process purple_theme_manager_get_type, a GObjectObject. */
+			
 		}
 
 		/*
@@ -57,7 +60,7 @@ namespace PurpleWrapper
 
 		public static void ThemeManagerInit()
 		{
-			throw new NotImplementedException();
+			purple_theme_manager_init();
 		}
 
 		/*
@@ -68,7 +71,7 @@ namespace PurpleWrapper
 
 		public static void ThemeManagerUninit()
 		{
-			throw new NotImplementedException();
+			purple_theme_manager_uninit();
 		}
 
 		/*
@@ -79,7 +82,7 @@ namespace PurpleWrapper
 
 		public static void ThemeManagerRefresh()
 		{
-			throw new NotImplementedException();
+			purple_theme_manager_refresh();
 		}
 
 		/*
@@ -90,7 +93,7 @@ namespace PurpleWrapper
 
 		public static PurpleTheme ThemeManagerFindTheme(string name, string type)
 		{
-			throw new NotImplementedException();
+			return new PurpleTheme(purple_theme_manager_find_theme(name, type));
 		}
 
 		/*
@@ -101,7 +104,7 @@ namespace PurpleWrapper
 
 		public static void ThemeManagerAddTheme(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			purple_theme_manager_add_theme(theme.Reference);
 		}
 
 		/*
@@ -112,7 +115,7 @@ namespace PurpleWrapper
 
 		public static void ThemeManagerRemoveTheme(PurpleTheme theme)
 		{
-			throw new NotImplementedException();
+			purple_theme_manager_remove_theme(theme.Reference);
 		}
 
 		/*
@@ -123,7 +126,7 @@ namespace PurpleWrapper
 
 		public static void ThemeManagerRegisterType(PurpleThemeLoader loader)
 		{
-			throw new NotImplementedException();
+			purple_theme_manager_register_type(loader.Reference);
 		}
 
 		/*
@@ -134,20 +137,16 @@ namespace PurpleWrapper
 
 		public static void ThemeManagerUnregisterType(PurpleThemeLoader loader)
 		{
-			throw new NotImplementedException();
+			purple_theme_manager_unregister_type(loader.Reference);
 		}
 
 		/*
 		 * void purple_theme_manager_for_each_theme(PTFunc func)
+		 * 
+		 * Could not generate a wrapper for purple_theme_manager_for_each_theme in file "theme-manager.h".
+		 * Message: The type could not be resolved (PTFunc func).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_theme_manager_for_each_theme(UNKNOWN func);
 
-		public static void ThemeManagerForEachTheme(PTFunc func)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Upnp.cs	47f3b76061e6611a90a1bd54d8420a2aa2fa7129
+++ libpurple/wrapper/Upnp.cs	70f1d6323dd590b70dc8fe3ce44a9c57e3b439cd
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,53 +48,37 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_upnp_init();
 		}
 
 		/*
 		 * void purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data)
+		 * 
+		 * Could not generate a wrapper for purple_upnp_discover in file "upnp.h".
+		 * Message: The type could not be resolved (PurpleUPnPCallback cb).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_upnp_discover(UNKNOWN cb, IntPtr cb_data);
 
-		public static void Discover(PurpleUPnPCallback cb, IntPtr cb_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_upnp_cancel_port_mapping(UPnPMappingAddRemove * mapping_data)
+		 * PurpleUPnPControlInfo* purple_upnp_get_control_info()
+		 * 
+		 * Could not generate a wrapper for purple_upnp_get_control_info in file "upnp.h".
+		 * Message: The type could not be resolved (PurpleUPnPControlInfo* purple_upnp_get_control_info()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_upnp_cancel_port_mapping(IntPtr mapping_data);
 
-		public static void CancelPortMapping(UPnPMappingAddRemove mapping_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * UPnPMappingAddRemove * purple_upnp_set_port_mapping(unsigned short,  , PurpleUPnPCallback cb, gpointer cb_data)
+		 * gchar* purple_upnp_get_public_ip()
+		 * 
+		 * Could not generate a wrapper for purple_upnp_get_public_ip in file "upnp.h".
+		 * Message: The type could not be resolved (gchar* purple_upnp_get_public_ip()).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_upnp_set_port_mapping(UNKNOWN short, UNKNOWN , UNKNOWN cb, IntPtr cb_data);
 
-		public static UPnPMappingAddRemove SetPortMapping(unsigned short,  , PurpleUPnPCallback cb, IntPtr cb_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * UPnPMappingAddRemove * purple_upnp_remove_port_mapping(unsigned short,  , PurpleUPnPCallback cb, gpointer cb_data)
+		 * void purple_upnp_cancel_port_mapping(UPnPMappingAddRemove * mapping_data)
+		 * 
+		 * Could not generate a wrapper for purple_upnp_cancel_port_mapping in file "upnp.h".
+		 * Message: The type could not be resolved (UPnPMappingAddRemove * mapping_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_upnp_remove_port_mapping(UNKNOWN short, UNKNOWN , UNKNOWN cb, IntPtr cb_data);
 
-		public static UPnPMappingAddRemove RemovePortMapping(unsigned short,  , PurpleUPnPCallback cb, IntPtr cb_data)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Util.cs	376a59fd945abe66a83e00cdc2d152b2f97bd2bd
+++ libpurple/wrapper/Util.cs	c770d98b0f47a6a81d38cc20cd28553d9042688a
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -39,17 +41,6 @@ namespace PurpleWrapper
 	public class Util
 	{
 		/*
-		 * PurpleMenuAction * purple_menu_action_new(char * label, PurpleCallback callback, gpointer data, GList * children)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_menu_action_new(string label, UNKNOWN callback, IntPtr data, IntPtr children);
-
-		public static PurpleMenuAction MenuActionNew(string label, PurpleCallback callback, IntPtr data, GList children)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_menu_action_free(PurpleMenuAction * act)
 		 */
 		[DllImport("libpurple.dll")]
@@ -57,21 +48,10 @@ namespace PurpleWrapper
 
 		public static void MenuActionFree(PurpleMenuAction act)
 		{
-			throw new NotImplementedException();
+			purple_menu_action_free(act.Reference);
 		}
 
 		/*
-		 * void purple_util_set_current_song(char * title, char * artist, char * album)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_util_set_current_song(string title, string artist, string album);
-
-		public static void SetCurrentSong(string title, string artist, string album)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_util_init()
 		 */
 		[DllImport("libpurple.dll")]
@@ -79,7 +59,7 @@ namespace PurpleWrapper
 
 		public static void Init()
 		{
-			throw new NotImplementedException();
+			purple_util_init();
 		}
 
 		/*
@@ -90,75 +70,51 @@ namespace PurpleWrapper
 
 		public static void Uninit()
 		{
-			throw new NotImplementedException();
+			purple_util_uninit();
 		}
 
 		/*
 		 * gchar * purple_base16_encode(guchar * data, gsize len)
+		 * 
+		 * Could not generate a wrapper for purple_base16_encode in file "util.h".
+		 * Message: The type could not be resolved (guchar * data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_base16_encode(IntPtr data, UNKNOWN len);
 
-		public static string Base16Encode(guchar data, gsize len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guchar * purple_base16_decode(char * str, gsize * ret_len)
+		 * 
+		 * Could not generate a wrapper for purple_base16_decode in file "util.h".
+		 * Message: The type could not be resolved (guchar * purple_base16_decode(char * str, gsize * ret_len)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_base16_decode(string str, IntPtr ret_len);
 
-		public static guchar Base16Decode(string str, gsize ret_len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_base16_encode_chunked(guchar * data, gsize len)
+		 * 
+		 * Could not generate a wrapper for purple_base16_encode_chunked in file "util.h".
+		 * Message: The type could not be resolved (guchar * data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_base16_encode_chunked(IntPtr data, UNKNOWN len);
 
-		public static string Base16EncodeChunked(guchar data, gsize len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_base64_encode(guchar * data, gsize len)
+		 * 
+		 * Could not generate a wrapper for purple_base64_encode in file "util.h".
+		 * Message: The type could not be resolved (guchar * data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_base64_encode(IntPtr data, UNKNOWN len);
 
-		public static string Base64Encode(guchar data, gsize len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guchar * purple_base64_decode(char * str, gsize * ret_len)
+		 * 
+		 * Could not generate a wrapper for purple_base64_decode in file "util.h".
+		 * Message: The type could not be resolved (guchar * purple_base64_decode(char * str, gsize * ret_len)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_base64_decode(string str, IntPtr ret_len);
 
-		public static guchar Base64Decode(string str, gsize ret_len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guchar * purple_quotedp_decode(char * str, gsize * ret_len)
+		 * 
+		 * Could not generate a wrapper for purple_quotedp_decode in file "util.h".
+		 * Message: The type could not be resolved (guchar * purple_quotedp_decode(char * str, gsize * ret_len)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_quotedp_decode(string str, IntPtr ret_len);
 
-		public static guchar QuotedpDecode(string str, gsize ret_len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_mime_decode_field(char * str)
 		 */
@@ -167,131 +123,52 @@ namespace PurpleWrapper
 
 		public static string MimeDecodeField(string str)
 		{
-			throw new NotImplementedException();
+			return purple_mime_decode_field(str);
 		}
 
 		/*
 		 * char * purple_utf8_strftime(char * format, struct tm)
+		 * 
+		 * Could not generate a wrapper for purple_utf8_strftime in file "util.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_utf8_strftime(string format, UNKNOWN tm);
 
-		public static string Utf8Strftime(string format, struct tm)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_get_tzoff_str(struct tm, gboolean iso)
+		 * 
+		 * Could not generate a wrapper for purple_get_tzoff_str in file "util.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_get_tzoff_str(UNKNOWN tm, bool iso);
 
-		public static string GetTzoffStr(struct tm, bool iso)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_date_format_short(struct tm)
+		 * 
+		 * Could not generate a wrapper for purple_date_format_short in file "util.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_date_format_short(UNKNOWN tm);
 
-		public static string DateFormatShort(struct tm)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_date_format_long(struct tm)
+		 * 
+		 * Could not generate a wrapper for purple_date_format_long in file "util.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_date_format_long(UNKNOWN tm);
 
-		public static string DateFormatLong(struct tm)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_date_format_full(struct tm)
+		 * 
+		 * Could not generate a wrapper for purple_date_format_full in file "util.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_date_format_full(UNKNOWN tm);
 
-		public static string DateFormatFull(struct tm)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_time_format(struct tm)
+		 * 
+		 * Could not generate a wrapper for purple_time_format in file "util.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_time_format(UNKNOWN tm);
 
-		public static string TimeFormat(struct tm)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * time_t purple_time_build(int year, int month, int day, int hour, int min, int sec)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_time_build(int year, int month, int day, int hour, int min, int sec);
-
-		public static time_t TimeBuild(int year, int month, int day, int hour, int min, int sec)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * time_t purple_str_to_time(char * timestamp, gboolean utc, struct tm, long * tz_off, char ** rest)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_str_to_time(string timestamp, bool utc, UNKNOWN tm, IntPtr tz_off, IntPtr rest);
-
-		public static time_t StrToTime(string timestamp, bool utc, struct tm, long tz_off, char rest)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_markup_find_tag(char * needle, char * haystack, char ** start, char ** end, GData ** attributes)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_markup_find_tag(string needle, string haystack, IntPtr start, IntPtr end, IntPtr attributes);
-
-		public static bool MarkupFindTag(string needle, string haystack, char start, char end, GData attributes)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gboolean purple_markup_extract_info_field(char * str, int len, PurpleNotifyUserInfo * user_info, char * start_token, int skip, char * end_token, char check_value, char * no_value_token, char * display_name, gboolean is_link, char * link_prefix, PurpleInfoFieldFormatCallback format_cb)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_markup_extract_info_field(string str, int len, IntPtr user_info, string start_token, int skip, string end_token, char check_value, string no_value_token, string display_name, bool is_link, string link_prefix, UNKNOWN format_cb);
-
-		public static bool MarkupExtractInfoField(string str, int len, PurpleNotifyUserInfo user_info, string start_token, int skip, string end_token, char check_value, string no_value_token, string display_name, bool is_link, string link_prefix, PurpleInfoFieldFormatCallback format_cb)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void purple_markup_html_to_xhtml(char * html, char ** dest_xhtml, char ** dest_plain)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_markup_html_to_xhtml(string html, IntPtr dest_xhtml, IntPtr dest_plain);
-
-		public static void MarkupHtmlToXhtml(string html, char dest_xhtml, char dest_plain)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_markup_strip_html(char * str)
 		 */
 		[DllImport("libpurple.dll")]
@@ -299,7 +176,7 @@ namespace PurpleWrapper
 
 		public static string MarkupStripHtml(string str)
 		{
-			throw new NotImplementedException();
+			return purple_markup_strip_html(str);
 		}
 
 		/*
@@ -310,7 +187,7 @@ namespace PurpleWrapper
 
 		public static string MarkupLinkify(string str)
 		{
-			throw new NotImplementedException();
+			return purple_markup_linkify(str);
 		}
 
 		/*
@@ -321,7 +198,7 @@ namespace PurpleWrapper
 
 		public static string UnescapeHtml(string html)
 		{
-			throw new NotImplementedException();
+			return purple_unescape_html(html);
 		}
 
 		/*
@@ -332,7 +209,7 @@ namespace PurpleWrapper
 
 		public static string MarkupSlice(string str, uint x, uint y)
 		{
-			throw new NotImplementedException();
+			return purple_markup_slice(str, x, y);
 		}
 
 		/*
@@ -343,10 +220,28 @@ namespace PurpleWrapper
 
 		public static string MarkupGetTagName(string tag)
 		{
-			throw new NotImplementedException();
+			return purple_markup_get_tag_name(tag);
 		}
 
 		/*
+		 * char * purple_markup_unescape_entity(char * text, int * length)
+		 * 
+		 * Could not generate a wrapper for purple_markup_unescape_entity in file "util.h".
+		 * Message: The type could not be resolved (int * length).
+		 */
+
+		/*
+		 * char * purple_markup_get_css_property(gchar * style, gchar * opt)
+		 */
+		[DllImport("libpurple.dll")]
+		private static extern string purple_markup_get_css_property(string style, string opt);
+
+		public static string MarkupGetCssProperty(string style, string opt)
+		{
+			return purple_markup_get_css_property(style, opt);
+		}
+
+		/*
 		 * gboolean purple_markup_is_rtl(char * html)
 		 */
 		[DllImport("libpurple.dll")]
@@ -354,7 +249,7 @@ namespace PurpleWrapper
 
 		public static bool MarkupIsRtl(string html)
 		{
-			throw new NotImplementedException();
+			return purple_markup_is_rtl(html);
 		}
 
 		/*
@@ -365,7 +260,7 @@ namespace PurpleWrapper
 
 		public static string HomeDir()
 		{
-			throw new NotImplementedException();
+			return purple_home_dir();
 		}
 
 		/*
@@ -376,7 +271,7 @@ namespace PurpleWrapper
 
 		public static string UserDir()
 		{
-			throw new NotImplementedException();
+			return purple_user_dir();
 		}
 
 		/*
@@ -387,7 +282,7 @@ namespace PurpleWrapper
 
 		public static void SetUserDir(string dir)
 		{
-			throw new NotImplementedException();
+			purple_util_set_user_dir(dir);
 		}
 
 		/*
@@ -398,73 +293,58 @@ namespace PurpleWrapper
 
 		public static int BuildDir(string path, int mode)
 		{
-			throw new NotImplementedException();
+			return purple_build_dir(path, mode);
 		}
 
 		/*
-		 * gboolean purple_util_write_data_to_file(char * filename, char * data, gssize size)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_util_write_data_to_file(string filename, string data, UNKNOWN size);
-
-		public static bool WriteDataToFile(string filename, string data, gssize size)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * gboolean purple_util_write_data_to_file_absolute(char * filename_full, char * data, gssize size)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_util_write_data_to_file_absolute(string filename_full, string data, UNKNOWN size);
+		private static extern bool purple_util_write_data_to_file_absolute(string filename_full, string data, long size);
 
-		public static bool WriteDataToFileAbsolute(string filename_full, string data, gssize size)
+		public static bool WriteDataToFileAbsolute(string filename_full, string data, long size)
 		{
-			throw new NotImplementedException();
+			return purple_util_write_data_to_file_absolute(filename_full, data, size);
 		}
 
 		/*
-		 * xmlnode * purple_util_read_xml_from_file(char * filename, char * description)
+		 * FILE * purple_mkstemp(char ** path, gboolean binary)
+		 * 
+		 * Could not generate a wrapper for purple_mkstemp in file "util.h".
+		 * Message: The type could not be resolved (FILE * purple_mkstemp(char ** path, gboolean binary)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_util_read_xml_from_file(string filename, string description);
 
-		public static xmlnode ReadXmlFromFile(string filename, string description)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * FILE * purple_mkstemp(char ** path, gboolean binary)
+		 * char * purple_util_get_image_extension(gconstpointer data, size_t len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_mkstemp(IntPtr path, bool binary);
+		private static extern string purple_util_get_image_extension(IntPtr data, ulong len);
 
-		public static FILE Mkstemp(char path, bool binary)
+		public static string GetImageExtension(IntPtr data, ulong len)
 		{
-			throw new NotImplementedException();
+			return purple_util_get_image_extension(data, len);
 		}
 
 		/*
 		 * char * purple_util_get_image_checksum(gconstpointer image_data, size_t image_len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_util_get_image_checksum(UNKNOWN image_data, UNKNOWN image_len);
+		private static extern string purple_util_get_image_checksum(IntPtr image_data, ulong image_len);
 
-		public static string GetImageChecksum(gconstpointer image_data, size_t image_len)
+		public static string GetImageChecksum(IntPtr image_data, ulong image_len)
 		{
-			throw new NotImplementedException();
+			return purple_util_get_image_checksum(image_data, image_len);
 		}
 
 		/*
 		 * char * purple_util_get_image_filename(gconstpointer image_data, size_t image_len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_util_get_image_filename(UNKNOWN image_data, UNKNOWN image_len);
+		private static extern string purple_util_get_image_filename(IntPtr image_data, ulong image_len);
 
-		public static string GetImageFilename(gconstpointer image_data, size_t image_len)
+		public static string GetImageFilename(IntPtr image_data, ulong image_len)
 		{
-			throw new NotImplementedException();
+			return purple_util_get_image_filename(image_data, image_len);
 		}
 
 		/*
@@ -475,7 +355,7 @@ namespace PurpleWrapper
 
 		public static bool ProgramIsValid(string program)
 		{
-			throw new NotImplementedException();
+			return purple_program_is_valid(program);
 		}
 
 		/*
@@ -486,7 +366,7 @@ namespace PurpleWrapper
 
 		public static bool RunningGnome()
 		{
-			throw new NotImplementedException();
+			return purple_running_gnome();
 		}
 
 		/*
@@ -497,7 +377,7 @@ namespace PurpleWrapper
 
 		public static bool RunningKde()
 		{
-			throw new NotImplementedException();
+			return purple_running_kde();
 		}
 
 		/*
@@ -508,7 +388,7 @@ namespace PurpleWrapper
 
 		public static bool RunningOsx()
 		{
-			throw new NotImplementedException();
+			return purple_running_osx();
 		}
 
 		/*
@@ -519,7 +399,7 @@ namespace PurpleWrapper
 
 		public static string FdGetIp(int fd)
 		{
-			throw new NotImplementedException();
+			return purple_fd_get_ip(fd);
 		}
 
 		/*
@@ -530,7 +410,7 @@ namespace PurpleWrapper
 
 		public static bool Strequal(string left, string right)
 		{
-			throw new NotImplementedException();
+			return purple_strequal(left, right);
 		}
 
 		/*
@@ -541,7 +421,7 @@ namespace PurpleWrapper
 
 		public static string Normalize(PurpleAccount account, string str)
 		{
-			throw new NotImplementedException();
+			return purple_normalize(account.Reference, str);
 		}
 
 		/*
@@ -552,7 +432,7 @@ namespace PurpleWrapper
 
 		public static string NormalizeNocase(PurpleAccount account, string str)
 		{
-			throw new NotImplementedException();
+			return purple_normalize_nocase(account.Reference, str);
 		}
 
 		/*
@@ -563,7 +443,7 @@ namespace PurpleWrapper
 
 		public static bool StrHasPrefix(string s, string p)
 		{
-			throw new NotImplementedException();
+			return purple_str_has_prefix(s, p);
 		}
 
 		/*
@@ -574,7 +454,7 @@ namespace PurpleWrapper
 
 		public static bool StrHasSuffix(string s, string x)
 		{
-			throw new NotImplementedException();
+			return purple_str_has_suffix(s, x);
 		}
 
 		/*
@@ -585,7 +465,7 @@ namespace PurpleWrapper
 
 		public static string StrdupWithhtml(string src)
 		{
-			throw new NotImplementedException();
+			return purple_strdup_withhtml(src);
 		}
 
 		/*
@@ -596,7 +476,7 @@ namespace PurpleWrapper
 
 		public static string StrAddCr(string str)
 		{
-			throw new NotImplementedException();
+			return purple_str_add_cr(str);
 		}
 
 		/*
@@ -607,65 +487,32 @@ namespace PurpleWrapper
 
 		public static void StrStripChar(string str, char thechar)
 		{
-			throw new NotImplementedException();
+			purple_str_strip_char(str, thechar);
 		}
 
 		/*
-		 * void purple_util_chrreplace(char * string, char delimiter, char replacement)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_util_chrreplace(string string, char delimiter, char replacement);
-
-		public static void Chrreplace(string string, char delimiter, char replacement)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * gchar * purple_strreplace(char * string, char * delimiter, char * replacement)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_strreplace(string string, string delimiter, string replacement);
-
-		public static string Strreplace(string string, string delimiter, string replacement)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_utf8_ncr_encode(char * in)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_utf8_ncr_encode(string in);
+		private static extern string purple_utf8_ncr_encode(string in_);
 
-		public static string Utf8NcrEncode(string in)
+		public static string Utf8NcrEncode(string in_)
 		{
-			throw new NotImplementedException();
+			return purple_utf8_ncr_encode(in_);
 		}
 
 		/*
 		 * char * purple_utf8_ncr_decode(char * in)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_utf8_ncr_decode(string in);
+		private static extern string purple_utf8_ncr_decode(string in_);
 
-		public static string Utf8NcrDecode(string in)
+		public static string Utf8NcrDecode(string in_)
 		{
-			throw new NotImplementedException();
+			return purple_utf8_ncr_decode(in_);
 		}
 
 		/*
-		 * gchar * purple_strcasereplace(char * string, char * delimiter, char * replacement)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_strcasereplace(string string, string delimiter, string replacement);
-
-		public static string Strcasereplace(string string, string delimiter, string replacement)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * char * purple_strcasestr(char * haystack, char * needle)
 		 */
 		[DllImport("libpurple.dll")]
@@ -673,18 +520,18 @@ namespace PurpleWrapper
 
 		public static string Strcasestr(string haystack, string needle)
 		{
-			throw new NotImplementedException();
+			return purple_strcasestr(haystack, needle);
 		}
 
 		/*
 		 * char * purple_str_size_to_units(size_t size)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_str_size_to_units(UNKNOWN size);
+		private static extern string purple_str_size_to_units(ulong size);
 
-		public static string StrSizeToUnits(size_t size)
+		public static string StrSizeToUnits(ulong size)
 		{
-			throw new NotImplementedException();
+			return purple_str_size_to_units(size);
 		}
 
 		/*
@@ -695,20 +542,16 @@ namespace PurpleWrapper
 
 		public static string StrSecondsToString(uint sec)
 		{
-			throw new NotImplementedException();
+			return purple_str_seconds_to_string(sec);
 		}
 
 		/*
-		 * char * purple_str_binary_to_ascii(unsigned char, guint len)
+		 * char * purple_str_binary_to_ascii(unsigned char * binary, guint len)
+		 * 
+		 * Could not generate a wrapper for purple_str_binary_to_ascii in file "util.h".
+		 * Message: The type could not be resolved (unsigned char * binary).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_str_binary_to_ascii(UNKNOWN char, uint len);
 
-		public static string StrBinaryToAscii(unsigned char, uint len)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_got_protocol_handler_uri(char * uri)
 		 */
@@ -717,64 +560,16 @@ namespace PurpleWrapper
 
 		public static void GotProtocolHandlerUri(string uri)
 		{
-			throw new NotImplementedException();
+			purple_got_protocol_handler_uri(uri);
 		}
 
 		/*
-		 * gboolean purple_url_parse(char * url, char ** ret_host, int * ret_port, char ** ret_path, char ** ret_user, char ** ret_passwd)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_url_parse(string url, IntPtr ret_host, IntPtr ret_port, IntPtr ret_path, IntPtr ret_user, IntPtr ret_passwd);
-
-		public static bool UrlParse(string url, char ret_host, int ret_port, char ret_path, char ret_user, char ret_passwd)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleUtilFetchUrlData * purple_util_fetch_url_request(gchar * url, gboolean full, gchar * user_agent, gboolean http11, gchar * request, gboolean include_headers, PurpleUtilFetchUrlCallback callback, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_util_fetch_url_request(string url, bool full, string user_agent, bool http11, string request, bool include_headers, UNKNOWN callback, IntPtr data);
-
-		public static PurpleUtilFetchUrlData FetchUrlRequest(string url, bool full, string user_agent, bool http11, string request, bool include_headers, PurpleUtilFetchUrlCallback callback, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleUtilFetchUrlData * purple_util_fetch_url_request_len(gchar * url, gboolean full, gchar * user_agent, gboolean http11, gchar * request, gboolean include_headers, gssize max_len, PurpleUtilFetchUrlCallback callback, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_util_fetch_url_request_len(string url, bool full, string user_agent, bool http11, string request, bool include_headers, UNKNOWN max_len, UNKNOWN callback, IntPtr data);
-
-		public static PurpleUtilFetchUrlData FetchUrlRequestLen(string url, bool full, string user_agent, bool http11, string request, bool include_headers, gssize max_len, PurpleUtilFetchUrlCallback callback, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * PurpleUtilFetchUrlData * purple_util_fetch_url_request_len_with_account(PurpleAccount * account, gchar * url, gboolean full, gchar * user_agent, gboolean http11, gchar * request, gboolean include_headers, gssize max_len, PurpleUtilFetchUrlCallback callback, gpointer data)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_util_fetch_url_request_len_with_account(IntPtr account, string url, bool full, string user_agent, bool http11, string request, bool include_headers, UNKNOWN max_len, UNKNOWN callback, IntPtr data);
-
-		public static PurpleUtilFetchUrlData FetchUrlRequestLenWithAccount(PurpleAccount account, string url, bool full, string user_agent, bool http11, string request, bool include_headers, gssize max_len, PurpleUtilFetchUrlCallback callback, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
 		 * void purple_util_fetch_url_cancel(PurpleUtilFetchUrlData * url_data)
+		 * 
+		 * Could not generate a wrapper for purple_util_fetch_url_cancel in file "util.h".
+		 * Message: The type could not be resolved (PurpleUtilFetchUrlData * url_data).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_util_fetch_url_cancel(IntPtr url_data);
 
-		public static void FetchUrlCancel(PurpleUtilFetchUrlData url_data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_url_decode(char * str)
 		 */
@@ -783,7 +578,7 @@ namespace PurpleWrapper
 
 		public static string UrlDecode(string str)
 		{
-			throw new NotImplementedException();
+			return purple_url_decode(str);
 		}
 
 		/*
@@ -794,7 +589,7 @@ namespace PurpleWrapper
 
 		public static string UrlEncode(string str)
 		{
-			throw new NotImplementedException();
+			return purple_url_encode(str);
 		}
 
 		/*
@@ -805,7 +600,7 @@ namespace PurpleWrapper
 
 		public static bool EmailIsValid(string address)
 		{
-			throw new NotImplementedException();
+			return purple_email_is_valid(address);
 		}
 
 		/*
@@ -816,31 +611,23 @@ namespace PurpleWrapper
 
 		public static bool IpAddressIsValid(string ip)
 		{
-			throw new NotImplementedException();
+			return purple_ip_address_is_valid(ip);
 		}
 
 		/*
 		 * GList * purple_uri_list_extract_uris(gchar * uri_list)
+		 * 
+		 * Could not generate a wrapper for purple_uri_list_extract_uris in file "util.h".
+		 * Message: The type could not be resolved (GList * purple_uri_list_extract_uris(gchar * uri_list)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_uri_list_extract_uris(string uri_list);
 
-		public static GList UriListExtractUris(string uri_list)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * GList * purple_uri_list_extract_filenames(gchar * uri_list)
+		 * 
+		 * Could not generate a wrapper for purple_uri_list_extract_filenames in file "util.h".
+		 * Message: The type could not be resolved (GList * purple_uri_list_extract_filenames(gchar * uri_list)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_uri_list_extract_filenames(string uri_list);
 
-		public static GList UriListExtractFilenames(string uri_list)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gchar * purple_utf8_try_convert(char * str)
 		 */
@@ -849,7 +636,7 @@ namespace PurpleWrapper
 
 		public static string Utf8TryConvert(string str)
 		{
-			throw new NotImplementedException();
+			return purple_utf8_try_convert(str);
 		}
 
 		/*
@@ -860,7 +647,7 @@ namespace PurpleWrapper
 
 		public static string Utf8Salvage(string str)
 		{
-			throw new NotImplementedException();
+			return purple_utf8_salvage(str);
 		}
 
 		/*
@@ -871,7 +658,7 @@ namespace PurpleWrapper
 
 		public static string Utf8StripUnprintables(string str)
 		{
-			throw new NotImplementedException();
+			return purple_utf8_strip_unprintables(str);
 		}
 
 		/*
@@ -882,7 +669,7 @@ namespace PurpleWrapper
 
 		public static string GaiStrerror(int errnum)
 		{
-			throw new NotImplementedException();
+			return purple_gai_strerror(errnum);
 		}
 
 		/*
@@ -893,7 +680,7 @@ namespace PurpleWrapper
 
 		public static int Utf8Strcasecmp(string a, string b)
 		{
-			throw new NotImplementedException();
+			return purple_utf8_strcasecmp(a, b);
 		}
 
 		/*
@@ -904,40 +691,36 @@ namespace PurpleWrapper
 
 		public static bool Utf8HasWord(string haystack, string needle)
 		{
-			throw new NotImplementedException();
+			return purple_utf8_has_word(haystack, needle);
 		}
 
 		/*
 		 * void purple_print_utf8_to_console(FILE * filestream, char * message)
+		 * 
+		 * Could not generate a wrapper for purple_print_utf8_to_console in file "util.h".
+		 * Message: The type could not be resolved (FILE * filestream).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_print_utf8_to_console(IntPtr filestream, string message);
 
-		public static void PrintUtf8ToConsole(FILE filestream, string message)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_message_meify(char * message, gssize len)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern bool purple_message_meify(string message, UNKNOWN len);
+		private static extern bool purple_message_meify(string message, long len);
 
-		public static bool MessageMeify(string message, gssize len)
+		public static bool MessageMeify(string message, long len)
 		{
-			throw new NotImplementedException();
+			return purple_message_meify(message, len);
 		}
 
 		/*
 		 * char * purple_text_strip_mnemonic(char * in)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string purple_text_strip_mnemonic(string in);
+		private static extern string purple_text_strip_mnemonic(string in_);
 
-		public static string TextStripMnemonic(string in)
+		public static string TextStripMnemonic(string in_)
 		{
-			throw new NotImplementedException();
+			return purple_text_strip_mnemonic(in_);
 		}
 
 		/*
@@ -948,7 +731,7 @@ namespace PurpleWrapper
 
 		public static string UnescapeFilename(string str)
 		{
-			throw new NotImplementedException();
+			return purple_unescape_filename(str);
 		}
 
 		/*
@@ -959,18 +742,18 @@ namespace PurpleWrapper
 
 		public static string EscapeFilename(string str)
 		{
-			throw new NotImplementedException();
+			return purple_escape_filename(str);
 		}
 
 		/*
-		 * char * _purple_oscar_convert(char * act, char * protocol)
+		 * char * purple_oscar_convert(char * act, char * protocol)
 		 */
 		[DllImport("libpurple.dll")]
-		private static extern string _purple_oscar_convert(string act, string protocol);
+		private static extern string purple_oscar_convert(string act, string protocol);
 
-		public static string _purpleOscarConvert(string act, string protocol)
+		public static string OscarConvert(string act, string protocol)
 		{
-			throw new NotImplementedException();
+			return purple_oscar_convert(act, protocol);
 		}
 
 		/*
@@ -981,7 +764,7 @@ namespace PurpleWrapper
 
 		public static void RestoreDefaultSignalHandlers()
 		{
-			throw new NotImplementedException();
+			purple_restore_default_signal_handlers();
 		}
 
 		/*
@@ -992,7 +775,7 @@ namespace PurpleWrapper
 
 		public static string GetHostName()
 		{
-			throw new NotImplementedException();
+			return purple_get_host_name();
 		}
 
 	}
============================================================
--- libpurple/wrapper/Value.cs	3d651a60350de489b088a67dc19051ec38b1c7ef
+++ libpurple/wrapper/Value.cs	b532b4679e1101b483ad6ceb175f457db6c0d727
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,446 +40,318 @@ namespace PurpleWrapper
 {
 	public class Value
 	{
-		/*
-		 * PurpleValue * purple_value_new(PurpleType type, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_value_new(UNKNOWN type, ...);
-
-		public static PurpleValue New(PurpleType type, ...)
+		public enum PurpleType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_TYPE_UNKNOWN = 0,
+			PURPLE_TYPE_SUBTYPE,
+			PURPLE_TYPE_CHAR,
+			PURPLE_TYPE_UCHAR,
+			PURPLE_TYPE_BOOLEAN,
+			PURPLE_TYPE_SHORT,
+			PURPLE_TYPE_USHORT,
+			PURPLE_TYPE_INT,
+			PURPLE_TYPE_UINT,
+			PURPLE_TYPE_LONG,
+			PURPLE_TYPE_ULONG,
+			PURPLE_TYPE_INT64,
+			PURPLE_TYPE_UINT64,
+			PURPLE_TYPE_STRING,
+			PURPLE_TYPE_OBJECT,
+			PURPLE_TYPE_POINTER,
+			PURPLE_TYPE_ENUM,
+			PURPLE_TYPE_BOXED
+		};
 
-		/*
-		 * PurpleValue * purple_value_new_outgoing(PurpleType type, ...)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_value_new_outgoing(UNKNOWN type, ...);
-
-		public static PurpleValue NewOutgoing(PurpleType type, ...)
+		public enum PurpleSubType
 		{
-			throw new NotImplementedException();
-		}
+			PURPLE_SUBTYPE_UNKNOWN = 0,
+			PURPLE_SUBTYPE_ACCOUNT,
+			PURPLE_SUBTYPE_BLIST,
+			PURPLE_SUBTYPE_BLIST_BUDDY,
+			PURPLE_SUBTYPE_BLIST_GROUP,
+			PURPLE_SUBTYPE_BLIST_CHAT,
+			PURPLE_SUBTYPE_BUDDY_ICON,
+			PURPLE_SUBTYPE_CONNECTION,
+			PURPLE_SUBTYPE_CONVERSATION,
+			PURPLE_SUBTYPE_PLUGIN,
+			PURPLE_SUBTYPE_BLIST_NODE,
+			PURPLE_SUBTYPE_CIPHER,
+			PURPLE_SUBTYPE_STATUS,
+			PURPLE_SUBTYPE_LOG,
+			PURPLE_SUBTYPE_XFER,
+			PURPLE_SUBTYPE_SAVEDSTATUS,
+			PURPLE_SUBTYPE_XMLNODE,
+			PURPLE_SUBTYPE_USERINFO,
+			PURPLE_SUBTYPE_STORED_IMAGE,
+			PURPLE_SUBTYPE_CERTIFICATEPOOL
+		};
 
 		/*
 		 * void purple_value_destroy(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_destroy in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_destroy(IntPtr value);
 
-		public static void Destroy(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleValue * purple_value_dup(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_dup in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * purple_value_dup(PurpleValue * value)).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_value_dup(IntPtr value);
 
-		public static PurpleValue Dup(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * PurpleType purple_value_get_type(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_type in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern UNKNOWN purple_value_get_type(IntPtr value);
 
-		public static PurpleType GetType(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * int purple_value_get_subtype(PurpleValue * value)
+		 * unsigned int purple_value_get_subtype(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_subtype in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_value_get_subtype(IntPtr value);
 
-		public static int GetSubtype(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_value_get_specific_type(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_specific_type in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_value_get_specific_type(IntPtr value);
 
-		public static string GetSpecificType(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_value_is_outgoing(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_is_outgoing in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_value_is_outgoing(IntPtr value);
 
-		public static bool IsOutgoing(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_char(PurpleValue * value, char data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_char in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_char(IntPtr value, char data);
 
-		public static void SetChar(PurpleValue value, char data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_value_set_uchar(PurpleValue * value, unsigned char)
+		 * void purple_value_set_uchar(PurpleValue * value, unsigned char data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_uchar in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_uchar(IntPtr value, UNKNOWN char);
 
-		public static void SetUchar(PurpleValue value, unsigned char)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_boolean(PurpleValue * value, gboolean data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_boolean in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_boolean(IntPtr value, bool data);
 
-		public static void SetBoolean(PurpleValue value, bool data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_short(PurpleValue * value, short data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_short in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_short(IntPtr value, short data);
 
-		public static void SetShort(PurpleValue value, short data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_value_set_ushort(PurpleValue * value, unsigned short)
+		 * void purple_value_set_ushort(PurpleValue * value, unsigned short data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_ushort in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_ushort(IntPtr value, UNKNOWN short);
 
-		public static void SetUshort(PurpleValue value, unsigned short)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_int(PurpleValue * value, int data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_int in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_int(IntPtr value, int data);
 
-		public static void SetInt(PurpleValue value, int data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_value_set_uint(PurpleValue * value, unsigned int)
+		 * void purple_value_set_uint(PurpleValue * value, unsigned int data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_uint in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_uint(IntPtr value, UNKNOWN int);
 
-		public static void SetUint(PurpleValue value, unsigned int)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_long(PurpleValue * value, long data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_long in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_long(IntPtr value, long data);
 
-		public static void SetLong(PurpleValue value, long data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * void purple_value_set_ulong(PurpleValue * value, unsigned long)
+		 * void purple_value_set_ulong(PurpleValue * value, unsigned long data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_ulong in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_ulong(IntPtr value, UNKNOWN long);
 
-		public static void SetUlong(PurpleValue value, unsigned long)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_int64(PurpleValue * value, gint64 data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_int64 in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_int64(IntPtr value, long data);
 
-		public static void SetInt64(PurpleValue value, long data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_uint64(PurpleValue * value, guint64 data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_uint64 in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_uint64(IntPtr value, ulong data);
 
-		public static void SetUint64(PurpleValue value, ulong data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_string(PurpleValue * value, char * data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_string in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_string(IntPtr value, string data);
 
-		public static void SetString(PurpleValue value, string data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_object(PurpleValue * value, void * data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_object in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_object(IntPtr value, IntPtr data);
 
-		public static void SetObject(PurpleValue value, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_pointer(PurpleValue * value, void * data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_pointer in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_pointer(IntPtr value, IntPtr data);
 
-		public static void SetPointer(PurpleValue value, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_enum(PurpleValue * value, int data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_enum in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_enum(IntPtr value, int data);
 
-		public static void SetEnum(PurpleValue value, int data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_value_set_boxed(PurpleValue * value, void * data)
+		 * 
+		 * Could not generate a wrapper for purple_value_set_boxed in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_value_set_boxed(IntPtr value, IntPtr data);
 
-		public static void SetBoxed(PurpleValue value, IntPtr data)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char purple_value_get_char(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_char in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern char purple_value_get_char(IntPtr value);
 
-		public static char GetChar(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * char purple_value_get_uchar(PurpleValue * value)
+		 * unsigned char purple_value_get_uchar(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_uchar in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern char purple_value_get_uchar(IntPtr value);
 
-		public static char GetUchar(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_value_get_boolean(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_boolean in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_value_get_boolean(IntPtr value);
 
-		public static bool GetBoolean(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * short purple_value_get_short(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_short in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern short purple_value_get_short(IntPtr value);
 
-		public static short GetShort(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * short purple_value_get_ushort(PurpleValue * value)
+		 * unsigned short purple_value_get_ushort(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_ushort in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern short purple_value_get_ushort(IntPtr value);
 
-		public static short GetUshort(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * int purple_value_get_int(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_int in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_value_get_int(IntPtr value);
 
-		public static int GetInt(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * int purple_value_get_uint(PurpleValue * value)
+		 * unsigned int purple_value_get_uint(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_uint in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_value_get_uint(IntPtr value);
 
-		public static int GetUint(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * long purple_value_get_long(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_long in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern long purple_value_get_long(IntPtr value);
 
-		public static long GetLong(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
-		 * long purple_value_get_ulong(PurpleValue * value)
+		 * unsigned long purple_value_get_ulong(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_ulong in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern long purple_value_get_ulong(IntPtr value);
 
-		public static long GetUlong(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gint64 purple_value_get_int64(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_int64 in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern long purple_value_get_int64(IntPtr value);
 
-		public static long GetInt64(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * guint64 purple_value_get_uint64(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_uint64 in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern ulong purple_value_get_uint64(IntPtr value);
 
-		public static ulong GetUint64(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * char * purple_value_get_string(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_string in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern string purple_value_get_string(IntPtr value);
 
-		public static string GetString(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_value_get_object(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_object in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_value_get_object(IntPtr value);
 
-		public static IntPtr GetObject(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_value_get_pointer(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_pointer in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_value_get_pointer(IntPtr value);
 
-		public static IntPtr GetPointer(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * int purple_value_get_enum(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_enum in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern int purple_value_get_enum(IntPtr value);
 
-		public static int GetEnum(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void * purple_value_get_boxed(PurpleValue * value)
+		 * 
+		 * Could not generate a wrapper for purple_value_get_boxed in file "value.h".
+		 * Message: The type could not be resolved (PurpleValue * value).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr purple_value_get_boxed(IntPtr value);
 
-		public static IntPtr GetBoxed(PurpleValue value)
-		{
-			throw new NotImplementedException();
-		}
-
 	}
 }
 
============================================================
--- libpurple/wrapper/Version.cs	a4d8a9939b8d1c70321f3a283d3e3a563da93b6a
+++ libpurple/wrapper/Version.cs	dc0b5a9d7315a93b0f63ea7516e72f358f024681
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,7 +48,7 @@ namespace PurpleWrapper
 
 		public static string Check(uint required_major, uint required_minor, uint required_micro)
 		{
-			throw new NotImplementedException();
+			return purple_version_check(required_major, required_minor, required_micro);
 		}
 
 	}
============================================================
--- libpurple/wrapper/Whiteboard.cs	97fab946749d74fd83157bcaced1dfcfda28caa2
+++ libpurple/wrapper/Whiteboard.cs	9464f6b58e89a28f0564748a48479a2dd62de089
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -46,7 +48,7 @@ namespace PurpleWrapper
 
 		public static void SetUiOps(PurpleWhiteboardUiOps ops)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_set_ui_ops(ops.Reference);
 		}
 
 		/*
@@ -57,7 +59,7 @@ namespace PurpleWrapper
 
 		public static void SetPrplOps(PurpleWhiteboard wb, PurpleWhiteboardPrplOps ops)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_set_prpl_ops(wb.Reference, ops.Reference);
 		}
 
 		/*
@@ -68,7 +70,7 @@ namespace PurpleWrapper
 
 		public static PurpleWhiteboard Create(PurpleAccount account, string who, int state)
 		{
-			throw new NotImplementedException();
+			return new PurpleWhiteboard(purple_whiteboard_create(account.Reference, who, state));
 		}
 
 		/*
@@ -79,7 +81,7 @@ namespace PurpleWrapper
 
 		public static void Destroy(PurpleWhiteboard wb)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_destroy(wb.Reference);
 		}
 
 		/*
@@ -90,7 +92,7 @@ namespace PurpleWrapper
 
 		public static void Start(PurpleWhiteboard wb)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_start(wb.Reference);
 		}
 
 		/*
@@ -101,31 +103,23 @@ namespace PurpleWrapper
 
 		public static PurpleWhiteboard GetSession(PurpleAccount account, string who)
 		{
-			throw new NotImplementedException();
+			return new PurpleWhiteboard(purple_whiteboard_get_session(account.Reference, who));
 		}
 
 		/*
 		 * void purple_whiteboard_draw_list_destroy(GList * draw_list)
+		 * 
+		 * Could not generate a wrapper for purple_whiteboard_draw_list_destroy in file "whiteboard.h".
+		 * Message: The type could not be resolved (GList * draw_list).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_whiteboard_draw_list_destroy(IntPtr draw_list);
 
-		public static void DrawListDestroy(GList draw_list)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * gboolean purple_whiteboard_get_dimensions(PurpleWhiteboard * wb, int * width, int * height)
+		 * 
+		 * Could not generate a wrapper for purple_whiteboard_get_dimensions in file "whiteboard.h".
+		 * Message: The type could not be resolved (int * width).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_whiteboard_get_dimensions(IntPtr wb, IntPtr width, IntPtr height);
 
-		public static bool GetDimensions(PurpleWhiteboard wb, int width, int height)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_whiteboard_set_dimensions(PurpleWhiteboard * wb, int width, int height)
 		 */
@@ -134,7 +128,7 @@ namespace PurpleWrapper
 
 		public static void SetDimensions(PurpleWhiteboard wb, int width, int height)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_set_dimensions(wb.Reference, width, height);
 		}
 
 		/*
@@ -145,20 +139,16 @@ namespace PurpleWrapper
 
 		public static void DrawPoint(PurpleWhiteboard wb, int x, int y, int color, int size)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_draw_point(wb.Reference, x, y, color, size);
 		}
 
 		/*
 		 * void purple_whiteboard_send_draw_list(PurpleWhiteboard * wb, GList * list)
+		 * 
+		 * Could not generate a wrapper for purple_whiteboard_send_draw_list in file "whiteboard.h".
+		 * Message: The type could not be resolved (GList * list).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern void purple_whiteboard_send_draw_list(IntPtr wb, IntPtr list);
 
-		public static void SendDrawList(PurpleWhiteboard wb, GList list)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_whiteboard_draw_line(PurpleWhiteboard * wb, int x1, int y1, int x2, int y2, int color, int size)
 		 */
@@ -167,7 +157,7 @@ namespace PurpleWrapper
 
 		public static void DrawLine(PurpleWhiteboard wb, int x1, int y1, int x2, int y2, int color, int size)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_draw_line(wb.Reference, x1, y1, x2, y2, color, size);
 		}
 
 		/*
@@ -178,7 +168,7 @@ namespace PurpleWrapper
 
 		public static void Clear(PurpleWhiteboard wb)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_clear(wb.Reference);
 		}
 
 		/*
@@ -189,7 +179,7 @@ namespace PurpleWrapper
 
 		public static void SendClear(PurpleWhiteboard wb)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_send_clear(wb.Reference);
 		}
 
 		/*
@@ -200,20 +190,16 @@ namespace PurpleWrapper
 
 		public static void SendBrush(PurpleWhiteboard wb, int size, int color)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_send_brush(wb.Reference, size, color);
 		}
 
 		/*
 		 * gboolean purple_whiteboard_get_brush(PurpleWhiteboard * wb, int * size, int * color)
+		 * 
+		 * Could not generate a wrapper for purple_whiteboard_get_brush in file "whiteboard.h".
+		 * Message: The type could not be resolved (int * size).
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern bool purple_whiteboard_get_brush(IntPtr wb, IntPtr size, IntPtr color);
 
-		public static bool GetBrush(PurpleWhiteboard wb, int size, int color)
-		{
-			throw new NotImplementedException();
-		}
-
 		/*
 		 * void purple_whiteboard_set_brush(PurpleWhiteboard * wb, int size, int color)
 		 */
@@ -222,7 +208,7 @@ namespace PurpleWrapper
 
 		public static void SetBrush(PurpleWhiteboard wb, int size, int color)
 		{
-			throw new NotImplementedException();
+			purple_whiteboard_set_brush(wb.Reference, size, color);
 		}
 
 	}
============================================================
--- libpurple/wrapper/generator/CArgument.cs	30f31b9dd20af4c989a22b566d1189d118eff3c0
+++ libpurple/wrapper/generator/CArgument.cs	17ecc149d2068b3813f0022e8d4c3d61710398d9
@@ -5,27 +5,20 @@ namespace Scripts
 {
     class CArgument : CTyped
     {
-        private String name;
-        public bool isEllipsis = false;
-        public bool isFunctionPointer = false;
+        private bool isEllipsis = false;
+        private bool isFunctionPointer = false;
         public List<CArgument> functionPointerArguments = new List<CArgument>();
 
-        public CArgument()
+        public CArgument(CFile file)
+            : base(file, "", "")
         {
         }
 
-        public CArgument(String type, String name)
+        public CArgument(CFile file, String type, String name)
+            : base(file, type, name)
         {
-            this.Type = type;
-            this.name = name;
         }
 
-        public String Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-
         public bool IsEllipsis
         {
             get { return isEllipsis; }
@@ -74,18 +67,18 @@ namespace Scripts
         public string GetCSharpPrivateFunction()
         {
             if (this.IsEllipsis)
-                return "...";
+                throw new UnableToCreateWrapperException("The function argument contains the ellipsis argument and cannot be automatically wrapped.");
             else
-                return this.CSharpPrivateType + " " + this.Name;
+                return this.CSharpPrivateType + " " + this.SafeName;
         }
 
         public string GetCSharpPublicFunction()
         {
             if (this.IsEllipsis)
-                return "...";
+                throw new UnableToCreateWrapperException("The function argument contains the ellipsis argument and cannot be automatically wrapped.");
             else
             {
-                return this.CSharpPublicType + " " + this.Name;
+                return this.CSharpPublicType + " " + this.SafeName;
             }
         }
     }
============================================================
--- libpurple/wrapper/generator/CEnum.cs	9048e38a96ce92f4868ccb7c1c3f955c1031e129
+++ libpurple/wrapper/generator/CEnum.cs	7d37b8d19937e71c744b1d1f2c09fd59b4985e84
@@ -1,11 +1,72 @@ using System.Collections.Generic;
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.IO;
 
 namespace Scripts
 {
-    class CEnum
+    class CEnum : CNamed
     {
+        private List<KeyValuePair<string, string>> elements = new List<KeyValuePair<string, string>>();
+        
+        public CEnum(CFile file, String name)
+            : base(file, name)
+        {
+        }
+
+
+        public void AddElement(string name, string value)
+        {
+            elements.Add(new KeyValuePair<string, string>(name, value));
+        }
+
+        public override string ToString()
+        {
+            String str = "enum " + this.Name + " { ";
+
+            for (int i = 0; i < elements.Count; i++)
+            {
+                String name = elements[i].Key;
+                String value = elements[i].Value;
+                
+                str += name;
+                if (value != "")
+                    str += " = " + value;
+
+                if (i != elements.Count - 1)
+                    str += ", ";
+                else
+                    str += " ";
+            }
+
+            str += "};";
+
+            return str;
+        }
+
+        public void WriteForCSharp(StreamWriter writer, string initalPrefix)
+        {
+            writer.WriteLine(initalPrefix + "public enum " + this.Name);
+            writer.WriteLine(initalPrefix + "{");
+
+            for (int i = 0; i < elements.Count; i++)
+            {
+                String name = elements[i].Key;
+                String value = elements[i].Value;
+
+                String str = initalPrefix + "\t" + name;
+                if (value != "")
+                    str += " = " + value;
+
+                if (i != elements.Count - 1)
+                    str += ",";
+
+                writer.WriteLine(str);
+            }
+
+            writer.WriteLine(initalPrefix + "};");
+            writer.WriteLine();
+        }
+
+
     }
 }
============================================================
--- libpurple/wrapper/generator/CFile.cs	1fc931786a135ac4887cd0dfa0c5eb5576c60838
+++ libpurple/wrapper/generator/CFile.cs	90796e70c18f61b0227d887cb57673dcc60a2a0e
@@ -7,9 +7,65 @@ namespace Scripts
 {
     class CFile
     {
+        private static List<CFile> fileColleciton = new List<CFile>();
+
+        public static List<CFile> FileCollection
+        {
+            get { return fileColleciton; }
+        }
+
+        public static CNamed LookUpName(String name)
+        {
+            foreach (CFile file in CFile.FileCollection)
+            {
+                foreach (CStruct structure in file.Structs)
+                {
+                    if (structure.Name == name)
+                    {
+                        //Console.WriteLine("Type \"{0}\" is a struct.", name);
+                        return structure;
+                    }
+                }
+
+                foreach (CFunction function in file.Functions)
+                {
+                    if (function.Name == name)
+                    {
+                        //Console.WriteLine("Type \"{0}\" is a function.", name);
+                        return function;
+                    }
+                }
+
+                foreach (CEnum enumeration in file.Enums)
+                {
+                    if (enumeration.Name == name)
+                    {
+                        //Console.WriteLine("Type \"{0}\" is an enum.", name);
+                        return enumeration;
+                    }
+                }
+
+                foreach (CFunction function in file.FunctionPointers)
+                {
+                    if (function.Name == name)
+                    {
+                        //Console.WriteLine("Type \"{0}\" is a function pointer.", name);
+                        return function;
+                    }
+                }
+            }
+
+            //Console.WriteLine("Type \"{0}\" is really UNKNOWN.", name);
+            //Console.ReadLine();
+            return null;
+        }
+
+
         private String fileName;
         private List<CStruct> structs = new List<CStruct>();
         private List<CFunction> functions = new List<CFunction>();
+        private List<CEnum> enums = new List<CEnum>();
+        private List<CFunction> functionPointers = new List<CFunction>();
 
         public CFile(String fileName)
         {
@@ -48,6 +104,12 @@ namespace Scripts
                         finalName += name[i];
                 }
 
+                /*
+                 * This fixes the same file name for the xmlnode struct and the xmlnode.h file.
+                 */ 
+                if (finalName == "Xmlnode")
+                    return "XMLNodeClass";
+
                 return finalName;
             }
         }
@@ -62,14 +124,45 @@ namespace Scripts
             get { return functions; }
         }
 
+        public List<CFunction> FunctionPointers
+        {
+            get { return functionPointers; }
+        }
+
+        public List<CEnum> Enums
+        {
+            get { return enums; }
+        }
+
         public void addStruct(CStruct structToAdd)
         {
             structs.Add(structToAdd);
+            Logger.Log("Added structure [" + structToAdd.ToString() + "] to file [" + this.ToString() + "].");
         }
 
         public void addFunction(CFunction function)
         {
+            function.File = this;
             functions.Add(function);
+            Logger.Log("Added function [" + function.ToString() + "] to file [" + this.ToString() + "].");
         }
+
+        public void addFunctionPointer(CFunction function)
+        {
+            functionPointers.Add(function);
+            Logger.Log("Added function pointer [" + function.ToString() + "] to file [" + this.ToString() + "].");
+        }
+
+        public void AddEnum(CEnum enumeration)
+        {
+            enums.Add(enumeration);
+            Logger.Log("Added enum [" + enumeration.ToString() + "] to file [" + this.ToString() + "].");
+        }
+
+        public override string ToString()
+        {
+            return this.FileName;
+        }
+
     }
 }
============================================================
--- libpurple/wrapper/generator/CFunction.cs	bfc9611e35852d6b8281d8c3cc91a795456dff21
+++ libpurple/wrapper/generator/CFunction.cs	b8292ba6ba8e9335d6c246bacd22c7b8c5a8a9c7
@@ -5,24 +5,14 @@ namespace Scripts
 {
     class CFunction : CTyped
     {
-        private String name;
         private List<CArgument> arguments = new List<CArgument>();
+        private bool isFunctionPointer = false;
 
-        public CFunction(String returnType, String name)
+        public CFunction(CFile file, String returnType, String name)
+            : base(file, returnType, name)
         {
-            this.name = name;
-            this.Type = returnType;
         }
 
-        public String Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-
-
-
-
         public void AddArgument(CArgument argument)
         {
             arguments.Add(argument);
@@ -36,6 +26,12 @@ namespace Scripts
             }
         }
 
+        public bool IsFunctionPointer
+        {
+            get { return isFunctionPointer; }
+            set { isFunctionPointer = true; }
+        }
+
         public override string ToString()
         {
             String str = this.Type + " " + this.Name + "(";
@@ -55,7 +51,7 @@ namespace Scripts
         public string GetCSharpPrivateFunction()
         {
             String str = "";
-            str += this.CSharpPrivateType + " " + this.Name + "(";
+            str += this.CSharpPrivateType + " " + this.SafeName + "(";
 
             for (int i = 0; i < this.Arguments.Count; i++)
             {
@@ -69,15 +65,15 @@ namespace Scripts
             return str;
         }
 
-        public string GetCSharpPublicFunction(String className)
+        public string GetCSharpPublicFunction()
         {
             String str = "";
 
-            String modifiedName = this.Name.ToLower();
+            String modifiedName = this.SafeName.ToLower();
             if (modifiedName.StartsWith("purple_"))
                 modifiedName = modifiedName.Substring(7);
-            if (modifiedName.StartsWith(className.ToLower() + "_"))
-                modifiedName = modifiedName.Substring(className.Length + 1);
+            if (modifiedName.StartsWith(this.File.FileNameAsClassName.ToLower() + "_"))
+                modifiedName = modifiedName.Substring(this.File.FileNameAsClassName.Length + 1);
 
             String finalName = "";
             finalName += Char.ToUpper(modifiedName[0]);
============================================================
--- libpurple/wrapper/generator/CStruct.cs	9ae6da17259101affc79f2c3a54eb82ebb8f525d
+++ libpurple/wrapper/generator/CStruct.cs	3b5ff6ab57ba1731319ba77c2900f07160b55ffa
@@ -3,22 +3,16 @@ namespace Scripts
 
 namespace Scripts
 {
-    class CStruct
+    class CStruct : CNamed
     {
-        private String name;
         private List<CArgument> fields = new List<CArgument>();
 
-        public CStruct(String name)
+        public CStruct(CFile file, String name) :
+            base(file, name)
         {
-            this.name = name;
+            
         }
 
-        public String Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-
         public List<CArgument> Fields
         {
             get { return fields; }
============================================================
--- libpurple/wrapper/generator/CTyped.cs	24695cf8982ac835c63776e355cc6f87f15225e1
+++ libpurple/wrapper/generator/CTyped.cs	c7f8bd354cdf9ba56ac0d0db935993b787ac3b4f
@@ -5,24 +5,64 @@ namespace Scripts
 
 namespace Scripts
 {
-    class CTyped
+    class CTyped : CNamed
     {
         private string type;
+        private bool isArray;
 
+        public enum TypeCategory
+        {
+            Void,
+            DateTime,
+            Native,
+            PointerToKnownStruct,
+            VoidPointer,
+            GObjectObject,
+            InnerStruct,
+            PointerToUnknownStruct,
+            Unknown,
+            KnownEnum,
+            KnownFunctionPointer,
+            KnownFunction,
+            KnownStruct,
+            KnownArgument
+        };
+
+
+        public CTyped(CFile file, String type, String name)
+            : base(file, name)
+        {
+            this.Type = type;
+        }
+
         public String Type
         {
             get { return type; }
             set { type = value; }
         }
 
+        public bool IsArray
+        {
+            get { return isArray; }
+            set { isArray = value; }
+        }
+
         public String RawType
         {
             get
             {
-                if (this.Type.Contains(" "))
-                    return this.Type.Substring(0, type.IndexOf(" "));
+                String fullType = this.Type;
+
+                if (fullType.StartsWith("const"))
+                    fullType = fullType.Substring(("const").Length).Trim();
+                
+                if (fullType.StartsWith("unsigned"))
+                    fullType = fullType.Substring(("unsigned").Length).Trim();
+
+                if (fullType.Contains(" "))
+                    return fullType.Substring(0, fullType.IndexOf(" "));
                 else
-                    return this.Type;
+                    return fullType;
             }
         }
 
@@ -30,7 +70,7 @@ namespace Scripts
         {
             get
             {
-                if (this.Type != null && (this.Type.EndsWith("*") || this.Type == "gpointer"))
+                if (this.Type != null && (this.Type.EndsWith("*") || this.Type == "gpointer" || this.Type == "gconstpointer"))
                     return true;
                 else
                     return false;
@@ -70,21 +110,165 @@ namespace Scripts
             }
         }
 
+        public bool IsTypeTime
+        {
+            get
+            {
+                if (this.Type == "time_t")
+                    return true;
+                else
+                    return false;
+            }
+        }
+
+        public CNamed ResolvedType
+        {
+            get
+            {
+                return CFile.LookUpName(this.RawType);
+            }
+        }
+
+        public TypeCategory Category
+        {
+            get
+            {
+                if (this.IsTypeNative)
+                    return TypeCategory.Native;
+                else if (this.Type == "void *" || this.Type == "gpointer" || this.Type == "gconstpointer")
+                    return TypeCategory.VoidPointer;
+                else if (this.IsTypeVoid)
+                    return TypeCategory.Void;
+                else if (this.IsTypeTime)
+                    return TypeCategory.DateTime;
+                else if (this.Type == "GObject" || this.Type == "GObjectClass" || this.Type == "GType" || this.Type == "GCallback" || this.Type == "GSourceFunc")
+                    return TypeCategory.GObjectObject;
+                else if (this.Type == "struct" || this.Type == "union")
+                    return TypeCategory.InnerStruct;
+                else
+                {
+                    CNamed resolvedType = this.ResolvedType;
+
+                    if (resolvedType != null)
+                    {
+                        if (resolvedType is CEnum)
+                            return TypeCategory.KnownEnum;
+                        else if (resolvedType is CArgument)
+                            return TypeCategory.KnownArgument;
+                        else if (resolvedType is CFunction)
+                        {
+                            if (((CFunction)resolvedType).IsFunctionPointer)
+                                return TypeCategory.KnownFunctionPointer;
+                            else
+                                return TypeCategory.KnownFunction;
+                        }
+                        else if (resolvedType is CStruct)
+                        {
+                            if (this.IsTypePointer)
+                                return TypeCategory.PointerToKnownStruct;
+                            else
+                                return TypeCategory.KnownStruct;
+                        }
+                        else
+                            return TypeCategory.Unknown;
+                    }
+                    else
+                    {
+                        if (this.IsTypePointer)
+                            return TypeCategory.PointerToUnknownStruct;
+                        else
+                            return TypeCategory.Unknown;
+                    }
+                }
+
+
+            }
+        }
+
         public String CSharpPrivateType
         {
             get
             {
                 String str = "";
 
+                switch (this.Category)
+                {
+                    case TypeCategory.Native:
+                        str = this.NativeType;
+                        break;
+
+                    case TypeCategory.PointerToKnownStruct:
+                    case TypeCategory.PointerToUnknownStruct:
+                    case TypeCategory.VoidPointer:
+                    case TypeCategory.GObjectObject:
+                        str = "IntPtr";
+                        break;
+
+                    case TypeCategory.Void:
+                        str = "void";
+                        break;
+
+                    case TypeCategory.DateTime:
+                        str = "ulong";
+                        break;
+
+                    case TypeCategory.InnerStruct:
+                        throw new UnableToCreateWrapperException("The struct contains an inner-struct or innter-union and cannot be automatically wrapped.");
+                        break;
+
+                    case TypeCategory.KnownStruct:
+                        throw new UnableToCreateWrapperException("The struct contains an object that resolves to a function that is not a function pointer (" + this.ToString() + ").");
+                        break;
+
+                    case TypeCategory.KnownEnum:
+                        {
+                            CEnum resolvedEnum = (CEnum)this.ResolvedType;
+                            str = resolvedEnum.File.FileNameAsClassName + "." + resolvedEnum.Name;
+                        }
+                        break;
+
+                    default:
+                        throw new UnableToCreateWrapperException("The type could not be resolved (" + this.ToString() + ").");
+                        break;
+                }
+
+                /*
                 if (this.IsTypeNative)
-                    str += this.NativeType;
+                    str = this.NativeType;
                 else if (this.IsTypePointer)
-                    str += "IntPtr";
+                    str = "IntPtr";
                 else if (this.IsTypeVoid)
-                    str += "void";
+                    str = "void";
+                else if (this.IsTypeTime)
+                    str = "ulong";
+                else if (this.Type == "GObject" || this.Type == "GObjectClass" || this.Type == "GType" || this.Type == "GCallback" || this.Type == "GSourceFunc")
+                    str = "IntPtr";  // TODO: Find out if this is the correct typecast (or even if this works)...
+                else if (this.Type == "struct" || this.Type == "union")
+                    throw new UnableToCreateWrapperException("The struct contains an inner-struct or innter-union and cannot be automatically wrapped.");
                 else
-                    str += "UNKNOWN";
+                {
+                    CNamed resolvedType = CFile.LookUpName(this.Type);
 
+                    if (resolvedType is CFunction)
+                    {
+                        if (((CFunction)resolvedType).IsFunctionPointer)
+                            str = "IntPtr";
+                        else
+                            throw new UnableToCreateWrapperException("The struct contains an object that resolves to a function that is not a function pointer (" + this.ToString() + ").");
+                    }
+                    else if (resolvedType is CEnum)
+                    {
+                        CEnum resolvedEnum = (CEnum)resolvedType;
+                        str = resolvedEnum.File.FileNameAsClassName + "." + resolvedEnum.Name;
+                    }
+                    else
+                        throw new UnableToCreateWrapperException("The type could not be resolved (" + this.ToString() + ").");
+                }
+                */
+
+                if (this.IsArray)
+                    str += "[]";
+
                 return str;
             }
         }
@@ -93,15 +277,50 @@ namespace Scripts
         {
             get
             {
-                String str = "";
+                String str;
 
                 if (this.IsTypeNative)
-                    str += this.NativeType;
-                else if (this.Type == "void *" || this.Type == "gpointer")
-                    str += "IntPtr";
+                    str = this.NativeType;
+                else if (this.Type == "void *" || this.Type == "gpointer" || this.Type == "gconstpointer")
+                    str = "IntPtr";
+                else if (this.IsTypeTime)
+                    str = "DateTime";
+                else if (this.IsTypeVoid)
+                    str = "void";
+                else if (this.Type == "GObject" || this.Type == "GObjectClass" || this.Type == "GType" || this.Type == "GCallback" || this.Type == "GSourceFunc")
+                    str = "/* libgobject */ IntPtr";  // TODO: Find out if this is the correct typecast (or even if this works)...
+                else if (this.Type == "struct" || this.Type == "union")
+                    throw new UnableToCreateWrapperException("The struct contains an inner-struct or innter-union and cannot be automatically wrapped.");
                 else
-                    str += this.RawType;
+                {
+                    CNamed resolvedType = CFile.LookUpName(this.RawType);
 
+                    if (resolvedType is CFunction)
+                    {
+                        if (((CFunction)resolvedType).IsFunctionPointer)
+                            throw new UnableToCreateWrapperException("The struct contains an object that resolves to a function pointer (" + this.ToString() + ").");
+                        else
+                            throw new UnableToCreateWrapperException("The struct contains an object that resolves to a function that is not a function pointer (" + this.ToString() + ").");
+                    }
+                    else if (resolvedType is CEnum)
+                    {
+                        CEnum resolvedEnum = (CEnum)resolvedType;
+                        str = resolvedEnum.File.FileNameAsClassName + "." + resolvedEnum.Name;
+                    }
+                    else if (resolvedType is CStruct)
+                    {
+                        if (this.IsTypePointer)
+                            str = this.RawType;
+                        else
+                            throw new UnableToCreateWrapperException("The type resolved to a known struct but not a pointer to that struct (" + this.ToString() + ").");
+                    }
+                    else
+                        throw new UnableToCreateWrapperException("The type could not be resolved (" + this.ToString() + ").");
+                }
+
+                if (this.IsArray)
+                    str += "[]";
+
                 return str;
             }
         }
@@ -122,6 +341,7 @@ namespace Scripts
 
                     case "uint8":
                     case "unsigned char":
+                    case "guchar":
                         return "byte";
 
                     case "gchar *":
@@ -131,11 +351,13 @@ namespace Scripts
                     case "gint":
                     case "int":
                     case "gint32":
+                    case "PurplePluginPriority":   /* by typedef */
                         return "int";
 
                     case "guint":
                     case "unsigned int":
                     case "guint32":
+                    case "PurpleCmdId":            /* by typedef */
                         return "uint";
 
                     case "gshort":
@@ -151,11 +373,14 @@ namespace Scripts
                     case "glong":
                     case "long":
                     case "gint64":
+                    case "gssize":
+                    case "goffset":
                         return "long";
 
                     case "gulong":
                     case "unsigned long":
                     case "guint64":
+                    case "gsize":
                         return "ulong";
 
                     case "gfloat":
@@ -165,11 +390,19 @@ namespace Scripts
                     case "gdouble":
                     case "double":
                         return "double";
+
+                    case "size_t":
+                        if (IntPtr.Size == 4) return "uint";
+                        else return "ulong";
                 }
 
                 return null;
             }
         }
 
+        public override string ToString()
+        {
+            return "Type: " + this.Type + ", Name: " + this.Name;
+        }
     }
 }
============================================================
--- libpurple/wrapper/generator/Program.cs	805ab943d4786b1c4380d8e8d8e025cfed29b282
+++ libpurple/wrapper/generator/Program.cs	1a75ff8bde8d8d64e9adb8dc5cddb79eb346c85b
@@ -9,13 +9,25 @@ namespace Scripts
             WrapperGenerator wrapperGen = new WrapperGenerator();
 
             Console.WriteLine("Parsing .h files...");
-            wrapperGen.ParseHFilesInDirectory(@"C:\Users\Wade\Desktop\fullOA\OABuild\libpurple");
+            wrapperGen.ParseHFilesInDirectory(@"C:\Users\Wade\Desktop\pidgin-src\im.pidgin.soc.2009.penguin.visualstudio\libpurple");
+            //wrapperGen.ParseHFile(@"C:\Users\Wade\Desktop\pidgin-src\im.pidgin.soc.2009.penguin.visualstudio\libpurple\plugin.h");
 
             Console.WriteLine("Writing struct data...");
             wrapperGen.GenerateStructFiles();
 
             Console.WriteLine("Writing function data...");
             wrapperGen.GenerateFunctionWrappers();
+
+            Console.WriteLine("Writing base classes and visual studio project file...");
+            wrapperGen.WriteVisualStudioProjectFile();
+            wrapperGen.WriteBaseClasses();
+
+            Logger.CloseLog();
+
+            Console.WriteLine("Finished!");
+            Console.ReadLine();
+
+
         }
     }
 }
============================================================
--- libpurple/wrapper/generator/WrapperGenerator.cs	77ace5e9a3c915964add3db40edf462ba15888e9
+++ libpurple/wrapper/generator/WrapperGenerator.cs	c4d20be7d65d762e3cdceb4b49b9bcf8f81e2e12
@@ -1,292 +1,547 @@ using System.IO;
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Text;
 using System.Text.RegularExpressions;
 
 namespace Scripts
 {
     class WrapperGenerator
     {
-        private List<CFile> files = new List<CFile>();
         private String path = @"C:\Users\Wade\Desktop\gen-test\";
 
-        public void ParseHFilesInDirectory(String path)
+        public void ParseHFilesInDirectory(String directory)
         {
-            DirectoryInfo directionryInfo = new DirectoryInfo(path);
+            DirectoryInfo directionryInfo = new DirectoryInfo(directory);
             FileInfo[] fileInfos = directionryInfo.GetFiles("*.h");
 
-            
-            Regex structRegex = new Regex(@"struct \s+ (?<StructName>\w+?) \s* \{ (?<StructInternal>.*?) \} \s* ;", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
-            Regex structInternalRegex = new Regex(@"(?<VariableType> ( \w+ \s+ [\*]+ ) | ( \w+ \s+) )" +
-                                                  @"(  ( \( \* (?<Name> \w+ ) \) \s* \( (?<FunctionPointerArguments> .*?) \) )" +
-                                                  @"    |  (?<Name> .*? ) ) ;", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
-
-            Regex functionRegEx = new Regex(@"(?<ReturnType> ( \w+ \s+ [\*]+ ) | ( \w+ \s+)  ) (?<Name>\w+?) \s* \( (?<ParameterList> [^\)]*) \)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
-            Regex functionArgumentsRegEx = new Regex(@"(?<VariableType> ( \w+ \s+ [\*]+ ) | ( \w+ \s+)  ) (?<VariableName>\w+)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
-
-            Regex commentRegex = new Regex(@"(?<Comment> /\* .*? \*/)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
-
             foreach (FileInfo fileInfo in fileInfos)
             {
                 if (fileInfo.Name == "internal.h" || fileInfo.Name == "dbus.h" || fileInfo.Name == "dbus-bindings.h" ||
                     fileInfo.Name == "dbus-maybe.h" || fileInfo.Name == "dbus-define-api.h" || fileInfo.Name == "dbus-purple.h" ||
                     fileInfo.Name == "dbus-server.h" || fileInfo.Name == "dbus-useful.h" || fileInfo.Name == "gaim-compat.h" ||
                     fileInfo.Name == "media-gst.h")
+                {
                     continue;
+                }
 
+                ParseHFile(fileInfo.FullName);
+            }
+        }
 
-                StreamReader reader = new StreamReader(fileInfo.FullName);
-                String fullFile = reader.ReadToEnd();
-                reader.Close();
 
+        public void ParseHFile(String path)
+        {
+            Regex structRegex =         new Regex(@"struct \s+ (?<StructName> \w+ ) \s* " +
+                                                  @"\{ " +
+                                                  @"      (?<StructInternal>.*?) " +
+                                                  @"\} \s* (\w+ \s*)? ;",
+                                                  RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
 
-                CFile currentFile = new CFile(fileInfo.Name);
+            Regex structInternalRegex = new Regex(@"(?<VariableType>   " +
+                                                  @"      ( const \s+ unsigned \s+ \w+ \s+ [\*]+ )    |" +
+                                                  @"      ( const \s+ unsigned \s+ \w+ \s+       )    |" +
+                                                  @"      ( const \s+              \w+ \s+ [\*]+ )    |" +
+                                                  @"      ( const \s+              \w+ \s+       )    |" +
+                                                  @"      (           unsigned \s+ \w+ \s+ [\*]+ )    |" +
+                                                  @"      (           unsigned \s+ \w+ \s+       )    |" +
+                                                  @"      (                        \w+ \s+ [\*]+ )    |" +
+                                                  @"      (                        \w+ \s+       )     " +
+                                                  @")" +
+                                                  @"(  ( \( \* (?<Name> \w+ ) \) \s* \( (?<FunctionPointerArguments> .*?) \) )" +
+                                                  @"    |  (?<Name> .*? ) ) ;", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
 
-                foreach (Match commentMatch in commentRegex.Matches(fullFile))
-                {
-                    fullFile = fullFile.Remove(
-                        fullFile.IndexOf(commentMatch.Groups["Comment"].Value),
-                        commentMatch.Groups["Comment"].Length);
-                }
+            Regex functionRegEx =
+                new Regex(@"(?<ReturnType> " +
+                          @"     ( unsigned \s+ \w+ \s* [\*]+ \s* )     | " +
+                          @"     ( unsigned \s+ \w+ \s+           )     | " +
+                          @"     (              \w+ \s* [\*]+ \s* )     | " +
+                          @"     (              \w+ \s+           )       " +
+                          @")" +
+                          @"(?<Name>\w+?) \s* \( (?<ParameterList> [a-zA-Z0-9_,\* ]*) \)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
+            
+            Regex functionArgumentsRegEx =
+                new Regex(@"(?<VariableType> " +
+                          @"     ( const unsigned \s+ \w+ \s* [\*]+ \s* )     | " +
+                          @"     ( const unsigned \s+ \w+ \s+           )     | " +
+                          @"     ( const              \w+ \s* [\*]+ \s* )     | " +
+                          @"     ( const              \w+ \s+           )     | " +
+                          @"     (       unsigned \s+ \w+ \s* [\*]+ \s* )     | " +
+                          @"     (       unsigned \s+ \w+ \s+           )     | " +
+                          @"     (                    \w+ \s* [\*]+ \s* )     | " +
+                          @"     (                    \w+ \s+           )       " +
+                          @") " +
+                          @"(?<VariableName> (\w | \[ | \])* )",
+                          RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
 
-                foreach (Match match in structRegex.Matches(fullFile))
-                {
-                    CStruct structObject = new CStruct(match.Groups["StructName"].Value);
-                    if (structObject.Name.Length > 0 && structObject.Name[0] == '_')
-                        structObject.Name = structObject.Name.Substring(1);
+            Regex commentRegex = new Regex(@"(?<Comment> /\* .*? \*/)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
 
-                    String internalStructData = match.Groups["StructInternal"].Value;
+            Regex enumRegex = new Regex(@"typedef \s+ enum \s* \w* \s* \{ \s* (?<EnumInternalPlusClose> .*? \s* \} ) \s* (?<Name> \w+ ) \s* ;", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
+            Regex enumInternalRegex = new Regex(@"(?<Name> \w+ ) \s* ( = \s* (?<Value> .+?) )? \s* (, | \})", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
 
-                    if (internalStructData != null)
+            Regex functionPointerRegex = new Regex(@"typedef \s* (?<ReturnType> \w* ) \s* \( \* (?<Name> \w* ) \) \s* \( (?<FunctionPointerArguments> .*?) \);", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
+
+
+            FileInfo fileInfo = new FileInfo(path);
+            StreamReader reader = new StreamReader(fileInfo.FullName);
+            String fullFile = reader.ReadToEnd();
+            reader.Close();
+
+
+            CFile currentFile = new CFile(fileInfo.Name);
+
+            foreach (Match commentMatch in commentRegex.Matches(fullFile))
+            {
+                fullFile = fullFile.Remove(
+                    fullFile.IndexOf(commentMatch.Groups["Comment"].Value),
+                    commentMatch.Groups["Comment"].Length);
+            }
+
+            foreach (Match match in structRegex.Matches(fullFile))
+            {
+                Logger.Log("Reading struct [" + match.Groups[0].Value + "]...");
+                CStruct structObject = new CStruct(currentFile, match.Groups["StructName"].Value);
+
+                String internalStructData = match.Groups["StructInternal"].Value;
+
+                if (internalStructData != null)
+                {
+                    foreach (Match internalStructMatch in structInternalRegex.Matches(internalStructData))
                     {
-                        foreach (Match internalStructMatch in structInternalRegex.Matches(internalStructData))
-                        {
-                            string elementType = internalStructMatch.Groups["VariableType"].Value.Trim();
-                            string name = internalStructMatch.Groups["Name"].Value;
+                        Logger.Log("Reading struct element: [" + internalStructMatch.Groups[0].Value + "]...");
+                        string elementType = internalStructMatch.Groups["VariableType"].Value.Trim();
+                        string name = internalStructMatch.Groups["Name"].Value;
 
-                            CArgument argument = new CArgument(elementType, name);
+                        CArgument argument = new CArgument(currentFile, elementType, name);
 
-                            string functionPointerArguments = internalStructMatch.Groups["FunctionPointerArguments"].Value;
-                            if (functionPointerArguments != "")
+                        string functionPointerArguments = internalStructMatch.Groups["FunctionPointerArguments"].Value;
+                        if (functionPointerArguments != "")
+                        {
+                            argument.IsFunctionPointer = true;
+
+                            String[] functionPointerArgumentsList = functionPointerArguments.Split(',');
+                            foreach (String functionPointerArgument in functionPointerArgumentsList)
                             {
-                                argument.IsFunctionPointer = true;
+                                String currentArgument = functionPointerArgument.Replace("const ", "").Trim();
 
-                                String[] functionPointerArgumentsList = functionPointerArguments.Split(',');
-                                foreach (String functionPointerArgument in functionPointerArgumentsList)
+                                CArgument functionPointerArgumentObject = new CArgument(currentFile);
+                                if (currentArgument == "void")
+                                    continue;
+                                else
                                 {
-                                    String currentArgument = functionPointerArgument.Replace("const ", "").Trim();
+                                    Match parameterMatch = functionArgumentsRegEx.Match(currentArgument);
+                                    functionPointerArgumentObject.Type = parameterMatch.Groups["VariableType"].Value.Trim();
+                                    functionPointerArgumentObject.Name = parameterMatch.Groups["VariableName"].Value;
 
-                                    CArgument functionPointerArgumentObject = new CArgument();
-                                    if (currentArgument == "void")
-                                        continue;
-                                    else
+                                    if (functionPointerArgumentObject.Name.Contains("["))
                                     {
-                                        Match parameterMatch = functionArgumentsRegEx.Match(currentArgument);
-                                        functionPointerArgumentObject.Type = parameterMatch.Groups["VariableType"].Value.Trim();
-                                        functionPointerArgumentObject.Name = parameterMatch.Groups["VariableName"].Value;
+                                        // TODO: Array size (eg: "char hostname[256]")
+                                        functionPointerArgumentObject.IsArray = true;
+                                        functionPointerArgumentObject.Name = functionPointerArgumentObject.Name.Substring(functionPointerArgumentObject.Name.IndexOf("["));
                                     }
+                                }
 
-                                    argument.AddFunctionPointerArgument(functionPointerArgumentObject);
-                                }
+                                argument.AddFunctionPointerArgument(functionPointerArgumentObject);
                             }
+                        }
 
-                            structObject.AddField(argument);
-                        }
+                        structObject.AddField(argument);
                     }
+                }
 
-                    //Console.WriteLine(structObject.ToString());
-                    currentFile.addStruct(structObject);
-                }
+                //Console.WriteLine(structObject.ToString()); Console.WriteLine();
+                currentFile.addStruct(structObject);
+            }
 
-                foreach (Match match in functionRegEx.Matches(fullFile))
+            foreach (Match match in functionRegEx.Matches(fullFile))
+            {
+                Logger.Log("Reading function [" + match.Groups[0].Value + "]...");
+                String functionReturnType = match.Groups["ReturnType"].Value.Trim();
+                String functionName = match.Groups["Name"].Value;
+                String parameterList = match.Groups["ParameterList"].Value;
+
+
+                /* There's a few messy #define's for PURPLE_INIT_PLUGIN that yields some false
+                 * matches... so we throw them out. */
+                if (currentFile.FileName == "plugin.h")
                 {
-                    String functionReturnType = match.Groups["ReturnType"].Value.Trim();
-                    String functionName = match.Groups["Name"].Value;
-                    String parameterList = match.Groups["ParameterList"].Value;
+                    if (functionName == "_FUNC_NAME" || functionName == "purple_init_plugin")
+                        continue;
 
-                    if (functionReturnType == "typedef" || functionReturnType == "define")
+                    if (functionReturnType == "return")
                         continue;
+                }
 
+                if (functionReturnType == "typedef" || functionReturnType == "define")
+                    continue;
 
-                    CFunction function = new CFunction(functionReturnType, functionName);
 
-                    String[] functionParameters = parameterList.Split(',');
-                    foreach (String functionParameterInList in functionParameters)
+                CFunction function = new CFunction(currentFile, functionReturnType, functionName);
+
+                String[] functionParameters = parameterList.Split(',');
+                foreach (String functionParameterInList in functionParameters)
+                {
+                    String functionParameter = functionParameterInList.Replace("const ", "").Trim();
+
+                    CArgument argument = new CArgument(currentFile);
+                    if (functionParameter == "...")
                     {
-                        String functionParameter = functionParameterInList.Replace("const ", "").Trim();
+                        argument.IsEllipsis = true;
+                    }
+                    else if (functionParameter == "void")
+                        continue;
+                    else
+                    {
+                        Match parameterMatch = functionArgumentsRegEx.Match(functionParameter);
+                        argument.Type = parameterMatch.Groups["VariableType"].Value.Trim();
+                        argument.Name = parameterMatch.Groups["VariableName"].Value;
 
-                        CArgument argument = new CArgument();
-                        if (functionParameter == "...")
+                        if (argument.Name.EndsWith("[]"))
                         {
-                            argument.IsEllipsis = true;
+                            argument.Name = argument.Name.Substring(0, argument.Name.Length - 2);
+                            argument.IsArray = true;
                         }
-                        else if (functionParameter == "void")
+                    }
+
+                    function.AddArgument(argument);
+                }
+
+                currentFile.addFunction(function);
+                //Console.WriteLine(function.ToString());
+                //Console.WriteLine(function.GetCSharpPrivateFunction());
+                //Console.WriteLine(function.GetCSharpPublicFunction());
+                //Console.WriteLine();
+            }
+
+            foreach (Match match in enumRegex.Matches(fullFile))
+            {
+                Logger.Log("Reading enum [" + match.Groups[0].Value + "]...");
+                CEnum enumeration = new CEnum(currentFile, match.Groups["Name"].Value);
+
+                foreach (Match enumElementMatch in enumInternalRegex.Matches(match.Groups["EnumInternalPlusClose"].Value))
+                {
+                    Logger.Log("Reading enum element [" + enumElementMatch.Groups[0].Value + "]...");
+                    enumeration.AddElement(enumElementMatch.Groups["Name"].Value, enumElementMatch.Groups["Value"].Value);
+                }
+
+                currentFile.AddEnum(enumeration);
+                //Console.WriteLine(enumeration.ToString());
+            }
+
+
+            foreach (Match match in functionPointerRegex.Matches(fullFile))
+            {
+                Logger.Log("Reading function pointer [" + match.Groups[0].Value + "]...");
+                CFunction function = new CFunction(currentFile, match.Groups["ReturnType"].Value, match.Groups["Name"].Value);
+                function.IsFunctionPointer = true;
+
+                string functionPointerArguments = match.Groups["FunctionPointerArguments"].Value;
+                if (functionPointerArguments != "")
+                {
+                    String[] functionPointerArgumentsList = functionPointerArguments.Split(',');
+                    foreach (String functionPointerArgument in functionPointerArgumentsList)
+                    {
+                        String currentArgument = functionPointerArgument.Replace("const ", "").Trim();
+
+                        CArgument functionPointerArgumentObject = new CArgument(currentFile);
+                        if (currentArgument == "void")
                             continue;
                         else
                         {
-                            Match parameterMatch = functionArgumentsRegEx.Match(functionParameter);
-                            argument.Type = parameterMatch.Groups["VariableType"].Value.Trim();
-                            argument.Name = parameterMatch.Groups["VariableName"].Value;
+                            Match parameterMatch = functionArgumentsRegEx.Match(currentArgument);
+                            functionPointerArgumentObject.Type = parameterMatch.Groups["VariableType"].Value.Trim();
+                            functionPointerArgumentObject.Name = parameterMatch.Groups["VariableName"].Value;
                         }
 
-                        function.AddArgument(argument);
+                        function.AddArgument(functionPointerArgumentObject);
                     }
-
-                    currentFile.addFunction(function);
-                    //Console.WriteLine(function.ToString());
-                    //Console.WriteLine(function.GetCSharpPrivateFunction());
-                    //Console.WriteLine(function.GetCSharpPublicFunction());
-                    //Console.WriteLine();
                 }
 
-                files.Add(currentFile);
+                currentFile.addFunctionPointer(function);
+                //Console.WriteLine(function.ToString());
             }
+
+            CFile.FileCollection.Add(currentFile);
         }
 
-        private void WriteCommentHeader(StreamWriter writer)
+        public void WriteBaseClasses()
         {
-            writer.WriteLine("/* purple");
-            writer.WriteLine(" *");
-            writer.WriteLine(" * Purple is the legal property of its developers, whose names are too numerous");
-            writer.WriteLine(" * to list here.  Please refer to the COPYRIGHT file distributed with this");
-            writer.WriteLine(" * source distribution.");
-            writer.WriteLine(" *");
-            writer.WriteLine(" * This program is free software; you can redistribute it and/or modify");
-            writer.WriteLine(" * it under the terms of the GNU General Public License as published by");
-            writer.WriteLine(" * the Free Software Foundation; either version 2 of the License, or");
-            writer.WriteLine(" * (at your option) any later version.");
-            writer.WriteLine(" *");
-            writer.WriteLine(" * This program is distributed in the hope that it will be useful,");
-            writer.WriteLine(" * but WITHOUT ANY WARRANTY; without even the implied warranty of");
-            writer.WriteLine(" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the");
-            writer.WriteLine(" * GNU General Public License for more details.");
-            writer.WriteLine(" *");
-            writer.WriteLine(" * You should have received a copy of the GNU General Public License");
-            writer.WriteLine(" * along with this program; if not, write to the Free Software");
-            writer.WriteLine(" * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA");
-            writer.WriteLine(" */");
+            StreamWriter writer = new StreamWriter(path + "UnmanagedWrapper.cs");
+            
+            writer.WriteLine("using System;");
             writer.WriteLine();
-            writer.WriteLine("/*");
-            writer.WriteLine(" * This file was auto-generated from the libpurple header files to provide a");
-            writer.WriteLine(" * clean interface between .NET/CLR and the unmanaged C library, libpurple.");
-            writer.WriteLine(" *");
-            writer.WriteLine(" * This code isn't complete, but completely a work in progress. :)");
-            writer.WriteLine(" * Three major things left:");
-            writer.WriteLine(" *  - Resolve the remaining UNKNOWN types.");
-            writer.WriteLine(" *  - Handle translation between delegate and function pointers.");
-            writer.WriteLine(" *  - Fill in the translation between public .NET class calls and private DllImport[] calls.");
-            writer.WriteLine(" */");
+            writer.WriteLine("namespace UnmanagedWrapper");
+            writer.WriteLine("{");
+            writer.WriteLine("    public abstract class UnmanagedWrapper<T>");
+            writer.WriteLine("    {");
+            writer.WriteLine("        private T data;");
+            writer.WriteLine("        private IntPtr reference;");
             writer.WriteLine();
+            writer.WriteLine("        public Type GetUnmanagedType() { return typeof(T); }");
+            writer.WriteLine();
+            writer.WriteLine("        public IntPtr Reference");
+            writer.WriteLine("        {");
+            writer.WriteLine("            get { return reference; }");
+            writer.WriteLine("            set { reference = value; }");
+            writer.WriteLine("        }");
+            writer.WriteLine();
+            writer.WriteLine("        public T Data");
+            writer.WriteLine("        {");
+            writer.WriteLine("            get { return data; }");
+            writer.WriteLine("            set { data = value; }");
+            writer.WriteLine("        }");
+            writer.WriteLine("    }");
+            writer.WriteLine("}");
+            writer.WriteLine();
 
+            writer.Close();
+        }
 
+        public void WriteVisualStudioProjectFile()
+        {
+            StreamWriter writer = new StreamWriter(path + "PurpleWrapper.csproj");
 
+            writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+            writer.WriteLine("<Project ToolsVersion=\"3.5\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">");
+            writer.WriteLine("  <PropertyGroup>");
+            writer.WriteLine("    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>");
+            writer.WriteLine("    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>");
+            writer.WriteLine("    <ProductVersion>9.0.30729</ProductVersion>");
+            writer.WriteLine("    <SchemaVersion>2.0</SchemaVersion>");
+            writer.WriteLine("    <ProjectGuid>{8034DEA9-30CC-DEA0-3903-80210CE809FA}</ProjectGuid>");
+            writer.WriteLine("    <OutputType>Exe</OutputType>");
+            writer.WriteLine("    <AppDesignerFolder>Properties</AppDesignerFolder>");
+            writer.WriteLine("    <RootNamespace>Scripts</RootNamespace>");
+            writer.WriteLine("    <AssemblyName>Scripts</AssemblyName>");
+            writer.WriteLine("    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>");
+            writer.WriteLine("    <FileAlignment>512</FileAlignment>");
+            writer.WriteLine("  </PropertyGroup>");
+            writer.WriteLine("  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">");
+            writer.WriteLine("    <DebugSymbols>true</DebugSymbols>");
+            writer.WriteLine("    <DebugType>full</DebugType>");
+            writer.WriteLine("    <Optimize>false</Optimize>");
+            writer.WriteLine("    <OutputPath>bin\\Debug\\</OutputPath>");
+            writer.WriteLine("    <DefineConstants>DEBUG;TRACE</DefineConstants>");
+            writer.WriteLine("    <ErrorReport>prompt</ErrorReport>");
+            writer.WriteLine("    <WarningLevel>4</WarningLevel>");
+            writer.WriteLine("  </PropertyGroup>");
+            writer.WriteLine("  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">");
+            writer.WriteLine("    <DebugType>pdbonly</DebugType>");
+            writer.WriteLine("    <Optimize>true</Optimize>");
+            writer.WriteLine("    <OutputPath>bin\\Release\\</OutputPath>");
+            writer.WriteLine("    <DefineConstants>TRACE</DefineConstants>");
+            writer.WriteLine("    <ErrorReport>prompt</ErrorReport>");
+            writer.WriteLine("    <WarningLevel>4</WarningLevel>");
+            writer.WriteLine("  </PropertyGroup>");
+            writer.WriteLine("  <ItemGroup>");
+            writer.WriteLine("    <Reference Include=\"System\" />");
+            writer.WriteLine("    <Reference Include=\"System.Core\">");
+            writer.WriteLine("      <RequiredTargetFramework>3.5</RequiredTargetFramework>");
+            writer.WriteLine("    </Reference>");
+            writer.WriteLine("  </ItemGroup>");
+            writer.WriteLine("  <ItemGroup>");
+
+            writer.WriteLine("    <Compile Include=\"UnmanagedWrapper.cs\" />");
+            foreach (CFile file in CFile.FileCollection)
+            {
+                writer.WriteLine("    <Compile Include=\"" + file.FileNameAsClassName + ".cs\" />");
+
+                foreach (CStruct structure in file.Structs)
+                {
+                    writer.WriteLine("    <Compile Include=\"" + structure.Name + ".cs\" />");
+                }
+            }
+
+
+            writer.WriteLine("  </ItemGroup>");
+            writer.WriteLine("  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />");
+            writer.WriteLine("</Project>");
+
+            writer.Close();
         }
 
+
+        private String GetCommentHeader()
+        {
+            StringBuilder sb = new StringBuilder();
+
+            sb.AppendLine("/* PurpleWrapper - A .NET (CLR) wrapper for libpurple");
+            sb.AppendLine(" *");
+            sb.AppendLine(" * Purple is the legal property of its developers, whose names are too numerous");
+            sb.AppendLine(" * to list here.  Please refer to the COPYRIGHT file distributed with this");
+            sb.AppendLine(" * source distribution.");
+            sb.AppendLine(" *");
+            sb.AppendLine(" * This program is free software; you can redistribute it and/or modify");
+            sb.AppendLine(" * it under the terms of the GNU General Public License as published by");
+            sb.AppendLine(" * the Free Software Foundation; either version 2 of the License, or");
+            sb.AppendLine(" * (at your option) any later version.");
+            sb.AppendLine(" *");
+            sb.AppendLine(" * This program is distributed in the hope that it will be useful,");
+            sb.AppendLine(" * but WITHOUT ANY WARRANTY; without even the implied warranty of");
+            sb.AppendLine(" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the");
+            sb.AppendLine(" * GNU General Public License for more details.");
+            sb.AppendLine(" *");
+            sb.AppendLine(" * You should have received a copy of the GNU General Public License");
+            sb.AppendLine(" * along with this program; if not, write to the Free Software");
+            sb.AppendLine(" * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA");
+            sb.AppendLine(" */");
+            sb.AppendLine();
+            sb.AppendLine("/*");
+            sb.AppendLine(" * This file was auto-generated from the libpurple header files to provide a");
+            sb.AppendLine(" * clean interface between .NET/CLR and the unmanaged C library libpurple.");
+            sb.AppendLine(" *");
+            sb.AppendLine(" * This is the second major commit of the code.");
+            sb.AppendLine(" * Next things:");
+            sb.AppendLine(" *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).");
+            sb.AppendLine(" *    This program will need to assign these parameters names.");
+            sb.AppendLine(" *  - Function pointers inside structs aren't translated correctly into C#.");
+            sb.AppendLine(" *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser");
+            sb.AppendLine(" *    does not detect them as an array.");
+            sb.AppendLine(" */");
+
+            return sb.ToString();
+        }
+
         public void GenerateStructFiles()
         {
             StreamWriter writer;
-            foreach (CFile file in files)
+            foreach (CFile file in CFile.FileCollection)
             {
                 foreach (CStruct structure in file.Structs)
                 {
-                    writer = new StreamWriter(path + structure.Name + ".cs");
-                    WriteCommentHeader(writer);
+                    StringBuilder structureStringBuilder = new StringBuilder();
 
-                    writer.WriteLine("using System;");
-                    writer.WriteLine("using System.Collections.Generic;");
-                    writer.WriteLine("using System.Runtime.InteropServices;");
-                    writer.WriteLine();
-                    writer.WriteLine("namespace PurpleWrapper");
-                    writer.WriteLine("{");
-                    writer.WriteLine("\tpublic class " + structure.Name + " : UnmanagedWrapper<_" + structure.Name + ">");
-                    writer.WriteLine("\t{");
+                    structureStringBuilder.AppendLine(GetCommentHeader());
 
-                    writer.WriteLine("\t\tpublic " + structure.Name + "()");
-                    writer.WriteLine("\t\t{");
-                    writer.WriteLine("\t\t}");
-                    writer.WriteLine();
+                    structureStringBuilder.AppendLine("using System;");
+                    structureStringBuilder.AppendLine("using System.Collections.Generic;");
+                    structureStringBuilder.AppendLine("using System.Runtime.InteropServices;");
+                    structureStringBuilder.AppendLine();
+                    structureStringBuilder.AppendLine("namespace PurpleWrapper");
+                    structureStringBuilder.AppendLine("{");
+                    structureStringBuilder.AppendLine("\tpublic class " + structure.Name + " : UnmanagedWrapper<_" + structure.Name + ">");
+                    structureStringBuilder.AppendLine("\t{");
 
-                    writer.WriteLine("\t\tpublic " + structure.Name + "(IntPtr refernece)");
-                    writer.WriteLine("\t\t{");
-                    writer.WriteLine("\t\t\tthis.Reference = reference;");
-                    writer.WriteLine("\t\t\tthis.Data = (_" + structure.Name + ")Marshal.PtrToStructure(this.Reference, typeof(_" + structure.Name + "));");
-                    writer.WriteLine("\t\t}");
-                    writer.WriteLine();
 
+                    try
+                    {
+                        StringBuilder sb = new StringBuilder();
 
+                        sb.AppendLine("\t\tpublic " + structure.Name + "()");
+                        sb.AppendLine("\t\t{");
+                        sb.AppendLine("\t\t}");
+                        sb.AppendLine();
 
-                    foreach (CArgument argument in structure.Fields)
-                    {
-                        writer.WriteLine("\t\tpublic " + argument.GetCSharpPublicFunction());
-                        writer.WriteLine("\t\t{");
+                        sb.AppendLine("\t\tpublic " + structure.Name + "(IntPtr refernece)");
+                        sb.AppendLine("\t\t{");
+                        sb.AppendLine("\t\t\tthis.Reference = reference;");
+                        sb.AppendLine("\t\t\tthis.Data = (_" + structure.Name + ")Marshal.PtrToStructure(this.Reference, typeof(_" + structure.Name + "));");
+                        sb.AppendLine("\t\t}");
+                        sb.AppendLine();
 
 
-                        /* get */
-                        writer.WriteLine("\t\t\tget");
-                        writer.WriteLine("\t\t\t{");
-                        if (argument.IsTypeNative)
-                            writer.WriteLine("\t\t\t\treturn this.Data." + argument.Name + ";");
-                        else
-                            writer.WriteLine("\t\t\t\tthrow new NotImplementedException(); /* Non-native type. */");
-                        writer.WriteLine("\t\t\t}");
 
+                        foreach (CArgument argument in structure.Fields)
+                        {
+                            sb.AppendLine("\t\tpublic " + argument.GetCSharpPublicFunction());
+                            sb.AppendLine("\t\t{");
 
-                        /* set */
-                        writer.WriteLine("\t\t\tset");
-                        writer.WriteLine("\t\t\t{");
-                        writer.WriteLine("\t\t\t\tif (this.Reference != IntPtr.Zero)");
-                        writer.WriteLine("\t\t\t\t\tthis.Reference = IntPtr.Zero;");
-                        writer.WriteLine();
 
-                        if (argument.IsTypeNative)
-                            writer.WriteLine("\t\t\t\tthis.Data." + argument.Name + " = value;");
-                        else
-                            writer.WriteLine("\t\t\t\tthrow new NotImplementedException(); /* Non-native type. */");
+                            /* get */
+                            sb.AppendLine("\t\t\tget");
+                            sb.AppendLine("\t\t\t{");
+                            if (argument.IsTypeNative)
+                                sb.AppendLine("\t\t\t\treturn this.Data." + argument.Name + ";");
+                            else
+                                sb.AppendLine("\t\t\t\tthrow new NotImplementedException(); /* Non-native type. */");
+                            sb.AppendLine("\t\t\t}");
 
-                        writer.WriteLine("\t\t\t}");
-                        writer.WriteLine("\t\t}");
-                        writer.WriteLine();
+
+                            /* set */
+                            sb.AppendLine("\t\t\tset");
+                            sb.AppendLine("\t\t\t{");
+                            sb.AppendLine("\t\t\t\tif (this.Reference != IntPtr.Zero)");
+                            sb.AppendLine("\t\t\t\t\tthis.Reference = IntPtr.Zero;");
+                            sb.AppendLine();
+
+                            if (argument.IsTypeNative)
+                                sb.AppendLine("\t\t\t\tthis.Data." + argument.Name + " = value;");
+                            else
+                                sb.AppendLine("\t\t\t\tthrow new NotImplementedException(); /* Non-native type. */");
+
+                            sb.AppendLine("\t\t\t}");
+                            sb.AppendLine("\t\t}");
+                            sb.AppendLine();
+                        }
+
+                        sb.AppendLine("\t}");
+                        sb.AppendLine();
+                        sb.AppendLine();
+
+
+                        sb.AppendLine("\t[StructLayout(LayoutKind.Sequential)]");
+                        sb.AppendLine("\tclass _" + structure.Name);
+                        sb.AppendLine("\t{");
+
+                        foreach (CArgument argument in structure.Fields)
+                        {
+                            sb.AppendLine("\t\t/*");
+                            sb.AppendLine("\t\t * " + argument.ToString());
+                            sb.AppendLine("\t\t */");
+                            sb.AppendLine("\t\t" + argument.GetCSharpPrivateFunction() + ";");
+                            sb.AppendLine();
+                        }
+
+                        sb.AppendLine("\t}");
+
+                        structureStringBuilder.AppendLine(sb.ToString());
                     }
+                    catch (UnableToCreateWrapperException e)
+                    {
+                        Console.WriteLine("Could not generate a wrapper for " + structure.Name + " in file \"" + structure.File.FileName + "\".");
+                        Console.WriteLine("Message: " + e.Message);
 
-                    writer.WriteLine("\t}");
-                    writer.WriteLine();
-                    writer.WriteLine();
+                        structureStringBuilder.AppendLine("\t\t/* ");
+                        structureStringBuilder.AppendLine("\t\t * " + "Could not generate a wrapper for " + structure.Name + " in file \"" + structure.File.FileName + "\".");
+                        structureStringBuilder.AppendLine("\t\t * " + "Message: " + e.Message);
+                        structureStringBuilder.AppendLine("\t\t */");
+                        structureStringBuilder.AppendLine();
 
+                        structureStringBuilder.AppendLine("\t\tpublic " + structure.Name + "()");
+                        structureStringBuilder.AppendLine("\t\t{");
+                        structureStringBuilder.AppendLine("\t\t\tthrow new NotImplementedException();");
+                        structureStringBuilder.AppendLine("\t\t}");
+                        structureStringBuilder.AppendLine();
 
-                    writer.WriteLine("\t[StructLayout(LayoutKind.Sequential)]");
-                    writer.WriteLine("\tclass _" + structure.Name);
-                    writer.WriteLine("\t{");
+                        structureStringBuilder.AppendLine("\t\tpublic " + structure.Name + "(IntPtr refernece)");
+                        structureStringBuilder.AppendLine("\t\t{");
+                        structureStringBuilder.AppendLine("\t\t\tthrow new NotImplementedException();");
+                        structureStringBuilder.AppendLine("\t\t}");
+                        structureStringBuilder.AppendLine();
 
-                    foreach (CArgument argument in structure.Fields)
-                    {
-                        writer.WriteLine("\t\t/*");
-                        writer.WriteLine("\t\t * " + argument.ToString());
-                        writer.WriteLine("\t\t */");
-                        writer.WriteLine("\t\t" + argument.GetCSharpPrivateFunction() + ";");
-                        writer.WriteLine();
+                        structureStringBuilder.AppendLine("\t}");
+                        structureStringBuilder.AppendLine();
+                        structureStringBuilder.AppendLine("\t[StructLayout(LayoutKind.Sequential)]");
+                        structureStringBuilder.AppendLine("\tclass _" + structure.Name + " { }");
                     }
 
-                    writer.WriteLine("\t}");
+                    structureStringBuilder.AppendLine("}");
 
 
-                    writer.WriteLine("}");
-                    writer.WriteLine();
-
+                    writer = new StreamWriter(path + structure.Name + ".cs");
+                    writer.WriteLine(structureStringBuilder.ToString());
                     writer.Close();
 
-
                 }
-
             }
-
         }
 
         public void GenerateFunctionWrappers()
         {
-            foreach (CFile file in files)
+            foreach (CFile file in CFile.FileCollection)
             {
                 StreamWriter writer = new StreamWriter(path + file.FileNameAsClassName + ".cs");
-                WriteCommentHeader(writer);
+                writer.WriteLine(GetCommentHeader());
 
                 writer.WriteLine("using System;");
                 writer.WriteLine("using System.Collections.Generic;");
@@ -298,19 +553,128 @@ namespace Scripts
                 writer.WriteLine("\tpublic class " + file.FileNameAsClassName);
                 writer.WriteLine("\t{");
 
+                foreach (CEnum enumeration in file.Enums)
+                {
+                    enumeration.WriteForCSharp(writer, "\t\t");
+                }
+
+
                 foreach (CFunction function in file.Functions)
                 {
-                    writer.WriteLine("\t\t/*");
-                    writer.WriteLine("\t\t * " + function.ToString());
-                    writer.WriteLine("\t\t */");
-                    writer.WriteLine("\t\t[DllImport(\"libpurple.dll\")]");
-                    writer.WriteLine("\t\tprivate static extern " + function.GetCSharpPrivateFunction() + ";");
-                    writer.WriteLine();
-                    writer.WriteLine("\t\tpublic static " + function.GetCSharpPublicFunction(file.FileNameAsClassName));
-                    writer.WriteLine("\t\t{");
-                    writer.WriteLine("\t\t\tthrow new NotImplementedException();");
-                    writer.WriteLine("\t\t}");
-                    writer.WriteLine();
+                    try
+                    {
+                        StringBuilder sb = new StringBuilder();
+
+                        sb.AppendLine("\t\t/*");
+                        sb.AppendLine("\t\t * " + function.ToString());
+                        sb.AppendLine("\t\t */");
+                        sb.AppendLine("\t\t[DllImport(\"libpurple.dll\")]");
+                        sb.AppendLine("\t\tprivate static extern " + function.GetCSharpPrivateFunction() + ";");
+                        sb.AppendLine();
+                        sb.AppendLine("\t\tpublic static " + function.GetCSharpPublicFunction());
+                        sb.AppendLine("\t\t{");
+
+
+                        String[] functionArgs = new String[function.Arguments.Count];
+                        bool allArgsCanBeUsed = true;
+
+                        for (int i = 0; i < function.Arguments.Count; i++)
+                        {
+                            CArgument arg = function.Arguments[i];
+
+                            switch (arg.Category)
+                            {
+                                case CTyped.TypeCategory.PointerToKnownStruct:
+                                    functionArgs[i] = arg.SafeName + ".Reference";
+                                    break;
+
+                                case CTyped.TypeCategory.Native:
+                                case CTyped.TypeCategory.VoidPointer:
+                                    functionArgs[i] = arg.SafeName;
+                                    break;
+
+                                case CTyped.TypeCategory.DateTime:
+                                    sb.AppendLine("\t\t\tulong _PurpleWrapper_arg" + i + " = (ulong)(" + arg.SafeName + " - new DateTime(1970, 1, 1)).TotalSeconds;");
+                                    functionArgs[i] = "_PurpleWrapper_arg" + i;
+                                    break;
+
+                                default:
+                                    sb.AppendLine("\t\t\t/* Unable to process " + arg.SafeName + ", a " + arg.Category.ToString() + ". */");
+                                    allArgsCanBeUsed = false;
+                                    break;
+                            }
+                        }
+
+
+
+                        if (allArgsCanBeUsed)
+                        {
+                            String functionCall = "";
+                            functionCall = function.Name + "(";
+                            for (int i = 0; i < functionArgs.Length; i++)
+                            {
+                                functionCall += functionArgs[i];
+
+                                if (i != functionArgs.Length - 1)
+                                    functionCall += ", ";
+                            }
+                            functionCall += ")";
+
+
+                            String returnStatement = "";
+                            switch (function.Category)
+                            {
+                                case CTyped.TypeCategory.Void:
+                                    /* No return should be done. */
+                                    returnStatement = functionCall + ";";
+                                    break;
+
+                                case CTyped.TypeCategory.Native:
+                                case CTyped.TypeCategory.VoidPointer:
+                                    /* Simply return the value returned -- it's all native. */
+                                    returnStatement = "return " + functionCall + ";";
+                                    break;
+
+                                case CTyped.TypeCategory.PointerToKnownStruct:
+                                    returnStatement = "return new " + function.RawType + "(" + functionCall + ");";
+                                    break;
+
+                                default:
+                                    sb.AppendLine("\t\t\t/* Unable to process " + function.SafeName + ", a " + function.Category.ToString() + ". */");
+                                    break;
+
+                            }
+
+
+                            if (allArgsCanBeUsed)
+                                sb.AppendLine("\t\t\t" + returnStatement);
+                            else
+                                sb.AppendLine("\t\t\tthrow new NotImplementedException();");
+                        }
+                        else
+                        {
+                            sb.AppendLine("\t\t\tthrow new NotImplementedException();");
+                        }
+
+                        sb.AppendLine("\t\t}");
+
+                        writer.WriteLine(sb.ToString());
+                    }
+                    catch (UnableToCreateWrapperException e)
+                    {
+                        Console.WriteLine("Could not generate a wrapper for " + function.Name + " in file \"" + function.File.FileName + "\".");
+                        Console.WriteLine("Message: " + e.Message);
+
+                        StringBuilder sb = new StringBuilder();
+                        sb.AppendLine("\t\t/*");
+                        sb.AppendLine("\t\t * " + function.ToString());
+                        sb.AppendLine("\t\t * ");
+                        sb.AppendLine("\t\t * " + "Could not generate a wrapper for " + function.Name + " in file \"" + function.File.FileName + "\".");
+                        sb.AppendLine("\t\t * " + "Message: " + e.Message);
+                        sb.AppendLine("\t\t */");
+
+                        writer.WriteLine(sb.ToString());
+                    }
                 }
 
                 writer.WriteLine("\t}");
============================================================
--- libpurple/wrapper/proto_chat_entry.cs	3394e3c6b3253cb6ba62bd6d3bd6510802848ac4
+++ libpurple/wrapper/proto_chat_entry.cs	cbe2a016d4c1551ae47de2209ae71a337b7df9ba
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -38,162 +40,24 @@ namespace PurpleWrapper
 {
 	public class proto_chat_entry : UnmanagedWrapper<_proto_chat_entry>
 	{
+		/* 
+		 * Could not generate a wrapper for proto_chat_entry in file "prpl.h".
+		 * Message: The type could not be resolved (const char * label).
+		 */
+
 		public proto_chat_entry()
 		{
+			throw new NotImplementedException();
 		}
 
 		public proto_chat_entry(IntPtr refernece)
 		{
-			this.Reference = reference;
-			this.Data = (_proto_chat_entry)Marshal.PtrToStructure(this.Reference, typeof(_proto_chat_entry));
+			throw new NotImplementedException();
 		}
 
-		public const char *label
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public const char *identifier
-		{
-			get
-			{
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				throw new NotImplementedException(); /* Non-native type. */
-			}
-		}
-
-		public bool required
-		{
-			get
-			{
-				return this.Data.required;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.required = value;
-			}
-		}
-
-		public bool is_int
-		{
-			get
-			{
-				return this.Data.is_int;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.is_int = value;
-			}
-		}
-
-		public int min
-		{
-			get
-			{
-				return this.Data.min;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.min = value;
-			}
-		}
-
-		public int max
-		{
-			get
-			{
-				return this.Data.max;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.max = value;
-			}
-		}
-
-		public bool secret
-		{
-			get
-			{
-				return this.Data.secret;
-			}
-			set
-			{
-				if (this.Reference != IntPtr.Zero)
-					this.Reference = IntPtr.Zero;
-
-				this.Data.secret = value;
-			}
-		}
-
 	}
 
-
 	[StructLayout(LayoutKind.Sequential)]
-	class _proto_chat_entry
-	{
-		/*
-		 * const char *label
-		 */
-		UNKNOWN char *label;
-
-		/*
-		 * const char *identifier
-		 */
-		UNKNOWN char *identifier;
-
-		/*
-		 * gboolean required
-		 */
-		bool required;
-
-		/*
-		 * gboolean is_int
-		 */
-		bool is_int;
-
-		/*
-		 * int min
-		 */
-		int min;
-
-		/*
-		 * int max
-		 */
-		int max;
-
-		/*
-		 * gboolean secret
-		 */
-		bool secret;
-
-	}
+	class _proto_chat_entry { }
 }
 
============================================================
--- libpurple/wrapper/xmlnode.cs	d4d9103312ef7dfb6c79d4d9964400c1724f5686
+++ libpurple/wrapper/xmlnode.cs	7dde0b923f0231ee58d5dfc9e3a0bc37c477594e
@@ -1,4 +1,4 @@
-/* purple
+/* PurpleWrapper - A .NET (CLR) wrapper for libpurple
  *
  * Purple is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
@@ -21,13 +21,15 @@
 
 /*
  * This file was auto-generated from the libpurple header files to provide a
- * clean interface between .NET/CLR and the unmanaged C library, libpurple.
+ * clean interface between .NET/CLR and the unmanaged C library libpurple.
  *
- * This code isn't complete, but completely a work in progress. :)
- * Three major things left:
- *  - Resolve the remaining UNKNOWN types.
- *  - Handle translation between delegate and function pointers.
- *  - Fill in the translation between public .NET class calls and private DllImport[] calls.
+ * This is the second major commit of the code.
+ * Next things:
+ *  - A few of the .h files have anonymous parameter names (eg: void cat(int, int).
+ *    This program will need to assign these parameters names.
+ *  - Function pointers inside structs aren't translated correctly into C#.
+ *  - Two places there are specific-length arrays (eg: char hostname[256]). The parser
+ *    does not detect them as an array.
  */
 
 using System;
@@ -36,316 +38,26 @@ namespace PurpleWrapper
 
 namespace PurpleWrapper
 {
-	public class Xmlnode
+	public class xmlnode : UnmanagedWrapper<_xmlnode>
 	{
-		/*
-		 * xmlnode * xmlnode_new(char * name)
+		/* 
+		 * Could not generate a wrapper for xmlnode in file "xmlnode.h".
+		 * Message: The struct contains an inner-struct or innter-union and cannot be automatically wrapped.
 		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_new(string name);
 
-		public static xmlnode New(string name)
+		public xmlnode()
 		{
 			throw new NotImplementedException();
 		}
 
-		/*
-		 * xmlnode * xmlnode_new_child(xmlnode * parent, char * name)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_new_child(IntPtr parent, string name);
-
-		public static xmlnode NewChild(xmlnode parent, string name)
+		public xmlnode(IntPtr refernece)
 		{
 			throw new NotImplementedException();
 		}
 
-		/*
-		 * void xmlnode_insert_child(xmlnode * parent, xmlnode * child)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_insert_child(IntPtr parent, IntPtr child);
+	}
 
-		public static void InsertChild(xmlnode parent, xmlnode child)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * xmlnode * xmlnode_get_child(xmlnode * parent, char * name)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_get_child(IntPtr parent, string name);
-
-		public static xmlnode GetChild(xmlnode parent, string name)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * xmlnode * xmlnode_get_child_with_namespace(xmlnode * parent, char * name, char * xmlns)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_get_child_with_namespace(IntPtr parent, string name, string xmlns);
-
-		public static xmlnode GetChildWithNamespace(xmlnode parent, string name, string xmlns)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * xmlnode * xmlnode_get_next_twin(xmlnode * node)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_get_next_twin(IntPtr node);
-
-		public static xmlnode GetNextTwin(xmlnode node)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_insert_data(xmlnode * node, char * data, gssize size)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_insert_data(IntPtr node, string data, UNKNOWN size);
-
-		public static void InsertData(xmlnode node, string data, gssize size)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_get_data(xmlnode * node)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_get_data(IntPtr node);
-
-		public static string GetData(xmlnode node)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_get_data_unescaped(xmlnode * node)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_get_data_unescaped(IntPtr node);
-
-		public static string GetDataUnescaped(xmlnode node)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_set_attrib(xmlnode * node, char * attr, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_set_attrib(IntPtr node, string attr, string value);
-
-		public static void SetAttrib(xmlnode node, string attr, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_set_attrib_with_prefix(xmlnode * node, char * attr, char * prefix, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_set_attrib_with_prefix(IntPtr node, string attr, string prefix, string value);
-
-		public static void SetAttribWithPrefix(xmlnode node, string attr, string prefix, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_set_attrib_with_namespace(xmlnode * node, char * attr, char * xmlns, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_set_attrib_with_namespace(IntPtr node, string attr, string xmlns, string value);
-
-		public static void SetAttribWithNamespace(xmlnode node, string attr, string xmlns, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_set_attrib_full(xmlnode * node, char * attr, char * xmlns, char * prefix, char * value)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_set_attrib_full(IntPtr node, string attr, string xmlns, string prefix, string value);
-
-		public static void SetAttribFull(xmlnode node, string attr, string xmlns, string prefix, string value)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_get_attrib(xmlnode * node, char * attr)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_get_attrib(IntPtr node, string attr);
-
-		public static string GetAttrib(xmlnode node, string attr)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_get_attrib_with_namespace(xmlnode * node, char * attr, char * xmlns)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_get_attrib_with_namespace(IntPtr node, string attr, string xmlns);
-
-		public static string GetAttribWithNamespace(xmlnode node, string attr, string xmlns)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_remove_attrib(xmlnode * node, char * attr)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_remove_attrib(IntPtr node, string attr);
-
-		public static void RemoveAttrib(xmlnode node, string attr)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_remove_attrib_with_namespace(xmlnode * node, char * attr, char * xmlns)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_remove_attrib_with_namespace(IntPtr node, string attr, string xmlns);
-
-		public static void RemoveAttribWithNamespace(xmlnode node, string attr, string xmlns)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_set_namespace(xmlnode * node, char * xmlns)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_set_namespace(IntPtr node, string xmlns);
-
-		public static void SetNamespace(xmlnode node, string xmlns)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_get_namespace(xmlnode * node)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_get_namespace(IntPtr node);
-
-		public static string GetNamespace(xmlnode node)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_set_prefix(xmlnode * node, char * prefix)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_set_prefix(IntPtr node, string prefix);
-
-		public static void SetPrefix(xmlnode node, string prefix)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_get_prefix(xmlnode * node)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_get_prefix(IntPtr node);
-
-		public static string GetPrefix(xmlnode node)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * xmlnode * xmlnode_get_parent(xmlnode * child)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_get_parent(IntPtr child);
-
-		public static xmlnode GetParent(xmlnode child)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_to_str(xmlnode * node, int * len)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_to_str(IntPtr node, IntPtr len);
-
-		public static string ToStr(xmlnode node, int len)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * char * xmlnode_to_formatted_str(xmlnode * node, int * len)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern string xmlnode_to_formatted_str(IntPtr node, IntPtr len);
-
-		public static string ToFormattedStr(xmlnode node, int len)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * xmlnode * xmlnode_from_str(char * str, gssize size)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_from_str(string str, UNKNOWN size);
-
-		public static xmlnode FromStr(string str, gssize size)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * xmlnode * xmlnode_copy(xmlnode * src)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_copy(IntPtr src);
-
-		public static xmlnode Copy(xmlnode src)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * void xmlnode_free(xmlnode * node)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern void xmlnode_free(IntPtr node);
-
-		public static void Free(xmlnode node)
-		{
-			throw new NotImplementedException();
-		}
-
-		/*
-		 * xmlnode * xmlnode_from_file(char * dir, char * filename, char * description, char * process)
-		 */
-		[DllImport("libpurple.dll")]
-		private static extern IntPtr xmlnode_from_file(string dir, string filename, string description, string process);
-
-		public static xmlnode FromFile(string dir, string filename, string description, string process)
-		{
-			throw new NotImplementedException();
-		}
-
-	}
+	[StructLayout(LayoutKind.Sequential)]
+	class _xmlnode { }
 }
 


More information about the Commits mailing list