StatusFrame::StatusFrame(QWidget *parent) : QFrame(parent), EventReceiver(LowPriority + 1) { setFrameStyle(NoFrame); setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); m_frame = new QFrame(this); m_frame->show(); m_lay = new QHBoxLayout(m_frame); m_lay->setMargin(1); m_lay->setSpacing(2); m_lay->addStretch(); addClients(); }
void TCPServer::handleAccept( PSocketContext pSocketContext, PIOContext pIOContext) { setsockopt(pIOContext->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)&pSocketContext->fd, sizeof(SOCKET)); sockaddr_in* clientAddr = nullptr; sockaddr_in* localAddr = nullptr; int clientLen = sizeof(sockaddr_in); int localLen = clientLen; _fnGetAcceptExSockAddrs( pIOContext->overlappedBuffer.buf, 0, sizeof(sockaddr_in) + 16, sizeof(sockaddr_in) + 16, (sockaddr**)&localAddr, &localLen, (sockaddr**)&clientAddr, &clientLen); auto clientPort = ntohs(clientAddr->sin_port); auto wClientIP = AnsiToUnicode(inet_ntoa(clientAddr->sin_addr)); LOG("创建新会话[%s-%d]", wClientIP.c_str(), clientPort); PSocketContext pClientSocketContext = new SocketContext(); pClientSocketContext->fd = pIOContext->fd; pClientSocketContext->clientIP = wClientIP; pClientSocketContext->clientPort = clientPort; if(!bind2IOCP(pClientSocketContext)){ delete pClientSocketContext; pClientSocketContext = nullptr; return; } // 立即投递接受数据请求 auto client = new TCPServerSession(this, pClientSocketContext); client->postRecv(nullptr); addClients(client); // 立即投递下一个accept请求 pIOContext->resetBuffer(); postAccept(pIOContext); }
void *StatusFrame::processEvent(Event *e) { CommandDef *cmd; switch (e->type()){ case EventCheckState: cmd = (CommandDef*)(e->param()); if ((cmd->menu_id == MenuStatusWnd) && (cmd->id == CmdStatusWnd)){ unsigned n = 0; { QObjectList *l = queryList("StatusLabel"); QObjectListIt itObject(*l); QObject *obj; while ((obj=itObject.current()) != NULL) { ++itObject; StatusLabel *lbl = static_cast<StatusLabel*>(obj); if (lbl->x() + lbl->width() > width()) n++; } delete l; } CommandDef *cmds = new CommandDef[n + 1]; memset(cmds, 0, sizeof(CommandDef) * (n + 1)); QObjectList *l = queryList("StatusLabel"); QObjectListIt itObject(*l); QObject *obj; n = 0; while ((obj=itObject.current()) != NULL) { ++itObject; StatusLabel *lbl = static_cast<StatusLabel*>(obj); if (lbl->x() + lbl->width() > width()){ cmds[n].id = 1; cmds[n].text = "_"; cmds[n].text_wrk = strdup(CorePlugin::m_plugin->clientName(lbl->m_client).utf8()); cmds[n].popup_id = lbl->m_id; if (lbl->m_client->getState() == Client::Error){ cmds[n].icon = "error"; }else{ Protocol *protocol = lbl->m_client->protocol(); const CommandDef *cmd = protocol->description(); cmds[n].icon = cmd->icon; for (cmd = protocol->statusList(); cmd->text; cmd++){ if (cmd->id == lbl->m_client->getStatus()){ cmds[n].icon = cmd->icon; break; } } } n++; } } delete l; cmd->param = cmds; cmd->flags |= COMMAND_RECURSIVE; return e->param(); } break; case EventClientsChanged: addClients(); break; case EventClientChanged:{ StatusLabel *lbl = findLabel((Client*)(e->param())); if (lbl) lbl->setPict(); break; } case EventClientError: if (isVisible()){ clientErrorData *data = (clientErrorData*)(e->param()); if (data->code == AuthError) break; StatusLabel *lbl = findLabel(data->client); if (lbl == NULL) break; if (data->err_str && *data->err_str){ QString msg = i18n(data->err_str); if (data->args) msg = msg.arg(QString::fromUtf8(data->args)); raiseWindow(topLevelWidget()); BalloonMsg::message(msg, lbl); return e->param(); } } break; case EventIconChanged:{ QObjectList *l = queryList("StatusLabel"); QObjectListIt itObject(*l); QObject *obj; while ((obj=itObject.current()) != NULL) { ++itObject; static_cast<StatusLabel*>(obj)->setPict(); } delete l; break; } } return NULL; }