diff --git a/src/g.cpp b/src/g.cpp index f2d8e46..fd12253 100644 --- a/src/g.cpp +++ b/src/g.cpp @@ -38,8 +38,10 @@ namespace c { const QString HA_PAGE_TITLE = "{{PAGE_TITLE}}"; const QString HA_CUSTOM_CSS = "{{CUSTOM_CSS}}"; const QString HA_DAILY_UPLOAD = "{{DAILY_UPLOAD}}"; + const QString HA_DAILY_UPLOAD_DECIMAL = "{{DAILY_UPLOAD_DECIMAL}}"; const QString HA_DAILY_UPLOAD_MEASURE = "{{DAILY_UPLOAD_MEASURE}}"; const QString HA_DAILY_DOWNLOAD = "{{DAILY_DOWNLOAD}}"; + const QString HA_DAILY_DOWNLOAD_DECIMAL = "{{DAILY_DOWNLOAD_DECIMAL}}"; const QString HA_DAILY_DOWNLOAD_MEASURE = "{{DAILY_DOWNLOAD_MEASURE}}"; const QString HA_TOTAL_UPLOAD = "{{TOTAL_UPLOAD}}"; const QString HA_TOTAL_DOWNLOAD = "{{TOTAL_DOWNLOAD}}"; diff --git a/src/g.h b/src/g.h index 9f9dd31..96466f6 100644 --- a/src/g.h +++ b/src/g.h @@ -40,8 +40,10 @@ namespace c /* for Constants */ { extern const QString HA_PAGE_TITLE; extern const QString HA_CUSTOM_CSS; extern const QString HA_DAILY_UPLOAD; + extern const QString HA_DAILY_UPLOAD_DECIMAL; extern const QString HA_DAILY_UPLOAD_MEASURE; extern const QString HA_DAILY_DOWNLOAD; + extern const QString HA_DAILY_DOWNLOAD_DECIMAL; extern const QString HA_DAILY_DOWNLOAD_MEASURE; extern const QString HA_TOTAL_UPLOAD; extern const QString HA_TOTAL_DOWNLOAD; diff --git a/src/html/index.html b/src/html/index.html index 1e8189f..8b5c69a 100644 --- a/src/html/index.html +++ b/src/html/index.html @@ -37,6 +37,9 @@
{{DAILY_UPLOAD}}
+
+ {{DAILY_UPLOAD_DECIMAL}} +
{{DAILY_UPLOAD_MEASURE}}
@@ -68,6 +71,9 @@
{{DAILY_DOWNLOAD}}
+
+ {{DAILY_DOWNLOAD_DECIMAL}} +
{{DAILY_DOWNLOAD_MEASURE}}
diff --git a/src/html/main.css b/src/html/main.css index 1ef2085..aacd2ff 100644 --- a/src/html/main.css +++ b/src/html/main.css @@ -1 +1 @@ -*{box-sizing:border-box;outline:none;z-index:1}*:hover{outline:none}*:focus{outline:none}html{width:100%;font-size:16px;scroll-behavior:smooth}body{overflow-y:scroll;height:100%;line-height:1.42;margin:0;background-color:#fff;color:#000;height:100vh;font-family:monospace;font-size:16px}main{display:flex;flex-flow:column nowrap;align-items:stretch;justify-content:flex-start}ul,ol{padding:0;margin:0}li{list-style:none}a{text-decoration:none;color:inherit}a:hover{text-decoration:none}button{cursor:pointer;background-color:rgba(0,0,0,0);border:0px solid rgba(0,0,0,0);padding:0}button:focus,input:focus,a:focus,textarea:focus{text-decoration:none}button,input,textarea{font-family:inherit;font-size:inherit}textarea{resize:none}p{margin:0}h1,h2,h3,h4,h5{margin-top:0;margin-bottom:0;font-weight:normal;font-size:100%}img{display:block;max-width:100%;height:auto}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}table{border-collapse:collapse}input[type=checkbox]{margin:0}.wrapper{height:100%;padding:16px 0;flex:1}.container{max-width:648px;margin:0 auto;padding:0 5px}.section{margin-bottom:35px}.section__title{margin-bottom:10px;font-size:20px;font-weight:bold}.proxyService__title{text-align:center;font-size:50px;padding:12px 0;font-weight:bold}.handledTraffic{width:100%}.handledTraffic__blocks{width:100%;display:flex;flex-flow:row nowrap;align-items:start;justify-content:center;gap:10px}.handledTraffic__block{width:calc(50% - 5px)}.handledTraffic__block_download .handledTraffic__svg{fill:#91fd91}.handledTraffic__block_upload .handledTraffic__svg{fill:#ff6f6f}.handledTraffic__title{text-transform:uppercase;font-weight:bold;background-color:#ddd;padding:3px 5px;font-size:20px}.handledTraffic__amount{display:flex;flex-flow:row nowrap;align-items:stretch;justify-content:center;background-color:#aaa;padding:10px;border-top:1px solid #000;border-bottom:1px solid #000}.handledTraffic__icon{text-align:center;display:flex;flex-flow:column nowrap;align-items:center;justify-content:center;padding:3px 8px;margin-right:5px}.handledTraffic__icon .handledTraffic__svg{height:35px}.handledTraffic__number{line-height:1;font-size:56px;font-weight:bold;text-transform:uppercase;margin-right:8px}.handledTraffic__measure{font-size:18px;font-weight:bold;align-self:end}.handledTraffic__total{background-color:#ddd;padding:8px;font-size:16px;text-align:right}.handledTraffic__totalTitle{text-transform:uppercase;font-weight:bold}.accordeo__radio{display:none}.accordeo__radio:checked~.accordeo__dropdown{display:block}.accordeo__dropdown{display:none}.blockedDestinations__item{background-color:#ddd;overflow:hidden;white-space:nowrap;margin-bottom:5px;text-overflow:ellipsis}.blockedDestinations__url{display:block;width:100%;padding:3px 6px;cursor:pointer}.blockedDestinations__ipList{background-color:#aaa;padding-left:10px}.blockedDestinations__ipItem{padding:4px}.lastDestinations{width:100%;padding:5px 0}.lastDestinations__list{width:100%}.lastDestinations__item{width:100%;margin-bottom:5px;padding:3px 6px;overflow:hidden;text-overflow:ellipsis}.lastDestinations__item:last-child{margin-bottom:0}.lastDestinations__item_blocked{background-color:#888}.lastDestinations__item_allowed{background-color:#ddd}.topDestinations__block{margin-bottom:14px}.topDestinations__block:last-child{margin-bottom:0}.topDestinations__title{font-weight:bold;margin-bottom:10px}.topDestinations__item{padding:4px;overflow:hidden;white-space:nowrap;margin-bottom:5px;text-overflow:ellipsis;background-color:#ddd}.copyright{padding:10px 0;text-align:center;color:#888} +*{box-sizing:border-box;outline:none;z-index:1}*:hover{outline:none}*:focus{outline:none}html{width:100%;font-size:16px;scroll-behavior:smooth}body{overflow-y:scroll;height:100%;line-height:1.42;margin:0;background-color:#fff;color:#000;height:100vh;font-family:monospace;font-size:16px}main{display:flex;flex-flow:column nowrap;align-items:stretch;justify-content:flex-start}ul,ol{padding:0;margin:0}li{list-style:none}a{text-decoration:none;color:inherit}a:hover{text-decoration:none}button{cursor:pointer;background-color:rgba(0,0,0,0);border:0px solid rgba(0,0,0,0);padding:0}button:focus,input:focus,a:focus,textarea:focus{text-decoration:none}button,input,textarea{font-family:inherit;font-size:inherit}textarea{resize:none}p{margin:0}h1,h2,h3,h4,h5{margin-top:0;margin-bottom:0;font-weight:normal;font-size:100%}img{display:block;max-width:100%;height:auto}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}table{border-collapse:collapse}input[type=checkbox]{margin:0}.wrapper{height:100%;padding:16px 0;flex:1}.container{max-width:648px;margin:0 auto;padding:0 5px}.section{margin-bottom:35px}.section__title{margin-bottom:10px;font-size:20px;font-weight:bold}.proxyService__title{text-align:center;font-size:50px;padding:12px 0;font-weight:bold}.handledTraffic{width:100%}.handledTraffic__blocks{width:100%;display:flex;flex-flow:row nowrap;align-items:start;justify-content:center;gap:10px}.handledTraffic__block{width:calc(50% - 5px)}.handledTraffic__block_download .handledTraffic__svg{fill:#91fd91}.handledTraffic__block_upload .handledTraffic__svg{fill:#ff6f6f}.handledTraffic__title{text-transform:uppercase;font-weight:bold;background-color:#ddd;padding:3px 5px;font-size:20px}.handledTraffic__amount{display:flex;flex-flow:row nowrap;align-items:stretch;justify-content:center;background-color:#aaa;padding:10px;border-top:1px solid #000;border-bottom:1px solid #000}.handledTraffic__icon{text-align:center;display:flex;flex-flow:column nowrap;align-items:center;justify-content:center;padding:3px 8px;margin-right:8px}.handledTraffic__icon .handledTraffic__svg{height:35px}.handledTraffic__number{line-height:1;font-size:56px;font-weight:bold;text-transform:uppercase}.handledTraffic__decimal{line-height:1.3;align-self:end;font-size:28px;margin-right:12px}.handledTraffic__measure{font-size:18px;font-weight:bold;align-self:end;line-height:1.6}.handledTraffic__total{background-color:#ddd;padding:8px;font-size:16px;text-align:right}.handledTraffic__totalTitle{text-transform:uppercase;font-weight:bold}.accordeo__radio{display:none}.accordeo__radio:checked~.accordeo__dropdown{display:block}.accordeo__dropdown{display:none}.blockedDestinations__item{background-color:#ddd;overflow:hidden;white-space:nowrap;margin-bottom:5px;text-overflow:ellipsis}.blockedDestinations__url{display:block;width:100%;padding:3px 6px;cursor:pointer}.blockedDestinations__ipList{background-color:#aaa;padding-left:10px}.blockedDestinations__ipItem{padding:4px}.lastDestinations{width:100%;padding:5px 0}.lastDestinations__list{width:100%}.lastDestinations__item{width:100%;margin-bottom:5px;padding:3px 6px;overflow:hidden;text-overflow:ellipsis}.lastDestinations__item:last-child{margin-bottom:0}.lastDestinations__item_blocked{background-color:#888}.lastDestinations__item_allowed{background-color:#ddd}.topDestinations__block{margin-bottom:14px}.topDestinations__block:last-child{margin-bottom:0}.topDestinations__title{font-weight:bold;margin-bottom:10px}.topDestinations__item{padding:4px;overflow:hidden;white-space:nowrap;margin-bottom:5px;text-overflow:ellipsis;background-color:#ddd}.copyright{padding:10px 0;text-align:center;color:#888}/*# sourceMappingURL=main.min.css.map */ \ No newline at end of file diff --git a/src/webpage.cpp b/src/webpage.cpp index 1f3dda3..2225cde 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -25,7 +25,6 @@ along with this program. If not, see . #include #include #include -#include const QString WebPage::m_lastDestinationItemAllowed = "\
  • \n\ @@ -83,6 +82,13 @@ const QString WebPage::m_informationBlock = "\ \n\ \n"; +struct HumanReadableValue +{ + QString integer = "NaN"; + QString decimal = "0"; + QString measure = "anon"; +}; + QByteArray WebPage::document() { QFile src(":/html/index.html"); @@ -148,18 +154,20 @@ void WebPage::lastDestinations(QString &document) void WebPage::trafficBlock(QString &document) { auto dailyUpload = bytesToHumanReadableString( Statistics::dailyUpload() ); - document.replace(g::c::HA_DAILY_UPLOAD, dailyUpload.first); - document.replace(g::c::HA_DAILY_UPLOAD_MEASURE, dailyUpload.second); + document.replace(g::c::HA_DAILY_UPLOAD, dailyUpload.integer); + document.replace(g::c::HA_DAILY_UPLOAD_DECIMAL, dailyUpload.decimal); + document.replace(g::c::HA_DAILY_UPLOAD_MEASURE, dailyUpload.measure); auto dailyDownload = bytesToHumanReadableString( Statistics::dailyDownload() ); - document.replace(g::c::HA_DAILY_DOWNLOAD, dailyDownload.first); - document.replace(g::c::HA_DAILY_DOWNLOAD_MEASURE, dailyDownload.second); + document.replace(g::c::HA_DAILY_DOWNLOAD, dailyDownload.integer); + document.replace(g::c::HA_DAILY_DOWNLOAD_DECIMAL, dailyDownload.decimal); + document.replace(g::c::HA_DAILY_DOWNLOAD_MEASURE, dailyDownload.measure); auto totalUpload = bytesToHumanReadableString( Statistics::totalUpload() ); - document.replace(g::c::HA_TOTAL_UPLOAD, totalUpload.first + " " + totalUpload.second); + document.replace(g::c::HA_TOTAL_UPLOAD, totalUpload.integer + " " + totalUpload.measure); auto totalDownload = bytesToHumanReadableString( Statistics::totalDownload() ); - document.replace(g::c::HA_TOTAL_DOWNLOAD, totalDownload.first + " " + totalDownload.second); + document.replace(g::c::HA_TOTAL_DOWNLOAD, totalDownload.integer + " " + totalDownload.measure); } void WebPage::topDestinations(QString &document) @@ -306,47 +314,64 @@ QString WebPage::blockedDestinationItem(const QString &destination, const QStrin return result; } -QPair WebPage::bytesToHumanReadableString(quint64 bytes) +HumanReadableValue WebPage::bytesToHumanReadableString(quint64 bytes) { - QPair result; + HumanReadableValue result; - constexpr const qint64 thresh = 1024; + constexpr const quint64 BYTE = 1024; - if (bytes < thresh) + if (bytes < BYTE) { - result.first = QString::number(bytes); - result.second = "B"; + result.integer = QString::number(bytes); + result.decimal = "0"; + result.measure = "B"; } - else if (bytes <= thresh*thresh) + else if (bytes <= BYTE*BYTE) { - result.first = QString::number(bytes/thresh); - result.second = "KiB"; + result.integer = QString::number(bytes/BYTE); + result.decimal = QString::number(bytes%BYTE); + result.measure = "KiB"; } - else if (bytes <= thresh*thresh*thresh) + else if (bytes <= BYTE*BYTE*BYTE) { - result.first = QString::number(bytes/thresh/thresh); - result.second = "MiB"; + result.integer = QString::number(bytes /BYTE/BYTE); + result.decimal = QString::number(bytes% (BYTE*BYTE)); + result.measure = "MiB"; } - else if (bytes <= thresh*thresh*thresh*thresh) + else if (bytes <= BYTE*BYTE*BYTE*BYTE) { - result.first = QString::number(bytes/thresh/thresh/thresh); - result.second = "GiB"; + result.integer = QString::number(bytes /BYTE/BYTE/BYTE); + result.decimal = QString::number(bytes% (BYTE*BYTE*BYTE)); + result.measure = "GiB"; } - else if (bytes <= thresh*thresh*thresh*thresh*thresh) + else if (bytes <= BYTE*BYTE*BYTE*BYTE*BYTE) { - result.first = QString::number(bytes/thresh/thresh/thresh/thresh); - result.second = "TiB"; + result.integer = QString::number(bytes /BYTE/BYTE/BYTE/BYTE); + result.decimal = QString::number(bytes% (BYTE*BYTE*BYTE*BYTE)); + result.measure = "TiB"; } - else if (bytes <= thresh*thresh*thresh*thresh*thresh*thresh) + else { - result.first = QString::number(bytes/thresh/thresh/thresh/thresh/thresh); - result.second = "PiB"; + result.integer = QString::number(bytes /BYTE/BYTE/BYTE/BYTE/BYTE); + result.decimal = QString::number(bytes% (BYTE*BYTE*BYTE*BYTE*BYTE)); + result.integer = "PiB"; } + if (result.decimal.size() > 2) + { + result.decimal = result.decimal.remove(2, result.decimal.size()-2); + } + else if (result.decimal.size() < 2) + { + result.decimal.push_back('0'); + } + + result.decimal.push_front('.'); + return result; } diff --git a/src/webpage.h b/src/webpage.h index d6e1fc9..6f91cd3 100644 --- a/src/webpage.h +++ b/src/webpage.h @@ -22,6 +22,8 @@ along with this program. If not, see . #include #include +struct HumanReadableValue; + class WebPage { public: @@ -43,7 +45,7 @@ private: static QString dailyTopDestinationItem(const QString& destination, quint64 count); static QString totalTopDestinationItem(const QString& destination, quint64 count); static QString blockedDestinationItem(const QString& destination, const QStringList& addresses); - static QPair bytesToHumanReadableString(quint64 bytes); // count, measure + static HumanReadableValue bytesToHumanReadableString(quint64 bytes); static const QString m_lastDestinationItemAllowed; static const QString m_lastDestinationItemBlocked;