LCOV - code coverage report
Current view: top level - src/cli - infocommand.cpp (source / functions) Hit Total Coverage
Project: Dokit Lines: 51 57 89.5 %
Version: Functions: 6 7 85.7 %

          Line data    Source code
       1             : // SPDX-FileCopyrightText: 2022-2023 Paul Colby <git@colby.id.au>
       2             : // SPDX-License-Identifier: LGPL-3.0-or-later
       3             : 
       4             : #include "infocommand.h"
       5             : 
       6             : #include <qtpokit/deviceinfoservice.h>
       7             : #include <qtpokit/pokitdevice.h>
       8             : 
       9             : #include <QJsonDocument>
      10             : #include <QJsonObject>
      11             : 
      12             : #include <iostream>
      13             : 
      14             : /*!
      15             :  * \class InfoCommand
      16             :  *
      17             :  * The InfoCommand class implements the `info` CLI command.
      18             :  */
      19             : 
      20             : /*!
      21             :  * Construct a new InfoCommand object with \a parent.
      22             :  */
      23         384 : InfoCommand::InfoCommand(QObject * const parent) : DeviceCommand(parent)
      24             : {
      25             : 
      26         384 : }
      27             : 
      28          90 : QStringList InfoCommand::requiredOptions(const QCommandLineParser &parser) const
      29             : {
      30         180 :     return DeviceCommand::requiredOptions(parser) + QStringList{
      31         175 :     };
      32             : }
      33             : 
      34          36 : QStringList InfoCommand::supportedOptions(const QCommandLineParser &parser) const
      35             : {
      36          36 :     return DeviceCommand::supportedOptions(parser);
      37             : }
      38             : 
      39             : /*!
      40             :  * \copybrief DeviceCommand::processOptions
      41             :  *
      42             :  * This implementation extends DeviceCommand::processOptions to process additional CLI options
      43             :  * supported (or required) by this command.
      44             :  */
      45          18 : QStringList InfoCommand::processOptions(const QCommandLineParser &parser)
      46             : {
      47          18 :     QStringList errors = DeviceCommand::processOptions(parser);
      48             :     if (!errors.isEmpty()) {
      49             :         return errors;
      50             :     }
      51             : 
      52             :     return errors;
      53             : }
      54             : 
      55             : /*!
      56             :  * \copybrief DeviceCommand::getService
      57             :  *
      58             :  * This override returns a pointer to a DeviceInfoService object.
      59             :  */
      60           0 : AbstractPokitService * InfoCommand::getService()
      61             : {
      62             :     Q_ASSERT(device);
      63           0 :     if (!service) {
      64           0 :         service = device->deviceInformation();
      65             :         Q_ASSERT(service);
      66             :     }
      67           0 :     return service;
      68             : }
      69             : 
      70             : /*!
      71             :  * \copybrief DeviceCommand::serviceDetailsDiscovered
      72             :  *
      73             :  * This override fetches the current device's information, and outputs it in the selected format.
      74             :  */
      75         312 : void InfoCommand::serviceDetailsDiscovered()
      76             : {
      77         312 :     DeviceCommand::serviceDetailsDiscovered(); // Just logs consistently.
      78         312 :     const QLowEnergyController * const controller = (device) ? device->controller() : nullptr;
      79         312 :     const QString deviceName = (controller) ? controller->remoteName() : QString();
      80         312 :     const QBluetoothAddress deviceAddress = (controller) ? controller->remoteAddress() : QBluetoothAddress();
      81         312 :     const QBluetoothUuid deviceUuid = (controller) ? controller->remoteDeviceUuid() : QBluetoothUuid();
      82         312 :     const QString serialNumber = service->serialNumber();
      83         312 :     switch (format) {
      84         104 :     case OutputFormat::Csv:
      85         136 :         std::cout << qUtf8Printable(tr("device_name,device_address,device_uuid,manufacturer_name,model_number,"
      86             :                             "hardware_revision,firmware_revision,software_revision,serial_number\n"));
      87         398 :         std::cout << qUtf8Printable(QString::fromLatin1("%1,%2,%3,%4,%5,%6,%7,%8,%9\n").arg(
      88             :             escapeCsvField(deviceName),
      89             :             (deviceAddress.isNull()) ? QString() : deviceAddress.toString(),
      90             :             (deviceUuid.isNull()) ? QString() : deviceUuid.toString(),
      91             :             escapeCsvField(service->manufacturer()), escapeCsvField(service->modelNumber()),
      92             :             escapeCsvField(service->hardwareRevision()), escapeCsvField(service->firmwareRevision()),
      93             :             escapeCsvField(service->softwareRevision()), escapeCsvField(serialNumber)));
      94         104 :         break;
      95          28 :     case OutputFormat::Json: {
      96             :         QJsonObject jsonObject{
      97         208 :             { QLatin1String("manufacturerName"), service->manufacturer() },
      98         208 :             { QLatin1String("modelNumber"),      service->modelNumber() },
      99         208 :             { QLatin1String("hardwareRevision"), service->hardwareRevision() },
     100         208 :             { QLatin1String("firmwareRevision"), service->firmwareRevision() },
     101         208 :             { QLatin1String("softwareRevision"), service->softwareRevision() },
     102        1252 :         };
     103         104 :         if (!deviceName.isEmpty()) {
     104         109 :             jsonObject.insert(QLatin1String("deviceName"), deviceName);
     105             :         }
     106         104 :         if (!deviceAddress.isNull()) {
     107          19 :             jsonObject.insert(QLatin1String("deviceAddress"), deviceAddress.toString());
     108             :         }
     109         104 :         if (!deviceUuid.isNull()) {
     110          36 :             jsonObject.insert(QLatin1String("deviceUuid"), deviceUuid.toString());
     111             :         }
     112         104 :         if (!serialNumber.isNull()) {
     113           0 :             jsonObject.insert(QLatin1String("serialNumber"), serialNumber);
     114             :         }
     115         208 :         std::cout << QJsonDocument(jsonObject).toJson().toStdString();
     116         104 :     }   break;
     117             :     case OutputFormat::Text:
     118         104 :         if (!deviceName.isEmpty()) {
     119         200 :             std::cout << qUtf8Printable(tr("Device name:       %1\n").arg(deviceName));
     120             :         }
     121         104 :         if (!deviceAddress.isNull()) {
     122          32 :             std::cout << qUtf8Printable(tr("Device addres:     %1\n").arg(deviceAddress.toString()));
     123             :         }
     124         104 :         if (!deviceUuid.isNull()) {
     125          88 :             std::cout << qUtf8Printable(tr("Device UUID:       %1\n").arg(deviceUuid.toString()));
     126             :         }
     127         240 :         std::cout << qUtf8Printable(tr("Manufacturer name: %1\n").arg(service->manufacturer()));
     128         240 :         std::cout << qUtf8Printable(tr("Model number:      %1\n").arg(service->modelNumber()));
     129         240 :         std::cout << qUtf8Printable(tr("Hardware revision: %1\n").arg(service->hardwareRevision()));
     130         240 :         std::cout << qUtf8Printable(tr("Firmware revision: %1\n").arg(service->firmwareRevision()));
     131         240 :         std::cout << qUtf8Printable(tr("Software revision: %1\n").arg(service->softwareRevision()));
     132         104 :         if (!serialNumber.isNull()) {
     133           0 :             std::cout << qUtf8Printable(tr("Serial number:     %1\n").arg(serialNumber));
     134             :         }
     135             :         break;
     136             :     }
     137         312 :     if (device) disconnect(); // Will exit the application once disconnected.
     138         716 : }

Generated by: LCOV version 1.14