void MsdpNetwork::translate(DataQueue& msdp) { const tbyte* data = (const tbyte*)msdp.getData(); int len = msdp.getSize(); //OUTPUT_BYTES(data, len, len, "MSDP"); while (len > 0) { if (len < 3 || data[0] != IAC || data[2] != MSDP) { assert(false); msdp.clear(); return; } tbyte cmd = data[1]; if (cmd == SB) { const tbyte *p = data; for (int i=3; i<len; ++i) { if (p[i]==SE && p[i-1]==IAC && p[i-2]!=IAC) { run_plugins_msdp(p+3, i-4); len = i+1; break; } } msdp.truncate(len); } else if (cmd == DO) { m_state = true; msdp.truncate(3); send_varval("CLIENT_NAME", "TORTILLA"); send_varval("CLIENT_VERSION", TW2A(TORTILLA_VERSION)); tortilla::getPluginsManager()->processPluginsMethod("msdpon", 0); } else if (cmd == DONT) { m_state = false; msdp.truncate(3); tortilla::getPluginsManager()->processPluginsMethod("msdpoff", 0); releaseReports(); } else { assert(false); msdp.clear(); return; } data = (const tbyte*)msdp.getData(); len = msdp.getSize(); } }
void MsdpNetwork::translateReceived(DataQueue& msdp_data) { if (msdp_data.getSize() > 0) translate(msdp_data); }