shared_data xcc_z::gzip(data_ref s) { unsigned long cb_d = s.size() + (s.size() + 999) / 1000 + 12; shared_data d(10 + cb_d + 8); unsigned char* w = d.data(); *w++ = 0x1f; *w++ = 0x8b; *w++ = Z_DEFLATED; *w++ = 0; *w++ = 0; *w++ = 0; *w++ = 0; *w++ = 0; *w++ = 0; *w++ = 3; { z_stream stream; stream.zalloc = NULL; stream.zfree = NULL; stream.opaque = NULL; deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); stream.next_in = const_cast<unsigned char*>(s.begin()); stream.avail_in = s.size(); stream.next_out = w; stream.avail_out = cb_d; deflate(&stream, Z_FINISH); deflateEnd(&stream); w = stream.next_out; } w = write_int_le(4, w, crc32(crc32(0, NULL, 0), s.data(), s.size())); w = write_int_le(4, w, s.size()); return d.substr(0, w - d.data()); }
void Cvirtual_binary::assign(data_ref v) { if (v.size()) { m_source = boost::make_shared<Cvirtual_binary_source>(v.size()); if (v.begin()) memcpy(data_edit(), v.data(), v.size()); } else m_source.reset(); }
void Ctransaction::send_scrape(data_ref r) { if (read_int(8, &r[uti_connection_id], r.end()) != connection_id()) return; if (!m_server.config().m_anonymous_scrape) { send_error(r, "access denied"); return; } const int cb_d = 2 << 10; char d[cb_d]; write_int(4, d + uto_action, uta_scrape); write_int(4, d + uto_transaction_id, read_int(4, &r[uti_transaction_id], r.end())); char* w = d + utos_size; for (r.advance_begin(utis_size); r.size() >= 20 && w + 12 <= d + cb_d; r.advance_begin(20)) { if (const Cserver::t_torrent* t = m_server.torrent(r.substr(0, 20).s())) { w = write_int(4, w, t->seeders); w = write_int(4, w, t->completed); w = write_int(4, w, t->leechers); } else { w = write_int(4, w, 0); w = write_int(4, w, 0); w = write_int(4, w, 0); } } m_server.stats().scraped_udp++; send(data_ref(d, w)); }
shared_data xcc_z::gunzip(data_ref s) { if (s.size() < 18) return shared_data(); shared_data d(read_int_le(4, s.end() - 4)); z_stream stream; stream.zalloc = NULL; stream.zfree = NULL; stream.opaque = NULL; stream.next_in = const_cast<unsigned char*>(s.begin()) + 10; stream.avail_in = s.size() - 18; stream.next_out = d.data(); stream.avail_out = d.size(); return stream.next_out && Z_OK == inflateInit2(&stream, -MAX_WBITS) && Z_STREAM_END == inflate(&stream, Z_FINISH) && Z_OK == inflateEnd(&stream) ? d : shared_data(); }
int Cfile32::write(data_ref v) { return write(v.data(), v.size()); };
void Ctransaction::send(data_ref b) { if (m_s.sendto(b, reinterpret_cast<const sockaddr*>(&m_a), sizeof(sockaddr_in)) != b.size()) std::cerr << "send failed: " << Csocket::error2a(WSAGetLastError()) << std::endl; }