Pith - wedge
#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