/* Bonsai plugin for Miranda IM Copyright © 2006 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 "list.h" COptionsList &lstPluginOptions = COptionsList(); COptionsList::COptionsList(int initialCapacity) { _plugins = NULL; _count = 0; _capacity = 0; Enlarge(initialCapacity); } COptionsList::~COptionsList() { Clear(); free(_plugins); } void COptionsList::Clear() { int i; for (i = 0; i < Count(); i++) { delete _plugins[i]; } _count = 0; } int COptionsList::Count() const { return _count; } int COptionsList::Capacity() const { return _capacity; } void COptionsList::EnsureCapacity() { if (_count >= _capacity) { Enlarge(_capacity / 2); } } void COptionsList::Enlarge(int increaseAmount) { int newSize = _capacity + increaseAmount; _plugins = (PPluginOptions *) realloc(_plugins, newSize * sizeof(PPluginOptions)); _capacity = newSize; } int COptionsList::Contains(const WCHAR *plugin, const WCHAR *group, const WCHAR *title) const { int pos = Index(plugin, group, title); return (pos >= 0); } int COptionsList::Index(const WCHAR *plugin, const WCHAR *group, const WCHAR *title) const { int i; DWORD hPlugin = LangPackHashW(plugin); DWORD hGroup = LangPackHashW(group); DWORD hTitle = LangPackHashW(title); PPluginOptions p; for (i = 0; i < Count(); i++) { p = _plugins[i]; if ((hPlugin == p->pluginHash) && (hGroup == p->groupHash) && (hTitle == p->titleHash)) { return i; } } return -1; } int COptionsList::Add(const WCHAR *plugin, const WCHAR *group, const WCHAR *title) { int pos = Index(plugin, group, title); if (pos < 0) { EnsureCapacity(); PPluginOptions s = new TPluginOptions(plugin, group, title, LangPackHashW(plugin), LangPackHashW(group), LangPackHashW(title)); _plugins[_count++] = s; if (hOptDlg) { SendMessage(hOptDlg, FOM_UPDATEPLUGINS, 0, 0); } pos = _count - 1; } return pos; } int COptionsList::Remove(int index) { if ((index < 0) && (index >= Count())) { return 1; } int i; PPluginOptions tmp = _plugins[index]; for (i = index; i < _count - 1; i++) { _plugins[i] = _plugins[i + 1]; } _count--; delete tmp; return 0; } const PPluginOptions COptionsList::operator [](int index) { if ((index < 0) || (index >= Count())) { return NULL; } return _plugins[index]; } char *BuildPluginUniqueID(PPluginOptions plugin, char *out, int size, int type) { mir_snprintf(out, size, "%lu-%lu-%lu-%s", plugin->pluginHash, plugin->groupHash, plugin->titleHash, (type == ID_GROUP) ? "G" : "T"); return out; } WCHAR *GetPluginGroup(PPluginOptions plugin, WCHAR *group, int count) { char name[256]; WCHAR *res = plugin->szGroup; BuildPluginUniqueID(plugin, name, 256, ID_GROUP); GetStringFromDatabase(name, plugin->szGroup, group, count); res = (wcslen(group) == 0) ? NULL : group; return res; } WCHAR *GetPluginTitle(PPluginOptions plugin, WCHAR *title, int count) { char name[256]; WCHAR *res = plugin->szTitle; BuildPluginUniqueID(plugin, name, 256, ID_TITLE); GetStringFromDatabase(name, plugin->szTitle, title, count); res = (wcslen(title) == 0) ? NULL : title; return res; } void SavePluginGroup(PPluginOptions plugin, WCHAR *newGroup) { char name[256]; int del = 0; BuildPluginUniqueID(plugin, name, 256, ID_GROUP); if (plugin->szGroup) { del = (wcscmp(plugin->szGroup, newGroup) == 0) ? 1 : 0; } else{ del = ((!newGroup) || (wcslen(newGroup) == 0)) ? 1 : 0; } if (del) { DBDeleteContactSetting(NULL, ModuleName, name); } else{ DBWriteContactSettingWString(NULL, ModuleName, name, newGroup); } } void SavePluginTitle(PPluginOptions plugin, WCHAR *newTitle) { char name[256]; int del = 0; BuildPluginUniqueID(plugin, name, sizeof(name), ID_TITLE); if (plugin->szTitle) { del = (wcscmp(plugin->szTitle, newTitle) == 0) ? 1 : 0; } else{ del = ((!newTitle) || (wcslen(newTitle)) == 0) ? 1 : 0; } if (del) { DBDeleteContactSetting(NULL, ModuleName, name); } else{ DBWriteContactSettingWString(NULL, ModuleName, name, newTitle); } }