qttermtcp/TabDialog.cpp

1183 lines
27 KiB
C++
Raw Normal View History

2023-12-08 15:48:31 +00:00
#define _CRT_SECURE_NO_WARNINGS
#include "TabDialog.h"
#include "QtTermTCP.h"
#include <QTcpServer>
#include "QSettings"
#include "QLineEdit"
#include "QTabWidget"
#include "QDialogButtonBox"
#include "QVBoxLayout"
#include "QLabel"
#include "QAction"
#include "QGroupBox"
#include "QPlainTextEdit"
#include "QCheckBox"
#include "QFormLayout"
#include "QScrollArea"
#include "ax25.h"
#ifndef WIN32
#define strtok_s strtok_r
#endif
extern "C" void SaveSettings();
extern int screenHeight;
extern int screenWidth;
extern QList<Ui_ListenSession *> _sessions;
extern QTcpServer * _server;
extern myTcpSocket * AGWSock;
extern myTcpSocket * KISSSock;
extern QLabel * Status1;
extern QFont * menufont;
extern QStatusBar * myStatusBar;
QLineEdit *hostEdit;
QLineEdit *portEdit;
QLineEdit *userEdit;
QLineEdit *passEdit;
QLineEdit *SNameEdit;
extern QAction *actHost[17];
extern QAction *actSetup[16];
extern int ConfigHost;
#define MAXHOSTS 16
extern char Host[MAXHOSTS + 1][100];
extern int Port[MAXHOSTS + 1];
extern char UserName[MAXHOSTS + 1][80];
extern char Password[MAXHOSTS + 1][80];
extern char SessName[MAXHOSTS + 1][80];
extern char MYCALL[32];
QLineEdit *TermCall;
QGroupBox *groupBox;
QLineEdit *beaconDest;
QLineEdit *beaconPath;
QLineEdit *beaconInterval;
QLineEdit *beaconPorts;
QLabel *label_2;
QLabel *label_3;
QLabel *label_4;
QLabel *label_5;
QLabel *label_6;
QLabel *label_7;
QLabel *label_11;
QPlainTextEdit *beaconText;
QLabel *label_12;
QGroupBox *groupBox_2;
QLineEdit *AHost;
QLineEdit *APort;
QLineEdit *APath;
QLineEdit *Paclen;
QLabel *label_8;
QLabel *label_9;
QLabel *label_10;
QLabel *label;
QCheckBox *AAGWEnable;
QLabel *label_13;
QCheckBox *AAGWMonEnable;
QLineEdit *AVARATermCall;
QLineEdit *AVARAHost;
QLineEdit *AVARAPort;
QCheckBox *AVARAEnable;
extern int AGWEnable;
extern int VARAEnable;
extern int KISSEnable;
extern int AGWMonEnable;
extern char AGWTermCall[12];
extern char AGWBeaconDest[12];
extern char AGWBeaconPath[80];
extern int AGWBeaconInterval;
extern char AGWBeaconPorts[80];
extern char AGWBeaconMsg[260];
extern char VARATermCall[12];
extern char AGWHost[128];
extern int AGWPortNum;
extern int AGWPaclen;
extern char * AGWPortList;
extern myTcpSocket * AGWSock;
extern char * AGWPortList;
extern QStringList AGWToCalls;
extern int KISSMode;
extern Ui_ListenSession * ActiveSession;
extern int TermMode;
#define Single 0
#define MDI 1
#define Tabbed 2
extern int listenPort;
extern "C" int listenEnable;
extern char listenCText[4096];
void Send_AGW_C_Frame(Ui_ListenSession * Sess, int Port, char * CallFrom, char * CallTo, char * Data, int DataLen);
extern "C" void SetSessLabel(Ui_ListenSession * Sess, char * label);
extern "C" void SendtoTerm(Ui_ListenSession * Sess, char * Msg, int Len);
QString GetConfPath();
QScrollArea *scrollArea;
QWidget *scrollAreaWidgetContents;
bool myResize::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Resize)
{
QResizeEvent *resizeEvent = static_cast<QResizeEvent *>(event);
QSize size = resizeEvent->size();
int h = size.height();
int w = size.width();
scrollArea->setGeometry(QRect(5, 5, w - 10, h - 10));
return true;
}
return QObject::eventFilter(obj, event);
}
AGWConnect::AGWConnect(QWidget *parent) : QDialog(parent)
{
this->setFont(*menufont);
setWindowTitle(tr("AGW Connection"));
myResize *resize = new myResize();
installEventFilter(resize);
scrollArea = new QScrollArea(this);
scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
scrollArea->setGeometry(QRect(5, 5, 562, 681));
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setWidgetResizable(false);
scrollAreaWidgetContents = new QWidget();
scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
QVBoxLayout *layout = new QVBoxLayout();
layout->setContentsMargins(10, 10, 10, 10);
setLayout(layout);
QFormLayout *formLayout2 = new QFormLayout();
layout->addLayout(formLayout2);
wCallFrom = new QLineEdit();
formLayout2->addRow(new QLabel("Call From"), wCallFrom);
wCallTo = new QComboBox();
wCallTo->setEditable(true);
wCallTo->setInsertPolicy(QComboBox::NoInsert);
formLayout2->addRow(new QLabel("Call To"), wCallTo);
Digis = new QLineEdit();
formLayout2->addRow(new QLabel("Digis"), Digis);
layout->addSpacing(2);
layout->addWidget(new QLabel("Radio Ports"));
RadioPorts = new QListWidget();
layout->addWidget(RadioPorts);
QString str;
int count;
char * Context;
char * ptr;
wCallFrom->setText(AGWTermCall);
wCallTo->addItems(AGWToCalls);
if (AGWPortList)
{
char * Temp = strdup(AGWPortList); // Need copy as strtok messes with it
count = atoi(Temp);
ptr = strtok_s(Temp, ";", &Context);
for (int n = 0; n < count; n++)
{
ptr = strtok_s(NULL, ";", &Context);
new QListWidgetItem(ptr, RadioPorts);
}
free(Temp);
// calculate scrollarea height from count
scrollAreaWidgetContents->setGeometry(QRect(0, 0, 400, 220 + 22 * count));
this->resize(420, 240 + 22 * count);
}
RadioPorts->setFont(*menufont);
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
buttonBox->setFont(*menufont);
layout->addWidget(buttonBox);
scrollAreaWidgetContents->setLayout(layout);
scrollArea->setWidget(scrollAreaWidgetContents);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
}
AGWConnect::~AGWConnect()
{
}
extern QAction *discAction;
void AGWConnect::myaccept()
{
QVariant Q;
int port = RadioPorts->currentRow();
char CallFrom[32];
char CallTo[32];
char Via[128];
char DigiMsg[128] = "";
int DigiLen = 0;
char * digiptr = &DigiMsg[1];
strcpy(CallFrom, wCallFrom->text().toUpper().toUtf8());
strcpy(CallTo, wCallTo->currentText().toUpper().toUtf8());
strcpy(Via, Digis->text().toUpper().toUtf8());
if (CallFrom[0] == 0)
{
QMessageBox msgBox;
msgBox.setText("Call From missing");
msgBox.exec();
return;
}
if (CallTo[0] == 0)
{
QMessageBox msgBox;
msgBox.setText("Call To missing");
msgBox.exec();
return;
}
// if digis have to form block with byte count followed by n 10 byte calls
if (Via[0])
{
char * context;
char * ptr = strtok_s(Via, ", ", &context);
while (ptr)
{
DigiMsg[0]++;
strcpy(digiptr, ptr);
digiptr += 10;
ptr = strtok_s(NULL, ", ", &context);
}
DigiLen = digiptr - DigiMsg;
}
// Add CallTo if not already in list
if (AGWToCalls.contains(CallTo))
AGWToCalls.removeOne(CallTo);
AGWToCalls.insert(-1, CallTo);
if (port == -1)
{
// Port not set. If connecting to SWITCH use any, otherwise tell user
if (strcmp(CallTo, "SWITCH") == 0)
{
port = 0;
}
else
{
QMessageBox msgBox;
msgBox.setText("Select a port to call on");
msgBox.exec();
return;
}
}
Send_AGW_C_Frame(ActiveSession, port, CallFrom, CallTo, DigiMsg, DigiLen);
discAction->setEnabled(true);
AGWConnect::accept();
}
void AGWConnect::myreject()
{
AGWConnect::reject();
}
AGWDialog::AGWDialog(QWidget *parent) : QDialog(parent)
{
this->setFont(*menufont);
setWindowTitle(tr("TermTCP AGW Configuration"));
myResize *resize = new myResize();
installEventFilter(resize);
scrollArea = new QScrollArea(this);
scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
scrollArea->setGeometry(QRect(5, 5, 562, 681));
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setWidgetResizable(false);
scrollAreaWidgetContents = new QWidget();
scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
scrollAreaWidgetContents->setGeometry(QRect(0, 0, 552, 581));
this->resize(572, 601);
QVBoxLayout *layout = new QVBoxLayout;
QHBoxLayout *hlayout = new QHBoxLayout;
layout->addLayout(hlayout);
AAGWEnable = new QCheckBox("Enable AGW Interface");
AAGWEnable->setLayoutDirection(Qt::LeftToRight);
AAGWMonEnable = new QCheckBox("Enable Monitor");
AAGWMonEnable->setGeometry(QRect(255, 18, 216, 21));
AAGWMonEnable->setLayoutDirection(Qt::RightToLeft);
hlayout->addWidget(AAGWEnable);
hlayout->addWidget(AAGWMonEnable);
QFormLayout *flayout = new QFormLayout;
layout->addLayout(flayout);
label = new QLabel("Terminal Call");
TermCall = new QLineEdit(this);
flayout->addRow(label, TermCall);
layout->addWidget(new QLabel("Beacon Setup"));
QFormLayout *flayout1 = new QFormLayout;
layout->addLayout(flayout1);
label_2 = new QLabel("Destination");
beaconDest = new QLineEdit();
label_3 = new QLabel("Digipeaters");
beaconPath = new QLineEdit();
flayout1->addRow(label_2, beaconDest);
flayout1->addRow(label_3, beaconPath);
label_4 = new QLabel("Interval");
beaconInterval = new QLineEdit();
label_5 = new QLabel("Ports");
beaconPorts = new QLineEdit();
flayout1->addRow(label_4, beaconInterval);
flayout1->addRow(label_5, beaconPorts);
// label_6 = new QLabel("Minutes", groupBox);
// label_7 = new QLabel("(Separate with commas)", groupBox);
label_11 = new QLabel("Message");
beaconText = new QPlainTextEdit();
flayout1->addRow(label_11, beaconText);
// label_12 = new QLabel("(max 256 chars)");
// label_12->setGeometry(QRect(14, 158, 95, 21));
layout->addWidget(new QLabel("TNC Setup"));
QFormLayout *flayout2 = new QFormLayout;
layout->addLayout(flayout2);
AHost = new QLineEdit();
APort = new QLineEdit();
Paclen = new QLineEdit();
label_8 = new QLabel("host");
label_9 = new QLabel("Port");
label_10 = new QLabel("Paclen ");
flayout2->addRow(label_8, AHost);
flayout2->addRow(label_9, APort);
flayout2->addRow(label_10, Paclen);
AAGWEnable->setChecked(AGWEnable);
AAGWMonEnable->setChecked(AGWMonEnable);
TermCall->setText(AGWTermCall);
beaconDest->setText(AGWBeaconDest);
beaconPath->setText(AGWBeaconPath);
beaconPorts->setText(AGWBeaconPorts);
beaconText->setPlainText(AGWBeaconMsg);
beaconInterval->setText(QString::number(AGWBeaconInterval));
AHost->setText(AGWHost);
APort->setText(QString::number(AGWPortNum));
Paclen->setText(QString::number(AGWPaclen));
buttonBox = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel, this);
buttonBox->setFont(*menufont);
layout->addWidget(buttonBox);
scrollAreaWidgetContents->setLayout(layout);
scrollArea->setWidget(scrollAreaWidgetContents);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
}
AGWDialog::~AGWDialog()
{
}
KISSConnect::KISSConnect(QWidget *parent) : QDialog(parent)
{
this->setFont(*menufont);
setWindowTitle(tr("KISS Connection"));
myResize *resize = new myResize();
installEventFilter(resize);
scrollArea = new QScrollArea(this);
scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
scrollArea->setGeometry(QRect(5, 5, 250, 200));
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setWidgetResizable(false);
scrollAreaWidgetContents = new QWidget();
scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
// layout is top level.
// Add a Horizontal layout for Mode and Verical Layout for Call and Digis
QVBoxLayout *layout = new QVBoxLayout();
layout->setContentsMargins(10, 10, 10, 10);
setLayout(layout);
QHBoxLayout *mylayout = new QHBoxLayout();
Connected = new QRadioButton("Sesion");
UIMode = new QRadioButton("UI");
mylayout->addWidget(new QLabel("Connection Mode"));
mylayout->addWidget(Connected);
mylayout->addWidget(UIMode);
if (KISSMode) // UI = 1
UIMode->setChecked(1);
else
Connected->setChecked(1);
QFormLayout *formLayout2 = new QFormLayout();
layout->addLayout(mylayout);
layout->addSpacing(10);
layout->addLayout(formLayout2);
wCallTo = new QComboBox();
wCallTo->setEditable(true);
wCallTo->setInsertPolicy(QComboBox::NoInsert);
formLayout2->addRow(new QLabel("Call To"), wCallTo);
Digis = new QLineEdit();
formLayout2->addRow(new QLabel("Digis"), Digis);
layout->addSpacing(2);
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
buttonBox->setFont(*menufont);
layout->addWidget(buttonBox);
scrollAreaWidgetContents->setLayout(layout);
scrollArea->setWidget(scrollAreaWidgetContents);
wCallTo->addItems(AGWToCalls);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
}
extern "C" void * KISSConnectOut(void * Sess, char * CallFrom, char * CallTo, char * Digis, int Chan, void * Socket);
KISSConnect::~KISSConnect()
{
}
extern QAction * YAPPSend;
extern QMenu * connectMenu;
extern QMenu * disconnectMenu;
TAX25Port DummyPort;
extern "C" TAX25Port * get_user_port_by_calls(int snd_ch, char * CallFrom, char * CallTo);
void KISSConnect::myaccept()
{
QVariant Q;
char CallTo[32];
char Via[128];
strcpy(CallTo, wCallTo->currentText().toUpper().toUtf8());
strcpy(Via, Digis->text().toUpper().toUtf8());
TAX25Port * AX25Sess = 0;
// Check for duplicate session
AX25Sess = get_user_port_by_calls(0, MYCALL, CallTo);
if (AX25Sess)
{
// Duplicate
char Msg[256];
int Len = sprintf(Msg, "You already have a session between %s and %s so can't connect\r", MYCALL, CallTo);
WritetoOutputWindow(ActiveSession, (unsigned char *)Msg, Len);
// KISSConnect::accept();
return;
}
KISSMode = UIMode->isChecked();
// Add CallTo if not already in list
if (AGWToCalls.contains(CallTo))
AGWToCalls.removeOne(CallTo);
AGWToCalls.insert(-1, CallTo);
ActiveSession->KISSMode = KISSMode;
if (KISSMode == 0)
{
ActiveSession->KISSSession = KISSConnectOut(ActiveSession, MYCALL, CallTo, Via, 0, (void *)KISSSock);
WritetoOutputWindow(ActiveSession, (unsigned char *)"Connecting...\r", 14);
discAction->setEnabled(true);
}
else
{
// UI
char Msg[128];
int Len = 0;
memset(&DummyPort, 0, sizeof(DummyPort));
ActiveSession->KISSSession = (void *)&DummyPort; // Dummy marker to show session in use
strcpy(ActiveSession->UIDEST, CallTo);
strcpy(ActiveSession->UIPATH, Via);
if (TermMode == Tabbed)
Len = sprintf(Msg, "UI %s", CallTo);
else
Len = sprintf(Msg, "UI Session with %s\r", CallTo);
SetSessLabel(ActiveSession, Msg);
Len = sprintf(Msg, "UI Session with %s\r", CallTo);
SendtoTerm(ActiveSession, Msg, Len);
connectMenu->setEnabled(false);
discAction->setEnabled(true);
YAPPSend->setEnabled(false);
}
KISSConnect::accept();
}
void KISSConnect::myreject()
{
KISSConnect::reject();
}
VARAConnect::VARAConnect(QWidget *parent) : QDialog(parent)
{
this->setFont(*menufont);
setWindowTitle(tr("VARA Connection"));
myResize *resize = new myResize();
installEventFilter(resize);
scrollArea = new QScrollArea(this);
scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
scrollArea->setGeometry(QRect(5, 5, 250, 150));
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setWidgetResizable(false);
scrollAreaWidgetContents = new QWidget();
scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
QVBoxLayout *layout = new QVBoxLayout();
layout->setContentsMargins(10, 10, 10, 10);
setLayout(layout);
QFormLayout *formLayout2 = new QFormLayout();
layout->addLayout(formLayout2);
wCallFrom = new QLineEdit();
formLayout2->addRow(new QLabel("Call From"), wCallFrom);
wCallTo = new QComboBox();
wCallTo->setEditable(true);
wCallTo->setInsertPolicy(QComboBox::NoInsert);
formLayout2->addRow(new QLabel("Call To"), wCallTo);
Digis = new QLineEdit();
formLayout2->addRow(new QLabel("Digis"), Digis);
layout->addSpacing(2);
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
buttonBox->setFont(*menufont);
layout->addWidget(buttonBox);
scrollAreaWidgetContents->setLayout(layout);
scrollArea->setWidget(scrollAreaWidgetContents);
wCallFrom->setText(VARATermCall);
wCallTo->addItems(AGWToCalls);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
}
VARAConnect::~VARAConnect()
{
}
extern myTcpSocket * VARASock;
extern myTcpSocket * VARADataSock;
void VARAConnect::myaccept()
{
QVariant Q;
char CallFrom[32];
char CallTo[32];
char Via[128];
char Msg[256];
int Len;
strcpy(CallFrom, wCallFrom->text().toUpper().toUtf8());
strcpy(CallTo, wCallTo->currentText().toUpper().toUtf8());
strcpy(Via, Digis->text().toUpper().toUtf8());
// if digis have to form block with byte count followed by n 10 byte calls
// Add CallTo if not already in list
if (AGWToCalls.contains(CallTo))
AGWToCalls.removeOne(CallTo);
AGWToCalls.insert(-1, CallTo);
if (Via[0])
Len = sprintf(Msg, "CONNECT %s %s VIA %s\r", CallFrom, CallTo, Via);
else
Len = sprintf(Msg, "CONNECT %s %s\r", CallFrom, CallTo);
VARASock->write(Msg, Len);
discAction->setEnabled(true);
VARAConnect::accept();
}
void VARAConnect::myreject()
{
VARAConnect::reject();
}
extern QProcess *process;
TabDialog::TabDialog(QWidget *parent) : QDialog(parent)
{
char portnum[10];
buttonBox = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
QVBoxLayout *layout = new QVBoxLayout;
QLabel *hostLabel = new QLabel(tr("Host Name:"));
hostEdit = new QLineEdit(Host[ConfigHost]);
QLabel *portLabel = new QLabel(tr("Port:"));
sprintf(portnum, "%d", Port[ConfigHost]);
portEdit = new QLineEdit(portnum);
QLabel *userLabel = new QLabel(tr("User:"));
userEdit = new QLineEdit(UserName[ConfigHost]);
QLabel *passLabel = new QLabel(tr("Password:"));
passEdit = new QLineEdit(Password[ConfigHost]);
QLabel *SNameLabel = new QLabel(tr("Session Name"));
SNameEdit = new QLineEdit(SessName[ConfigHost]);
layout->addWidget(hostLabel);
layout->addWidget(hostEdit);
layout->addWidget(portLabel);
layout->addWidget(portEdit);
layout->addWidget(userLabel);
layout->addWidget(userEdit);
layout->addWidget(passLabel);
layout->addWidget(passEdit);
layout->addWidget(SNameLabel);
layout->addWidget(SNameEdit);
layout->addStretch(1);
layout->addWidget(buttonBox);
setLayout(layout);
setWindowTitle(tr("TermTCP Host Configuration"));
}
void AGWDialog::myaccept()
{
QVariant Q;
int OldEnable = AGWEnable;
int OldPort = AGWPortNum;
char oldHost[128];
strcpy(oldHost, AGWHost);
// QString val = Sess->portNo->text();A
// QByteArray qb = val.toLatin1();
// char * ptr = qb.data();
AGWEnable = AAGWEnable->isChecked();
AGWMonEnable = AAGWMonEnable->isChecked();
strcpy(AGWTermCall, TermCall->text().toUtf8().toUpper());
strcpy(AGWBeaconDest, beaconDest->text().toUtf8().toUpper());
strcpy(AGWBeaconPath, beaconPath->text().toUtf8().toUpper());
strcpy(AGWBeaconPorts, beaconPorts->text().toUtf8().toUpper());
if (beaconText->toPlainText().length() > 256)
{
QMessageBox msgBox;
msgBox.setText("Beacon Text Too Long");
msgBox.exec();
}
else
strcpy(AGWBeaconMsg, beaconText->toPlainText().toUtf8().toUpper());
Q = beaconInterval->text();
AGWBeaconInterval = Q.toInt();
strcpy(AGWHost, AHost->text().toUtf8());
Q = APort->text();
AGWPortNum = Q.toInt();
Q = Paclen->text();
AGWPaclen = Q.toInt();
SaveSettings();
if (AGWEnable != OldEnable || AGWPortNum != OldPort || strcmp(oldHost, AGWHost) != 0)
{
// (re)start connection
if (OldEnable && AGWSock && AGWSock->ConnectedState == QAbstractSocket::ConnectedState)
{
AGWSock->disconnectFromHost();
Status1->setText("AGW Disconnected");
}
// AGWTimer will reopen connection
}
myStatusBar->setVisible(AGWEnable | VARAEnable | KISSEnable);
AGWDialog::accept();
}
void AGWDialog::myreject()
{
AGWDialog::reject();
}
void TabDialog::myaccept()
{
QString val = hostEdit->text();
QByteArray qb = val.toLatin1();
char * ptr = qb.data();
strcpy(Host[ConfigHost], ptr);
val = portEdit->text();
qb = val.toLatin1();
ptr = qb.data();
Port[ConfigHost] = atoi(ptr);
val = userEdit->text();
qb = val.toLatin1();
ptr = qb.data();
strcpy(UserName[ConfigHost], ptr);
val = passEdit->text();
qb = val.toLatin1();
ptr = qb.data();
strcpy(Password[ConfigHost], ptr);
val = SNameEdit->text();
qb = val.toLatin1();
ptr = qb.data();
strcpy(SessName[ConfigHost], ptr);
char Label[256];
if (ptr[0])
sprintf(Label, "%s(%s)", Host[ConfigHost], SessName[ConfigHost]);
else
strcpy(Label, Host[ConfigHost]);
actHost[ConfigHost]->setText(Label);
actSetup[ConfigHost]->setText(Label);
SaveSettings();
TabDialog::accept();
}
void TabDialog::myreject()
{
TabDialog::reject();
}
TabDialog::~TabDialog()
{
}
// Menu dialog
fontDialog::fontDialog(int Menu, QWidget *parent) : QDialog(parent)
{
// Menu is set if setting Menufont, zero for setting terminal font.
int i;
char valChar[16];
QString family;
int csize;
QFont::Weight weight;
#ifdef ANDROID
this->resize((screenWidth * 7) / 8, 200);
this->setMaximumWidth((screenWidth * 7) / 8);
#endif
this->setFont(*menufont);
Menuflag = Menu;
if (Menu)
{
workingFont = *menufont;
QFontInfo info(*menufont);
family = info.family();
csize = info.pointSize();
setWindowTitle("Menu Font Dialog");
}
else
{
// get current term font
QSettings settings(GetConfPath(), QSettings::IniFormat);
#ifdef ANDROID
family = settings.value("FontFamily", "Driod Sans Mono").toString();
csize = settings.value("PointSize", 12).toInt();
weight = (QFont::Weight)settings.value("Weight", 50).toInt();
#else
family = settings.value("FontFamily", "Courier New").toString();
csize = settings.value("PointSize", 10).toInt();
weight = (QFont::Weight)settings.value("Weight", 50).toInt();
#endif
workingFont = QFont(family);
workingFont.setPointSize(csize);
workingFont.setWeight(weight);
setWindowTitle("Terminal Font Dialog");
}
QVBoxLayout *layout = new QVBoxLayout();
layout->setContentsMargins(10, 10, 10, 10);
setLayout(layout);
QHBoxLayout *hlayout = new QHBoxLayout();
layout->addLayout(hlayout);
font = new QFontComboBox();
if (Menu == 0)
font->setFontFilters(QFontComboBox::MonospacedFonts);
font->setMaximumWidth((screenWidth * 5) / 8);
font->view()->setMaximumWidth((7 * screenWidth) / 8);
style = new QComboBox();
style->setMaximumWidth(screenWidth / 4);
size = new QComboBox();
sample = new QTextEdit();
sample->setText("ABCDabcd1234");
sample->setFont(workingFont);
hlayout->addWidget(font);
hlayout->addWidget(style);
hlayout->addWidget(size);
layout->addWidget(sample);
QFontDatabase database;
const QStringList styles = database.styles(family);
const QList<int> smoothSizes = database.smoothSizes(family, styles[0]);
for (int points : smoothSizes)
size->addItem(QString::number(points));
for (QString xstyle : styles)
style->addItem(xstyle);
i = font->findText(family, Qt::MatchExactly);
font->setCurrentIndex(i);
sprintf(valChar, "%d", csize);
i = size->findText(valChar, Qt::MatchExactly);
size->setCurrentIndex(i);
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
buttonBox->setFont(*menufont);
layout->addWidget(buttonBox);
setLayout(layout);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
connect(font, SIGNAL(currentFontChanged(QFont)), this, SLOT(fontchanged(QFont)));
connect(style, SIGNAL(currentIndexChanged(int)), this, SLOT(stylechanged()));
connect(size, SIGNAL(currentIndexChanged(int)), this, SLOT(sizechanged()));
}
void fontDialog::fontchanged(QFont newfont)
{
QFontDatabase database;
QString family = newfont.family();
workingFont = newfont;
const QStringList styles = database.styles(family);
const QList<int> smoothSizes = database.smoothSizes(family, styles[0]);
size->clear();
style->clear();
for (int points : smoothSizes)
size->addItem(QString::number(points));
for (QString xstyle : styles)
style->addItem(xstyle);
sample->setFont(workingFont);
}
void fontDialog::stylechanged()
{
QFontDatabase database;
QString family = font->currentFont().family();
bool italic = database.italic(family, style->currentText());
int weight = database.weight(family, style->currentText());
if (weight < 0)
weight = 50; // Normal
workingFont.setItalic(italic);
workingFont.setWeight((QFont::Weight) weight);
sample->setFont(workingFont);
}
void fontDialog::sizechanged()
{
int newsize = size->currentText().toInt();
workingFont.setPointSize(newsize);
sample->setFont(workingFont);
}
fontDialog::~fontDialog()
{
}
void fontDialog::myaccept()
{
QSettings settings(GetConfPath(), QSettings::IniFormat);
if (Menuflag)
{
delete menufont;
menufont = new QFont(workingFont);
QtTermTCP::setFonts();
settings.setValue("MFontFamily", workingFont.family());
settings.setValue("MPointSize", workingFont.pointSize());
settings.setValue("MWeight", workingFont.weight());
}
else
{
Ui_ListenSession * Sess;
for (int i = 0; i < _sessions.size(); ++i)
{
Sess = _sessions.at(i);
if (Sess->termWindow)
Sess->termWindow->setFont(workingFont);
if (Sess->inputWindow)
Sess->inputWindow->setFont(workingFont);
if (Sess->monWindow)
Sess->monWindow->setFont(workingFont);
}
settings.setValue("FontFamily", workingFont.family());
settings.setValue("PointSize", workingFont.pointSize());
settings.setValue("Weight", workingFont.weight());
}
fontDialog::accept();
}
void fontDialog::myreject()
{
fontDialog::reject();
}
ListenDialog::ListenDialog(QWidget *parent) : QDialog(parent)
{
#ifdef ANDROID
this->resize((screenWidth * 3) / 4 , 500);
#endif
verticalLayout = new QVBoxLayout();
verticalLayout->setContentsMargins(10, 10, 10, 10);
setLayout(verticalLayout);
Enabled = new QCheckBox();
Enabled->setText(QString::fromUtf8("Enable Listen"));
Enabled->setLayoutDirection(Qt::LeftToRight);
verticalLayout->addWidget(Enabled);
formLayout = new QFormLayout();
portNo = new QLineEdit();
// portNo->setMaximumSize(QSize(100, 30));
formLayout->addRow(new QLabel("Port"), portNo);
CText = new QTextEdit();
CText->setMinimumSize(QSize(0, 150));
CText->setMaximumSize(QSize(401, 150));
formLayout->addRow(new QLabel("CText"), CText);
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
buttonBox->setFont(*menufont);
verticalLayout->addWidget(buttonBox);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
verticalLayout->addLayout(formLayout);
verticalLayout->addWidget(buttonBox);
portNo->setText(QString::number(listenPort));
Enabled->setChecked(listenEnable);
CText->setText(listenCText);
}
ListenDialog::~ListenDialog()
{
}
void ListenDialog::myaccept()
{
QString val = portNo->text();
QByteArray qb = val.toLatin1();
char * ptr = qb.data();
listenPort = atoi(ptr);
listenEnable = Enabled->isChecked();
strcpy(listenCText, CText->toPlainText().toUtf8());
while ((ptr = strchr(listenCText, '\n')))
*ptr = '\r';
if (_server->isListening())
_server->close();
SaveSettings();
if (listenEnable)
_server->listen(QHostAddress::Any, listenPort);
ListenDialog::accept();
}
void ListenDialog::myreject()
{
ListenDialog::reject();
}