diff options
Diffstat (limited to 'tools/_deprecated/YahooGroups/src/services.cpp')
-rw-r--r-- | tools/_deprecated/YahooGroups/src/services.cpp | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/tools/_deprecated/YahooGroups/src/services.cpp b/tools/_deprecated/YahooGroups/src/services.cpp new file mode 100644 index 0000000000..16e58a2add --- /dev/null +++ b/tools/_deprecated/YahooGroups/src/services.cpp @@ -0,0 +1,193 @@ +/*
+YahooGroups plugin for Miranda IM
+
+Copyright © 2007 Cristian Libotean
+
+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"
+
+#define CLIST_GROUPS "CListGroups"
+
+HANDLE hsYGMove = NULL;
+HANDLE hsYGReset = NULL;
+
+int InitServices()
+{
+ hsYGMove = CreateServiceFunction(MS_YAHOOGROUPS_MOVE, YahooGroupsMoveService);
+ hsYGReset = CreateServiceFunction(MS_YAHOOGROUPS_RESET, YahooGroupsResetService);
+
+ ReadAvailableGroups();
+
+ return 0;
+}
+
+int DestroyServices()
+{
+ DestroyServiceFunction(hsYGMove);
+ DestroyServiceFunction(hsYGReset);
+
+ return 0;
+}
+
+void ReadAvailableGroups()
+{
+ int ok = 1;
+ int index = 0;
+
+ char group[1024] = {0};
+ char tmp[128] = {0};
+
+ while (ok)
+ {
+ mir_snprintf(tmp, "%d", index);
+ GetStringFromDatabase(NULL, CLIST_GROUPS, tmp, NULL, group, sizeof(group));
+ if (mir_strlen(group) > 0)
+ {
+ availableGroups.Add(_strdup(group + 1));
+ index += 1;
+ }
+ else{
+ ok = 0;
+ }
+ }
+}
+
+int GetNextGroupIndex()
+{
+ int index = 0;
+ int found = 0;
+
+ char buffer[1024] = {0};
+ char tmp[128] = {0};
+
+ while (!found)
+ {
+ mir_snprintf(tmp, "%d", index++);
+
+ if (GetStringFromDatabase(NULL, CLIST_GROUPS, tmp, NULL, buffer, sizeof(buffer)))
+ {
+ found = 1;
+ }
+ }
+
+ return index - 1;
+}
+
+void AddNewGroup(const char *newGroup)
+{
+ int index = GetNextGroupIndex();
+
+ char tmp[128];
+ char group[1024];
+
+ *group = 1;
+ strncpy_s((group + 1), (_countof(group) - 1), newGroup, _TRUNCATE);
+
+ mir_snprintf(tmp, "%d", index);
+ const int MAX_SIZE = 1024;
+ wchar_t wide[MAX_SIZE] = {0};
+ *wide = 1;
+ MultiByteToWideChar(currentCodePage, 0, group + 1, -1, wide + 1, MAX_SIZE - 1);
+ db_set_ws(NULL, CLIST_GROUPS, tmp, wide);
+
+ availableGroups.Add(_strdup(group + 1));
+}
+
+void AddContactToGroup(MCONTACT hContact, char *group)
+{
+ const int MAX_SIZE = 1024;
+ wchar_t wide[MAX_SIZE] = {0};
+ MultiByteToWideChar(currentCodePage, 0, group, -1, wide, MAX_SIZE);
+ db_set_ws(hContact, "CList", "Group", wide);
+}
+
+void CreateGroup(char *group)
+{
+ char *p = group;
+ char *sub = group;
+
+ CMStringA buf;
+ while ((p = strchr(sub, '\\')))
+ {
+ *p = 0;
+ if (!buf.IsEmpty())
+ buf.AppendChar('\\');
+ buf.Append(sub);
+
+ if (!availableGroups.Contains(buf))
+ AddNewGroup(buf);
+
+ *p++ = '\\';
+ sub = p;
+ }
+
+ if (sub) {
+ if (!buf.IsEmpty())
+ buf.AppendChar('\\');
+ buf.Append(sub);
+
+ if (!availableGroups.Contains(buf))
+ AddNewGroup(buf);
+ }
+}
+
+void ProcessContacts(void (*callback)(MCONTACT, char *), char *protocol)
+{
+ for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact))
+ callback(hContact, protocol);
+}
+
+void YahooMoveCallback(MCONTACT hContact, char*)
+{
+ char protocol[128] = {0};
+ GetContactProtocol(hContact, protocol, sizeof(protocol));
+
+ if (mir_strlen(protocol) > 0)
+ {
+ char ygroup[128] = {0};
+
+ if (!GetStringFromDatabase(hContact, protocol, "YGroup", NULL, ygroup, sizeof(ygroup)))
+ {
+ CreateGroup(ygroup);
+ AddContactToGroup(hContact, ygroup);
+ }
+ }
+}
+
+void ResetGroupCallback(MCONTACT hContact, char *protocol)
+{
+ char p[128] = {0};
+
+ GetContactProtocol(hContact, p, sizeof(protocol));
+
+ if ((!protocol) || (_stricmp(protocol, p) == 0))
+ {
+ db_unset(hContact, "CList", "Group");
+ }
+}
+
+INT_PTR YahooGroupsMoveService(WPARAM, LPARAM)
+{
+ ProcessContacts(YahooMoveCallback, NULL);
+ return 0;
+}
+
+INT_PTR YahooGroupsResetService(WPARAM, LPARAM)
+{
+ ProcessContacts(ResetGroupCallback, NULL);
+ return 0;
+}
|