/* Copyright © 2015 Gluzskiy Alexandr (sss) This file is part of Unknown Download Manager (UDM). UDM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. UDM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with UDM. If not, see . */ #include "client_session.h" #include #include std::shared_ptr pack_data(const std::string &buf, int *size_) { BOOST_LOG_TRIVIAL(debug)<<__FILE__<<":"<<__LINE__<<"\t"<<__func__; std::shared_ptr ptr = std::make_shared(new char[buf.length() + 4]); int32_t size = buf.length(); *size_ = size + 4; (*ptr)[3] = size & 0xff; (*ptr)[2] = (size>>8) & 0xff; (*ptr)[1] = (size>>16) & 0xff; (*ptr)[0] = (size>>24) & 0xff; char *fck = (*ptr)+4; memcpy(fck, buf.data(), buf.length()); return ptr; } std::shared_ptr pack_msg(client_msg *msg, int *size_) { BOOST_LOG_TRIVIAL(debug)<<__FILE__<<":"<<__LINE__<<"\t"<<__func__; BOOST_LOG_TRIVIAL(trace)<<"packing message:\n"<DebugString(); std::string msg_buf; msg->SerializeToString(&msg_buf); return pack_data(msg_buf, size_); } client_session::client_session(QObject *parent, boost::asio::io_service *io_service) : QObject(parent), io_service_(*io_service), socket_(*io_service) { } tcp::socket& client_session::socket() { return socket_; } void client_session::client_connect(QString host, QString password, int port) { //TODO: settings for connection timeout this->pasword = password; boost::asio::ip::tcp::resolver r(io_service_); boost::asio::ip::tcp::endpoint ep; ep.port(port); ep.address(boost::asio::ip::address::from_string(host.toStdString())); socket_.async_connect(ep, boost::bind(&client_session::handle_connect, this, boost::asio::placeholders::error)); } void client_session::handle_connect(const boost::system::error_code &e) { BOOST_LOG_TRIVIAL(debug)<<__FILE__<<":"<<__LINE__<<"\t"< ptr = pack_msg(&msg, &size); boost::asio::async_write(socket_, boost::asio::buffer(*ptr, size), boost::bind(&client_session::handle_write, this, boost::asio::placeholders::error)); } void client_session::handle_write(const boost::system::error_code& error) { if(error) { //TODO: handle error } } void client_session::run_io_service() { io_service_.run(); } client_session::~client_session() { //TODO: check this, reimplement io_service_.stop(); boost::asio::io_service *s = &io_service_; delete s; emit terminate_thread(); } /*boost::asio::io_service &client_session::io_service() { return io_service_; } */