summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/Import/src/main.cpp2
-rw-r--r--plugins/Import/src/mcontacts.cpp212
-rw-r--r--plugins/Import/src/stdafx.h2
-rw-r--r--plugins/Import/src/version.h4
4 files changed, 217 insertions, 3 deletions
diff --git a/plugins/Import/src/main.cpp b/plugins/Import/src/main.cpp
index 10f22c7568..5bb1a2f5f4 100644
--- a/plugins/Import/src/main.cpp
+++ b/plugins/Import/src/main.cpp
@@ -148,6 +148,6 @@ int CMPlugin::Load()
InitCommonControlsEx(&icex);
RegisterDbrw();
-
+ RegisterMContacts();
return 0;
}
diff --git a/plugins/Import/src/mcontacts.cpp b/plugins/Import/src/mcontacts.cpp
new file mode 100644
index 0000000000..d52690b20b
--- /dev/null
+++ b/plugins/Import/src/mcontacts.cpp
@@ -0,0 +1,212 @@
+/*
+
+Import plugin for Miranda NG
+
+Copyright (c) 2012-18 Miranda NG team (https://miranda-ng.org)
+
+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 <memory>
+#include <vector>
+
+#define HEADER_STR "BHBF"
+
+static int mc_makeDatabase(const wchar_t*)
+{
+ return 1;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// CDbxMcontacts database driver, read-only
+
+#pragma pack(push, 1)
+
+struct MC_FileHeader
+{
+ unsigned char signature[4];
+ unsigned char version;
+ unsigned char extraFlags;
+ unsigned short int reserved;
+ unsigned int codepage;
+ unsigned short int dataStart;
+};
+
+struct MC_MsgHeader
+{
+ DWORD timestamp;
+ WORD eventType;
+ WORD flags;
+};
+
+#pragma pack(pop)
+
+class CDbxMc : public MDatabaseCommon, public MZeroedObject
+{
+ HANDLE m_hFile = INVALID_HANDLE_VALUE;
+
+ MC_FileHeader m_hdr;
+
+ std::vector<DWORD> m_events;
+ std::vector<DWORD>::iterator m_curr;
+
+ CMStringA readString()
+ {
+ CMStringA res;
+ char c;
+ DWORD dwRead;
+ while (ReadFile(m_hFile, &c, 1, &dwRead, 0)) {
+ if (c == 0)
+ break;
+ res.AppendChar(c);
+ }
+ return res;
+ }
+
+public:
+ CDbxMc()
+ {}
+
+ ~CDbxMc()
+ {
+ if (m_hFile != INVALID_HANDLE_VALUE)
+ ::CloseHandle(m_hFile);
+ }
+
+ void Load()
+ {
+ MC_MsgHeader hdr;
+
+ while (true) {
+ DWORD dwPos = SetFilePointer(m_hFile, 0, 0, FILE_CURRENT), dwRead;
+ BOOL r = ReadFile(m_hFile, &hdr, sizeof(hdr), &dwRead, 0);
+ if (!r || dwPos < sizeof(hdr))
+ return;
+
+ readString();
+ m_events.push_back(dwPos);
+ }
+ }
+
+ int Open(const wchar_t *profile)
+ {
+ m_hFile = CreateFile(profile, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
+ if (m_hFile == INVALID_HANDLE_VALUE)
+ return EGROKPRF_CANTREAD;
+
+ DWORD dwRead;
+ BOOL r = ReadFile(m_hFile, &m_hdr, sizeof(m_hdr), &dwRead, nullptr);
+ if (!r)
+ return EGROKPRF_CANTREAD;
+
+ return memcmp(&m_hdr.signature, HEADER_STR, 4) ? EGROKPRF_UNKHEADER : EGROKPRF_NOERROR;
+ }
+
+ STDMETHODIMP_(BOOL) IsRelational(void) override { return FALSE; }
+ STDMETHODIMP_(void) SetCacheSafetyMode(BOOL) override {};
+
+ STDMETHODIMP_(LONG) GetContactCount(void) override
+ {
+ return 1;
+ }
+
+ STDMETHODIMP_(LONG) DeleteContact(MCONTACT) override { return 1; }
+ STDMETHODIMP_(MCONTACT) AddContact(void) override { return 0; }
+ STDMETHODIMP_(BOOL) IsDbContact(MCONTACT contactID) override { return contactID == 1; }
+ STDMETHODIMP_(LONG) GetContactSize(void) override { return sizeof(DBCachedContact); }
+
+ STDMETHODIMP_(LONG) GetEventCount(MCONTACT) override { return (LONG)m_events.size(); }
+ STDMETHODIMP_(MEVENT) AddEvent(MCONTACT, DBEVENTINFO*) override { return 0; }
+ STDMETHODIMP_(BOOL) DeleteEvent(MCONTACT, MEVENT) override { return 1; }
+ STDMETHODIMP_(LONG) GetBlobSize(MEVENT) override { return 0; }
+ STDMETHODIMP_(BOOL) GetEvent(MEVENT, DBEVENTINFO*) override { return 0; }
+ STDMETHODIMP_(BOOL) MarkEventRead(MCONTACT, MEVENT) override { return 1; }
+ STDMETHODIMP_(MCONTACT) GetEventContact(MEVENT) override { return 0; }
+
+ STDMETHODIMP_(MEVENT) FindFirstEvent(MCONTACT) override
+ {
+ m_curr = m_events.begin();
+ return *m_curr;
+ }
+
+ STDMETHODIMP_(MEVENT) FindNextEvent(MCONTACT, MEVENT) override
+ {
+ if (m_curr == m_events.end())
+ return 0;
+
+ ++m_curr;
+ return *m_curr;
+ }
+
+ STDMETHODIMP_(MEVENT) FindLastEvent(MCONTACT) override
+ {
+ m_curr = m_events.end();
+ return *m_curr;
+ }
+
+ STDMETHODIMP_(MEVENT) FindPrevEvent(MCONTACT, MEVENT) override
+ {
+ if (m_curr == m_events.begin())
+ return 0;
+
+ --m_curr;
+ return *m_curr;
+ }
+
+ STDMETHODIMP_(MEVENT) FindFirstUnreadEvent(MCONTACT) override { return 0; }
+
+ STDMETHODIMP_(BOOL) EnumModuleNames(DBMODULEENUMPROC, void *) override { return 0; }
+
+ STDMETHODIMP_(BOOL) GetContactSettingWorker(MCONTACT, LPCSTR, LPCSTR, DBVARIANT*, int) override { return 1; }
+ STDMETHODIMP_(BOOL) WriteContactSetting(MCONTACT, DBCONTACTWRITESETTING*) override { return 1; }
+ STDMETHODIMP_(BOOL) DeleteContactSetting(MCONTACT, LPCSTR, LPCSTR) override { return 1; }
+ STDMETHODIMP_(BOOL) EnumContactSettings(MCONTACT, DBSETTINGENUMPROC, const char*, void*) override { return 1; }
+
+ STDMETHODIMP_(BOOL) MetaMergeHistory(DBCachedContact*, DBCachedContact*) override { return 1; }
+ STDMETHODIMP_(BOOL) MetaSplitHistory(DBCachedContact*, DBCachedContact*) override { return 1; }
+};
+
+static int mc_grokHeader(const wchar_t *profile)
+{
+ return CDbxMc().Open(profile);
+}
+
+static MDatabaseCommon* mc_load(const wchar_t *profile, BOOL)
+{
+ std::auto_ptr<CDbxMc> db(new CDbxMc());
+ if (db->Open(profile))
+ return nullptr;
+
+ db->Load();
+ return db.release();
+}
+
+static DATABASELINK dblink =
+{
+ 0,
+ "mcontacts",
+ L"mContacts file driver",
+ mc_makeDatabase,
+ mc_grokHeader,
+ mc_load
+};
+
+void RegisterMContacts()
+{
+ RegisterDatabasePlugin(&dblink);
+}
diff --git a/plugins/Import/src/stdafx.h b/plugins/Import/src/stdafx.h
index 667f81b861..a171890822 100644
--- a/plugins/Import/src/stdafx.h
+++ b/plugins/Import/src/stdafx.h
@@ -99,3 +99,5 @@ extern bool g_bServiceMode, g_bSendQuit;
HANDLE GetIconHandle(int iIconId);
void RegisterIcons(void);
+
+void RegisterMContacts();
diff --git a/plugins/Import/src/version.h b/plugins/Import/src/version.h
index 6f3f133ba1..4d1b1af376 100644
--- a/plugins/Import/src/version.h
+++ b/plugins/Import/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 95
-#define __RELEASE_NUM 8
-#define __BUILD_NUM 6
+#define __RELEASE_NUM 9
+#define __BUILD_NUM 1
#include <stdver.h>