/*
Copyright (C) 2010 Srivats P.
This file is part of "Ostinato"
This 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 _PORT_GROUP_H
#define _PORT_GROUP_H
#include "port.h"
#include
#include
#include "../common/protocol.pb.h"
#include "pbrpcchannel.h"
/* TODO
HIGH
MED
LOW
- Allow hostnames in addition to IP Address as "server address"
*/
#define DEFAULT_SERVER_PORT 7878
class QFile;
class QTimer;
class PortGroup : public QObject {
Q_OBJECT
private:
enum { kIncompatible, kCompatible, kUnknown } compat;
static quint32 mPortGroupAllocId;
quint32 mPortGroupId;
QString mUserAlias; // user defined
bool reconnect;
int reconnectAfter; // time in milliseconds
static const int kMinReconnectWaitTime = 2000; // ms
static const int kMaxReconnectWaitTime = 60000; // ms
QTimer *reconnectTimer;
PbRpcChannel *rpcChannel;
PbRpcController *statsController;
bool isGetStatsPending_;
OstProto::OstService::Stub *serviceStub;
OstProto::PortIdList *portIdList_;
OstProto::PortStatsList *portStatsList_;
public: // FIXME(HIGH): member access
QList mPorts;
public:
PortGroup(QHostAddress ip = QHostAddress::LocalHost,
quint16 port = DEFAULT_SERVER_PORT);
~PortGroup();
void connectToHost() {
reconnect = true;
compat = kUnknown;
rpcChannel->establish();
}
void connectToHost(QHostAddress ip, quint16 port) {
reconnect = true;
compat = kUnknown;
rpcChannel->establish(ip, port);
}
void disconnectFromHost() { reconnect = false; rpcChannel->tearDown(); }
int numPorts() const { return mPorts.size(); }
quint32 id() const { return mPortGroupId; }
const QString& userAlias() const { return mUserAlias; }
void setUserAlias(QString alias) { mUserAlias = alias; };
const QHostAddress& serverAddress() const
{ return rpcChannel->serverAddress(); }
quint16 serverPort() const
{ return rpcChannel->serverPort(); }
QAbstractSocket::SocketState state() const {
if (compat == kIncompatible)
return QAbstractSocket::SocketState(-1);
return rpcChannel->state();
}
void processVersionCompatibility(PbRpcController *controller);
void processPortIdList(PbRpcController *controller);
void processPortConfigList(PbRpcController *controller);
void processAddStreamAck(PbRpcController *controller);
void processDeleteStreamAck(PbRpcController *controller);
void processModifyStreamAck(int portIndex, PbRpcController *controller);
void modifyPort(int portId, OstProto::Port portConfig);
void processModifyPortAck(PbRpcController *controller);
void processUpdatedPortConfig(PbRpcController *controller);
void getStreamIdList();
void processStreamIdList(int portIndex, PbRpcController *controller);
void getStreamConfigList();
void processStreamConfigList(int portIndex, PbRpcController *controller);
void processModifyStreamAck(OstProto::Ack *ack);
void startTx(QList *portList = NULL);
void processStartTxAck(PbRpcController *controller);
void stopTx(QList *portList = NULL);
void processStopTxAck(PbRpcController *controller);
void startCapture(QList *portList = NULL);
void processStartCaptureAck(PbRpcController *controller);
void stopCapture(QList *portList = NULL);
void processStopCaptureAck(PbRpcController *controller);
void viewCapture(QList *portList = NULL);
void processViewCaptureAck(PbRpcController *controller);
void getPortStats();
void processPortStatsList();
void clearPortStats(QList *portList = NULL);
void processClearStatsAck(PbRpcController *controller);
signals:
void portGroupDataChanged(int portGroupId, int portId = 0xFFFF);
void portListAboutToBeChanged(quint32 portGroupId);
void portListChanged(quint32 portGroupId);
void statsChanged(quint32 portGroupId);
private slots:
void on_reconnectTimer_timeout();
void on_rpcChannel_stateChanged(QAbstractSocket::SocketState state);
void on_rpcChannel_connected();
void on_rpcChannel_disconnected();
void on_rpcChannel_error(QAbstractSocket::SocketError socketError);
void on_rpcChannel_notification(int notifType,
::google::protobuf::Message *notification);
void when_portListChanged(quint32 portGroupId);
public slots:
void when_configApply(int portIndex);
};
#endif