int StatusChanged(WPARAM wParam, LPARAM lParam) { LogMessage("MS_CLIST_SETSTATUSMODE called. szProto=%s, Status=%d", lParam ? (char*)lParam : "NULL", wParam); g_ProtoStates[(char*)lParam].Status = wParam; // let's check if we handle this thingy if (g_fNoProcessing) { // we're told not to do anything g_fNoProcessing = false; // take it off return 0; } DWORD Flag1 = 0; DWORD Flag3 = 0; if (lParam) { Flag1 = CallProtoService((char*)lParam, PS_GETCAPS, PFLAGNUM_1, 0); Flag3 = CallProtoService((char*)lParam, PS_GETCAPS, PFLAGNUM_3, 0); } else { PROTOACCOUNT **accs; int numAccs = 0; Proto_EnumAccounts(&numAccs, &accs); for (int i = 0; i < numAccs; i++) { Flag1 |= CallProtoService(accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0); Flag3 |= CallProtoService(accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0); } } if (!(Flag1 & PF1_MODEMSGSEND || Flag3 & Proto_Status2Flag(wParam) || (Flag1 & PF1_IM) == PF1_IM)) return 0; // there are no protocols with changed status that support autoreply or away messages for this status if (g_SetAwayMsgPage.GetWnd()) { SetForegroundWindow(g_SetAwayMsgPage.GetWnd()); return 0; } int i; for (i = _countof(StatusModeList) - 1; i >= 0; i--) if (wParam == StatusModeList[i].Status) break; if (i < 0) return 0; BOOL bScreenSaverRunning; SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &bScreenSaverRunning, 0); if (bScreenSaverRunning || g_MoreOptPage.GetDBValueCopy(StatusModeList[i].DontShowDialogCtlID)) { CProtoSettings((char*)lParam).SetMsgFormat(SMF_PERSONAL, CProtoSettings((char*)lParam).GetMsgFormat(GMF_LASTORDEFAULT)); ChangeProtoMessages((char*)lParam, wParam, TCString()); } else { SetAwayMsgData *dat = new SetAwayMsgData; memset(dat, 0, sizeof(SetAwayMsgData)); dat->szProtocol = (char*)lParam; dat->IsModeless = false; DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_SETAWAYMSG), NULL, SetAwayMsgDlgProc, (LPARAM)dat); } return 0; }
static int OnOkToExit(WPARAM, LPARAM) { // save last protocolstatus int count; PROTOACCOUNT** protos; Proto_EnumAccounts(&count, &protos); for (int i = 0; i < count; i++) { PROTOACCOUNT *pa = protos[i]; if (!IsSuitableProto(pa)) continue; if (!Proto_GetAccount(pa->szModuleName)) continue; char lastName[128], lastMsg[128]; mir_snprintf(lastName, "%s%s", PREFIX_LAST, pa->szModuleName); db_set_w(NULL, MODULENAME, lastName, (WORD)CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0)); mir_snprintf(lastMsg, "%s%s", PREFIX_LASTMSG, pa->szModuleName); db_unset(NULL, MODULENAME, lastMsg); if (!(CallProtoService(pa->szModuleName, PS_GETCAPS, (WPARAM)PFLAGNUM_1, 0) & PF1_MODEMSGSEND & ~PF1_INDIVMODEMSG)) continue; int status = CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0); if (!(CallProtoService(pa->szModuleName, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0) & Proto_Status2Flag(status))) continue; // NewAwaySys if (ServiceExists(MS_NAS_GETSTATE)) { NAS_PROTOINFO npi = { sizeof(npi) }; npi.szProto = pa->szModuleName; CallService(MS_NAS_GETSTATE, (WPARAM)&npi, 1); if (npi.szMsg == NULL) { npi.status = 0; npi.szProto = NULL; CallService(MS_NAS_GETSTATE, (WPARAM)&npi, 1); } if (npi.szMsg != NULL) { db_set_ts(NULL, MODULENAME, lastMsg, npi.tszMsg); mir_free(npi.tszMsg); } } } if (db_get_b(NULL, MODULENAME, SETTING_SETPROFILE, 1) || db_get_b(NULL, MODULENAME, SETTING_OFFLINECLOSE, 0)) { if (ServiceExists(MS_CLIST_SETSTATUSMODE)) CallService(MS_CLIST_SETSTATUSMODE, (WPARAM)ID_STATUS_OFFLINE, 0); else log_debugA("StartupStatus: MS_CLIST_SETSTATUSMODE not available!"); } return 0; }
static TCHAR* GetAwayMessage(int statusMode, char *szProto) { DBVARIANT dbv; if (szProto && !(CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(statusMode))) return NULL; if (DBGetContactSettingByte(NULL, "SRAway", StatusModeToDbSetting(statusMode, "Ignore"), 0)) return NULL; if (DBGetContactSettingByte(NULL, "SRAway", StatusModeToDbSetting(statusMode, "UsePrev"),0)) { if (DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(statusMode, "Msg"), &dbv)) dbv.ptszVal = mir_tstrdup(GetDefaultMessage(statusMode)); } else { int i; TCHAR substituteStr[128]; if (DBGetContactSettingTString(NULL, "SRAway", StatusModeToDbSetting(statusMode,"Default"), &dbv)) dbv.ptszVal = mir_tstrdup(GetDefaultMessage(statusMode)); for (i=0; dbv.ptszVal[i]; i++) { if (dbv.ptszVal[i] != '%') continue; if (!_tcsnicmp(dbv.ptszVal + i, _T("%time%"), 6)) { MIRANDA_IDLE_INFO mii = {0}; mii.cbSize = sizeof(mii); CallService(MS_IDLE_GETIDLEINFO, 0, (LPARAM)&mii); if (mii.idleType == 1) { int mm; SYSTEMTIME t; GetLocalTime(&t); mm = t.wMinute + t.wHour * 60 - mii.idleTime; if (mm < 0) mm += 60 * 24; t.wMinute = mm % 60; t.wHour = mm / 60; GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &t, NULL, substituteStr, SIZEOF(substituteStr)); } else GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, NULL, NULL, substituteStr, SIZEOF(substituteStr)); } else if (!_tcsnicmp(dbv.ptszVal + i, _T("%date%"), 6)) GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, substituteStr, SIZEOF(substituteStr)); else continue; if (lstrlen(substituteStr) > 6) dbv.ptszVal = (TCHAR*)mir_realloc(dbv.ptszVal, (lstrlen(dbv.ptszVal) + 1 + lstrlen(substituteStr) - 6) * sizeof(TCHAR)); MoveMemory(dbv.ptszVal + i + lstrlen(substituteStr), dbv.ptszVal + i + 6, (lstrlen(dbv.ptszVal) - i - 5) * sizeof(TCHAR)); CopyMemory(dbv.ptszVal+i, substituteStr, lstrlen(substituteStr) * sizeof(TCHAR)); } } return dbv.ptszVal; }
static int StatusModeChange(WPARAM wParam, LPARAM lParam) { int statusMode = (int)wParam; char *szProto = (char*)lParam; if (protoModeMsgFlags == 0) return 0; // If its a global change check the complete PFLAGNUM_3 flags to see if a popup might be needed if (!szProto) { if (!(protoModeMsgFlags & Proto_Status2Flag(statusMode))) return 0; } else { // If its a single protocol check the PFLAGNUM_3 for the single protocol if (!(CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) || !(CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(statusMode))) return 0; } BOOL bScreenSaverRunning = IsScreenSaverRunning(); if (GetStatusModeByte(statusMode, "Ignore")) ChangeAllProtoMessages(szProto, statusMode, NULL); else if (bScreenSaverRunning || GetStatusModeByte(statusMode, "NoDlg", true)) { TCHAR *msg = GetAwayMessage(statusMode, szProto); ChangeAllProtoMessages(szProto, statusMode, msg); mir_free(msg); } else { SetAwasMsgNewData *newdat = (SetAwasMsgNewData*)mir_alloc(sizeof(SetAwasMsgNewData)); newdat->szProto = szProto; newdat->statusMode = statusMode; if (hwndStatusMsg) DestroyWindow(hwndStatusMsg); hwndStatusMsg = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_SETAWAYMSG), NULL, SetAwayMsgDlgProc, (LPARAM)newdat); } return 0; }
int SetAwayMsg(int pos, WPARAM wParam, LPARAM lParam) { WORD status = (WORD) wParam; char *msg = (char *) lParam; if (protos.info[pos].initialized && status >= ID_STATUS_ONLINE && status <= ID_STATUS_OUTTOLUNCH && (Proto_Status2Flag(status) & protos.info[pos].flags)) { replaceStr(protos.info[pos].msgs[status - ID_STATUS_ONLINE], msg); } return protos.info[pos].setAwayMsg(wParam, lParam); }
void QueryAwayMessage(HWND hWnd, PLUGINDATA *pdp) { HANDLE hContact = PUGetContact(hWnd); char *szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); if (szProto) { if ((CallProtoService(szProto, PS_GETCAPS,PFLAGNUM_1, 0) & PF1_MODEMSGRECV) && (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(pdp->newStatus))) { //The following HookEventMessage will hook the ME_PROTO_ACK event and send a WM_AWAYMSG to hWnd when the hooks get notified. pdp->hAwayMsgHook = HookEventMessage(ME_PROTO_ACK, hWnd, WM_AWAYMSG); //The following instruction asks Miranda to retrieve the away message and associates a hProcess (handle) to this request. This handle will appear in the ME_PROTO_ACK event. pdp->hAwayMsgProcess = (HANDLE)CallContactService(hContact, PSS_GETAWAYMSG, 0, 0); } } }
static int AwayMsgPreBuildMenu(WPARAM wParam,LPARAM lParam) { CLISTMENUITEM clmi; char str[128]; int status; char *szProto; szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wParam,0); ZeroMemory(&clmi,sizeof(clmi)); clmi.cbSize=sizeof(clmi); clmi.flags=CMIM_FLAGS|CMIF_HIDDEN; if(szProto!=NULL) { status = DBGetContactSettingWord((HANDLE)wParam,szProto,"Status",ID_STATUS_OFFLINE); wsprintf(str,Translate("Re&ad %s Message"),(char*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION,status,0)); clmi.pszName=str; if(CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_1,0)&PF1_MODEMSGRECV) { if(CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_3,0)&Proto_Status2Flag(status == ID_STATUS_OFFLINE ? ID_STATUS_INVISIBLE : status)) { clmi.flags=CMIM_FLAGS|CMIM_NAME|CMIM_ICON; clmi.hIcon = LoadSkinnedProtoIcon(szProto, status); } } } CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hAwayMsgMenuItem,(LPARAM)&clmi); if (!ShowCopy) clmi.flags |= CMIF_HIDDEN; wsprintf(str,Translate("Copy %s Message"),(char*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION,status,0)); clmi.pszName = str; if (ServiceExists(MS_SKIN2_GETICON)) clmi.hIcon = (HICON)CallService(MS_SKIN2_GETICON, (WPARAM)0, (LPARAM)ICON_COPY); else clmi.hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_COPY), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hCopyMsgMenuItem,(LPARAM)&clmi); return 0; }
BOOL StatusHasAwayMessage(char *szProto, int status) { if (szProto != NULL) { unsigned long iSupportsSM = (unsigned long)CallProtoService(szProto, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0); return (iSupportsSM & Proto_Status2Flag(status)) ? TRUE : FALSE; } switch (status) { case ID_STATUS_AWAY: case ID_STATUS_NA: case ID_STATUS_OCCUPIED: case ID_STATUS_DND: case ID_STATUS_FREECHAT: case ID_STATUS_ONTHEPHONE: case ID_STATUS_OUTTOLUNCH: return TRUE; default: return FALSE; } }
static int AwayMsgPreBuildMenu(WPARAM hContact, LPARAM lParam) { TCHAR str[128]; char *szProto = GetContactProto(hContact); int iHidden = szProto ? db_get_b(hContact, szProto, "ChatRoom", 0) : 0; int iStatus; if (!iHidden) { iHidden = 1; iStatus = db_get_w(hContact, szProto, "Status", ID_STATUS_OFFLINE); if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGRECV) { if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(iStatus == ID_STATUS_OFFLINE ? ID_STATUS_INVISIBLE : iStatus)) { iHidden = 0; HICON hIcon = Skin_LoadProtoIcon(szProto, iStatus); mir_sntprintf(str, _countof(str), TranslateT("Re&ad %s message"), pcli->pfnGetStatusModeDescription(iStatus, 0)); Menu_ModifyItem(hAwayMsgMenuItem, str, hIcon, 0); IcoLib_ReleaseIcon(hIcon); } } } else Menu_ShowItem(hAwayMsgMenuItem, false); ptrA szMsg(db_get_sa(hContact, "CList", "StatusMsg")); if (!iHidden && szMsg != NULL) { mir_sntprintf(str, _countof(str), TranslateT("Copy %s message"), pcli->pfnGetStatusModeDescription(iStatus, 0)); Menu_ModifyItem(hCopyMsgMenuItem, str); } else Menu_ShowItem(hCopyMsgMenuItem, false); if (!iHidden && szMsg != NULL && StrFindURL(szMsg) != NULL) { mir_sntprintf(str, _countof(str), TranslateT("&Go to URL in %s message"), pcli->pfnGetStatusModeDescription(iStatus, 0)); Menu_ModifyItem(hGoToURLMenuItem, str); } else Menu_ShowItem(hGoToURLMenuItem, false); return 0; }
int PreBuildContactMenu(WPARAM hContact, LPARAM) { char *szProto = GetContactProto(hContact); int iMode = szProto ? CallProtoService(szProto, PS_GETSTATUS, 0, 0) : 0; int Flag1 = szProto ? CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) : 0; int iContactMode = db_get_w(hContact, szProto, "Status", ID_STATUS_OFFLINE); TCHAR szSetStr[256], szReadStr[256]; szSetStr[0] = szReadStr[0] = 0; HICON hReadMsgIcon = NULL; if (szProto) { int i; for (i = _countof(StatusModeList) - 1; i >= 0; i--) if (iMode == StatusModeList[i].Status) break; // the protocol supports status message sending for current status, or autoreplying if ((Flag1 & PF1_MODEMSGSEND && CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(iMode)) || ((Flag1 & PF1_IM) == PF1_IM && (i < 0 || !g_AutoreplyOptPage.GetDBValueCopy(StatusModeList[i].DisableReplyCtlID)))) mir_sntprintf(szSetStr, _countof(szSetStr), TranslateT("Set %s message for the contact"), pcli->pfnGetStatusModeDescription(iMode, 0), pcli->pfnGetContactDisplayName(hContact, 0)); // the protocol supports status message reading for contact's status if (Flag1 & PF1_MODEMSGRECV && CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(iContactMode)) { mir_sntprintf(szReadStr, _countof(szReadStr), TranslateT("Re&ad %s message"), pcli->pfnGetStatusModeDescription(iContactMode, 0)); hReadMsgIcon = Skin_LoadProtoIcon(szProto, iContactMode); } } if (g_hContactMenuItem) { if (szSetStr[0] == 0) Menu_ShowItem(g_hContactMenuItem, false); else Menu_ModifyItem(g_hContactMenuItem, szSetStr, INVALID_HANDLE_VALUE, 0); // if this contact supports sending/receiving messages if ((Flag1 & PF1_IM) == PF1_IM) { int iAutoreply = CContactSettings(g_ProtoStates[szProto].Status, hContact).Autoreply; HANDLE hIcon; switch (iAutoreply) { case VAL_USEDEFAULT: hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_DOT)); break; case 0: hIcon = iconList[0].hIcolib; break; default: iAutoreply = 1; hIcon = iconList[1].hIcolib; break; } Menu_ModifyItem(g_hToggleSOEContactMenuItem, NULL, hIcon, 0); Menu_ModifyItem(g_hAutoreplyOnContactMenuItem, NULL, INVALID_HANDLE_VALUE, (iAutoreply == 1) ? CMIF_CHECKED : 0); Menu_ModifyItem(g_hAutoreplyOffContactMenuItem, NULL, INVALID_HANDLE_VALUE, (iAutoreply == 0) ? CMIF_CHECKED : 0); Menu_ModifyItem(g_hAutoreplyUseDefaultContactMenuItem, NULL, INVALID_HANDLE_VALUE, (iAutoreply == VAL_USEDEFAULT) ? CMIF_CHECKED : 0); } else // hide the Autoreply menu item Menu_ShowItem(g_hToggleSOEContactMenuItem, false); } if (szReadStr[0] == 0) Menu_ShowItem(g_hReadStatMenuItem, false); else Menu_ModifyItem(g_hReadStatMenuItem, szReadStr, hReadMsgIcon, 0); return 0; }
void InitProtocolTree(HWND hDlg,HWND hwndTreeCtrl) { int cAccounts = 0; PROTOACCOUNT** ppAccount; enum{OFFLINE_STATUS_INDEX = 5}; Proto_EnumAccounts(&cAccounts, &ppAccount); for(int i = 0; i < cAccounts;++i) { PROTOACCOUNT* pAccount = ppAccount[i]; CTreeItemData* pItemData = new CTreeItemData; pItemData->m_nType = CTreeItemData::Protocol; pItemData->m_pszModule = pAccount->szModuleName; bool bProtocolExcluded = g_Options.IsProtocolExcluded(pAccount->szModuleName); HTREEITEM hti = tree_insert_item(hDlg,hwndTreeCtrl,pAccount->tszAccountName,TVI_ROOT,((true == bProtocolExcluded) ? TCBS_CHECKED : TCBS_UNCHECKED),pItemData); if (hti) { int nStatusBits = CallProtoService(pAccount->szModuleName,PS_GETCAPS,PFLAGNUM_2,0); int nStatusExcluded = CallProtoService(pAccount->szModuleName,PS_GETCAPS,PFLAGNUM_5,0); pItemData = new CTreeItemData; pItemData->m_nType = CTreeItemData::Status; pItemData->m_pszModule = pAccount->szModuleName; pItemData->m_nStatus = ID_STATUS_OFFLINE; bool bStatusExcluded = g_Options.IsProtocolStatusExcluded(pAccount->szModuleName,pItemData->m_nStatus); ETreeCheckBoxState nState = TCBS_UNCHECKED; if (bProtocolExcluded) { if (bStatusExcluded) nState = TCBS_DISABLE_CHECKED; else nState = TCBS_DISABLE_UNCHECKED; } else { if (bStatusExcluded) nState = TCBS_CHECKED; else nState = TCBS_UNCHECKED; } tree_insert_item(hDlg,hwndTreeCtrl,TranslateTS(g_aStatusCode[OFFLINE_STATUS_INDEX].m_ptszStatusName),hti,nState,pItemData); for(size_t k = 0; k < _countof(g_aStatusCode); ++k) { const CMirandaStatus2SkypeStatus& m2s = g_aStatusCode[k]; unsigned long statusFlags = Proto_Status2Flag(m2s.m_nMirandaStatus); if ((m2s.m_nMirandaStatus != ID_STATUS_OFFLINE) && (nStatusBits & statusFlags) && !(nStatusExcluded & statusFlags)) { pItemData = new CTreeItemData; pItemData->m_nType = CTreeItemData::Status; pItemData->m_pszModule = pAccount->szModuleName; pItemData->m_nStatus = m2s.m_nMirandaStatus; bool bStatusExcluded = g_Options.IsProtocolStatusExcluded(pAccount->szModuleName,pItemData->m_nStatus); if (bProtocolExcluded) { if (bStatusExcluded) nState = TCBS_DISABLE_CHECKED; else nState = TCBS_DISABLE_UNCHECKED; } else { if (bStatusExcluded) nState = TCBS_CHECKED; else nState = TCBS_UNCHECKED; } tree_insert_item(hDlg,hwndTreeCtrl,TranslateTS(m2s.m_ptszStatusName),hti,nState,pItemData); } } TreeView_Expand(hwndTreeCtrl,hti,TVE_EXPAND); } } }
static int SetStatusList(HWND hwndDlg) { if (confirmSettings.getCount() == 0) return -1; HWND hList = GetDlgItem(hwndDlg, IDC_STARTUPLIST); TCHAR buf[100]; // create items LVITEM lvItem = { 0 }; lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.cchTextMax = 256; for( int i=0; i < confirmSettings.getCount(); i++ ) { lvItem.pszText = confirmSettings[i].tszAccName; if (ListView_GetItemCount(hList) < confirmSettings.getCount()) ListView_InsertItem(hList,&lvItem); int actualStatus; switch( confirmSettings[i].status ) { case ID_STATUS_LAST: actualStatus = confirmSettings[i].lastStatus; break; case ID_STATUS_CURRENT: actualStatus = CallProtoService(confirmSettings[i].szName,PS_GETSTATUS, 0, 0); break; default: actualStatus = confirmSettings[i].status; } TCHAR* status = ( TCHAR* )CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, actualStatus, GSMDF_TCHAR ); switch( confirmSettings[i].status ) { case ID_STATUS_LAST: mir_sntprintf(buf, SIZEOF(buf), _T("%s (%s)"), TranslateT("<last>"), status); ListView_SetItemText(hList, lvItem.iItem, 1, buf); break; case ID_STATUS_CURRENT: mir_sntprintf( buf, SIZEOF(buf), _T("%s (%s)"), TranslateT("<current>"), status); ListView_SetItemText(hList, lvItem.iItem, 1, buf); break; default: ListView_SetItemText(hList, lvItem.iItem, 1, status); } // status message if ( !((!((CallProtoService(confirmSettings[i].szName, PS_GETCAPS, (WPARAM)PFLAGNUM_1, 0)&PF1_MODEMSGSEND)&~PF1_INDIVMODEMSG)) || (!(CallProtoService(confirmSettings[i].szName, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0)&Proto_Status2Flag(actualStatus)))) ) { TCHAR *msg = GetDefaultStatusMessage( &confirmSettings[i], actualStatus ); if ( msg != NULL ) { TCHAR* fMsg = variables_parsedup( msg, confirmSettings[i].tszAccName, NULL ); ListView_SetItemText(hList, lvItem.iItem, 2, fMsg); free(fMsg); mir_free(msg); } else ListView_SetItemText(hList, lvItem.iItem, 2, TranslateT("<n/a>")); } else ListView_SetItemText(hList, lvItem.iItem, 2, TranslateT("<n/a>")); ListView_SetColumnWidth(hList, 0, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hList, 2, LVSCW_AUTOSIZE); lvItem.lParam = (LPARAM)&confirmSettings[i]; ListView_SetItem(hList,&lvItem); lvItem.iItem++; } // grey out status box EnableWindow(GetDlgItem(hwndDlg,IDC_STATUS), (ListView_GetNextItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST),-1,LVNI_SELECTED)>=0)); return 0; }
INT_PTR CALLBACK DlgProcAutoAwayMsgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static AAMSGSETTING** settings; static int last, count; switch( msg ) { case WM_INITDIALOG: TranslateDialogDefault( hwndDlg ); { ShowWindow(GetDlgItem(hwndDlg, IDC_VARIABLESHELP), ServiceExists(MS_VARS_SHOWHELP)?SW_SHOW:SW_HIDE); count = 0; last = -1; PROTOACCOUNT** proto; int protoCount = 0; Proto_EnumAccounts(&protoCount, &proto); if (protoCount <= 0) { DisableDialog(hwndDlg); break; } DWORD protoModeMsgFlags = 0; for (int i=0; i < protoCount; i++) if (CallProtoService(proto[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND & ~PF1_INDIVMODEMSG) protoModeMsgFlags |= CallProtoService( proto[i]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0 ); if (protoModeMsgFlags == 0) { DisableDialog(hwndDlg); break; } settings = ( AAMSGSETTING** )malloc(sizeof(AAMSGSETTING*)); count = 0; for (int i=0; i < _countof(statusModeList); i++ ) { if ( !( protoModeMsgFlags & Proto_Status2Flag( statusModeList[i] ))) continue; int j = SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(statusModeList[i], 0)); SendDlgItemMessage( hwndDlg, IDC_STATUS, CB_SETITEMDATA, j, statusModeList[i] ); settings = ( AAMSGSETTING** )realloc(settings, (count+1)*sizeof(AAMSGSETTING*)); settings[count] = ( AAMSGSETTING* )malloc(sizeof(AAMSGSETTING)); settings[count]->status = statusModeList[i]; DBVARIANT dbv; if ( !db_get(NULL, MODULENAME, StatusModeToDbSetting(statusModeList[i],SETTING_STATUSMSG), &dbv)) { settings[count]->msg = ( char* )malloc(mir_strlen(dbv.pszVal) + 1); mir_strcpy(settings[count]->msg, dbv.pszVal); db_free(&dbv); } else settings[count]->msg = NULL; settings[count]->useCustom = db_get_b(NULL, MODULENAME, StatusModeToDbSetting(statusModeList[i], SETTING_MSGCUSTOM), FALSE); count += 1; } SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_SETCURSEL,0,0); SendMessage(hwndDlg,WM_COMMAND,MAKEWPARAM(IDC_STATUS,CBN_SELCHANGE),0); } break; case WM_COMMAND: if ( ((HIWORD(wParam) == EN_CHANGE) || (HIWORD(wParam) == BN_CLICKED)) && ((HWND)lParam == GetFocus())) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); switch(LOWORD(wParam)) { case IDC_RADUSEMIRANDA: CheckDlgButton(hwndDlg, IDC_RADUSECUSTOM, BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_RADUSEMIRANDA) ? BST_CHECKED : BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_STATUSMSG), IsDlgButtonChecked(hwndDlg, IDC_RADUSECUSTOM)); EnableWindow(GetDlgItem(hwndDlg, IDC_VARIABLESHELP), IsDlgButtonChecked(hwndDlg, IDC_RADUSECUSTOM)); settings[SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_GETCURSEL,0,0)]->useCustom = IsDlgButtonChecked(hwndDlg, IDC_RADUSECUSTOM); break; case IDC_RADUSECUSTOM: CheckDlgButton(hwndDlg, IDC_RADUSEMIRANDA, BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_RADUSECUSTOM) ? BST_CHECKED : BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_STATUSMSG), IsDlgButtonChecked(hwndDlg, IDC_RADUSECUSTOM)); EnableWindow(GetDlgItem(hwndDlg, IDC_VARIABLESHELP), IsDlgButtonChecked(hwndDlg, IDC_RADUSECUSTOM)); settings[SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_GETCURSEL,0,0)]->useCustom = IsDlgButtonChecked(hwndDlg, IDC_RADUSECUSTOM); break; case IDC_STATUS: if ( HIWORD( wParam ) == CBN_SELCHANGE ) { int i = SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_GETCURSEL,0,0); int len = SendDlgItemMessage(hwndDlg, IDC_STATUSMSG, WM_GETTEXTLENGTH, 0, 0); if ( last != -1 ) { if (settings[last]->msg == NULL) settings[last]->msg = ( char* )malloc(len+1); else settings[last]->msg = (char*)realloc(settings[last]->msg, len+1); GetDlgItemTextA(hwndDlg, IDC_STATUSMSG, settings[last]->msg, (len+1)); } if (i != -1) { if (settings[i]->msg != NULL) SetDlgItemTextA(hwndDlg, IDC_STATUSMSG, settings[i]->msg); else { ptrT msg((TCHAR*)CallService(MS_AWAYMSG_GETSTATUSMSGT, settings[i]->status, 0)); SetDlgItemText(hwndDlg, IDC_STATUSMSG, (msg != NULL) ? msg : _T("")); } if (settings[i]->useCustom) { EnableWindow(GetDlgItem(hwndDlg, IDC_STATUSMSG), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARIABLESHELP), TRUE); CheckDlgButton(hwndDlg, IDC_RADUSECUSTOM, BST_CHECKED); CheckDlgButton(hwndDlg, IDC_RADUSEMIRANDA, BST_UNCHECKED); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_STATUSMSG), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_VARIABLESHELP), FALSE); CheckDlgButton(hwndDlg, IDC_RADUSEMIRANDA, BST_CHECKED); CheckDlgButton(hwndDlg, IDC_RADUSECUSTOM, BST_UNCHECKED); } } last = i; } break; case IDC_VARIABLESHELP: CallService(MS_VARS_SHOWHELP, (WPARAM)GetDlgItem(hwndDlg, IDC_STATUSMSG), 0); break; } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: SendMessage(hwndDlg,WM_COMMAND,MAKEWPARAM(IDC_STATUS,CBN_SELCHANGE),0); for (int i=0; i < count; i++ ) { db_set_b(NULL, MODULENAME, StatusModeToDbSetting(settings[i]->status,SETTING_MSGCUSTOM), (BYTE)settings[i]->useCustom); if ( (settings[i]->useCustom) && (settings[i]->msg != NULL) && (settings[i]->msg[0] != '\0')) db_set_s(NULL, MODULENAME, StatusModeToDbSetting(settings[i]->status,SETTING_STATUSMSG), settings[i]->msg); } break; } break; case WM_DESTROY: for (int i=0; i < count; i++ ) { free(settings[i]->msg); free(settings[i]); } free(settings); break; } return FALSE; }
INT_PTR CALLBACK DlgProcSoundUIPage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HANDLE hContact = NULL; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); hContact = (HANDLE)lParam; char *szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); ListView_SetImageList(hList, GetStatusIconsImgList(szProto), LVSIL_SMALL); ListView_SetExtendedListViewStyleEx(hList, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP); RECT rc = {0}; GetClientRect(hList, &rc); LV_COLUMN lvc = {0}; lvc.mask = LVCF_WIDTH | LVCF_TEXT; lvc.cx = STATUS_COLUMN; lvc.pszText = TranslateT("Status"); ListView_InsertColumn(hList, 0, &lvc); lvc.cx = rc.right - STATUS_COLUMN - GetSystemMetrics(SM_CXVSCROLL); lvc.pszText = TranslateT("Sound for the status"); ListView_InsertColumn(hList, 1, &lvc); if (szProto) { DBVARIANT dbv; TCHAR buff[MAX_PATH]; for (int i = ID_STATUS_MAX; i >= ID_STATUS_MIN; i--) { int flags = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_2, 0); if (flags == 0) flags = PF2_ONLINE|PF2_INVISIBLE|PF2_SHORTAWAY|PF2_LONGAWAY|PF2_LIGHTDND|PF2_HEAVYDND|PF2_FREECHAT|PF2_OUTTOLUNCH|PF2_ONTHEPHONE; if ((flags & Proto_Status2Flag(i)) || i == ID_STATUS_OFFLINE) { LV_ITEM lvi = {0}; lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; lvi.iItem = 0; lvi.iSubItem = 0; lvi.iImage = Index(i); lvi.lParam = (LPARAM)i; lvi.pszText = TranslateTS(StatusList[Index(i)].lpzStandardText); lvi.iItem = ListView_InsertItem(hList, &lvi); if (!DBGetContactSettingTString(hContact, MODULE, StatusList[Index(i)].lpzSkinSoundName, &dbv)) { _tcscpy(buff, dbv.ptszVal); DBFreeVariant(&dbv); } else _tcscpy(buff, TranslateT(DEFAULT_SOUND)); ListView_SetItemText(hList, lvi.iItem, 1, buff); } } LV_ITEM lvi = {0}; lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; lvi.iItem = 0; lvi.iSubItem = 0; lvi.iImage = Index(ID_STATUS_MAX) + 1; // additional icon lvi.lParam = (LPARAM)ID_STATUS_FROMOFFLINE; lvi.pszText = TranslateT("From offline"); lvi.iItem = ListView_InsertItem(hList, &lvi); if (!DBGetContactSettingTString(hContact, MODULE, "UserFromOffline", &dbv)) { _tcscpy(buff, dbv.ptszVal); DBFreeVariant(&dbv); } else _tcscpy(buff, TranslateT(DEFAULT_SOUND)); ListView_SetItemText(hList, lvi.iItem, 1, buff); } CheckDlgButton(hwndDlg, IDC_CHECK_NOTIFYSOUNDS, DBGetContactSettingByte(hContact, MODULE, "EnableSounds", 1)); CheckDlgButton(hwndDlg, IDC_CHECK_NOTIFYPOPUPS, DBGetContactSettingByte(hContact, MODULE, "EnablePopups", 1)); ShowWindow(GetDlgItem(hwndDlg, IDC_INDSNDLIST), opt.UseIndSnd ? SW_SHOW : SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, IDC_TEXT_ENABLE_IS), opt.UseIndSnd ? SW_HIDE : SW_SHOW); ShowWindow(GetDlgItem(hwndDlg, IDC_CHANGE), opt.UseIndSnd ? SW_SHOW : SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, IDC_PREVIEW), opt.UseIndSnd ? SW_SHOW : SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, IDC_DELETE), opt.UseIndSnd ? SW_SHOW : SW_HIDE); return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_PREVIEW: { HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); if (ListView_GetSelectionMark(hList) != -1) PreviewSound(hList); break; } case IDC_CHANGE: { HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); int iSel = ListView_GetNextItem(GetDlgItem(hwndDlg, IDC_INDSNDLIST), -1, LVNI_SELECTED); if (iSel != -1) { TCHAR stzFilePath[MAX_PATH]; if (SelectSound(hwndDlg, stzFilePath) != NULL) { iSel = -1; while ((iSel = ListView_GetNextItem(hList, iSel, LVNI_SELECTED)) != -1) ListView_SetItemText(hList, iSel, 1, stzFilePath); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } break; } case IDC_DELETE: { HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); if (ListView_GetSelectionMark(hList) != -1) { if (RemoveSoundFromList(GetDlgItem(hwndDlg, IDC_INDSNDLIST))) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } break; } case IDC_CHECK_NOTIFYSOUNDS: { DBWriteContactSettingByte(hContact, MODULE, "EnableSounds", IsDlgButtonChecked(hwndDlg, IDC_CHECK_NOTIFYSOUNDS) ? 1 : 0); break; } case IDC_CHECK_NOTIFYPOPUPS: { DBWriteContactSettingByte(hContact, MODULE, "EnablePopups", IsDlgButtonChecked(hwndDlg, IDC_CHECK_NOTIFYPOPUPS) ? 1 : 0); break; } } break; } case WM_NOTIFY: { LPNMHDR pParam = (LPNMHDR)lParam; if (pParam->code == PSN_APPLY) { TCHAR buff[MAX_PATH]; HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); LVITEM lvi = {0}; lvi.mask = LVIF_PARAM; //Cycle through the list reading the text associated to each status. for (lvi.iItem = ListView_GetItemCount(hList) - 1; lvi.iItem >= 0; lvi.iItem--) { ListView_GetItem(hList, &lvi); ListView_GetItemText(hList, lvi.iItem, 1, buff, SIZEOF(buff)); if (!_tcscmp(buff, TranslateT(DEFAULT_SOUND))) { if (lvi.lParam == ID_STATUS_FROMOFFLINE) DBDeleteContactSetting(hContact, MODULE, "UserFromOffline"); else DBDeleteContactSetting(hContact, MODULE, StatusList[Index(lvi.lParam)].lpzSkinSoundName); } else { TCHAR stzSoundPath[MAX_PATH] = { 0 }; CallService(MS_UTILS_PATHTORELATIVET, (WPARAM)buff, (LPARAM)stzSoundPath); if (lvi.lParam == ID_STATUS_FROMOFFLINE) DBWriteContactSettingTString(hContact, MODULE, "UserFromOffline", stzSoundPath); else DBWriteContactSettingTString(hContact, MODULE, StatusList[Index(lvi.lParam)].lpzSkinSoundName, stzSoundPath); } } return TRUE; } int hlpControlID = (int)wParam; switch (hlpControlID) { case IDC_INDSNDLIST: { if (pParam->code == NM_DBLCLK) { TCHAR stzFilePath[MAX_PATH]; if (SelectSound(hwndDlg, stzFilePath) != NULL) { int iSel = -1; HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); while ((iSel = ListView_GetNextItem(hList, iSel, LVNI_SELECTED)) != -1) ListView_SetItemText(hList, iSel, 1, stzFilePath); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } return TRUE; } else if (pParam->code == LVN_KEYDOWN) { LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN)lParam; if (pnkd->wVKey == VK_DELETE) RemoveSoundFromList(GetDlgItem(hwndDlg, IDC_INDSNDLIST)); } break; } } break; } } return FALSE; }
bool Protocol::CanGetStatusMsg(int aStatus) { return (Call(PS_GETCAPS, PFLAGNUM_1) & PF1_MODEMSGSEND) != 0 && (Call(PS_GETCAPS, (WPARAM)PFLAGNUM_3) & Proto_Status2Flag(aStatus)); }
static INT_PTR CALLBACK DlgProcAwayMsgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { AwayMsgDlgData *dat = (AwayMsgDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); HWND hLst = GetDlgItem(hwndDlg, IDC_LST_STATUS); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { dat = (AwayMsgDlgData*)mir_alloc(sizeof(AwayMsgDlgData)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); dat->oldPage = -1; for (int i = 0; i < SIZEOF(statusModes); i++) { if (!(protoModeMsgFlags & Proto_Status2Flag(statusModes[i]))) continue; int j; if (hLst) { j = SendDlgItemMessage(hwndDlg, IDC_LST_STATUS, LB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(statusModes[i], 0)); SendDlgItemMessage(hwndDlg, IDC_LST_STATUS, LB_SETITEMDATA, j, statusModes[i]); } else { j = SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_ADDSTRING, 0, (LPARAM)pcli->pfnGetStatusModeDescription(statusModes[i], 0)); SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_SETITEMDATA, j, statusModes[i]); } dat->info[j].ignore = GetStatusModeByte(statusModes[i], "Ignore"); dat->info[j].noDialog = GetStatusModeByte(statusModes[i], "NoDlg", true); dat->info[j].usePrevious = GetStatusModeByte(statusModes[i], "UsePrev"); DBVARIANT dbv; if (db_get_ts(NULL, "SRAway", StatusModeToDbSetting(statusModes[i], "Default"), &dbv)) if (db_get_ts(NULL, "SRAway", StatusModeToDbSetting(statusModes[i], "Msg"), &dbv)) dbv.ptszVal = mir_tstrdup(GetDefaultMessage(statusModes[i])); lstrcpy(dat->info[j].msg, dbv.ptszVal); mir_free(dbv.ptszVal); } if (hLst) SendDlgItemMessage(hwndDlg, IDC_LST_STATUS, LB_SETCURSEL, 0, 0); else SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_SETCURSEL, 0, 0); SendMessage(hwndDlg, WM_COMMAND, hLst ? MAKEWPARAM(IDC_LST_STATUS, LBN_SELCHANGE) : MAKEWPARAM(IDC_STATUS, CBN_SELCHANGE), 0); } return TRUE; case WM_MEASUREITEM: { LPMEASUREITEMSTRUCT mis = (LPMEASUREITEMSTRUCT)lParam; if (mis->CtlID == IDC_LST_STATUS) mis->itemHeight = 20; } break; case WM_DRAWITEM: { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->CtlID != IDC_LST_STATUS) break; if (dis->itemID < 0) break; TCHAR buf[128]; SendDlgItemMessage(hwndDlg, IDC_LST_STATUS, LB_GETTEXT, dis->itemID, (LPARAM)buf); if (dis->itemState & (ODS_SELECTED | ODS_FOCUS)) { FillRect(dis->hDC, &dis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT)); SetTextColor(dis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); } else { FillRect(dis->hDC, &dis->rcItem, GetSysColorBrush(COLOR_WINDOW)); SetTextColor(dis->hDC, GetSysColor(COLOR_WINDOWTEXT)); } RECT rc = dis->rcItem; DrawIconEx(dis->hDC, 3, (rc.top + rc.bottom - 16) / 2, LoadSkinnedProtoIcon(NULL, dis->itemData), 16, 16, 0, NULL, DI_NORMAL); rc.left += 25; SetBkMode(dis->hDC, TRANSPARENT); DrawText(dis->hDC, buf, -1, &rc, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_LST_STATUS: case IDC_STATUS: if ((HIWORD(wParam) == CBN_SELCHANGE) || (HIWORD(wParam) == LBN_SELCHANGE)) { int i = hLst ? SendDlgItemMessage(hwndDlg, IDC_LST_STATUS, LB_GETCURSEL, 0, 0) : SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_GETCURSEL, 0, 0); if (dat->oldPage != -1) { dat->info[dat->oldPage].ignore = IsDlgButtonChecked(hwndDlg, IDC_DONTREPLY); dat->info[dat->oldPage].noDialog = IsDlgButtonChecked(hwndDlg, IDC_NODIALOG); dat->info[dat->oldPage].usePrevious = IsDlgButtonChecked(hwndDlg, IDC_USEPREVIOUS); GetDlgItemText(hwndDlg, IDC_MSG, dat->info[dat->oldPage].msg, SIZEOF(dat->info[dat->oldPage].msg)); } CheckDlgButton(hwndDlg, IDC_DONTREPLY, i < 0 ? 0 : dat->info[i].ignore); CheckDlgButton(hwndDlg, IDC_NODIALOG, i < 0 ? 0 : dat->info[i].noDialog); CheckDlgButton(hwndDlg, IDC_USEPREVIOUS, i < 0 ? 0 : dat->info[i].usePrevious); CheckDlgButton(hwndDlg, IDC_USESPECIFIC, i < 0 ? 0 : !dat->info[i].usePrevious); SetDlgItemText(hwndDlg, IDC_MSG, i < 0 ? _T("") : dat->info[i].msg); EnableWindow(GetDlgItem(hwndDlg, IDC_NODIALOG), i < 0 ? 0 : !dat->info[i].ignore); EnableWindow(GetDlgItem(hwndDlg, IDC_USEPREVIOUS), i < 0 ? 0 : !dat->info[i].ignore); EnableWindow(GetDlgItem(hwndDlg, IDC_USESPECIFIC), i < 0 ? 0 : !dat->info[i].ignore); EnableWindow(GetDlgItem(hwndDlg, IDC_MSG), i < 0 ? 0 : !(dat->info[i].ignore || dat->info[i].usePrevious)); dat->oldPage = i; } return 0; case IDC_DONTREPLY: case IDC_USEPREVIOUS: case IDC_USESPECIFIC: SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_STATUS, CBN_SELCHANGE), 0); break; case IDC_MSG: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; break; } SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_STATUS, CBN_SELCHANGE), 0); { int i = hLst ? (SendDlgItemMessage(hwndDlg, IDC_LST_STATUS, LB_GETCOUNT, 0, 0) - 1) : (SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_GETCOUNT, 0, 0) - 1); for (; i >= 0; i--) { int status = hLst ? SendDlgItemMessage(hwndDlg, IDC_LST_STATUS, LB_GETITEMDATA, i, 0) : SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_GETITEMDATA, i, 0); SetStatusModeByte(status, "Ignore", (BYTE)dat->info[i].ignore); SetStatusModeByte(status, "NoDlg", (BYTE)dat->info[i].noDialog); SetStatusModeByte(status, "UsePrev", (BYTE)dat->info[i].usePrevious); db_set_ts(NULL, "SRAway", StatusModeToDbSetting(status, "Default"), dat->info[i].msg); } return TRUE; } } break; } break; case WM_DESTROY: mir_free(dat); break; } return FALSE; }
int InitVariables( WPARAM wParam, LPARAM lParam ) { int j=0; int i=0; localeID = CallService(MS_LANGPACK_GETLOCALE,0,0); if (localeID==CALLSERVICE_NOTFOUND) localeID=LOCALE_USER_DEFAULT; codePage = CallService(MS_LANGPACK_GETCODEPAGE,0,0); if (codePage==CALLSERVICE_NOTFOUND) codePage=CP_ACP; #ifdef UNICODE HasAwayMessageW = (ServiceExists(MS_AWAYMSG_GETSTATUSMSGW)!=0); #endif for (i=0;i<4;i++) { Hotkey_Register(&hotkeydescs[i]); } #ifdef AALOG { NETLIBUSER nlu = { 0 }; nlu.cbSize = sizeof(nlu); nlu.szSettingsModule = "SAA"; nlu.flags=NUF_NOOPTIONS | NUF_NOHTTPSOPTION; nlu.szDescriptiveName = Translate(SECTIONNAME " Module"); hNetlib = (HANDLE) CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM) & nlu); } { SYSTEMTIME st={0}; int drift; char str[32]; char log[1024]; char target[1024]; drift = GetTimeZone(str); GetLastActiveLocalTime(&st,0); sprintf(log,"Now is %02d/%02d/%02d %02d:%02d:%02d %s (%02d:%02d)", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond,str, div(drift,60).quot,drift<0?-div(drift,60).rem:div(drift,60).rem); CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)log); GetLastActiveLocalTime(&st,24*60*60*1000); sprintf(log,"1 day ago was %02d/%02d/%02d %02d:%02d:%02d %s (%02d:%02d)", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond,str, div(drift,60).quot,drift<0?-div(drift,60).rem:div(drift,60).rem); CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)log); ParseString("%Y-%m-%d %H:%M:%S",target,1023); sprintf(log,"Testing ParseString: %s",target); CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)log); ParseString("%E/%d/%y %W %h:%M:%S %p",target,1023); sprintf(log,"Testing ParseString: %s",target); CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)log); ParseString("%w %% %Z (%z)%n%L%b%l%b%K%b%k",target,1023); sprintf(log,"Testing ParseString: %s",target); CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)log); } #endif CallService(MS_PROTO_ENUMACCOUNTS,(WPARAM)&protoCount,(LPARAM)&accounts); reqStatus = (int *)mir_alloc((protoCount)*sizeof(reqStatus[0])); courStatus = (int *)mir_alloc((protoCount)*sizeof(courStatus[0])); courAwayStatus = (int *)mir_alloc((protoCount)*sizeof(courStatus[0])); protoModes = (int *)mir_alloc((protoCount)*sizeof(protoModes[0])); messCaps = (int *)mir_alloc((protoCount)*sizeof(messCaps[0])); awayStatuses=(short int *)mir_alloc((protoCount)*sizeof(awayStatuses[0])); onlyIfBits=(long int *)mir_alloc((protoCount)*sizeof(onlyIfBits[0])); awayStatusesPerm=(short int *)mir_alloc((protoCount)*sizeof(awayStatuses[0])); onlyIfBitsPerm=(long int *)mir_alloc((protoCount)*sizeof(onlyIfBits[0])); reconnectOpts=(long int *)mir_alloc((protoCount)*sizeof(reconnectOpts[0])); reconnectOptsPerm=(long int *)mir_alloc((protoCount)*sizeof(reconnectOptsPerm[0])); protoOfflineTimes=(unsigned int *)mir_alloc((protoCount)*sizeof(protoOfflineTimes[0])); protoStatus=(int *)mir_alloc((protoCount)*sizeof(protoStatus[0])); idleMessOpts=(long int *)mir_alloc((protoCount)*sizeof(idleMessOpts[0])); idleMessOptsPerm=(long int *)mir_alloc((protoCount)*sizeof(idleMessOptsPerm[0])); mesgHere = (TCHAR**)mir_alloc(protoCount * sizeof(mesgHere[0])); mesgHerePerm = (TCHAR**)mir_alloc(protoCount * sizeof(mesgHerePerm[0])); mesgShort = (TCHAR**)mir_alloc(protoCount * sizeof(mesgShort[0])); mesgShortPerm = (TCHAR**)mir_alloc(protoCount * sizeof(mesgShortPerm[0])); mesgLong = (TCHAR**)mir_alloc(protoCount * sizeof(mesgLong[0])); mesgLongPerm = (TCHAR**)mir_alloc(protoCount * sizeof(mesgLongPerm[0])); #ifdef UNICODE protoHasAwayMessageW=(bool *)mir_alloc(protoCount * sizeof(protoHasAwayMessageW[0])); #endif isWaitingForRestoreStatusMessage = (int *)mir_alloc((protoCount)*sizeof(isWaitingForRestoreStatusMessage[0])); for (j = 0 ; j < protoCount ; j++) { int caps=0; #ifdef AALOG { char log[1024]; sprintf(log,"Checking protocol index %d out of %d...",j+1,protoCount); CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)log); } #endif reqStatus[j] = 0; courStatus[j] = ID_STATUS_OFFLINE; protoModes[j] =0; isWaitingForRestoreStatusMessage[j] = 0; caps = CallProtoService(accounts[j]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0); messCaps[j] = (CallProtoService(accounts[j]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)? CallProtoService(accounts[j]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0):0; #ifdef AALOG { char log[1024]; if (messCaps[j]){ int i; sprintf(log,"StatusMessages Caps for %s:", accounts[j]->szModuleName ); for (i=0;i<10;i++){ int statusFlag = Proto_Status2Flag(aa_Status[i]); if (statusFlag & messCaps[j]){ sprintf(log,"%s %s",log,CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, aa_Status[i], 0)); } } } else { sprintf(log,"%s cannot set StatusMessage", accounts[j]->szModuleName); } CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)log); } #endif for (i = 0; i<numStatuses; i++){ protoModes[j] <<= 1; protoModes[j] |= (Proto_Status2Flag(aa_Status[i]) & caps)?1:0; protoModes[j] |= (aa_Status[i] == ID_STATUS_OFFLINE); } if ( isInterestingProto(j) ) { char str[256]; sprintf(str,AA_BITSONLYIF,accounts[j]->szModuleName); // MessageBox( 0,str,accounts[j]->szModuleName,0); onlyIfBits[j]= db_get_dw(NULL,AA_MODULE,str,-1); if (onlyIfBits[j]==-1){ // onlyIfBits[j] = (((protoModes[j]<<16)|(protoModes[j])) & aa_OnlyIfBitsDefault); onlyIfBits[j] = aa_OnlyIfBitsDefault; db_set_dw(NULL,AA_MODULE,str,onlyIfBits[j]); } onlyIfBitsPerm[j]=onlyIfBits[j]; #ifdef UNICODE sprintf(str,"%s%s",accounts[j]->szModuleName,PS_SETAWAYMSGW); protoHasAwayMessageW[j]=(ServiceExists(str)!=0); #endif // sprintf(str,AA_BITSLONGONLYIF,accounts[j]->szModuleName); //// MessageBox( 0,str,accounts[j]->szModuleName,0); // if (!db_get_w(NULL,AA_MODULE,str,0)) // db_set_w(NULL,AA_MODULE,str,(protoModes[j] & aa_OnlyIfBitsDefault)|known); sprintf(str,AA_AWAYSTATUSES,accounts[j]->szModuleName); // MessageBox( 0,str,accounts[j]->szModuleName,0); awayStatuses[j] = db_get_w(NULL,AA_MODULE,str,-1); if (awayStatuses[j] ==-1){ int old = db_get_w(NULL,AA_OLDMODULE,AA_SHORTSTATUS,-1); int s = StatusToProtoIndex(((old==-1)?ID_STATUS_AWAY:OldIndexToStatus(old)),protoModes[j]); int l = 0; int comb = 0; old = db_get_w(NULL,AA_OLDMODULE,AA_LONGSTATUS,-1); l = StatusToProtoIndex(((old==-1)?ID_STATUS_NA:OldIndexToStatus(old)),protoModes[j]); comb = (l<<4)|s; old = db_get_b(NULL,AA_OLDMODULE,AA_USESHORT,-1); if (s) comb |= ((old==-1)?1<<8:(old==1)<<8); old = db_get_b(NULL,AA_OLDMODULE,AA_USELONG,-1); if (l) comb |= ((old==-1)?1<<9:(old==1)<<9); // comb |= (1<<15); awayStatuses[j]=comb; db_set_w(NULL,AA_MODULE,str,(WORD)awayStatuses[j]); } awayStatusesPerm[j] = awayStatuses[j]; sprintf(str,AA_LASTREQUESTEDSTATUS,accounts[j]->szModuleName); //get last requested status reqStatus[j] = db_get_w(NULL,AA_MODULE,str,ID_STATUS_ONLINE); //default: online sprintf(str,AA_RECONNECTOPTS,accounts[j]->szModuleName); //get reconnect options status reconnectOpts[j] = db_get_dw(NULL,AA_MODULE,str,aa_ReconnectOptsDefault); reconnectOptsPerm[j] = reconnectOpts[j]; protoStatus[j] = 0; protoOfflineTimes[j] = 0; mesgHere[j]=(TCHAR *)mir_alloc(sizeof(TCHAR)*(maxMessageLength+1)); mesgHerePerm[j]=(TCHAR *)mir_alloc(sizeof(TCHAR)*(maxMessageLength+1)); mesgShort[j]=(TCHAR *)mir_alloc(sizeof(TCHAR)*(maxMessageLength+1)); mesgShortPerm[j]=(TCHAR *)mir_alloc(sizeof(TCHAR)*(maxMessageLength+1)); mesgLong[j]=(TCHAR *)mir_alloc(sizeof(TCHAR)*(maxMessageLength+1)); mesgLongPerm[j]=(TCHAR *)mir_alloc(sizeof(TCHAR)*(maxMessageLength+1)); if (messCaps[j]){ DBVARIANT dbv; sprintf(str,idleMsgOptionsName,accounts[j]->szModuleName); idleMessOptsPerm[j] = idleMessOpts[j] = db_get_dw(NULL,AA_MODULE,str,idleMsgOptionsDefault); sprintf(str,idleMsgOptionsTextHere,accounts[j]->szModuleName); if(db_get_ts(NULL,AA_MODULE,str,&dbv)==0) { _tcsncpy(mesgHere[j],dbv.ptszVal,maxMessageLength); mesgHere[j][maxMessageLength]=0; db_free(&dbv); } else _tcscpy(mesgHere[j],messHereDefault); if(!_tcscmp(mesgHere[j],messHereDefaultOld)) _tcscpy(mesgHere[j],messHereDefault); _tcscpy(mesgHerePerm[j],mesgHere[j]); sprintf(str,idleMsgOptionsTextShort,accounts[j]->szModuleName); if(db_get_ts(NULL,AA_MODULE,str,&dbv)==0) { _tcsncpy(mesgShort[j],dbv.ptszVal,maxMessageLength); mesgShort[j][maxMessageLength]=0; db_free(&dbv); } else _tcscpy(mesgShort[j],messShortDefault); if(!_tcscmp(mesgShort[j],messShortDefaultOld)) _tcscpy(mesgShort[j],messShortDefault); _tcscpy(mesgShortPerm[j],mesgShort[j]); sprintf(str,idleMsgOptionsTextLong,accounts[j]->szModuleName); if(db_get_ts(NULL,AA_MODULE,str,&dbv)==0) { _tcsncpy(mesgLong[j],dbv.ptszVal,maxMessageLength); mesgLong[j][maxMessageLength]=0; db_free(&dbv); } else _tcscpy(mesgLong[j],messLongDefault); if(!_tcscmp(mesgLong[j],messLongDefaultOld)) _tcsncpy(mesgLong[j],messLongDefault,maxMessageLength); _tcsncpy(mesgLongPerm[j],mesgLong[j],maxMessageLength); // sprintf(mesgHere[j],"%d: %s: %s",j,accounts[j]->szModuleName,"Test text"); } else { idleMessOptsPerm[j] = idleMessOpts[j] = 0; mesgHerePerm[j] = mesgHere[j] = mesgShortPerm[j] = mesgShort[j] = mesgLongPerm[j] = mesgLong[j] = NULL; } } } #ifdef AALOG { char str[1024]=""; for (j = 0 ; j < protoCount ; j++) { int status; sprintf(str,"%s\n%s Type:%d\nLastReqStatus: %s\n",str,accounts[j]->szModuleName,accounts[j]->szProtoName,CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)reqStatus[j], 0)); i=1; while(status=StatusByProtoIndex(protoModes[j],i)){ sprintf(str,"%s %d. %s\n",str,i,CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)status, 0)); i++; } // IsStatusBitSet(aa_Status[i],protoModes[j])?"":"not", // CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)aa_Status[i], 0), // IsStatusBitSet(aa_Status[i],aa_OnlyIfBitsDefault)?"n":"ff" // ); } CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)str); } #endif //something is hapaning here on startup, if main status is not offline //will move Notify hIdleEvent for later in the IdleTimer // NotifyEventHooks( hIdleEvent, 0, idleOpts&IdleBitsPrivate?IDF_PRIVACY:0 ); //Tell everyone we are here FirstTick = 1; //we will wait 1 ticks of the timer before Forcing Awake // FirstTick = 10; //we will wait 20 seconds before Forcing Awake hIdleTimer=SetTimer(NULL, 0, 2000, IdleTimer); // { // char str[20000]=""; // for (i=0;i<=101;i++){ // char str1[128]; // GetStringFromDelay(str1,GetReconnectDelayFromSlider(i)); // sprintf(str,"%d\t%d\t%s",GetReconnectDelayFromSlider(i),i,str1); // CallService("Netlib/Log" ,(WPARAM)hNetlib ,(LPARAM)str); // } // } if ((idleOptsPerm&IdleSuppressIdleMenu)==0) AddIdleMenu(); if ((idleOptsPerm&IdleSuppressAutoHere)!=0) isCurrentlyIdle=db_get_b(NULL,AA_MODULE,AA_LASTIDLESTATUS,0);; return 0; }
static BOOL CALLBACK ConfirmDlgProc(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { HWND hList=GetDlgItem(hwndDlg,IDC_STARTUPLIST); SendMessage(hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT); // create columns LVCOLUMN lvCol = { 0 }; lvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; lvCol.pszText = TranslateT("Protocol"); ListView_InsertColumn(hList, 0, &lvCol ); lvCol.cx = 100; lvCol.pszText = TranslateT("Status"); ListView_InsertColumn(hList, 1, &lvCol ); lvCol.pszText = TranslateT("Message"); ListView_InsertColumn(hList, 2, &lvCol ); } // create items SetStatusList(hwndDlg); EnableWindow(GetDlgItem(hwndDlg, IDC_SETSTSMSG), FALSE); // fill profile combo box if (!ServiceExists(MS_SS_GETPROFILE)) EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILE), FALSE); else { int defaultProfile; int profileCount = (int)CallService(MS_SS_GETPROFILECOUNT, (WPARAM)&defaultProfile, 0); for ( int i=0; i < profileCount; i++ ) { char profileName[128]; CallService( MS_SS_GETPROFILENAME, i, (LPARAM)profileName ); int item = SendDlgItemMessageA( hwndDlg, IDC_PROFILE, CB_ADDSTRING, 0, (LPARAM)profileName ); SendDlgItemMessage( hwndDlg, IDC_PROFILE, CB_SETITEMDATA, item, ( LPARAM )i ); } if ( profileCount == 0 ) EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILE), FALSE); } // start timer if (timeOut > 0) { TCHAR text[32]; _sntprintf(text, SIZEOF(text), TranslateT("Closing in %d"), timeOut); SetDlgItemText(hwndDlg, IDC_CLOSE, text); SetTimer(hwndDlg, TIMER_ID, 1000, NULL); } break; case WM_TIMER: { TCHAR text[32]; _sntprintf(text, SIZEOF(text), TranslateT("Closing in %d"), timeOut-1); SetDlgItemText(hwndDlg, IDC_CLOSE, text); if (timeOut <= 0) { KillTimer(hwndDlg, TIMER_ID); SendMessage(hwndDlg, UM_CLOSECONFIRMDLG, 0, 0); } else timeOut--; } break; case WM_COMMAND: // stop timer KillTimer(hwndDlg, TIMER_ID); SetDlgItemText(hwndDlg, IDC_CLOSE, TranslateT("Close")); if ( (HIWORD(wParam) == CBN_SELCHANGE) || (HIWORD(wParam) == BN_CLICKED) || (HIWORD(wParam) == NM_CLICK) ) { // something clicked switch (LOWORD(wParam)) { case IDC_PROFILE: { int i, profile = (int)SendDlgItemMessage(hwndDlg, IDC_PROFILE, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_PROFILE, CB_GETCURSEL, 0, 0), 0); for ( i=0; i < confirmSettings.getCount(); i++ ) { if (confirmSettings[i].szMsg != NULL) { free(confirmSettings[i].szMsg); confirmSettings[i].szMsg = NULL; } } CallService(MS_SS_GETPROFILE, (WPARAM)profile, (LPARAM)&confirmSettings); for ( i=0; i < confirmSettings.getCount(); i++ ) if (confirmSettings[i].szMsg != NULL) // we free this later, copy to our memory space confirmSettings[i].szMsg = _strdup(confirmSettings[i].szMsg); SetStatusList(hwndDlg); } break; case IDC_STATUS: { LVITEM lvItem = { 0 }; lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.iSubItem = 0; lvItem.iItem = ListView_GetNextItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST),-1,LVNI_SELECTED); if (lvItem.iItem == -1) break; ListView_GetItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST), &lvItem); PROTOCOLSETTINGEX* proto = (PROTOCOLSETTINGEX*)lvItem.lParam; int actualStatus = proto->status = (int)SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_GETCURSEL, 0, 0), 0); // LAST STATUS if (proto->status == ID_STATUS_LAST) { TCHAR last[80]; mir_sntprintf(last, SIZEOF(last), _T("%s (%s)"), TranslateT("<last>"), CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, proto->lastStatus, GSMDF_TCHAR )); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_STARTUPLIST), lvItem.iItem, 1, last); actualStatus = proto->lastStatus; } // CURRENT STATUS else if (proto->status == ID_STATUS_CURRENT) { int currentStatus = CallProtoService(proto->szName,PS_GETSTATUS, 0, 0); TCHAR current[80]; mir_sntprintf(current, SIZEOF(current), _T("%s (%s)"), TranslateT("<current>"), CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, currentStatus, GSMDF_TCHAR )); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_STARTUPLIST), lvItem.iItem, 1, current); actualStatus = currentStatus; } else ListView_SetItemText(GetDlgItem(hwndDlg,IDC_STARTUPLIST), lvItem.iItem, 1, ( TCHAR* )CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, proto->status, GSMDF_TCHAR )); if ( (!((CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_1, 0)&PF1_MODEMSGSEND)&~PF1_INDIVMODEMSG)) || (!(CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0)&Proto_Status2Flag(actualStatus))) ) EnableWindow(GetDlgItem(hwndDlg, IDC_SETSTSMSG), FALSE); else if ( (proto->status == ID_STATUS_LAST) || (proto->status == ID_STATUS_CURRENT) ) EnableWindow(GetDlgItem(hwndDlg, IDC_SETSTSMSG), TRUE); else EnableWindow(GetDlgItem(hwndDlg, IDC_SETSTSMSG), (CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0)&Proto_Status2Flag(actualStatus))?TRUE:FALSE); SetStatusList(hwndDlg); } break; case IDC_SETSTSMSG: { LVITEM lvItem = { 0 }; lvItem.mask=LVIF_TEXT|LVIF_PARAM; lvItem.iSubItem=0; lvItem.iItem = ListView_GetNextItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST),-1,LVNI_SELECTED); if (lvItem.iItem == -1) break; ListView_GetItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST), &lvItem); DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SETSTSMSGDIALOG), hwndDlg, StatusMessageDlgProc, lvItem.lParam); } break; case IDC_CLOSE: SendMessage(hwndDlg, UM_CLOSECONFIRMDLG, 0, 0); break; case IDC_CANCEL: DestroyWindow(hwndDlg); break; } } break; case WM_NOTIFY: switch(((NMHDR*)lParam)->idFrom) { case IDC_STARTUPLIST: switch(((NMHDR*)lParam)->code) { // fill combobox case NM_CLICK: { LVITEM lvItem; PROTOCOLSETTINGEX* proto; TCHAR buf[100]; int item, flags, i, currentStatus, actualStatus; KillTimer(hwndDlg, TIMER_ID); SetDlgItemText(hwndDlg, IDC_CLOSE, TranslateT("Close")); memset(&lvItem,0,sizeof(lvItem)); lvItem.mask=LVIF_TEXT|LVIF_PARAM; lvItem.iSubItem=0; lvItem.iItem = ListView_GetNextItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST),-1,LVNI_SELECTED); if (ListView_GetItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST), &lvItem) == FALSE) { SetStatusList(hwndDlg); break; } proto = (PROTOCOLSETTINGEX*)lvItem.lParam; flags = CallProtoService(proto->szName, PS_GETCAPS,PFLAGNUM_2,0)&~CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_5, 0); // clear box and add new status, loop status and check if compatible with proto SendDlgItemMessage(hwndDlg, IDC_STATUS, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); actualStatus = proto->status; // last mir_sntprintf(buf, SIZEOF(buf), _T("%s (%s)"), TranslateT("<last>"), CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)proto->lastStatus, GSMDF_TCHAR)); item = SendDlgItemMessage( hwndDlg, IDC_STATUS, CB_ADDSTRING, 0, (LPARAM)buf ); SendDlgItemMessage( hwndDlg, IDC_STATUS, CB_SETITEMDATA, item, (LPARAM)ID_STATUS_LAST ); if (proto->status == ID_STATUS_LAST) { SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_SETCURSEL,(WPARAM)item,0); actualStatus = proto->lastStatus; } // current currentStatus = CallProtoService(proto->szName,PS_GETSTATUS, 0, 0); mir_sntprintf( buf, SIZEOF(buf), _T("%s (%s)"), TranslateT("<current>"), CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)currentStatus, GSMDF_TCHAR)); item = SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_ADDSTRING,0,(LPARAM)buf); SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_SETITEMDATA,item,(LPARAM)ID_STATUS_CURRENT); if (proto->status == ID_STATUS_CURRENT) { SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_SETCURSEL,(WPARAM)item,0); actualStatus = currentStatus; } for( i = 0; i < SIZEOF(statusModeList); i++ ) { if ( ((flags&statusModePf2List[i]) || (statusModePf2List[i] == PF2_OFFLINE)) && (!((!(flags)&Proto_Status2Flag(statusModePf2List[i]))) || ((CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_5, 0)&Proto_Status2Flag(statusModePf2List[i])))) ) { TCHAR* statusMode = ( TCHAR* )CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, statusModeList[i], GSMDF_TCHAR); item = SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_ADDSTRING,0,(LPARAM)statusMode); SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_SETITEMDATA,item,(LPARAM)statusModeList[i]); if (statusModeList[i] == proto->status) SendDlgItemMessage(hwndDlg,IDC_STATUS,CB_SETCURSEL,(WPARAM)item,0); } } // enable status box EnableWindow(GetDlgItem(hwndDlg,IDC_STATUS), (ListView_GetNextItem(GetDlgItem(hwndDlg,IDC_STARTUPLIST),-1,LVNI_SELECTED)>=0)); if ( (!((CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_1, 0)&PF1_MODEMSGSEND)&~PF1_INDIVMODEMSG)) || (!(CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0)&Proto_Status2Flag(actualStatus))) ) EnableWindow(GetDlgItem(hwndDlg, IDC_SETSTSMSG), FALSE); else if ( proto->status == ID_STATUS_LAST || proto->status == ID_STATUS_CURRENT ) EnableWindow(GetDlgItem(hwndDlg, IDC_SETSTSMSG), TRUE); else EnableWindow(GetDlgItem(hwndDlg, IDC_SETSTSMSG), (CallProtoService(proto->szName, PS_GETCAPS, (WPARAM)PFLAGNUM_3, 0)&Proto_Status2Flag(actualStatus))?TRUE:FALSE); } break; } break; } break; case UM_STSMSGDLGCLOSED: SetStatusList(hwndDlg); break; case UM_CLOSECONFIRMDLG: CallService(MS_CS_SETSTATUSEX, (WPARAM)&confirmSettings, 0); DestroyWindow(hwndDlg); break; case WM_DESTROY: confirmSettings.destroy(); break; } return 0; }
bool Protocol::CanGetStatusMsg(int aStatus) { return (CallProtoService(name, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) != 0 && (PF3 & Proto_Status2Flag(aStatus)); }