summaryrefslogtreecommitdiff
path: root/protocols/Sametime/src/utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Sametime/src/utils.cpp')
-rw-r--r--protocols/Sametime/src/utils.cpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/protocols/Sametime/src/utils.cpp b/protocols/Sametime/src/utils.cpp
new file mode 100644
index 0000000000..40e23fbe4a
--- /dev/null
+++ b/protocols/Sametime/src/utils.cpp
@@ -0,0 +1,170 @@
+#include "StdAfx.h"
+#include "sametime.h"
+
+
+LRESULT CALLBACK PopupWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_COMMAND:
+ {
+ PUDeletePopup(hWnd);
+ break;
+ }
+
+ case WM_CONTEXTMENU:
+ PUDeletePopup(hWnd);
+ break;
+
+ case UM_FREEPLUGINDATA:
+ {
+ PopupData* puData = (PopupData*)PUGetPluginData(hWnd);
+ if (puData != NULL && puData != (PopupData*)CALLSERVICE_NOTFOUND)
+ {
+ mir_free(puData->title);
+ mir_free(puData->text);
+ mir_free(puData);
+ }
+ break;
+ }
+ }
+
+ return DefWindowProc(hWnd, msg, wParam, lParam);
+}
+
+
+void CSametimeProto::RegisterPopups()
+{
+ TCHAR szDescr[256];
+ char szName[256];
+
+ debugLog(_T("CSametimeProto::RegisterPopups()"));
+
+ POPUPCLASS puc = { sizeof(puc) };
+ puc.PluginWindowProc = PopupWindowProc;
+ puc.flags = PCF_TCHAR;
+ puc.ptszDescription = szDescr;
+ puc.pszName = szName;
+
+ mir_snprintf(szName, SIZEOF(szName), "%s_%s", m_szModuleName, "Notify");
+ mir_sntprintf(szDescr, SIZEOF(szDescr), _T("%s/%s"), m_tszUserName, TranslateT("Notification"));
+ puc.hIcon = CopyIcon(LoadIconEx("notify", FALSE));
+ ReleaseIconEx("notify", FALSE);
+ puc.iSeconds = 8;
+ puc.colorBack = GetSysColor(COLOR_BTNFACE);
+ puc.colorText = GetSysColor(COLOR_WINDOWTEXT);
+ hPopupNotify = Popup_RegisterClass(&puc);
+
+ mir_snprintf(szName, SIZEOF(szName), "%s_%s", m_szModuleName, "Error");
+ mir_sntprintf(szDescr, SIZEOF(szDescr), _T("%s/%s"), m_tszUserName, TranslateT("Error"));
+ puc.hIcon = CopyIcon(LoadIconEx("error", FALSE));
+ ReleaseIconEx("error", FALSE);
+ puc.iSeconds = 10;
+ puc.colorBack = GetSysColor(COLOR_BTNFACE);
+ puc.colorText = GetSysColor(COLOR_WINDOWTEXT);
+ hPopupError = Popup_RegisterClass(&puc);
+
+}
+
+
+void CSametimeProto::UnregisterPopups()
+{
+ debugLog(_T("CSametimeProto::RegisterPopups()"));
+ Popup_UnregisterClass(hPopupError);
+ Popup_UnregisterClass(hPopupNotify);
+}
+
+
+void CALLBACK sttMainThreadCallback(PVOID dwParam)
+{
+
+ PopupData* puData = (PopupData*)dwParam;
+ CSametimeProto* proto = puData->proto;
+
+ ErrorDisplay disp = proto->options.err_method;
+ // funny logic :) ... try to avoid message boxes
+ // if want baloons but no balloons, try popups
+ // if want popups but no popups, try baloons
+ // if, after that, you want balloons but no balloons, revert to message boxes
+ if (disp == ED_BAL && !ServiceExists(MS_CLIST_SYSTRAY_NOTIFY)) disp = ED_POP;
+ if (disp == ED_POP && !ServiceExists(MS_POPUP_ADDPOPUPCLASS)) disp = ED_BAL;
+ if (disp == ED_BAL && !ServiceExists(MS_CLIST_SYSTRAY_NOTIFY)) disp = ED_MB;
+
+ if (disp == ED_POP){
+
+ POPUPDATACLASS ppd = {sizeof(ppd)};
+ char szName[256];
+ ppd.ptszTitle = puData->title;
+ ppd.ptszText = puData->text;
+ if (puData->flag == SAMETIME_POPUP_ERROR){
+ mir_snprintf(szName, SIZEOF(szName), "%s_%s", proto->m_szModuleName, "Error");
+ } else {
+ mir_snprintf(szName, SIZEOF(szName), "%s_%s", proto->m_szModuleName, "Notify");
+ }
+ CallService(MS_POPUP_ADDPOPUPCLASS, 0, (LPARAM)&ppd);
+
+ } else if (disp == ED_BAL) {
+
+ MIRANDASYSTRAYNOTIFY sn = { sizeof(sn) };
+ sn.szProto = proto->m_szModuleName;
+ sn.tszInfoTitle = puData->title;
+ sn.tszInfo = puData->text;
+ sn.dwInfoFlags = NIIF_INTERN_UNICODE;
+ if (puData->flag == SAMETIME_POPUP_ERROR){
+ sn.dwInfoFlags = sn.dwInfoFlags | NIIF_WARNING;
+ sn.uTimeout = 1000 * 10;
+ } else {
+ sn.dwInfoFlags = sn.dwInfoFlags | NIIF_INFO;
+ sn.uTimeout = 1000 * 8;
+ }
+ CallService(MS_CLIST_SYSTRAY_NOTIFY, 0, (LPARAM)&sn);
+
+ } else { //disp == ED_MB
+
+ if (puData->flag == SAMETIME_POPUP_ERROR){
+ MessageBox(NULL, puData->text, puData->title, MB_OK | MB_ICONWARNING);
+ } else {
+ MessageBox(NULL, puData->text, puData->title, MB_OK | MB_ICONINFORMATION);
+ }
+
+ }
+
+ if (disp != ED_POP){
+ mir_free(puData->title);
+ mir_free(puData->text);
+ mir_free(puData);
+ }
+
+}
+
+void CSametimeProto::showPopup(const TCHAR* msg, SametimePopupEnum flag)
+{
+ if (Miranda_Terminated()) return;
+
+ PopupData *puData = (PopupData*)mir_calloc(sizeof(PopupData));
+ puData->flag = flag;
+ puData->title = mir_tstrdup(m_tszUserName);
+ puData->text = mir_tstrdup(msg);
+ puData->proto = this;
+
+ CallFunctionAsync(sttMainThreadCallback, puData);
+}
+
+
+void LogFromGLib(const gchar* log_domain, GLogLevelFlags log_level, const gchar* message, gpointer user_data)
+{
+ CSametimeProto* proto = (CSametimeProto*)user_data;
+ proto->debugLog(_A2T(message));
+}
+
+void CSametimeProto::RegisterGLibLogger()
+{
+ debugLog(_T("CSametimeProto::RegisterGLibLogger"));
+ gLogHandler = g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, LogFromGLib, this);
+}
+
+void CSametimeProto::UnRegisterGLibLogger()
+{
+ debugLog(_T("CSametimeProto::UnRegisterGLibLogger"));
+ if (gLogHandler) g_log_remove_handler(G_LOG_DOMAIN, gLogHandler);
+}