← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcpp-plugin-sdk-c/ExamplePlugin] Rev 2: init from lp:dcplusplus/plugins/Example

 

------------------------------------------------------------
revno: 2
committer: poy <poy@xxxxxxxxxx>
branch nick: ExamplePlugin
timestamp: Thu 2012-11-15 20:04:18 +0100
message:
  init from lp:dcplusplus/plugins/Example
added:
  src/
  src/Dialog.c
  src/Dialog.h
  src/Plugin.c
  src/Plugin.h
  src/main.c
  src/pluginsdk.c
  src/resource.h
  src/resource.rc
  src/stdafx.c
  src/stdafx.h
  src/version.h


--
lp:~dcplusplus-team/dcpp-plugin-sdk-c/ExamplePlugin
https://code.launchpad.net/~dcplusplus-team/dcpp-plugin-sdk-c/ExamplePlugin

Your team Dcplusplus-team is subscribed to branch lp:~dcplusplus-team/dcpp-plugin-sdk-c/ExamplePlugin.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcpp-plugin-sdk-c/ExamplePlugin/+edit-subscription
=== added directory 'src'
=== added file 'src/Dialog.c'
--- src/Dialog.c	1970-01-01 00:00:00 +0000
+++ src/Dialog.c	2012-11-15 19:04:18 +0000
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "stdafx.h"
+#include "Dialog.h"
+
+#ifndef __cplusplus
+# include <stdlib.h>
+# include <string.h>
+#else
+# include <cstdlib>
+# include <cstring>
+#endif
+
+#include <pluginsdk/Config.h>
+
+DCUtilsPtr utils = NULL;
+
+#ifdef _WIN32
+
+#include "resource.h"
+extern HINSTANCE hInst;
+
+BOOL onConfigInit(HWND hWnd) {
+	char* value = get_cfg("SendSuffix");
+	size_t len = strlen(value) + 1;
+	TCHAR* buf = (TCHAR*)memset(malloc(len * sizeof(TCHAR)), 0, len * sizeof(TCHAR));
+
+	utils->utf8_to_wcs(buf, value, len);
+	free(value);
+	value = NULL;
+
+	SetDlgItemText(hWnd, IDC_SUFFIX, buf);
+	SetWindowText(hWnd, _T(PLUGIN_NAME) _T(" Settings"));
+
+	free(buf);
+	return TRUE;
+}
+
+BOOL onConfigClose(HWND hWnd, UINT wID) {
+	if(wID == IDOK) {
+		int len = GetWindowTextLength(GetDlgItem(hWnd, IDC_SUFFIX)) + 1;
+		TCHAR* wbuf = (TCHAR*)memset(malloc(len * sizeof(TCHAR)), 0, len * sizeof(TCHAR));
+		char* value = (char*)memset(malloc(len), 0, len);
+
+		GetWindowText(GetDlgItem(hWnd, IDC_SUFFIX), wbuf, len);
+		utils->wcs_to_utf8(value, wbuf, len);
+		set_cfg("SendSuffix", value);
+
+		free(value);
+		free(wbuf);
+	}
+
+	EndDialog(hWnd, wID);
+	return FALSE;
+}
+
+INT_PTR CALLBACK configProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
+	UNREFERENCED_PARAMETER(lParam);
+	switch(uMsg) {
+		case WM_INITDIALOG:
+			return onConfigInit(hWnd);
+		case WM_COMMAND: {
+			switch(LOWORD(wParam)) {
+				case IDOK:
+				case IDCANCEL:
+				case IDCLOSE:
+					return onConfigClose(hWnd, LOWORD(wParam));
+			}
+		}
+	}
+	return FALSE;
+}
+
+Bool dialog_create(dcptr_t hWnd, DCCorePtr core) {
+	utils = (DCUtilsPtr)core->query_interface(DCINTF_DCPP_UTILS, DCINTF_DCPP_UTILS_VER);
+	if(utils) {
+		DialogBox(hInst, MAKEINTRESOURCE(IDD_PLUGINDLG), (HWND)hWnd, configProc);
+		return True;
+	}
+	return False;
+}
+
+#else
+
+Bool dialog_create(dcptr_t hWnd, DCCorePtr core) { return False; }
+
+#endif

