changed vector to list; again

This commit is contained in:
Hendrik Schutter 2020-09-21 21:47:29 +02:00
parent 2a2bfc6fe6
commit e65af04488
4 changed files with 71 additions and 68 deletions

View File

@ -41,7 +41,7 @@
#include <string> #include <string>
#include <fstream> #include <fstream>
#include <tuple> #include <tuple>
#include <vector> #include <list>
#include <time.h> #include <time.h>
#include <chrono> #include <chrono>
#include <curses.h> #include <curses.h>
@ -81,11 +81,11 @@ public:
private: private:
static void searchDrives(vector <Drive>* pvecDrives); static void searchDrives(list <Drive>* plistDrives);
static void printDrives(vector <Drive>* pvecDrives); static void printDrives(list <Drive>* plistDrives);
static void filterIgnoredDrives(vector <Drive>* pvecDrives); static void filterIgnoredDrives(list <Drive>* plistDrives);
static void filterNewDrives(vector <Drive>* pvecOldDrives, vector <Drive>* pvecNewDrives); static void filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNewDrives);
static void addSMARTData(vector <Drive>* pvecDrives); static void addSMARTData(list <Drive>* plistDrives);
static void ThreadScannDevices(); static void ThreadScannDevices();
static void ThreadUserInput(); static void ThreadUserInput();
static void ThreadShred(); static void ThreadShred();

View File

@ -36,7 +36,7 @@ public:
static void initTUI(); static void initTUI();
void updateTUI(vector <Drive>* pvecDrives, uint8_t u8SelectedEntry); void updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry);
static enum UserInput readUserInput(); static enum UserInput readUserInput();

View File

