
#include "myosd.h"

cMyOsd::cMyOsd():cOsdMenu("")
{
	// Festplattenspeicher ermitteln
	system("df > /tmp/hdmonitor");
	
	dsyslog("[hdmonitor] starting ... showhd()");
	showhd("Festplatten-Monitor");
	dsyslog("[hdmonitor] ending ... showhd()");
	
	SetHelp(0,0,0,0);
}

cMyOsd::~cMyOsd()
{
}

eOSState cMyOsd::ProcessKey(eKeys Key)
{
	eOSState state = cOsdMenu::ProcessKey(Key);

	// Ausgabe löschen
	Clear();

	return state;
}

double cMyOsd::Round(double Zahl, unsigned int Stellen)
{
    Zahl *= pow(10, Stellen);
    if (Zahl >= 0) {
        //floor(Zahl + 0.5);
	Zahl = (int)(Zahl);
    } else {
        //ceil(Zahl - 0.5);
	Zahl = (int)(Zahl);
    }
    Zahl /= pow(10, Stellen);
    return Zahl;
}

string cMyOsd::Format(double Zahl)
{
	stringstream tmpss;
	
	Zahl = Zahl*100;
	int mod10 = (int)Zahl % 10;
	int mod100 = (int)Zahl % 100;
	
	int tmp = (int)Zahl;
	Zahl = Zahl/100;
	
	if((tmp >= 100)&&(tmp < 1000)){
		tmpss << "  " << Zahl;
		if (mod10 == 0 ){
			tmpss << "0";
		}else if(mod100 == 0 ){
			tmpss << "00";
		}
	}	
	
	if((tmp >= 1000)&&(tmp < 10000)){
		tmpss << " " << Zahl;
		if (mod10 == 0 ){
			tmpss << "0";
		}else if(mod100 == 0 ){
			tmpss << "00";
		}
	}
		
	if(tmp >= 10000){
		tmpss << "" << Zahl;
		if (mod10 == 0 ){
			tmpss << "0";
		}else if(mod100 == 0 ){
			tmpss << "00";
		}
	}
		
	string retstring = tmpss.str();
	return retstring;
}



