void *OSDPlugin::processEvent(Event *e) { OSDRequest osd; Contact *contact; Message *msg; switch (e->type()){ case EventContactOnline: contact = (Contact*)(e->param()); if (contact->getIgnore()) break; osd.contact = contact->id(); osd.type = OSD_ALERT; queue.push_back(osd); processQueue(); break; case EventMessageReceived: msg = (Message*)(e->param()); if (msg->type() == MessageStatus) break; osd.contact = msg->contact(); osd.type = msg->type(); osd.msg_id = msg->id(); osd.client = msg->client(); queue.push_back(osd); processQueue(); break; } return NULL; }
void YahooClient::processStatus(unsigned short service, const char *id, const char *_state, const char *_msg, const char *_away, const char *_idle) { Contact *contact; YahooUserData *data = findContact(id, NULL, contact); if (data == NULL) return; unsigned state = 0; unsigned away = 0; unsigned idle = 0; if (_state) state = atol(_state); if (_away) away = atol(_away); if (_idle) idle = atol(_idle); if (service == YAHOO_SERVICE_LOGOFF) state = YAHOO_STATUS_OFFLINE; if ((state != data->Status.value) || ((state == YAHOO_STATUS_CUSTOM) && (((away != 0) != data->bAway.bValue) || _cmp(_msg, data->AwayMessage.ptr)))) { unsigned long old_status = STATUS_UNKNOWN; unsigned style = 0; const char *statusIcon = NULL; contactInfo(data, old_status, style, statusIcon); time_t now; time(&now); now -= idle; if (data->Status.value == YAHOO_STATUS_OFFLINE) data->OnlineTime.value = now; data->Status.value = state; data->bAway.bValue = (away != 0); data->StatusTime.value = now; unsigned long new_status = STATUS_UNKNOWN; contactInfo(data, old_status, style, statusIcon); if (old_status != new_status) { StatusMessage m; m.setContact(contact->id()); m.setClient(dataName(data).c_str()); m.setFlags(MESSAGE_RECEIVED); m.setStatus(STATUS_OFFLINE); Event e(EventMessageReceived, &m); e.process(); if ((new_status == STATUS_ONLINE) && !contact->getIgnore()) { Event e(EventContactOnline, contact); e.process(); } } else { Event e(EventContactStatus, contact); e.process(); } } }
void IgnoreList::drop(QMimeSource *s) { if (ContactDragObject::canDecode(s)){ Contact *contact = ContactDragObject::decode(s); if (contact){ if (!contact->getIgnore()){ contact->setIgnore(true); Event e(EventContactChanged, contact); e.process(); return; } } } }
void IgnoreList::dragEnter(QMimeSource *s) { if (ContactDragObject::canDecode(s)){ Contact *contact = ContactDragObject::decode(s); if (contact){ if (!contact->getIgnore()){ log(L_DEBUG, "Set true"); lstIgnore->acceptDrop(true); return; } } } log(L_DEBUG, "Set false"); lstIgnore->acceptDrop(false); }
IgnoreList::IgnoreList(QWidget *parent) : IgnoreListBase(parent) { lstIgnore->addColumn(i18n("Contact")); lstIgnore->addColumn(i18n("Name")); lstIgnore->addColumn(i18n("EMail")); connect(lstIgnore, SIGNAL(deleteItem(QListViewItem*)), this, SLOT(deleteItem(QListViewItem*))); connect(lstIgnore, SIGNAL(dragStart()), this, SLOT(dragStart())); connect(lstIgnore, SIGNAL(dragEnter(QMimeSource*)), this, SLOT(dragEnter(QMimeSource*))); connect(lstIgnore, SIGNAL(drop(QMimeSource*)), this, SLOT(drop(QMimeSource*))); Contact *contact; ContactList::ContactIterator it; while ((contact = ++it) != NULL){ if (!contact->getIgnore()) continue; QListViewItem *item = new QListViewItem(lstIgnore); updateItem(item, contact); } }
void *IgnoreList::processEvent(Event *e) { Contact *contact; QListViewItem *item; switch (e->type()){ case EventContactDeleted: contact = (Contact*)(e->param()); removeItem(findItem(contact)); return e->param(); case EventContactCreated: case EventContactChanged: contact = (Contact*)(e->param()); item = findItem(contact); if (contact->getIgnore()){ if (item == NULL) item = new QListViewItem(lstIgnore); updateItem(item, contact); }else{ removeItem(item); } } return NULL; }
void *Container::processEvent(Event *e) { UserWnd *userWnd; Contact *contact; CommandDef *cmd; Message *msg; switch (e->type()){ case EventMessageReceived: msg = (Message*)(e->param()); if (msg->type() == MessageStatus){ contact = getContacts()->contact(msg->contact()); if (contact) contactChanged(contact); return NULL; } if (CorePlugin::m_plugin->getContainerMode()){ if (isActiveWindow()){ userWnd = m_tabBar->currentWnd(); if (userWnd && (userWnd->id() == msg->contact())) userWnd->markAsRead(); } #ifdef WIN32 if (!isActiveWindow()){ msg = (Message*)(e->param()); userWnd = wnd(msg->contact()); if (userWnd){ if (!initFlash){ HINSTANCE hLib = GetModuleHandleA("user32"); if (hLib != NULL) (DWORD&)FlashWindowEx = (DWORD)GetProcAddress(hLib,"FlashWindowEx"); initFlash = true; } if (FlashWindowEx){ FLASHWINFO fInfo; fInfo.cbSize = sizeof(fInfo); fInfo.dwFlags = 0x0E; fInfo.hwnd = winId(); fInfo.uCount = 0; FlashWindowEx(&fInfo); } } } #endif } case EventMessageRead: msg = (Message*)(e->param()); userWnd = wnd(msg->contact()); if (userWnd){ bool bBold = false; for (list<msg_id>::iterator it = CorePlugin::m_plugin->unread.begin(); it != CorePlugin::m_plugin->unread.end(); ++it){ if ((*it).contact != msg->contact()) continue; bBold = true; break; } m_tabBar->setBold(msg->contact(), bBold); } break; case EventActiveContact: if (!isActiveWindow()) return NULL; userWnd = m_tabBar->currentWnd(); if (userWnd) return (void*)(userWnd->id()); break; case EventContactDeleted: contact = (Contact*)(e->param()); userWnd = wnd(contact->id()); if (userWnd) removeUserWnd(userWnd); break; case EventContactChanged: contact = (Contact*)(e->param()); userWnd = wnd(contact->id()); if (userWnd){ if (contact->getIgnore()){ removeUserWnd(userWnd); break; } m_tabBar->changeTab(contact->id()); contactChanged(contact); } case EventClientsChanged: setupAccel(); break; case EventContactStatus: contact = (Contact*)(e->param()); userWnd = m_tabBar->wnd(contact->id()); if (userWnd){ unsigned style = 0; string wrkIcons; const char *statusIcon = NULL; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.empty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (userWnd->m_bTyping != bTyping){ userWnd->m_bTyping = bTyping; if (bTyping){ userWnd->setStatus(i18n("Contact typed message")); }else{ userWnd->setStatus(""); } userWnd = m_tabBar->currentWnd(); if (userWnd && (contact->id() == userWnd->id())) m_status->message(userWnd->status()); } } break; case EventContactClient: contactChanged((Contact*)(e->param())); break; case EventInit: init(); break; case EventCommandExec: cmd = (CommandDef*)(e->param()); userWnd = m_tabBar->currentWnd(); if (userWnd && ((unsigned)(cmd->param) == userWnd->id())){ if (cmd->menu_id == MenuContainerContact){ m_tabBar->raiseTab(cmd->id); return e->param(); } if (cmd->id == CmdClose){ delete userWnd; return e->param(); } if (cmd->id == CmdInfo){ CommandDef c = *cmd; c.menu_id = MenuContact; c.param = (void*)userWnd->id(); Event eExec(EventCommandExec, &c); eExec.process(); return e->param(); } } break; case EventCheckState: cmd = (CommandDef*)(e->param()); userWnd = m_tabBar->currentWnd(); if (userWnd && ((unsigned)(cmd->param) == userWnd->id()) && (cmd->menu_id == MenuContainerContact) && (cmd->id == CmdContainerContacts)){ list<UserWnd*> userWnds = m_tabBar->windows(); CommandDef *cmds = new CommandDef[userWnds.size() + 1]; memset(cmds, 0, sizeof(CommandDef) * (userWnds.size() + 1)); unsigned n = 0; for (list<UserWnd*>::iterator it = userWnds.begin(); it != userWnds.end(); ++it){ cmds[n].id = (*it)->id(); cmds[n].flags = COMMAND_DEFAULT; cmds[n].text_wrk = strdup((*it)->getName().utf8()); cmds[n].icon = (*it)->getIcon(); cmds[n].text = "_"; cmds[n].menu_id = n + 1; if (n < sizeof(accels) / sizeof(const char*)) cmds[n].accel = accels[n]; if (*it == m_tabBar->currentWnd()) cmds[n].flags |= COMMAND_CHECKED; n++; } cmd->param = cmds; cmd->flags |= COMMAND_RECURSIVE; return e->param(); } break; } return NULL; }
void *FilterPlugin::processEvent(Event *e) { if (e->type() == EventMessageReceived){ Message *msg = (Message*)(e->param()); if (!msg || (msg->type() == MessageStatus)) return NULL; Contact *contact = getContacts()->contact(msg->contact()); FilterUserData *data = NULL; // check if we accept only from users on the list if (getFromList() && ((contact == NULL) || contact->getTemporary())){ delete msg; delete contact; return msg; } if (!contact) return NULL; // check if the user is a ignored user if (contact->getIgnore()){ delete msg; return msg; } // get filter-data data = (FilterUserData*)(contact->getUserData(user_data_id)); if (data && data->SpamList.ptr && *data->SpamList.ptr){ if (checkSpam(msg->getPlainText(), QString::fromUtf8(data->SpamList.ptr))){ delete msg; return msg; } } return NULL; } if (e->type() == EventCheckState){ CommandDef *cmd = (CommandDef*)(e->param()); if (cmd->id == CmdIgnore){ cmd->flags &= ~BTN_HIDE; Contact *contact = getContacts()->contact((unsigned)(cmd->param)); if (contact && contact->getGroup()) cmd->flags |= BTN_HIDE; return e->param(); } if (cmd->id == CmdIgnoreText){ cmd->flags &= ~COMMAND_CHECKED; if (cmd->menu_id == MenuMsgView){ MsgViewBase *edit = (MsgViewBase*)(cmd->param); if (edit->hasSelectedText()) return e->param(); }else if (cmd->menu_id == MenuTextEdit){ TextEdit *edit = ((MsgEdit*)(cmd->param))->m_edit; if (edit->hasSelectedText()) return e->param(); } return NULL; } if (cmd->menu_id == MenuContactGroup){ if (cmd->id == CmdIgnoreList){ Contact *contact = getContacts()->contact((unsigned)(cmd->param)); if (contact == NULL) return NULL; cmd->flags &= COMMAND_CHECKED; if (contact->getIgnore()) cmd->flags |= COMMAND_CHECKED; return e->param(); } } } if (e->type() == EventCommandExec){ CommandDef *cmd = (CommandDef*)(e->param()); if (cmd->id == CmdIgnore){ Contact *contact = getContacts()->contact((unsigned)(cmd->param)); if (contact){ QString text = i18n("Add %1 to ignore list?") .arg(contact->getName()); Command cmd; cmd->id = CmdIgnore; cmd->param = (void*)(contact->id()); Event e(EventCommandWidget, cmd); QWidget *w = (QWidget*)(e.process()); BalloonMsg::ask((void*)(contact->id()), text, w, SLOT(addToIgnore(void*)), NULL, NULL, this); } return e->param(); }
void ICQClient::snac_buddy(unsigned short type, unsigned short) { string screen; Contact *contact; ICQUserData *data; switch (type){ case ICQ_SNACxBDY_RIGHTSxGRANTED: log(L_DEBUG, "Buddy rights granted"); break; case ICQ_SNACxBDY_USEROFFLINE: screen = m_socket->readBuffer.unpackScreen(); data = findContact(screen.c_str(), NULL, false, contact); if (data && (data->Status.value != ICQ_STATUS_OFFLINE)){ setOffline(data); StatusMessage m; m.setContact(contact->id()); m.setClient(dataName(data).c_str()); m.setStatus(STATUS_OFFLINE); m.setFlags(MESSAGE_RECEIVED); Event e(EventMessageReceived, &m); e.process(); } break; case ICQ_SNACxBDY_USERONLINE: screen = m_socket->readBuffer.unpackScreen(); data = findContact(screen.c_str(), NULL, false, contact); if (data){ time_t now; time(&now); bool bChanged = false; bool bAwayChanged = false; unsigned long prevStatus = data->Status.value; unsigned short level, len; m_socket->readBuffer >> level >> len; data->WarningLevel.value = level; TlvList tlv(m_socket->readBuffer); Tlv *tlvClass = tlv(0x0001); if (tlvClass){ unsigned short userClass = *tlvClass; if (userClass != data->Class.value){ if ((userClass & CLASS_AWAY) != (data->Class.value & CLASS_AWAY)){ data->StatusTime.value = (unsigned long)now; bAwayChanged = true; } data->Class.value = userClass; bChanged = true; } if (data->Uin.value == 0){ if (userClass & CLASS_AWAY){ fetchAwayMessage(data); }else{ set_str(&data->AutoReply.ptr, NULL); } } } // Status TLV Tlv *tlvStatus = tlv(0x0006); if (tlvStatus){ unsigned long status = *tlvStatus; if (status != data->Status.value){ data->Status.value = status; if ((status & 0xFF) == 0) set_str(&data->AutoReply.ptr, NULL); data->StatusTime.value = (unsigned long)now; } }else if (data->Status.value == ICQ_STATUS_OFFLINE){ data->Status.value = ICQ_STATUS_ONLINE; data->StatusTime.value = (unsigned long)now; } // Online time TLV Tlv *tlvOnlineTime = tlv(0x0003); if (tlvOnlineTime){ unsigned long OnlineTime = *tlvOnlineTime; if (OnlineTime != data->OnlineTime.value){ data->OnlineTime.value = OnlineTime; bChanged = true; } } Tlv *tlvNATime = tlv(0x0004); if (tlvNATime){ unsigned short na_time = *tlvNATime; unsigned long StatusTime = (unsigned long)now - na_time * 60; if (StatusTime != data->StatusTime.value){ data->StatusTime.value = StatusTime; bChanged = true; } } // IP TLV Tlv *tlvIP = tlv(0x000A); if (tlvIP) bChanged |= set_ip(&data->IP, htonl((unsigned long)(*tlvIP))); Tlv *tlvCapability = tlv(0x000D); if (tlvCapability){ data->Caps.value = 0; Buffer info(*tlvCapability); for (; info.readPos() < info.size(); ){ capability cap; info.unpack((char*)cap, sizeof(capability)); for (unsigned i = 0;; i++){ if (*capabilities[i] == 0) break; unsigned size = sizeof(capability); if (i == CAP_SIMOLD) size--; if ((i == CAP_MICQ) || (i == CAP_LICQ) || (i == CAP_SIM)) size -= 4; if (!memcmp(cap, capabilities[i], size)){ if (i == CAP_SIMOLD){ unsigned char build = cap[sizeof(capability)-1]; if (build && ((build == 0x92) || (build < (1 << 6)))) continue; data->Build.value = build; } if ((i == CAP_MICQ) || (i == CAP_LICQ) || (i == CAP_SIM)){ unsigned char *p = (unsigned char*)cap; p += 12; data->Build.value = (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; } data->Caps.value |= (1 << i); break; } } } } unsigned long infoUpdateTime = 0; unsigned long pluginInfoTime = 0; unsigned long pluginStatusTime = 0; // Direct connection info Tlv *tlvDirect = tlv(0x000C); if (tlvDirect){ Buffer info(*tlvDirect); unsigned long realIP; unsigned short port; char mode, version, junk; info >> realIP; info.incReadPos(2); info >> port; if (realIP == 0x7F000001) realIP = 0; bChanged |= set_ip(&data->RealIP, htonl(realIP)); data->Port.value = port; unsigned long DCcookie; info >> mode >> junk >> version >> DCcookie; data->DCcookie.value = DCcookie; info.incReadPos(8); info >> infoUpdateTime >> pluginInfoTime >> pluginStatusTime; if (mode == MODE_DENIED) mode = MODE_INDIRECT; if ((mode != MODE_DIRECT) && (mode != MODE_INDIRECT)) mode = MODE_INDIRECT; data->Mode.value = mode; data->Version.value = version; } Tlv *tlvPlugin = tlv(0x0011); if (tlvPlugin && data->Uin.value){ Buffer info(*tlvPlugin); char type; unsigned long time; info >> type; info.unpack(time); plugin p; unsigned plugin_index; unsigned long plugin_status; switch (type){ case 1: addFullInfoRequest(data->Uin.value); break; case 2: info.incReadPos(6); info.unpack((char*)p, sizeof(p)); data->PluginInfoTime.value = time; for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) if (!memcmp(p, plugins[plugin_index], sizeof(p))) break; switch (plugin_index){ case PLUGIN_PHONEBOOK: log(L_DEBUG, "Updated phonebook"); addPluginInfoRequest(data->Uin.value, plugin_index); break; case PLUGIN_PICTURE: log(L_DEBUG, "Updated picture"); addPluginInfoRequest(data->Uin.value, plugin_index); break; case PLUGIN_QUERYxINFO: log(L_DEBUG, "Updated info plugin list"); addPluginInfoRequest(data->Uin.value, plugin_index); break; default: if (plugin_index >= PLUGIN_NULL) log(L_WARN, "Unknown plugin sign"); } break; case 3: info.incReadPos(6); info.unpack((char*)p, sizeof(p)); info.incReadPos(1); info.unpack(plugin_status); data->PluginStatusTime.value = time; for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) if (!memcmp(p, plugins[plugin_index], sizeof(p))) break; switch (plugin_index){ case PLUGIN_FOLLOWME: if (data->FollowMe.value == plugin_status) break; data->FollowMe.value = plugin_status; bChanged = true; break; case PLUGIN_FILESERVER: if ((data->SharedFiles.value != 0) == (plugin_status != 0)) break; data->SharedFiles.value = (plugin_status != 0); bChanged = true; break; case PLUGIN_ICQPHONE: if (data->ICQPhone.value == plugin_status) break; data->ICQPhone.value = plugin_status; bChanged = true; break; default: if (plugin_index >= PLUGIN_NULL) log(L_WARN, "Unknown plugin sign"); } break; } }else{ data->InfoUpdateTime.value = infoUpdateTime; data->PluginInfoTime.value = pluginInfoTime; data->PluginStatusTime.value = pluginStatusTime; if (getAutoUpdate()){ if (infoUpdateTime == 0) infoUpdateTime = 1; if (infoUpdateTime != data->InfoFetchTime.value) addFullInfoRequest(data->Uin.value); if ((data->PluginInfoTime.value != data->PluginInfoFetchTime.value)){ if (data->PluginInfoTime.value) addPluginInfoRequest(data->Uin.value, PLUGIN_QUERYxINFO); } if ((data->PluginInfoTime.value != data->PluginInfoFetchTime.value) || (data->PluginStatusTime.value != data->PluginStatusFetchTime.value)){ if (data->SharedFiles.bValue){ data->SharedFiles.bValue = false; bChanged = true; } if (data->FollowMe.value){ data->FollowMe.value = 0; bChanged = true; } if (data->ICQPhone.bValue){ data->ICQPhone.bValue = false; bChanged = true; } if (data->PluginStatusTime.value) addPluginInfoRequest(data->Uin.value, PLUGIN_QUERYxSTATUS); } } } if (data->bInvisible.bValue){ data->bInvisible.bValue = false; bChanged = true; } if (bChanged){ Event e(EventContactChanged, contact); e.process(); } if ((data->Status.value != prevStatus) || bAwayChanged){ unsigned status = STATUS_OFFLINE; if ((data->Status.value & 0xFFFF) != ICQ_STATUS_OFFLINE){ status = STATUS_ONLINE; if (data->Status.value & ICQ_STATUS_DND){ status = STATUS_DND; }else if (data->Status.value & ICQ_STATUS_OCCUPIED){ status = STATUS_OCCUPIED; }else if (data->Status.value & ICQ_STATUS_NA){ status = STATUS_NA; }else if (data->Status.value & ICQ_STATUS_AWAY){ status = STATUS_AWAY; }else if (data->Status.value & ICQ_STATUS_FFC){ status = STATUS_FFC; } } if ((status == STATUS_ONLINE) && (data->Class.value & CLASS_AWAY)) status = STATUS_AWAY; StatusMessage m; m.setContact(contact->id()); m.setClient(dataName(data).c_str()); m.setStatus(status); m.setFlags(MESSAGE_RECEIVED); Event e(EventMessageReceived, &m); e.process(); if (!contact->getIgnore() && ((data->Class.value & CLASS_AWAY) == 0) && (((data->Status.value & 0xFF) == ICQ_STATUS_ONLINE) && (((prevStatus & 0xFF) != ICQ_STATUS_ONLINE)) || bAwayChanged) && (((prevStatus & 0xFFFF) != ICQ_STATUS_OFFLINE) || (data->OnlineTime.value > this->data.owner.OnlineTime.value))){ Event e(EventContactOnline, contact); e.process(); } if (getAutoReplyUpdate() && ((data->Status.value & 0xFF) != ICQ_STATUS_ONLINE)){ if ((getInvisible() && data->VisibleId.value) || (!getInvisible() && (data->InvisibleId.value == 0))) addPluginInfoRequest(data->Uin.value, PLUGIN_AR); } } }
void *Container::processEvent(Event *e) { UserWnd *userWnd; Contact *contact; CommandDef *cmd; Message *msg; switch (e->type()){ case EventMessageReceived: msg = (Message*)(e->param()); if (msg->type() == MessageStatus){ contact = getContacts()->contact(msg->contact()); if (contact) contactChanged(contact); return NULL; } if (msg->getFlags() & MESSAGE_NOVIEW) return NULL; if (CorePlugin::m_plugin->getContainerMode()){ if (isActiveWindow() && !isMinimized()){ userWnd = m_tabBar->currentWnd(); if (userWnd && (userWnd->id() == msg->contact())) userWnd->markAsRead(); }else{ msg = (Message*)(e->param()); userWnd = wnd(msg->contact()); if (userWnd) QTimer::singleShot(0, this, SLOT(flash())); } } break; case EventMessageRead: msg = (Message*)(e->param()); userWnd = wnd(msg->contact()); if (userWnd){ bool bBold = false; for (list<msg_id>::iterator it = CorePlugin::m_plugin->unread.begin(); it != CorePlugin::m_plugin->unread.end(); ++it){ if ((*it).contact != msg->contact()) continue; bBold = true; break; } m_tabBar->setBold(msg->contact(), bBold); } break; case EventActiveContact: if (!isActiveWindow()) return NULL; userWnd = m_tabBar->currentWnd(); if (userWnd) return (void*)(userWnd->id()); break; case EventContactDeleted: contact = (Contact*)(e->param()); userWnd = wnd(contact->id()); if (userWnd) removeUserWnd(userWnd); break; case EventContactChanged: contact = (Contact*)(e->param()); userWnd = wnd(contact->id()); if (userWnd){ if (contact->getIgnore()){ removeUserWnd(userWnd); break; } m_tabBar->changeTab(contact->id()); contactChanged(contact); } case EventClientsChanged: setupAccel(); break; case EventContactStatus: contact = (Contact*)(e->param()); userWnd = m_tabBar->wnd(contact->id()); if (userWnd){ unsigned style = 0; string wrkIcons; const char *statusIcon = NULL; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.empty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (userWnd->m_bTyping != bTyping){ userWnd->m_bTyping = bTyping; if (bTyping){ userWnd->setStatus(g_i18n("%1 typed", contact) .arg(contact->getName())); }else{ userWnd->setStatus(""); } userWnd = m_tabBar->currentWnd(); if (userWnd && (contact->id() == userWnd->id())) m_status->message(userWnd->status()); } } break; case EventContactClient: contactChanged((Contact*)(e->param())); break; case EventInit: init(); break; case EventCommandExec: cmd = (CommandDef*)(e->param()); userWnd = m_tabBar->currentWnd(); if (userWnd && ((unsigned)(cmd->param) == userWnd->id())){ if (cmd->menu_id == MenuContainerContact){ m_tabBar->raiseTab(cmd->id); return e->param(); } if (cmd->id == CmdClose){ delete userWnd; return e->param(); } if (cmd->id == CmdInfo){ CommandDef c = *cmd; c.menu_id = MenuContact; c.param = (void*)userWnd->id(); Event eExec(EventCommandExec, &c); eExec.process(); return e->param(); } } break; case EventCheckState: cmd = (CommandDef*)(e->param()); userWnd = m_tabBar->currentWnd(); if (userWnd && ((unsigned)(cmd->param) == userWnd->id()) && (cmd->menu_id == MenuContainerContact) && (cmd->id == CmdContainerContacts)){ list<UserWnd*> userWnds = m_tabBar->windows(); CommandDef *cmds = new CommandDef[userWnds.size() + 1]; memset(cmds, 0, sizeof(CommandDef) * (userWnds.size() + 1)); unsigned n = 0; for (list<UserWnd*>::iterator it = userWnds.begin(); it != userWnds.end(); ++it){ cmds[n].id = (*it)->id(); cmds[n].flags = COMMAND_DEFAULT; cmds[n].text_wrk = strdup((*it)->getName().utf8()); cmds[n].icon = (*it)->getIcon(); cmds[n].text = "_"; cmds[n].menu_id = n + 1; if (n < sizeof(accels) / sizeof(const char*)) cmds[n].accel = accels[n]; if (*it == m_tabBar->currentWnd()) cmds[n].flags |= COMMAND_CHECKED; n++; } cmd->param = cmds; cmd->flags |= COMMAND_RECURSIVE; return e->param(); } break; } return NULL; }
void SynPacket::answer(const char *_cmd, vector<string> &args) { string cmd = _cmd; if (cmd == "SYN"){ m_ver = atol(args[0].c_str()); if (m_ver != m_client->getListVer()){ ContactList::GroupIterator itg; Group *grp; while ((grp = ++itg) != NULL){ MSNUserData *data; ClientDataIterator it(grp->clientData, m_client); while ((data = (MSNUserData*)(++it)) != NULL){ data->sFlags = data->Flags; data->Flags = 0; } } ContactList::ContactIterator itc; Contact *contact; while ((contact = ++itc) != NULL){ MSNUserData *data; ClientDataIterator it(contact->clientData, m_client); while ((data = (MSNUserData*)(++it)) != NULL){ data->sFlags = data->Flags; data->Flags = 0; } } } } if (cmd == "LSG"){ if (args.size() < 5){ log(L_WARN, "Bad LSG size"); return; } unsigned id = atol(args[3].c_str()); if (id == 0) return; Group *grp; string grp_name; grp_name = m_client->unquote(QString::fromUtf8(args[4].c_str())).utf8(); MSNListRequest *lr = m_client->findRequest(id, LR_GROUPxREMOVED); if (lr) return; MSNUserData *data = m_client->findGroup(id, NULL, grp); if (data){ lr = m_client->findRequest(grp->id(), LR_GROUPxCHANGED); if (lr){ data->sFlags |= MSN_CHECKED; return; } } data = m_client->findGroup(id, grp_name.c_str(), grp); data->sFlags |= MSN_CHECKED; } if (cmd == "LST"){ if (args.size() < 6){ log(L_WARN, "Bad size for LST"); return; } string mail; mail = m_client->unquote(QString::fromUtf8(args[4].c_str())).utf8(); string name; name = m_client->unquote(QString::fromUtf8(args[5].c_str())).utf8(); Contact *contact; MSNListRequest *lr = m_client->findRequest(mail.c_str(), LR_CONTACTxREMOVED); if (lr) return; bool bNew = false; MSNUserData *data = m_client->findContact(mail.c_str(), contact); if (data == NULL){ data = m_client->findContact(mail.c_str(), name.c_str(), contact); bNew = true; }else{ set_str(&data->EMail, mail.c_str()); set_str(&data->ScreenName, name.c_str()); } data->sFlags |= MSN_CHECKED; lr = m_client->findRequest(mail.c_str(), LR_CONTACTxCHANGED); if (args[0] == "FL"){ unsigned grp = atol(args[6].c_str()); data->Group = grp; data->Flags |= MSN_FORWARD; Group *group = NULL; m_client->findGroup(grp, NULL, group); if ((lr == NULL) && group && (group->id() != contact->getGroup())){ unsigned grp = group->id(); if (grp == 0){ void *d; ClientDataIterator it_d(contact->clientData); while ((d = ++it_d) != NULL){ if (d != data) break; } if (d){ grp = contact->getGroup(); m_client->findRequest(data->EMail, LR_CONTACTxCHANGED, true); MSNListRequest lr; lr.Type = LR_CONTACTxCHANGED; lr.Name = data->EMail; m_client->m_requests.push_back(lr); m_client->processRequests(); } } contact->setGroup(grp); Event e(EventContactChanged, contact); e.process(); } return; } if (args[0] == "RL"){ if (((data->sFlags & MSN_REVERSE) == 0) && m_client->getListVer()) m_client->auth_message(contact, MessageAdded, data); data->Flags |= MSN_REVERSE; return; } if (args[0] == "AL"){ data->Flags |= MSN_ACCEPT; return; } if (args[0] == "BL"){ data->Flags |= MSN_BLOCKED; if ((lr == NULL) && !contact->getIgnore()){ contact->setIgnore(true); Event e(EventContactChanged, contact); e.process(); } return; } } }
void OSDPlugin::processQueue() { if (m_timer->isActive()) return; while (queue.size()){ m_request = queue.front(); queue.erase(queue.begin()); Contact *contact = getContacts()->contact(m_request.contact); if ((contact == NULL) || contact->getIgnore()){ continue; } QString text; OSDUserData *data = NULL; data = (OSDUserData*)contact->getUserData(user_data_id); switch (m_request.type){ case OSD_ALERT: if (data->EnableAlert.bValue){ unsigned style = 0; const char *statusIcon = NULL; if (contact->contactInfo(style, statusIcon) >= STATUS_ONLINE) text = g_i18n("%1 is online", contact) .arg(contact->getName()); } break; case OSD_TYPING: if (data->EnableTyping.bValue){ unsigned style = 0; string wrkIcons; const char *statusIcon = NULL; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.empty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (bTyping) text = g_i18n("%1 is typing", contact) .arg(contact->getName()); } break; case OSD_MESSAGE: if (data->EnableMessage.bValue && core){ list<msg_id>::iterator it; TYPE_MAP types; TYPE_MAP::iterator itc; QString msg_text; for (it = core->unread.begin(); it != core->unread.end(); ++it){ if ((*it).contact != m_request.contact) continue; unsigned type = (*it).type; itc = types.find(type); if (itc == types.end()){ types.insert(TYPE_MAP::value_type(type, 1)); }else{ (*itc).second++; } if (!data->EnableMessageShowContent.bValue) continue; MessageID id; id.id = (*it).id; id.contact = (*it).contact; id.client = (*it).client.c_str(); Event e(EventLoadMessage, &id); Message *msg = (Message*)(e.process()); if (msg == NULL) continue; QString msgText = msg->getPlainText().stripWhiteSpace(); if (msgText.isEmpty()) continue; if (!msg_text.isEmpty()) msg_text += "\n"; msg_text += msgText; } if (types.empty()) break; for (itc = types.begin(); itc != types.end(); ++itc){ CommandDef *def = core->messageTypes.find((*itc).first); if (def == NULL) continue; MessageDef *mdef = (MessageDef*)(def->param); QString msg = i18n(mdef->singular, mdef->plural, (*itc).second); if ((*itc).second == 1){ int pos = msg.find("1 "); if (pos > 0){ msg = msg.left(pos); }else if (pos == 0){ msg = msg.mid(2); } msg = msg.left(1).upper() + msg.mid(1); } if (!text.isEmpty()) text += ", "; text += msg; } text = i18n("%1 from %2") .arg(text) .arg(contact->getName()); if (msg_text.isEmpty()) break; text += ":\n"; text += msg_text; } } if (!text.isEmpty()){ if (m_osd == NULL){ m_osd = new OSDWidget; connect(m_osd, SIGNAL(dblClick()), this, SLOT(dblClick())); connect(m_osd, SIGNAL(closeClick()), this, SLOT(timeout())); } static_cast<OSDWidget*>(m_osd)->showOSD(text, data); m_timer->start(data->Timeout.value * 1000); return; } } m_timer->stop(); m_request.contact = 0; m_request.type = OSD_NONE; }
void OSDPlugin::processQueue() { if (m_timer->isActive()) return; while (queue.size()){ m_request = queue.front(); queue.erase(queue.begin()); Contact *contact = getContacts()->contact(m_request.contact); if ((contact == NULL) || contact->getIgnore()){ continue; } QString text; OSDUserData *data = NULL; data = (OSDUserData*)contact->getUserData(user_data_id); uint ms=core->getManualStatus(); switch (m_request.type){ case OSD_ALERTONLINE: if (data->EnableAlert.toBool() && data->EnableAlertOnline.toBool()){ unsigned style = 0; QString statusIcon; if (contact->contactInfo(style, statusIcon) == STATUS_ONLINE) text = g_i18n("%1 is online", contact) .arg(contact->getName()); } break; case OSD_ALERTAWAY: if (data->EnableAlert.toBool() && data->EnableAlertAway.toBool()){ text = g_i18n("%1 is away", contact) .arg(contact->getName()); } break; case OSD_ALERTNA: if (data->EnableAlert.toBool() && data->EnableAlertNA.toBool()){ text = g_i18n("%1 is not available", contact) .arg(contact->getName()); } break; case OSD_ALERTDND: if (data->EnableAlert.toBool() && data->EnableAlertDND.toBool()){ text = g_i18n("%1 doesn't want to be disturbed", contact) .arg(contact->getName()); } break; case OSD_ALERTOCCUPIED: if (data->EnableAlert.toBool() && data->EnableAlertOccupied.toBool()){ text = g_i18n("%1 is occupied", contact) .arg(contact->getName()); } break; case OSD_ALERTFFC: if (data->EnableAlert.toBool() && data->EnableAlertFFC.toBool()){ text = g_i18n("%1 is free for chat", contact) .arg(contact->getName()); } break; case OSD_ALERTOFFLINE: if (data->EnableAlert.toBool() && data->EnableAlertOffline.toBool() && (ms-1) ){ text = g_i18n("%1 is offline", contact) .arg(contact->getName()); } break; case OSD_TYPING: if (data->EnableTyping.toBool()){ unsigned style = 0; QString wrkIcons; QString statusIcon; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.isEmpty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (bTyping) text = g_i18n("%1 is typing", contact) .arg(contact->getName()); } break; case OSD_MESSAGE: if (data->EnableMessage.toBool() && core){ list<msg_id>::iterator it; TYPE_MAP types; TYPE_MAP::iterator itc; QString msg_text; for (it = core->unread.begin(); it != core->unread.end(); ++it){ if ((*it).contact != m_request.contact) continue; unsigned type = (*it).type; itc = types.find(type); if (itc == types.end()){ types.insert(TYPE_MAP::value_type(type, 1)); }else{ (*itc).second++; } if (!data->EnableMessageShowContent.toBool()) continue; EventLoadMessage e((*it).id, (*it).client, (*it).contact); e.process(); Message *msg = e.message(); if (msg == NULL) continue; QString msgText = msg->getPlainText().stripWhiteSpace(); if (msgText.isEmpty()) continue; if (!msg_text.isEmpty()) msg_text += "\n"; msg_text += msgText; } if (types.empty()) break; for (itc = types.begin(); itc != types.end(); ++itc){ CommandDef *def = core->messageTypes.find((*itc).first); if (def == NULL) continue; MessageDef *mdef = (MessageDef*)(def->param); QString msg = i18n(mdef->singular, mdef->plural, (*itc).second); if ((*itc).second == 1){ int pos = msg.find("1 "); if (pos > 0){ msg = msg.left(pos); }else if (pos == 0){ msg = msg.mid(2); } msg = msg.left(1).upper() + msg.mid(1); } if (!text.isEmpty()) text += ", "; text += msg; } if ( core->getManualStatus()==STATUS_NA && data->EnableCapsLockFlash.toBool() && ! this->running() ) this->start(); //Start flashing the CapsLock if enabled text = i18n("%1 from %2") .arg(text) .arg(contact->getName()); if (msg_text.isEmpty()) break; text += ":\n"; text += msg_text; } break; default: break; } if (!text.isEmpty()){ if (m_osd == NULL){ m_osd = new OSDWidget(this); connect(m_osd, SIGNAL(dblClick()), this, SLOT(dblClick())); connect(m_osd, SIGNAL(closeClick()), this, SLOT(closeClick())); } static_cast<OSDWidget*>(m_osd)->showOSD(text, data); m_timer->start(data->Timeout.toULong() * 1000); return; } } m_timer->stop(); m_request.contact = 0; m_request.type = OSD_NONE; }
JabberClient::PresenceRequest::~PresenceRequest() { unsigned status = STATUS_UNKNOWN; /* m_type - flags after draft-ietf-xmpp-core-16 / 8.4.1 */ if (m_type == "unavailable") { status = STATUS_OFFLINE; } else if (m_type == "subscribe") { m_client->auth_request(m_from.c_str(), MessageAuthRequest, m_status.c_str(), true); } else if (m_type == "subscribed") { m_client->auth_request(m_from.c_str(), MessageAuthGranted, m_status.c_str(), true); } else if (m_type == "unsubscribe") { m_client->auth_request(m_from.c_str(), MessageRemoved, m_status.c_str(), true); } else if (m_type == "unsubscribed") { m_client->auth_request(m_from.c_str(), MessageAuthRefused, m_status.c_str(), true); } else if (m_type == "probe") { // server want to to know if we're living m_client->ping(); } else if (m_type == "error") { log(L_DEBUG, "An error has occurred regarding processing or delivery of a previously-sent presence stanza"); } else if (m_type.length() == 0) { // m_show - flags after draft-ietf-xmpp-im-15 / 4.2 status = STATUS_ONLINE; if (m_show == "away") { status = STATUS_AWAY; } else if (m_show == "chat") { status = STATUS_FFC; } else if (m_show == "xa") { status = STATUS_NA; } else if (m_show == "dnd") { status = STATUS_DND; } else if (m_show == "online") { status = STATUS_ONLINE; } else if (m_show.empty()) { status = STATUS_ONLINE; if (m_status == "Online") { status = STATUS_ONLINE; } else if (m_status == "Disconnected") { status = STATUS_OFFLINE; } else if (m_status == "Connected") { status = STATUS_ONLINE; } else if (!m_status.empty()) { log(L_DEBUG, "Unsupported status %s", m_status.c_str()); } } else { log(L_DEBUG, "Unsupported available status %s", m_show.c_str()); } } else { log(L_DEBUG, "Unsupported presence type %s", m_type.c_str()); } if (status != STATUS_UNKNOWN) { Contact *contact; JabberUserData *data = m_client->findContact(m_from.c_str(), NULL, false, contact); if (data) { bool bOnLine = false; bool bChanged = set_str(&data->AutoReply, m_status.c_str()); if (data->Status != status) { time_t now; time(&now); bChanged = true; if ((status == STATUS_ONLINE) && ((now - m_client->data.owner.OnlineTime > 60) || (data->Status != STATUS_OFFLINE))) bOnLine = true; if (data->Status == STATUS_OFFLINE) data->OnlineTime = now; data->Status = status; data->StatusTime = now; } if (bChanged) { StatusMessage m; m.setContact(contact->id()); m.setClient(m_client->dataName(data).c_str()); m.setFlags(MESSAGE_RECEIVED); m.setStatus(status); Event e(EventMessageReceived, &m); e.process(); } if (bOnLine && !contact->getIgnore() && !m_client->isAgent(data->ID)) { Event e(EventContactOnline, contact); e.process(); } } } }
void *UserListBase::processEvent(Event *e) { if (e->type() == EventRepaintView) viewport()->repaint(); if (m_bInit){ switch (e->type()){ case EventGroupCreated:{ Group *g = (Group*)(e->param()); addGroupForUpdate(g->id()); break; } case EventGroupChanged:{ Group *g = (Group*)(e->param()); addGroupForUpdate(g->id()); break; } case EventGroupDeleted:{ Group *g = (Group*)(e->param()); for (list<unsigned long>::iterator it = updGroups.begin(); it != updGroups.end(); ++it){ if (*it == g->id()){ updGroups.erase(it); break; } } QListViewItem *item = findGroupItem(g->id()); deleteItem(item); break; } case EventContactCreated:{ Contact *c = (Contact*)(e->param()); if (!c->getIgnore() && (c->getTemporary() == 0)) addContactForUpdate(c->id()); break; } case EventContactStatus: case EventContactChanged:{ Contact *c = (Contact*)(e->param()); if (!c->getIgnore() && (c->getTemporary() == 0)){ addContactForUpdate(c->id()); }else{ Event e(EventContactDeleted, c); processEvent(&e); } break; } case EventMessageReceived:{ Message *msg = (Message*)(e->param()); if (msg->type() == MessageStatus){ Contact *contact = getContacts()->contact(msg->contact()); if (contact) addContactForUpdate(contact->id()); } break; } case EventContactDeleted:{ Contact *g = (Contact*)(e->param()); for (list<unsigned long>::iterator it = updContacts.begin(); it != updContacts.end(); ++it){ if (*it == g->id()){ updContacts.erase(it); break; } } ContactItem *item = findContactItem(g->id()); if (item){ if (m_groupMode){ GroupItem *grpItem = static_cast<GroupItem*>(item->parent()); grpItem->m_nContacts--; if (item->m_bOnline) grpItem->m_nContactsOnline--; addGroupForUpdate(grpItem->id()); deleteItem(item); if ((m_groupMode == 2) && (grpItem->firstChild() == NULL) && m_bShowOnline){ DivItem *div = static_cast<DivItem*>(grpItem->parent()); if (div->state() == DIV_OFFLINE){ deleteItem(grpItem); if (div->firstChild() == NULL) deleteItem(div); } } }else{ QListViewItem *p = item->parent(); deleteItem(item); if (p->firstChild() == NULL) deleteItem(p); } } break; } } } return ListView::processEvent(e); }
bool OSDPlugin::processEvent(Event *e) { OSDRequest osd; switch (e->type()){ case eEventContact: { EventContact *ec = static_cast<EventContact*>(e); Contact *contact = ec->contact(); if (contact->getIgnore()) break; switch(ec->action()) { case EventContact::eOnline: { osd.contact = contact->id(); osd.type = OSD_ALERTONLINE; queue.push_back(osd); processQueue(); break; } case EventContact::eStatus: { OSDUserData *data = (OSDUserData*)(contact->getUserData(user_data_id)); if (data){ unsigned style = 0; QString wrkIcons; QString statusIcon; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.isEmpty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (bTyping){ list<unsigned>::iterator it; for (it = typing.begin(); it != typing.end(); ++it) if ((*it) == contact->id()) break; if (it == typing.end()){ typing.push_back(contact->id()); osd.contact = contact->id(); osd.type = OSD_TYPING; queue.push_back(osd); processQueue(); } }else{ list<unsigned>::iterator it; for (it = typing.begin(); it != typing.end(); ++it) if ((*it) == contact->id()) break; if (it != typing.end()) typing.erase(it); if ((m_request.type == OSD_TYPING) && (m_request.contact == contact->id())){ m_timer->stop(); m_timer->start(100); } } } break; } default: break; } break; } case eEventMessageReceived: { EventMessage *em = static_cast<EventMessage*>(e); Message *msg = em->msg(); Contact *contact = getContacts()->contact(msg->contact()); if (contact == NULL) break; OSDUserData *data = (OSDUserData*)(contact->getUserData(user_data_id)); if (data == NULL) break; osd.contact = msg->contact(); if (! core->unread.empty()) bHaveUnreadMessages=true; if (msg->type() == MessageStatus) { StatusMessage *smsg = (StatusMessage*)msg; switch (smsg->getStatus()) { case STATUS_AWAY: osd.type = OSD_ALERTAWAY; break; case STATUS_NA: osd.type = OSD_ALERTNA; break; case STATUS_DND: osd.type = OSD_ALERTDND; break; case STATUS_OCCUPIED: /* STATUS_OCCUPIED, took over from contacts.h! */ osd.type = OSD_ALERTOCCUPIED; break; case STATUS_FFC: osd.type = OSD_ALERTFFC; break; case STATUS_OFFLINE: osd.type = OSD_ALERTOFFLINE; break; case STATUS_ONLINE: osd.type = OSD_NONE; return false; default: log(L_DEBUG,"OSD: Unknown status %ld",smsg->getStatus()); osd.type = OSD_NONE; return false; } queue.push_back(osd); processQueue(); }else{ osd.type = OSD_MESSAGE; if ((m_request.type == OSD_MESSAGE) && (m_request.contact == msg->contact())){ queue.push_front(osd); m_timer->stop(); m_timer->start(100); }else{ queue.push_back(osd); processQueue(); } } break; } case eEventMessageDeleted: case eEventMessageRead: { EventMessage *em = static_cast<EventMessage*>(e); Message *msg = em->msg(); Contact *contact = getContacts()->contact(msg->contact()); if (contact == NULL) break; OSDUserData *data = (OSDUserData*)(contact->getUserData(user_data_id)); if (data == NULL) break; osd.contact = msg->contact(); if (core->unread.empty()) bHaveUnreadMessages=false; if (msg->type() == MessageStatus) { StatusMessage *smsg = (StatusMessage*)msg; switch (smsg->getStatus()) { case STATUS_AWAY: osd.type = OSD_ALERTAWAY; break; case STATUS_NA: osd.type = OSD_ALERTNA; break; case STATUS_DND: osd.type = OSD_ALERTDND; break; case STATUS_OCCUPIED: /* STATUS_OCCUPIED, took over from contacts.h! */ osd.type = OSD_ALERTOCCUPIED; break; case STATUS_FFC: osd.type = OSD_ALERTFFC; break; case STATUS_OFFLINE: osd.type = OSD_ALERTOFFLINE; break; case STATUS_ONLINE: osd.type = OSD_NONE; return false; default: log(L_DEBUG,"OSD: Unknown status %ld",smsg->getStatus()); osd.type = OSD_NONE; return false; } queue.push_back(osd); processQueue(); }else{ osd.type = OSD_MESSAGE; if ((m_request.type == OSD_MESSAGE) && (m_request.contact == msg->contact())){ queue.push_front(osd); m_timer->stop(); m_timer->start(100); }else{ queue.push_back(osd); processQueue(); } } break; } default: break; } return false; }
void OSDPlugin::processQueue() { if (bTimerActive /*m_timer->isActive()*/) //Due to a f*****g bug in QTimer::isActive() return; while (m_queue.size()){ m_request = m_queue.takeFirst(); Contact *contact = getContacts()->contact(m_request.contact); if ((contact == NULL) || contact->getIgnore()) continue; QString text; SIM::PropertyHubPtr data = contact->getUserData("OSD"); uint ms = STATUS_ONLINE; switch (m_request.type){ case OSD_ALERTONLINE: if (data->value("EnableAlert").toBool() && data->value("EnableAlertOnline").toBool()){ unsigned style = 0; QString statusIcon; if (contact->contactInfo(style, statusIcon) == STATUS_ONLINE) text = g_i18n("%1 is online", contact) .arg(contact->getName()); } break; case OSD_ALERTAWAY: if (data->value("EnableAlert").toBool() && data->value("EnableAlertAway").toBool()){ text = g_i18n("%1 is away", contact) .arg(contact->getName()); } break; case OSD_ALERTNA: if (data->value("EnableAlert").toBool() && data->value("EnableAlertNA").toBool()){ text = g_i18n("%1 is not available", contact) .arg(contact->getName()); } break; case OSD_ALERTDND: if (data->value("EnableAlert").toBool() && data->value("EnableAlertDND").toBool()){ text = g_i18n("%1 doesn't want to be disturbed", contact) .arg(contact->getName()); } break; case OSD_ALERTOCCUPIED: if (data->value("EnableAlert").toBool() && data->value("EnableAlertOccupied").toBool()){ text = g_i18n("%1 is occupied", contact) .arg(contact->getName()); } break; case OSD_ALERTFFC: if (data->value("EnableAlert").toBool() && data->value("EnableAlertFFC").toBool()){ text = g_i18n("%1 is free for chat", contact) .arg(contact->getName()); } break; case OSD_ALERTOFFLINE: if (data->value("EnableAlert").toBool() && data->value("EnableAlertOffline").toBool() && (ms-1) ){ text = g_i18n("%1 is offline", contact) .arg(contact->getName()); } break; case OSD_TYPING: if (data->value("EnableTyping").toBool()){ unsigned style = 0; QSet<QString> wrkIcons; QString statusIcon; contact->contactInfo(style, statusIcon, &wrkIcons); if (wrkIcons.contains("typing")) text = g_i18n("%1 is typing", contact) .arg(contact->getName()); } break; case OSD_MESSAGE: /* if (data->EnableMessage.toBool() && core ){ * list<msg_id>::iterator it; * TYPE_MAP types; * TYPE_MAP::iterator itc; * QString msg_text; * for (it = core->unread.begin(); it != core->unread.end(); ++it){ * if (it->contact != m_request.contact) * continue; * unsigned type = it->type; * itc = types.find(type); * if (itc == types.end()){ * types.insert(TYPE_MAP::value_type(type, 1)); * }else{ * (*itc).second++; * } * if (!data->EnableMessageShowContent.toBool()) * continue; * EventLoadMessage e(it->id, it->client, it->contact); * e.process(); * Message *msg = e.message(); * if (msg == NULL) * continue; * QString msgText = msg->getPlainText().trimmed(); * if (msgText.isEmpty()) * continue; * if (!msg_text.isEmpty()) * msg_text += "\n"; * msg_text += msgText; * } * if (types.empty()) * break; * for (itc = types.begin(); itc != types.end(); ++itc){ * CommandDef *def = core->messageTypes.find((*itc).first); * if (def == NULL) * continue; * MessageDef *mdef = (MessageDef*)(def->param); * QString msg = i18n(mdef->singular, mdef->plural, (*itc).second); * if ((*itc).second == 1){ * int pos = msg.indexOf("1 "); * if (pos > 0){ * msg = msg.left(pos); * }else if (pos == 0){ * msg = msg.mid(2); * } * msg = msg.left(1).toUpper() + msg.mid(1); * } * if (!text.isEmpty()) * text += ", "; * text += msg; * } * * * if ( core->getManualStatus()==STATUS_NA && * data->EnableCapsLockFlash.toBool() && * ! this->isRunning() * ) * this->start(); //Start flashing the CapsLock if enabled * text = i18n("%1 from %2") .arg(text) .arg(contact->getName()); * if (msg_text.isEmpty()) * break; * text += ":\n"; * text += msg_text; * } */ break; default: break; } if (!text.isEmpty()){ if (m_osd == NULL){ m_osd = new OSDWidget(this); connect(m_osd, SIGNAL(dblClick()), this, SLOT(dblClick())); connect(m_osd, SIGNAL(closeClick()), this, SLOT(closeClick())); } static_cast<OSDWidget*>(m_osd)->showOSD(text, data); m_timer->start(data->value("Timeout").toUInt() * 1000); bTimerActive=true; //Due to a f*****g bug in QTimer::isActive() return; } } m_timer->stop(); bTimerActive=false; //Due to a f*****g bug in QTimer::isActive() m_request.contact = 0; m_request.type = OSD_NONE; }
bool OSDPlugin::processEvent(Event *e) { OSDRequest osd; switch (e->type()){ case eEventContact: { EventContact *ec = static_cast<EventContact*>(e); Contact *contact = ec->contact(); if (contact->getIgnore()) break; switch(ec->action()) { case EventContact::eOnline: { osd.contact = contact->id(); osd.type = OSD_ALERTONLINE; m_queue.push_back(osd); processQueue(); break; } case EventContact::eStatus: { SIM::PropertyHubPtr data = contact->getUserData("OSD"); if(!data.isNull()) { unsigned style = 0; QSet<QString> wrkIcons; QString statusIcon; contact->contactInfo(style, statusIcon, &wrkIcons); if (wrkIcons.contains("typing")){ if (!m_typing.contains(contact->id())) { m_typing += contact->id(); osd.contact = contact->id(); osd.type = OSD_TYPING; m_queue.push_back(osd); processQueue(); } }else{ m_typing.remove(contact->id()); if ((m_request.type == OSD_TYPING) && (m_request.contact == contact->id())){ m_timer->stop(); bTimerActive=false; m_timer->start(100); bTimerActive=true; } } } break; } default: break; } break; } case eEventMessageReceived: { EventMessage *em = static_cast<EventMessage*>(e); Message *msg = em->msg(); Contact *contact = getContacts()->contact(msg->contact()); if (contact == NULL) break; SIM::PropertyHubPtr data = contact->getUserData("OSD"); if(data.isNull()) break; osd.contact = msg->contact(); CorePlugin* core = GET_CorePlugin(); if (!core->unread.empty()) bHaveUnreadMessages=true; if (msg->type() == MessageStatus) { StatusMessage *smsg = (StatusMessage*)msg; switch (smsg->getStatus()) { case STATUS_AWAY: osd.type = OSD_ALERTAWAY; break; case STATUS_NA: osd.type = OSD_ALERTNA; break; case STATUS_DND: osd.type = OSD_ALERTDND; break; case STATUS_OCCUPIED: /* STATUS_OCCUPIED, took over from contacts.h! */ osd.type = OSD_ALERTOCCUPIED; break; case STATUS_FFC: osd.type = OSD_ALERTFFC; break; case STATUS_OFFLINE: osd.type = OSD_ALERTOFFLINE; break; case STATUS_ONLINE: osd.type = OSD_NONE; return false; default: log(L_DEBUG,"OSD: Unknown status %ld",smsg->getStatus()); osd.type = OSD_NONE; return false; } m_queue.push_back(osd); processQueue(); }else{ osd.type = OSD_MESSAGE; if ((m_request.type == OSD_MESSAGE) && (m_request.contact == msg->contact())){ m_queue.push_front(osd); m_timer->stop(); bTimerActive=false; m_timer->start(100);bTimerActive=true; }else{ m_queue.push_back(osd); processQueue(); } } break; } case eEventMessageDeleted: case eEventMessageRead: { EventMessage *em = static_cast<EventMessage*>(e); Message *msg = em->msg(); Contact *contact = getContacts()->contact(msg->contact()); if (contact == NULL) break; SIM::PropertyHubPtr data = contact->getUserData("OSD"); if (data.isNull()) break; osd.contact = msg->contact(); CorePlugin* core = GET_CorePlugin(); if (core->unread.empty()) bHaveUnreadMessages=false; if (msg->type() == MessageStatus) { StatusMessage *smsg = (StatusMessage*)msg; switch (smsg->getStatus()) { case STATUS_AWAY: osd.type = OSD_ALERTAWAY; break; case STATUS_NA: osd.type = OSD_ALERTNA; break; case STATUS_DND: osd.type = OSD_ALERTDND; break; case STATUS_OCCUPIED: /* STATUS_OCCUPIED, took over from contacts.h! */ osd.type = OSD_ALERTOCCUPIED; break; case STATUS_FFC: osd.type = OSD_ALERTFFC; break; case STATUS_OFFLINE: osd.type = OSD_ALERTOFFLINE; break; case STATUS_ONLINE: osd.type = OSD_NONE; return false; default: log(L_DEBUG,"OSD: Unknown status %ld",smsg->getStatus()); osd.type = OSD_NONE; return false; } m_queue.push_back(osd); processQueue(); }else{ osd.type = OSD_MESSAGE; if ((m_request.type == OSD_MESSAGE) && (m_request.contact == msg->contact())){ m_queue.push_front(osd); m_timer->stop(); bTimerActive=false; m_timer->start(100);bTimerActive=true; }else{ m_queue.push_back(osd); processQueue(); } } break; } default: break; } return false; }
bool FilterPlugin::processEvent(Event *e) { switch (e->type()) { case eEventContact: { EventContact *ec = static_cast<EventContact*>(e); if(ec->action() != EventContact::eChanged) break; Contact *contact = ec->contact(); if (contact->getGroup()){ Command cmd; cmd->id = CmdIgnore; cmd->flags = BTN_HIDE; cmd->param = (void*)(contact->id()); EventCommandShow(cmd).process(); } break; } case eEventPluginLoadConfig: { setPropertyHub( ProfileManager::instance()->getPropertyHub("filter") ); break; } case eEventMessageReceived: { EventMessage *em = static_cast<EventMessage*>(e); Message *msg = em->msg(); if (!msg || (msg->type() == MessageStatus)) return false; Contact *contact = getContacts()->contact(msg->contact()); PropertyHubPtr data = contact->getUserData("filter"); // check if we accept only from users on the list if (((contact == NULL) || contact->getFlags() & CONTACT_TEMPORARY) && ((value("FromList").toBool() && msg->type() != MessageAuthRequest && msg->type() != MessageAuthGranted && msg->type() != MessageAuthRefused) || (value("AuthFromList").toBool() && msg->type() <= MessageContacts))) { delete msg; delete contact; return msg; } if (!contact) return false; // check if the user is a ignored user if (contact->getIgnore()){ delete msg; return true; } // get filter-data if (data && !data->value("SpamList").toString().isEmpty() && (!contact || (contact->getFlags() & CONTACT_TEMPORARY) )) { if (checkSpam(msg->getPlainText(), data->value("SpamList").toString())){ delete msg; return true; } } break; } case eEventCheckCommandState: { EventCheckCommandState *ecs = static_cast<EventCheckCommandState*>(e); CommandDef *cmd = ecs->cmd(); if (cmd->id == CmdIgnore){ cmd->flags &= ~BTN_HIDE; Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); if (contact && contact->getGroup()) cmd->flags |= BTN_HIDE; return true; } if (cmd->id == CmdIgnoreText){ cmd->flags &= ~COMMAND_CHECKED; if (cmd->menu_id == MenuMsgView){ MsgViewBase *edit = (MsgViewBase*)(cmd->param); if (edit->textCursor().hasSelection()) return true; } else /*if (cmd->menu_id == MenuTextEdit){ TextEdit *edit = ((MsgEdit*)(cmd->param))->m_edit; if (edit->textCursor().hasSelection()) return true; }*/ //Fixme Block (crashing on rightclick in msgedit from container) return false; } if (cmd->menu_id == MenuContactGroup){ if (cmd->id == CmdIgnoreList){ Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); if (contact == NULL) return false; cmd->flags &= COMMAND_CHECKED; if (contact->getIgnore()) cmd->flags |= COMMAND_CHECKED; return true; } } break; } case eEventCommandExec: { EventCommandExec *ece = static_cast<EventCommandExec*>(e); CommandDef *cmd = ece->cmd(); if (cmd->id == CmdIgnore){ Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); if (contact){ QString text = i18n("Add %1 to ignore list?") .arg(contact->getName()); Command cmd; cmd->id = CmdIgnore; cmd->param = (void*)(contact->id()); EventCommandWidget eWidget(cmd); eWidget.process(); QWidget *w = eWidget.widget(); BalloonMsg::ask((void*)(contact->id()), text, w, SLOT(addToIgnore(void*)), NULL, NULL, this); } return true; } if (cmd->id == CmdIgnoreText){ QString text; unsigned id = 0; if (cmd->menu_id == MenuMsgView){ MsgViewBase *view = (MsgViewBase*)(cmd->param); if (view->textCursor().hasSelection()){ text = view->textCursor().selectedText(); text = unquoteText(text); id = view->m_id; } }else if (cmd->menu_id == MenuTextEdit){ MsgEdit *medit = (MsgEdit*)(cmd->param); TextEdit *edit = medit->m_edit; if (edit->textCursor().hasSelection()){ text = edit->textCursor().selectedText(); text = unquoteText(text); id = medit->m_userWnd->id(); } } Contact *contact = getContacts()->contact(id); PropertyHubPtr data = contact->getUserData("filter"); QString s = data->value("SpamList").toString(); while (!text.isEmpty()){ QString line = getToken(text, '\n'); line = line.remove('\r'); if (line.isEmpty()) continue; bool bSpace = false; for (int i = 0; i < (int)(line.length()); i++) if (line[i] == ' '){ bSpace = true; break; } if (bSpace) line = '\"' + line + '\"'; if (!s.isEmpty()) s += ' '; s += line; } data->setValue("SpamList", s); return false; } if (cmd->menu_id == MenuContactGroup) { if (cmd->id == CmdIgnoreList) { Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); if (!contact) return false; contact->setIgnore((cmd->flags & COMMAND_CHECKED) == 0); EventContact(contact, EventContact::eChanged).process(); return true; } } break; } default: break; }
void UserListBase::fill() { m_pressedItem = NULL; clear(); GroupItem *grpItem; ContactItem *contactItem; UserViewItemBase *divItem; UserViewItemBase *divItemOnline = NULL; UserViewItemBase *divItemOffline = NULL; ContactList *list = getContacts(); ContactList::GroupIterator grp_it; ContactList::ContactIterator contact_it; Group *grp; Contact *contact; switch (m_groupMode){ case 0: divItemOnline = NULL; divItemOffline = NULL; while ((contact = ++contact_it) != NULL){ if (contact->getIgnore() || contact->getTemporary()) continue; unsigned style; string icons; unsigned status = getUserStatus(contact, style, icons); unsigned unread = getUnread(contact->id()); bool bShow = false; ListUserData *data = (ListUserData*)contact->getUserData(CorePlugin::m_plugin->list_data_id); if (data && data->ShowAllways) bShow = true; if ((unread == 0) && !bShow && (status == STATUS_OFFLINE) && m_bShowOnline) continue; divItem = (status == STATUS_OFFLINE) ? divItemOffline : divItemOnline; if (divItem == NULL){ if (status == STATUS_OFFLINE){ divItemOffline = new DivItem(this, DIV_OFFLINE); setOpen(divItemOffline, true); divItem = divItemOffline; }else{ divItemOnline = new DivItem(this, DIV_ONLINE); setOpen(divItemOnline, true); divItem = divItemOnline; } } new ContactItem(divItem, contact, status, style, icons.c_str(), unread); } break; case 1: while ((grp = ++grp_it) != NULL){ if (grp->id() == 0) continue; grpItem = new GroupItem(this, grp, true); } grp = list->group(0); if (grp){ grpItem = new GroupItem(this, grp, true); } while ((contact = ++contact_it) != NULL){ if (contact->getIgnore() || contact->getTemporary()) continue; unsigned style; string icons; unsigned status = getUserStatus(contact, style, icons); unsigned unread = getUnread(contact->id()); bool bShow = false; ListUserData *data = (ListUserData*)contact->getUserData(CorePlugin::m_plugin->list_data_id); if (data && data->ShowAllways) bShow = true; if ((status == STATUS_OFFLINE) && !bShow && (unread == 0) && m_bShowOnline) continue; grpItem = findGroupItem(contact->getGroup()); if (grpItem == NULL) continue; contactItem = new ContactItem(grpItem, contact, status, style, icons.c_str(), unread); grpItem->m_nContacts++; if ((status != STATUS_OFFLINE) && !m_bShowOnline){ grpItem->m_nContactsOnline++; contactItem->m_bOnline = true; } } break; case 2: divItemOnline = new DivItem(this, DIV_ONLINE); setOpen(divItemOnline, true); while ((grp = ++grp_it) != NULL){ if (grp->id() == 0) continue; grpItem = new GroupItem(divItemOnline, grp, false); } grp = list->group(0); if (grp){ grpItem = new GroupItem(divItemOnline, grp, false); } if (!m_bShowOnline){ divItemOffline = new DivItem(this, DIV_OFFLINE); setOpen(divItemOffline, true); grp_it.reset(); while ((grp = ++grp_it) != NULL){ if (grp->id() == 0) continue; grpItem = new GroupItem(divItemOffline, grp, true); } grp = list->group(0); if (grp){ grpItem = new GroupItem(divItemOffline, grp, true); } } while ((contact = ++contact_it) != NULL){ if (contact->getIgnore() || contact->getTemporary()) continue; unsigned style; string icons; unsigned status = getUserStatus(contact, style, icons); unsigned unread = getUnread(contact->id()); bool bShow = false; ListUserData *data = (ListUserData*)contact->getUserData(CorePlugin::m_plugin->list_data_id); if (data && data->ShowAllways) bShow = true; if ((unread == 0) && !bShow && (status == STATUS_OFFLINE) && m_bShowOnline) continue; if (status == STATUS_OFFLINE){ if (divItemOffline == NULL){ divItemOffline = new DivItem(this, DIV_OFFLINE); setOpen(divItemOffline, true); } divItem = divItemOffline; }else{ divItem = divItemOnline; } grpItem = findGroupItem(contact->getGroup(), divItem); if (grpItem == NULL){ Group *grp = getContacts()->group(contact->getGroup()); if (grp == NULL) continue; grpItem = new GroupItem(divItem, grp, true); } new ContactItem(grpItem, contact, status, style, icons.c_str(), unread); grpItem->m_nContacts++; } break; } adjustColumn(); }
void *OSDPlugin::processEvent(Event *e) { OSDRequest osd; Contact *contact; Message *msg; OSDUserData *data; switch (e->type()){ case EventContactOnline: contact = (Contact*)(e->param()); if (contact->getIgnore()) break; osd.contact = contact->id(); osd.type = OSD_ALERTONLINE; queue.push_back(osd); processQueue(); break; case EventMessageDeleted: case EventMessageRead: case EventMessageReceived: msg = (Message*)(e->param()); contact = getContacts()->contact(msg->contact()); if (contact == NULL) break; data = (OSDUserData*)(contact->getUserData(user_data_id)); if (data == NULL) break; osd.contact = msg->contact(); if (msg->type() == MessageStatus) { StatusMessage *smsg = (StatusMessage*)msg; switch (smsg->getStatus()) { case STATUS_AWAY: osd.type = OSD_ALERTAWAY; break; case STATUS_NA: osd.type = OSD_ALERTNA; break; case STATUS_DND: osd.type = OSD_ALERTDND; break; case 100: /* STATUS_OCCUPIED, but defined in icqclient.h ! */ osd.type = OSD_ALERTOCCUPIED; break; case STATUS_FFC: osd.type = OSD_ALERTFFC; break; case STATUS_OFFLINE: osd.type = OSD_ALERTOFFLINE; break; case STATUS_ONLINE: osd.type = OSD_NONE; return NULL; default: log(L_DEBUG,"OSD: Unknown status %ld",smsg->getStatus()); osd.type = OSD_NONE; return NULL; } queue.push_back(osd); processQueue(); }else{ osd.type = OSD_MESSAGE; if ((m_request.type == OSD_MESSAGE) && (m_request.contact == msg->contact())){ queue.push_front(osd); m_timer->stop(); m_timer->start(100); }else{ queue.push_back(osd); processQueue(); } } break; case EventContactStatus: contact = (Contact*)(e->param()); if (contact->getIgnore()) break; data = (OSDUserData*)(contact->getUserData(user_data_id)); if (data){ unsigned style = 0; string wrkIcons; const char *statusIcon = NULL; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.empty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (bTyping){ list<unsigned>::iterator it; for (it = typing.begin(); it != typing.end(); ++it) if ((*it) == contact->id()) break; if (it == typing.end()){ typing.push_back(contact->id()); osd.contact = contact->id(); osd.type = OSD_TYPING; queue.push_back(osd); processQueue(); } }else{ list<unsigned>::iterator it; for (it = typing.begin(); it != typing.end(); ++it) if ((*it) == contact->id()) break; if (it != typing.end()) typing.erase(it); if ((m_request.type == OSD_TYPING) && (m_request.contact == contact->id())){ m_timer->stop(); m_timer->start(100); } } } break; } return NULL; }
void *OSDPlugin::processEvent(Event *e) { OSDRequest osd; Contact *contact; Message *msg; OSDUserData *data; switch (e->type()){ case EventContactOnline: contact = (Contact*)(e->param()); if (contact->getIgnore()) break; osd.contact = contact->id(); osd.type = OSD_ALERT; queue.push_back(osd); processQueue(); break; case EventMessageReceived: msg = (Message*)(e->param()); if (msg->type() == MessageStatus) break; osd.contact = msg->contact(); osd.type = msg->baseType(); osd.msg_id = msg->id(); osd.client = msg->client(); queue.push_back(osd); processQueue(); break; case EventContactStatus: contact = (Contact*)(e->param()); if (contact->getIgnore()) break; data = (OSDUserData*)(contact->getUserData(user_data_id)); if (data){ unsigned style = 0; string wrkIcons; const char *statusIcon = NULL; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.empty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (bTyping){ list<unsigned>::iterator it; for (it = typing.begin(); it != typing.end(); ++it) if ((*it) == contact->id()) break; if (it == typing.end()){ typing.push_back(contact->id()); osd.contact = contact->id(); osd.type = OSD_TYPING; queue.push_back(osd); processQueue(); } }else{ list<unsigned>::iterator it; for (it = typing.begin(); it != typing.end(); ++it) if ((*it) == contact->id()) break; if (it != typing.end()) typing.erase(it); } } break; } return NULL; }
bool Container::processEvent(Event *e) { if (m_tabBar == NULL) return false; switch (e->type()){ case eEventMessageReceived: { EventMessage *em = static_cast<EventMessage*>(e); Message *msg = em->msg(); if (msg->type() == MessageStatus){ Contact *contact = getContacts()->contact(msg->contact()); if (contact) contactChanged(contact); return false; } if (msg->getFlags() & MESSAGE_NOVIEW) return false; if (CorePlugin::m_plugin->getContainerMode()){ if (isActiveWindow() && !isMinimized()){ UserWnd *userWnd = m_tabBar->currentWnd(); if (userWnd && (userWnd->id() == msg->contact())) userWnd->markAsRead(); }else{ UserWnd *userWnd = wnd(msg->contact()); if (userWnd) QTimer::singleShot(0, this, SLOT(flash())); } } // no break here - otherwise we have to duplicate the code below... } case eEventMessageRead: { EventMessage *em = static_cast<EventMessage*>(e); Message *msg = em->msg(); UserWnd *userWnd = wnd(msg->contact()); if (userWnd){ bool bBold = false; for (list<msg_id>::iterator it = CorePlugin::m_plugin->unread.begin(); it != CorePlugin::m_plugin->unread.end(); ++it){ if ((*it).contact != msg->contact()) continue; bBold = true; break; } m_tabBar->setBold(msg->contact(), bBold); } break; } case eEventActiveContact: { EventActiveContact *eac = static_cast<EventActiveContact*>(e); if (!isActiveWindow()) return false; UserWnd *userWnd = m_tabBar->currentWnd(); if (userWnd) { eac->setContactID(userWnd->id()); return true; } break; } case eEventContact: { EventContact *ec = static_cast<EventContact*>(e); Contact *contact = ec->contact(); UserWnd *userWnd = wnd(contact->id()); if(!userWnd) break; switch(ec->action()) { case EventContact::eDeleted: { removeUserWnd(userWnd); break; } case EventContact::eChanged: { if (contact->getIgnore()){ removeUserWnd(userWnd); break; } m_tabBar->changeTab(contact->id()); contactChanged(contact); break; } case EventContact::eStatus: { unsigned style = 0; QString wrkIcons; QString statusIcon; contact->contactInfo(style, statusIcon, &wrkIcons); bool bTyping = false; while (!wrkIcons.isEmpty()){ if (getToken(wrkIcons, ',') == "typing"){ bTyping = true; break; } } if (userWnd->m_bTyping != bTyping){ userWnd->m_bTyping = bTyping; if (bTyping){ userWnd->setStatus(g_i18n("%1 is typing", contact) .arg(contact->getName())); }else{ userWnd->setStatus(""); } userWnd = m_tabBar->currentWnd(); if (userWnd && (contact->id() == userWnd->id())) m_status->message(userWnd->status()); } } default: break; } break; } case eEventClientsChanged: setupAccel(); break; case eEventContactClient: { EventContactClient *ecc = static_cast<EventContactClient*>(e); contactChanged(ecc->contact()); break; } case eEventInit: init(); break; case eEventCommandExec: { EventCommandExec *ece = static_cast<EventCommandExec*>(e); CommandDef *cmd = ece->cmd(); UserWnd *userWnd = m_tabBar->currentWnd(); if (userWnd && ((unsigned long)(cmd->param) == userWnd->id())){ if (cmd->menu_id == MenuContainerContact){ m_tabBar->raiseTab(cmd->id); return true; } if (cmd->id == CmdClose){ delete userWnd; return true; } if (cmd->id == CmdInfo && cmd->menu_id != MenuContact){ CommandDef c = *cmd; c.menu_id = MenuContact; c.param = (void*)userWnd->id(); EventCommandExec(&c).process(); return true; } } break; } case eEventCheckCommandState: { EventCheckCommandState *ecs = static_cast<EventCheckCommandState*>(e); CommandDef *cmd = ecs->cmd(); UserWnd *userWnd = m_tabBar->currentWnd(); if (userWnd && ((unsigned long)(cmd->param) == userWnd->id()) && (cmd->menu_id == MenuContainerContact) && (cmd->id == CmdContainerContacts)){ list<UserWnd*> userWnds = m_tabBar->windows(); CommandDef *cmds = new CommandDef[userWnds.size() + 1]; unsigned n = 0; for (list<UserWnd*>::iterator it = userWnds.begin(); it != userWnds.end(); ++it){ cmds[n].id = (*it)->id(); cmds[n].flags = COMMAND_DEFAULT; cmds[n].text_wrk = (*it)->getName(); cmds[n].icon = (*it)->getIcon(); cmds[n].text = "_"; cmds[n].menu_id = n + 1; if (n < sizeof(accels) / sizeof(const char*)) cmds[n].accel = accels[n]; if (*it == m_tabBar->currentWnd()) cmds[n].flags |= COMMAND_CHECKED; n++; } cmd->param = cmds; cmd->flags |= COMMAND_RECURSIVE; return true; } break; } default: break; } return false; }