Avatar service
Avatar service | |
---|---|
Нет изображения | |
Имя файла | AVS.dll |
Авторы | Nightwish, Pescuma |
Скачать | |
Стабильная версия: | 32-bit, 64-bit |
Версия в разработке: | 32-bit, 64-bit |
Загружает и управляет аватарами для других плагинов.
О плагине
Это сервисный плагин. Он лишь предоставляет другим плагинам некоторые сервисы и события. Плагин загружает аватары по требованию и поддерживает внутренний кэш хэндлов. Кроме того, плагин прозрачно обрабатывает изменение аватаров и может уведомлять другие плагины об изменении аватара.
Как это работает
Если у контакта есть аватар, сервис MS_AV_GETAVATARBITMAP возвращает указатель на запись в кэше. Сервис МОЖЕТ вернуть 0, если доступный аватар отсутствует. Это не значит, что аватара нет вообще, а значит лишь то, что аватар ещё не готов к использованию. Когда кто-то вызывает сервис, запрашивающий аватар, плагин поппытается получить аватар (если это возможно) и, как только аватар готов к использованию, уведомить всех подписчиков через перехватываемое событие. Если аватар уже находится в кэше, возвращается кэшированная запись.
При смене аватара плагин запускает событие, передавая хэндл контакта в wParam и структуру данных с информацией об аватаре в lParam. Плагины, использующие идентификаторы изображений, возвращаемые MS_AV_GETAVATARBITMAP, ДОЛЖНЫ подписываться на ME_AV_AVATARCHANGED, поскольку исходный идентификатор может стать недействительным при смене аватара.
Получение аватаров происходит в отдельном потоке с разумными паузами, чтобы не сработала защита от флуда. Аватары кэшируются «в памяти».
Пример использования
#include "m_avatars.h" struct avatarCacheEntry *ace = 0; HBITMAP hbmAvatar = 0; ace = (struct avatarCacheEntry *)CallService(MS_AV_GETAVATARBITMAP, (WPARAM)hContact, 0); /* now, check the return value. if it is 0, then the avatar is not yet ready or unavailble for that contact. if it was only "not ready", your plugin will be notified by the hookable event ME_AV_AVATARCHANGED if the return value is != 0, then it is a valid bitmap handle. DON'T DESTROY IT IN YOUR CODE */ /* * event function * initialise with: * HANDLE hEvent = HookEvent(ME_AV_AVATARCHANGED, AvatarChanged); */ static int AvatarChanged(WPARAM wParam, LPARAM lParam) { struct avatarCacheEntry *ace = (struct avatarCacheEntry *)lParam; HANDLE hContact = (HANDLE)wParam; if(ace == NULL) return 0; if(ace->cbSize != sizeof(struct avatarCacheEntry)) return 0; // safety check(s) HBITMAP hbmAvatar = ace->hbmPic; ... ... }