void *ProxyPlugin::processEvent(Event *e) { if (e->type() == EventSocketConnect){ ConnectParam *p = (ConnectParam*)(e->param()); list<Proxy*>::iterator it; for (it = proxies.begin(); it != proxies.end(); ++it){ if ((*it)->notify == p->socket) return NULL; } ProxyData data; clientData(p->client, data); Proxy *proxy = NULL; switch (data.Type.value){ case PROXY_SOCKS4: proxy = new SOCKS4_Proxy(this, &data, p->client); break; case PROXY_SOCKS5: proxy = new SOCKS5_Proxy(this, &data, p->client); break; case PROXY_HTTPS: if (p->client == (TCPClient*)(-1)){ proxy = new HTTP_Proxy(this, &data, p->client); }else{ proxy = new HTTPS_Proxy(this, &data, p->client); } break; } if (proxy){ proxy->setSocket(p->socket); return e->param(); } } if (e->type() == EventSocketListen){ ListenParam *p = (ListenParam*)(e->param()); ProxyData data; clientData(p->client, data); Listener *listener = NULL; switch (data.Type.value){ case PROXY_SOCKS4: listener = new SOCKS4_Listener(this, &data, p->notify, p->client->ip()); break; case PROXY_SOCKS5: listener = new SOCKS5_Listener(this, &data, p->notify, p->client->ip()); break; } if (listener) return e->param(); } if (e->type() == EventRaiseWindow){ QWidget *w = (QWidget*)(e->param()); if (!w->inherits("NewProtocol")) return NULL; NewProtocol *p = static_cast<NewProtocol*>(w); if (p->m_client->protocol()->description()->flags & PROTOCOL_NOPROXY) return NULL; ProxyConfig *cfg = static_cast<ProxyConfig*>(findObject(w, "ProxyConfig")); if (cfg) return NULL; QTabWidget *tab = static_cast<QTabWidget*>(findObject(w, "QTabWidget")); if (tab){ cfg = new ProxyConfig(tab, this, tab, p->m_client); QObject::connect(tab->topLevelWidget(), SIGNAL(apply()), cfg, SLOT(apply())); } } if (e->type() == EventClientError){ clientErrorData *data = (clientErrorData*)(e->param()); if (data->code == ProxyErr){ QString msg = i18n(data->err_str); if (data->err_str && *data->err_str){ if (data->args){ msg = msg.arg(QString::fromUtf8(data->args)); free(data->args); } } ProxyError *err = new ProxyError(this, static_cast<TCPClient*>(data->client), msg); raiseWindow(err); return e->param(); } } return NULL; }