[smuxi] Engine-MessageBuffer: new tool to dump and convert message buffers



commit ce3becd0c083e60bc404764e2d50c20abd165874
Author: Mirco Bauer <meebey meebey net>
Date:   Wed Mar 5 21:51:39 2014 +0100

    Engine-MessageBuffer: new tool to dump and convert message buffers

 Makefile.am                                        |    5 +-
 configure.ac                                       |   18 +-
 debian/smuxi-engine.install                        |    2 +
 po-Engine-Campfire/POTFILES.skip                   |    1 +
 po-Engine-IRC/POTFILES.skip                        |    1 +
 po-Engine-JabbR/POTFILES.skip                      |    1 +
 po-Engine-MessageBuffer/LINGUAS                    |    1 +
 po-Engine-MessageBuffer/Makefile.in.in             |  218 ++++++++++++
 po-Engine-MessageBuffer/POTFILES.in                |    1 +
 po-Engine-MessageBuffer/POTFILES.skip              |   18 +
 po-Engine-MessageBuffer/de.po                      |  120 +++++++
 po-Engine-Twitter/POTFILES.skip                    |    1 +
 po-Engine-XMPP/POTFILES.skip                       |    1 +
 po-Engine/POTFILES.skip                            |    1 +
 po-Frontend-GNOME-IRC/POTFILES.skip                |    1 +
 po-Frontend-GNOME-Twitter/POTFILES.skip            |    1 +
 po-Frontend-GNOME-XMPP/POTFILES.skip               |    1 +
 po-Frontend-GNOME/POTFILES.skip                    |    1 +
 po-Frontend/POTFILES.skip                          |    1 +
 po-Server/POTFILES.skip                            |    1 +
 src/Engine-MessageBuffer/AssemblyInfo.cs           |   38 ++
 .../Engine-MessageBuffer.csproj                    |   67 ++++
 src/Engine-MessageBuffer/Main.cs                   |  353 ++++++++++++++++++++
 src/Engine-MessageBuffer/Makefile.am               |   35 ++
 .../smuxi-message-buffer.exe.config                |   16 +
 src/Engine-MessageBuffer/smuxi-message-buffer.in   |    3 +
 src/Engine-Twitter/Makefile.am                     |    2 +-
 src/Engine/MessageBuffers/SqliteMessageBuffer.cs   |   15 +
 src/Makefile.am                                    |    1 +
 src/smuxi.sln                                      |   10 +
 30 files changed, 931 insertions(+), 4 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 87f807f..4fa5420 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -60,6 +60,7 @@ DISTCLEANFILES = \
 
 PODIRS =       po \
                po-Engine \
+               po-Engine-MessageBuffer \
                $(PO_ENGINE_CAMPFIRE) \
                $(PO_ENGINE_IRC) \
                $(PO_ENGINE_JABBR) \
@@ -144,7 +145,8 @@ LINUX_STATIC_BUILD_DIR = $(top_builddir)/bin-linux-static
 
 WIN32_EXE_FILES = \
        $(BUILD_DIR)/smuxi-frontend-gnome.exe \
-       $(BUILD_DIR)/smuxi-server.exe
+       $(BUILD_DIR)/smuxi-server.exe \
+       $(BUILD_DIR)/smuxi-message-buffer.exe
 
 WIN32_FILES = \
        $(WIN32_EXE_FILES) \
@@ -187,6 +189,7 @@ OSX_FILES = \
        $(BUILD_DIR)/smuxi-frontend-gnome-twitter.dll \
        $(BUILD_DIR)/smuxi-frontend-gnome-xmpp.dll \
        $(BUILD_DIR)/smuxi-server.exe \
+       $(BUILD_DIR)/smuxi-message-buffer.exe \
        $(BUILD_DIR)/smuxi-common.dll \
        $(BUILD_DIR)/smuxi-engine.dll \
        $(BUILD_DIR)/smuxi-engine-campfire.dll \
diff --git a/configure.ac b/configure.ac
index e87e899..cd8578b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,6 +22,7 @@ IT_PROG_INTLTOOL([0.25])
 POSUB="
        po
        po-Engine
+       po-Engine-MessageBuffer
        po-Engine-Campfire
        po-Engine-IRC
        po-Engine-JabbR
@@ -63,6 +64,10 @@ GETTEXT_PACKAGE_ENGINE_JABBR=smuxi-engine-jabbr
 AC_SUBST(GETTEXT_PACKAGE_ENGINE_JABBR)
 AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_ENGINE_JABBR, "$GETTEXT_PACKAGE_ENGINE_JABBR", [Gettext package])
 
+GETTEXT_PACKAGE_MSG_BUFFER=smuxi-message-buffer
+AC_SUBST(GETTEXT_PACKAGE_MSG_BUFFER)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_MSG_BUFFER, "$GETTEXT_PACKAGE_MSG_BUFFER", [Gettext package])
+
 GETTEXT_PACKAGE_SERVER=smuxi-server
 AC_SUBST(GETTEXT_PACKAGE_SERVER)
 AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_SERVER, "$GETTEXT_PACKAGE_SERVER", [Gettext package])
@@ -174,7 +179,7 @@ AC_SUBST(CSC, "$MCS")
 CSC_FLAGS=
 if test "x$PROFILE" = "xdebug"; then
        AM_CONDITIONAL(ENABLE_DEBUG, true)