void cMyOsd::showhd(const char* titel)
{
	dsyslog("[hdmonitor] using showhd() ");

	stringstream ss;
	string tmpstring;
	
	
	dsyslog("[hdmonitor] system ");
	system("df > /tmp/hdinfo");


	char line[255];
        FILE *inputFile, *inFile;
       	dsyslog("[hdmonitor] nach system ");

	int anzHD = 0;
	// Anzahl Festplatten ermitteln
        inFile = fopen ("/tmp/hdinfo","r");
        if (inFile == NULL) 
	       	dsyslog("[hdmonitor] Konnte /tmp/hdmonitor nicht oeffnen ");
        else
        {
                while(!feof(inFile))
                {
			fgets (line , 256 , inFile);
			if(line[0] == '/'){
				anzHD++;
			}
		}
	}	
	fclose(inFile);

       	dsyslog("[hdmonitor] Es wurden %d Festplatten ermittelt ",anzHD);

	
        inputFile = fopen ("/tmp/hdinfo","r");
        if (inputFile == NULL) 
	       	dsyslog("[hdmonitor] Konnte /tmp/hdmonitor nicht oeffnen ");
        else
        {
		double gesamtkapazitaet = 0;
		double gesamtbelegt = 0;
		double gesamtverfuegbar = 0;

		ss << " Harddisk   Capacity       Used  Available    in %" << endl;
		cOsdItem *item1=new cOsdItem((ss.str()).c_str());
		item1->SetSelectable(false);
		Add(item1);
		ss.str("");
		
		int curHD = 1;
		while(curHD < anzHD)
                {
                        fgets (line , 256 , inputFile);

			string hd = "";
			string kap = "";
			double kapazitaet = 0;
			string bel = "";
			double belegt = 0;
			string avail = "";
			double verfuegbar = 0;
			string ben = "";
			bool aktiv = 1;
			bool lastaktiv = 0;
			
			int count = -1;
						
			if(line[0] == '/'){
				curHD++;				
				for (int i = 0; i < sizeof(line); i++)
				{
					if(line[i] == ' '){
						aktiv = 0;
					}else{
						aktiv = 1;
					}
					
					if (count == 5)
						break;
					
					if((aktiv == 1)&&(lastaktiv == 0)) {
						count++;
					}
					
					if((count == 4)&&(aktiv == 1)) {
						ben = ben + line[i];
					}
					
					if((count == 3)&&(aktiv == 1)) {
						avail = avail + line[i];
					}

					if((count == 2)&&(aktiv == 1)) {
						bel = bel + line[i];
					}

					if((count == 1)&&(aktiv == 1)) {
						kap = kap + line[i];
					}

					if((count == 0)&&(aktiv == 1)) {
						hd = hd + line[i];
					}
					lastaktiv = aktiv;
				}
				
			// Festplatte definieren
			ss << hd << "  ";

			// Kapazitaet berechnen
			kapazitaet = kapazitaet + atoi(kap.c_str());

			if((kapazitaet >= 0)&&(kapazitaet < 1000)){
				kapazitaet = Round(kapazitaet,2);
				tmpstring = Format(kapazitaet);
				ss << tmpstring;
				ss << " KB  ";
			}
			if((kapazitaet >= 1000)&&(kapazitaet < 1000000)){
				kapazitaet = (kapazitaet / 1024);
				kapazitaet = Round(kapazitaet,2);
				tmpstring = Format(kapazitaet);
				ss << tmpstring;
				ss << " MB  ";
			}
			if((kapazitaet >= 1000000)&&(kapazitaet < 1000000000)){
				kapazitaet = (kapazitaet / 1048576);
				kapazitaet = Round(kapazitaet,2);
				tmpstring = Format(kapazitaet);
				ss << tmpstring;
				ss << " GB  ";
			}
			if(kapazitaet >= 1000000000){
				kapazitaet = (kapazitaet / 1073741824);
				kapazitaet = Round(kapazitaet,2);
				tmpstring = Format(kapazitaet);
				ss << tmpstring;
				ss << " TB  ";
			}
			
			// Belegt
		
			belegt = belegt + atoi(bel.c_str());

			if((belegt >= 0)&&(belegt < 1000)){
				belegt = Round(belegt,2);
				tmpstring = Format(belegt);
				ss << tmpstring;
				ss << " KB  ";
			}
			if((belegt >= 1000)&&(belegt < 1000000)){
				belegt = (belegt / 1024);
				belegt = Round(belegt,2);
				tmpstring = Format(belegt);
				ss << tmpstring;
				ss << " MB  ";
			}
			if((belegt >= 1000000)&&(belegt < 1000000000)){
				belegt = (belegt / 1048576);
				belegt = Round(belegt,2);
				tmpstring = Format(belegt);
				ss << tmpstring;
				ss << " GB  ";
			}
			if(belegt >= 1000000000){
				belegt = (belegt / 1073741824);
				belegt = Round(belegt,2);
				tmpstring = Format(belegt);
				ss << tmpstring;
				ss << " TB  ";
			}


			// verfuegbar
			
			verfuegbar = verfuegbar + atoi(avail.c_str());

			if((verfuegbar >= 0)&&(verfuegbar < 1000)){
				verfuegbar = Round(verfuegbar,2);
				tmpstring = Format(verfuegbar);
				ss << tmpstring;
				ss << " KB  ";
			}
			if((verfuegbar >= 1000)&&(verfuegbar < 1000000)){
				verfuegbar = (verfuegbar / 1024);
				verfuegbar = Round(verfuegbar,2);
				tmpstring = Format(verfuegbar);
				ss << tmpstring;
				ss << " MB  ";
			}
			if((verfuegbar >= 1000000)&&(verfuegbar < 1000000000)){
				verfuegbar = (verfuegbar / 1048576);
				verfuegbar = Round(verfuegbar,2);
				tmpstring = Format(verfuegbar);
				ss << tmpstring;
				ss << " GB  ";
			}
			if(verfuegbar >= 1000000000){
				verfuegbar = (verfuegbar / 1073741824);
				verfuegbar = Round(verfuegbar,2);
				tmpstring = Format(verfuegbar);
				ss << tmpstring;
				ss << " TB  ";
			}


			ss << "  ";

			int benlen = ben.length();
			if(benlen == 3)
				ss << " " << ben << endl;
			else if (benlen == 2)
				ss << "  " << ben << endl;
			else
				ss << ben << endl;
			
			cOsdItem *item=new cOsdItem((ss.str()).c_str());
			item->SetSelectable(false);
			Add(item);
			ss.str("");
			
			gesamtkapazitaet = gesamtkapazitaet + atoi(kap.c_str());
			gesamtbelegt = gesamtbelegt + atoi(bel.c_str());
			gesamtverfuegbar = gesamtverfuegbar + atoi(avail.c_str());
			}
                }
		ss << "--------------------------------------------------" << endl;
		cOsdItem *item2=new cOsdItem((ss.str()).c_str());
		item2->SetSelectable(false);
		Add(item2);
		ss.str("");
		
		ss << "Gesamt:    ";
		
		if((gesamtkapazitaet >= 0)&&(gesamtkapazitaet < 1000)){
			gesamtkapazitaet = Round(gesamtkapazitaet,2);
			tmpstring = Format(gesamtkapazitaet);
			ss << tmpstring;
			ss << " KB  ";
		}
		if((gesamtkapazitaet >= 1000)&&(gesamtkapazitaet < 1000000)){
			gesamtkapazitaet = (gesamtkapazitaet / 1024);
			gesamtkapazitaet = Round(gesamtkapazitaet,2);
			tmpstring = Format(gesamtkapazitaet);
			ss << tmpstring;
			ss << " MB  ";
		}
		if((gesamtkapazitaet >= 1000000)&&(gesamtkapazitaet < 1000000000)){
			gesamtkapazitaet = (gesamtkapazitaet / 1048576);
			gesamtkapazitaet = Round(gesamtkapazitaet,2);
			tmpstring = Format(gesamtkapazitaet);
			ss << tmpstring;
			ss << " GB  ";
		}
		if(gesamtkapazitaet >= 1000000000){
			gesamtkapazitaet = (gesamtkapazitaet / 1073741824);
			gesamtkapazitaet = Round(gesamtkapazitaet,2);
			tmpstring = Format(gesamtkapazitaet);
			ss << tmpstring;
			ss << " TB  ";
		}
		
			
		if((gesamtbelegt >= 0)&&(gesamtbelegt < 1000)){
			gesamtbelegt = Round(gesamtbelegt,2);
			tmpstring = Format(gesamtbelegt);
			ss << tmpstring;
			ss << " KB  ";
		}
		if((gesamtbelegt >= 1000)&&(gesamtbelegt < 1000000)){
			gesamtbelegt = (gesamtbelegt / 1024);
			gesamtbelegt = Round(gesamtbelegt,2);
			tmpstring = Format(gesamtbelegt);
			ss << tmpstring;
			ss << " MB  ";
		}
		if((gesamtbelegt >= 1000000)&&(gesamtbelegt < 1000000000)){
			gesamtbelegt = (gesamtbelegt / 1048576);
			gesamtbelegt = Round(gesamtbelegt,2);
			tmpstring = Format(gesamtbelegt);
			ss << tmpstring;
			ss << " GB  ";
		}
		if(gesamtbelegt >= 1000000000){
			gesamtbelegt = (gesamtbelegt / 1073741824);
			gesamtbelegt = Round(gesamtbelegt,2);
			tmpstring = Format(gesamtbelegt);
			ss << tmpstring;
			ss << " TB  ";
		}

	
		if((gesamtverfuegbar >= 0)&&(gesamtverfuegbar < 1000)){
			gesamtverfuegbar = Round(gesamtverfuegbar,2);
			tmpstring = Format(gesamtverfuegbar);
			ss << tmpstring;
			ss << " KB  ";

		}
		if((gesamtverfuegbar >= 1000)&&(gesamtverfuegbar < 1000000)){
			gesamtverfuegbar = (gesamtverfuegbar / 1024);
			gesamtverfuegbar = Round(gesamtverfuegbar,2);
			tmpstring = Format(gesamtverfuegbar);
			ss << tmpstring;
			ss << " MB  ";

		}
		if((gesamtverfuegbar >= 1000000)&&(gesamtverfuegbar < 1000000000)){
			gesamtverfuegbar = (gesamtverfuegbar / 1048576);
			gesamtverfuegbar = Round(gesamtverfuegbar,2);
			tmpstring = Format(gesamtverfuegbar);
			ss << tmpstring;
			ss << " GB  ";

		}
		if(gesamtverfuegbar >= 1000000000){
			gesamtverfuegbar = (gesamtverfuegbar / 1073741824);
			gesamtverfuegbar = Round(gesamtverfuegbar,2);
			tmpstring = Format(gesamtverfuegbar);
			ss << tmpstring;
			ss << " TB  ";
		}
		
		ss << endl;
		cOsdItem *item3=new cOsdItem((ss.str()).c_str());
		item3->SetSelectable(false);
		Add(item3);
		ss.str("");
	}
        fclose(inputFile);

	SetTitle(titel);
	Display();
}
