/*
(c) Copyright 2012 - 2018 Anton Sviridenko
https://picapica.im
This program 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 3 of the License, or
(at your option) any later version.
This program 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 this program. If not, see .
*/
#ifndef SKYNET_H
#define SKYNET_H
#include "nodes.h"
#include "../PICA_client.h"
#include "../PICA_proto.h"
#include "accounts.h"
#include
#include
#include
#include
class SkyNet : public QObject
{
Q_OBJECT
public:
SkyNet();
void Join(Accounts::AccountRecord &accrec);
bool isSelfAware();
void Exit();
void SendMessage(QByteArray to, QString msg);
void SendFile(QByteArray to, QString filepath);
void AcceptFile(QByteArray from, QString filepath);
void DenyFile(QByteArray from);
void PauseFile(QByteArray peer_id, bool pause_sending);
void ResumeFile(QByteArray peer_id, bool resume_sending);
void CancelFile(QByteArray peer_id, bool cancel_sending);
Accounts::AccountRecord CurrentAccount()
{
return skynet_account;
};
signals:
void MessageReceived(QByteArray from, QString msg);
void UnableToDeliver(QByteArray to, QString msg);
void Delivered(QByteArray to);
void BecameSelfAware();
void LostSelfAwareness();
void PeerCertificateReceived(QByteArray peer_id, QString cert_pem, bool *verified);
void CertificateForged(QByteArray peer_id, QString received_cert, QString stored_cert);
void StatusMsg(QString msg, bool is_critical);
void ContactsUpdated();
void IncomingFileRequestReceived(QByteArray peer_id, quint64 file_size, QString filename);
void OutgoingFileRequestAccepted(QByteArray peer_id);
void OutgoingFileRequestDenied(QByteArray peer_id);
void FileProgress(QByteArray peer_id, quint64 bytes_sent, quint64 bytes_received);
void IncomingFilePaused(QByteArray peer_id);
void IncomingFileCancelled(QByteArray peer_id);
void IncomingFileIoError(QByteArray peer_id);
void IncomingFileResumed(QByteArray peer_id);
void OutgoingFilePaused(QByteArray peer_id);
void OutgoingFileCancelled(QByteArray peer_id);
void OutgoingFileIoError(QByteArray peer_id);
void OutgoingFileResumed(QByteArray peer_id);
void OutgoingFileFinished(QByteArray peer_id);
void IncomingFileFinished(QByteArray peer_id);
void MultiloginMessageReceived(quint64 timestamp, QString node_addr, quint16 node_port);
void ConnectionStatusUpdated(QByteArray peer_id, QString status);
void c2cClosed(QByteArray peer_id);
private:
Nodes nodes;
QList > connecting_nodes;
QList connected_nodes_to_close;
bool self_aware;
QString status;
struct PICA_c2n *active_nodelink;
struct PICA_acc *acc;
struct PICA_listener *listener;
Accounts::AccountRecord skynet_account;
QMap > msgqueues;
QMap > sndfilequeues;
int retry_timer_id;
int event_loop_timer_id;
int file_transfer_timer_id;
void timerEvent(QTimerEvent * e);
void flush_queues(QByteArray to);
struct PICA_c2c *find_active_chan(QByteArray peer_id);
QList filter_existing_chans(QList peer_ids);
bool open_account();
void active_filetransfers_up();
void active_filetransfers_down();
void active_filetransfers_reset();
quint32 active_filetransfers;
void emit_MessageReceived(QByteArray from, QString msg);
void emit_UnableToDeliver(QByteArray to, QString msg);
void emit_Delivered(QByteArray to);
void emit_PeerCertificateReceived(QByteArray peer_id, QString cert_pem, bool *verified);
void emit_IncomingFileRequestReceived(QByteArray peer_id, quint64 file_size, QString filename);
void emit_OutgoingFileRequestAccepted(QByteArray peer_id);
void emit_OutgoingFileRequestDenied(QByteArray peer_id);
void emit_FileProgress(QByteArray peer_id, quint64 bytes_sent, quint64 bytes_received);
void emit_IncomingFilePaused(QByteArray peer_id);
void emit_IncomingFileCancelled(QByteArray peer_id);
void emit_IncomingFileIoError(QByteArray peer_id);
void emit_IncomingFileResumed(QByteArray peer_id);
void emit_OutgoingFilePaused(QByteArray peer_id);
void emit_OutgoingFileCancelled(QByteArray peer_id);
void emit_OutgoingFileIoError(QByteArray peer_id);
void emit_OutgoingFileResumed(QByteArray peer_id);
void emit_OutgoingFileFinished(QByteArray peer_id);
void emit_IncomingFileFinished(QByteArray peer_id);
void emit_MultiloginMessageReceived(quint64 timestamp, QString node_addr, quint16 node_port);
void emit_c2cClosed(QByteArray peer_id);
void emit_ConnectionStatusUpdated(QByteArray peer_id, QString status);
//получение сообщения.
static void newmsg_cb(const unsigned char *peer_id, const char* msgbuf, unsigned int nb, int type);
//получение подтверждения о доставке сообщения
static void msgok_cb(const unsigned char *peer_id);
//создание канала с собеседником
static void c2c_established_cb(const unsigned char *peer_id, const char *ciphersuitename);
//создать канал не удалось
static void c2c_failed(const unsigned char *peer_id);
//входящий запрос на создание канала от пользователя с номером caller_id
static int accept_cb(const unsigned char *caller_id);
//запрошенный пользователь не найден, в оффлайне или отказался от общения
static void notfound_cb(const unsigned char *callee_id);
static void c2c_closed_cb(const unsigned char *peer_id, int reason);
static void nodelist_cb(int type, void *addr_bin, const char *addr_str, unsigned int port);
static int peer_cert_verify_cb(const unsigned char *peer_id, const char *cert_pem, unsigned int nb);
static int accept_file_cb(const unsigned char *peer_id, uint64_t file_size, const char *filename, unsigned int filename_size);
static void accepted_file_cb(const unsigned char *peer_id);
static void denied_file_cb(const unsigned char *peer_id);
static void file_progress(const unsigned char *peer_id, uint64_t sent, uint64_t received);
static void file_control(const unsigned char *peer_id, unsigned int sender_cmd, unsigned int receiver_cmd);
static void file_finished(const unsigned char *peer_id, int sending);
static void c2n_established_cb(struct PICA_c2n *c2n);
static void c2n_failed_cb(struct PICA_c2n *c2n, int error);
static void c2n_closed_cb(struct PICA_c2n *c2n, int error);
static void listener_error_cb(struct PICA_listener *lst, int errorcode);
static void multilogin_cb(uint64_t timestamp, void *addr_bin, const char *addr_str, uint16_t port);
static void direct_c2c_established_cb(const unsigned char *peer_id, const char *ciphersuitename);
private slots:
void nodelink_activated(PICA_c2n *c2n);
void nodelink_closed(PICA_c2n *c2n, int error);
void nodelink_failed(PICA_c2n *c2n, int error);
void multilogin_event(quint64 timestamp, QString node_addr, quint16 node_port);
void node_status_changed(Nodes::NodeRecord nr, bool alive);
void verify_peer_cert(QByteArray peer_id, QString cert_pem, bool *verified);
};
#endif // SKYNET_H