=== added file 'src/Dialog.h'
--- src/Dialog.h	1970-01-01 00:00:00 +0000
+++ src/Dialog.h	2012-11-15 19:04:18 +0000
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef PLUGIN_DIALOG_H
+#define PLUGIN_DIALOG_H
+
+Bool dialog_create(dcptr_t hWnd, DCCorePtr core);
+
+#endif /* DIALOG_H */

=== added file 'src/Plugin.c'
--- src/Plugin.c	1970-01-01 00:00:00 +0000
+++ src/Plugin.c	2012-11-15 19:04:18 +0000
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "stdafx.h"
+#include "Plugin.h"
+
+#include "Dialog.h"
+
+#ifndef __cplusplus
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+#else
+# include <cstdio>
+# include <cstdlib>
+# include <cstring>
+#endif
+
+#include <pluginsdk/Config.h>
+
+/* Variables */
+DCCorePtr dcpp;
+
+DCHooksPtr hooks;
+DCLogPtr logging;
+
+DCHubPtr hub;
+DCTaggerPtr tagger;
+DCUIPtr ui = NULL;
+
+/* Hook subscription store */
+#define HOOKS_SUBSCRIBED 4
+
+const char* hookGuids[HOOKS_SUBSCRIBED] = {
+	HOOK_UI_CHAT_COMMAND,
+	HOOK_HUB_ONLINE,
+	HOOK_TIMER_SECOND,
+	HOOK_UI_CHAT_TAGS
+};
+
+DCHOOK hookFuncs[HOOKS_SUBSCRIBED] = {
+	&onHubEnter,
+	&onHubOnline,
+	&onSecond,
+	&onChatTags
+};
+
+subsHandle subs[HOOKS_SUBSCRIBED];
+
+Bool onLoad(uint32_t eventId, DCCorePtr core) {
+	uint32_t i = 0;
+	dcpp = core;
+
+	hooks = (DCHooksPtr)core->query_interface(DCINTF_HOOKS, DCINTF_HOOKS_VER);
+	logging = (DCLogPtr)core->query_interface(DCINTF_LOGGING, DCINTF_LOGGING_VER);
+
+	hub = (DCHubPtr)core->query_interface(DCINTF_DCPP_HUBS, DCINTF_DCPP_HUBS_VER);
+	tagger = (DCTaggerPtr)core->query_interface(DCINTF_DCPP_TAGGER, DCINTF_DCPP_TAGGER_VER);
+	ui = (DCUIPtr)core->query_interface(DCINTF_DCPP_UI, DCINTF_DCPP_UI_VER); 
+
+	if(!hooks || !init_cfg(core) || !logging || !hub || !tagger)
+		return False;
+
+	if(eventId == ON_INSTALL) {
+		/* Default settings */
+		set_cfg("SendSuffix", "<Plugins Test - " PLUGIN_NAME ">");
+	}
+
+	logging->log(PLUGIN_NAME " loaded...");
+
+	while(i < HOOKS_SUBSCRIBED) {
+		subs[i] = hooks->bind_hook(hookGuids[i], hookFuncs[i], NULL);
+		++i;
+	}
+
+	return True;
+}
+
+Bool onUnload() {
+	uint32_t i = 0;
+	while(i < HOOKS_SUBSCRIBED) {
+		if(subs[i]) hooks->release_hook(subs[i]);
+		++i;
+	}
+	return True;
+}
+
+/* Event handlers */
+Bool DCAPI onHubEnter(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak) {
+	HubDataPtr hHub = (HubDataPtr)pObject;
+	CommandDataPtr cmd = (CommandDataPtr)pData;
+
+	if(stricmp(cmd->command, "help") == 0 && stricmp(cmd->params, "plugins") == 0) {
+		const char* help =
+			"\t\t\t Help: " PLUGIN_NAME " \n"
+			"\t /pluginhelp    \t Prints info about the purpose of this plugin\n"
+			"\t /plugininfo    \t Prints info about this plugin\n"
+			"\t /send <text>   \t Chat message test\n";
+
+		hub->local_message(hHub, help, MSG_SYSTEM);
+		return True;
+	} else if(stricmp(cmd->command, "pluginhelp") == 0) {
+		const char* pluginhelp =
+			"\t\t\t Plugin help: " PLUGIN_NAME " \n"
+			"\t This plugin project is intended to both demonstrate the use and test the implementation of the core API\n"
+			"\t as such the plugin itself does nothing useful but it can be used to verify whether an implementation works\n"
+			"\t with the API or not, however, it is by no means intended to be a comprehensive testing tool for the API.\n";
+
+		hub->local_message(hHub, pluginhelp, MSG_SYSTEM);
+		return True;
+	} else if(stricmp(cmd->command, "plugininfo") == 0) {
+		const char* info =
+			"\t\t\t Plugin info: " PLUGIN_NAME " \n"
+			"\t Name:           \t" PLUGIN_NAME "\n"
+			"\t Author:         \t" PLUGIN_AUTHOR "\n"
+			"\t Version:        \t" STRINGIZE(PLUGIN_VERSION) "\n"
+			"\t Description:    \t" PLUGIN_DESC "\n"
+			"\t GUID/UUID:      \t" PLUGIN_GUID "\n"
+			"\t Core API Ver:   \t" STRINGIZE(DCAPI_CORE_VER) "\n";
+
+		hub->local_message(hHub, info, MSG_SYSTEM);
+		return True;
+	} else if(stricmp(cmd->command, "send") == 0) {
+		size_t len = strlen(cmd->params);
+		if(len > 0) {
+			char* suffix = get_cfg("SendSuffix");
+			size_t msgLen = len + strlen(suffix) + 2;
+			char* text = (char*)memset(malloc(msgLen), 0, msgLen);
+
+			strncat(text, cmd->params, len);
+			text[len] = ' ';
+			strncat(text, suffix, msgLen - (len + 2));
+
+			hub->send_message(hHub, text, (strnicmp(text, "/me ", 4) == 0) ? True : False);
+
+			free(text);
+			free(suffix);
+		} else {
+			hub->local_message(hHub, "You must supply a parameter!", MSG_SYSTEM);
+		}
+		return True;
+	}
+	return False;
+}
+
+Bool DCAPI onHubOnline(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak) {
+	HubDataPtr hHub = (HubDataPtr)pObject;
+
+	char* buf = (char*)memset(malloc(256), 0, 256);
+	snprintf(buf, 256, "*** %s connected! (%s)", hHub->url, (hHub->protocol == PROTOCOL_ADC ? "adc" : "nmdc"));
+
+	logging->log(buf);
+	free(buf);
+
+	return False;
+}
+
+Bool DCAPI onSecond(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak) {
+	static uint64_t prevTick = 0;
+	uint64_t tick = *(uint64_t*)pData;
+
+	if(tick - prevTick >= 10*1000) {
+		prevTick = tick;
+		if(!ui) {
+			char* buf = (char*)memset(malloc(128), 0, 128);
+			snprintf(buf, 128, "*** Plugin timer tick (%lld)", tick);
+
+			logging->log(buf);
+			free(buf);
+		} else ui->play_sound("Media\\tada.wav");
+	}
+	return False;
+}
+
+Bool DCAPI onChatTags(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak) {
+	static const char* pattern = "ABC DEF";
+	TagDataPtr tags = (TagDataPtr)pData;
+	char* text = strstr(tags->text, pattern);
+
+	while(text != NULL) {	
+		tagger->add_tag(tags, text - tags->text, (text - tags->text) + strlen(pattern), "b", "");
+		text = strstr(text + strlen(pattern), pattern);
+	}
+
+	text = strstr(tags->text, "***");
+	if (text != NULL && (text - tags->text) == 0)
+		tagger->add_tag(tags, 0, strlen(tags->text), "b", "");
+
+	return False;
+}
+
+/* Plugin main function */
+Bool DCAPI pluginMain(PluginState state, DCCorePtr core, dcptr_t pData) {
+	switch(state) {
+		case ON_INSTALL:
+		case ON_LOAD:
+			return onLoad(state, core);
+		case ON_UNINSTALL:
+		case ON_UNLOAD:
+			return onUnload();
+		case ON_CONFIGURE:
+			/* Note: core may be NULL for this call */
+			return dialog_create(pData, dcpp);
+		default: return False;
+	}
+}

