#include "cast.h"
// This file is part of MRCI.
// MRCI 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.
// MRCI 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 MRCI under the LICENSE.md file. If not, see
// .
Cast::Cast(QObject *parent) : InternCommand(parent) {}
OpenSubChannel::OpenSubChannel(QObject *parent) : InternCommand(parent) {}
CloseSubChannel::CloseSubChannel(QObject *parent) : InternCommand(parent) {}
LsOpenChannels::LsOpenChannels(QObject *parent) : InternCommand(parent) {}
PingPeers::PingPeers(QObject *parent) : InternCommand(parent) {}
AddRDOnlyFlag::AddRDOnlyFlag(QObject *parent) : InternCommand(parent) {}
RemoveRDOnlyFlag::RemoveRDOnlyFlag(QObject *parent) : InternCommand(parent) {}
ListRDonlyFlags::ListRDonlyFlags(QObject *parent) : TableViewer(parent)
{
setParams(TABLE_RDONLY_CAST, QStringList() << COLUMN_SUB_CH_ID << COLUMN_ACCESS_LEVEL << COLUMN_CHANNEL_NAME, false);
}
QString Cast::cmdName() {return "cast";}
QString OpenSubChannel::cmdName() {return "open_sub_ch";}
QString CloseSubChannel::cmdName() {return "close_sub_ch";}
QString LsOpenChannels::cmdName() {return "ls_open_chs";}
QString PingPeers::cmdName() {return "ping_peers";}
QString AddRDOnlyFlag::cmdName() {return "add_rdonly_flag";}
QString RemoveRDOnlyFlag::cmdName() {return "rm_rdonly_flag";}
QString ListRDonlyFlags::cmdName() {return "ls_rdonly_flags";}
void Cast::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
Q_UNUSED(sharedObjs);
emit castToPeers(binIn, dType);
}
void OpenSubChannel::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
Q_UNUSED(sharedObjs);
if (dType == TEXT)
{
QStringList args = parseArgs(binIn, 4);
QString ch = getParam("-ch_name", args);
QString sub = getParam("-sub_name", args);
if (ch.isEmpty())
{
errTxt("err: Channel name (-ch_name) argument not found or is empty.\n");
}
else if (sub.isEmpty())
{
errTxt("err: Sub-Channel name (-sub_name) argument not found or is empty.\n");
}
else
{
emit openChByName(ch, sub);
}
}
}
void CloseSubChannel::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
Q_UNUSED(sharedObjs);
if (dType == TEXT)
{
QStringList args = parseArgs(binIn, 4);
QString ch = getParam("-ch_name", args);
QString sub = getParam("-sub_name", args);
if (ch.isEmpty())
{
errTxt("err: Channel name (-ch_name) argument not found or is empty.\n");
}
else if (sub.isEmpty())
{
errTxt("err: Sub-Channel name (-sub_name) argument not found or is empty.\n");
}
else
{
emit closeChByName(ch, sub);
}
}
}
void LsOpenChannels::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
Q_UNUSED(binIn);
if (dType == TEXT)
{
Query db;
QList tableData;
QStringList separators;
QList justLens;
for (int i = 0; i < 5; ++i)
{
justLens.append(14);
separators.append("-------");
}
tableData.append(QStringList() << COLUMN_CHANNEL_NAME << COLUMN_SUB_CH_NAME << COLUMN_CHANNEL_ID << COLUMN_SUB_CH_ID << "read_only");
tableData.append(separators);
for (int i = 0; i < sharedObjs->chIds->size(); i += 9)
{
quint64 chId = rdInt(QByteArray::fromRawData(sharedObjs->chIds->data() + i, 8));
quint64 subId = rdInt(QByteArray::fromRawData(sharedObjs->chIds->data() + (i + 8), 1));
if (chId)
{
QStringList columnData;
db.setType(Query::PULL, TABLE_SUB_CHANNELS);
db.addColumn(COLUMN_SUB_CH_NAME);
db.addColumn(COLUMN_CHANNEL_NAME);
db.addCondition(COLUMN_CHANNEL_ID, chId);
db.addCondition(COLUMN_SUB_CH_ID, subId);
db.exec();
QByteArray subCh = QByteArray::fromRawData(sharedObjs->chIds->data() + i, 9);
QString chName = db.getData(COLUMN_CHANNEL_NAME).toString();
QString subName = db.getData(COLUMN_SUB_CH_NAME).toString();
QString rdOnly;
if (chPos(subCh, *sharedObjs->wrAbleChIds) != -1)
{
rdOnly = "1";
}
else
{
rdOnly = "0";
}
columnData.append(chName);
columnData.append(subName);
columnData.append(QString::number(chId));
columnData.append(QString::number(subId));
columnData.append(rdOnly);
for (int k = 0; k < justLens.size(); ++k)
{
if (justLens[k] < columnData[k].size()) justLens[k] = columnData[k].size();
}
tableData.append(columnData);
}
}
mainTxt("\n");
for (auto&& row : tableData)
{
for (int i = 0; i < row.size(); ++i)
{
mainTxt(row[i].leftJustified(justLens[i] + 2, ' '));
}
mainTxt("\n");
}
}
}
void PingPeers::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
Q_UNUSED(binIn);
if (dType == TEXT)
{
if (!(*sharedObjs->activeUpdate))
{
errTxt("err: You don't currently have any active update sub-channels open. sending a ping request is pointless because peers won't be able to respond.\n");
}
else
{
QByteArray castHeader = *sharedObjs->chIds + wrInt(PING_PEERS, 8);
QByteArray data = toPEER_INFO(sharedObjs);
emit backendDataOut(ASYNC_LIMITED_CAST, castHeader + data, PUB_IPC);
}
}
}
void AddRDOnlyFlag::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
if (dType == TEXT)
{
QStringList args = parseArgs(binIn, 6);
QString chName = getParam("-ch_name", args);
QString subId = getParam("-sub_id", args);
QString level = getParam("-level", args);
if (chName.isEmpty())
{
errTxt("err: The channel name (-ch_name) argument was not found or is empty.\n");
}
else if (subId.isEmpty())
{
errTxt("err: The sub-channel id (-sub_id) was not found or is empty.\n");
}
else if (level.isEmpty())
{
errTxt("err: The privilage level (-level) argument was not found or is empty.\n");
}
else if (!validChName(chName))
{
errTxt("err: Invalid channel name.\n");
}
else if (!validSubId(subId))
{
errTxt("err: Invalid sub-channel id. valid range (0-255).\n");
}
else if (!validLevel(level, true))
{
errTxt("err: Invalid privilage level. valid range (1-5).\n");
}
else if (!channelExists(chName))
{
errTxt("err: Channel name '" + chName + "' does not exists.\n");
}
else if (channelAccessLevel(sharedObjs, chName) > ADMIN)
{
errTxt("err: Access denied.\n");
}
else if (rdOnlyFlagExists(chName, static_cast(subId.toInt()), level.toInt()))
{
errTxt("err: A read only flag for sub-id: " + QString::number(subId.toInt()) + " level: " + QString::number(level.toInt()) + " already exists.\n");
}
else
{
Query db(this);
db.setType(Query::PUSH, TABLE_RDONLY_CAST);
db.addColumn(COLUMN_CHANNEL_NAME, chName);
db.addColumn(COLUMN_SUB_CH_ID, subId.toInt());
db.addColumn(COLUMN_ACCESS_LEVEL, level.toInt());
db.exec();
emit backendDataOut(ASYNC_ADD_RDONLY, toTEXT(args.join(' ')), PUB_IPC_WITH_FEEDBACK);
}
}
}
void RemoveRDOnlyFlag::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
if (dType == TEXT)
{
QStringList args = parseArgs(binIn, 6);
QString chName = getParam("-ch_name", args);
QString subId = getParam("-sub_id", args);
QString level = getParam("-level", args);
if (chName.isEmpty())
{
errTxt("err: The channel name (-ch_name) argument was not found or is empty.\n");
}
else if (subId.isEmpty())
{
errTxt("err: The sub-channel id (-sub_id) was not found or is empty.\n");
}
else if (level.isEmpty())
{
errTxt("err: The privilage level (-level) argument was not found or is empty.\n");
}
else if (!validChName(chName))
{
errTxt("err: Invalid channel name.\n");
}
else if (!validSubId(subId))
{
errTxt("err: Invalid sub-channel id. valid range (0-255).\n");
}
else if (!validLevel(level, true))
{
errTxt("err: Invalid privilage level. valid range (1-5).\n");
}
else if (!channelExists(chName))
{
errTxt("err: Channel name '" + chName + "' does not exists.\n");
}
else if (channelAccessLevel(sharedObjs, chName) > ADMIN)
{
errTxt("err: Access denied.\n");
}
else if (!rdOnlyFlagExists(chName, static_cast(subId.toInt()), level.toInt()))
{
errTxt("err: A read only flag for sub-id: " + QString::number(subId.toInt()) + " level: " + QString::number(level.toInt()) + " does not exists.\n");
}
else
{
Query db(this);
db.setType(Query::DEL, TABLE_RDONLY_CAST);
db.addCondition(COLUMN_CHANNEL_NAME, chName);
db.addCondition(COLUMN_SUB_CH_ID, subId.toInt());
db.addCondition(COLUMN_ACCESS_LEVEL, level.toInt());
db.exec();
emit backendDataOut(ASYNC_RM_RDONLY, toTEXT(args.join(' ')), PUB_IPC_WITH_FEEDBACK);
}
}
}
void ListRDonlyFlags::procBin(const SharedObjs *sharedObjs, const QByteArray &binIn, uchar dType)
{
if (dType == TEXT)
{
if (moreInputEnabled())
{
TableViewer::procBin(sharedObjs, binIn, dType);
}
else
{
QStringList args = parseArgs(binIn, 2);
QString chName = getParam("-ch_name", args);
if (chName.isEmpty())
{
errTxt("err: The channel name (-ch_name) argument was not found or is empty.\n");
}
else if (!validChName(chName))
{
errTxt("err: Invalid channel name.\n");
}
else if (!channelExists(chName))
{
errTxt("err: Channel name '" + chName + "' does not exists.\n");
}
else
{
if (channelAccessLevel(sharedObjs, chName) > REGULAR)
{
TableViewer::procBin(sharedObjs, toTEXT("-" + QString(COLUMN_CHANNEL_NAME) + " " + chName + " -" + QString(COLUMN_LOWEST_LEVEL) + " " + QString::number(PUBLIC)), dType);
}
else
{
TableViewer::procBin(sharedObjs, toTEXT("-" + QString(COLUMN_CHANNEL_NAME) + " " + chName), dType);
}
}
}
}
}