@ -13,9 +13,9 @@ static int fdShredInformPipe[2];//File descriptor for pipe that informs if a wip
static std::mutex mxScannDrives; static std::mutex mxScannDrives;
vector <Drive> vecNewDrives; //store found drives that are updated every 5sec list <Drive> listNewDrives; //store found drives that are updated every 5sec
static vector <Drive> vecDrives; //stores all drive data from scann thread static list <Drive> listDrives; //stores all drive data from scann thread
TUI *ui; TUI *ui;
@ -31,8 +31,6 @@ static fd_set selectSet;
reHDD::reHDD(void) reHDD::reHDD(void)
{ {
u8SelectedEntry = 0U; u8SelectedEntry = 0U;
vecDrives.reserve(128);
} }
/** /**
@ -65,8 +63,8 @@ void reHDD::app_logic(void)
mxScannDrives.lock(); mxScannDrives.lock();
char dummy; char dummy;
read (fdNewDrivesInformPipe[0],&dummy,1); read (fdNewDrivesInformPipe[0],&dummy,1);
filterNewDrives(&vecDrives, &vecNewDrives); //filter and copy to app logic vector filterNewDrives(&listDrives, &listNewDrives); //filter and copy to app logic vector
printDrives(&vecDrives); printDrives(&listDrives);
mxScannDrives.unlock(); mxScannDrives.unlock();
} }
if(FD_ISSET(fdShredInformPipe[0], &selectSet)) if(FD_ISSET(fdShredInformPipe[0], &selectSet))
@ -78,7 +76,7 @@ void reHDD::app_logic(void)
#endif #endif
} }
//mxScannDrives.lock(); //mxScannDrives.lock();
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
//mxScannDrives.unlock(); //mxScannDrives.unlock();
} //endless loop } //endless loop
thDevices.join(); thDevices.join();
@ -88,9 +86,11 @@ void reHDD::app_logic(void)
Drive* reHDD::getSelectedDrive() Drive* reHDD::getSelectedDrive()
{ {
if(u8SelectedEntry < vecDrives.size() ) if(u8SelectedEntry < listDrives.size() )
{ {
return &(vecDrives.at(u8SelectedEntry)); list<Drive>::iterator it = listDrives.begin();
advance(it, u8SelectedEntry);
return &(*it);
} }
else else
{ {
@ -104,10 +104,10 @@ void reHDD::ThreadScannDevices()
while(true) while(true)
{ {
mxScannDrives.lock(); mxScannDrives.lock();
vecNewDrives.clear(); listNewDrives.clear();
searchDrives(&vecNewDrives); //search for new drives and store them in list searchDrives(&listNewDrives); //search for new drives and store them in list
filterIgnoredDrives(&vecNewDrives); //filter out ignored drives filterIgnoredDrives(&listNewDrives); //filter out ignored drives
addSMARTData(&vecNewDrives); //add S.M.A.R.T. Data to the drives addSMARTData(&listNewDrives); //add S.M.A.R.T. Data to the drives
mxScannDrives.unlock(); mxScannDrives.unlock();
write(fdNewDrivesInformPipe[1], "A",1); write(fdNewDrivesInformPipe[1], "A",1);
sleep(5); //sleep 5 sec sleep(5); //sleep 5 sec
@ -119,7 +119,7 @@ void reHDD::ThreadCheckFrozenDrives()
while(true) while(true)
{ {
mxScannDrives.lock(); mxScannDrives.lock();
for(auto it = begin(vecDrives); it != end(vecDrives); ++it) for(auto it = begin(listDrives); it != end(listDrives); ++it)
{ {
if(it->state == Drive::SHRED_ACTIVE) if(it->state == Drive::SHRED_ACTIVE)
{ {
@ -141,12 +141,12 @@ void reHDD::ThreadUserInput()
case TUI::UserInput::DownKey: case TUI::UserInput::DownKey:
//cout << "Down" << endl; //cout << "Down" << endl;
handleArrowKey(TUI::UserInput::DownKey); handleArrowKey(TUI::UserInput::DownKey);
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::UpKey: case TUI::UserInput::UpKey:
//cout << "Up" << endl; //cout << "Up" << endl;
handleArrowKey(TUI::UserInput::UpKey); handleArrowKey(TUI::UserInput::UpKey);
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Undefined: case TUI::UserInput::Undefined:
//cout << "Undefined" << endl; //cout << "Undefined" << endl;
@ -154,7 +154,7 @@ void reHDD::ThreadUserInput()
case TUI::UserInput::Abort: case TUI::UserInput::Abort:
//cout << "Abort" << endl; //cout << "Abort" << endl;
handleAbort(); handleAbort();
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Delete: case TUI::UserInput::Delete:
//cout << "Delete" << endl; //cout << "Delete" << endl;
@ -166,7 +166,7 @@ void reHDD::ThreadUserInput()
getSelectedDrive()->state = Drive::DELETE_SELECTED; getSelectedDrive()->state = Drive::DELETE_SELECTED;
} }
} }
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Shred: case TUI::UserInput::Shred:
//cout << "Shred" << endl; //cout << "Shred" << endl;
@ -178,17 +178,17 @@ void reHDD::ThreadUserInput()
getSelectedDrive()->state = Drive::SHRED_SELECTED; getSelectedDrive()->state = Drive::SHRED_SELECTED;
} }
} }
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::Enter: case TUI::UserInput::Enter:
//cout << "Enter" << endl; //cout << "Enter" << endl;
handleEnter(); handleEnter();
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
case TUI::UserInput::ESC: case TUI::UserInput::ESC:
//cout << "ESC" << endl; //cout << "ESC" << endl;
handleESC(); handleESC();
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
break; break;
default: default:
break; break;
@ -203,7 +203,7 @@ void reHDD::ThreadShred()
Shred* pShredTask = new Shred(); //create new shred task Shred* pShredTask = new Shred(); //create new shred task
pShredTask->shredDrive(getSelectedDrive(), &fdShredInformPipe[1]); //start new shred task pShredTask->shredDrive(getSelectedDrive(), &fdShredInformPipe[1]); //start new shred task
delete pShredTask; //delete shred task delete pShredTask; //delete shred task
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);;
} }
} }
@ -215,24 +215,24 @@ void reHDD::ThreadDelete()
getSelectedDrive()->state = Drive::TaskState::NONE; //delete finished getSelectedDrive()->state = Drive::TaskState::NONE; //delete finished
getSelectedDrive()->bWasDeleteted = true; getSelectedDrive()->bWasDeleteted = true;
Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
ui->updateTUI(&vecDrives, u8SelectedEntry); ui->updateTUI(&listDrives, u8SelectedEntry);
} }
} }
void reHDD::filterNewDrives(vector <Drive>* pvecOldDrives, vector <Drive>* pvecNewDrives) void reHDD::filterNewDrives(list <Drive>* plistOldDrives, list <Drive>* plistNewDrives)
{ {
vector <Drive>::iterator itOld; //Iterator for current (old) drive list list <Drive>::iterator itOld; //Iterator for current (old) drive list
vector <Drive>::iterator itNew; //Iterator for new drive list that was created from to scann thread list <Drive>::iterator itNew; //Iterator for new drive list that was created from to scann thread
//remove offline old drives from previously run //remove offline old drives from previously run
for (itOld = pvecOldDrives->begin(); itOld != pvecOldDrives->end();) for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end();)
{ {
if(itOld->bIsOffline == true) if(itOld->bIsOffline == true)
{ {
Logger::logThis()->warning("Offline drive found: " + itOld->getPath()); Logger::logThis()->warning("Offline drive found: " + itOld->getPath());
itOld = pvecOldDrives->erase(itOld); itOld = plistOldDrives->erase(itOld);
/* /*
if(pvecOldDrives->size() > 0){ //This can be a risk if the user starts a task for the selected drive and the selected drive changes if(plistOldDrives->size() > 0){ //This can be a risk if the user starts a task for the selected drive and the selected drive changes
u8SelectedEntry = 0U; u8SelectedEntry = 0U;
} }
*/ */
@ -244,10 +244,10 @@ void reHDD::filterNewDrives(vector <Drive>* pvecOldDrives, vector <Drive>* pvecN
} }
//search offline drives and mark them //search offline drives and mark them
for (itOld = pvecOldDrives->begin(); itOld != pvecOldDrives->end(); ++itOld) for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld)
{ {
itOld->bIsOffline = true; //set offline befor seachring in the new list itOld->bIsOffline = true; //set offline befor seachring in the new list
for (itNew = pvecNewDrives->begin(); itNew != pvecNewDrives->end();) for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end();)
{ {
if((itOld->getSerial() == itNew->getSerial()) || (itOld->getPath() == itNew->getPath())) if((itOld->getSerial() == itNew->getSerial()) || (itOld->getPath() == itNew->getPath()))
{ {
@ -255,7 +255,7 @@ void reHDD::filterNewDrives(vector <Drive>* pvecOldDrives, vector <Drive>* pvecN
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("Delete new drive, because allready attached: " + itNew->getModelName()); Logger::logThis()->info("Delete new drive, because allready attached: " + itNew->getModelName());
#endif #endif
itNew = pvecNewDrives->erase(itNew); //This drive is allready attached, remove from new list itNew = plistNewDrives->erase(itNew); //This drive is allready attached, remove from new list
} }
else else
{ {
@ -265,7 +265,7 @@ void reHDD::filterNewDrives(vector <Drive>* pvecOldDrives, vector <Drive>* pvecN
} }
//mark offline old drives //mark offline old drives
for (itOld = pvecOldDrives->begin(); itOld != pvecOldDrives->end(); ++itOld) for (itOld = plistOldDrives->begin(); itOld != plistOldDrives->end(); ++itOld)
{ {
if(itOld->bIsOffline == true) if(itOld->bIsOffline == true)
{ {
@ -276,12 +276,12 @@ void reHDD::filterNewDrives(vector <Drive>* pvecOldDrives, vector <Drive>* pvecN
} }
//add new drives to drive list //add new drives to drive list
for (itNew = pvecNewDrives->begin(); itNew != pvecNewDrives->end(); ++itNew) for (itNew = plistNewDrives->begin(); itNew != plistNewDrives->end(); ++itNew)
{ {
pvecOldDrives->push_back(pvecNewDrives->at(itNew - pvecNewDrives->begin())); plistOldDrives->push_back(*itNew);
Logger::logThis()->info("Add new drive: " + itNew->getModelName()); Logger::logThis()->info("Add new drive: " + itNew->getModelName());
} }
pvecNewDrives->clear(); plistNewDrives->clear();
} }
/** /**
@ -289,7 +289,7 @@ void reHDD::filterNewDrives(vector <Drive>* pvecOldDrives, vector <Drive>* pvecN
* \param pointer of vector <Drive>* pvecDrives * \param pointer of vector <Drive>* pvecDrives
* \return void * \return void
*/ */
void reHDD::searchDrives(vector <Drive>* pvecDrives) void reHDD::searchDrives(list <Drive>* plistDrives)
{ {
// cout << "search drives ..." << endl; // cout << "search drives ..." << endl;
Logger::logThis()->info("--> search drives <--"); Logger::logThis()->info("--> search drives <--");
@ -311,7 +311,7 @@ void reHDD::searchDrives(vector <Drive>* pvecDrives)
Drive* tmpDrive = new Drive(string(cLine).substr(0, 8)); Drive* tmpDrive = new Drive(string(cLine).substr(0, 8));
tmpDrive->state = Drive::NONE; tmpDrive->state = Drive::NONE;
tmpDrive->bIsOffline = false; tmpDrive->bIsOffline = false;
pvecDrives->push_back(*tmpDrive); plistDrives->push_back(*tmpDrive);
} }
} }
fclose(outputfileHwinfo); fclose(outputfileHwinfo);
@ -322,13 +322,13 @@ void reHDD::searchDrives(vector <Drive>* pvecDrives)
* \param pointer of vector <Drive>* pvecDrives * \param pointer of vector <Drive>* pvecDrives
* \return void * \return void
*/ */
void reHDD::filterIgnoredDrives(vector <Drive>* pvecDrives) void reHDD::filterIgnoredDrives(list <Drive>* plistDrives)
{ {
string sDelimiter = ":"; string sDelimiter = ":";
string sIgnoredDrivePath; string sIgnoredDrivePath;
string sIgnoredDriveUUID; string sIgnoredDriveUUID;
vector<tuple<string, string>> vtlIgnoredDevices; //store drives from ingnore file list<tuple<string, string>> vtlIgnoredDevices; //store drives from ingnore file
ifstream input( "ignoreDrives.conf" ); //read ingnore file ifstream input( "ignoreDrives.conf" ); //read ingnore file
@ -351,8 +351,8 @@ void reHDD::filterIgnoredDrives(vector <Drive>* pvecDrives)
//loop through found entries in ingnore file //loop through found entries in ingnore file
for(auto row : vtlIgnoredDevices) for(auto row : vtlIgnoredDevices)
{ {
vector <Drive>::iterator it; list <Drive>::iterator it;
for (it = pvecDrives->begin(); it != pvecDrives->end(); ++it) for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
string sUUID; string sUUID;
if (!get<0>(row).compare(it->getPath())) //find same drive based on path if (!get<0>(row).compare(it->getPath())) //find same drive based on path
@ -394,7 +394,7 @@ void reHDD::filterIgnoredDrives(vector <Drive>* pvecDrives)
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("same uuid found than in ignore file --> ignore this drive: " + it->getPath()); Logger::logThis()->info("same uuid found than in ignore file --> ignore this drive: " + it->getPath());
#endif #endif
it = pvecDrives->erase(it); it = plistDrives->erase(it);
it--; it--;
} }
} }
@ -407,13 +407,14 @@ void reHDD::filterIgnoredDrives(vector <Drive>* pvecDrives)
* \param pointer of vector <Drive>* pvecDrives * \param pointer of vector <Drive>* pvecDrives
* \return void * \return void
*/ */
void reHDD::printDrives(vector <Drive>* pvecDrives) void reHDD::printDrives(list <Drive>* plistDrives)
{ {
#ifdef LOG_LEVEL_HIGH #ifdef LOG_LEVEL_HIGH
Logger::logThis()->info("------------DRIVES START------------"); Logger::logThis()->info("------------DRIVES START------------");
//cout << "------------DRIVES---------------" << endl; //cout << "------------DRIVES---------------" << endl;
vector <Drive>::iterator it; list <Drive>::iterator it;
for (it = pvecDrives->begin(); it != pvecDrives->end(); ++it) uint8_t u8Index = 0;
for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
/* /*
cout << " Drive: " << distance(pvecDrives->begin(), it) << endl; cout << " Drive: " << distance(pvecDrives->begin(), it) << endl;
@ -428,8 +429,8 @@ void reHDD::printDrives(vector <Drive>* pvecDrives)
cout << endl;*/ cout << endl;*/
ostringstream address; ostringstream address;
address << (void const *)&pvecDrives->at(it - pvecDrives->begin()); address << (void const *)&(*it);
Logger::logThis()->info(to_string(it - pvecDrives->begin()) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial() + " @" + address.str()); Logger::logThis()->info(to_string(u8Index++) + ": " + it->getPath() + " - " + it->getModelFamily() + " - " + it->getSerial() + " @" + address.str());
} }
Logger::logThis()->info("------------DRIVES END--------------"); Logger::logThis()->info("------------DRIVES END--------------");
//cout << "---------------------------------" << endl; //cout << "---------------------------------" << endl;
@ -441,19 +442,19 @@ void reHDD::printDrives(vector <Drive>* pvecDrives)
* \param pointer of vector <Drive>* pvecDrives * \param pointer of vector <Drive>* pvecDrives
* \return void * \return void
*/ */
void reHDD::addSMARTData(vector <Drive>* pvecDrives) void reHDD::addSMARTData(list <Drive>* plistDrives)
{ {
vector <Drive>::iterator it; list <Drive>::iterator it;
for (it = pvecDrives->begin(); it != pvecDrives->end(); ++it) for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
Drive* pTmpDrive = iterator_to_pointer<Drive, std::vector<Drive>::iterator > (it); Drive* pTmpDrive = iterator_to_pointer<Drive, std::list<Drive>::iterator > (it);
SMART::readSMARTData(pTmpDrive); SMART::readSMARTData(pTmpDrive);
} }
} }
void reHDD::handleArrowKey(TUI::UserInput userInput) void reHDD::handleArrowKey(TUI::UserInput userInput)
{ {
int8_t u8EntrySize = (int8_t) vecDrives.size(); int8_t u8EntrySize = (int8_t) listDrives.size();
switch (userInput) switch (userInput)
{ {
case TUI::UserInput::DownKey: case TUI::UserInput::DownKey:

View File

@ -50,7 +50,7 @@ void TUI::initTUI()
Logger::logThis()->info("UI successfully initialized"); Logger::logThis()->info("UI successfully initialized");
} }
void TUI::updateTUI(vector <Drive>* pvecDrives, uint8_t u8SelectedEntry) void TUI::updateTUI(list <Drive>* plistDrives, uint8_t u8SelectedEntry)
{ {
mxUIrefresh.lock(); mxUIrefresh.lock();
uint16_t u16StdscrX, u16StdscrY; uint16_t u16StdscrX, u16StdscrY;
@ -69,8 +69,9 @@ void TUI::updateTUI(vector <Drive>* pvecDrives, uint8_t u8SelectedEntry)
delwin(detailview); delwin(detailview);
vector <Drive>::iterator it; list <Drive>::iterator it;
for (it = pvecDrives->begin(); it != pvecDrives->end(); ++it) uint8_t u8Index = 0U;
for (it = plistDrives->begin(); it != plistDrives->end(); ++it)
{ {
string sModelFamily = it->getModelFamily(); string sModelFamily = it->getModelFamily();
string sModelName = it->getModelName(); string sModelName = it->getModelName();
@ -79,10 +80,10 @@ void TUI::updateTUI(vector <Drive>* pvecDrives, uint8_t u8SelectedEntry)
bool bSelectedEntry = false; bool bSelectedEntry = false;
if(u8SelectedEntry == (it - pvecDrives->begin())) if(u8SelectedEntry == u8Index)
{ {
bSelectedEntry = true; //mark this drive in entries list bSelectedEntry = true; //mark this drive in entries list
displaySelectedDrive(pvecDrives->at(u8SelectedEntry), u16StdscrX, u16StdscrY); displaySelectedDrive(*it, u16StdscrX, u16StdscrY);
if((it->getPowerOnHours() >= WORSE_HOURS) || (it->getPowerCycles() >= WORSE_POWERUP) || (it->getErrorCount() > 0)) if((it->getPowerOnHours() >= WORSE_HOURS) || (it->getPowerCycles() >= WORSE_POWERUP) || (it->getErrorCount() > 0))
{ {
@ -133,11 +134,12 @@ void TUI::updateTUI(vector <Drive>* pvecDrives, uint8_t u8SelectedEntry)
break; break;
} }
WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (it - pvecDrives->begin()) )+3, sModelFamily, sModelName, sCapacity, sState, bSelectedEntry); WINDOW * tmp = createEntryWindow( ((int)(u16StdscrX/3) - 2), 5, 3, (5* (u8Index) )+3, sModelFamily, sModelName, sCapacity, sState, bSelectedEntry);
wrefresh(tmp); wrefresh(tmp);
u8Index++;
}//end loop though drives }//end loop though drives
if(pvecDrives->size() == 0) if(plistDrives->size() == 0)
{ {
//no selected drive present //no selected drive present
Logger::logThis()->warning("no selected drive present"); Logger::logThis()->warning("no selected drive present");
@ -148,7 +150,7 @@ void TUI::updateTUI(vector <Drive>* pvecDrives, uint8_t u8SelectedEntry)
menustate.bDelete = false; menustate.bDelete = false;
menustate.bShred = false; menustate.bShred = false;
menuview=createMenuView(((u16StdscrX)-(int)(u16StdscrX/3)-7), 10, (int)(u16StdscrX/3)+5,(u16StdscrY-11), menustate); menuview=createMenuView(((int)(u16StdscrX/3)-10 ), 10, (int)(u16StdscrX/3)+5,(u16StdscrY-11), menustate);
wrefresh(menuview); wrefresh(menuview);
detailview=overwriteDetailViewWindow(((u16StdscrX)-(int)(u16StdscrX/3)-7), (u16StdscrY-15), (int)(u16StdscrX/3)+5); detailview=overwriteDetailViewWindow(((u16StdscrX)-(int)(u16StdscrX/3)-7), (u16StdscrY-15), (int)(u16StdscrX/3)+5);