/** * @file printer.cpp * @brief Send drive data to printer service using ipc msg queue * @author Hendrik Schutter * @date 24.11.2022 */ #include "../include/reHDD.h" bool Printer::instanceFlag = false; Printer *Printer::single = NULL; /** * \brief create new Printer instance * \param path to log file * \param struct with data * \return instance of Printer */ Printer::Printer() { if (-1 == (this->msqid = msgget((key_t)IPC_MSG_QUEUE_KEY, IPC_CREAT | 0666))) { Logger::logThis()->error("Printer: Create mgs queue failed!"); } } /** * \brief deconstructor * \return void */ Printer::~Printer() { instanceFlag = false; } /** * \brief send data to msg queue * \return void */ void Printer::print(Drive *drive) { t_msgQueueData msgQueueData; msgQueueData.msg_queue_type = 1; snprintf(msgQueueData.driveData.caDriveIndex, STR_BUFFER_SIZE, "%i", drive->u16DriveIndex); snprintf(msgQueueData.driveData.caDriveState, STR_BUFFER_SIZE, "shredded"); snprintf(msgQueueData.driveData.caDriveModelFamily, STR_BUFFER_SIZE, "%s", drive->getModelFamily().c_str()); snprintf(msgQueueData.driveData.caDriveModelName, STR_BUFFER_SIZE, "%s", drive->getModelName().c_str()); snprintf(msgQueueData.driveData.caDriveCapacity, STR_BUFFER_SIZE, "%li", drive->getCapacity()); snprintf(msgQueueData.driveData.caDriveSerialnumber, STR_BUFFER_SIZE, "%s", drive->getSerial().c_str()); snprintf(msgQueueData.driveData.caDriveHours, STR_BUFFER_SIZE, "%i", drive->getPowerOnHours()); snprintf(msgQueueData.driveData.caDriveCycles, STR_BUFFER_SIZE, "%i", drive->getPowerCycles()); snprintf(msgQueueData.driveData.caDriveErrors, STR_BUFFER_SIZE, "%i", drive->getErrorCount()); snprintf(msgQueueData.driveData.caDriveShredTimestamp, STR_BUFFER_SIZE, "%li", drive->getActionStartTimestamp()); snprintf(msgQueueData.driveData.caDriveShredDuration, STR_BUFFER_SIZE, "%li", drive->getTaskDuration()); switch (drive->connectionType) { case Drive::ConnectionType::USB: strncpy(msgQueueData.driveData.caDriveConnectionType, "usb", STR_BUFFER_SIZE); break; case Drive::ConnectionType::SATA: strncpy(msgQueueData.driveData.caDriveConnectionType, "sata", STR_BUFFER_SIZE); break; case Drive::ConnectionType::NVME: strncpy(msgQueueData.driveData.caDriveConnectionType, "nvme", STR_BUFFER_SIZE); break; case Drive::ConnectionType::UNKNOWN: default: strncpy(msgQueueData.driveData.caDriveConnectionType, "na", STR_BUFFER_SIZE); } snprintf(msgQueueData.driveData.caDriveReHddVersion, STR_BUFFER_SIZE, "%s", REHDD_VERSION); if (-1 == msgsnd(this->msqid, &msgQueueData, sizeof(t_msgQueueData) - sizeof(long), 0)) { Logger::logThis()->error("Printer: Send mgs queue failed!"); } else { Logger::logThis()->info("Printer: print triggered - Drive: " + drive->getSerial()); } } /** * \brief return a instance of the printer * \return printer obj */ Printer *Printer::getPrinter() { if (!instanceFlag) { single = new Printer(); // create new obj instanceFlag = true; return single; } else { return single; // return existing obj } }