diff --git a/qmac/mac.cpp b/qmac/mac.cpp --- a/qmac/mac.cpp +++ b/qmac/mac.cpp @@ -1,15 +1,187 @@ #include "qmac.h" +#include + +//заголовочный файл подсистемы MAC библиотеки PARSEC (мандатное разграничения доступа) +#include + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +class FileMacData : public QSharedData +{ + friend class ProcessMacData; +public: + FileMacData(const QString& a_fileName); + ~FileMacData(); + + int level() const { return _level; } + QString levelText() const { return _levelText; } + QString categoryText() const { return _categoryText; } + QString fileName() const { return _fileName; } + +private: + mac_t _mac; + int _level; + QString _levelText; + QString _categoryText; + QString _fileName; +}; + +FileMacData::FileMacData(const QString& a_fileName) + : _fileName(a_fileName) +{ + //получение метки файла по его имени + _mac = mac_get_file(a_fileName.toLocal8Bit().constData()); + + //числовое представление метки файла + _level = mac_get_lev(_mac); + + //текстовое представление метки файла + ssize_t size; + wchar_t* wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_LEV); + + _levelText = QString::fromWCharArray(wtext, size); + + //освободить память, выделенную функцией mac_to_wtext + free(wtext); + + //текстовое представление списка категорий + wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_CAT); + + _categoryText = QString::fromWCharArray(wtext, size); + + //освободить память, выделенную функцией mac_to_wtext + free(wtext); +} + +FileMacData::~FileMacData() +{ + mac_free(_mac); +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +FileMac::FileMac(const QString& a_fileName) + : d(new FileMacData(a_fileName)) +{ +} + +FileMac::~FileMac() = default; + +//--------------------------------------------------------------------------- +int FileMac::level() const +{ + return d->level(); +} + +QString FileMac::levelText() const +{ + return d->levelText(); +} + +QString FileMac::categoryText() const +{ + return d->categoryText(); +} + +QString FileMac::fileName() const +{ + return d->fileName(); +} + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +class ProcessMacData : public QSharedData +{ +public: + ProcessMacData(); + ~ProcessMacData(); + + int level() const { return _level; } + QString levelText() const { return _levelText; } + QString categoryText() const { return _categoryText; } + bool canRead(const FileMacData& a_fileMacData); + bool canWrite(const FileMacData& a_fileMacData); + +private: + mac_t _mac; + int _level; + QString _levelText; + QString _categoryText; +}; + +ProcessMacData::ProcessMacData() +{ + //получение метки текущего процесса, то же, что mac_get_pid(0) или mac_get_pid(pid) + _mac = mac_get_proc(); + + //числовое представление метки процесса + _level = mac_get_lev(_mac); + + //текстовое представление метки процесса + ssize_t size; + wchar_t* wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_LEV); + + _levelText = QString::fromWCharArray(wtext, size); + + //освободить память, выделенную функцией mac_to_wtext + free(wtext); + + //текстовое представление списка категорий + wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_CAT); + + _categoryText = QString::fromWCharArray(wtext, size); + + //освободить память, выделенную функцией mac_to_wtext + free(wtext); +} + +ProcessMacData::~ProcessMacData() +{ + mac_free(_mac); +} + +//--------------------------------------------------------------------------- +bool ProcessMacData::canRead(const FileMacData& a_fileMacData) +{ + return 0 == mac_file_permit(_mac, a_fileMacData._mac, R_OK); +} + +//--------------------------------------------------------------------------- +bool ProcessMacData::canWrite(const FileMacData& a_fileMacData) +{ + return 0 == mac_file_permit(_mac, a_fileMacData._mac, W_OK); +} //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- ProcessMac::ProcessMac() + : d(new ProcessMacData) { +} -} +ProcessMac::~ProcessMac() = default; //--------------------------------------------------------------------------- -//--------------------------------------------------------------------------- -FileMac::FileMac() +int ProcessMac::level() const +{ + return d->level(); +} + +QString ProcessMac::levelText() const +{ + return d->levelText(); +} + +QString ProcessMac::categoryText() const { + return d->categoryText(); +} +bool ProcessMac::canRead(const FileMac& a_fileMac) +{ + return d->canRead(*(a_fileMac.d)); } + +bool ProcessMac::canWrite(const FileMac& a_fileMac) +{ + return d->canWrite(*(a_fileMac.d)); +}