-       CSC_FLAGS+=-define:DEBUG,TRACE,LOG4NET
+       CSC_FLAGS+="-define:DEBUG,TRACE,LOG4NET -debug"
 else
        AM_CONDITIONAL(ENABLE_RELEASE, true)
 fi
@@ -551,6 +556,12 @@ if test "x$ENABLE_ENGINE_JABBR" != "xno"; then
 fi
 AM_CONDITIONAL(ENABLE_ENGINE_JABBR, test "x$ENABLE_ENGINE_JABBR" = "xyes")
 
+# MessageBuffer tool
+if $PKG_CONFIG 'mono >= 2.6'; then
+       MSG_BUFFER_COMPILER_FLAGS+=" -platform:x86"
+fi
+AC_SUBST(MSG_BUFFER_COMPILER_FLAGS)
+
 # Server
 if $PKG_CONFIG 'mono >= 2.6'; then
        SERVER_COMPILER_FLAGS+=" -platform:x86"
@@ -680,6 +691,8 @@ AC_CONFIG_FILES([
        src/Engine-XMPP/Makefile
        src/Engine-XMPP/smuxi-engine-xmpp.pc
        src/Engine-Campfire/Makefile
+       src/Engine-MessageBuffer/Makefile
+       src/Engine-MessageBuffer/smuxi-message-buffer
        src/Server/Makefile
        src/Server/smuxi-server
        src/Frontend/Makefile
@@ -707,6 +720,7 @@ AC_CONFIG_FILES([
        po-Engine-JabbR/Makefile.in
        po-Engine-Twitter/Makefile.in
        po-Engine-XMPP/Makefile.in
+       po-Engine-MessageBuffer/Makefile.in
        po-Server/Makefile.in
        po-Frontend/Makefile.in
        po-Frontend-GNOME/Makefile.in
@@ -731,7 +745,7 @@ AC_MSG_RESULT([
 
        * Engines
          -------
-         Core:                (db4o: $WITH_DB4O)
+         Core:                (sqlite: built-in, db4o: $WITH_DB4O)
          IRC:                 $ENABLE_ENGINE_IRC
          XMPP:                $ENABLE_ENGINE_XMPP
          Twitter:             $ENABLE_ENGINE_TWITTER
diff --git a/debian/smuxi-engine.install b/debian/smuxi-engine.install
index daad52f..dad0fe9 100644
--- a/debian/smuxi-engine.install
+++ b/debian/smuxi-engine.install
@@ -4,6 +4,7 @@ usr/lib/smuxi/smuxi-common.dll*
 usr/lib/smuxi/smuxi-engine*.dll*
 usr/lib/smuxi/smuxi-frontend.dll*
 usr/lib/smuxi/smuxi-server.exe*
+usr/lib/smuxi/smuxi-message-buffer.exe*
 usr/lib/smuxi/Db4objects.Db4o.dll*
 usr/lib/smuxi/Meebey.SmartIrc4net.dll*
 usr/lib/smuxi/Twitterizer2.dll*
@@ -14,3 +15,4 @@ usr/lib/smuxi/StarkSoftProxy.dll*
 usr/share/locale/*/LC_MESSAGES/smuxi-engine*.mo
 usr/share/locale/*/LC_MESSAGES/smuxi-frontend.mo
 usr/share/locale/*/LC_MESSAGES/smuxi-server.mo
+usr/share/locale/*/LC_MESSAGES/smuxi-message-buffer.mo
diff --git a/po-Engine-Campfire/POTFILES.skip b/po-Engine-Campfire/POTFILES.skip
index e70f382..f643d08 100644
--- a/po-Engine-Campfire/POTFILES.skip
+++ b/po-Engine-Campfire/POTFILES.skip
@@ -9,6 +9,7 @@ src/Frontend-STFL/
 src/Frontend-SWF/
 src/Frontend-WPF/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-IRC/
 src/Engine-JabbR/
 src/Engine-XMPP/
diff --git a/po-Engine-IRC/POTFILES.skip b/po-Engine-IRC/POTFILES.skip
index 12eb41b..e493fa4 100644
--- a/po-Engine-IRC/POTFILES.skip
+++ b/po-Engine-IRC/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-JabbR/
 src/Engine-XMPP/
diff --git a/po-Engine-JabbR/POTFILES.skip b/po-Engine-JabbR/POTFILES.skip
index b8b579f..e55c953 100644
--- a/po-Engine-JabbR/POTFILES.skip
+++ b/po-Engine-JabbR/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-Twitter/
diff --git a/po-Engine-MessageBuffer/LINGUAS b/po-Engine-MessageBuffer/LINGUAS
new file mode 100644
index 0000000..7673daa
--- /dev/null
+++ b/po-Engine-MessageBuffer/LINGUAS
@@ -0,0 +1 @@
+de
diff --git a/po-Engine-MessageBuffer/Makefile.in.in b/po-Engine-MessageBuffer/Makefile.in.in
new file mode 100644
index 0000000..dda6f1a
--- /dev/null
+++ b/po-Engine-MessageBuffer/Makefile.in.in
@@ -0,0 +1,218 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper gnu ai mit edu>
+# Copyright (C) 2004-2008 Rodney Dawes <dobey pwns gmail com>
+#
+# This file may be copied and used freely without restrictions.  It may
+# be used in projects which are not available under a GNU Public License,
+# but which still want to provide support for the GNU gettext functionality.
+#
+# - Modified by Owen Taylor <otaylor redhat com> to use GETTEXT_PACKAGE
+#   instead of PACKAGE and to look for po2tbl in ./ not in intl/
+#
+# - Modified by jacob berkman <jacob ximian com> to install
+#   Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
+#
+# - Modified by Rodney Dawes <dobey pwns gmail com> for use with intltool
+#
+# We have the following line for use by intltoolize:
+# INTLTOOL_MAKEFILE
+
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE_MSG_BUFFER@
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @top_builddir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+datarootdir = @datarootdir@
+libdir = @libdir@
+DATADIRNAME = @DATADIRNAME@
+itlocaledir = $(prefix)/$(DATADIRNAME)/locale
+subdir = po
+install_sh = @install_sh@
+# Automake >= 1.8 provides @mkdir_p  
+# Until it can be supposed, use the safe fallback:
+mkdir_p = $(install_sh) -d
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package 
$(GETTEXT_PACKAGE) --dist
+GENPOT   = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package 
$(GETTEXT_PACKAGE) --pot
+
+ALL_LINGUAS = @ALL_LINGUAS@
+
+PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; fi)
+
+USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for 
lang in $$LLINGUAS; do if test -n "`grep ^$$lang$$ $(srcdir)/LINGUAS`" -o -n "`echo $$ALINGUAS|grep ' ?$$lang 
?'`"; then printf "$$lang "; fi; done; fi)
+
+USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n 
"$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in 
$$LLINGUAS; do printf "$$lang "; done)
+
+POFILES=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done)
+
+DISTFILES = Makefile.in.in POTFILES.in $(POFILES)
+EXTRA_DISTFILES = POTFILES.skip Makevars LINGUAS
+
+POTFILES = \
+# This comment gets stripped out
+
+CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
+
+.SUFFIXES:
+.SUFFIXES: .po .pox .gmo .mo .msg .cat
+
+.po.pox:
+       $(MAKE) $(GETTEXT_PACKAGE).pot
+       $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox
+
+.po.mo:
+       $(MSGFMT) -o $@ $<
+
+.po.gmo:
+       file=`echo $* | sed 's,.*/,,'`.gmo \
+         && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+       sed -f ../intl/po2msg.sed < $< > $*.msg \
+         && rm -f $@ && gencat $@ $*.msg
+
+
+all: all- USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+$(GETTEXT_PACKAGE).pot: $(POTFILES)
+       $(GENPOT)
+
+install: install-data
+install-data: install-data- USE_NLS@
+install-data-no: all
+install-data-yes: all
+       $(mkdir_p) $(DESTDIR)$(itlocaledir)
+       linguas="$(USE_LINGUAS)"; \
+       for lang in $$linguas; do \
+         dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
+         $(mkdir_p) $$dir; \
+         if test -r $$lang.gmo; then \
+           $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
+           echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \
+         else \
+           $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
+           echo "installing $(srcdir)/$$lang.gmo as" \
+                "$$dir/$(GETTEXT_PACKAGE).mo"; \
+         fi; \
+         if test -r $$lang.gmo.m; then \
+           $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \
+           echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \
+         else \
+           if test -r $(srcdir)/$$lang.gmo.m ; then \
+             $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \
+               $$dir/$(GETTEXT_PACKAGE).mo.m; \
+             echo "installing $(srcdir)/$$lang.gmo.m as" \
+                  "$$dir/$(GETTEXT_PACKAGE).mo.m"; \
+           else \
+             true; \
+           fi; \
+         fi; \
+       done
+
+# Empty stubs to satisfy archaic automake needs
+dvi info tags TAGS ID:
+
+# Define this as empty until I found a useful application.
+install-exec installcheck:
+
+uninstall:
+       linguas="$(USE_LINGUAS)"; \
+       for lang in $$linguas; do \
+         rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
+         rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
+       done
+
+check: all $(GETTEXT_PACKAGE).pot
+       rm -f missing notexist
+       srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m
+       if [ -r missing -o -r notexist ]; then \
+         exit 1; \
+       fi
+
+mostlyclean:
+       rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
+       rm -f .intltool-merge-cache
+
+clean: mostlyclean
+
+distclean: clean
+       rm -f Makefile Makefile.in POTFILES stamp-it
+       rm -f *.mo *.msg *.cat *.cat.m *.gmo
+
+maintainer-clean: distclean
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+       rm -f Makefile.in.in
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: $(DISTFILES)
+       dists="$(DISTFILES)"; \
+       extra_dists="$(EXTRA_DISTFILES)"; \
+       for file in $$extra_dists; do \
+         test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \
+       done; \
+       for file in $$dists; do \
+         test -f $$file || file="$(srcdir)/$$file"; \
+         ln $$file $(distdir) 2> /dev/null \
+           || cp -p $$file $(distdir); \
+       done
+
+update-po: Makefile
+       $(MAKE) $(GETTEXT_PACKAGE).pot
+       tmpdir=`pwd`; \
+       linguas="$(USE_LINGUAS)"; \
+       for lang in $$linguas; do \
+         echo "$$lang:"; \
+         result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
+         if $$result; then \
+           if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+             rm -f $$tmpdir/$$lang.new.po; \
+            else \
+             if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+               :; \
+             else \
+               echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+               rm -f $$tmpdir/$$lang.new.po; \
+               exit 1; \
+             fi; \
+           fi; \
+         else \
+           echo "msgmerge for $$lang.gmo failed!"; \
+           rm -f $$tmpdir/$$lang.new.po; \
+         fi; \
+       done
+
+Makefile POTFILES: stamp-it
+       @if test ! -f $@; then \
+         rm -f stamp-it; \
+         $(MAKE) stamp-it; \
+       fi
+
+stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
+              $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po-Engine-MessageBuffer/POTFILES.in b/po-Engine-MessageBuffer/POTFILES.in
new file mode 100644
index 0000000..098b14c
--- /dev/null
+++ b/po-Engine-MessageBuffer/POTFILES.in
@@ -0,0 +1 @@
+src/Engine-MessageBuffer/Main.cs
diff --git a/po-Engine-MessageBuffer/POTFILES.skip b/po-Engine-MessageBuffer/POTFILES.skip
new file mode 100644
index 0000000..cff5120
--- /dev/null
+++ b/po-Engine-MessageBuffer/POTFILES.skip
@@ -0,0 +1,18 @@
+glade/
+src/Common/
+src/Engine/
+src/Engine-Campfire/
+src/Engine-IRC/
+src/Engine-JabbR/
+src/Engine-XMPP/
+src/Engine-Twitter/
+src/Frontend/
+src/Frontend-GNOME-IRC/
+src/Frontend-GNOME-Twitter/
+src/Frontend-GNOME-XMPP/
+src/Frontend-GNOME/
+src/Frontend-STFL/
+src/Frontend-SWF/
+src/Frontend-WPF/
+src/Server/
+lib/
diff --git a/po-Engine-MessageBuffer/de.po b/po-Engine-MessageBuffer/de.po
new file mode 100644
index 0000000..648be78
--- /dev/null
+++ b/po-Engine-MessageBuffer/de.po
@@ -0,0 +1,120 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-03-06 21:30+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL ADDRESS>\n"
+"Language-Team: LANGUAGE <LL li org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/Engine-MessageBuffer/Main.cs:49
+msgid "Enable debug output"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:55
+#: ../src/Engine-MessageBuffer/Main.cs:131
+#: ../src/Engine-MessageBuffer/Main.cs:195
+msgid "Show this help"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:57
+msgid "Usage: smuxi-message-buffer [options] action action-options"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:59
+msgid "Actions:"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:63
+#: ../src/Engine-MessageBuffer/Main.cs:142
+#: ../src/Engine-MessageBuffer/Main.cs:207
+msgid "Options:"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:90
+#, csharp-format
+msgid "Unknown action: '{0}'"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:97
+#, csharp-format
+msgid "Command line error: {0}"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:109
+msgid "Database format (valid values: auto, db4o, sqlite)"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:124
+#: ../src/Engine-MessageBuffer/Main.cs:188
+#, csharp-format
+msgid "Unknown {0} option: '{1}'"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:135
+#, csharp-format
+msgid "Usage: smuxi-message-buffer {0} [action-options] db_path"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:140
+msgid "Database path"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:151
+msgid "db_path is required"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:165
+msgid "Source format (valid values: auto, db4o, sqlite)"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:173
+msgid "Destination format (valid values: auto, db4o, sqlite)"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:199
+#, csharp-format
+msgid ""
+"Usage: smuxi-message-buffer {0} [action-options] source_db destination_db"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:204
+msgid "Source file path"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:205
+msgid "Destination file path or -/empty for stdout"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:216
+msgid "source_db and destination_db are required"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:232
+msgid "sourceFile must not be empty."
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:248
+#, csharp-format
+msgid "Destination database {0} must be empty!"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:298
+#, csharp-format
+msgid "Unknown file format: '{0}'"
+msgstr ""
+
+#: ../src/Engine-MessageBuffer/Main.cs:320
+#, csharp-format
+msgid "Unsupported buffer type: '{0}'"
+msgstr ""
diff --git a/po-Engine-Twitter/POTFILES.skip b/po-Engine-Twitter/POTFILES.skip
index dc04b9e..b99c62b 100644
--- a/po-Engine-Twitter/POTFILES.skip
+++ b/po-Engine-Twitter/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Engine-XMPP/POTFILES.skip b/po-Engine-XMPP/POTFILES.skip
index a3e120b..0b1f914 100644
--- a/po-Engine-XMPP/POTFILES.skip
+++ b/po-Engine-XMPP/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Engine/POTFILES.skip b/po-Engine/POTFILES.skip
index 0f8bda6..7d9b8cd 100644
--- a/po-Engine/POTFILES.skip
+++ b/po-Engine/POTFILES.skip
@@ -9,6 +9,7 @@ src/Frontend-STFL/
 src/Frontend-SWF/
 src/Frontend-WPF/
 src/Engine/Config/ServerModel.cs
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Frontend-GNOME-IRC/POTFILES.skip b/po-Frontend-GNOME-IRC/POTFILES.skip
index 832c75a..7bf2577 100644
--- a/po-Frontend-GNOME-IRC/POTFILES.skip
+++ b/po-Frontend-GNOME-IRC/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Frontend-GNOME-Twitter/POTFILES.skip b/po-Frontend-GNOME-Twitter/POTFILES.skip
index a6d0dc0..aeccc55 100644
--- a/po-Frontend-GNOME-Twitter/POTFILES.skip
+++ b/po-Frontend-GNOME-Twitter/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Frontend-GNOME-XMPP/POTFILES.skip b/po-Frontend-GNOME-XMPP/POTFILES.skip
index 920f270..c4db11b 100644
--- a/po-Frontend-GNOME-XMPP/POTFILES.skip
+++ b/po-Frontend-GNOME-XMPP/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Frontend-GNOME/POTFILES.skip b/po-Frontend-GNOME/POTFILES.skip
index 7740ca3..7a27843 100644
--- a/po-Frontend-GNOME/POTFILES.skip
+++ b/po-Frontend-GNOME/POTFILES.skip
@@ -9,6 +9,7 @@ src/Frontend-STFL/
 src/Frontend-SWF/
 src/Frontend-WPF/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Frontend/POTFILES.skip b/po-Frontend/POTFILES.skip
index eb4cf60..8f40234 100644
--- a/po-Frontend/POTFILES.skip
+++ b/po-Frontend/POTFILES.skip
@@ -8,6 +8,7 @@ src/Frontend-STFL/
 src/Frontend-SWF/
 src/Frontend-WPF/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/po-Server/POTFILES.skip b/po-Server/POTFILES.skip
index 7707916..554e7f6 100644
--- a/po-Server/POTFILES.skip
+++ b/po-Server/POTFILES.skip
@@ -1,6 +1,7 @@
 glade/
 src/Common/
 src/Engine/
+src/Engine-MessageBuffer/
 src/Engine-Campfire/
 src/Engine-IRC/
 src/Engine-JabbR/
diff --git a/src/Engine-MessageBuffer/AssemblyInfo.cs b/src/Engine-MessageBuffer/AssemblyInfo.cs
new file mode 100644
index 0000000..96ff696
--- /dev/null
+++ b/src/Engine-MessageBuffer/AssemblyInfo.cs
@@ -0,0 +1,38 @@
+/*
+ * Smuxi - Smart MUltipleXed Irc
+ *
+ * Copyright (c) 2014 Mirco Bauer <meebey meebey net>
+ *
+ * Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
+ *
+ * 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
+ */
+
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("Smuxi - MessageBuffer tool")]
+[assembly: AssemblyCopyright("2014 (C) Mirco Bauer <meebey meebey net>")]
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+
+[assembly: CLSCompliant(true)]
+[assembly: ComVisible(false)]
+
+// let log4net use .exe.config file
+[assembly: log4net.Config.XmlConfigurator]
diff --git a/src/Engine-MessageBuffer/Engine-MessageBuffer.csproj 
b/src/Engine-MessageBuffer/Engine-MessageBuffer.csproj
new file mode 100644
index 0000000..24c57ff
--- /dev/null
+++ b/src/Engine-MessageBuffer/Engine-MessageBuffer.csproj
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" 
xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>Smuxi-Engine</RootNamespace>
+    <AssemblyName>smuxi-message-buffer</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+    <ConsolePause>false</ConsolePause>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Externalconsole>true</Externalconsole>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="log4net">
+      <HintPath>..\..\lib\log4net.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Main.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="..\AssemblyVersion.cs">
+      <Link>AssemblyVersion.cs</Link>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <ProjectReference Include="..\Engine\Engine.csproj">
+      <Project>{BCD52FCF-B7A8-42FB-AA8D-CF9921FF593E}</Project>
+      <Name>Engine</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Common\Common.csproj">
+      <Project>{73DEF91D-03FF-41E3-B2E1-3259AF247CA7}</Project>
+      <Name>Common</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\lib\ServiceStack.Text\src\ServiceStack.Text\ServiceStack.Text.csproj">
+      <Project>{579B3FDB-CDAD-44E1-8417-885C38E49A0E}</Project>
+      <Name>ServiceStack.Text</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="smuxi-message-buffer.exe.config">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Engine-MessageBuffer/Main.cs b/src/Engine-MessageBuffer/Main.cs
new file mode 100644
index 0000000..4c6aafb
--- /dev/null
+++ b/src/Engine-MessageBuffer/Main.cs
@@ -0,0 +1,353 @@
+// Smuxi - Smart MUltipleXed Irc
+//
+// Copyright (c) 2014 Mirco Bauer <meebey meebey net>
+//
+// Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
+//
+// 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
+using System;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using NDesk.Options;
+using ServiceStack.Text;
+using Smuxi.Common;
+using Smuxi.Engine.Dto;
+using System.Collections.Generic;
+
+namespace Smuxi.Engine
+{
+    public class MainClass
+    {
+        static readonly log4net.ILog Logger = 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+        static readonly string LibraryTextDomain = "smuxi-message-buffer";
+
+        public static void Main(string[] args)
+        {
+            System.Threading.Thread.CurrentThread.Name = "Main";
+
+            // initialize log level
+            log4net.Repository.ILoggerRepository repo = log4net.LogManager.GetRepository();
+            repo.Threshold = log4net.Core.Level.Error;
+
+            InitLocale();
+
+            var debug = false;
+            var parser = new OptionSet() {
+                { "d|debug", _("Enable debug output"),
+                    val => {
+                        debug = true;
+                    }
+                }
+            };
+            parser.Add("h|help", _("Show this help"),
+                val => {
+                    Console.WriteLine(_("Usage: smuxi-message-buffer [options] action action-options"));
+                    Console.WriteLine();
+                    Console.WriteLine(_("Actions:"));
+                    Console.WriteLine("  cat");
+                    Console.WriteLine("  convert/copy/cp");
+                    Console.WriteLine();
+                    Console.WriteLine(_("Options:"));
+                    parser.WriteOptionDescriptions(Console.Out);
+                    Environment.Exit(0);
+                }
+            );
+
+            try {
+                var mainArgs = args.TakeWhile(x => x.StartsWith("-"));
+                parser.Parse(mainArgs);
+                if (debug) {
+                    repo.Threshold = log4net.Core.Level.Debug;
+                }
+
+                var action = args.Skip(mainArgs.Count()).First();
+                var actionArgs = args.Skip(mainArgs.Count() + 1);
+                switch (action.ToLower()) {
+                    case "cat":
+                        CatAction(action, actionArgs);
+                        break;
+                    case "convert":
+                    case "copy":
+                    case "cp":
+                        CopyAction(action, actionArgs);
+                        break;
+                    default:
+                        throw new OptionException(
+                            String.Format(
+                                _("Unknown action: '{0}'"),
+                                action
+                            ),
+                            "action"
+                        );
+                }
+            } catch (OptionException ex) {
+                Console.Error.WriteLine(_("Command line error: {0}"), ex.Message);
+                Environment.Exit(1);
+            } catch (Exception e) {
+                Logger.Fatal(e);
+            }
+        }
+
+        static void CatAction(string action, IEnumerable<string> args)
+        {
+            var dbFormat = "";
+            var parameters = new List<string>();
+            var parser = new OptionSet() {
+                { "format=", _("Database format (valid values: auto, db4o, sqlite)"),
+                    val => {
+                        if (val == "auto") {
+                            val = "";
+                        }
+                        dbFormat = val;
+                    }
+                },
+                { "<>",
+                    val => {
+                        if (!val.StartsWith("-")) {
+                            parameters.Add(val);
+                            return;
+                        }
+                        throw new OptionException(
+                            String.Format(_("Unknown {0} option: '{1}'"),
+                                          action, val),
+                            val
+                        );
+                    }
+                }
+            };
+            parser.Add("h|help", _("Show this help"),
+                val => {
+                    Console.WriteLine(
+                        String.Format(
+                            _("Usage: smuxi-message-buffer {0} [action-options] db_path"),
+                            action
+                        )
+                    );
+                    Console.WriteLine();
+                    Console.WriteLine("  db_path " + _("Database path"));
+                    Console.WriteLine();
+                    Console.WriteLine(_("Options:"));
+                    parser.WriteOptionDescriptions(Console.Out);
+                    Environment.Exit(0);
+                }
+            );
+
+            parser.Parse(args);
+            if (parameters.Count < 1) {
+                throw new OptionException(
+                    _("db_path is required"),
+                    action
+                );
+            }
+            var dbPath = parameters[0];
+            Copy(dbPath, dbFormat, null, null);
+        }
+
+        static void CopyAction(string action, IEnumerable<string> args)
+        {
+            var sourceFormat = "";
+            var destinationFormat = "";
+            var parameters = new List<string>();
+            var parser = new OptionSet() {
+                { "source-format=", _("Source format (valid values: auto, db4o, sqlite)"),
+                    val => {
+                        if (val == "auto") {
+                            val = "";
+                        }
+                        sourceFormat = val;
+                    }
+                },
+                { "destination-format=", _("Destination format (valid values: auto, db4o, sqlite)"),
+                    val => {
+                        if (val == "auto") {
+                            val = "";
+                        }
+                        destinationFormat = val;
+                    }
+                },
+                { "<>",
+                    val => {
+                        if (!val.StartsWith("-")) {
+                            parameters.Add(val);
+                            return;
+                        }
+                        throw new OptionException(
+                            String.Format(_("Unknown {0} option: '{1}'"),
+                                      action, val),
+                            val
+                        );
+                    }
+                }
+            };
+            parser.Add("h|help", _("Show this help"),
+                val => {
+                    Console.WriteLine(
+                        String.Format(
+                            _("Usage: smuxi-message-buffer {0} [action-options] source_db destination_db"),
+                            action
+                        )
+                    );
+                    Console.WriteLine();
+                    Console.WriteLine("  source_db " + _("Source file path"));
+                    Console.WriteLine("  destination_db " + _("Destination file path or -/empty for 
stdout"));
+                    Console.WriteLine();
+                    Console.WriteLine(_("Options:"));
+                    parser.WriteOptionDescriptions(Console.Out);
+                    Environment.Exit(0);
+                }
+            );
+
+            parser.Parse(args);
+            if (parameters.Count < 2) {
+                throw new OptionException(
+                    _("source_db and destination_db are required"),
+                    action
+                );
+            }
+            var sourceFile = parameters[0];
+            var destinationFile = parameters[1];
+            if (destinationFile == "-") {
+                destinationFile = "";
+            }
+            Copy(sourceFile, sourceFormat, destinationFile, destinationFormat);
+        }
+
+        static void Copy(string sourceFile, string sourceFormat,
+                         string destinationFile, string destinationFormat)
+        {
+            if (String.IsNullOrEmpty(sourceFile)) {
+                throw new ArgumentException(_("sourceFile must not be empty."));
+            }
+
+            IMessageBuffer sourceBuffer = null, destinationBuffer = null;
+            try {
+                var sourceBufferType = ParseMessageBufferType(sourceFile, sourceFormat);
+                sourceBuffer = CreateMessageBuffer(sourceFile, sourceBufferType);
+
+                if (!String.IsNullOrEmpty(destinationFile)) {
+                    var destinationBufferType = ParseMessageBufferType(destinationFile,
+                                                                       destinationFormat);
+                    destinationBuffer = CreateMessageBuffer(destinationFile,
+                                                            destinationBufferType);
+                    if (destinationBuffer.Count > 0) {
+                        throw new InvalidOperationException(
+                            String.Format(
+                                _("Destination database {0} must be empty!"),
+                                destinationFile
+                            )
+                        );
+                    }
+                }
+
+                if (destinationBuffer == null) {
+                    // JSON pipe
+                    Console.WriteLine("[");
+                    var msgCount = sourceBuffer.Count;
+                    var i = 0;
+                    foreach (var msg in sourceBuffer) {
+                        var dto = new MessageDtoModelV1(msg);
+                        var json = JsonSerializer.SerializeToString(dto);
+                        if (i++ < msgCount - 1) {
+                            Console.WriteLine("{0},", json);
+                        } else {
+                            Console.WriteLine(json);
+                        }
+                    }
+                    if (destinationBuffer == null) {
+                        Console.WriteLine("]");
+                    }
+                } else {
+                    foreach (var msg in sourceBuffer) {
+                        destinationBuffer.Add(msg);
+                    }
+                    destinationBuffer.Flush();
+                }
+            } finally {
+                if (sourceBuffer != null) {
+                    sourceBuffer.Dispose();
+                }
+                if (destinationBuffer != null) {
+                    destinationBuffer.Dispose();
+                }
+            }
+        }
+
+        static MessageBufferType ParseMessageBufferType(string fileName, string type)
+        {
+            if (String.IsNullOrEmpty(type)) {
+                if (fileName.EndsWith(".sqlite3")) {
+                    return MessageBufferType.Sqlite;
+                } else if (fileName.EndsWith(".db4o")) {
+                    return MessageBufferType.Db4o;
+                } else {
+                    throw new ArgumentException(
+                        String.Format(
+                            _("Unknown file format: '{0}'"),
+                            fileName
+                        ),
+                        "fileName"
+                    );
+                }
+            }
+            return (MessageBufferType) Enum.Parse(typeof(MessageBufferType),
+                                                  fileName, true);
+        }
+
+        static IMessageBuffer CreateMessageBuffer(string fileName,
+                                                  MessageBufferType bufferType)
+        {
+            switch (bufferType) {
+                case MessageBufferType.Db4o:
+                    return new Db4oMessageBuffer(fileName);
+                case MessageBufferType.Sqlite:
+                    return new SqliteMessageBuffer(fileName);
+                default:
+                    throw new ArgumentException(
+                        String.Format(
+                            _("Unsupported buffer type: '{0}'"),
+                            bufferType
+                        ),
+                        "bufferType"
+                    );
+            }
+        }
+
+        static void InitLocale()
+        {
+            string appDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
+            string localeDir = Path.Combine(appDir, "locale");
+            if (!Directory.Exists(localeDir)) {
+                localeDir = Path.Combine(Defines.InstallPrefix, "share");
+                localeDir = Path.Combine(localeDir, "locale");
+            }
+
+            LibraryCatalog.Init("smuxi-message-buffer", localeDir);
+            Logger.Debug("Using locale data from: " + localeDir);
+        }
+
+        static string _(string msg)
+        {
+            return LibraryCatalog.GetString(msg, LibraryTextDomain);
+        }
+    }
+
+    public enum MessageBufferType {
+        None,
+        Pipe,
+        Db4o,
+        Sqlite
+    }
+}
diff --git a/src/Engine-MessageBuffer/Makefile.am b/src/Engine-MessageBuffer/Makefile.am
new file mode 100644
index 0000000..0ad570d
--- /dev/null
+++ b/src/Engine-MessageBuffer/Makefile.am
@@ -0,0 +1,35 @@
+TARGET_DIR = $(top_builddir)/bin/$(PROFILE)
+ASSEMBLY_NAME = smuxi-message-buffer
+ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).exe
+ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME)
+
+SOURCES = \
+       $(top_srcdir)/src/AssemblyVersion.cs \
+       AssemblyInfo.cs \
+       Main.cs
+
+REFERENCES = \
+       System \
+       System.Core \
+       Mono.Posix \
+       $(LOG4NET_LIBS)
+
+DLL_REFERENCES = \
+       $(TARGET_DIR)/smuxi-common.dll \
+       $(TARGET_DIR)/smuxi-engine.dll \
+       $(TARGET_DIR)/ServiceStack.Text.dll
+
+SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES))
+
+# automake magic variables
+EXTRA_DIST = $(SOURCES_BUILD)
+CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb
+
+pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb
+
+include $(top_srcdir)/Makefile.include
+
+all: $(ASSEMBLY_TARGET)
+
+$(ASSEMBLY_TARGET): $(SOURCES) $(DLL_REFERENCES)
+       $(CSC) $(CSC_FLAGS) $(MSG_BUFFER_COMPILER_FLAGS) $(build_references_ref) -target:exe -out:$@ 
$(SOURCES_BUILD)
diff --git a/src/Engine-MessageBuffer/smuxi-message-buffer.exe.config 
b/src/Engine-MessageBuffer/smuxi-message-buffer.exe.config
new file mode 100644
index 0000000..d8a3872
--- /dev/null
+++ b/src/Engine-MessageBuffer/smuxi-message-buffer.exe.config
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
+    </configSections>
+    <log4net>
+        <root>
+            <appender-ref ref="ConsoleAppender" />
+        </root>
+        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
+            <layout type="log4net.Layout.PatternLayout">
+                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
+            </layout>
+        </appender>
+    </log4net>
+</configuration>
diff --git a/src/Engine-MessageBuffer/smuxi-message-buffer.in 
b/src/Engine-MessageBuffer/smuxi-message-buffer.in
new file mode 100644
index 0000000..2da8b0c
--- /dev/null
+++ b/src/Engine-MessageBuffer/smuxi-message-buffer.in
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec mono --debug "@expanded_libdir@/@PACKAGE@/smuxi-message-buffer.exe" "$@"
diff --git a/src/Engine-Twitter/Makefile.am b/src/Engine-Twitter/Makefile.am
index 9398d39..e9dec8e 100644
--- a/src/Engine-Twitter/Makefile.am
+++ b/src/Engine-Twitter/Makefile.am
@@ -22,7 +22,7 @@ SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES))
 
 # automake magic variables
 EXTRA_DIST = $(SOURCES_BUILD)