=== added file 'src/Plugin.h'
--- src/Plugin.h	1970-01-01 00:00:00 +0000
+++ src/Plugin.h	2012-11-15 19:04:18 +0000
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef PLUGIN_PLUGIN_H
+#define PLUGIN_PLUGIN_H
+
+#ifdef _MSC_VER
+# define snprintf _snprintf
+# define snwprintf _snwprintf
+#elif __GNUC__
+# define stricmp strcasecmp
+# define strnicmp strncasecmp
+#else
+# error No supported compiler found
+#endif
+
+/* Event handlers */
+Bool DCAPI onHubEnter(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak);
+Bool DCAPI onHubOnline(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak);
+Bool DCAPI onSecond(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak);
+Bool DCAPI onChatTags(dcptr_t pObject, dcptr_t pData, dcptr_t opaque, Bool* bBreak);
+
+/* Plugin main function */
+Bool DCAPI pluginMain(PluginState state, DCCorePtr core, dcptr_t pData);
+
+#endif /* PLUGIN_H */

=== added file 'src/main.c'
--- src/main.c	1970-01-01 00:00:00 +0000
+++ src/main.c	2012-11-15 19:04:18 +0000
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "stdafx.h"
+#include "Plugin.h"
+#include "version.h"
+
+const char* dependencies[] = {
+	/* Plugins with these GUID's must have been loaded *before* this plugin */
+	"{aaaaaaaa-1111-bbbb-2222-cccccccccccc}",
+	"{aaaaaaaa-2222-cccc-3333-dddddddddddd}"
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Plugin loader */
+DCEXP DCMAIN DCAPI pluginInit(MetaDataPtr info) {
+	info->name = PLUGIN_NAME;
+	info->author = PLUGIN_AUTHOR;
+	info->description = PLUGIN_DESC;
+	info->version = PLUGIN_VERSION;
+	info->web = PLUGIN_WEB;
+	info->apiVersion = DCAPI_CORE_VER;
+	info->guid = PLUGIN_GUID;
+
+	/* Plugin dependencies 
+	info->dependencies = dependencies;
+	info->numDependencies = 2;*/
+
+	return &pluginMain;
+}
+
+#ifdef _WIN32
+HINSTANCE hInst = NULL;
+
+BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
+	UNREFERENCED_PARAMETER(fdwReason);
+	UNREFERENCED_PARAMETER(lpvReserved);
+	hInst = hinstDLL;
+	return TRUE;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif

=== added file 'src/pluginsdk.c'
--- src/pluginsdk.c	1970-01-01 00:00:00 +0000
+++ src/pluginsdk.c	2012-11-15 19:04:18 +0000
@@ -0,0 +1,6 @@
+/* This file compiles the plugin SDK. Normally the relevant files would be included directly in the
+project; but it's impractical in the DC++ repository (would need some decent symlink support). */
+
+#include "version.h"
+
+#include <pluginsdk/Config.c>

=== added file 'src/resource.h'
--- src/resource.h	1970-01-01 00:00:00 +0000
+++ src/resource.h	2012-11-15 19:04:18 +0000
@@ -0,0 +1,19 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by SamplePlugin.rc
+//
+#define VERSION_INFO                    1
+#define IDD_PLUGINDLG                   101
+#define IDC_SUFFIX                      1001
+#define IDC_API_TESTER                  1002
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        102
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1003
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif

=== added file 'src/resource.rc'
--- src/resource.rc	1970-01-01 00:00:00 +0000
+++ src/resource.rc	2012-11-15 19:04:18 +0000
@@ -0,0 +1,140 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,0
+ PRODUCTVERSION 1,0,0,0
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "080004b0"
+        BEGIN
+            VALUE "Comments", "http://dcplusplus.sourceforge.net";
+            VALUE "FileDescription", "Example plugin for DC++"
+            VALUE "FileVersion", "1, 0, 0, 0"
+            VALUE "InternalName", "ExamplePlugin"
+            VALUE "LegalCopyright", "Copyright (C) 2012 Jacek Sieka"
+            VALUE "OriginalFilename", "ExamplePlugin.dll"
+            VALUE "ProductName", "Example plugin for DC++"
+            VALUE "ProductVersion", "1, 0, 0, 0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x800, 1200
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_PLUGINDLG DIALOGEX 0, 0, 244, 75
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Example plugin settings"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,132,54,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,187,54,50,14
+    GROUPBOX        "Settings",IDC_STATIC,7,7,230,45
+    EDITTEXT        IDC_SUFFIX,93,16,133,14,ES_AUTOHSCROLL
+    LTEXT           "/send command suffix:",IDC_STATIC,17,19,74,8
+    CTEXT           "This is an example of plugin implanted configuration dialog.",IDC_STATIC,14,37,216,13
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO 
+BEGIN
+    IDD_PLUGINDLG, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 237
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 68
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

=== added file 'src/stdafx.c'
--- src/stdafx.c	1970-01-01 00:00:00 +0000
+++ src/stdafx.c	2012-11-15 19:04:18 +0000
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "stdafx.h"

=== added file 'src/stdafx.h'
--- src/stdafx.h	1970-01-01 00:00:00 +0000
+++ src/stdafx.h	2012-11-15 19:04:18 +0000
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef PLUGIN_STDAFX_H
+#define PLUGIN_STDAFX_H
+
+#ifdef _WIN32
+
+#include <windows.h>
+#include <tchar.h>
+
+#else
+
+#include <unistd.h>
+
+#endif
+
+/* This can make a #define value to string (from boost) */
+#define STRINGIZE(X) DO_STRINGIZE(X)
+#define DO_STRINGIZE(X) #X
+
+#include <pluginsdk/PluginDefs.h>
+
+#include "version.h"
+
+#endif /* PLUGIN_STDAFX_H */

=== added file 'src/version.h'
--- src/version.h	1970-01-01 00:00:00 +0000
+++ src/version.h	2012-11-15 19:04:18 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012 Jacek Sieka, arnetheduck on gmail point com
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* Information about the plugin - fill this out! Don't forget to edit the resource file as well. */
+
+#ifndef PLUGIN_VERSION_H
+#define PLUGIN_VERSION_H
+
+/* UUID/GUID for this plugin project */
+#define PLUGIN_GUID "{5fa64766-ab6e-4d79-8439-dad40fda9738}"
+
+/* Name of the plugin */
+#define PLUGIN_NAME "Example plugin"
+
+/* Author of the plugin */
+#define PLUGIN_AUTHOR "DC++"
+
+/* Short description of the plugin */
+#define PLUGIN_DESC "Example project"
+
+/* Version of the plugin (note: not API version) */
+#define PLUGIN_VERSION 1.0
+
+/* Plugin website, set to "N/A" if none */
+#define PLUGIN_WEB "http://dcplusplus.sourceforge.net/";
+
+#endif /* VERSION_H */