int __cdecl onContactSettingChanged(WPARAM wParam,LPARAM lParam) { HANDLE hContact = (HANDLE)wParam; DBCONTACTWRITESETTING *cws=(DBCONTACTWRITESETTING*)lParam; if (!hContact || strcmp(cws->szSetting,"Status")) return 0; pUinKey ptr = getUinKey(hContact); int stat = getContactStatus(hContact); if (!ptr || stat == -1) return 0; if (stat == ID_STATUS_OFFLINE) { // go offline if (ptr->mode == MODE_NATIVE && cpp_keyx(ptr->cntx)) { // have active context cpp_delete_context(ptr->cntx); ptr->cntx=0; // reset context showPopupDC(hContact); // show popup "Disabled" ShowStatusIconNotify(hContact); // change icon in CL } else if (ptr->mode == MODE_RSAAES && exp->rsa_get_state(ptr->cntx) == 7) { deleteRSAcntx(ptr); showPopupDC(hContact); // show popup "Disabled" ShowStatusIconNotify(hContact); // change icon in CL } } else { // go not offline if (ptr->offlineKey) { cpp_reset_context(ptr->cntx); ptr->offlineKey = false; } ShowStatusIconNotify(hContact); // change icon in CL } return 0; }
BYTE isContactSecured(HANDLE hContact) { // нужна проверка на Offline и в этом случае другие статусы if (!clist_cnt) return 0; BYTE r=0; if( isProtoMetaContacts(hContact) ) hContact = getMostOnline(hContact); // возьмем тот, через который пойдет сообщение for(int j=0;j<clist_cnt;j++) { if( clist[j].hContact == hContact ) { if( !clist[j].proto->inspecting ) break; DBVARIANT dbv; r=clist[j].mode; switch(r) { case MODE_NATIVE: if(cpp_keyx(clist[j].cntx)!=0) r|=SECURED; break; case MODE_PGP: DBGetContactSetting(hContact,szModuleName,"pgp",&dbv); if( dbv.type!=0 ) r|=SECURED; DBFreeVariant(&dbv); break; case MODE_GPG: DBGetContactSetting(hContact,szModuleName,"gpg",&dbv); if( dbv.type!=0 ) r|=SECURED; DBFreeVariant(&dbv); break; case MODE_RSAAES: if(exp->rsa_get_state(clist[j].cntx)==7) r|=SECURED; break; case MODE_RSA: if(clist[j].cntx) r|=SECURED; break; } break; } } return r; // (mode&SECURED) - проверка на EST/DIS }