#ifndef NETWORKMANAGER_H
#define NETWORKMANAGER_H
#include <QObject>
#include <QTcpSocket>
#include <QTcpServer>
#include <QProcess>
#include <QTimer>
class NetworkManager : public QObject {
Q_OBJECT
public:
enum class Route { USB, WIFI, Bluetooth };
explicit NetworkManager(QObject *parent = nullptr);
~NetworkManager();
void startListener();
void requestSync(Route route);
void disconnectFromPeer();
void sendNoteContent(const QString &content, const QString &passKey, qint64 lastModified);
bool isConnected() const;
qint64 peerLastModified() const;
void setAutoMerge(bool on);
bool autoMergeReady() const;
void noteActivity();
signals:
void statusChanged(const QString &status, bool isConnected);
void contentReceived(const QString &content);
void linkReady();
void autoSyncDue();
private slots:
void handleNewConnection();
void handleReadyRead();
void handleSocketError(QAbstractSocket::SocketError socketError);
void handleConnected();
void handleDisconnected();
void handleDialTimeout();
void handleIdleTimeout();
void handleAdbTrackerOutput();
private:
void runAdbTunnels();
void teardownAdb();
void startAdbTracker();
void dial(Route route);
void attachSocket(QTcpSocket *s);
void sendMeta();
QTcpSocket *socket;
QTcpServer *server;
QProcess *adbTracker;
bool m_connected;
bool m_metaSeen;
bool m_syncPending;
bool m_adbForwarded;
bool m_autoMerge;
bool m_peerAutoMerge;
qint64 m_peerLastModified;
QTimer *dialTimer;
QTimer *idleTimer;
const quint16 PORT_PHONE = 35690; // android listener; adb forward
const quint16 PORT_HOST = 35691; // linux listener; adb reverse
};
#endif