qsysinfo.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. #include "qappctrl.h"
  2. #include "../../src/defines.h"
  3. /////////////////////////////////////////////////////////////////////////////
  4. /////////////////////////////////////////////////////////////////////////////
  5. /////////////////////////////////////////////////////////////////////////////
  6. #define _countof(a) (sizeof(a) / sizeof(*a))
  7. #define _BYTE_SIZE_KIB (1ULL << 10) // Kibibyte
  8. #define _BYTE_SIZE_MIB (1ULL << 20) // Mebibyte
  9. #define _BYTE_SIZE_GIB (1ULL << 30) // Gibibyte
  10. #define _BYTE_SIZE_TIB (1ULL << 40) // Tebibyte
  11. #define _BYTE_SIZE_PIB (1ULL << 50) // Pebibyte
  12. #define _BYTE_SIZE_EIB (1ULL << 60) // Exbibyte
  13. static const char *_FormatByteSize(unsigned long long nCb, char *pszBuf, size_t nCChBuf, bool bShortUnits = true, int nPrec = 1);
  14. /////////////////////////////////////////////////////////////////////////////
  15. static const char *_FormatByteSize(unsigned long long nCb, char *pszBuf, size_t nCChBuf, bool bShortUnits, int nPrec)
  16. {
  17. if(pszBuf && nCChBuf)
  18. {
  19. double val = nCb;
  20. if(nCb < _BYTE_SIZE_KIB)
  21. {
  22. snprintf(pszBuf, nCChBuf, "%llu %s", nCb, bShortUnits ? "" : "Byte"); // Byte
  23. }
  24. else if(nCb < _BYTE_SIZE_MIB)
  25. {
  26. val /= _BYTE_SIZE_KIB;
  27. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "K" : "KiB"); // KiB
  28. }
  29. else if(nCb < _BYTE_SIZE_GIB)
  30. {
  31. val /= _BYTE_SIZE_MIB;
  32. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "M" : "MiB"); // MiB
  33. }
  34. else if(nCb < _BYTE_SIZE_TIB)
  35. {
  36. val /= _BYTE_SIZE_GIB;
  37. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "G" : "GiB"); // GiB
  38. }
  39. else if(nCb < _BYTE_SIZE_PIB)
  40. {
  41. val /= _BYTE_SIZE_TIB;
  42. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "T" : "TiB"); // TiB
  43. }
  44. else if(nCb < _BYTE_SIZE_EIB)
  45. {
  46. val /= _BYTE_SIZE_PIB;
  47. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "P" : "PiB"); // PiB
  48. }
  49. return pszBuf;
  50. }
  51. return NULL;
  52. }
  53. /////////////////////////////////////////////////////////////////////////////
  54. typedef enum
  55. {
  56. SDR_DiskName = Qt::UserRole,
  57. SDR_DiskDevNode,
  58. SDR_DiskBusType,
  59. SDR_DiskVendorName,
  60. SDR_DiskVendorID,
  61. SDR_DiskProductID,
  62. SDR_PartFsLabel,
  63. SDR_PartFsType,
  64. SDR_PartFsVersion,
  65. SDR_PartDevNode,
  66. SDR_PartMountPoint,
  67. SDR_PartSize,
  68. SDR_PartFsSize,
  69. SDR_PartFsFree,
  70. SDR_PartFsUsed
  71. }StgDevRoles;
  72. typedef struct _STG_DEV_ROLES
  73. {
  74. int nRole;
  75. const char *pszRoleName;
  76. }STG_DEV_ROLES, *LPSTG_DEV_ROLES;
  77. typedef const STG_DEV_ROLES *LPCSTG_DEV_ROLES;
  78. /////////////////////////////////////////////////////////////////////////////
  79. static const STG_DEV_ROLES g_roles[] =
  80. {
  81. {SDR_DiskName, "DiskName"},
  82. {SDR_DiskDevNode, "DiskDevNode"},
  83. {SDR_DiskBusType, "DiskBusType"},
  84. {SDR_DiskVendorName, "DiskVendorName"},
  85. {SDR_DiskVendorID, "DiskVendorID"},
  86. {SDR_DiskProductID, "DiskProductID"},
  87. {SDR_PartFsLabel, "PartFsLabel"},
  88. {SDR_PartFsType, "PartFsType"},
  89. {SDR_PartFsVersion, "PartFsVersion"},
  90. {SDR_PartDevNode, "PartDevNode"},
  91. {SDR_PartMountPoint, "PartMountPoint"},
  92. {SDR_PartSize, "PartSize"},
  93. {SDR_PartFsSize, "PartFsSize"},
  94. {SDR_PartFsFree, "PartFsFree"},
  95. {SDR_PartFsUsed, "PartFsUsed"}
  96. };
  97. /////////////////////////////////////////////////////////////////////////////
  98. QGfaStgDevList::QGfaStgDevList(QObject *pParent) : QAbstractTableModel(pParent)
  99. {
  100. memset(&m_stgDevShadowCpy, 0, sizeof(m_stgDevShadowCpy));
  101. setObjectName("QGfaStgDevList");
  102. }
  103. QGfaStgDevList::~QGfaStgDevList(void)
  104. {
  105. }
  106. int QGfaStgDevList::rowCount(const QModelIndex &parent) const
  107. {
  108. Q_UNUSED(parent);
  109. return (int)m_partVec.size();
  110. }
  111. int QGfaStgDevList::columnCount(const QModelIndex &parent) const
  112. {
  113. Q_UNUSED(parent);
  114. return (int)_countof(g_roles);
  115. }
  116. #define _OPT_STRING(s, o) (*s ? s : o)
  117. #define _NA_STRING(s) _OPT_STRING(s, "n/a")
  118. QVariant QGfaStgDevList::data(const QModelIndex &index, int role) const
  119. {
  120. if(!index.isValid())
  121. return QVariant();
  122. QVariant val;
  123. char szBuf[64];
  124. int nIndex = index.row();
  125. const STG_DEV_DISK_PART &dp = m_partVec[nIndex];
  126. const GFA_SYSINFO_DISK &disk = m_stgDevShadowCpy.disks[dp.nDiskIdx];
  127. const GFA_SYSINFO_PARTITION &part = m_stgDevShadowCpy.parts[dp.nPartIdx];
  128. if(disk.valid && part.valid)
  129. {
  130. switch(role)
  131. {
  132. case SDR_DiskName:
  133. val = _NA_STRING(disk.szName);
  134. break;
  135. case SDR_DiskDevNode:
  136. val = _NA_STRING(disk.szDevNode);
  137. break;
  138. case SDR_DiskBusType:
  139. val = _OPT_STRING(disk.szBus, "mmc");
  140. break;
  141. case SDR_DiskVendorName:
  142. val = _NA_STRING(disk.szVendor);
  143. break;
  144. case SDR_DiskVendorID:
  145. val = (int)disk.nVendorID;
  146. break;
  147. case SDR_DiskProductID:
  148. val = (int)disk.nProductID;
  149. break;
  150. case SDR_PartFsLabel:
  151. val = _NA_STRING(part.szFsLabel);
  152. break;
  153. case SDR_PartFsType:
  154. val = _NA_STRING(part.szFsType);
  155. break;
  156. case SDR_PartFsVersion:
  157. val = _NA_STRING(part.szFsVersion);
  158. break;
  159. case SDR_PartDevNode:
  160. val = _NA_STRING(part.szDevNode);
  161. break;
  162. case SDR_PartMountPoint:
  163. val = _NA_STRING(part.szMntPoint);
  164. break;
  165. case SDR_PartSize:
  166. val = _FormatByteSize(part.nKiBPartSize * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  167. break;
  168. case SDR_PartFsSize:
  169. val = _FormatByteSize(part.nKiBSize * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  170. break;
  171. case SDR_PartFsFree:
  172. val = _FormatByteSize(part.nKiBFree * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  173. break;
  174. case SDR_PartFsUsed:
  175. val = _FormatByteSize(part.nKiBUsed * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  176. break;
  177. default:
  178. break;
  179. }
  180. }
  181. return val;
  182. }
  183. QHash<int, QByteArray> QGfaStgDevList::roleNames(void) const
  184. {
  185. QHash<int, QByteArray> roles;
  186. for(size_t i = 0; i < _countof(g_roles); ++i)
  187. {
  188. roles[g_roles[i].nRole] = g_roles[i].pszRoleName;
  189. }
  190. return roles;
  191. }
  192. int QGfaStgDevList::FindPartVecEntry(int nDiskIdx, int nPartIdx)
  193. {
  194. for(auto it = m_partVec.begin(); it != m_partVec.end(); ++it)
  195. {
  196. const STG_DEV_DISK_PART &dp = *it;
  197. if((dp.nDiskIdx == nDiskIdx) && (dp.nPartIdx == nPartIdx))
  198. return it - m_partVec.begin();
  199. }
  200. return -1;
  201. }
  202. void QGfaStgDevList::insertPartition(int nDiskIdx, int nPartIdx)
  203. {
  204. QModelIndex parent = QModelIndex();
  205. int nIndex = (int)m_partVec.size();
  206. emit beginInsertRows(parent, nIndex, nIndex);
  207. m_partVec.emplace_back(nDiskIdx, nPartIdx);
  208. emit endInsertRows();
  209. }
  210. void QGfaStgDevList::removePartition(int nDiskIdx, int nPartIdx)
  211. {
  212. int nIndex;
  213. if((nIndex = FindPartVecEntry(nDiskIdx, nPartIdx)) >= 0)
  214. {
  215. QModelIndex parent = QModelIndex();
  216. emit beginRemoveRows(parent, nIndex, nIndex);
  217. m_partVec.erase(m_partVec.begin() + nIndex);
  218. emit endRemoveRows();
  219. }
  220. }
  221. void QGfaStgDevList::diskAdded(int nIndex, const GFA_SYSINFO_DISK &disk)
  222. {
  223. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.disks)) && !disk.internal)
  224. {
  225. TRACE("Disk [ID=%d] added: %s [%s]\n", nIndex, disk.szDevNode, *disk.szName ? disk.szName : "Unnamed");
  226. memcpy(&m_stgDevShadowCpy.disks[nIndex], &disk, sizeof(GFA_SYSINFO_DISK));
  227. }
  228. }
  229. void QGfaStgDevList::diskRemoved(int nIndex, const GFA_SYSINFO_DISK &disk)
  230. {
  231. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.disks)) && !disk.internal)
  232. {
  233. TRACE("Disk [ID=%d] removed: %s [%s]\n", nIndex, disk.szDevNode, *disk.szName ? disk.szName : "Unnamed");
  234. m_stgDevShadowCpy.disks[nIndex].valid = false;
  235. }
  236. }
  237. void QGfaStgDevList::partitionAdded(int nIndex, const GFA_SYSINFO_PARTITION &part)
  238. {
  239. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  240. {
  241. TRACE("Partition [ID=%d:%d] added: %s [%s]\n", part.nDiskIdx, nIndex, part.szDevNode, *part.szFsLabel ? part.szFsLabel : "Unnamed");
  242. memcpy(&m_stgDevShadowCpy.parts[nIndex], &part, sizeof(GFA_SYSINFO_PARTITION));
  243. insertPartition(part.nDiskIdx, nIndex);
  244. }
  245. }
  246. void QGfaStgDevList::partitionRemoved(int nIndex, const GFA_SYSINFO_PARTITION &part)
  247. {
  248. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  249. {
  250. TRACE("Partition [ID=%d:%d] removed: %s [%s]\n", part.nDiskIdx, nIndex, part.szDevNode, *part.szFsLabel ? part.szFsLabel : "Unnamed");
  251. m_stgDevShadowCpy.parts[nIndex].valid = false;
  252. removePartition(part.nDiskIdx, nIndex);
  253. }
  254. }
  255. void QGfaStgDevList::mountAdded(int nIndex, const GFA_SYSINFO_PARTITION &part)
  256. {
  257. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  258. {
  259. TRACE("Partition [ID=%d:%d] mounted: %s -> %s\n", part.nDiskIdx, nIndex, part.szDevNode, part.szMntPoint);
  260. GFA_SYSINFO_PARTITION &p = m_stgDevShadowCpy.parts[nIndex];
  261. memcpy(&p.szMntPoint, &part.szMntPoint, sizeof(GFA_SYSINFO_PARTITION::szMntPoint));
  262. if((nIndex = FindPartVecEntry(part.nDiskIdx, nIndex)) >= 0)
  263. {
  264. p.nKiBSize = part.nKiBSize;
  265. p.nKiBFree = part.nKiBFree;
  266. p.nKiBUsed = part.nKiBUsed;
  267. QModelIndex i = createIndex(nIndex, 0);
  268. emit dataChanged(i, i, {SDR_PartMountPoint, SDR_PartFsSize, SDR_PartFsFree, SDR_PartFsUsed});
  269. }
  270. }
  271. }
  272. void QGfaStgDevList::mountRemoved(int nIndex, const GFA_SYSINFO_PARTITION &part)
  273. {
  274. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  275. {
  276. TRACE("Partition [ID=%d:%d] unmounted: %s\n", part.nDiskIdx, nIndex, part.szDevNode);
  277. GFA_SYSINFO_PARTITION &p = m_stgDevShadowCpy.parts[nIndex];
  278. memset(&p.szMntPoint, 0, sizeof(GFA_SYSINFO_PARTITION::szMntPoint));
  279. if((nIndex = FindPartVecEntry(part.nDiskIdx, nIndex)) >= 0)
  280. {
  281. p.nKiBSize = 0;
  282. p.nKiBFree = 0;
  283. p.nKiBUsed = 0;
  284. QModelIndex i = createIndex(nIndex, 0);
  285. emit dataChanged(i, i, {SDR_PartMountPoint, SDR_PartFsSize, SDR_PartFsFree, SDR_PartFsUsed});
  286. }
  287. }
  288. }
  289. void QGfaStgDevList::clearAll(void)
  290. {
  291. int nLast = m_partVec.size() - 1;
  292. if(nLast >= 0)
  293. {
  294. QModelIndex parent = QModelIndex();
  295. emit beginRemoveRows(parent, 0, nLast);
  296. m_partVec.clear();
  297. memset(&m_stgDevShadowCpy, 0, sizeof(m_stgDevShadowCpy));
  298. emit endRemoveRows();
  299. }
  300. }
  301. /////////////////////////////////////////////////////////////////////////////
  302. /////////////////////////////////////////////////////////////////////////////
  303. /////////////////////////////////////////////////////////////////////////////
  304. QGfaSysInfo::QGfaSysInfo(QObject *pParent) : QObject(pParent),
  305. m_bSysInfoRunning(false),
  306. m_nMemTotal(0),
  307. m_nMemUsed(0),
  308. m_nMemFree(0),
  309. m_nMemAvailable(0),
  310. m_nMemBuffers(0),
  311. m_nMemCached(0)
  312. {
  313. }
  314. QGfaSysInfo::~QGfaSysInfo(void)
  315. {
  316. setObjectName("QGfaSysInfo");
  317. }
  318. /////////////////////////////////////////////////////////////////////////////
  319. void QGfaSysInfo::setSysInfoRunning(bool bRunning)
  320. {
  321. if(m_bSysInfoRunning != bRunning)
  322. {
  323. if(!(m_bSysInfoRunning = bRunning))
  324. {
  325. setSysMemInfo(NULL);
  326. m_stgDevList.clearAll();
  327. }
  328. }
  329. }
  330. void QGfaSysInfo::setSysMemInfo(LPCGFA_APPCTRL_SYSMEM psm, bool bDoHeavyLoadUpdate)
  331. {
  332. if(psm && m_bSysInfoRunning)
  333. {
  334. if(bDoHeavyLoadUpdate)
  335. {
  336. if(m_nMemTotal != psm->nMemTotal)
  337. {
  338. m_nMemTotal = psm->nMemTotal;
  339. emit memTotalChanged(m_nMemTotal);
  340. }
  341. if(m_nMemUsed != psm->nMemUsed)
  342. {
  343. m_nMemUsed = psm->nMemUsed;
  344. emit memUsedChanged(m_nMemUsed);
  345. }
  346. if(m_nMemFree != psm->nMemFree)
  347. {
  348. m_nMemFree = psm->nMemFree;
  349. emit memFreeChanged(m_nMemFree);
  350. }
  351. if(m_nMemAvailable != psm->nMemAvailable)
  352. {
  353. m_nMemAvailable = psm->nMemAvailable;
  354. emit memAvailableChanged(m_nMemAvailable);
  355. }
  356. if(m_nMemBuffers != psm->nMemBuffers)
  357. {
  358. m_nMemBuffers = psm->nMemBuffers;
  359. emit memBuffersChanged(m_nMemBuffers);
  360. }
  361. if(m_nMemCached != psm->nMemCached)
  362. {
  363. m_nMemCached = psm->nMemCached;
  364. emit memCachedChanged(m_nMemCached);
  365. }
  366. }
  367. }
  368. else
  369. {
  370. if(m_nMemTotal != 0)
  371. {
  372. m_nMemTotal = 0;
  373. emit memTotalChanged(m_nMemTotal);
  374. }
  375. if(m_nMemUsed != 0)
  376. {
  377. m_nMemUsed = 0;
  378. emit memUsedChanged(m_nMemUsed);
  379. }
  380. if(m_nMemFree != 0)
  381. {
  382. m_nMemFree = 0;
  383. emit memFreeChanged(m_nMemFree);
  384. }
  385. if(m_nMemAvailable != 0)
  386. {
  387. m_nMemAvailable = 0;
  388. emit memAvailableChanged(m_nMemAvailable);
  389. }
  390. if(m_nMemBuffers != 0)
  391. {
  392. m_nMemBuffers = 0;
  393. emit memBuffersChanged(m_nMemBuffers);
  394. }
  395. if(m_nMemCached != 0)
  396. {
  397. m_nMemCached = 0;
  398. emit memCachedChanged(m_nMemCached);
  399. }
  400. }
  401. }
  402. /////////////////////////////////////////////////////////////////////////////
  403. quint64 QGfaSysInfo::memTotal(void) const
  404. {
  405. return m_nMemTotal;
  406. }
  407. quint64 QGfaSysInfo::memUsed(void) const
  408. {
  409. return m_nMemUsed;
  410. }
  411. quint64 QGfaSysInfo::memFree(void) const
  412. {
  413. return m_nMemFree;
  414. }
  415. quint64 QGfaSysInfo::memAvailable(void) const
  416. {
  417. return m_nMemAvailable;
  418. }
  419. quint64 QGfaSysInfo::memBuffers(void) const
  420. {
  421. return m_nMemBuffers;
  422. }
  423. quint64 QGfaSysInfo::memCached(void) const
  424. {
  425. return m_nMemCached;
  426. }
  427. QGfaStgDevList* QGfaSysInfo::stgDev(void)
  428. {
  429. return &m_stgDevList;
  430. }