-CLEANFILES = $(ASSEMBLY_TARGET)
+CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb
 
 pkgapp_DATA = $(ASSEMBLY_TARGET)
 
diff --git a/src/Engine/MessageBuffers/SqliteMessageBuffer.cs 
b/src/Engine/MessageBuffers/SqliteMessageBuffer.cs
index bb3f89e..2cfe2aa 100644
--- a/src/Engine/MessageBuffers/SqliteMessageBuffer.cs
+++ b/src/Engine/MessageBuffers/SqliteMessageBuffer.cs
@@ -59,6 +59,21 @@ namespace Smuxi.Engine
                               base(sessionUsername, protocol, networkId, chatId)
         {
             DBPath = GetBufferPath() + ".sqlite3";
+            Init();
+        }
+
+        public SqliteMessageBuffer(string dbPath)
+        {
+            if (dbPath == null) {
+                throw new ArgumentNullException("dbPath");
+            }
+
+            DBPath = dbPath;
+            Init();
+        }
+
+        void Init()
+        {
             Connection = new SqliteConnection(
                 "Data Source=" + DBPath + ";" +
                 // enable Write-Ahead-Log (WAL)
diff --git a/src/Makefile.am b/src/Makefile.am
index 5d2e0ab..44f70e8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -63,6 +63,7 @@ SUBDIRS =     Common \
                $(ENGINE_CAMPFIRE) \
                $(ENGINE_JABBR) \
                $(ENGINE_XMPP) \
+               Engine-MessageBuffer \
                Server \
                Frontend \
                $(FRONTEND_GNOME) \
diff --git a/src/smuxi.sln b/src/smuxi.sln
index 32e352d..f2a5b29 100644
--- a/src/smuxi.sln
+++ b/src/smuxi.sln
@@ -67,6 +67,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StarkSoftProxy", "..\lib\St
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Frontend-GNOME-Twitter", 
"Frontend-GNOME-Twitter\Frontend-GNOME-Twitter.csproj", "{298A5895-D8C8-45EB-AC57-1B6AAD05D6AD}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine-MessageBuffer", 
"Engine-MessageBuffer\Engine-MessageBuffer.csproj", "{7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}"
+EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                Release|Any CPU = Release|Any CPU
@@ -219,6 +221,14 @@ Global
                {73DEF91D-03FF-41E3-B2E1-3259AF247CA7}.Release|Any CPU.Build.0 = Release|Any CPU
                {73DEF91D-03FF-41E3-B2E1-3259AF247CA7}.Release-Win32|x86.ActiveCfg = Release|Any CPU
                {73DEF91D-03FF-41E3-B2E1-3259AF247CA7}.Release-Win32|x86.Build.0 = Release|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Debug-Win32|x86.ActiveCfg = Debug|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Debug-Win32|x86.Build.0 = Debug|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Release|Any CPU.Build.0 = Release|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Release-Win32|x86.ActiveCfg = Release|Any CPU
+               {7964E3E4-1E98-4AE0-AF1B-1B940CDF0A99}.Release-Win32|x86.Build.0 = Release|Any CPU
                {7B1E3AB2-FB8C-4439-A2B4-2129EDBD79F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
                {7B1E3AB2-FB8C-4439-A2B4-2129EDBD79F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
                {7B1E3AB2-FB8C-4439-A2B4-2129EDBD79F8}.Debug-Win32|x86.ActiveCfg = Debug|Any CPU



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]